diff --git a/.clang-format b/.clang-format index dc7380ffd..63f12b6c4 100644 --- a/.clang-format +++ b/.clang-format @@ -1,6 +1,7 @@ BasedOnStyle: LLVM -IndentWidth: 8 +IndentWidth: 4 UseTab: Always +TabWidth: 4 BreakBeforeBraces: Custom Standard: Cpp11 BraceWrapping: @@ -16,7 +17,7 @@ BraceWrapping: FixNamespaceComments: false AllowShortIfStatementsOnASingleLine: false IndentCaseLabels: false -AccessModifierOffset: -8 +AccessModifierOffset: -4 ColumnLimit: 90 AllowShortFunctionsOnASingleLine: InlineOnly SortIncludes: false @@ -26,6 +27,7 @@ IncludeCategories: - Regex: '^<.*' Priority: 1 AlignAfterOpenBracket: DontAlign -ContinuationIndentWidth: 16 -ConstructorInitializerIndentWidth: 16 +ContinuationIndentWidth: 8 +ConstructorInitializerIndentWidth: 8 BreakConstructorInitializers: AfterColon +AlwaysBreakTemplateDeclarations: Yes diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..bda43ebc0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +./cmake-build-* +./build/* +./cache/* +Dockerfile diff --git a/.editorconfig b/.editorconfig new file mode 100755 index 000000000..ec0645241 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +[*] +end_of_line = lf + +[*.{cpp,h,lua,txt,glsl,md,c,cmake,java,gradle}] +charset = utf8 +indent_size = 4 +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b234fb283..f60f584f9 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -10,13 +10,31 @@ Contributions are welcome! Here's how you can help: ## Code -1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository and [clone](https://help.github.com/articles/cloning-a-repository/) your fork. +1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository and + [clone](https://help.github.com/articles/cloning-a-repository/) your fork. -2. Before you start coding, consider opening an [issue at Github](https://github.com/minetest/minetest/issues) to discuss the suitability and implementation of your intended contribution with the core developers. If you are planning to start some very significant coding, you would benefit from first discussing on our IRC development channel [#minetest-dev](http://www.minetest.net/irc/). Note that a proper IRC client is required to speak on this channel. +2. Before you start coding, consider opening an + [issue at Github](https://github.com/minetest/minetest/issues) to discuss the + suitability and implementation of your intended contribution with the core + developers. + + Any Pull Request that isn't a bug fix and isn't covered by + [the roadmap](../doc/direction.md) will be closed within a week unless it + receives a concept approval from a Core Developer. For this reason, it is + recommended that you open an issue for any such pull requests before doing + the work, to avoid disappointment. + + You may also benefit from discussing on our IRC development channel + [#minetest-dev](http://www.minetest.net/irc/). Note that a proper IRC client + is required to speak on this channel. 3. Start coding! - - Refer to the [Lua API](https://github.com/minetest/minetest/blob/master/doc/lua_api.txt), [Developer Wiki](http://dev.minetest.net/Main_Page) and other [documentation](https://github.com/minetest/minetest/tree/master/doc). - - Follow the [C/C++](http://dev.minetest.net/Code_style_guidelines) and [Lua](http://dev.minetest.net/Lua_code_style_guidelines) code style guidelines. + - Refer to the + [Lua API](https://github.com/minetest/minetest/blob/master/doc/lua_api.txt), + [Developer Wiki](http://dev.minetest.net/Main_Page) and other + [documentation](https://github.com/minetest/minetest/tree/master/doc). + - Follow the [C/C++](http://dev.minetest.net/Code_style_guidelines) and + [Lua](http://dev.minetest.net/Lua_code_style_guidelines) code style guidelines. - Check your code works as expected and document any changes to the Lua API. 4. Commit & [push](https://help.github.com/articles/pushing-to-a-remote/) your changes to a new branch (not `master`, one change per branch) @@ -33,61 +51,115 @@ Contributions are welcome! Here's how you can help: 5. Once you are happy with your changes, submit a pull request. - Open the [pull-request form](https://github.com/minetest/minetest/pull/new/master). - - Add a description explaining what you've done (or if it's a work-in-progress - what you need to do). + - Add a description explaining what you've done (or if it's a + work-in-progress - what you need to do). + - Make sure to fill out the pull request template. ### A pull-request is considered merge-able when: -1. It follows the roadmap in some way and fits the whole picture of the project: [roadmap introduction](http://c55.me/blog/?p=1491), [roadmap continued](https://forum.minetest.net/viewtopic.php?t=9177) +1. It follows [the roadmap](../doc/direction.md) in some way and fits the whole + picture of the project. 2. It works. -3. It follows the code style for [C/C++](http://dev.minetest.net/Code_style_guidelines) or [Lua](http://dev.minetest.net/Lua_code_style_guidelines). -4. The code's interfaces are well designed, regardless of other aspects that might need more work in the future. +3. It follows the code style for + [C/C++](http://dev.minetest.net/Code_style_guidelines) or + [Lua](http://dev.minetest.net/Lua_code_style_guidelines). +4. The code's interfaces are well designed, regardless of other aspects that + might need more work in the future. 5. It uses protocols and formats which include the required compatibility. +### Important note about automated GitHub checks + +When you submit a pull request, GitHub automatically runs checks on the Minetest +Engine combined with your changes. One of these checks is called 'cpp lint / +clang format', which checks code formatting. Because formatting for readability +requires human judgement this check often fails and often makes unsuitable +formatting requests which make code readability worse. + +If this check fails, look at the details to check for any clear mistakes and +correct those. However, you should not apply everything ClangFormat requests. +Ignore requests that make code readability worse and any other clearly +unsuitable requests. Discuss in the pull request with a core developer about how +to progress. + ## Issues -If you experience an issue, we would like to know the details - especially when a stable release is on the way. +If you experience an issue, we would like to know the details - especially when +a stable release is on the way. 1. Do a quick search on GitHub to check if the issue has already been reported. -2. Is it an issue with the Minetest *engine*? If not, report it [elsewhere](http://www.minetest.net/development/#reporting-issues). -3. [Open an issue](https://github.com/minetest/minetest/issues/new) and describe the issue you are having - you could include: +2. Is it an issue with the Minetest *engine*? If not, report it + [elsewhere](http://www.minetest.net/development/#reporting-issues). +3. [Open an issue](https://github.com/minetest/minetest/issues/new) and describe + the issue you are having - you could include: - Error logs (check the bottom of the `debug.txt` file). - Screenshots. - Ways you have tried to solve the issue, and whether they worked or not. - Your Minetest version and the content (games, mods or texture packs) you have installed. - Your platform (e.g. Windows 10 or Ubuntu 15.04 x64). -After reporting you should aim to answer questions or clarifications as this helps pinpoint the cause of the issue (if you don't do this your issue may be closed after 1 month). +After reporting you should aim to answer questions or clarifications as this +helps pinpoint the cause of the issue (if you don't do this your issue may be +closed after 1 month). ## Feature requests -Feature requests are welcome but take a moment to see if your idea follows the roadmap in some way and fits the whole picture of the project: [roadmap introduction](http://c55.me/blog/?p=1491), [roadmap continued](https://forum.minetest.net/viewtopic.php?t=9177). You should provide a clear explanation with as much detail as possible. +Feature requests are welcome but take a moment to see if your idea follows +[the roadmap](../doc/direction.md) in some way and fits the whole picture of +the project. You should provide a clear explanation with as much detail as +possible. ## Translations -Translations of Minetest are performed using Weblate. You can access the project page with a list of current languages [here](https://hosted.weblate.org/projects/minetest/minetest/). +The core translations of Minetest are performed using Weblate. You can access +the project page with a list of current languages +[here](https://hosted.weblate.org/projects/minetest/minetest/). + +Builtin (the component which contains things like server messages, chat command +descriptions, privilege descriptions) is translated separately; it needs to be +translated by editing a `.tr` text file. See +[Translation](https://dev.minetest.net/Translation) for more information. ## Donations -If you'd like to monetarily support Minetest development, you can find donation methods on [our website](http://www.minetest.net/development/#donate). +If you'd like to monetarily support Minetest development, you can find donation +methods on [our website](http://www.minetest.net/development/#donate). # Maintaining -*This is a concise version of the [Rules & Guidelines](http://dev.minetest.net/Category:Rules_and_Guidelines) on the developer wiki.* +* This is a concise version of the + [Rules & Guidelines](http://dev.minetest.net/Category:Rules_and_Guidelines) on the developer wiki.* These notes are for those who have push access Minetest (core developers / maintainers). - See the [project organisation](http://dev.minetest.net/Organisation) for the people involved. +## Concept approvals and roadmaps + +If a Pull Request is not a bug fix: + +* If it matches a goal in [the roadmap](../doc/direction.md), then the PR should + be labelled as "Roadmap" and the goal stated by number in the description. +* If it doesn't match a goal, then it needs to receive a concept approval within + a week of being opened to remain open. This 1 week deadline does not apply to + PRs opened before the roadmap was adopted; instead, they may remain open or be + closed as needed. Use the "Concept Approved" label. Issues can be marked as + "Concept Approved" to give preapproval to future PRs. + ## Reviewing pull requests -Pull requests should be reviewed and, if appropriate, checked if they achieve their intended purpose. You can show that you are in the process of, or will review the pull request by commenting *"Looks good"* or something similar. +Pull requests should be reviewed and, if appropriate, checked if they achieve +their intended purpose. You can show that you are in the process of, or will +review the pull request by commenting *"Looks good"* or something similar. **If the pull-request is not [merge-able](#a-pull-request-is-considered-merge-able-when):** -Submit a comment explaining to the author what they need to change to make the pull-request merge-able. +Submit a comment explaining to the author what they need to change to make the +pull-request merge-able. -- If the author comments or makes changes to the pull-request, it can be reviewed again. -- If no response is made from the author within 1 month (when improvements are suggested or a question is asked), it can be closed. +- If the author comments or makes changes to the pull-request, it can be + reviewed again. +- If no response is made from the author within 1 month (when improvements are + suggested or a question is asked), it can be closed. **If the pull-request is [merge-able](#a-pull-request-is-considered-merge-able-when):** 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 ``` @@ -29,4 +29,4 @@ OpenGL version: ##### Steps to reproduce - + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ccec99bc5..4132826cd 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,6 +3,7 @@ Add compact, short information about your PR for easier understanding: - Goal of the PR - How does the PR work? - Does it resolve any reported issue? +- Does this relate to a goal in [the roadmap](../doc/direction.md)? - If not a bug fix, why is this PR needed? What usecases does it solve? ## To do diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 000000000..20411a332 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,42 @@ +name: android + +# build on c/cpp changes or workflow changes +on: + push: + paths: + - 'lib/**.[ch]' + - 'lib/**.cpp' + - 'src/**.[ch]' + - 'src/**.cpp' + - 'android/**' + - '.github/workflows/android.yml' + pull_request: + paths: + - 'lib/**.[ch]' + - 'lib/**.cpp' + - 'src/**.[ch]' + - 'src/**.cpp' + - 'android/**' + - '.github/workflows/android.yml' + +jobs: + build: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - name: Install deps + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends gettext openjdk-11-jdk-headless + - name: Build with Gradle + run: cd android; ./gradlew assemblerelease + - name: Save armeabi artifact + 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@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 ae359f5d8..282dbe307 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,6 +13,8 @@ on: - 'util/buildbot/**' - 'util/ci/**' - '.github/workflows/**.yml' + - 'Dockerfile' + - '.dockerignore' pull_request: paths: - 'lib/**.[ch]' @@ -24,62 +26,61 @@ on: - 'util/buildbot/**' - 'util/ci/**' - '.github/workflows/**.yml' + - 'Dockerfile' + - '.dockerignore' jobs: - # This is our minor gcc compiler - gcc_6: + # Older gcc version (should be close to our minimum supported version) + gcc_5: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install deps run: | - sudo apt-get install g++-6 gcc-6 -qyy source ./util/ci/common.sh - install_linux_deps + install_linux_deps g++-5 - name: Build run: | ./util/ci/build.sh env: - CC: gcc-6 - CXX: g++-6 + CC: gcc-5 + CXX: g++-5 - name: Test run: | ./bin/minetest --run-unittests - # This is the current gcc compiler (available in bionic) - gcc_8: - runs-on: ubuntu-18.04 + # Current gcc version + gcc_12: + runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install deps run: | - sudo apt-get install g++-8 gcc-8 -qyy source ./util/ci/common.sh - install_linux_deps + install_linux_deps g++-12 libluajit-5.1-dev - name: Build run: | ./util/ci/build.sh env: - CC: gcc-8 - CXX: g++-8 + CC: gcc-12 + CXX: g++-12 - name: Test run: | ./bin/minetest --run-unittests - # This is our minor clang compiler + # Older clang version (should be close to our minimum supported version) clang_3_9: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install deps run: | - sudo apt-get install clang-3.9 -qyy source ./util/ci/common.sh - install_linux_deps + install_linux_deps clang-3.9 valgrind - name: Build run: | @@ -88,31 +89,7 @@ jobs: CC: clang-3.9 CXX: clang++-3.9 - - name: Test - run: | - ./bin/minetest --run-unittests - - # This is the current clang version - clang_9: - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@v2 - - name: Install deps - run: | - sudo apt-get install clang-9 valgrind -qyy - source ./util/ci/common.sh - install_linux_deps - env: - WITH_LUAJIT: 1 - - - name: Build - run: | - ./util/ci/build.sh - env: - CC: clang-9 - CXX: clang++-9 - - - name: Test + - name: Unittest run: | ./bin/minetest --run-unittests @@ -120,17 +97,41 @@ jobs: run: | valgrind --leak-check=full --leak-check-heuristics=all --undef-value-errors=no --error-exitcode=9 ./bin/minetest --run-unittests + # Current clang version + clang_14: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - name: Install deps + run: | + source ./util/ci/common.sh + install_linux_deps clang-14 gdb + + - name: Build + run: | + ./util/ci/build.sh + env: + CC: clang-14 + CXX: clang++-14 + + - name: Test + run: | + ./bin/minetest --run-unittests + + - name: Integration test + devtest + run: | + ./util/test_multiplayer.sh + # 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: | - sudo apt-get install clang-9 -qyy source ./util/ci/common.sh - install_linux_deps + install_linux_deps clang-9 - name: Build prometheus-cpp run: | @@ -148,48 +149,25 @@ jobs: run: | ./bin/minetestserver --run-unittests - # Build without freetype (client-only) - clang_9_no_freetype: - name: "clang_9 (FREETYPE=0)" - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@v2 - - name: Install deps - run: | - sudo apt-get install clang-9 -qyy - source ./util/ci/common.sh - install_linux_deps - - - name: Build - run: | - ./util/ci/build.sh - env: - CC: clang-9 - CXX: clang++-9 - CMAKE_FLAGS: "-DENABLE_FREETYPE=0 -DBUILD_SERVER=0" - - - name: Test - run: | - ./bin/minetest --run-unittests - 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 . + docker build . -t minetest:latest + docker run --rm minetest:latest /usr/local/bin/minetestserver --version 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 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 @@ -201,13 +179,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 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 @@ -219,11 +197,11 @@ jobs: msvc: name: VS 2019 ${{ matrix.config.arch }}-${{ matrix.type }} - runs-on: windows-2019 + runs-on: windows-2019 env: - VCPKG_VERSION: c7ab9d3110813979a873b2dbac630a9ab79850dc -# 2020.04 - vcpkg_packages: irrlicht zlib 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: @@ -244,11 +222,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@v2 + uses: lukka/run-vcpkg@v7 with: vcpkgArguments: ${{env.vcpkg_packages}} vcpkgDirectory: '${{ github.workspace }}\vcpkg' @@ -256,7 +238,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" ` @@ -264,7 +246,7 @@ jobs: -DENABLE_POSTGRESQL=OFF ` -DRUN_IN_PLACE=${{ contains(matrix.type, 'portable') }} . - - name: Build + - name: Build Minetest run: cmake --build . --config Release - name: CPack @@ -283,7 +265,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 1f97d105a..581ee06d6 100644 --- a/.github/workflows/cpp_lint.yml +++ b/.github/workflows/cpp_lint.yml @@ -24,30 +24,31 @@ on: - '.github/workflows/**.yml' jobs: - clang_format: - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@v2 - - name: Install clang-format - run: | - sudo apt-get install clang-format-9 -qyy - - name: Run clang-format - run: | - source ./util/ci/lint.sh - perform_lint - env: - CLANG_FORMAT: clang-format-9 +# clang_format: +# runs-on: ubuntu-20.04 +# steps: +# - uses: actions/checkout@v3 +# - name: Install clang-format +# run: | +# sudo apt-get update +# sudo apt-get install -y clang-format-9 +# +# - name: Run clang-format +# run: | +# source ./util/ci/clang-format.sh +# check_format +# env: +# 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 new file mode 100644 index 000000000..edc6630c0 --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,67 @@ +name: macos + +# build on c/cpp changes or workflow changes +on: + push: + paths: + - 'lib/**.[ch]' + - 'lib/**.cpp' + - 'src/**.[ch]' + - 'src/**.cpp' + - '**/CMakeLists.txt' + - 'cmake/Modules/**' + - '.github/workflows/macos.yml' + pull_request: + paths: + - 'lib/**.[ch]' + - 'lib/**.cpp' + - 'src/**.[ch]' + - 'src/**.cpp' + - '**/CMakeLists.txt' + - 'cmake/Modules/**' + - '.github/workflows/macos.yml' + +env: + MINETEST_GAME_REPO: https://github.com/minetest/minetest_game.git + MINETEST_GAME_BRANCH: master + MINETEST_GAME_NAME: minetest_game + +jobs: + build: + runs-on: macos-11 + steps: + - uses: actions/checkout@v3 + - name: Install deps + run: | + source ./util/ci/common.sh + install_macos_deps + + - name: Build + run: | + git clone -b $MINETEST_GAME_BRANCH $MINETEST_GAME_REPO games/$MINETEST_GAME_NAME + 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 \ + -DCMAKE_INSTALL_PREFIX=../build/macos/ \ + -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE + make -j2 + make install + + - name: Test + run: | + ./build/macos/minetest.app/Contents/MacOS/minetest --run-unittests + + # 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/*.zip diff --git a/.gitignore b/.gitignore index 52f8bc4f4..bb5e0a0cd 100644 --- a/.gitignore +++ b/.gitignore @@ -76,6 +76,7 @@ doc/mkdocs/docs/*.md doc/mkdocs/mkdocs.yml ## Build files +build/ CMakeFiles Makefile cmake_install.cmake @@ -86,8 +87,8 @@ src/test_config.h src/cmake_config.h src/cmake_config_githash.h src/unittest/test_world/world.mt -src/lua/build/ -locale/ +games/devtest/mods/testnodes/textures/testnodes_generated_*.png +/locale/ .directory *.cbp *.layout @@ -106,3 +107,13 @@ CMakeDoxy* compile_commands.json *.apk *.zip +# Visual Studio +*.vcxproj* +*.sln +.vs/ + +# Optional user provided library folder +lib/irrlichtmt + +# Generated mod storage database +client/mod_storage.sqlite diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d03b7b601..9f7917f59 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,271 +14,68 @@ variables: .build_template: stage: build + before_script: + - apt-get update + - DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential gettext git cmake libpng-dev libjpeg-dev libxi-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 libluajit-5.1-dev script: - - mkdir cmakebuild - - mkdir -p artifact/minetest/usr/ - - 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 .. + - make -j $(($(nproc) + 1)) - make install artifacts: when: on_success - expire_in: 2h + expire_in: 1h paths: - artifact/* -.debpkg_template: - stage: package - before_script: - - apt-get update -y - - apt-get install -y git - - mkdir -p build/deb/minetest/DEBIAN/ - - cp misc/debpkg-control build/deb/minetest/DEBIAN/control - - cp -Rp artifact/minetest/usr build/deb/minetest/ - script: - - git clone $MINETEST_GAME_REPO build/deb/minetest/usr/share/minetest/games/minetest - - rm -Rf build/deb/minetest/usr/share/minetest/games/minetest/.git - - sed -i 's/DATEPLACEHOLDER/'$(date +%y.%m.%d)'/g' build/deb/minetest/DEBIAN/control - - sed -i 's/LEVELDB_PLACEHOLDER/'$LEVELDB_PKG'/g' build/deb/minetest/DEBIAN/control - - cd build/deb/ && dpkg-deb -b minetest/ && mv minetest.deb ../../ - artifacts: - when: on_success - expire_in: 90 day - paths: - - ./*.deb - -.debpkg_install: - stage: deploy - before_script: - - apt-get update -y - - apt-get install -y libc6 libcurl3-gnutls libfreetype6 libirrlicht1.8 $LEVELDB_PKG liblua5.1-0 libluajit-5.1-2 libopenal1 libstdc++6 libvorbisfile3 libx11-6 zlib1g - script: - - dpkg -i ./*.deb - ## -## Debian +## Ubuntu (prerequisite for AppImage build) ## -# Jessie - -build:debian-8: +build:ubuntu-20.04: extends: .build_template - image: debian:8 - before_script: - - echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu trusty main" > /etc/apt/sources.list.d/uptodate-toolchain.list - - apt-key adv --keyserver keyserver.ubuntu.com --recv BA9EF27F - - apt-get update -y - - apt-get -y install build-essential gcc-6 g++-6 libirrlicht-dev cmake libbz2-dev 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 - variables: - CC: gcc-6 - CXX: g++-6 - -package:debian-8: - extends: .debpkg_template - image: debian:8 - dependencies: - - build:debian-8 - variables: - LEVELDB_PKG: libleveldb1 - -deploy:debian-8: - extends: .debpkg_install - image: debian:8 - dependencies: - - package:debian-8 - variables: - LEVELDB_PKG: libleveldb1 - -# Stretch - -build:debian-9: - extends: .build_template - image: debian:9 - before_script: - - apt-get update -y - - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev 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 - -package:debian-9: - extends: .debpkg_template - image: debian:9 - dependencies: - - build:debian-9 - variables: - LEVELDB_PKG: libleveldb1v5 - -deploy:debian-9: - extends: .debpkg_install - image: debian:9 - dependencies: - - package:debian-9 - variables: - LEVELDB_PKG: libleveldb1v5 - -# Stretch - -build:debian-10: - extends: .build_template - image: debian:10 - before_script: - - apt-get update -y - - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev 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 - -package:debian-10: - extends: .debpkg_template - image: debian:10 - dependencies: - - build:debian-10 - variables: - LEVELDB_PKG: libleveldb1d - -deploy:debian-10: - extends: .debpkg_install - image: debian:10 - dependencies: - - package:debian-10 - variables: - LEVELDB_PKG: libleveldb1d -## -## Ubuntu -## - -# Trusty - -build:ubuntu-14.04: - extends: .build_template - image: ubuntu:trusty - before_script: - - echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu trusty main" > /etc/apt/sources.list.d/uptodate-toolchain.list - - apt-key adv --keyserver keyserver.ubuntu.com --recv BA9EF27F - - apt-get update -y - - apt-get -y install build-essential gcc-6 g++-6 libirrlicht-dev cmake libbz2-dev 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 - variables: - CC: gcc-6 - CXX: g++-6 - -package:ubuntu-14.04: - extends: .debpkg_template - image: ubuntu:trusty - dependencies: - - build:ubuntu-14.04 - variables: - LEVELDB_PKG: libleveldb1 - -deploy:ubuntu-14.04: - extends: .debpkg_install - image: ubuntu:trusty - dependencies: - - package:ubuntu-14.04 - variables: - LEVELDB_PKG: libleveldb1 - -# Xenial - -build:ubuntu-16.04: - extends: .build_template - image: ubuntu:xenial - before_script: - - apt-get update -y - - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev 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 - -package:ubuntu-16.04: - extends: .debpkg_template - image: ubuntu:xenial - dependencies: - - build:ubuntu-16.04 - variables: - LEVELDB_PKG: libleveldb1v5 - -deploy:ubuntu-16.04: - extends: .debpkg_install - image: ubuntu:xenial - dependencies: - - package:ubuntu-16.04 - variables: - LEVELDB_PKG: libleveldb1v5 + image: ubuntu:focal ## -## Fedora -## - -# Do we need to support this old version ? -build:fedora-24: - extends: .build_template - image: fedora:24 - before_script: - - dnf -y install make automake gcc gcc-c++ kernel-devel cmake libcurl* openal* libvorbis* libXxf86vm-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel irrlicht-devel bzip2-libs gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel doxygen spatialindex-devel bzip2-devel - - -## -## Mingw for Windows +## MinGW for Windows ## .generic_win_template: - image: ubuntu:bionic + image: ubuntu:focal before_script: - - apt-get update -y - - apt-get install -y wget xz-utils unzip git cmake gettext - - wget -q http://minetest.kitsunemimi.pw/mingw-w64-${WIN_ARCH}_9.2.0_ubuntu18.04.tar.xz -O mingw.tar.xz + - 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}_11.2.0_ubuntu20.04.tar.xz -O mingw.tar.xz - tar -xaf mingw.tar.xz -C /usr .build_win_template: extends: .generic_win_template stage: build artifacts: - when: on_success - expire_in: 2h - paths: - - build/* - -.package_win_template: - extends: .generic_win_template - stage: package - script: - - cd build/minetest/_build - - make package - - cd ../../../ - - mkdir minetest-win-${WIN_ARCH} - - unzip build/minetest/_build/minetest-*-win*.zip -d minetest-win-${WIN_ARCH} - - cp /usr/${WIN_ARCH}-w64-mingw32/bin/libgcc*.dll minetest-win-${WIN_ARCH}/minetest-*-win*/bin - - cp /usr/${WIN_ARCH}-w64-mingw32/bin/libstdc++*.dll minetest-win-${WIN_ARCH}/minetest-*-win*/bin - - cp /usr/${WIN_ARCH}-w64-mingw32/bin/libwinpthread*.dll minetest-win-${WIN_ARCH}/minetest-*-win*/bin - artifacts: - when: on_success expire_in: 90 day paths: - - minetest-win-*/* + - minetest-*-win*/* build:win32: extends: .build_win_template script: - - ./util/buildbot/buildwin32.sh build + - EXISTING_MINETEST_DIR=$PWD ./util/buildbot/buildwin32.sh build + - unzip -q build/build/*.zip variables: - NO_PACKAGE: "1" - WIN_ARCH: "i686" - -package:win32: - extends: .package_win_template - dependencies: - - build:win32 - variables: - NO_PACKAGE: "1" WIN_ARCH: "i686" build:win64: extends: .build_win_template script: - - ./util/buildbot/buildwin64.sh build + - EXISTING_MINETEST_DIR=$PWD ./util/buildbot/buildwin64.sh build + - unzip -q build/build/*.zip variables: - NO_PACKAGE: "1" WIN_ARCH: "x86_64" -package:win64: - extends: .package_win_template - dependencies: - - build:win64 - variables: - NO_PACKAGE: "1" - WIN_ARCH: "x86_64" +## +## Docker +## package:docker: stage: package @@ -288,18 +85,17 @@ package:docker: before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com script: - - docker build . -t ${CONTAINER_IMAGE}/server:$CI_COMMIT_SHA -t ${CONTAINER_IMAGE}/server:$CI_COMMIT_REF_NAME -t ${CONTAINER_IMAGE}/server:latest - - docker push ${CONTAINER_IMAGE}/server:$CI_COMMIT_SHA - - docker push ${CONTAINER_IMAGE}/server:$CI_COMMIT_REF_NAME - - docker push ${CONTAINER_IMAGE}/server:latest + - ./util/ci/docker.sh + +## +## Gitlab Pages (Lua API documentation) +## pages: stage: deploy image: python:3.8 before_script: - - pip install git+https://github.com/Python-Markdown/markdown.git - - pip install git+https://github.com/mkdocs/mkdocs.git - - pip install pygments + - pip install -U -r doc/mkdocs/requirements.txt script: - cd doc/mkdocs && ./build.sh artifacts: @@ -308,3 +104,30 @@ pages: only: - master +## +## AppImage +## + +package:appimage-client: + stage: package + image: appimagecrafters/appimage-builder + needs: + - build:ubuntu-20.04 + before_script: + - apt-get update + - apt-get install -y git + # Collect files + - mkdir AppDir + - cp -a artifact/minetest/usr/ AppDir/usr/ + - cp -a clientmods AppDir/usr/share/minetest + - git clone $MINETEST_GAME_REPO AppDir/usr/share/minetest/games/minetest_game + - rm -rf AppDir/usr/share/minetest/games/minetest_game/.git + # Remove PrefersNonDefaultGPU property due to validation errors + - sed -i '/PrefersNonDefaultGPU/d' AppDir/usr/share/applications/net.minetest.minetest.desktop + script: + - export VERSION=$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA + - appimage-builder --skip-test --recipe misc/AppImageBuilder.yml + artifacts: + expire_in: 90 day + paths: + - ./*.AppImage diff --git a/.luacheckrc b/.luacheckrc index e010ab95c..a922bdea9 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -20,7 +20,7 @@ read_globals = { string = {fields = {"split", "trim"}}, table = {fields = {"copy", "getn", "indexof", "insert_all"}}, - math = {fields = {"hypot"}}, + math = {fields = {"hypot", "round"}}, } globals = { diff --git a/.mailmap b/.mailmap index c487460a0..76190d078 100644 --- a/.mailmap +++ b/.mailmap @@ -1,33 +1,69 @@ +# Documentation: https://git-scm.com/docs/git-check-mailmap#_mapping_authors + 0gb.us <0gb.us@0gb.us> -Calinou -Perttu Ahola celeron55 +Calinou +Calinou +Perttu Ahola Perttu Ahola celeron55 -Craig Robbins +Zeno- +Zeno- +Diego Martínez Diego Martínez +Ilya Zhuravlev Ilya Zhuravlev kwolekr -PilzAdam PilzAdam -PilzAdam Pilz Adam -PilzAdam PilzAdam +PilzAdam +PilzAdam proller proller RealBadAngel RealBadAngel Selat ShadowNinja ShadowNinja -Shen Zheyu arsdragonfly -Pavel Elagin elagin -Esteban I. Ruiz Moreno Esteban I. RM -manuel duarte manuel joaquim -manuel duarte sweetbomber -Diego Martínez kaeza -Diego Martínez Diego Martinez -Lord James Lord89James -BlockMen Block Men -sfan5 Sfan5 -DannyDark dannydark -Ilya Pavlov Ilya -Ilya Zhuravlev xyzz +Esteban I. Ruiz Moreno +Esteban I. Ruiz Moreno +Lord James +BlockMen +sfan5 +DannyDark +Ilya Pavlov sapier sapier sapier sapier - +SmallJoker +Loïc Blot +Loïc Blot +numzero Vitaliy +numzero +Jean-Patrick Guerrero +Jean-Patrick Guerrero +HybridDog <3192173+HybridDog@users.noreply.github.com> +srfqi +Dániel Juhász +rubenwardy +rubenwardy +Paul Ouellette +Vanessa Dannenberg +ClobberXD +ClobberXD +ClobberXD <36130650+ClobberXD@users.noreply.github.com> +Auke Kok +Auke Kok +Desour +Nathanaëlle Courant +Ezhh +paramat +paramat +lhofhansl +red-001 +Wuzzy +Wuzzy +Wuzzy +Jordach +MoNTE48 +v-rob +v-rob <31123645+v-rob@users.noreply.github.com> +EvidenceB <49488517+EvidenceBKidscode@users.noreply.github.com> +gregorycu +Rogier +Rogier +x2048 diff --git a/CMakeLists.txt b/CMakeLists.txt index fec9709d4..8756dddf5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,22 +1,24 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.5) -if(${CMAKE_VERSION} STREQUAL "2.8.2") - # Bug http://vtk.org/Bug/view.php?id=11020 - message(WARNING "CMake/CPack version 2.8.2 will not create working .deb packages!") +# Set policies up to 3.9 since we want to enable the IPO option +if(${CMAKE_VERSION} VERSION_LESS 3.9) + cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) +else() + cmake_policy(VERSION 3.9) endif() # This can be read from ${PROJECT_NAME} after project() is called project(minetest) set(PROJECT_NAME_CAPITALIZED "Minetest") -# Works only for cmake 3.1 and greater -set(CMAKE_CXX_STANDARD 11) -set(GCC_MINIMUM_VERSION "4.8") -set(CLANG_MINIMUM_VERSION "3.4") +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 4) +set(VERSION_MINOR 7) set(VERSION_PATCH 0) set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string") @@ -25,7 +27,7 @@ set(DEVELOPMENT_BUILD TRUE) set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") if(VERSION_EXTRA) - set(VERSION_STRING ${VERSION_STRING}-${VERSION_EXTRA}) + set(VERSION_STRING "${VERSION_STRING}-${VERSION_EXTRA}") elseif(DEVELOPMENT_BUILD) set(VERSION_STRING "${VERSION_STRING}-dev") endif() @@ -50,7 +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,12 +61,80 @@ 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/") -# This is done here so that relative search paths are more reasonable -find_package(Irrlicht) +set(IRRLICHTMT_BUILD_DIR "" CACHE PATH "Path to IrrlichtMt build directory.") +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 + # the only one, but it is the one where IrrlichtMt is supposed to export + # IrrlichtMtConfig.cmake + message(FATAL_ERROR "Could not find IrrlichtMtConfig.cmake in ${IRRLICHTMT_BUILD_DIR}/cmake.") + endif() +elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lib/irrlichtmt") + message(STATUS "Using user-provided IrrlichtMt at subdirectory 'lib/irrlichtmt'") + if(BUILD_CLIENT) + # tell IrrlichtMt to create a static library + set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared library" FORCE) + add_subdirectory(lib/irrlichtmt EXCLUDE_FROM_ALL) + unset(BUILD_SHARED_LIBS CACHE) + + if(NOT TARGET IrrlichtMt) + message(FATAL_ERROR "IrrlichtMt project is missing a CMake target?!") + endif() + else() + add_library(IrrlichtMt::IrrlichtMt INTERFACE IMPORTED) + set_target_properties(IrrlichtMt::IrrlichtMt PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/irrlichtmt/include") + endif() +else() + find_package(IrrlichtMt QUIET) + if(NOT TARGET IrrlichtMt::IrrlichtMt) + string(CONCAT explanation_msg + "The Minetest team has forked Irrlicht to make their own customizations. " + "It can be found here: https://github.com/minetest/irrlicht\n" + "For example use: git clone --depth=1 https://github.com/minetest/irrlicht lib/irrlichtmt\n") + if(BUILD_CLIENT) + message(FATAL_ERROR "IrrlichtMt is required to build the client, but it was not found.\n${explanation_msg}") + endif() + + include(MinetestFindIrrlichtHeaders) + if(NOT IRRLICHT_INCLUDE_DIR) + message(FATAL_ERROR "IrrlichtMt headers are required to build the server, but none found.\n${explanation_msg}") + endif() + 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 + INTERFACE_INCLUDE_DIRECTORIES "${IRRLICHT_INCLUDE_DIR}") + endif() +endif() + +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() # Installation @@ -95,15 +165,16 @@ elseif(UNIX) # Linux, BSD etc set(ICONDIR "unix/icons") set(LOCALEDIR "locale") else() - set(SHAREDIR "${CMAKE_INSTALL_PREFIX}/share/${PROJECT_NAME}") - set(BINDIR "${CMAKE_INSTALL_PREFIX}/bin") - set(DOCDIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}") - set(MANDIR "${CMAKE_INSTALL_PREFIX}/share/man") + include(GNUInstallDirs) + set(SHAREDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}") + set(BINDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}") + set(DOCDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DOCDIR}") + set(MANDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_MANDIR}") set(EXAMPLE_CONF_DIR ${DOCDIR}) - set(XDG_APPS_DIR "${CMAKE_INSTALL_PREFIX}/share/applications") - set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/share/metainfo") - set(ICONDIR "${CMAKE_INSTALL_PREFIX}/share/icons") - set(LOCALEDIR "${CMAKE_INSTALL_PREFIX}/share/locale") + set(XDG_APPS_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/applications") + set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/metainfo") + set(ICONDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/icons") + set(LOCALEDIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LOCALEDIR}") endif() endif() @@ -165,7 +236,7 @@ if(RUN_IN_PLACE) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/textures/texture_packs_here.txt" DESTINATION "${SHAREDIR}/textures") endif() -install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games/minetest_game" DESTINATION "${SHAREDIR}/games/" +install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games/minetest_game" DESTINATION "${SHAREDIR}/games/" COMPONENT "SUBGAME_MINETEST_GAME" OPTIONAL PATTERN ".git*" EXCLUDE ) install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games/devtest" DESTINATION "${SHAREDIR}/games/" COMPONENT "SUBGAME_MINIMAL" OPTIONAL PATTERN ".git*" EXCLUDE ) @@ -173,7 +244,6 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games/devtest" DESTINATION "${SHA if(BUILD_CLIENT) install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/client/shaders" DESTINATION "${SHAREDIR}/client") install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/textures/base/pack" DESTINATION "${SHAREDIR}/textures/base") - install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/fonts" DESTINATION "${SHAREDIR}") if(RUN_IN_PLACE) install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/clientmods" DESTINATION "${SHAREDIR}") install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/client/serverlist" DESTINATION "${SHAREDIR}/client") @@ -207,10 +277,10 @@ endif() find_package(GMP REQUIRED) find_package(Json REQUIRED) find_package(Lua REQUIRED) - -# JsonCPP doesn't compile well on GCC 4.8 -if(NOT ENABLE_SYSTEM_JSONCPP) - set(GCC_MINIMUM_VERSION "4.9") +if(NOT USE_LUAJIT) + set(LUA_BIT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/bitop) + set(LUA_BIT_LIBRARY bitop) + add_subdirectory(lib/bitop) endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") @@ -218,16 +288,19 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") message(FATAL_ERROR "Insufficient gcc version, found ${CMAKE_CXX_COMPILER_VERSION}. " "Version ${GCC_MINIMUM_VERSION} or higher is required.") endif() -elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") +elseif(CMAKE_CXX_COMPILER_ID MATCHES "(Apple)?Clang") if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "${CLANG_MINIMUM_VERSION}") message(FATAL_ERROR "Insufficient clang version, found ${CMAKE_CXX_COMPILER_VERSION}. " "Version ${CLANG_MINIMUM_VERSION} or higher is required.") endif() endif() +if(BUILD_BENCHMARKS) + add_subdirectory(lib/catch2) +endif() + # Subdirectories # Be sure to add all relevant definitions above this - add_subdirectory(src) @@ -249,15 +322,15 @@ cpack_add_component(Docs cpack_add_component(SUBGAME_MINETEST_GAME DISPLAY_NAME "Minetest Game" - DESCRIPTION "The official subgame for the Minetest engine, that can easily extended by mods." - GROUP "Subgames" + DESCRIPTION "The default game bundled in the Minetest engine. Mainly used as a modding base." + GROUP "Games" ) cpack_add_component(SUBGAME_MINIMAL DISPLAY_NAME "Development Test" - DESCRIPTION "A minimal test game helping to develop the engine." + DESCRIPTION "A basic testing environment used for engine development and sometimes for testing mods." DISABLED #DISABLED does not mean it is disabled, and is just not selected by default. - GROUP "Subgames" + GROUP "Games" ) cpack_add_component_group(Subgames @@ -278,19 +351,20 @@ if(WIN32) set(CPACK_GENERATOR ZIP) else() - set(CPACK_GENERATOR WIX ZIP) + set(CPACK_GENERATOR WIX) set(CPACK_PACKAGE_NAME "${PROJECT_NAME_CAPITALIZED}") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME_CAPITALIZED}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY ".") set(CPACK_PACKAGE_EXECUTABLES ${PROJECT_NAME} "${PROJECT_NAME_CAPITALIZED}") set(CPACK_CREATE_DESKTOP_LINKS ${PROJECT_NAME}) + set(CPACK_PACKAGING_INSTALL_PREFIX "/${PROJECT_NAME_CAPITALIZED}") set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/misc/minetest-icon.ico") - # Supported languages can be found at + # Supported languages can be found at # http://wixtoolset.org/documentation/manual/v3/wixui/wixui_localization.html #set(CPACK_WIX_CULTURES "ar-SA,bg-BG,ca-ES,hr-HR,cs-CZ,da-DK,nl-NL,en-US,et-EE,fi-FI,fr-FR,de-DE") set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/misc/CPACK_WIX_UI_BANNER.BMP") set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/misc/CPACK_WIX_UI_DIALOG.BMP") - + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/doc/lgpl-2.1.txt") # The correct way would be to include both x32 and x64 into one installer diff --git a/Dockerfile b/Dockerfile index 72343ab9c..3dd82e772 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,8 @@ -FROM alpine:3.11 +ARG DOCKER_IMAGE=alpine:3.14 +FROM $DOCKER_IMAGE AS builder ENV MINETEST_GAME_VERSION master +ENV IRRLICHT_VERSION master COPY .git /usr/src/minetest/.git COPY CMakeLists.txt /usr/src/minetest/CMakeLists.txt @@ -18,48 +20,49 @@ COPY textures /usr/src/minetest/textures WORKDIR /usr/src/minetest -RUN apk add --no-cache git build-base irrlicht-dev cmake bzip2-dev 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 postgresql-dev ca-certificates && \ +RUN apk add --no-cache git build-base cmake sqlite-dev curl-dev zlib-dev zstd-dev \ + gmp-dev jsoncpp-dev postgresql-dev ninja luajit-dev ca-certificates && \ git clone --depth=1 -b ${MINETEST_GAME_VERSION} https://github.com/minetest/minetest_game.git ./games/minetest_game && \ rm -fr ./games/minetest_game/.git WORKDIR /usr/src/ RUN git clone --recursive https://github.com/jupp0r/prometheus-cpp/ && \ - mkdir prometheus-cpp/build && \ - cd prometheus-cpp/build && \ - cmake .. \ + cd prometheus-cpp && \ + cmake -B build \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_BUILD_TYPE=Release \ - -DENABLE_TESTING=0 && \ - make -j2 && \ - make install + -DENABLE_TESTING=0 \ + -GNinja && \ + 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 \ -DENABLE_PROMETHEUS=TRUE \ -DBUILD_UNITTESTS=FALSE \ - -DBUILD_CLIENT=FALSE && \ - make -j2 && \ - make install + -DBUILD_CLIENT=FALSE \ + -GNinja && \ + cmake --build build && \ + cmake --install build -FROM alpine:3.11 +ARG DOCKER_IMAGE=alpine:3.14 +FROM $DOCKER_IMAGE AS runtime -RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc libpq && \ +RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc libpq luajit jsoncpp zstd-libs && \ adduser -D minetest --uid 30000 -h /var/lib/minetest && \ chown -R minetest:minetest /var/lib/minetest WORKDIR /var/lib/minetest -COPY --from=0 /usr/local/share/minetest /usr/local/share/minetest -COPY --from=0 /usr/local/bin/minetestserver /usr/local/bin/minetestserver -COPY --from=0 /usr/local/share/doc/minetest/minetest.conf.example /etc/minetest/minetest.conf +COPY --from=builder /usr/local/share/minetest /usr/local/share/minetest +COPY --from=builder /usr/local/bin/minetestserver /usr/local/bin/minetestserver +COPY --from=builder /usr/local/share/doc/minetest/minetest.conf.example /etc/minetest/minetest.conf USER minetest:minetest diff --git a/LICENSE.txt b/LICENSE.txt index f5c51833b..1f2c6c38d 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -11,6 +11,12 @@ http://creativecommons.org/licenses/by-sa/3.0/ textures/base/pack/refresh.png is under the Apache 2 license https://www.apache.org/licenses/LICENSE-2.0.html +Textures by Zughy are under CC BY-SA 4.0 +https://creativecommons.org/licenses/by-sa/4.0/ + +textures/base/pack/server_public.png is under CC-BY 4.0, taken from Twitter's Twemoji set +https://creativecommons.org/licenses/by/4.0/ + Authors of media files ----------------------- Everything not listed in here: @@ -23,6 +29,8 @@ paramat: textures/base/pack/menu_header.png textures/base/pack/next_icon.png textures/base/pack/prev_icon.png + textures/base/pack/clear.png + textures/base/pack/search.png rubenwardy, paramat: textures/base/pack/start_icon.png @@ -34,10 +42,10 @@ erlehmann: misc/minetest.svg textures/base/pack/logo.png -JRottm +JRottm: textures/base/pack/player_marker.png -srifqi +srifqi: textures/base/pack/chat_hide_btn.png textures/base/pack/chat_show_btn.png textures/base/pack/joystick_bg.png @@ -45,6 +53,26 @@ srifqi textures/base/pack/joystick_off.png textures/base/pack/minimap_btn.png +Zughy: + textures/base/pack/cdb_add.png + textures/base/pack/cdb_clear.png + textures/base/pack/cdb_downloading.png + textures/base/pack/cdb_queued.png + textures/base/pack/cdb_update.png + textures/base/pack/cdb_viewonline.png + +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 ------------------------------- @@ -68,7 +96,8 @@ with this program; if not, write to the Free Software Foundation, Inc., Irrlicht --------------- -This program uses the Irrlicht Engine. http://irrlicht.sourceforge.net/ +This program uses IrrlichtMt, Minetest's fork of +the Irrlicht Engine. http://irrlicht.sourceforge.net/ The Irrlicht Engine License diff --git a/README.md b/README.md new file mode 100644 index 000000000..95c97583e --- /dev/null +++ b/README.md @@ -0,0 +1,482 @@ +# Slightly modified version of: + +Minetest +======== + +![Build Status](https://github.com/minetest/minetest/workflows/build/badge.svg) +[![Translation status](https://hosted.weblate.org/widgets/minetest/-/svg-badge.svg)](https://hosted.weblate.org/engage/minetest/?utm_source=widget) +[![License](https://img.shields.io/badge/license-LGPLv2.1%2B-blue.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html) + +Minetest is a free open-source voxel game engine with easy modding and game creation. + +Copyright (C) 2010-2022 Perttu Ahola +and contributors (see source file comments and the version control log) + +In case you downloaded the source code +-------------------------------------- +If you downloaded the Minetest Engine source code in which this file is +contained, you probably want to download the [Minetest Game](https://github.com/minetest/minetest_game/) +project too. See its README.txt for more information. + +Table of Contents +------------------ + +1. [Further Documentation](#further-documentation) +2. [Default Controls](#default-controls) +3. [Paths](#paths) +4. [Configuration File](#configuration-file) +5. [Command-line Options](#command-line-options) +6. [Compiling](#compiling) +7. [Docker](#docker) +8. [Version Scheme](#version-scheme) + + +Further documentation +---------------------- +- Website: https://minetest.net/ +- Wiki: https://wiki.minetest.net/ +- Developer wiki: https://dev.minetest.net/ +- Forum: https://forum.minetest.net/ +- GitHub: https://github.com/minetest/minetest/ +- [doc/](doc/) directory of source distribution + +Default controls +---------------- +All controls are re-bindable using settings. +Some can be changed in the key config dialog in the settings tab. + +| Button | Action | +|-------------------------------|----------------------------------------------------------------| +| Move mouse | Look around | +| W, A, S, D | Move | +| Space | Jump/move up | +| Shift | Sneak/move down | +| Q | Drop itemstack | +| Shift + Q | Drop single item | +| Left mouse button | Dig/punch/take item | +| Right mouse button | Place/use | +| Shift + right mouse button | Build (without using) | +| I | Inventory menu | +| Mouse wheel | Select item | +| 0-9 | Select item | +| Z | Zoom (needs zoom privilege) | +| T | Chat | +| / | Command | +| Esc | Pause menu/abort/exit (pauses only singleplayer game) | +| R | Enable/disable full range view | +| + | Increase view range | +| - | Decrease view range | +| K | Enable/disable fly mode (needs fly privilege) | +| P | Enable/disable pitch move mode | +| J | Enable/disable fast mode (needs fast privilege) | +| H | Enable/disable noclip mode (needs noclip privilege) | +| E | Aux1 (Move fast in fast mode. Games may add special features) | +| C | Cycle through camera modes | +| V | Cycle through minimap modes | +| Shift + V | Change minimap orientation | +| F1 | Hide/show HUD | +| F2 | Hide/show chat | +| F3 | Disable/enable fog | +| F4 | Disable/enable camera update (Mapblocks are not updated anymore when disabled, disabled in release builds) | +| F5 | Cycle through debug information screens | +| F6 | Cycle through profiler info screens | +| F10 | Show/hide console | +| F12 | Take screenshot | + +Paths +----- +Locations: + +* `bin` - Compiled binaries +* `share` - Distributed read-only data +* `user` - User-created modifiable data + +Where each location is on each platform: + +* Windows .zip / RUN_IN_PLACE source: + * `bin` = `bin` + * `share` = `.` + * `user` = `.` +* Windows installed: + * `bin` = `C:\Program Files\Minetest\bin (Depends on the install location)` + * `share` = `C:\Program Files\Minetest (Depends on the install location)` + * `user` = `%APPDATA%\Minetest` +* Linux installed: + * `bin` = `/usr/bin` + * `share` = `/usr/share/minetest` + * `user` = `~/.minetest` +* macOS: + * `bin` = `Contents/MacOS` + * `share` = `Contents/Resources` + * `user` = `Contents/User OR ~/Library/Application Support/minetest` + +Worlds can be found as separate folders in: `user/worlds/` + +Configuration file +------------------ +- Default location: + `user/minetest.conf` +- This file is created by closing Minetest for the first time. +- A specific file can be specified on the command line: + `--config ` +- A run-in-place build will look for the configuration file in + `location_of_exe/../minetest.conf` and also `location_of_exe/../../minetest.conf` + +Command-line options +-------------------- +- Use `--help` + +Compiling +--------- +### Compiling on GNU/Linux + +#### Dependencies + +| Dependency | Version | Commentary | +|------------|---------|------------| +| GCC | 5.1+ | or Clang 3.5+ | +| CMake | 3.5+ | | +| IrrlichtMt | - | Custom version of Irrlicht, see https://github.com/minetest/irrlicht | +| Freetype | 2.0+ | | +| SQLite3 | 3+ | | +| Zstd | 1.0+ | | +| LuaJIT | 2.0+ | Bundled Lua 5.1 is used if not present | +| GMP | 5.0.0+ | Bundled mini-GMP is used if not present | +| JsonCPP | 1.0.0+ | Bundled JsonCPP is used if not present | + +For Debian/Ubuntu users: + + sudo apt install g++ make libc6-dev cmake libpng-dev libjpeg-dev libxi-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev libzstd-dev libluajit-5.1-dev + +For Fedora users: + + 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 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 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 + +You can install Git for easily keeping your copy up to date. +If you don’t want Git, read below on how to get the source without Git. +This is an example for installing Git on Debian/Ubuntu: + + sudo apt install git + +For Fedora users: + + sudo dnf install git + +Download source (this is the URL to the latest of source repository, which might not work at all times) using Git: + + git clone --depth 1 https://github.com/minetest/minetest.git + cd minetest + +Download minetest_game (otherwise only the "Development Test" game is available) using Git: + + git clone --depth 1 https://github.com/minetest/minetest_game.git games/minetest_game + +Download IrrlichtMt to `lib/irrlichtmt`, it will be used to satisfy the IrrlichtMt dependency that way: + + git clone --depth 1 https://github.com/minetest/irrlicht.git lib/irrlichtmt + +Download source, without using Git: + + wget https://github.com/minetest/minetest/archive/master.tar.gz + tar xf master.tar.gz + cd minetest-master + +Download minetest_game, without using Git: + + cd games/ + wget https://github.com/minetest/minetest_game/archive/master.tar.gz + tar xf master.tar.gz + mv minetest_game-master minetest_game + cd .. + +Download IrrlichtMt, without using Git: + + cd lib/ + wget https://github.com/minetest/irrlicht/archive/master.tar.gz + tar xf master.tar.gz + mv irrlicht-master irrlichtmt + cd .. + +#### Build + +Build a version that runs directly from the source directory: + + cmake . -DRUN_IN_PLACE=TRUE + make -j$(nproc) + +Run it: + + ./bin/minetest + +- Use `cmake . -LH` to see all CMake options and their current state. +- If you want to install it system-wide (or are making a distribution package), + you will want to use `-DRUN_IN_PLACE=FALSE`. +- You can build a bare server by specifying `-DBUILD_SERVER=TRUE`. +- You can disable the client build by specifying `-DBUILD_CLIENT=FALSE`. +- You can select between Release and Debug build by `-DCMAKE_BUILD_TYPE=`. + - Debug build is slower, but gives much more useful output in a debugger. +- 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 + 2. `${PROJECT_SOURCE_DIR}/lib/irrlichtmt` (if existent) + 3. Installation of IrrlichtMt in the system-specific library paths + 4. For server builds with disabled `BUILD_CLIENT` variable, the headers from `IRRLICHT_INCLUDE_DIR` will be used. + - NOTE: Changing the IrrlichtMt build directory (includes system installs) requires regenerating the CMake cache (`rm CMakeCache.txt`) + +### CMake options + +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 + SemiDebug - Partially optimized debug build + RelWithDebInfo - Release build with debug information + MinSizeRel - Release build with -Os passed to compiler to make executable as small as possible + 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 - 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 + ENABLE_SPATIAL=ON - Build with LibSpatial; Speeds up AreaStores + ENABLE_SOUND=ON - Build with OpenAL, libogg & libvorbis; in-game sounds + ENABLE_LUAJIT=ON - Build with LuaJIT (much faster than non-JIT Lua) + 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 + 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) + +Library specific options: + + CURL_DLL - Only if building with cURL on Windows; path to libcurl.dll + CURL_INCLUDE_DIR - Only if building with cURL; directory where curl.h is located + CURL_LIBRARY - Only if building with cURL; path to libcurl.a/libcurl.so/libcurl.lib + EGL_INCLUDE_DIR - Only if building with GLES; directory that contains egl.h + EGL_LIBRARY - Only if building with GLES; path to libEGL.a/libEGL.so + EXTRA_DLL - Only on Windows; optional paths to additional DLLs that should be packaged + FREETYPE_INCLUDE_DIR_freetype2 - Directory that contains files such as ftimage.h + FREETYPE_INCLUDE_DIR_ft2build - Directory that contains ft2build.h + FREETYPE_LIBRARY - Path to libfreetype.a/libfreetype.so/freetype.lib + FREETYPE_DLL - Only on Windows; path to libfreetype-6.dll + GETTEXT_DLL - Only when building with gettext on Windows; paths to libintl + libiconv DLLs + GETTEXT_INCLUDE_DIR - Only when building with gettext; directory that contains iconv.h + GETTEXT_LIBRARY - Only when building with gettext on Windows; path to libintl.dll.a + GETTEXT_MSGFMT - Only when building with gettext; path to msgfmt/msgfmt.exe + IRRLICHT_DLL - Only on Windows; path to IrrlichtMt.dll + IRRLICHT_INCLUDE_DIR - Directory that contains IrrCompileConfig.h (usable for server build only) + LEVELDB_INCLUDE_DIR - Only when building with LevelDB; directory that contains db.h + LEVELDB_LIBRARY - Only when building with LevelDB; path to libleveldb.a/libleveldb.so/libleveldb.dll.a + LEVELDB_DLL - Only when building with LevelDB on Windows; path to libleveldb.dll + PostgreSQL_INCLUDE_DIR - Only when building with PostgreSQL; directory that contains libpq-fe.h + PostgreSQL_LIBRARY - Only when building with PostgreSQL; path to libpq.a/libpq.so/libpq.lib + REDIS_INCLUDE_DIR - Only when building with Redis; directory that contains hiredis.h + REDIS_LIBRARY - Only when building with Redis; path to libhiredis.a/libhiredis.so + SPATIAL_INCLUDE_DIR - Only when building with LibSpatial; directory that contains spatialindex/SpatialIndex.h + SPATIAL_LIBRARY - Only when building with LibSpatial; path to libspatialindex_c.so/spatialindex-32.lib + LUA_INCLUDE_DIR - Only if you want to use LuaJIT; directory where luajit.h is located + LUA_LIBRARY - Only if you want to use LuaJIT; path to libluajit.a/libluajit.so + OGG_DLL - Only if building with sound on Windows; path to libogg.dll + OGG_INCLUDE_DIR - Only if building with sound; directory that contains an ogg directory which contains ogg.h + OGG_LIBRARY - Only if building with sound; path to libogg.a/libogg.so/libogg.dll.a + 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 + 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 + 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 + ZSTD_DLL - Only on Windows; path to libzstd.dll + ZSTD_INCLUDE_DIR - Directory that contains zstd.h + ZSTD_LIBRARY - Path to libzstd.a/libzstd.so/ztd.lib + +### Compiling on Windows using MSVC + +### Requirements + +- [Visual Studio 2015 or newer](https://visualstudio.microsoft.com) +- [CMake](https://cmake.org/download/) +- [vcpkg](https://github.com/Microsoft/vcpkg) +- [Git](https://git-scm.com/downloads) + +### Compiling and installing the dependencies + +It is highly recommended to use vcpkg as package manager. + +After you successfully built vcpkg you can easily install the required libraries: +```powershell +vcpkg install zlib zstd curl[winssl] openal-soft libvorbis libogg libjpeg-turbo sqlite3 freetype luajit gmp jsoncpp opengl-registry --triplet x64-windows +``` + +- **Don't forget about IrrlichtMt.** The easiest way is to clone it to `lib/irrlichtmt` as described in the Linux section. +- `curl` is optional, but required to read the serverlist, `curl[winssl]` is required to use the content store. +- `openal-soft`, `libvorbis` and `libogg` are optional, but required to use sound. +- `luajit` is optional, it replaces the integrated Lua interpreter with a faster just-in-time interpreter. +- `gmp` and `jsoncpp` are optional, otherwise the bundled versions will be compiled + +There are other optional libraries, but they are not tested if they can build and link correctly. + +Use `--triplet` to specify the target triplet, e.g. `x64-windows` or `x86-windows`. + +### Compile Minetest + +#### a) Using the vcpkg toolchain and CMake GUI +1. Start up the CMake GUI +2. Select **Browse Source...** and select DIR/minetest +3. Select **Browse Build...** and select DIR/minetest-build +4. Select **Configure** +5. Choose the right visual Studio version and target platform. It has to match the version of the installed dependencies +6. Choose **Specify toolchain file for cross-compiling** +7. Click **Next** +8. Select the vcpkg toolchain file e.g. `D:/vcpkg/scripts/buildsystems/vcpkg.cmake` +9. Click Finish +10. Wait until cmake have generated the cash file +11. If there are any errors, solve them and hit **Configure** +12. Click **Generate** +13. Click **Open Project** +14. Compile Minetest inside Visual studio. + +#### b) Using the vcpkg toolchain and the commandline + +Run the following script in PowerShell: + +```powershell +cmake . -G"Visual Studio 15 2017 Win64" -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=OFF -DENABLE_CURSES=OFF +cmake --build . --config Release +``` +Make sure that the right compiler is selected and the path to the vcpkg toolchain is correct. + +### Windows Installer using WiX Toolset + +Requirements: +* [Visual Studio 2017](https://visualstudio.microsoft.com/) +* [WiX Toolset](https://wixtoolset.org/) + +In the Visual Studio 2017 Installer select **Optional Features -> WiX Toolset**. + +Build the binaries as described above, but make sure you unselect `RUN_IN_PLACE`. + +Open the generated project file with Visual Studio. Right-click **Package** and choose **Generate**. +It may take some minutes to generate the installer. + +### Compiling on MacOS + +#### Requirements +- [Homebrew](https://brew.sh/) +- [Git](https://git-scm.com/downloads) + +Install dependencies with homebrew: + +``` +brew install cmake freetype gettext gmp hiredis jpeg jsoncpp leveldb libogg libpng libvorbis luajit zstd +``` + +#### Download + +Download source (this is the URL to the latest of source repository, which might not work at all times) using Git: + +```bash +git clone --depth 1 https://github.com/minetest/minetest.git +cd minetest +``` + +Download minetest_game (otherwise only the "Development Test" game is available) using Git: + +``` +git clone --depth 1 https://github.com/minetest/minetest_game.git games/minetest_game +``` + +Download Minetest's fork of Irrlicht: + +``` +git clone --depth 1 https://github.com/minetest/irrlicht.git lib/irrlichtmt +``` + +#### Build + +```bash +mkdir build +cd build + +cmake .. \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 \ + -DCMAKE_FIND_FRAMEWORK=LAST \ + -DCMAKE_INSTALL_PREFIX=../build/macos/ \ + -DRUN_IN_PLACE=FALSE -DENABLE_GETTEXT=TRUE + +make -j$(sysctl -n hw.logicalcpu) +make install +``` + +#### Run + +``` +open ./build/macos/minetest.app +``` + +Docker +------ +We provide Minetest server Docker images using the GitLab mirror registry. + +Images are built on each commit and available using the following tag scheme: + +* `registry.gitlab.com/minetest/minetest/server:latest` (latest build) +* `registry.gitlab.com/minetest/minetest/server:` (current branch or current tag) +* `registry.gitlab.com/minetest/minetest/server:` (current commit id) + +If you want to test it on a Docker server you can easily run: + + sudo docker run registry.gitlab.com/minetest/minetest/server: + +If you want to use it in a production environment you should use volumes bound to the Docker host +to persist data and modify the configuration: + + sudo docker create -v /home/minetest/data/:/var/lib/minetest/ -v /home/minetest/conf/:/etc/minetest/ registry.gitlab.com/minetest/minetest/server:master + +Data will be written to `/home/minetest/data` on the host, and configuration will be read from `/home/minetest/conf/minetest.conf`. + +**Note:** If you don't understand the previous commands please read the official Docker documentation before use. + +You can also host your Minetest server inside a Kubernetes cluster. See our example implementation in [`misc/kubernetes.yml`](misc/kubernetes.yml). + + +Version scheme +-------------- +We use `major.minor.patch` since 5.0.0-dev. Prior to that we used `0.major.minor`. + +- Major is incremented when the release contains breaking changes, all other +numbers are set to 0. +- Minor is incremented when the release contains new non-breaking features, +patch is set to 0. +- Patch is incremented when the release only contains bugfixes and very +minor/trivial features considered necessary. + +Since 5.0.0-dev and 0.4.17-dev, the dev notation refers to the next release, +i.e.: 5.0.0-dev is the development version leading to 5.0.0. +Prior to that we used `previous_version-dev`. diff --git a/build/android/.gitignore b/android/.gitignore similarity index 100% rename from build/android/.gitignore rename to android/.gitignore diff --git a/build/android/app/build.gradle b/android/app/build.gradle similarity index 76% rename from build/android/app/build.gradle rename to android/app/build.gradle index e3619af17..e8ba95722 100644 --- a/build/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,18 +1,21 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 29 - buildToolsVersion '29.0.3' - ndkVersion '21.1.6352462' + compileSdkVersion 30 + buildToolsVersion '30.0.3' + ndkVersion "$ndk_version" defaultConfig { applicationId 'net.minetest.minetest' minSdkVersion 16 - targetSdkVersion 29 + targetSdkVersion 30 versionName "${versionMajor}.${versionMinor}.${versionPatch}" versionCode project.versionCode } + // load properties Properties props = new Properties() - props.load(new FileInputStream(file('../local.properties'))) + def propfile = file('../local.properties') + if (propfile.exists()) + props.load(new FileInputStream(propfile)) if (props.getProperty('keystore') != null) { signingConfigs { @@ -49,7 +52,7 @@ android { task prepareAssets() { def assetsFolder = "build/assets" - def projRoot = "../../.." + def projRoot = "../.." def gameToCopy = "minetest_game" copy { @@ -61,12 +64,11 @@ task prepareAssets() { copy { from "${projRoot}/builtin" into "${assetsFolder}/builtin" } - /*copy { - // ToDo: fix Minetest shaders that currently don't work with OpenGL ES - from "${projRoot}/client/shaders" into "${assetsFolder}/client/shaders" - }*/ copy { - from "../native/deps/Android/Irrlicht/shaders" into "${assetsFolder}/client/shaders/Irrlicht" + from "${projRoot}/client/shaders" into "${assetsFolder}/client/shaders" + } + copy { + from "../native/deps/armeabi-v7a/Irrlicht/Shaders" into "${assetsFolder}/client/shaders/Irrlicht" } copy { from "${projRoot}/fonts" include "*.ttf" into "${assetsFolder}/fonts" @@ -74,10 +76,13 @@ task prepareAssets() { copy { from "${projRoot}/games/${gameToCopy}" into "${assetsFolder}/games/${gameToCopy}" } - /*copy { - // ToDo: fix broken locales - from "${projRoot}/po" into "${assetsFolder}/po" - }*/ + fileTree("${projRoot}/po").include("**/*.po").forEach { poFile -> + def moPath = "${assetsFolder}/locale/${poFile.parentFile.name}/LC_MESSAGES/" + file(moPath).mkdirs() + exec { + commandLine 'msgfmt', '-o', "${moPath}/minetest.mo", poFile + } + } copy { from "${projRoot}/textures" into "${assetsFolder}/textures" } @@ -107,5 +112,5 @@ android.applicationVariants.all { variant -> dependencies { implementation project(':native') - implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.appcompat:appcompat:1.3.1' } diff --git a/build/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml similarity index 80% rename from build/android/app/src/main/AndroidManifest.xml rename to android/app/src/main/AndroidManifest.xml index 0a7c8d95a..11c868622 100644 --- a/build/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -17,8 +17,8 @@ android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/label" - android:resizeableActivity="false" android:requestLegacyExternalStorage="true" + android:resizeableActivity="false" tools:ignore="UnusedAttribute"> + android:theme="@style/AppTheme" + android:exported="true"> @@ -44,7 +45,8 @@ android:launchMode="singleTask" android:maxAspectRatio="3.0" android:screenOrientation="sensorLandscape" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + android:exported="true"> @@ -53,15 +55,21 @@ android:value="Minetest" /> - - - + + + + + + diff --git a/android/app/src/main/java/net/minetest/minetest/CustomEditText.java b/android/app/src/main/java/net/minetest/minetest/CustomEditText.java new file mode 100644 index 000000000..8d0a503d0 --- /dev/null +++ b/android/app/src/main/java/net/minetest/minetest/CustomEditText.java @@ -0,0 +1,45 @@ +/* +Minetest +Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik +Copyright (C) 2014-2020 ubulem, Bektur Mambetov + +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. +*/ + +package net.minetest.minetest; + +import android.content.Context; +import android.view.KeyEvent; +import android.view.inputmethod.InputMethodManager; + +import androidx.appcompat.widget.AppCompatEditText; + +import java.util.Objects; + +public class CustomEditText extends AppCompatEditText { + public CustomEditText(Context context) { + super(context); + } + + @Override + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + InputMethodManager mgr = (InputMethodManager) + getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + Objects.requireNonNull(mgr).hideSoftInputFromWindow(this.getWindowToken(), 0); + } + return false; + } +} diff --git a/android/app/src/main/java/net/minetest/minetest/GameActivity.java b/android/app/src/main/java/net/minetest/minetest/GameActivity.java new file mode 100644 index 000000000..f5e9fd6d0 --- /dev/null +++ b/android/app/src/main/java/net/minetest/minetest/GameActivity.java @@ -0,0 +1,207 @@ +/* +Minetest +Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik +Copyright (C) 2014-2020 ubulem, Bektur Mambetov + +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. +*/ + +package net.minetest.minetest; + +import android.app.NativeActivity; +import android.content.Intent; +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; +import android.view.inputmethod.InputMethodManager; +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"); + System.loadLibrary("Minetest"); + } + + private int messageReturnCode = -1; + private String messageReturnValue = ""; + + public static native void putMessageBoxResult(String text); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + + private void makeFullScreen() { + if (Build.VERSION.SDK_INT >= 19) + this.getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus) + makeFullScreen(); + } + + @Override + protected void onResume() { + super.onResume(); + makeFullScreen(); + } + + @Override + public void onBackPressed() { + // Ignore the back press so Minetest can handle it + } + + public void showDialog(String acceptButton, String hint, String current, int editType) { + runOnUiThread(() -> showDialogUI(hint, current, editType)); + } + + private void showDialogUI(String hint, String current, int editType) { + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + LinearLayout container = new LinearLayout(this); + container.setOrientation(LinearLayout.VERTICAL); + builder.setView(container); + AlertDialog alertDialog = builder.create(); + EditText editText; + // For multi-line, do not close the dialog after pressing back button + if (editType == 1) { + editText = new EditText(this); + } else { + editText = new CustomEditText(this); + } + container.addView(editText); + editText.setMaxLines(8); + editText.requestFocus(); + editText.setHint(hint); + editText.setText(current); + final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + Objects.requireNonNull(imm).toggleSoftInput(InputMethodManager.SHOW_FORCED, + InputMethodManager.HIDE_IMPLICIT_ONLY); + if (editType == 1) + editText.setInputType(InputType.TYPE_CLASS_TEXT | + InputType.TYPE_TEXT_FLAG_MULTI_LINE); + else if (editType == 3) + editText.setInputType(InputType.TYPE_CLASS_TEXT | + InputType.TYPE_TEXT_VARIATION_PASSWORD); + else + editText.setInputType(InputType.TYPE_CLASS_TEXT); + editText.setSelection(editText.getText().length()); + editText.setOnKeyListener((view, keyCode, event) -> { + // For multi-line, do not submit the text after pressing Enter key + if (keyCode == KeyEvent.KEYCODE_ENTER && editType != 1) { + imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); + messageReturnCode = 0; + messageReturnValue = editText.getText().toString(); + alertDialog.dismiss(); + return true; + } + return false; + }); + // For multi-line, add Done button since Enter key does not submit text + if (editType == 1) { + Button doneButton = new Button(this); + container.addView(doneButton); + doneButton.setText(R.string.ime_dialog_done); + doneButton.setOnClickListener((view -> { + imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); + messageReturnCode = 0; + messageReturnValue = editText.getText().toString(); + alertDialog.dismiss(); + })); + } + alertDialog.show(); + alertDialog.setOnCancelListener(dialog -> { + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); + messageReturnValue = current; + messageReturnCode = -1; + }); + } + + public int getDialogState() { + return messageReturnCode; + } + + public String getDialogValue() { + messageReturnCode = -1; + return messageReturnValue; + } + + public float getDensity() { + return getResources().getDisplayMetrics().density; + } + + public int getDisplayHeight() { + return getResources().getDisplayMetrics().heightPixels; + } + + public int getDisplayWidth() { + return getResources().getDisplayMetrics().widthPixels; + } + + public void openURI(String uri) { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); + startActivity(browserIntent); + } + + public String getUserDataPath() { + return Utils.getUserDataDirectory(this).getAbsolutePath(); + } + + 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/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java b/android/app/src/main/java/net/minetest/minetest/MainActivity.java similarity index 77% rename from build/android/app/src/main/java/net/minetest/minetest/MainActivity.java rename to android/app/src/main/java/net/minetest/minetest/MainActivity.java index 2aa50d9ad..b6567b4b7 100644 --- a/build/android/app/src/main/java/net/minetest/minetest/MainActivity.java +++ b/android/app/src/main/java/net/minetest/minetest/MainActivity.java @@ -29,12 +29,14 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; +import android.os.Environment; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.annotation.StringRes; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -43,11 +45,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static net.minetest.minetest.UnzipService.ACTION_FAILURE; -import static net.minetest.minetest.UnzipService.ACTION_PROGRESS; -import static net.minetest.minetest.UnzipService.ACTION_UPDATE; -import static net.minetest.minetest.UnzipService.FAILURE; -import static net.minetest.minetest.UnzipService.SUCCESS; +import static net.minetest.minetest.UnzipService.*; public class MainActivity extends AppCompatActivity { private final static int versionCode = BuildConfig.VERSION_CODE; @@ -56,26 +54,40 @@ public class MainActivity extends AppCompatActivity { new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}; private static final String SETTINGS = "MinetestSettings"; private static final String TAG_VERSION_CODE = "versionCode"; + private ProgressBar mProgressBar; private TextView mTextView; private SharedPreferences sharedPreferences; + private final BroadcastReceiver myReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int progress = 0; - if (intent != null) + @StringRes int message = 0; + if (intent != null) { progress = intent.getIntExtra(ACTION_PROGRESS, 0); - if (progress >= 0) { - if (mProgressBar != null) { - mProgressBar.setVisibility(View.VISIBLE); - mProgressBar.setProgress(progress); - } - mTextView.setVisibility(View.VISIBLE); - } else if (progress == FAILURE) { + message = intent.getIntExtra(ACTION_PROGRESS_MESSAGE, 0); + } + + if (progress == FAILURE) { Toast.makeText(MainActivity.this, intent.getStringExtra(ACTION_FAILURE), Toast.LENGTH_LONG).show(); finish(); - } else if (progress == SUCCESS) + } else if (progress == SUCCESS) { startNative(); + } else { + if (mProgressBar != null) { + mProgressBar.setVisibility(View.VISIBLE); + if (progress == INDETERMINATE) { + mProgressBar.setIndeterminate(true); + } else { + mProgressBar.setIndeterminate(false); + mProgressBar.setProgress(progress); + } + } + mTextView.setVisibility(View.VISIBLE); + if (message != 0) + mTextView.setText(message); + } } }; @@ -88,7 +100,9 @@ public class MainActivity extends AppCompatActivity { mProgressBar = findViewById(R.id.progressBar); mTextView = findViewById(R.id.textView); sharedPreferences = getSharedPreferences(SETTINGS, Context.MODE_PRIVATE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && + Build.VERSION.SDK_INT < Build.VERSION_CODES.R) checkPermission(); else checkAppVersion(); @@ -120,6 +134,7 @@ public class MainActivity extends AppCompatActivity { if (grantResult != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, R.string.not_granted, Toast.LENGTH_LONG).show(); finish(); + return; } } checkAppVersion(); @@ -127,10 +142,27 @@ public class MainActivity extends AppCompatActivity { } private void checkAppVersion() { - if (sharedPreferences.getInt(TAG_VERSION_CODE, 0) == versionCode) + if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + Toast.makeText(this, R.string.no_external_storage, Toast.LENGTH_LONG).show(); + finish(); + return; + } + + if (UnzipService.getIsRunning()) { + mProgressBar.setVisibility(View.VISIBLE); + mProgressBar.setIndeterminate(true); + mTextView.setVisibility(View.VISIBLE); + } else if (sharedPreferences.getInt(TAG_VERSION_CODE, 0) == versionCode && + Utils.isInstallValid(this)) { startNative(); - else - new CopyZipTask(this).execute(getCacheDir() + "/Minetest.zip"); + } else { + mProgressBar.setVisibility(View.VISIBLE); + mProgressBar.setIndeterminate(true); + mTextView.setVisibility(View.VISIBLE); + + Intent intent = new Intent(this, UnzipService.class); + startService(intent); + } } private void startNative() { diff --git a/android/app/src/main/java/net/minetest/minetest/UnzipService.java b/android/app/src/main/java/net/minetest/minetest/UnzipService.java new file mode 100644 index 000000000..a61a49139 --- /dev/null +++ b/android/app/src/main/java/net/minetest/minetest/UnzipService.java @@ -0,0 +1,259 @@ +/* +Minetest +Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik +Copyright (C) 2014-2020 ubulem, Bektur Mambetov + +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. +*/ + +package net.minetest.minetest; + +import android.app.IntentService; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Environment; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.annotation.StringRes; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; + +public class UnzipService extends IntentService { + public static final String ACTION_UPDATE = "net.minetest.minetest.UPDATE"; + public static final String ACTION_PROGRESS = "net.minetest.minetest.PROGRESS"; + public static final String ACTION_PROGRESS_MESSAGE = "net.minetest.minetest.PROGRESS_MESSAGE"; + public static final String ACTION_FAILURE = "net.minetest.minetest.FAILURE"; + public static final int SUCCESS = -1; + public static final int FAILURE = -2; + public static final int INDETERMINATE = -3; + private final int id = 1; + private NotificationManager mNotifyManager; + private boolean isSuccess = true; + private String failureMessage; + + private static boolean isRunning = false; + public static synchronized boolean getIsRunning() { + return isRunning; + } + private static synchronized void setIsRunning(boolean v) { + isRunning = v; + } + + public UnzipService() { + super("net.minetest.minetest.UnzipService"); + } + + @Override + protected void onHandleIntent(Intent intent) { + Notification.Builder notificationBuilder = createNotification(); + final File zipFile = new File(getCacheDir(), "Minetest.zip"); + try { + setIsRunning(true); + File userDataDirectory = Utils.getUserDataDirectory(this); + if (userDataDirectory == null) { + throw new IOException("Unable to find user data directory"); + } + + try (InputStream in = this.getAssets().open(zipFile.getName())) { + try (OutputStream out = new FileOutputStream(zipFile)) { + int readLen; + byte[] readBuffer = new byte[16384]; + while ((readLen = in.read(readBuffer)) != -1) { + out.write(readBuffer, 0, readLen); + } + } + } + + migrate(notificationBuilder, userDataDirectory); + unzip(notificationBuilder, zipFile, userDataDirectory); + } catch (IOException e) { + isSuccess = false; + failureMessage = e.getLocalizedMessage(); + } finally { + setIsRunning(false); + zipFile.delete(); + } + } + + private Notification.Builder createNotification() { + String name = "net.minetest.minetest"; + String channelId = "Minetest channel"; + String description = "notifications from Minetest"; + Notification.Builder builder; + if (mNotifyManager == null) + mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + int importance = NotificationManager.IMPORTANCE_LOW; + NotificationChannel mChannel = null; + if (mNotifyManager != null) + mChannel = mNotifyManager.getNotificationChannel(channelId); + if (mChannel == null) { + mChannel = new NotificationChannel(channelId, name, importance); + mChannel.setDescription(description); + // Configure the notification channel, NO SOUND + mChannel.setSound(null, null); + mChannel.enableLights(false); + mChannel.enableVibration(false); + mNotifyManager.createNotificationChannel(mChannel); + } + builder = new Notification.Builder(this, channelId); + } else { + builder = new Notification.Builder(this); + } + + Intent notificationIntent = new Intent(this, MainActivity.class); + notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP + | Intent.FLAG_ACTIVITY_SINGLE_TOP); + PendingIntent intent = PendingIntent.getActivity(this, 0, + notificationIntent, 0); + + builder.setContentTitle(getString(R.string.notification_title)) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentText(getString(R.string.notification_description)) + .setContentIntent(intent) + .setOngoing(true) + .setProgress(0, 0, true); + + mNotifyManager.notify(id, builder.build()); + return builder; + } + + private void unzip(Notification.Builder notificationBuilder, File zipFile, File userDataDirectory) throws IOException { + int per = 0; + + int size; + try (ZipFile zipSize = new ZipFile(zipFile)) { + size = zipSize.size(); + } + + int readLen; + byte[] readBuffer = new byte[16384]; + try (FileInputStream fileInputStream = new FileInputStream(zipFile); + ZipInputStream zipInputStream = new ZipInputStream(fileInputStream)) { + ZipEntry ze; + while ((ze = zipInputStream.getNextEntry()) != null) { + if (ze.isDirectory()) { + ++per; + Utils.createDirs(userDataDirectory, ze.getName()); + continue; + } + publishProgress(notificationBuilder, R.string.loading, 100 * ++per / size); + try (OutputStream outputStream = new FileOutputStream( + new File(userDataDirectory, ze.getName()))) { + while ((readLen = zipInputStream.read(readBuffer)) != -1) { + outputStream.write(readBuffer, 0, readLen); + } + } + } + } + } + + void moveFileOrDir(@NonNull File src, @NonNull File dst) throws IOException { + try { + Process p = new ProcessBuilder("/system/bin/mv", + src.getAbsolutePath(), dst.getAbsolutePath()).start(); + int exitcode = p.waitFor(); + if (exitcode != 0) + throw new IOException("Move failed with exit code " + exitcode); + } catch (InterruptedException e) { + throw new IOException("Move operation interrupted"); + } + } + + boolean recursivelyDeleteDirectory(@NonNull File loc) { + try { + Process p = new ProcessBuilder("/system/bin/rm", "-rf", + loc.getAbsolutePath()).start(); + return p.waitFor() == 0; + } catch (IOException | InterruptedException e) { + return false; + } + } + + /** + * Migrates user data from deprecated external storage to app scoped storage + */ + private void migrate(Notification.Builder notificationBuilder, File newLocation) throws IOException { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + return; + } + + File oldLocation = new File(Environment.getExternalStorageDirectory(), "Minetest"); + if (!oldLocation.isDirectory()) + return; + + publishProgress(notificationBuilder, R.string.migrating, 0); + newLocation.mkdir(); + + String[] dirs = new String[] { "worlds", "games", "mods", "textures", "client" }; + for (int i = 0; i < dirs.length; i++) { + publishProgress(notificationBuilder, R.string.migrating, 100 * i / dirs.length); + File dir = new File(oldLocation, dirs[i]), dir2 = new File(newLocation, dirs[i]); + if (dir.isDirectory() && !dir2.isDirectory()) { + moveFileOrDir(dir, dir2); + } + } + + for (String filename : new String[] { "minetest.conf" }) { + File file = new File(oldLocation, filename), file2 = new File(newLocation, filename); + if (file.isFile() && !file2.isFile()) { + moveFileOrDir(file, file2); + } + } + + recursivelyDeleteDirectory(oldLocation); + } + + private void publishProgress(@Nullable Notification.Builder notificationBuilder, @StringRes int message, int progress) { + Intent intentUpdate = new Intent(ACTION_UPDATE); + intentUpdate.putExtra(ACTION_PROGRESS, progress); + intentUpdate.putExtra(ACTION_PROGRESS_MESSAGE, message); + if (!isSuccess) + intentUpdate.putExtra(ACTION_FAILURE, failureMessage); + sendBroadcast(intentUpdate); + + if (notificationBuilder != null) { + notificationBuilder.setContentText(getString(message)); + if (progress == INDETERMINATE) { + notificationBuilder.setProgress(100, 50, true); + } else { + notificationBuilder.setProgress(100, progress, false); + } + mNotifyManager.notify(id, notificationBuilder.build()); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + mNotifyManager.cancel(id); + publishProgress(null, R.string.loading, isSuccess ? SUCCESS : FAILURE); + } +} diff --git a/android/app/src/main/java/net/minetest/minetest/Utils.java b/android/app/src/main/java/net/minetest/minetest/Utils.java new file mode 100644 index 000000000..b2553c844 --- /dev/null +++ b/android/app/src/main/java/net/minetest/minetest/Utils.java @@ -0,0 +1,39 @@ +package net.minetest.minetest; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import java.io.File; + +public class Utils { + public static @NonNull File createDirs(File root, String dir) { + File f = new File(root, dir); + if (!f.isDirectory()) + f.mkdirs(); + + return f; + } + + public static @Nullable File getUserDataDirectory(Context context) { + File extDir = context.getExternalFilesDir(null); + if (extDir == null) { + return null; + } + + return createDirs(extDir, "Minetest"); + } + + public static @Nullable File getCacheDirectory(Context context) { + return context.getCacheDir(); + } + + public static boolean isInstallValid(Context context) { + File userDataDirectory = getUserDataDirectory(context); + return userDataDirectory != null && userDataDirectory.isDirectory() && + new File(userDataDirectory, "games").isDirectory() && + new File(userDataDirectory, "builtin").isDirectory() && + new File(userDataDirectory, "client").isDirectory() && + new File(userDataDirectory, "textures").isDirectory(); + } +} diff --git a/build/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png similarity index 100% rename from build/android/app/src/main/res/drawable/background.png rename to android/app/src/main/res/drawable/background.png diff --git a/build/android/app/src/main/res/drawable/bg.xml b/android/app/src/main/res/drawable/bg.xml similarity index 100% rename from build/android/app/src/main/res/drawable/bg.xml rename to android/app/src/main/res/drawable/bg.xml diff --git a/build/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml similarity index 83% rename from build/android/app/src/main/res/layout/activity_main.xml rename to android/app/src/main/res/layout/activity_main.xml index e6f461f14..93508c3cb 100644 --- a/build/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -1,4 +1,5 @@ + android:visibility="gone" + tools:visibility="visible" /> + android:visibility="gone" + tools:visibility="visible" /> diff --git a/build/android/app/src/main/res/mipmap/ic_launcher.png b/android/app/src/main/res/mipmap/ic_launcher.png similarity index 100% rename from build/android/app/src/main/res/mipmap/ic_launcher.png rename to android/app/src/main/res/mipmap/ic_launcher.png diff --git a/build/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml similarity index 53% rename from build/android/app/src/main/res/values/strings.xml rename to android/app/src/main/res/values/strings.xml index a6fba70d5..99f948c99 100644 --- a/build/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -3,8 +3,11 @@ Minetest Loading… + Migrating save data from old install… (this may take a while) Required permission wasn\'t granted, Minetest can\'t run without it Loading Minetest Less than 1 minute… + Done + External storage isn\'t available. If you use an SDCard, please reinsert it. Otherwise, try restarting your phone or contacting the Minetest developers diff --git a/build/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml similarity index 57% rename from build/android/app/src/main/res/values/styles.xml rename to android/app/src/main/res/values/styles.xml index 618507e63..291a4eaf1 100644 --- a/build/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -8,15 +8,8 @@ shortEdges - - - 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 @@ + + + diff --git a/build/android/build.gradle b/android/build.gradle similarity index 66% rename from build/android/build.gradle rename to android/build.gradle index 8707b563c..8f3b90e7f 100644 --- a/build/android/build.gradle +++ b/android/build.gradle @@ -1,22 +1,24 @@ // 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", 3) // Version Minor +project.ext.set("versionMinor", 7) // Version Minor project.ext.set("versionPatch", 0) // Version Patch project.ext.set("versionExtra", "-dev") // Version Extra -project.ext.set("versionCode", 30) // Android Version Code +project.ext.set("versionCode", 40) // Android Version Code +project.ext.set("developmentBuild", 1) // 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.2.8568313' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' - classpath 'org.ajoberstar.grgit:grgit-gradle:4.0.2' + classpath 'com.android.tools.build:gradle:7.0.3' + classpath 'de.undercouch:gradle-download-task:4.1.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -31,4 +33,5 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir + delete 'native/deps' } diff --git a/build/android/gradle.properties b/android/gradle.properties similarity index 100% rename from build/android/gradle.properties rename to android/gradle.properties diff --git a/build/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from build/android/gradle/wrapper/gradle-wrapper.jar rename to android/gradle/wrapper/gradle-wrapper.jar diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..8ad73a75c --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip diff --git a/build/android/gradlew b/android/gradlew similarity index 98% rename from build/android/gradlew rename to android/gradlew index 83f2acfdc..25e0c1148 100755 --- a/build/android/gradlew +++ b/android/gradlew @@ -98,7 +98,7 @@ location of your Java installation." fi else JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + command -v java >/dev/null || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." diff --git a/build/android/gradlew.bat b/android/gradlew.bat similarity index 100% rename from build/android/gradlew.bat rename to android/gradlew.bat diff --git a/android/icons/aux1_btn.svg b/android/icons/aux1_btn.svg new file mode 100644 index 000000000..e0ee97c0c --- /dev/null +++ b/android/icons/aux1_btn.svg @@ -0,0 +1,143 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + Aux1 + + + diff --git a/build/android/icons/camera_btn.svg b/android/icons/camera_btn.svg similarity index 100% rename from build/android/icons/camera_btn.svg rename to android/icons/camera_btn.svg diff --git a/build/android/icons/chat_btn.svg b/android/icons/chat_btn.svg similarity index 100% rename from build/android/icons/chat_btn.svg rename to android/icons/chat_btn.svg diff --git a/build/android/icons/chat_hide_btn.svg b/android/icons/chat_hide_btn.svg similarity index 100% rename from build/android/icons/chat_hide_btn.svg rename to android/icons/chat_hide_btn.svg diff --git a/build/android/icons/chat_show_btn.svg b/android/icons/chat_show_btn.svg similarity index 100% rename from build/android/icons/chat_show_btn.svg rename to android/icons/chat_show_btn.svg diff --git a/build/android/icons/checkbox_tick.svg b/android/icons/checkbox_tick.svg similarity index 100% rename from build/android/icons/checkbox_tick.svg rename to android/icons/checkbox_tick.svg diff --git a/build/android/icons/debug_btn.svg b/android/icons/debug_btn.svg similarity index 100% rename from build/android/icons/debug_btn.svg rename to android/icons/debug_btn.svg diff --git a/build/android/icons/down.svg b/android/icons/down.svg similarity index 100% rename from build/android/icons/down.svg rename to android/icons/down.svg diff --git a/build/android/icons/drop_btn.svg b/android/icons/drop_btn.svg similarity index 100% rename from build/android/icons/drop_btn.svg rename to android/icons/drop_btn.svg diff --git a/build/android/icons/fast_btn.svg b/android/icons/fast_btn.svg similarity index 100% rename from build/android/icons/fast_btn.svg rename to android/icons/fast_btn.svg diff --git a/build/android/icons/fly_btn.svg b/android/icons/fly_btn.svg similarity index 100% rename from build/android/icons/fly_btn.svg rename to android/icons/fly_btn.svg diff --git a/build/android/icons/gear_icon.svg b/android/icons/gear_icon.svg similarity index 100% rename from build/android/icons/gear_icon.svg rename to android/icons/gear_icon.svg diff --git a/build/android/icons/inventory_btn.svg b/android/icons/inventory_btn.svg similarity index 100% rename from build/android/icons/inventory_btn.svg rename to android/icons/inventory_btn.svg diff --git a/build/android/icons/joystick_bg.svg b/android/icons/joystick_bg.svg similarity index 100% rename from build/android/icons/joystick_bg.svg rename to android/icons/joystick_bg.svg diff --git a/build/android/icons/joystick_center.svg b/android/icons/joystick_center.svg similarity index 100% rename from build/android/icons/joystick_center.svg rename to android/icons/joystick_center.svg diff --git a/build/android/icons/joystick_off.svg b/android/icons/joystick_off.svg similarity index 100% rename from build/android/icons/joystick_off.svg rename to android/icons/joystick_off.svg diff --git a/build/android/icons/jump_btn.svg b/android/icons/jump_btn.svg similarity index 100% rename from build/android/icons/jump_btn.svg rename to android/icons/jump_btn.svg diff --git a/build/android/icons/minimap_btn.svg b/android/icons/minimap_btn.svg similarity index 100% rename from build/android/icons/minimap_btn.svg rename to android/icons/minimap_btn.svg diff --git a/build/android/icons/noclip_btn.svg b/android/icons/noclip_btn.svg similarity index 100% rename from build/android/icons/noclip_btn.svg rename to android/icons/noclip_btn.svg diff --git a/build/android/icons/rangeview_btn.svg b/android/icons/rangeview_btn.svg similarity index 100% rename from build/android/icons/rangeview_btn.svg rename to android/icons/rangeview_btn.svg diff --git a/build/android/icons/rare_controls.svg b/android/icons/rare_controls.svg similarity index 100% rename from build/android/icons/rare_controls.svg rename to android/icons/rare_controls.svg diff --git a/build/android/icons/zoom.svg b/android/icons/zoom.svg similarity index 100% rename from build/android/icons/zoom.svg rename to android/icons/zoom.svg diff --git a/build/android/keystore-minetest.jks b/android/keystore-minetest.jks similarity index 100% rename from build/android/keystore-minetest.jks rename to android/keystore-minetest.jks diff --git a/android/native/build.gradle b/android/native/build.gradle new file mode 100644 index 000000000..2254aab3a --- /dev/null +++ b/android/native/build.gradle @@ -0,0 +1,69 @@ +apply plugin: 'com.android.library' +apply plugin: 'de.undercouch.download' + +android { + compileSdkVersion 30 + buildToolsVersion '30.0.3' + ndkVersion "$ndk_version" + defaultConfig { + minSdkVersion 16 + targetSdkVersion 30 + externalNativeBuild { + ndkBuild { + arguments '-j' + Runtime.getRuntime().availableProcessors(), + "versionMajor=${versionMajor}", + "versionMinor=${versionMinor}", + "versionPatch=${versionPatch}", + "versionExtra=${versionExtra}", + "developmentBuild=${developmentBuild}" + } + } + } + + externalNativeBuild { + ndkBuild { + path file('jni/Android.mk') + } + } + + // supported architectures + splits { + abi { + enable true + reset() + include 'armeabi-v7a', 'arm64-v8a'//, 'x86' + } + } + + buildTypes { + release { + externalNativeBuild { + ndkBuild { + arguments 'NDEBUG=1' + } + } + + ndk { + debugSymbolLevel 'SYMBOL_TABLE' + } + } + } +} + +// get precompiled deps +task downloadDeps(type: Download) { + src 'https://github.com/minetest/minetest_android_deps/releases/download/latest/deps.zip' + dest new File(buildDir, 'deps.zip') + overwrite false +} + +task getDeps(dependsOn: downloadDeps, type: Copy) { + def deps = new File(buildDir.parent, 'deps') + if (!deps.exists()) { + deps.mkdir() + from zipTree(downloadDeps.dest) + into deps + } +} + +preBuild.dependsOn getDeps diff --git a/android/native/jni/Android.mk b/android/native/jni/Android.mk new file mode 100644 index 000000000..50651d5ba --- /dev/null +++ b/android/native/jni/Android.mk @@ -0,0 +1,291 @@ +LOCAL_PATH := $(call my-dir)/.. + +#LOCAL_ADDRESS_SANITIZER:=true +#USE_BUILTIN_LUA:=true + +include $(CLEAR_VARS) +LOCAL_MODULE := Curl +LOCAL_SRC_FILES := deps/$(APP_ABI)/Curl/libcurl.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libmbedcrypto +LOCAL_SRC_FILES := deps/$(APP_ABI)/Curl/libmbedcrypto.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libmbedtls +LOCAL_SRC_FILES := deps/$(APP_ABI)/Curl/libmbedtls.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libmbedx509 +LOCAL_SRC_FILES := deps/$(APP_ABI)/Curl/libmbedx509.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := Freetype +LOCAL_SRC_FILES := deps/$(APP_ABI)/Freetype/libfreetype.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := Iconv +LOCAL_SRC_FILES := deps/$(APP_ABI)/Iconv/libiconv.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libcharset +LOCAL_SRC_FILES := deps/$(APP_ABI)/Iconv/libcharset.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +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 +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := Gettext +LOCAL_SRC_FILES := deps/$(APP_ABI)/Gettext/libintl.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := SQLite3 +LOCAL_SRC_FILES := deps/$(APP_ABI)/SQLite/libsqlite3.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := Vorbis +LOCAL_SRC_FILES := deps/$(APP_ABI)/Vorbis/libvorbis.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libvorbisfile +LOCAL_SRC_FILES := deps/$(APP_ABI)/Vorbis/libvorbisfile.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libogg +LOCAL_SRC_FILES := deps/$(APP_ABI)/Vorbis/libogg.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := Zstd +LOCAL_SRC_FILES := deps/$(APP_ABI)/Zstd/libzstd.a +include $(PREBUILT_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := Minetest + +LOCAL_CFLAGS += \ + -DJSONCPP_NO_LOCALE_SUPPORT \ + -DHAVE_TOUCHSCREENGUI \ + -DENABLE_GLES=1 \ + -DUSE_CURL=1 \ + -DUSE_SOUND=1 \ + -DUSE_LEVELDB=0 \ + -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 + +ifdef GPROF + GPROF_DEF := -DGPROF + PROFILER_LIBS := android-ndk-profiler + LOCAL_CFLAGS += -pg +endif + +LOCAL_C_INCLUDES := \ + ../../src \ + ../../src/script \ + ../../lib/gmp \ + ../../lib/jsoncpp \ + deps/$(APP_ABI)/Curl/include \ + deps/$(APP_ABI)/Freetype/include/freetype2 \ + deps/$(APP_ABI)/Irrlicht/include \ + deps/$(APP_ABI)/Gettext/include \ + deps/$(APP_ABI)/Iconv/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) \ + $(wildcard ../../src/content/*.cpp) \ + ../../src/database/database.cpp \ + ../../src/database/database-dummy.cpp \ + ../../src/database/database-files.cpp \ + ../../src/database/database-sqlite3.cpp \ + $(wildcard ../../src/gui/*.cpp) \ + $(wildcard ../../src/irrlicht_changes/*.cpp) \ + $(wildcard ../../src/mapgen/*.cpp) \ + $(wildcard ../../src/network/*.cpp) \ + $(wildcard ../../src/script/*.cpp) \ + $(wildcard ../../src/script/*/*.cpp) \ + $(wildcard ../../src/server/*.cpp) \ + $(wildcard ../../src/threading/*.cpp) \ + $(wildcard ../../src/util/*.c) \ + $(wildcard ../../src/util/*.cpp) \ + ../../src/ban.cpp \ + ../../src/chat.cpp \ + ../../src/clientiface.cpp \ + ../../src/collision.cpp \ + ../../src/content_mapnode.cpp \ + ../../src/content_nodemeta.cpp \ + ../../src/convert_json.cpp \ + ../../src/craftdef.cpp \ + ../../src/debug.cpp \ + ../../src/defaultsettings.cpp \ + ../../src/emerge.cpp \ + ../../src/environment.cpp \ + ../../src/face_position_cache.cpp \ + ../../src/filesys.cpp \ + ../../src/gettext.cpp \ + ../../src/httpfetch.cpp \ + ../../src/hud.cpp \ + ../../src/inventory.cpp \ + ../../src/inventorymanager.cpp \ + ../../src/itemdef.cpp \ + ../../src/itemstackmetadata.cpp \ + ../../src/light.cpp \ + ../../src/log.cpp \ + ../../src/main.cpp \ + ../../src/map.cpp \ + ../../src/map_settings_manager.cpp \ + ../../src/mapblock.cpp \ + ../../src/mapnode.cpp \ + ../../src/mapsector.cpp \ + ../../src/metadata.cpp \ + ../../src/modchannels.cpp \ + ../../src/nameidmapping.cpp \ + ../../src/nodedef.cpp \ + ../../src/nodemetadata.cpp \ + ../../src/nodetimer.cpp \ + ../../src/noise.cpp \ + ../../src/objdef.cpp \ + ../../src/object_properties.cpp \ + ../../src/particles.cpp \ + ../../src/pathfinder.cpp \ + ../../src/player.cpp \ + ../../src/porting.cpp \ + ../../src/porting_android.cpp \ + ../../src/profiler.cpp \ + ../../src/raycast.cpp \ + ../../src/reflowscan.cpp \ + ../../src/remoteplayer.cpp \ + ../../src/rollback.cpp \ + ../../src/rollback_interface.cpp \ + ../../src/serialization.cpp \ + ../../src/server.cpp \ + ../../src/serverenvironment.cpp \ + ../../src/serverlist.cpp \ + ../../src/settings.cpp \ + ../../src/staticobject.cpp \ + ../../src/texture_override.cpp \ + ../../src/tileanimation.cpp \ + ../../src/tool.cpp \ + ../../src/translation.cpp \ + ../../src/version.cpp \ + ../../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 + +# JSONCPP +LOCAL_SRC_FILES += ../../lib/jsoncpp/jsoncpp.cpp + +LOCAL_STATIC_LIBRARIES += \ + Curl libmbedcrypto libmbedtls libmbedx509 \ + Freetype \ + Iconv libcharset \ + Irrlicht \ + 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 + +include $(BUILD_SHARED_LIBRARY) + +ifdef GPROF +$(call import-module,android-ndk-profiler) +endif +$(call import-module,android/native_app_glue) diff --git a/android/native/jni/Application.mk b/android/native/jni/Application.mk new file mode 100644 index 000000000..9d9596137 --- /dev/null +++ b/android/native/jni/Application.mk @@ -0,0 +1,32 @@ +APP_PLATFORM := ${APP_PLATFORM} +APP_ABI := ${TARGET_ABI} +APP_STL := c++_shared +NDK_TOOLCHAIN_VERSION := clang +APP_SHORT_COMMANDS := true +APP_MODULES := Minetest + +APP_CPPFLAGS := -O2 -fvisibility=hidden + +ifeq ($(APP_ABI),armeabi-v7a) +APP_CPPFLAGS += -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb +endif + +ifeq ($(APP_ABI),x86) +APP_CPPFLAGS += -mssse3 -mfpmath=sse -funroll-loops +endif + +ifndef NDEBUG +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++14 +APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe + +ifeq ($(APP_ABI),arm64-v8a) +APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections +endif + +ifndef NDEBUG +APP_LDFLAGS := +endif diff --git a/build/android/native/src/main/AndroidManifest.xml b/android/native/src/main/AndroidManifest.xml similarity index 100% rename from build/android/native/src/main/AndroidManifest.xml rename to android/native/src/main/AndroidManifest.xml diff --git a/build/android/settings.gradle b/android/settings.gradle similarity index 100% rename from build/android/settings.gradle rename to android/settings.gradle diff --git a/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java b/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java deleted file mode 100644 index 6d4b6ab0f..000000000 --- a/build/android/app/src/main/java/net/minetest/minetest/CopyZipTask.java +++ /dev/null @@ -1,82 +0,0 @@ -/* -Minetest -Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik -Copyright (C) 2014-2020 ubulem, Bektur Mambetov - -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. -*/ - -package net.minetest.minetest; - -import android.content.Intent; -import android.os.AsyncTask; -import android.widget.Toast; - -import androidx.appcompat.app.AppCompatActivity; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.ref.WeakReference; - -public class CopyZipTask extends AsyncTask { - - private final WeakReference activityRef; - - CopyZipTask(AppCompatActivity activity) { - activityRef = new WeakReference<>(activity); - } - - protected String doInBackground(String... params) { - copyAsset(params[0]); - return params[0]; - } - - @Override - protected void onPostExecute(String result) { - startUnzipService(result); - } - - private void copyAsset(String zipName) { - String filename = zipName.substring(zipName.lastIndexOf("/") + 1); - try (InputStream in = activityRef.get().getAssets().open(filename); - OutputStream out = new FileOutputStream(zipName)) { - copyFile(in, out); - } catch (IOException e) { - AppCompatActivity activity = activityRef.get(); - if (activity != null) { - activity.runOnUiThread(() -> Toast.makeText(activityRef.get(), e.getLocalizedMessage(), Toast.LENGTH_LONG).show()); - } - cancel(true); - } - } - - private void copyFile(InputStream in, OutputStream out) throws IOException { - byte[] buffer = new byte[1024]; - int read; - while ((read = in.read(buffer)) != -1) - out.write(buffer, 0, read); - } - - private void startUnzipService(String file) { - Intent intent = new Intent(activityRef.get(), UnzipService.class); - intent.putExtra(UnzipService.EXTRA_KEY_IN_FILE, file); - AppCompatActivity activity = activityRef.get(); - if (activity != null) { - activity.startService(intent); - } - } -} diff --git a/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java b/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java deleted file mode 100644 index 635512569..000000000 --- a/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java +++ /dev/null @@ -1,126 +0,0 @@ -/* -Minetest -Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik -Copyright (C) 2014-2020 ubulem, Bektur Mambetov - -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. -*/ - -package net.minetest.minetest; - -import android.app.NativeActivity; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.view.View; -import android.view.WindowManager; - -public class GameActivity extends NativeActivity { - static { - System.loadLibrary("c++_shared"); - System.loadLibrary("Minetest"); - } - - private int messageReturnCode; - private String messageReturnValue; - - public static native void putMessageBoxResult(String text); - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - messageReturnCode = -1; - messageReturnValue = ""; - } - - private void makeFullScreen() { - if (Build.VERSION.SDK_INT >= 19) - this.getWindow().getDecorView().setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); - } - - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - if (hasFocus) - makeFullScreen(); - } - - @Override - protected void onResume() { - super.onResume(); - makeFullScreen(); - } - - @Override - public void onBackPressed() { - // Ignore the back press so Minetest can handle it - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == 101) { - if (resultCode == RESULT_OK) { - String text = data.getStringExtra("text"); - messageReturnCode = 0; - messageReturnValue = text; - } else - messageReturnCode = 1; - } - } - - public void showDialog(String acceptButton, String hint, String current, int editType) { - Intent intent = new Intent(this, InputDialogActivity.class); - Bundle params = new Bundle(); - params.putString("acceptButton", acceptButton); - params.putString("hint", hint); - params.putString("current", current); - params.putInt("editType", editType); - intent.putExtras(params); - startActivityForResult(intent, 101); - messageReturnValue = ""; - messageReturnCode = -1; - } - - public int getDialogState() { - return messageReturnCode; - } - - public String getDialogValue() { - messageReturnCode = -1; - return messageReturnValue; - } - - public float getDensity() { - return getResources().getDisplayMetrics().density; - } - - public int getDisplayHeight() { - return getResources().getDisplayMetrics().heightPixels; - } - - public int getDisplayWidth() { - return getResources().getDisplayMetrics().widthPixels; - } - - public void openURL(String url) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - startActivity(browserIntent); - } -} diff --git a/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java b/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java deleted file mode 100644 index 7c6aa111d..000000000 --- a/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java +++ /dev/null @@ -1,98 +0,0 @@ -/* -Minetest -Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik -Copyright (C) 2014-2020 ubulem, Bektur Mambetov - -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. -*/ - -package net.minetest.minetest; - -import android.app.Activity; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.text.InputType; -import android.view.KeyEvent; -import android.view.View; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; - -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; - -import java.util.Objects; - -public class InputDialogActivity extends AppCompatActivity { - private AlertDialog alertDialog; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Bundle b = getIntent().getExtras(); - int editType = Objects.requireNonNull(b).getInt("editType"); - String hint = b.getString("hint"); - String current = b.getString("current"); - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - EditText editText = new EditText(this); - builder.setView(editText); - editText.requestFocus(); - editText.setHint(hint); - editText.setText(current); - final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); - Objects.requireNonNull(imm).toggleSoftInput(InputMethodManager.SHOW_FORCED, - InputMethodManager.HIDE_IMPLICIT_ONLY); - if (editType == 3) - editText.setInputType(InputType.TYPE_CLASS_TEXT | - InputType.TYPE_TEXT_VARIATION_PASSWORD); - else - editText.setInputType(InputType.TYPE_CLASS_TEXT); - editText.setOnKeyListener((view, KeyCode, event) -> { - if (KeyCode == KeyEvent.KEYCODE_ENTER) { - imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); - pushResult(editText.getText().toString()); - return true; - } - return false; - }); - alertDialog = builder.create(); - if (!this.isFinishing()) - alertDialog.show(); - alertDialog.setOnCancelListener(dialog -> { - pushResult(editText.getText().toString()); - setResult(Activity.RESULT_CANCELED); - alertDialog.dismiss(); - makeFullScreen(); - finish(); - }); - } - - private void pushResult(String text) { - Intent resultData = new Intent(); - resultData.putExtra("text", text); - setResult(AppCompatActivity.RESULT_OK, resultData); - alertDialog.dismiss(); - makeFullScreen(); - finish(); - } - - private void makeFullScreen() { - if (Build.VERSION.SDK_INT >= 19) - this.getWindow().getDecorView().setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); - } -} diff --git a/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java b/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java deleted file mode 100644 index b69f7f36e..000000000 --- a/build/android/app/src/main/java/net/minetest/minetest/UnzipService.java +++ /dev/null @@ -1,157 +0,0 @@ -/* -Minetest -Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik -Copyright (C) 2014-2020 ubulem, Bektur Mambetov - -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. -*/ - -package net.minetest.minetest; - -import android.app.IntentService; -import android.app.Notification; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.content.Context; -import android.content.Intent; -import android.os.Build; -import android.os.Environment; -import android.widget.Toast; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.zip.ZipInputStream; - -public class UnzipService extends IntentService { - public static final String ACTION_UPDATE = "net.minetest.minetest.UPDATE"; - public static final String ACTION_PROGRESS = "net.minetest.minetest.PROGRESS"; - public static final String ACTION_FAILURE = "net.minetest.minetest.FAILURE"; - public static final String EXTRA_KEY_IN_FILE = "file"; - public static final int SUCCESS = -1; - public static final int FAILURE = -2; - private final int id = 1; - private NotificationManager mNotifyManager; - private boolean isSuccess = true; - private String failureMessage; - - public UnzipService() { - super("net.minetest.minetest.UnzipService"); - } - - private void isDir(String dir, String location) { - File f = new File(location, dir); - if (!f.isDirectory()) - f.mkdirs(); - } - - @Override - protected void onHandleIntent(Intent intent) { - createNotification(); - unzip(intent); - } - - private void createNotification() { - String name = "net.minetest.minetest"; - String channelId = "Minetest channel"; - String description = "notifications from Minetest"; - Notification.Builder builder; - if (mNotifyManager == null) - mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - int importance = NotificationManager.IMPORTANCE_LOW; - NotificationChannel mChannel = null; - if (mNotifyManager != null) - mChannel = mNotifyManager.getNotificationChannel(channelId); - if (mChannel == null) { - mChannel = new NotificationChannel(channelId, name, importance); - mChannel.setDescription(description); - // Configure the notification channel, NO SOUND - mChannel.setSound(null, null); - mChannel.enableLights(false); - mChannel.enableVibration(false); - mNotifyManager.createNotificationChannel(mChannel); - } - builder = new Notification.Builder(this, channelId); - } else { - builder = new Notification.Builder(this); - } - builder.setContentTitle(getString(R.string.notification_title)) - .setSmallIcon(R.mipmap.ic_launcher) - .setContentText(getString(R.string.notification_description)); - mNotifyManager.notify(id, builder.build()); - } - - private void unzip(Intent intent) { - String zip = intent.getStringExtra(EXTRA_KEY_IN_FILE); - isDir("Minetest", Environment.getExternalStorageDirectory().toString()); - String location = Environment.getExternalStorageDirectory() + File.separator + "Minetest" + File.separator; - int per = 0; - int size = getSummarySize(zip); - File zipFile = new File(zip); - int readLen; - byte[] readBuffer = new byte[8192]; - try (FileInputStream fileInputStream = new FileInputStream(zipFile); - ZipInputStream zipInputStream = new ZipInputStream(fileInputStream)) { - ZipEntry ze; - while ((ze = zipInputStream.getNextEntry()) != null) { - if (ze.isDirectory()) { - ++per; - isDir(ze.getName(), location); - } else { - publishProgress(100 * ++per / size); - try (OutputStream outputStream = new FileOutputStream(location + ze.getName())) { - while ((readLen = zipInputStream.read(readBuffer)) != -1) { - outputStream.write(readBuffer, 0, readLen); - } - } - } - zipFile.delete(); - } - } catch (IOException e) { - isSuccess = false; - failureMessage = e.getLocalizedMessage(); - } - } - - private void publishProgress(int progress) { - Intent intentUpdate = new Intent(ACTION_UPDATE); - intentUpdate.putExtra(ACTION_PROGRESS, progress); - if (!isSuccess) intentUpdate.putExtra(ACTION_FAILURE, failureMessage); - sendBroadcast(intentUpdate); - } - - private int getSummarySize(String zip) { - int size = 0; - try { - ZipFile zipSize = new ZipFile(zip); - size += zipSize.size(); - } catch (IOException e) { - Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); - } - return size; - } - - @Override - public void onDestroy() { - super.onDestroy(); - mNotifyManager.cancel(id); - publishProgress(isSuccess ? SUCCESS : FAILURE); - } -} diff --git a/build/android/gradle/wrapper/gradle-wrapper.properties b/build/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index d612cf333..000000000 --- a/build/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Apr 06 00:06:16 CEST 2020 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip diff --git a/build/android/icons/aux_btn.svg b/build/android/icons/aux_btn.svg deleted file mode 100644 index 6bbefff67..000000000 --- a/build/android/icons/aux_btn.svg +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - AUX - - diff --git a/build/android/native/build.gradle b/build/android/native/build.gradle deleted file mode 100644 index cbd50db6a..000000000 --- a/build/android/native/build.gradle +++ /dev/null @@ -1,59 +0,0 @@ -apply plugin: 'com.android.library' -import org.ajoberstar.grgit.Grgit - -android { - compileSdkVersion 29 - buildToolsVersion '29.0.3' - ndkVersion '21.1.6352462' - defaultConfig { - minSdkVersion 16 - targetSdkVersion 29 - externalNativeBuild { - ndkBuild { - arguments '-j8', - "versionMajor=${versionMajor}", - "versionMinor=${versionMinor}", - "versionPatch=${versionPatch}", - "versionExtra=${versionExtra}" - } - } - } - - externalNativeBuild { - ndkBuild { - path file('jni/Android.mk') - } - } - - // supported architectures - splits { - abi { - enable true - reset() - include 'armeabi-v7a', 'arm64-v8a'//, 'x86' - } - } - - buildTypes { - release { - externalNativeBuild { - ndkBuild { - arguments 'NDEBUG=1' - } - } - } - } -} - -task cloneGitRepo() { - def destination = file('deps') - if(!destination.exists()) { - def grgit = Grgit.clone( - dir: destination, - uri: 'https://github.com/minetest/minetest_android_deps_binaries' - ) - grgit.close() - } -} - -preBuild.dependsOn cloneGitRepo diff --git a/build/android/native/jni/Android.mk b/build/android/native/jni/Android.mk deleted file mode 100644 index 140947e6a..000000000 --- a/build/android/native/jni/Android.mk +++ /dev/null @@ -1,219 +0,0 @@ -LOCAL_PATH := $(call my-dir)/.. - -#LOCAL_ADDRESS_SANITIZER:=true - -include $(CLEAR_VARS) -LOCAL_MODULE := Curl -LOCAL_SRC_FILES := deps/Android/Curl/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libcurl.a -include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := Freetype -LOCAL_SRC_FILES := deps/Android/Freetype/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libfreetype.a -include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := Irrlicht -LOCAL_SRC_FILES := deps/Android/Irrlicht/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libIrrlicht.a -include $(PREBUILT_STATIC_LIBRARY) - -#include $(CLEAR_VARS) -#LOCAL_MODULE := LevelDB -#LOCAL_SRC_FILES := deps/Android/LevelDB/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libleveldb.a -#include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := LuaJIT -LOCAL_SRC_FILES := deps/Android/LuaJIT/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libluajit.a -include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := mbedTLS -LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedtls.a -include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := mbedx509 -LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedx509.a -include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := mbedcrypto -LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedcrypto.a -include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := OpenAL -LOCAL_SRC_FILES := deps/Android/OpenAL-Soft/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libopenal.a -include $(PREBUILT_STATIC_LIBRARY) - -# You can use `OpenSSL and Crypto` instead `mbedTLS mbedx509 mbedcrypto`, -#but it increase APK size on ~0.7MB -#include $(CLEAR_VARS) -#LOCAL_MODULE := OpenSSL -#LOCAL_SRC_FILES := deps/Android/OpenSSL/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libssl.a -#include $(PREBUILT_STATIC_LIBRARY) - -#include $(CLEAR_VARS) -#LOCAL_MODULE := Crypto -#LOCAL_SRC_FILES := deps/Android/OpenSSL/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libcrypto.a -#include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := Vorbis -LOCAL_SRC_FILES := deps/Android/Vorbis/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libvorbis.a -include $(PREBUILT_STATIC_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := Minetest - -LOCAL_CFLAGS += \ - -DJSONCPP_NO_LOCALE_SUPPORT \ - -DHAVE_TOUCHSCREENGUI \ - -DENABLE_GLES=1 \ - -DUSE_CURL=1 \ - -DUSE_SOUND=1 \ - -DUSE_FREETYPE=1 \ - -DUSE_LEVELDB=0 \ - -DUSE_LUAJIT=1 \ - -DVERSION_MAJOR=${versionMajor} \ - -DVERSION_MINOR=${versionMinor} \ - -DVERSION_PATCH=${versionPatch} \ - -DVERSION_EXTRA=${versionExtra} \ - $(GPROF_DEF) - -ifdef NDEBUG - LOCAL_CFLAGS += -DNDEBUG=1 -endif - -ifdef GPROF - GPROF_DEF := -DGPROF - PROFILER_LIBS := android-ndk-profiler - LOCAL_CFLAGS += -pg -endif - -LOCAL_C_INCLUDES := \ - ../../../src \ - ../../../src/script \ - ../../../lib/gmp \ - ../../../lib/jsoncpp \ - deps/Android/Curl/include \ - deps/Android/Freetype/include \ - deps/Android/Irrlicht/include \ - deps/Android/LevelDB/include \ - deps/Android/libiconv/include \ - deps/Android/libiconv/libcharset/include \ - deps/Android/LuaJIT/src \ - deps/Android/OpenAL-Soft/include \ - deps/Android/sqlite \ - deps/Android/Vorbis/include - -LOCAL_SRC_FILES := \ - $(wildcard ../../../src/client/*.cpp) \ - $(wildcard ../../../src/client/*/*.cpp) \ - $(wildcard ../../../src/content/*.cpp) \ - ../../../src/database/database.cpp \ - ../../../src/database/database-dummy.cpp \ - ../../../src/database/database-files.cpp \ - ../../../src/database/database-sqlite3.cpp \ - $(wildcard ../../../src/gui/*.cpp) \ - $(wildcard ../../../src/irrlicht_changes/*.cpp) \ - $(wildcard ../../../src/mapgen/*.cpp) \ - $(wildcard ../../../src/network/*.cpp) \ - $(wildcard ../../../src/script/*.cpp) \ - $(wildcard ../../../src/script/*/*.cpp) \ - $(wildcard ../../../src/server/*.cpp) \ - $(wildcard ../../../src/threading/*.cpp) \ - $(wildcard ../../../src/util/*.c) \ - $(wildcard ../../../src/util/*.cpp) \ - ../../../src/ban.cpp \ - ../../../src/chat.cpp \ - ../../../src/clientiface.cpp \ - ../../../src/collision.cpp \ - ../../../src/content_mapnode.cpp \ - ../../../src/content_nodemeta.cpp \ - ../../../src/convert_json.cpp \ - ../../../src/craftdef.cpp \ - ../../../src/debug.cpp \ - ../../../src/defaultsettings.cpp \ - ../../../src/emerge.cpp \ - ../../../src/environment.cpp \ - ../../../src/face_position_cache.cpp \ - ../../../src/filesys.cpp \ - ../../../src/gettext.cpp \ - ../../../src/httpfetch.cpp \ - ../../../src/hud.cpp \ - ../../../src/inventory.cpp \ - ../../../src/inventorymanager.cpp \ - ../../../src/itemdef.cpp \ - ../../../src/itemstackmetadata.cpp \ - ../../../src/light.cpp \ - ../../../src/log.cpp \ - ../../../src/main.cpp \ - ../../../src/map.cpp \ - ../../../src/map_settings_manager.cpp \ - ../../../src/mapblock.cpp \ - ../../../src/mapnode.cpp \ - ../../../src/mapsector.cpp \ - ../../../src/metadata.cpp \ - ../../../src/modchannels.cpp \ - ../../../src/nameidmapping.cpp \ - ../../../src/nodedef.cpp \ - ../../../src/nodemetadata.cpp \ - ../../../src/nodetimer.cpp \ - ../../../src/noise.cpp \ - ../../../src/objdef.cpp \ - ../../../src/object_properties.cpp \ - ../../../src/particles.cpp \ - ../../../src/pathfinder.cpp \ - ../../../src/player.cpp \ - ../../../src/porting.cpp \ - ../../../src/porting_android.cpp \ - ../../../src/profiler.cpp \ - ../../../src/raycast.cpp \ - ../../../src/reflowscan.cpp \ - ../../../src/remoteplayer.cpp \ - ../../../src/rollback.cpp \ - ../../../src/rollback_interface.cpp \ - ../../../src/serialization.cpp \ - ../../../src/server.cpp \ - ../../../src/serverenvironment.cpp \ - ../../../src/serverlist.cpp \ - ../../../src/settings.cpp \ - ../../../src/staticobject.cpp \ - ../../../src/texture_override.cpp \ - ../../../src/tileanimation.cpp \ - ../../../src/tool.cpp \ - ../../../src/translation.cpp \ - ../../../src/version.cpp \ - ../../../src/voxel.cpp \ - ../../../src/voxelalgorithms.cpp - -# LevelDB backend is disabled -# ../../../src/database/database-leveldb.cpp - -# GMP -LOCAL_SRC_FILES += ../../../lib/gmp/mini-gmp.c - -# JSONCPP -LOCAL_SRC_FILES += ../../../lib/jsoncpp/jsoncpp.cpp - -# iconv -LOCAL_SRC_FILES += \ - deps/Android/libiconv/lib/iconv.c \ - deps/Android/libiconv/libcharset/lib/localcharset.c - -# SQLite3 -LOCAL_SRC_FILES += deps/Android/sqlite/sqlite3.c - -LOCAL_STATIC_LIBRARIES += Curl Freetype Irrlicht OpenAL mbedTLS mbedx509 mbedcrypto Vorbis LuaJIT android_native_app_glue $(PROFILER_LIBS) #LevelDB -#OpenSSL Crypto - -LOCAL_LDLIBS := -lEGL -lGLESv1_CM -lGLESv2 -landroid -lOpenSLES - -include $(BUILD_SHARED_LIBRARY) - -ifdef GPROF -$(call import-module,android-ndk-profiler) -endif -$(call import-module,android/native_app_glue) diff --git a/build/android/native/jni/Application.mk b/build/android/native/jni/Application.mk deleted file mode 100644 index 82f0148f0..000000000 --- a/build/android/native/jni/Application.mk +++ /dev/null @@ -1,32 +0,0 @@ -APP_PLATFORM := ${APP_PLATFORM} -APP_ABI := ${TARGET_ABI} -APP_STL := c++_shared -NDK_TOOLCHAIN_VERSION := clang -APP_SHORT_COMMANDS := true -APP_MODULES := Minetest - -APP_CPPFLAGS := -Ofast -fvisibility=hidden -fexceptions -Wno-deprecated-declarations -Wno-extra-tokens - -ifeq ($(APP_ABI),armeabi-v7a) -APP_CPPFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -endif - -#ifeq ($(APP_ABI),x86) -#APP_CPPFLAGS += -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -funroll-loops -#endif - -ifndef NDEBUG -APP_CPPFLAGS := -g -D_DEBUG -O0 -fno-omit-frame-pointer -fexceptions -endif - -APP_CFLAGS := $(APP_CPPFLAGS) -Wno-parentheses-equality #-Werror=shorten-64-to-32 -APP_CXXFLAGS := $(APP_CPPFLAGS) -frtti -std=gnu++17 -APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe - -ifeq ($(APP_ABI),arm64-v8a) -APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections -endif - -ifndef NDEBUG -APP_LDFLAGS := -endif 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/init.lua deleted file mode 100644 index 1b2549685..000000000 --- a/builtin/async/init.lua +++ /dev/null @@ -1,17 +0,0 @@ - -core.log("info", "Initializing Asynchronous environment") - -function core.job_processor(serialized_func, serialized_param) - local func = loadstring(serialized_func) - local param = core.deserialize(serialized_param) - local retval = nil - - if type(func) == "function" then - retval = core.serialize(func(param)) - else - core.log("error", "ASYNC WORKER: Unable to deserialize function") - end - - return retval or core.serialize(nil) -end - diff --git a/builtin/async/mainmenu.lua b/builtin/async/mainmenu.lua new file mode 100644 index 000000000..0e9c222d1 --- /dev/null +++ b/builtin/async/mainmenu.lua @@ -0,0 +1,9 @@ +core.log("info", "Initializing asynchronous environment") + +function core.job_processor(func, serialized_param) + local param = core.deserialize(serialized_param) + + local retval = core.serialize(func(param)) + + return retval or core.serialize(nil) +end diff --git a/builtin/client/chatcommands.lua b/builtin/client/chatcommands.lua index 5cb1b40bb..a563a6627 100644 --- a/builtin/client/chatcommands.lua +++ b/builtin/client/chatcommands.lua @@ -1,6 +1,5 @@ -- Minetest: builtin/client/chatcommands.lua - core.register_on_sending_chat_message(function(message) if message:sub(1,2) == ".." then return false @@ -8,7 +7,7 @@ core.register_on_sending_chat_message(function(message) local first_char = message:sub(1,1) if first_char == "/" or first_char == "." then - core.display_chat_message(core.gettext("issued command: ") .. message) + core.display_chat_message(core.gettext("Issued command: ") .. message) end if first_char ~= "." then @@ -19,7 +18,12 @@ core.register_on_sending_chat_message(function(message) param = param or "" if not cmd then - core.display_chat_message(core.gettext("-!- Empty command")) + core.display_chat_message("-!- " .. core.gettext("Empty command.")) + return true + end + + -- Run core.registered_on_chatcommand callbacks. + if core.run_callbacks(core.registered_on_chatcommand, 5, cmd, param) then return true end @@ -31,7 +35,7 @@ core.register_on_sending_chat_message(function(message) core.display_chat_message(result) end else - core.display_chat_message(core.gettext("-!- Invalid command: ") .. cmd) + core.display_chat_message("-!- " .. core.gettext("Invalid command: ") .. cmd) end return true @@ -61,7 +65,7 @@ core.register_chatcommand("clear_chat_queue", { description = core.gettext("Clear the out chat queue"), func = function(param) core.clear_out_chat_queue() - return true, core.gettext("The out chat queue is now empty") + return true, core.gettext("The out chat queue is now empty.") end, }) diff --git a/builtin/client/death_formspec.lua b/builtin/client/death_formspec.lua index e755ac5c1..c25c799ab 100644 --- a/builtin/client/death_formspec.lua +++ b/builtin/client/death_formspec.lua @@ -2,7 +2,6 @@ -- handled by the engine. core.register_on_death(function() - core.display_chat_message("You died.") local formspec = "size[11,5.5]bgcolor[#320000b4;true]" .. "label[4.85,1.35;" .. fgettext("You died") .. "]button_exit[4,3;3,0.5;btn_respawn;".. fgettext("Respawn") .."]" diff --git a/builtin/client/init.lua b/builtin/client/init.lua index 9633a7c71..3719a90ee 100644 --- a/builtin/client/init.lua +++ b/builtin/client/init.lua @@ -5,7 +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(commonpath .. "vector.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/client/register.lua b/builtin/client/register.lua index c1b4965c1..61db4a30b 100644 --- a/builtin/client/register.lua +++ b/builtin/client/register.lua @@ -1,9 +1,15 @@ - core.callback_origins = {} local getinfo = debug.getinfo debug.getinfo = nil +--- Runs given callbacks. +-- +-- Note: this function is also called from C++ +-- @tparam table callbacks a table with registered callbacks, like `core.registered_on_*` +-- @tparam number mode a RunCallbacksMode, as defined in src/script/common/c_internal.h +-- @param ... arguments for the callback +-- @return depends on mode function core.run_callbacks(callbacks, mode, ...) assert(type(callbacks) == "table") local cb_len = #callbacks @@ -63,6 +69,7 @@ core.registered_on_mods_loaded, core.register_on_mods_loaded = make_registration core.registered_on_shutdown, core.register_on_shutdown = make_registration() core.registered_on_receiving_chat_message, core.register_on_receiving_chat_message = make_registration() core.registered_on_sending_chat_message, core.register_on_sending_chat_message = make_registration() +core.registered_on_chatcommand, core.register_on_chatcommand = make_registration() core.registered_on_death, core.register_on_death = make_registration() core.registered_on_hp_modification, core.register_on_hp_modification = make_registration() core.registered_on_damage_taken, core.register_on_damage_taken = make_registration() diff --git a/builtin/common/after.lua b/builtin/common/after.lua index e20f292f0..bce262537 100644 --- a/builtin/common/after.lua +++ b/builtin/common/after.lua @@ -37,7 +37,14 @@ function core.after(after, func, ...) arg = {...}, mod_origin = core.get_last_run_mod(), } + jobs[#jobs + 1] = new_job time_next = math.min(time_next, expire) - return { cancel = function() new_job.func = function() end end } + + return { + cancel = function() + new_job.func = function() end + new_job.args = {} + end + } end diff --git a/builtin/common/chatcommands.lua b/builtin/common/chatcommands.lua index 52edda659..7c3da0601 100644 --- a/builtin/common/chatcommands.lua +++ b/builtin/common/chatcommands.lua @@ -1,7 +1,47 @@ -- Minetest: builtin/common/chatcommands.lua +-- For server-side translations (if INIT == "game") +-- Otherwise, use core.gettext +local S = core.get_translator("__builtin") + core.registered_chatcommands = {} +-- Interpret the parameters of a command, separating options and arguments. +-- Input: command, param +-- command: name of command +-- param: parameters of command +-- Returns: opts, args +-- opts is a string of option letters, or false on error +-- args is an array with the non-option arguments in order, or an error message +-- Example: for this command line: +-- /command a b -cd e f -g +-- the function would receive: +-- a b -cd e f -g +-- and it would return: +-- "cdg", {"a", "b", "e", "f"} +-- Negative numbers are taken as arguments. Long options (--option) are +-- currently rejected as reserved. +local function getopts(command, param) + local opts = "" + local args = {} + for match in param:gmatch("%S+") do + if match:byte(1) == 45 then -- 45 = '-' + local second = match:byte(2) + if second == 45 then + return false, S("Invalid parameters (see /help @1).", command) + elseif second and (second < 48 or second > 57) then -- 48 = '0', 57 = '9' + opts = opts .. match:sub(2) + else + -- numeric, add it to args + args[#args + 1] = match + end + else + args[#args + 1] = match + end + end + return opts, args +end + function core.register_chatcommand(cmd, def) def = def or {} def.params = def.params or "" @@ -29,35 +69,30 @@ function core.override_chatcommand(name, redefinition) core.registered_chatcommands[name] = chatcommand end -local cmd_marker = "/" - -local function gettext(...) - return ... -end - -local function gettext_replace(text, replace) - return text:gsub("$1", replace) -end - - -if INIT == "client" then - cmd_marker = "." - gettext = core.gettext - gettext_replace = fgettext_ne +local function format_help_line(cmd, def) + local cmd_marker = INIT == "client" and "." or "/" + local msg = core.colorize("#00ffff", cmd_marker .. cmd) + if def.params and def.params ~= "" then + msg = msg .. " " .. def.params + end + if def.description and def.description ~= "" then + msg = msg .. ": " .. def.description + end + return msg end local function do_help_cmd(name, param) - local function format_help_line(cmd, def) - local msg = core.colorize("#00ffff", cmd_marker .. cmd) - if def.params and def.params ~= "" then - msg = msg .. " " .. def.params - end - if def.description and def.description ~= "" then - msg = msg .. ": " .. def.description - end - return msg + local opts, args = getopts("help", param) + if not opts then + return false, args end - if param == "" then + if #args > 1 then + return false, S("Too many arguments, try using just /help ") + end + local use_gui = INIT ~= "client" and core.get_player_by_name(name) + use_gui = use_gui and not opts:find("t") + + if #args == 0 and not use_gui then local cmds = {} for cmd, def in pairs(core.registered_chatcommands) do if INIT == "client" or core.check_player_privs(name, def.privs) then @@ -65,10 +100,25 @@ local function do_help_cmd(name, param) end end table.sort(cmds) - return true, gettext("Available commands: ") .. table.concat(cmds, " ") .. "\n" - .. gettext_replace("Use '$1help ' to get more information," - .. " or '$1help all' to list everything.", cmd_marker) - elseif param == "all" then + local msg + if INIT == "game" then + msg = S("Available commands: @1", + table.concat(cmds, " ")) .. "\n" + .. S("Use '/help ' to get more " + .. "information, or '/help all' to list " + .. "everything.") + else + msg = core.gettext("Available commands: ") + .. table.concat(cmds, " ") .. "\n" + .. core.gettext("Use '.help ' to get more " + .. "information, or '.help all' to list " + .. "everything.") + end + return true, msg + elseif #args == 0 or (args[1] == "all" and use_gui) then + core.show_general_help_formspec(name) + return true + elseif args[1] == "all" then local cmds = {} for cmd, def in pairs(core.registered_chatcommands) do if INIT == "client" or core.check_player_privs(name, def.privs) then @@ -76,19 +126,35 @@ local function do_help_cmd(name, param) end end table.sort(cmds) - return true, gettext("Available commands:").."\n"..table.concat(cmds, "\n") - elseif INIT == "game" and param == "privs" then + local msg + if INIT == "game" then + msg = S("Available commands:") + else + msg = core.gettext("Available commands:") + end + return true, msg.."\n"..table.concat(cmds, "\n") + elseif INIT == "game" and args[1] == "privs" then + if use_gui then + core.show_privs_help_formspec(name) + return true + end local privs = {} for priv, def in pairs(core.registered_privileges) do privs[#privs + 1] = priv .. ": " .. def.description end table.sort(privs) - return true, "Available privileges:\n"..table.concat(privs, "\n") + return true, S("Available privileges:").."\n"..table.concat(privs, "\n") else - local cmd = param + local cmd = args[1] local def = core.registered_chatcommands[cmd] if not def then - return false, gettext("Command not available: ")..cmd + local msg + if INIT == "game" then + msg = S("Command not available: @1", cmd) + else + msg = core.gettext("Command not available: ") .. cmd + end + return false, msg else return true, format_help_line(cmd, def) end @@ -97,16 +163,16 @@ end if INIT == "client" then core.register_chatcommand("help", { - params = gettext("[all | ]"), - description = gettext("Get help for commands"), + params = core.gettext("[all | ]"), + description = core.gettext("Get help for commands"), func = function(param) return do_help_cmd(nil, param) end, }) else core.register_chatcommand("help", { - params = "[all | privs | ]", - description = "Get help for commands or list privileges", + params = S("[all | privs | ] [-t]"), + description = S("Get help for commands or list privileges (-t: output in chat)"), func = do_help_cmd, }) end diff --git a/builtin/common/information_formspecs.lua b/builtin/common/information_formspecs.lua index 8afa5bc87..1445a017c 100644 --- a/builtin/common/information_formspecs.lua +++ b/builtin/common/information_formspecs.lua @@ -20,8 +20,8 @@ local LIST_FORMSPEC_DESCRIPTION = [[ button_exit[5,7;3,1;quit;%s] ]] -local formspec_escape = core.formspec_escape -local check_player_privs = core.check_player_privs +local F = core.formspec_escape +local S = core.get_translator("__builtin") -- CHAT COMMANDS FORMSPEC @@ -51,22 +51,24 @@ core.after(0, load_mod_command_tree) local function build_chatcommands_formspec(name, sel, copy) local rows = {} - rows[1] = "#FFF,0,Command,Parameters" + rows[1] = "#FFF,0,"..F(S("Command"))..","..F(S("Parameters")) - local description = "For more information, click on any entry in the list.\n" .. - "Double-click to copy the entry to the chat history." + local description = S("For more information, click on " + .. "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," .. formspec_escape(data[1]) .. "," + 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], formspec_escape(cmds[2].params)) + cmds[1], F(cmds[2].params)) if sel == #rows then description = cmds[2].description if copy then - core.chat_send_player(name, ("Command: %s %s"):format( + core.chat_send_player(name, S("Command: @1 @2", core.colorize("#0FF", "/" .. cmds[1]), cmds[2].params)) end end @@ -74,9 +76,9 @@ local function build_chatcommands_formspec(name, sel, copy) end return LIST_FORMSPEC_DESCRIPTION:format( - "Available commands: (see also: /help )", + F(S("Available commands: (see also: /help )")), table.concat(rows, ","), sel or 0, - description, "Close" + F(description), F(S("Close")) ) end @@ -91,19 +93,19 @@ local function build_privs_formspec(name) table.sort(privs, function(a, b) return a[1] < b[1] end) local rows = {} - rows[1] = "#FFF,0,Privilege,Description" + rows[1] = "#FFF,0,"..F(S("Privilege"))..","..F(S("Description")) local player_privs = core.get_player_privs(name) for i, data in ipairs(privs) do rows[#rows + 1] = ("%s,0,%s,%s"):format( player_privs[data[1]] and COLOR_GREEN or COLOR_GRAY, - data[1], formspec_escape(data[2].description)) + data[1], F(data[2].description)) end return LIST_FORMSPEC:format( - "Available privileges:", + F(S("Available privileges:")), table.concat(rows, ","), - "Close" + F(S("Close")) ) end @@ -115,7 +117,7 @@ core.register_on_player_receive_fields(function(player, formname, fields) return end - local event = minetest.explode_table_event(fields.list) + local event = core.explode_table_event(fields.list) if event.type ~= "INV" then local name = player:get_player_name() core.show_formspec(name, "__builtin:help_cmds", @@ -123,30 +125,12 @@ core.register_on_player_receive_fields(function(player, formname, fields) end end) - -local help_command = core.registered_chatcommands["help"] -local old_help_func = help_command.func - -help_command.func = function(name, param) - local admin = core.settings:get("name") - - -- If the admin ran help, put the output in the chat buffer as well to - -- work with the server terminal - if param == "privs" then - core.show_formspec(name, "__builtin:help_privs", - build_privs_formspec(name)) - if name ~= admin then - return true - end - end - if param == "" or param == "all" then - core.show_formspec(name, "__builtin:help_cmds", - build_chatcommands_formspec(name)) - if name ~= admin then - return true - end - end - - return old_help_func(name, param) +function core.show_general_help_formspec(name) + core.show_formspec(name, "__builtin:help_cmds", + build_chatcommands_formspec(name)) end +function core.show_privs_help_formspec(name) + core.show_formspec(name, "__builtin:help_privs", + build_privs_formspec(name)) +end diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua index e29a9f422..467f18804 100644 --- a/builtin/common/misc_helpers.lua +++ b/builtin/common/misc_helpers.lua @@ -204,19 +204,12 @@ end -------------------------------------------------------------------------------- function string:trim() - return (self:gsub("^%s*(.-)%s*$", "%1")) + return self:match("^%s*(.-)%s*$") end -------------------------------------------------------------------------------- function math.hypot(x, y) - local t - x = math.abs(x) - y = math.abs(y) - t = math.min(x, y) - x = math.max(x, y) - if x == 0 then return 0 end - t = t / x - return x * math.sqrt(1 + t * t) + return math.sqrt(x * x + y * y) end -------------------------------------------------------------------------------- @@ -244,15 +237,24 @@ function math.factorial(x) return v end -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,",","\\,") + +function math.round(x) + if x >= 0 then + return math.floor(x + 0.5) end - return text + return math.ceil(x - 0.5) +end + +local formspec_escapes = { + ["\\"] = "\\\\", + ["["] = "\\[", + ["]"] = "\\]", + [";"] = "\\;", + [","] = "\\," +} +function core.formspec_escape(text) + -- Use explicit character set instead of dot here because it doubles the performance + return text and string.gsub(text, "[\\%[%];,]", formspec_escapes) end @@ -263,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 -------------------------------------------------------------------------------- @@ -423,56 +428,50 @@ function core.string_to_pos(value) return nil end - local p = {} - p.x, p.y, p.z = string.match(value, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") - if p.x and p.y and p.z then - p.x = tonumber(p.x) - p.y = tonumber(p.y) - p.z = tonumber(p.z) - return p - end - p = {} - p.x, p.y, p.z = string.match(value, "^%( *([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) *%)$") - if p.x and p.y and p.z then - p.x = tonumber(p.x) - p.y = tonumber(p.y) - p.z = tonumber(p.z) - return p + 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 + +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 - p1 = core.string_to_pos(p1 .. ")") - p2 = core.string_to_pos("(" .. p2) - if p1 == nil or p2 == nil then - return nil + function core.string_to_area(value, relative_to) + local p1, p2 = value:match("^%((.-)%)%s*%((.-)%)$") + if not p1 then + return + end + + p1 = parse_area_string(p1, relative_to) + p2 = parse_area_string(p2, relative_to) + + if p1 == nil or p2 == nil then + return + end + + return p1, p2 end - - return p1, p2 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, 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 - -test_string_to_area() - -------------------------------------------------------------------------------- function table.copy(t, seen) local n = {} @@ -532,7 +531,7 @@ if INIT == "mainmenu" then end end -if INIT == "client" or INIT == "mainmenu" then +if core.gettext then -- for client and mainmenu function fgettext_ne(text, ...) text = core.gettext(text) local arg = {n=select('#', ...), ...} @@ -697,3 +696,75 @@ function core.privs_to_string(privs, delim) end return table.concat(list, delim) 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: + * "": return as number + * "~": return relative_to + + * "~": 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: +* "": return as number +* "~": return + 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 --- @author Fabien Fleutot --- @author ShadowNinja --------------------------------------------------------------------------------- ---- 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 +local table_concat, string_dump, string_format, string_match, math_huge + = table.concat, string.dump, string.format, string.match, math.huge + +-- 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 - - -- 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) + 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 - - local dumped = {} -- object->varname set - local local_defs = {} -- Dumped local definitions as source code lines - - -- Mutually recursive local functions: - local dump_val, dump_or_ref_val - - -- 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 - 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 - 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) - end - end - return "{"..table.concat(vals, ", ").."}" - else - error("Can't serialize data of type "..tp) - 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) - end - 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 + count_values(value) + return counts end --- Deserialization +-- 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 -local function safe_loadstring(...) - local func, err = loadstring(...) - if func then - setfenv(func, {}) - return func +local function quote(string) + return string_format("%q", string) +end + +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 end - return nil, err + -- 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 + -- 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 + write("}") + return + end + end + -- 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 + write("return ") + dump(value) +end + +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 bb9d13e7f..7d046d5b7 100644 --- a/builtin/common/tests/misc_helpers_spec.lua +++ b/builtin/common/tests/misc_helpers_spec.lua @@ -1,4 +1,6 @@ _G.core = {} +_G.vector = {metatable = {}} +dofile("builtin/common/vector.lua") dofile("builtin/common/misc_helpers.lua") describe("string", function() @@ -55,8 +57,8 @@ end) describe("pos", function() it("from string", function() - assert.same({ x = 10, y = 5.1, z = -2}, core.string_to_pos("10.0, 5.1, -2")) - assert.same({ x = 10, y = 5.1, z = -2}, core.string_to_pos("( 10.0, 5.1, -2)")) + assert.equal(vector.new(10, 5.1, -2), core.string_to_pos("10.0, 5.1, -2")) + assert.equal(vector.new(10, 5.1, -2), core.string_to_pos("( 10.0, 5.1, -2)")) assert.is_nil(core.string_to_pos("asd, 5, -2)")) end) @@ -65,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 17c6a60f7..340e226ee 100644 --- a/builtin/common/tests/serialize_spec.lua +++ b/builtin/common/tests/serialize_spec.lua @@ -1,41 +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) - local test_out = core.deserialize(core.serialize(test_in)) - assert.same(test_in, test_out) + it("handles cross-referencing structures", function() + local test_in = { + foo = { + baz = { + {} + }, + }, + bar = { + baz = {}, + }, + } + + 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() @@ -45,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")) @@ -53,4 +110,80 @@ describe("serialize", function() assert.is_nil(test_out.func) assert.equals(test_out.foo, "bar") end) + + it("vectors work", function() + local v = vector.new(1, 2, 3) + assert_preserves({v}) + assert_preserves(v) + + -- abuse + v = vector.new(1, 2, 3) + v.a = "bla" + 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 0f287363a..6a0b81a89 100644 --- a/builtin/common/tests/vector_spec.lua +++ b/builtin/common/tests/vector_spec.lua @@ -1,17 +1,23 @@ -_G.vector = {} +_G.vector = {metatable = {}} dofile("builtin/common/vector.lua") describe("vector", function() describe("new()", function() it("constructs", function() - assert.same({ x = 0, y = 0, z = 0 }, vector.new()) - assert.same({ x = 1, y = 2, z = 3 }, vector.new(1, 2, 3)) - assert.same({ x = 3, y = 2, z = 1 }, vector.new({ x = 3, y = 2, z = 1 })) + assert.same({x = 0, y = 0, z = 0}, vector.new()) + assert.same({x = 1, y = 2, z = 3}, vector.new(1, 2, 3)) + assert.same({x = 3, y = 2, z = 1}, vector.new({x = 3, y = 2, z = 1})) + + assert.is_true(vector.check(vector.new())) + assert.is_true(vector.check(vector.new(1, 2, 3))) + assert.is_true(vector.check(vector.new({x = 3, y = 2, z = 1}))) local input = vector.new({ x = 3, y = 2, z = 1 }) local output = vector.new(input) assert.same(input, output) - assert.are_not.equal(input, output) + assert.equal(input, output) + assert.is_false(rawequal(input, output)) + assert.equal(input, input:new()) end) it("throws on invalid input", function() @@ -25,27 +31,294 @@ describe("vector", function() end) end) - it("equal()", function() - local function assertE(a, b) - assert.is_true(vector.equals(a, b)) - end - local function assertNE(a, b) - assert.is_false(vector.equals(a, b)) - end - - assertE({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - assertE({x = -1, y = 0, z = 1}, {x = -1, y = 0, z = 1}) - local a = { x = 2, y = 4, z = -10 } - assertE(a, a) - assertNE({x = -1, y = 0, z = 1}, a) + it("zero()", function() + assert.same({x = 0, y = 0, z = 0}, vector.zero()) + assert.same(vector.new(), vector.zero()) + assert.equal(vector.new(), vector.zero()) + assert.is_true(vector.check(vector.zero())) end) - it("add()", function() - assert.same({ x = 2, y = 4, z = 6 }, vector.add(vector.new(1, 2, 3), { x = 1, y = 2, z = 3 })) + it("copy()", function() + local v = vector.new(1, 2, 3) + assert.same(v, vector.copy(v)) + assert.same(vector.new(v), vector.copy(v)) + assert.equal(vector.new(v), vector.copy(v)) + assert.is_true(vector.check(vector.copy(v))) + end) + + it("indexes", function() + local some_vector = vector.new(24, 42, 13) + assert.equal(24, some_vector[1]) + assert.equal(24, some_vector.x) + assert.equal(42, some_vector[2]) + assert.equal(42, some_vector.y) + assert.equal(13, some_vector[3]) + assert.equal(13, some_vector.z) + + some_vector[1] = 100 + assert.equal(100, some_vector.x) + some_vector.x = 101 + assert.equal(101, some_vector[1]) + + some_vector[2] = 100 + assert.equal(100, some_vector.y) + some_vector.y = 102 + assert.equal(102, some_vector[2]) + + some_vector[3] = 100 + assert.equal(100, some_vector.z) + some_vector.z = 103 + assert.equal(103, some_vector[3]) + end) + + it("direction()", function() + local a = vector.new(1, 0, 0) + local b = vector.new(1, 42, 0) + assert.equal(vector.new(0, 1, 0), vector.direction(a, b)) + assert.equal(vector.new(0, 1, 0), a:direction(b)) + end) + + it("distance()", function() + local a = vector.new(1, 0, 0) + local b = vector.new(3, 42, 9) + assert.is_true(math.abs(43 - vector.distance(a, b)) < 1.0e-12) + assert.is_true(math.abs(43 - a:distance(b)) < 1.0e-12) + assert.equal(0, vector.distance(a, a)) + assert.equal(0, b:distance(b)) + end) + + it("length()", function() + local a = vector.new(0, 0, -23) + assert.equal(0, vector.length(vector.new())) + assert.equal(23, vector.length(a)) + assert.equal(23, a:length()) + end) + + it("normalize()", function() + local a = vector.new(0, 0, -23) + assert.equal(vector.new(0, 0, -1), vector.normalize(a)) + assert.equal(vector.new(0, 0, -1), a:normalize()) + assert.equal(vector.new(), vector.normalize(vector.new())) + end) + + it("floor()", function() + local a = vector.new(0.1, 0.9, -0.5) + assert.equal(vector.new(0, 0, -1), vector.floor(a)) + assert.equal(vector.new(0, 0, -1), a:floor()) + end) + + it("round()", function() + local a = vector.new(0.1, 0.9, -0.5) + assert.equal(vector.new(0, 1, -1), vector.round(a)) + assert.equal(vector.new(0, 1, -1), a:round()) + end) + + it("apply()", function() + local i = 0 + local f = function(x) + i = i + 1 + return x + i + end + local a = vector.new(0.1, 0.9, -0.5) + assert.equal(vector.new(1, 1, 0), vector.apply(a, math.ceil)) + assert.equal(vector.new(1, 1, 0), a:apply(math.ceil)) + assert.equal(vector.new(0.1, 0.9, 0.5), vector.apply(a, math.abs)) + assert.equal(vector.new(0.1, 0.9, 0.5), a:apply(math.abs)) + assert.equal(vector.new(1.1, 2.9, 2.5), vector.apply(a, f)) + 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)) + end + local function assertNE(a, b) + assert.is_false(vector.equals(a, b)) + end + + assertE({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + assertE({x = -1, y = 0, z = 1}, {x = -1, y = 0, z = 1}) + assertE({x = -1, y = 0, z = 1}, vector.new(-1, 0, 1)) + local a = {x = 2, y = 4, z = -10} + assertE(a, a) + assertNE({x = -1, y = 0, z = 1}, a) + + assert.equal(vector.new(1, 2, 3), vector.new(1, 2, 3)) + assert.is_true(vector.new(1, 2, 3):equals(vector.new(1, 2, 3))) + assert.not_equal(vector.new(1, 2, 3), vector.new(1, 2, 4)) + assert.is_true(vector.new(1, 2, 3) == vector.new(1, 2, 3)) + assert.is_false(vector.new(1, 2, 3) == vector.new(1, 3, 3)) + end) + + it("metatable is same", function() + local a = vector.new() + local b = vector.new(1, 2, 3) + + assert.equal(true, vector.check(a)) + assert.equal(true, vector.check(b)) + + assert.equal(vector.metatable, getmetatable(a)) + assert.equal(vector.metatable, getmetatable(b)) + assert.equal(vector.metatable, a.metatable) + end) + + it("sort()", function() + local a = vector.new(1, 2, 3) + local b = vector.new(0.5, 232, -2) + local sorted = {vector.new(0.5, 2, -2), vector.new(1, 232, 3)} + assert.same(sorted, {vector.sort(a, b)}) + assert.same(sorted, {a:sort(b)}) + end) + + it("angle()", function() + assert.equal(math.pi, vector.angle(vector.new(-1, -2, -3), vector.new(1, 2, 3))) + assert.equal(math.pi/2, vector.new(0, 1, 0):angle(vector.new(1, 0, 0))) + end) + + it("dot()", function() + assert.equal(-14, vector.dot(vector.new(-1, -2, -3), vector.new(1, 2, 3))) + assert.equal(0, vector.new():dot(vector.new(1, 2, 3))) + end) + + it("cross()", function() + local a = vector.new(-1, -2, 0) + local b = vector.new(1, 2, 3) + assert.equal(vector.new(-6, 3, 0), vector.cross(a, b)) + assert.equal(vector.new(-6, 3, 0), a:cross(b)) end) it("offset()", function() - assert.same({ x = 41, y = 52, z = 63 }, vector.offset(vector.new(1, 2, 3), 40, 50, 60)) + assert.same({x = 41, y = 52, z = 63}, vector.offset(vector.new(1, 2, 3), 40, 50, 60)) + assert.equal(vector.new(41, 52, 63), vector.offset(vector.new(1, 2, 3), 40, 50, 60)) + assert.equal(vector.new(41, 52, 63), vector.new(1, 2, 3):offset(40, 50, 60)) + end) + + it("is()", function() + local some_table1 = {foo = 13, [42] = 1, "bar", 2} + local some_table2 = {1, 2, 3} + local some_table3 = {x = 1, 2, 3} + local some_table4 = {1, 2, z = 3} + local old = {x = 1, y = 2, z = 3} + local real = vector.new(1, 2, 3) + + assert.is_false(vector.check(nil)) + assert.is_false(vector.check(1)) + assert.is_false(vector.check(true)) + assert.is_false(vector.check("foo")) + assert.is_false(vector.check(some_table1)) + assert.is_false(vector.check(some_table2)) + assert.is_false(vector.check(some_table3)) + assert.is_false(vector.check(some_table4)) + assert.is_false(vector.check(old)) + assert.is_true(vector.check(real)) + assert.is_true(real:check()) + end) + + it("global pairs", function() + local out = {} + local vec = vector.new(10, 20, 30) + for k, v in pairs(vec) do + out[k] = v + end + assert.same({x = 10, y = 20, z = 30}, out) + end) + + it("abusing works", function() + local v = vector.new(1, 2, 3) + v.a = 1 + assert.equal(1, v.a) + + local a_is_there = false + for key, value in pairs(v) do + if key == "a" then + a_is_there = true + assert.equal(value, 1) + break + end + end + assert.is_true(a_is_there) + end) + + it("add()", function() + local a = vector.new(1, 2, 3) + local b = vector.new(1, 4, 3) + local c = vector.new(2, 6, 6) + assert.equal(c, vector.add(a, {x = 1, y = 4, z = 3})) + assert.equal(c, vector.add(a, b)) + assert.equal(c, a:add(b)) + assert.equal(c, a + b) + assert.equal(c, b + a) + end) + + it("subtract()", function() + local a = vector.new(1, 2, 3) + local b = vector.new(2, 4, 3) + local c = vector.new(-1, -2, 0) + assert.equal(c, vector.subtract(a, {x = 2, y = 4, z = 3})) + assert.equal(c, vector.subtract(a, b)) + assert.equal(c, a:subtract(b)) + assert.equal(c, a - b) + assert.equal(c, -b + a) + end) + + it("multiply()", function() + local a = vector.new(1, 2, 3) + local b = vector.new(2, 4, 3) + local c = vector.new(2, 8, 9) + local s = 2 + local d = vector.new(2, 4, 6) + assert.equal(c, vector.multiply(a, {x = 2, y = 4, z = 3})) + assert.equal(c, vector.multiply(a, b)) + assert.equal(d, vector.multiply(a, s)) + assert.equal(d, a:multiply(s)) + assert.equal(d, a * s) + assert.equal(d, s * a) + assert.equal(-a, -1 * a) + end) + + it("divide()", function() + local a = vector.new(1, 2, 3) + local b = vector.new(2, 4, 3) + local c = vector.new(0.5, 0.5, 1) + local s = 2 + local d = vector.new(0.5, 1, 1.5) + assert.equal(c, vector.divide(a, {x = 2, y = 4, z = 3})) + assert.equal(c, vector.divide(a, b)) + assert.equal(d, vector.divide(a, s)) + assert.equal(d, a:divide(s)) + assert.equal(d, a / s) + assert.equal(d, 1/s * a) + assert.equal(-a, a / -1) + end) + + it("to_string()", function() + local v = vector.new(1, 2, 3.14) + assert.same("(1, 2, 3.14)", vector.to_string(v)) + assert.same("(1, 2, 3.14)", v:to_string()) + assert.same("(1, 2, 3.14)", tostring(v)) + end) + + it("from_string()", function() + local v = vector.new(1, 2, 3.14) + assert.is_true(vector.check(vector.from_string("(1, 2, 3.14)"))) + assert.same({v, 13}, {vector.from_string("(1, 2, 3.14)")}) + assert.same({v, 12}, {vector.from_string("(1,2 ,3.14)")}) + assert.same({v, 12}, {vector.from_string("(1,2,3.14,)")}) + assert.same({v, 11}, {vector.from_string("(1 2 3.14)")}) + assert.same({v, 15}, {vector.from_string("( 1, 2, 3.14 )")}) + assert.same({v, 15}, {vector.from_string(" ( 1, 2, 3.14) ")}) + assert.same({vector.new(), 8}, {vector.from_string("(0,0,0) ( 1, 2, 3.14) ")}) + assert.same({v, 22}, {vector.from_string("(0,0,0) ( 1, 2, 3.14) ", 8)}) + assert.same({v, 22}, {vector.from_string("(0,0,0) ( 1, 2, 3.14) ", 9)}) + assert.same(nil, vector.from_string("nothing")) end) -- This function is needed because of floating point imprecision. diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua index d6437deda..a08472e32 100644 --- a/builtin/common/vector.lua +++ b/builtin/common/vector.lua @@ -1,73 +1,132 @@ +--[[ +Vector helpers +Note: The vector.*-functions must be able to accept old vectors that had no metatables +]] -vector = {} +-- localize functions +local setmetatable = setmetatable + +-- vector.metatable is set by C++. +local metatable = vector.metatable + +local xyz = {"x", "y", "z"} + +-- only called when rawget(v, key) returns nil +function metatable.__index(v, key) + return rawget(v, xyz[key]) or vector[key] +end + +-- only called when rawget(v, key) returns nil +function metatable.__newindex(v, key, value) + rawset(v, xyz[key] or key, value) +end + +-- constructors + +local function fast_new(x, y, z) + return setmetatable({x = x, y = y, z = z}, metatable) +end function vector.new(a, b, c) - if type(a) == "table" then - assert(a.x and a.y and a.z, "Invalid vector passed to vector.new()") - return {x=a.x, y=a.y, z=a.z} - elseif a then - assert(b and c, "Invalid arguments for vector.new()") - return {x=a, y=b, z=c} + if a and b and c then + return fast_new(a, b, c) + end + + -- deprecated, use vector.copy and vector.zero directly + if type(a) == "table" then + return vector.copy(a) + else + assert(not a, "Invalid arguments for vector.new()") + return vector.zero() end - return {x=0, y=0, z=0} end +function vector.zero() + return fast_new(0, 0, 0) +end + +function vector.copy(v) + assert(v.x and v.y and v.z, "Invalid vector passed to vector.copy()") + return fast_new(v.x, v.y, v.z) +end + +function vector.from_string(s, init) + local x, y, z, np = string.match(s, "^%s*%(%s*([^%s,]+)%s*[,%s]%s*([^%s,]+)%s*[,%s]" .. + "%s*([^%s,]+)%s*[,%s]?%s*%)()", init) + x = tonumber(x) + y = tonumber(y) + z = tonumber(z) + if not (x and y and z) then + return nil + end + return fast_new(x, y, z), np +end + +function vector.to_string(v) + return string.format("(%g, %g, %g)", v.x, v.y, v.z) +end +metatable.__tostring = vector.to_string + function vector.equals(a, b) return a.x == b.x and a.y == b.y and a.z == b.z end +metatable.__eq = vector.equals + +-- unary operations function vector.length(v) - return math.hypot(v.x, math.hypot(v.y, v.z)) + return math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z) end +-- Note: we can not use __len because it is already used for primitive table length function vector.normalize(v) local len = vector.length(v) if len == 0 then - return {x=0, y=0, z=0} + return fast_new(0, 0, 0) else return vector.divide(v, len) end end function vector.floor(v) - return { - x = math.floor(v.x), - y = math.floor(v.y), - z = math.floor(v.z) - } + return vector.apply(v, math.floor) end function vector.round(v) - return { - x = math.floor(v.x + 0.5), - y = math.floor(v.y + 0.5), - z = math.floor(v.z + 0.5) - } + return fast_new( + math.round(v.x), + math.round(v.y), + math.round(v.z) + ) end function vector.apply(v, func) - return { - x = func(v.x), - y = func(v.y), - z = func(v.z) - } + return fast_new( + func(v.x), + func(v.y), + func(v.z) + ) +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 local z = a.z - b.z - return math.hypot(x, math.hypot(y, z)) + return math.sqrt(x * x + y * y + z * z) end function vector.direction(pos1, pos2) - return vector.normalize({ - x = pos2.x - pos1.x, - y = pos2.y - pos1.y, - z = pos2.z - pos1.z - }) + return vector.subtract(pos2, pos1):normalize() end function vector.angle(a, b) @@ -82,70 +141,137 @@ function vector.dot(a, b) end function vector.cross(a, b) - return { - x = a.y * b.z - a.z * b.y, - y = a.z * b.x - a.x * b.z, - z = a.x * b.y - a.y * b.x - } + return fast_new( + a.y * b.z - a.z * b.y, + a.z * b.x - a.x * b.z, + a.x * b.y - a.y * b.x + ) end +function metatable.__unm(v) + return fast_new(-v.x, -v.y, -v.z) +end + +-- add, sub, mul, div operations + function vector.add(a, b) if type(b) == "table" then - return {x = a.x + b.x, - y = a.y + b.y, - z = a.z + b.z} + return fast_new( + a.x + b.x, + a.y + b.y, + a.z + b.z + ) else - return {x = a.x + b, - y = a.y + b, - z = a.z + b} + return fast_new( + a.x + b, + a.y + b, + a.z + b + ) end end +function metatable.__add(a, b) + return fast_new( + a.x + b.x, + a.y + b.y, + a.z + b.z + ) +end function vector.subtract(a, b) if type(b) == "table" then - return {x = a.x - b.x, - y = a.y - b.y, - z = a.z - b.z} + return fast_new( + a.x - b.x, + a.y - b.y, + a.z - b.z + ) else - return {x = a.x - b, - y = a.y - b, - z = a.z - b} + return fast_new( + a.x - b, + a.y - b, + a.z - b + ) end end +function metatable.__sub(a, b) + return fast_new( + a.x - b.x, + a.y - b.y, + a.z - b.z + ) +end function vector.multiply(a, b) if type(b) == "table" then - return {x = a.x * b.x, - y = a.y * b.y, - z = a.z * b.z} + return fast_new( + a.x * b.x, + a.y * b.y, + a.z * b.z + ) else - return {x = a.x * b, - y = a.y * b, - z = a.z * b} + return fast_new( + a.x * b, + a.y * b, + a.z * b + ) + end +end +function metatable.__mul(a, b) + if type(a) == "table" then + return fast_new( + a.x * b, + a.y * b, + a.z * b + ) + else + return fast_new( + a * b.x, + a * b.y, + a * b.z + ) end end function vector.divide(a, b) if type(b) == "table" then - return {x = a.x / b.x, - y = a.y / b.y, - z = a.z / b.z} + return fast_new( + a.x / b.x, + a.y / b.y, + a.z / b.z + ) else - return {x = a.x / b, - y = a.y / b, - z = a.z / b} + return fast_new( + a.x / b, + a.y / b, + a.z / b + ) end end +function metatable.__div(a, b) + -- scalar/vector makes no sense + return fast_new( + a.x / b, + a.y / b, + a.z / b + ) +end + +-- misc stuff function vector.offset(v, x, y, z) - return {x = v.x + x, - y = v.y + y, - z = v.z + z} + return fast_new( + v.x + x, + v.y + y, + v.z + z + ) end function vector.sort(a, b) - return {x = math.min(a.x, b.x), y = math.min(a.y, b.y), z = math.min(a.z, b.z)}, - {x = math.max(a.x, b.x), y = math.max(a.y, b.y), z = math.max(a.z, b.z)} + return fast_new(math.min(a.x, b.x), math.min(a.y, b.y), math.min(a.z, b.z)), + fast_new(math.max(a.x, b.x), math.max(a.y, b.y), math.max(a.z, b.z)) +end + +function vector.check(v) + return getmetatable(v) == metatable end local function sin(x) @@ -213,7 +339,7 @@ end function vector.dir_to_rotation(forward, up) forward = vector.normalize(forward) - local rot = {x = math.asin(forward.y), y = -math.atan2(forward.x, forward.z), z = 0} + local rot = vector.new(math.asin(forward.y), -math.atan2(forward.x, forward.z), 0) if not up then return rot end @@ -221,7 +347,7 @@ function vector.dir_to_rotation(forward, up) "Invalid vectors passed to vector.dir_to_rotation().") up = vector.normalize(up) -- Calculate vector pointing up with roll = 0, just based on forward vector. - local forwup = vector.rotate({x = 0, y = 1, z = 0}, rot) + local forwup = vector.rotate(vector.new(0, 1, 0), rot) -- 'forwup' and 'up' are now in a plane with 'forward' as normal. -- The angle between them is the absolute of the roll value we're looking for. rot.z = vector.angle(forwup, up) diff --git a/builtin/fstk/tabview.lua b/builtin/fstk/tabview.lua index 3715e231b..424d329fb 100644 --- a/builtin/fstk/tabview.lua +++ b/builtin/fstk/tabview.lua @@ -58,26 +58,20 @@ end -------------------------------------------------------------------------------- local function get_formspec(self) - local formspec = "" - - if not self.hidden and (self.parent == nil or not self.parent.hidden) then - - if self.parent == nil then - local tsize = self.tablist[self.last_tab_index].tabsize or - {width=self.width, height=self.height} - formspec = formspec .. - string.format("size[%f,%f,%s]",tsize.width,tsize.height, - dump(self.fixed_size)) - end - formspec = formspec .. self:tab_header() - formspec = formspec .. - self.tablist[self.last_tab_index].get_formspec( - self, - self.tablist[self.last_tab_index].name, - self.tablist[self.last_tab_index].tabdata, - self.tablist[self.last_tab_index].tabsize - ) + if self.hidden or (self.parent ~= nil and self.parent.hidden) then + return "" end + local tab = self.tablist[self.last_tab_index] + + local content, prepend = tab.get_formspec(self, tab.name, tab.tabdata, tab.tabsize) + + if self.parent == nil and not prepend then + local tsize = tab.tabsize or {width=self.width, height=self.height} + prepend = string.format("size[%f,%f,%s]", tsize.width, tsize.height, + dump(self.fixed_size)) + end + + local formspec = (prepend or "") .. self:tab_header() .. content return formspec end @@ -97,14 +91,9 @@ local function handle_buttons(self,fields) return true end - if self.tablist[self.last_tab_index].button_handler ~= nil then - return - self.tablist[self.last_tab_index].button_handler( - self, - fields, - self.tablist[self.last_tab_index].name, - self.tablist[self.last_tab_index].tabdata - ) + local tab = self.tablist[self.last_tab_index] + if tab.button_handler ~= nil then + return tab.button_handler(self, fields, tab.name, tab.tabdata) end return false @@ -122,14 +111,9 @@ local function handle_events(self,event) return true end - if self.tablist[self.last_tab_index].evt_handler ~= nil then - return - self.tablist[self.last_tab_index].evt_handler( - self, - event, - self.tablist[self.last_tab_index].name, - self.tablist[self.last_tab_index].tabdata - ) + local tab = self.tablist[self.last_tab_index] + if tab.evt_handler ~= nil then + return tab.evt_handler(self, event, tab.name, tab.tabdata) end return false diff --git a/builtin/fstk/ui.lua b/builtin/fstk/ui.lua index 7eeebdd47..13f9cbec2 100644 --- a/builtin/fstk/ui.lua +++ b/builtin/fstk/ui.lua @@ -18,6 +18,8 @@ ui = {} ui.childlist = {} ui.default = nil +-- Whether fstk is currently showing its own formspec instead of active ui elements. +ui.overridden = false -------------------------------------------------------------------------------- function ui.add(child) @@ -55,12 +57,13 @@ end -------------------------------------------------------------------------------- function ui.update() + ui.overridden = false local formspec = {} -- handle errors if gamedata ~= nil and gamedata.reconnect_requested then local error_message = core.formspec_escape( - gamedata.errormessage or "") + gamedata.errormessage or fgettext("")) formspec = { "size[14,8]", "real_coordinates[true]", @@ -71,6 +74,7 @@ function ui.update() "button[2,6.6;4,1;btn_reconnect_yes;" .. fgettext("Reconnect") .. "]", "button[8,6.6;4,1;btn_reconnect_no;" .. fgettext("Main menu") .. "]" } + ui.overridden = true elseif gamedata ~= nil and gamedata.errormessage ~= nil then local error_message = core.formspec_escape(gamedata.errormessage) @@ -89,6 +93,7 @@ function ui.update() error_title, error_message), "button[5,6.6;4,1;btn_error_confirm;" .. fgettext("OK") .. "]" } + ui.overridden = true else local active_toplevel_ui_elements = 0 for key,value in pairs(ui.childlist) do @@ -185,6 +190,16 @@ end -------------------------------------------------------------------------------- core.event_handler = function(event) + -- Handle error messages + if ui.overridden then + if event == "MenuQuit" then + gamedata.errormessage = nil + gamedata.reconnect_requested = false + ui.update() + end + return + end + if ui.handle_events(event) then ui.update() return 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/auth.lua b/builtin/game/auth.lua index fc061666c..e7d502bb3 100644 --- a/builtin/game/auth.lua +++ b/builtin/game/auth.lua @@ -87,6 +87,10 @@ core.builtin_auth_handler = { core.settings:get("default_password"))) end + auth_entry.privileges = privileges + + core_auth.save(auth_entry) + -- Run grant callbacks for priv, _ in pairs(privileges) do if not auth_entry.privileges[priv] then @@ -100,9 +104,6 @@ core.builtin_auth_handler = { core.run_priv_callbacks(name, priv, nil, "revoke") end end - - auth_entry.privileges = privileges - core_auth.save(auth_entry) core.notify_authentication_modified(name) end, reload = function() diff --git a/builtin/game/chat.lua b/builtin/game/chat.lua index 73088d546..a33b360c3 100644 --- a/builtin/game/chat.lua +++ b/builtin/game/chat.lua @@ -1,5 +1,7 @@ -- Minetest: builtin/game/chat.lua +local S = core.get_translator("__builtin") + -- Helper function that implements search and replace without pattern matching -- Returns the string and a boolean indicating whether or not the string was modified local function safe_gsub(s, replace, with) @@ -45,6 +47,8 @@ end core.chatcommands = core.registered_chatcommands -- BACKWARDS COMPATIBILITY +local msg_time_threshold = + tonumber(core.settings:get("chatcommand_msg_time_threshold")) or 0.1 core.register_on_chat_message(function(name, message) if message:sub(1,1) ~= "/" then return @@ -52,28 +56,58 @@ core.register_on_chat_message(function(name, message) local cmd, param = string.match(message, "^/([^ ]+) *(.*)") if not cmd then - core.chat_send_player(name, "-!- Empty command") + core.chat_send_player(name, "-!- "..S("Empty command.")) return true end param = param or "" + -- Run core.registered_on_chatcommands callbacks. + if core.run_callbacks(core.registered_on_chatcommands, 5, name, cmd, param) then + return true + end + local cmd_def = core.registered_chatcommands[cmd] if not cmd_def then - core.chat_send_player(name, "-!- Invalid command: " .. cmd) + core.chat_send_player(name, "-!- "..S("Invalid command: @1", cmd)) return true end local has_privs, missing_privs = core.check_player_privs(name, cmd_def.privs) if has_privs then core.set_last_run_mod(cmd_def.mod_origin) - local _, result = cmd_def.func(name, param) - if result then - core.chat_send_player(name, core.colorize("#66BEF5", result)) + local t_before = core.get_us_time() + local success, result = cmd_def.func(name, param) + local delay = (core.get_us_time() - t_before) / 1000000 + if success == false and result == nil then + core.chat_send_player(name, "-!- "..S("Invalid command usage.")) + local help_def = core.registered_chatcommands["help"] + if help_def then + local _, helpmsg = help_def.func(name, cmd) + if helpmsg then + core.chat_send_player(name, helpmsg) + end + end + else + if delay > msg_time_threshold then + -- Show how much time it took to execute the command + if result then + result = result .. core.colorize("#f3d2ff", S(" (@1 s)", + string.format("%.5f", delay))) + else + result = core.colorize("#f3d2ff", S( + "Command execution took @1 s", + string.format("%.5f", delay))) + end + end + if result then + core.chat_send_player(name, result) + end end else - core.chat_send_player(name, core.colorize("#F35400", "# Illuna: You don't have permission" - .. " to run this command (missing privileges: " - .. table.concat(missing_privs, ", ") .. ")")) + core.chat_send_player(name, + S("You don't have permission to run this command " + .. "(missing privileges: @1).", + table.concat(missing_privs, ", "))) end return true -- Handled chat message end) @@ -93,12 +127,18 @@ local function parse_range_str(player_name, str) if args[1] == "here" then p1, p2 = core.get_player_radius_area(player_name, tonumber(args[2])) if p1 == nil then - return false, core.colorize("#F35400", "# Illuna: Unable to get player " .. player_name .. " position") + 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 - return false, core.colorize("#F35400", "# Illuna: Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)") + 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 end @@ -109,54 +149,65 @@ end -- Chat commands -- core.register_chatcommand("me", { - params = "", - description = "Show chat action (e.g., '/me orders a pizza' displays" - .. " ' orders a pizza')", + params = S(""), + description = S("Show chat action (e.g., '/me orders a pizza' " + .. "displays ' orders a pizza')"), privs = {shout=true}, func = function(name, param) - core.chat_send_all(core.colorize("#2BCBEE", "* " .. name .. " " .. param)) + core.chat_send_all("* " .. name .. " " .. param) return true end, }) core.register_chatcommand("admin", { - description = "Show the name of the server owner", + description = S("Show the name of the server owner"), func = function(name) local admin = core.settings:get("name") if admin then - return true, core.colorize("#F6A10A", "# Illuna: The administrator of this server is "..admin..".") + return true, S("The administrator of this server is @1.", admin) else - return false, core.colorize("#F35400", "# Illuna: err... whatever.... .") + return false, S("There's no administrator named " + .. "in the config file.") end end, }) +local function privileges_of(name, privs) + if not privs then + privs = core.get_player_privs(name) + end + local privstr = core.privs_to_string(privs, ", ") + if privstr == "" then + return S("@1 does not have any privileges.", name) + else + return S("Privileges of @1: @2", name, privstr) + end +end + core.register_chatcommand("privs", { - params = "[]", - description = "Show privileges of yourself or another player", + params = S("[]"), + description = S("Show privileges of yourself or another player"), func = function(caller, param) param = param:trim() local name = (param ~= "" and param or caller) if not core.player_exists(name) then - return false, "Player " .. name .. " does not exist." + return false, S("Player @1 does not exist.", name) end - return true, core.colorize("#F6A10A", "# Illuna: Privileges of " .. name .. ": " - .. core.privs_to_string( - core.get_player_privs(name), ' ')) + return true, privileges_of(name) end, }) core.register_chatcommand("haspriv", { - params = "", - description = "Return list of all online players with privilege.", + params = S(""), + description = S("Return list of all online players with privilege"), privs = {basic_privs = true}, func = function(caller, param) param = param:trim() if param == "" then - return false, "Invalid parameters (see /help haspriv)" + return false, S("Invalid parameters (see /help haspriv).") end if not core.registered_privileges[param] then - return false, "Unknown privilege!" + return false, S("Unknown privilege!") end local privs = core.string_to_privs(param) local players_with_priv = {} @@ -166,18 +217,25 @@ core.register_chatcommand("haspriv", { table.insert(players_with_priv, player_name) end end - return true, "Players online with the \"" .. param .. "\" privilege: " .. - table.concat(players_with_priv, ", ") + if #players_with_priv == 0 then + return true, S("No online player has the \"@1\" privilege.", + param) + else + return true, S("Players online with the \"@1\" privilege: @2", + param, + table.concat(players_with_priv, ", ")) + end end }) local function handle_grant_command(caller, grantname, grantprivstr) local caller_privs = core.get_player_privs(caller) if not (caller_privs.privs or caller_privs.basic_privs) then - return false, core.colorize("#F35400", "# Illuna: Your privileges are insufficient.") + return false, S("Your privileges are insufficient.") end + if not core.get_auth_handler().get_auth(grantname) then - return false, core.colorize("#F35400", "# Illuna: I am sorry, there is no player with name '" .. grantname .. "' .") + return false, S("Player @1 does not exist.", grantname) end local grantprivs = core.string_to_privs(grantprivstr) if grantprivstr == "all" then @@ -189,51 +247,52 @@ local function handle_grant_command(caller, grantname, grantprivstr) core.string_to_privs(core.settings:get("basic_privs") or "interact,shout") for priv, _ in pairs(grantprivs) do if not basic_privs[priv] and not caller_privs.privs then - return false, core.colorize("#F35400", "# Illuna: Your privileges are insufficient.") + return false, S("Your privileges are insufficient. ".. + "'@1' only allows you to grant: @2", + "basic_privs", + core.privs_to_string(basic_privs, ', ')) end if not core.registered_privileges[priv] then - privs_unknown = privs_unknown .. core.colorize("#F35400", "# Illuna: What? No idea what you mean with: " .. priv .. "\n") + privs_unknown = privs_unknown .. S("Unknown privilege: @1", priv) .. "\n" end privs[priv] = true end if privs_unknown ~= "" then return false, privs_unknown end + core.set_player_privs(grantname, privs) for priv, _ in pairs(grantprivs) do -- call the on_grant callbacks core.run_priv_callbacks(grantname, priv, caller, "grant") end - core.set_player_privs(grantname, privs) core.log("action", caller..' granted ('..core.privs_to_string(grantprivs, ', ')..') privileges to '..grantname) if grantname ~= caller then - core.chat_send_player(grantname, core.colorize("#37CA39", "# Illuna: "..caller - .. " granted you privileges: " - .. core.privs_to_string(grantprivs, ' '))) + core.chat_send_player(grantname, + S("@1 granted you privileges: @2", caller, + core.privs_to_string(grantprivs, ', '))) end - return true, core.colorize("#F6A10A", "# Illuna: Privileges of " .. grantname .. ": " - .. core.privs_to_string( - core.get_player_privs(grantname), ' ')) + return true, privileges_of(grantname) end core.register_chatcommand("grant", { - params = " ( | all)", - description = "Give privileges to player", + params = S(" ( [, [<...>]] | all)"), + description = S("Give privileges to player"), func = function(name, param) local grantname, grantprivstr = string.match(param, "([^ ]+) (.+)") if not grantname or not grantprivstr then - return false, core.colorize("#F35400", "# Illuna: Sorry, invalid parameters (try /help grant)") - end + return false, S("Invalid parameters (see /help grant).") + end return handle_grant_command(name, grantname, grantprivstr) end, }) core.register_chatcommand("grantme", { - params = " | all", - description = "Grant privileges to yourself", + params = S(" [, [<...>]] | all"), + description = S("Grant privileges to yourself"), func = function(name, param) if param == "" then - return false, core.colorize("#F35400", "# Illuna: Invalid parameters (see /help grantme)") - end + return false, S("Invalid parameters (see /help grantme).") + end return handle_grant_command(name, name, param) end, }) @@ -241,79 +300,123 @@ core.register_chatcommand("grantme", { local function handle_revoke_command(caller, revokename, revokeprivstr) local caller_privs = core.get_player_privs(caller) if not (caller_privs.privs or caller_privs.basic_privs) then - return false, "Your privileges are insufficient." + return false, S("Your privileges are insufficient.") end if not core.get_auth_handler().get_auth(revokename) then - return false, "Player " .. revokename .. " does not exist." + return false, S("Player @1 does not exist.", revokename) end + local privs = core.get_player_privs(revokename) + local revokeprivs = core.string_to_privs(revokeprivstr) - local privs = core.get_player_privs(revokename) + local is_singleplayer = core.is_singleplayer() + local is_admin = not is_singleplayer + and revokename == core.settings:get("name") + and revokename ~= "" + if revokeprivstr == "all" then + revokeprivs = table.copy(privs) + end + + local privs_unknown = "" local basic_privs = core.string_to_privs(core.settings:get("basic_privs") or "interact,shout") + local irrevokable = {} + local has_irrevokable_priv = false for priv, _ in pairs(revokeprivs) do if not basic_privs[priv] and not caller_privs.privs then - return false, "Your privileges are insufficient." + return false, S("Your privileges are insufficient. ".. + "'@1' only allows you to revoke: @2", + "basic_privs", + core.privs_to_string(basic_privs, ', ')) + end + local def = core.registered_privileges[priv] + if not def then + -- 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 + irrevokable[priv] = true + end + end + for priv, _ in pairs(irrevokable) do + revokeprivs[priv] = nil + has_irrevokable_priv = true + end + if privs_unknown ~= "" then + return false, privs_unknown + end + if has_irrevokable_priv then + if is_singleplayer then + core.chat_send_player(caller, + S("Note: Cannot revoke in singleplayer: @1", + core.privs_to_string(irrevokable, ', '))) + elseif is_admin then + core.chat_send_player(caller, + S("Note: Cannot revoke from admin: @1", + core.privs_to_string(irrevokable, ', '))) end end - if revokeprivstr == "all" then - revokeprivs = privs - privs = {} - else - for priv, _ in pairs(revokeprivs) do - privs[priv] = nil - end + local revokecount = 0 + for priv, _ in pairs(revokeprivs) do + privs[priv] = nil + revokecount = revokecount + 1 end + 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.set_player_privs(revokename, privs) core.log("action", caller..' revoked (' ..core.privs_to_string(revokeprivs, ', ') ..') privileges from '..revokename) if revokename ~= caller then - core.chat_send_player(revokename, caller - .. " revoked privileges from you: " - .. core.privs_to_string(revokeprivs, ' ')) + core.chat_send_player(revokename, + S("@1 revoked privileges from you: @2", caller, + core.privs_to_string(revokeprivs, ', '))) end - return true, "Privileges of " .. revokename .. ": " - .. core.privs_to_string( - core.get_player_privs(revokename), ' ') + return true, privileges_of(revokename, new_privs) end core.register_chatcommand("revoke", { - params = " ( | all)", - description = "Remove privileges from player", + params = S(" ( [, [<...>]] | all)"), + description = S("Remove privileges from player"), privs = {}, func = function(name, param) local revokename, revokeprivstr = string.match(param, "([^ ]+) (.+)") if not revokename or not revokeprivstr then - return false, "Invalid parameters (see /help revoke)" + return false, S("Invalid parameters (see /help revoke).") end return handle_revoke_command(name, revokename, revokeprivstr) end, }) core.register_chatcommand("revokeme", { - params = " | all", - description = "Revoke privileges from yourself", + params = S(" [, [<...>]] | all"), + description = S("Revoke privileges from yourself"), privs = {}, func = function(name, param) if param == "" then - return false, "Invalid parameters (see /help revokeme)" + return false, S("Invalid parameters (see /help revokeme).") end return handle_revoke_command(name, name, param) end, }) core.register_chatcommand("setpassword", { - params = " ", - description = "Set player's password", + params = S(" "), + description = S("Set player's password"), privs = {password=true}, func = function(name, param) local toname, raw_password = string.match(param, "^([^ ]+) +(.+)$") @@ -323,207 +426,212 @@ core.register_chatcommand("setpassword", { end if not toname then - return false, core.colorize("#F35400", "Illuna: Name field required!") + return false, S("Name field required.") end - local act_str_past, act_str_pres + local msg_chat, msg_log, msg_ret if not raw_password then core.set_player_password(toname, "") - act_str_past = "cleared" - act_str_pres = "clears" + msg_chat = S("Your password was cleared by @1.", name) + msg_log = name .. " clears password of " .. toname .. "." + msg_ret = S("Password of player \"@1\" cleared.", toname) else core.set_player_password(toname, core.get_password_hash(toname, raw_password)) - act_str_past = "set" - act_str_pres = "sets" + msg_chat = S("Your password was set by @1.", name) + msg_log = name .. " sets password of " .. toname .. "." + msg_ret = S("Password of player \"@1\" set.", toname) end if toname ~= name then - core.chat_send_player(toname, core.colorize("#37CA39", "Your password was " - .. act_str_past .. " by " .. name)) + core.chat_send_player(toname, msg_chat) end - core.log("action", name .. " " .. act_str_pres .. - " password of " .. toname .. ".") + core.log("action", msg_log) - return true, core.colorize("#F6A10A", "Password of player \"" .. toname .. "\" " .. act_str_past) + return true, msg_ret end, }) core.register_chatcommand("clearpassword", { - params = "", - description = "Set empty password for a player", + params = S(""), + description = S("Set empty password for a player"), privs = {password=true}, func = function(name, param) local toname = param if toname == "" then - return false, core.colorize("#F35400", "Illuna: Name field required!") + return false, S("Name field required.") end core.set_player_password(toname, '') core.log("action", name .. " clears password of " .. toname .. ".") - return true, core.colorize("#37CA39", "# Illuna: Aye, Aye! Password of player \"" .. toname .. "\" cleared") + return true, S("Password of player \"@1\" cleared.", toname) end, }) core.register_chatcommand("auth_reload", { params = "", - description = "Reload authentication data", + description = S("Reload authentication data"), privs = {server=true}, func = function(name, param) local done = core.auth_reload() - return done, (done and core.colorize("#37CA39", "Done.") or core.colorize("#F35400", "Failed.")) + return done, (done and S("Done.") or S("Failed.")) end, }) core.register_chatcommand("remove_player", { - params = "", - description = "Remove a player's data", + params = S(""), + description = S("Remove a player's data"), privs = {server=true}, func = function(name, param) local toname = param if toname == "" then - return false, "Name field required" + return false, S("Name field required.") end local rc = core.remove_player(toname) if rc == 0 then core.log("action", name .. " removed player data of " .. toname .. ".") - return true, "Player \"" .. toname .. "\" removed." + return true, S("Player \"@1\" removed.", toname) elseif rc == 1 then - return true, "No such player \"" .. toname .. "\" to remove." + return true, S("No such player \"@1\" to remove.", toname) elseif rc == 2 then - return true, "Player \"" .. toname .. "\" is connected, cannot remove." + return true, S("Player \"@1\" is connected, cannot remove.", toname) end - return false, "Unhandled remove_player return code " .. rc .. "" + return false, S("Unhandled remove_player return code @1.", tostring(rc)) end, }) + +-- pos may be a non-integer position +local function find_free_position_near(pos) + local tries = { + vector.new( 1, 0, 0), + vector.new(-1, 0, 0), + vector.new( 0, 0, 1), + vector.new( 0, 0, -1), + } + for _, d in ipairs(tries) do + local p = vector.add(pos, d) + local n = core.get_node_or_nil(p) + if n then + local def = core.registered_nodes[n.name] + if def and not def.walkable then + return p + end + end + end + return pos +end + +-- Teleports player to

if possible +local function teleport_to_pos(name, p) + local lm = 31007 -- equals MAX_MAP_GENERATION_LIMIT in C++ + if p.x < -lm or p.x > lm or p.y < -lm or p.y > lm + or p.z < -lm or p.z > lm then + return false, S("Cannot teleport out of map bounds!") + end + local teleportee = core.get_player_by_name(name) + if not teleportee then + return false, S("Cannot get player with name @1.", name) + end + if teleportee:get_attach() then + return false, S("Cannot teleport, @1 " .. + "is attached to an object!", name) + end + teleportee:set_pos(p) + return true, S("Teleporting @1 to @2.", name, core.pos_to_string(p, 1)) +end + +-- Teleports player next to player if possible +local function teleport_to_player(name, target_name) + if name == target_name then + return false, S("One does not teleport to oneself.") + end + local teleportee = core.get_player_by_name(name) + if not teleportee then + return false, S("Cannot get teleportee with name @1.", name) + end + if teleportee:get_attach() then + return false, S("Cannot teleport, @1 " .. + "is attached to an object!", name) + end + local target = core.get_player_by_name(target_name) + if not target then + return false, S("Cannot get target player with name @1.", target_name) + end + local p = find_free_position_near(target:get_pos()) + teleportee:set_pos(p) + return true, S("Teleporting @1 to @2 at @3.", name, target_name, + core.pos_to_string(p, 1)) +end + core.register_chatcommand("teleport", { - params = ",, | | ( ,,) | ( )", - description = "Teleport to position or player", + params = S(",, | | ,, | "), + description = S("Teleport to position or player"), privs = {teleport=true}, func = function(name, param) - -- Returns (pos, true) if found, otherwise (pos, false) - local function find_free_position_near(pos) - local tries = { - {x=1,y=0,z=0}, - {x=-1,y=0,z=0}, - {x=0,y=0,z=1}, - {x=0,y=0,z=-1}, - } - for _, d in ipairs(tries) do - local p = {x = pos.x+d.x, y = pos.y+d.y, z = pos.z+d.z} - local n = core.get_node_or_nil(p) - if n and n.name then - local def = core.registered_nodes[n.name] - if def and not def.walkable then - return p, true - end - end - end - return pos, false + 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 = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") - p.x = tonumber(p.x) - p.y = tonumber(p.y) - p.z = tonumber(p.z) - if p.x and p.y and p.z then - - local lm = 31000 - if p.x < -lm or p.x > lm or p.y < -lm or p.y > lm or p.z < -lm or p.z > lm then - return false, core.colorize("#F35400", "# Illuna: Aww... cannot teleport out of map bounds!") - end - local teleportee = core.get_player_by_name(name) - if teleportee then - if teleportee:get_attach() then - return false, "Can't teleport, you're attached to an object!" - end - teleportee:set_pos(p) - return true, core.colorize("#37CA39", "# Illuna: Aye, Aye! Teleporting to "..core.pos_to_string(p)) - end + 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 local target_name = param:match("^([^ ]+)$") - local teleportee = core.get_player_by_name(name) - - p = nil if target_name then - local target = core.get_player_by_name(target_name) - if target then - p = target:get_pos() - end + return teleport_to_player(name, target_name) end - if teleportee and p then - if teleportee:get_attach() then - return false, "Can't teleport, you're attached to an object!" - end - p = find_free_position_near(p) - teleportee:set_pos(p) - return true, core.colorize("#37CA39", "# Illuna: You got it, teleporting to " .. target_name - .. " at "..core.pos_to_string(p)) - end + local has_bring_priv = core.check_player_privs(name, {bring=true}) + local missing_bring_msg = S("You don't have permission to teleport " .. + "other players (missing privilege: @1).", "bring") - if not core.check_player_privs(name, {bring=true}) then - return false, core.colorize("#F35400", "# Illuna: Aww... you don't have permission to teleport other players (missing bring privilege)") - end - - teleportee = nil - p = {} local teleportee_name + p = {} teleportee_name, p.x, p.y, p.z = param:match( - "^([^ ]+) +([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") - p.x, p.y, p.z = tonumber(p.x), tonumber(p.y), tonumber(p.z) + "^([^ ]+) +([%d.~-]+)[, ] *([%d.~-]+)[, ] *([%d.~-]+)$") if teleportee_name then - teleportee = core.get_player_by_name(teleportee_name) - end - if teleportee and p.x and p.y and p.z then - if teleportee:get_attach() then - return false, "Can't teleport, player is attached to an object!" + local teleportee = core.get_player_by_name(teleportee_name) + if not teleportee then + return end - teleportee:set_pos(p) - return true, core.colorize("#37CA39", "# Illuna: Okey, teleporting " .. teleportee_name - .. " to " .. core.pos_to_string(p)) + 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 + end + return teleport_to_pos(teleportee_name, p) end - teleportee = nil - p = nil teleportee_name, target_name = string.match(param, "^([^ ]+) +([^ ]+)$") - if teleportee_name then - teleportee = core.get_player_by_name(teleportee_name) - end - if target_name then - local target = core.get_player_by_name(target_name) - if target then - p = target:get_pos() + if teleportee_name and target_name then + if not has_bring_priv then + return false, missing_bring_msg end - end - if teleportee and p then - if teleportee:get_attach() then - return false, "Can't teleport, player is attached to an object!" - end - p = find_free_position_near(p) - teleportee:set_pos(p) - return true, core.colorize("#37CA39", "Teleporting " .. teleportee_name - .. " to " .. target_name - .. " at " .. core.pos_to_string(p)) + return teleport_to_player(teleportee_name, target_name) end - return false, core.colorize("#F35400", '# Illuna: I am sorry but you entered invalid parameters ("' .. param - .. '") or the player was not found (try /help teleport)') + return false end, }) core.register_chatcommand("set", { - params = "([-n] ) | ", - description = "Set or read server configuration setting", + params = S("([-n] ) | "), + description = S("Set or read server configuration setting"), privs = {server=true}, func = function(name, param) local arg, setname, setvalue = string.match(param, "(-[n]) ([^ ]+) (.+)") @@ -534,22 +642,28 @@ 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, core.colorize("#F35400", "# Illuna: Failed. Use '/set -n ' to create a new setting.") + return false, S("Failed. Use '/set -n ' " + .. "to create a new setting.") end core.settings:set(setname, setvalue) - return true, setname .. " = " .. setvalue + return true, S("@1 = @2", setname, setvalue) end setname = string.match(param, "([^ ]+)") if setname then setvalue = core.settings:get(setname) if not setvalue then - setvalue = "" + setvalue = S("") end - return true, setname .. " = " .. setvalue + return true, S("@1 = @2", setname, setvalue) end - return false, core.colorize("#F35400", "# Illuna: Invalid parameters (see /help set).") + + return false, S("Invalid parameters (see /help set).") end, }) @@ -562,26 +676,27 @@ local function emergeblocks_callback(pos, action, num_calls_remaining, ctx) if ctx.current_blocks == ctx.total_blocks then core.chat_send_player(ctx.requestor_name, - string.format("# Illuna: Finished emerging %d blocks in %.2fms.", - ctx.total_blocks, (os.clock() - ctx.start_time) * 1000)) + S("Finished emerging @1 blocks in @2ms.", + ctx.total_blocks, + string.format("%.2f", (os.clock() - ctx.start_time) * 1000))) end end local function emergeblocks_progress_update(ctx) if ctx.current_blocks ~= ctx.total_blocks then core.chat_send_player(ctx.requestor_name, - string.format("# Illuna: emergeblocks update: %d/%d blocks emerged (%.1f%%)", + S("emergeblocks update: @1/@2 blocks emerged (@3%)", ctx.current_blocks, ctx.total_blocks, - (ctx.current_blocks / ctx.total_blocks) * 100)) + string.format("%.1f", (ctx.current_blocks / ctx.total_blocks) * 100))) core.after(2, emergeblocks_progress_update, ctx) end end core.register_chatcommand("emergeblocks", { - params = "(here []) | ( )", - description = "Load (or, if nonexistent, generate) map blocks " - .. "contained in area pos1 to pos2 ( and must be in parentheses)", + params = S("(here []) | ( )"), + description = S("Load (or, if nonexistent, generate) map blocks contained in " + .. "area pos1 to pos2 ( and must be in parentheses)"), privs = {server=true}, func = function(name, param) local p1, p2 = parse_range_str(name, param) @@ -599,15 +714,15 @@ core.register_chatcommand("emergeblocks", { core.emerge_area(p1, p2, emergeblocks_callback, context) core.after(2, emergeblocks_progress_update, context) - return true, core.colorize("#37CA39", "# Illuna: Started emerge of area ranging from " .. - core.pos_to_string(p1, 1) .. " to " .. core.pos_to_string(p2, 1)) + return true, S("Started emerge of area ranging from @1 to @2.", + core.pos_to_string(p1, 1), core.pos_to_string(p2, 1)) end, }) core.register_chatcommand("deleteblocks", { - params = "(here []) | ( )", - description = "Delete map blocks contained in area pos1 to pos2 " - .. "( and must be in parentheses)", + params = S("(here []) | ( )"), + description = S("Delete map blocks contained in area pos1 to pos2 " + .. "( and must be in parentheses)"), privs = {server=true}, func = function(name, param) local p1, p2 = parse_range_str(name, param) @@ -616,18 +731,20 @@ core.register_chatcommand("deleteblocks", { end if core.delete_area(p1, p2) then - return true, core.colorize("#37CA39", "Successfully cleared area ranging from " .. - core.pos_to_string(p1, 1) .. " to " .. core.pos_to_string(p2, 1)) + return true, S("Successfully cleared area " + .. "ranging from @1 to @2.", + core.pos_to_string(p1, 1), core.pos_to_string(p2, 1)) else - return false, core.colorize("#F35400", "# Illuna: Failed to clear one or more blocks in area") + return false, S("Failed to clear one or more " + .. "blocks in area.") end end, }) core.register_chatcommand("fixlight", { - params = "(here []) | ( )", - description = "Resets lighting in the area between pos1 and pos2 " - .. "( and must be in parentheses)", + params = S("(here []) | ( )"), + description = S("Resets lighting in the area between pos1 and pos2 " + .. "( and must be in parentheses)"), privs = {server = true}, func = function(name, param) local p1, p2 = parse_range_str(name, param) @@ -636,20 +753,26 @@ core.register_chatcommand("fixlight", { end if core.fix_light(p1, p2) then - return true, "Successfully reset light in the area ranging from " .. - core.pos_to_string(p1, 1) .. " to " .. core.pos_to_string(p2, 1) + return true, S("Successfully reset light in the area " + .. "ranging from @1 to @2.", + core.pos_to_string(p1, 1), core.pos_to_string(p2, 1)) else - return false, "Failed to load one or more blocks in area" + return false, S("Failed to load one or more blocks in area.") end end, }) core.register_chatcommand("mods", { params = "", - description = "List mods installed on the server", + description = S("List mods installed on the server"), privs = {}, func = function(name, param) - return true, table.concat(core.get_modnames(), ", ") + local mods = core.get_modnames() + if #mods == 0 then + return true, S("No mods installed.") + else + return true, table.concat(core.get_modnames(), ", ") + end end, }) @@ -658,117 +781,140 @@ local function handle_give_command(cmd, giver, receiver, stackstring) .. ', stackstring="' .. stackstring .. '"') local itemstack = ItemStack(stackstring) if itemstack:is_empty() then - return false, core.colorize("#F35400", "# Illuna: Cannot give an empty item") + return false, S("Cannot give an empty item.") elseif (not itemstack:is_known()) or (itemstack:get_name() == "unknown") then - return false, core.colorize("#F35400", "# Illuna: Cannot give an unknown item") + return false, S("Cannot give an unknown item.") -- Forbid giving 'ignore' due to unwanted side effects elseif itemstack:get_name() == "ignore" then - return false, "Giving 'ignore' is not allowed" + return false, S("Giving 'ignore' is not allowed.") end local receiverref = core.get_player_by_name(receiver) if receiverref == nil then - return false, core.colorize("#F35400", "# Illuna: " .. receiver .. " is not a known player") + return false, S("@1 is not a known player.", receiver) end local leftover = receiverref:get_inventory():add_item("main", itemstack) local partiality if leftover:is_empty() then - partiality = "" + partiality = nil elseif leftover:get_count() == itemstack:get_count() then - partiality = "could not be " + partiality = false else - partiality = "partially " + partiality = true end -- The actual item stack string may be different from what the "giver" -- entered (e.g. big numbers are always interpreted as 2^16-1). stackstring = itemstack:to_string() - if giver == receiver then - local msg = (core.colorize("#37CA39", "# Illuna: %q %sadded to inventory.")) - return true, msg:format(stackstring, partiality) + local msg + if partiality == true then + msg = S("@1 partially added to inventory.", stackstring) + elseif partiality == false then + msg = S("@1 could not be added to inventory.", stackstring) else - core.chat_send_player(receiver, (core.colorize("#37CA39", "# Illuna: %q %sadded to inventory.")) - :format(stackstring, partiality)) - local msg = (core.colorize("#37CA39", "# Illuna: %q %sadded to %s's inventory.")) - return true, msg:format(stackstring, partiality, receiver) + msg = S("@1 added to inventory.", stackstring) + end + if giver == receiver then + return true, msg + else + core.chat_send_player(receiver, msg) + local msg_other + if partiality == true then + msg_other = S("@1 partially added to inventory of @2.", + stackstring, receiver) + elseif partiality == false then + msg_other = S("@1 could not be added to inventory of @2.", + stackstring, receiver) + else + msg_other = S("@1 added to inventory of @2.", + stackstring, receiver) + end + return true, msg_other end end core.register_chatcommand("give", { - params = " [ []]", - description = "Give item to player", + params = S(" [ []]"), + description = S("Give item to player"), privs = {give=true}, func = function(name, param) local toname, itemstring = string.match(param, "^([^ ]+) +(.+)$") if not toname or not itemstring then - return false, core.colorize("#F35400","# Illuna: Name and ItemString required") + return false, S("Name and ItemString required.") end return handle_give_command("/give", name, toname, itemstring) end, }) core.register_chatcommand("giveme", { - params = " [ []]", - description = "Give item to yourself", + params = S(" [ []]"), + description = S("Give item to yourself"), privs = {give=true}, func = function(name, param) local itemstring = string.match(param, "(.+)$") if not itemstring then - return false, core.colorize("#F35400", "#Illuna: ItemString required") + return false, S("ItemString required.") end return handle_give_command("/giveme", name, name, itemstring) end, }) core.register_chatcommand("spawnentity", { - params = " [,,]", - description = "Spawn entity at given (or your) position", + params = S(" [,,]"), + 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, core.colorize("#F35400", "# Illuna: EntityName required") + return false, S("EntityName required.") end core.log("action", ("%s invokes /spawnentity, entityname=%q") :format(name, entityname)) local player = core.get_player_by_name(name) if player == nil then core.log("error", "Unable to spawn entity, player is nil") - return false, core.colorize("#F35400", "# Illuna: Unable to spawn entity, player is nil") + return false, S("Unable to spawn entity, player is nil.") end if not core.registered_entities[entityname] then - return false, "Cannot spawn an unknown entity" + 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 - return false, core.colorize("#F35400"," # Illuna: Invalid parameters ('" .. param .. "')") + 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 p.y = p.y + 1 local obj = core.add_entity(p, entityname) - local msg = obj and "%q spawned." or "%q failed to spawn." - return true, msg:format(entityname) + if obj then + return true, S("@1 spawned.", entityname) + else + return true, S("@1 failed to spawn.", entityname) + end end, }) core.register_chatcommand("pulverize", { params = "", - description = "Destroy item in hand", + description = S("Destroy item in hand"), func = function(name, param) local player = core.get_player_by_name(name) if not player then core.log("error", "Unable to pulverize, no player.") - return false, core.colorize("#F35400", "# Illuna: Unable to pulverize, no player.") + return false, S("Unable to pulverize, no player.") end local wielded_item = player:get_wielded_item() if wielded_item:is_empty() then - return false, core.colorize("#F35400", "# Illuna: Unable to pulverize, no item in hand.") + return false, S("Unable to pulverize, no item in hand.") end core.log("action", name .. " pulverized \"" .. wielded_item:get_name() .. " " .. wielded_item:get_count() .. "\"") player:set_wielded_item(nil) - return true, "An item was pulverized." + return true, S("An item was pulverized.") end, }) @@ -784,14 +930,15 @@ core.register_on_punchnode(function(pos, node, puncher) end) core.register_chatcommand("rollback_check", { - params = "[] [] []", - description = "Check who last touched a node or a node near it" - .. " within the time specified by . Default: range = 0," - .. " seconds = 86400 = 24h, limit = 5. Set to inf for no time limit", + params = S("[] [] []"), + description = S("Check who last touched a node or a node near it " + .. "within the time specified by . " + .. "Default: range = 0, seconds = 86400 = 24h, limit = 5. " + .. "Set to inf for no time limit"), privs = {rollback=true}, func = function(name, param) if not core.settings:get_bool("enable_rollback_recording") then - return false, "Rollback functions are disabled." + return false, S("Rollback functions are disabled.") end local range, seconds, limit = param:match("(%d+) *(%d*) *(%d*)") @@ -799,30 +946,30 @@ core.register_chatcommand("rollback_check", { seconds = tonumber(seconds) or 86400 limit = tonumber(limit) or 5 if limit > 100 then - return false, core.colorize("#F35400", "# Illuna: That limit is too high!") + return false, S("That limit is too high!") end core.rollback_punch_callbacks[name] = function(pos, node, puncher) local name = puncher:get_player_name() - core.chat_send_player(name, "Checking " .. core.pos_to_string(pos) .. "...") + core.chat_send_player(name, S("Checking @1 ...", core.pos_to_string(pos))) local actions = core.rollback_get_node_actions(pos, range, seconds, limit) if not actions then - core.chat_send_player(name, core.colorize("#F35400", "# Illuna: Rollback functions are disabled")) + core.chat_send_player(name, S("Rollback functions are disabled.")) return end local num_actions = #actions if num_actions == 0 then - core.chat_send_player(name, "Nobody has touched" - .. " the specified location in " - .. seconds .. " seconds") + core.chat_send_player(name, + S("Nobody has touched the specified " + .. "location in @1 seconds.", + seconds)) return end local time = os.time() for i = num_actions, 1, -1 do local action = actions[i] core.chat_send_player(name, - ("%s %s %s -> %s %d seconds ago.") - :format( + S("@1 @2 @3 -> @4 @5 seconds ago.", core.pos_to_string(action.pos), action.actor, action.oldnode.name, @@ -831,189 +978,265 @@ core.register_chatcommand("rollback_check", { end end - return true, "Punch a node (range=" .. range .. ", seconds=" - .. seconds .. "s, limit=" .. limit .. ")" + return true, S("Punch a node (range=@1, seconds=@2, limit=@3).", + range, seconds, limit) end, }) core.register_chatcommand("rollback", { - params = "( []) | (: [])", - description = "Revert actions of a player. Default for is 60. Set to inf for no time limit", + params = S("( []) | (: [])"), + description = S("Revert actions of a player. " + .. "Default for is 60. " + .. "Set to inf for no time limit"), privs = {rollback=true}, func = function(name, param) if not core.settings:get_bool("enable_rollback_recording") then - return false, core.colorize("#F35400", "# Illuna: Rollback functions are disabled.") + return false, S("Rollback functions are disabled.") end local target_name, seconds = string.match(param, ":([^ ]+) *(%d*)") + local rev_msg if not target_name then local player_name player_name, seconds = string.match(param, "([^ ]+) *(%d*)") if not player_name then - return false, core.colorize("#F35400", "# Illuna: Invalid parameters. See /help rollback" - .. " and /help rollback_check.") + return false, S("Invalid parameters. " + .. "See /help rollback and " + .. "/help rollback_check.") end + seconds = tonumber(seconds) or 60 target_name = "player:"..player_name + rev_msg = S("Reverting actions of player '@1' since @2 seconds.", + player_name, seconds) + else + seconds = tonumber(seconds) or 60 + rev_msg = S("Reverting actions of @1 since @2 seconds.", + target_name, seconds) end - seconds = tonumber(seconds) or 60 - core.chat_send_player(name, "Reverting actions of " - .. target_name .. " since " - .. seconds .. " seconds.") + core.chat_send_player(name, rev_msg) local success, log = core.rollback_revert_actions_by( target_name, seconds) local response = "" if #log > 100 then - response = "(log is too long to show)\n" + response = S("(log is too long to show)").."\n" else for _, line in pairs(log) do response = response .. line .. "\n" end end - response = response .. "Reverting actions " - .. (success and "succeeded." or "FAILED.") + if success then + response = response .. S("Reverting actions succeeded.") + else + response = response .. S("Reverting actions FAILED.") + end return success, response end, }) core.register_chatcommand("status", { - description = "Show server status", + description = S("Show server status"), func = function(name, param) - local status = core.colorize("#F6A10A", core.get_server_status(name, false)) + local status = core.get_server_status(name, false) if status and status ~= "" then return true, status end - return false, "This command was disabled by a mod or game" + return false, S("This command was disabled by a mod or game.") 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 = "[<0..23>:<0..59> | <0..24000>]", - description = "Show or set time of day", + params = S("[<0..23>:<0..59> | <0..24000>]"), + description = S("Show or set time of day"), privs = {}, func = function(name, param) if param == "" then local current_time = math.floor(core.get_timeofday() * 1440) local minutes = current_time % 60 local hour = (current_time - minutes) / 60 - return true, ("Current time is %d:%02d"):format(hour, minutes) + return true, S("Current time is @1:@2.", + string.format("%d", hour), + string.format("%02d", minutes)) end local player_privs = core.get_player_privs(name) if not player_privs.settime then - return false, core.colorize("#F35400", "# Illuna: You don't have permission to run this command " .. - "(missing privilege: settime).") + 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) + 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 - return false, core.colorize("#F35400", "# Illuna: Invalid time.") + new_time = tonumber(param) or -1 + else + new_time = new_time % 24000 end - -- Backward compatibility. - core.set_timeofday((new_time % 24000) / 24000) + 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 + core.set_timeofday(new_time / 24000) core.log("action", name .. " sets time to " .. new_time) - return true, core.colorize("#37CA39", "# Illuna: Time of day changed. Please don't do this too often. :-)") + 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, core.colorize("#F35400", "# Illuna: Invalid hour (must be between 0 and 23 inclusive).") - elseif minute < 0 or minute > 59 then - return false, core.colorize("#F35400", "# Illuna: 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, core.colorize("#37CA39", "# Illuna: Time of day changed. Please don't do this too often. :-)") + return true, S("Time of day changed.") end, }) core.register_chatcommand("days", { - description = "Show day count since world creation", + description = S("Show day count since world creation"), func = function(name, param) - return true, "# Illuna: Current day is " .. core.get_day_count() + return true, S("Current day is @1.", core.get_day_count()) end }) +local function parse_shutdown_param(param) + local delay, reconnect, message + local one, two, three + one, two, three = param:match("^(%S+) +(%-r) +(.*)") + if one and two and three then + -- 3 arguments: delay, reconnect and message + return one, two, three + end + -- 2 arguments + one, two = param:match("^(%S+) +(.*)") + if one and two then + if tonumber(one) then + delay = one + if two == "-r" then + reconnect = two + else + message = two + end + elseif one == "-r" then + reconnect, message = one, two + end + return delay, reconnect, message + end + -- 1 argument + one = param:match("(.*)") + if tonumber(one) then + delay = one + elseif one == "-r" then + reconnect = one + else + message = one + end + return delay, reconnect, message +end + core.register_chatcommand("shutdown", { - params = "[ | -1] [reconnect] []", - description = "Shutdown server (-1 cancels a delayed shutdown)", + params = S("[ | -1] [-r] []"), + description = S("Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)"), privs = {server=true}, func = function(name, param) - local delay, reconnect, message - delay, param = param:match("^%s*(%S+)(.*)") - if param then - reconnect, param = param:match("^%s*(%S+)(.*)") + local delay, reconnect, message = parse_shutdown_param(param) + local bool_reconnect = reconnect == "-r" + if not message then + message = "" end - message = param and param:match("^%s*(.+)") or "" delay = tonumber(delay) or 0 if delay == 0 then core.log("action", name .. " shuts down server") - core.chat_send_all("*** Server shutting down (operator request).") + core.chat_send_all("*** "..S("Server shutting down (operator request).")) end - core.request_shutdown(message:trim(), core.is_yes(reconnect), delay) + core.request_shutdown(message:trim(), bool_reconnect, delay) return true end, }) core.register_chatcommand("ban", { - params = "[]", - description = "Ban the IP of a player or show the ban list", + params = S("[]"), + description = S("Ban the IP of a player or show the ban list"), privs = {ban=true}, func = function(name, param) if param == "" then local ban_list = core.get_ban_list() if ban_list == "" then - return true, "The ban list is empty." + return true, S("The ban list is empty.") else - return true, core.colorize("#F6A10A", "# Illuna: Ban list: " .. "Ban list: " .. ban_list) + 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, core.colorize("#F35400", "# Illuna: No such player.") + return false, S("Player is not online.") end if not core.ban_player(param) then - return false, core.colorize("#F35400", "# Illuna: Failed to ban player.") + return false, S("Failed to ban player.") end local desc = core.get_ban_description(param) core.log("action", name .. " bans " .. desc .. ".") - return true, core.colorize("#37CA39", "Banned " .. desc .. ".") + return true, S("Banned @1.", desc) end, }) core.register_chatcommand("unban", { - params = " | ", - description = "Remove IP ban belonging to a player/IP", + params = S(" | "), + description = S("Remove IP ban belonging to a player/IP"), privs = {ban=true}, func = function(name, param) if not core.unban_player_or_ip(param) then - return false, core.colorize("#F35400", "# Illuna: Failed to unban player/IP.") + return false, S("Failed to unban player/IP.") end core.log("action", name .. " unbans " .. param) - return true, core.colorize("#37CA39", "# Illuna: Unbanned " .. param) + return true, S("Unbanned @1.", param) end, }) core.register_chatcommand("kick", { - params = " []", - description = "Kick a player", + params = S(" []"), + description = S("Kick a player"), privs = {kick=true}, func = function(name, param) local tokick, reason = param:match("([^ ]+) (.+)") tokick = tokick or param if not core.kick_player(tokick, reason) then - return false, core.colorize("#F35400", "# Illuna: Failed to kick player " .. tokick) + return false, S("Failed to kick player @1.", tokick) end local log_reason = "" if reason then log_reason = " with reason \"" .. reason .. "\"" end core.log("action", name .. " kicks " .. tokick .. log_reason) - return true, core.colorize("#37CA39", "# Illuna: Kicked " .. tokick) + return true, S("Kicked @1.", tokick) end, }) core.register_chatcommand("clearobjects", { - params = "[full | quick]", - description = "Clear all objects in world", + params = S("[full | quick]"), + description = S("Clear all objects in world"), privs = {server=true}, func = function(name, param) local options = {} @@ -1022,45 +1245,44 @@ core.register_chatcommand("clearobjects", { elseif param == "full" then options.mode = "full" else - return false, core.colorize("#F35400", "# Illuna: Invalid usage, see /help clearobjects.") + return false, S("Invalid usage, see /help clearobjects.") end - core.log("action", name .. " clears all objects (" + core.log("action", name .. " clears objects (" .. options.mode .. " mode).") - core.chat_send_all("Clearing all objects. This may take a long time." - .. " You may experience a timeout. (by " - .. name .. ")") + if options.mode == "full" then + core.chat_send_all(S("Clearing all objects. This may take a long time. " + .. "You may experience a timeout. (by @1)", name)) + end core.clear_objects(options) core.log("action", "Object clearing done.") - core.chat_send_all("*** Cleared all objects.") + core.chat_send_all("*** "..S("Cleared all objects.")) return true end, }) core.register_chatcommand("msg", { - params = " ", - description = "Send a direct message to a player", + params = S(" "), + description = S("Send a direct message to a player"), privs = {shout=true}, func = function(name, param) local sendto, message = param:match("^(%S+)%s(.+)$") if not sendto then - return false, core.colorize("#F35400", "# Illuna: Invalid usage, try /help msg.") + return false, S("Invalid usage, see /help msg.") end if not core.get_player_by_name(sendto) then - return false, core.colorize("#F35400", "# Illuna: The player " .. sendto - .. " is not online.") + return false, S("The player @1 is not online.", sendto) end core.log("action", "DM from " .. name .. " to " .. sendto .. ": " .. message) - core.chat_send_player(sendto, core.colorize("#1EBC9A", "DM from " .. name .. ": " - .. message)) - return true, core.colorize("#37CA39", "Message sent.") + core.chat_send_player(sendto, S("DM from @1: @2", name, message)) + return true, S("Message sent.") end, }) core.register_chatcommand("last-login", { - params = "[]", - description = "Get the last login time of a player or yourself", + params = S("[]"), + description = S("Get the last login time of a player or yourself"), func = function(name, param) if param == "" then param = name @@ -1068,25 +1290,27 @@ core.register_chatcommand("last-login", { local pauth = core.get_auth_handler().get_auth(param) if pauth and pauth.last_login and pauth.last_login ~= -1 then -- Time in UTC, ISO 8601 format - return true, param.."'s last login time was " .. - os.date("!%Y-%m-%dT%H:%M:%SZ", pauth.last_login) + return true, S("@1's last login time was @2.", + param, + os.date("!%Y-%m-%dT%H:%M:%SZ", pauth.last_login)) end - return false, param.."'s last login time is unknown" + return false, S("@1's last login time is unknown.", param) end, }) core.register_chatcommand("clearinv", { - params = "[]", - description = "Clear the inventory of yourself or another player", + params = S("[]"), + description = S("Clear the inventory of yourself or another player"), func = function(name, param) local player if param and param ~= "" and param ~= name then if not core.check_player_privs(name, {server=true}) then - return false, "You don't have permission" - .. " to clear another player's inventory (missing privilege: server)" + return false, S("You don't have permission to " + .. "clear another player's inventory " + .. "(missing privilege: @1).", "server") end player = core.get_player_by_name(param) - core.chat_send_player(param, name.." cleared your inventory.") + core.chat_send_player(param, S("@1 cleared your inventory.", name)) else player = core.get_player_by_name(name) end @@ -1096,38 +1320,38 @@ core.register_chatcommand("clearinv", { player:get_inventory():set_list("craft", {}) player:get_inventory():set_list("craftpreview", {}) core.log("action", name.." clears "..player:get_player_name().."'s inventory") - return true, "Cleared "..player:get_player_name().."'s inventory." + return true, S("Cleared @1's inventory.", player:get_player_name()) else - return false, "Player must be online to clear inventory!" + return false, S("Player must be online to clear inventory!") end end, }) local function handle_kill_command(killer, victim) if core.settings:get_bool("enable_damage") == false then - return false, "Players can't be killed, damage has been disabled." + return false, S("Players can't be killed, damage has been disabled.") end local victimref = core.get_player_by_name(victim) if victimref == nil then - return false, string.format("Player %s is not online.", victim) + return false, S("Player @1 is not online.", victim) elseif victimref:get_hp() <= 0 then if killer == victim then - return false, "You are already dead." + return false, S("You are already dead.") else - return false, string.format("%s is already dead.", victim) + return false, S("@1 is already dead.", victim) end end - if not killer == victim then + if killer ~= victim then core.log("action", string.format("%s killed %s", killer, victim)) end -- Kill victim victimref:set_hp(0) - return true, string.format("%s has been killed.", victim) + return true, S("@1 has been killed.", victim) end core.register_chatcommand("kill", { - params = "[]", - description = "Kill player or yourself", + params = S("[]"), + description = S("Kill player or yourself"), privs = {server=true}, func = function(name, param) return handle_kill_command(name, param == "" and name or param) diff --git a/builtin/game/deprecated.lua b/builtin/game/deprecated.lua index 20f0482eb..c5c7848f5 100644 --- a/builtin/game/deprecated.lua +++ b/builtin/game/deprecated.lua @@ -1,28 +1,5 @@ -- Minetest: builtin/deprecated.lua --- --- Default material types --- -local function digprop_err() - core.log("deprecated", "The core.digprop_* functions are obsolete and need to be replaced by item groups.") -end - -core.digprop_constanttime = digprop_err -core.digprop_stonelike = digprop_err -core.digprop_dirtlike = digprop_err -core.digprop_gravellike = digprop_err -core.digprop_woodlike = digprop_err -core.digprop_leaveslike = digprop_err -core.digprop_glasslike = digprop_err - -function core.node_metadata_inventory_move_allow_all() - core.log("deprecated", "core.node_metadata_inventory_move_allow_all is obsolete and does nothing.") -end - -function core.add_to_creative_inventory(itemstring) - core.log("deprecated", "core.add_to_creative_inventory is obsolete and does nothing.") -end - -- -- EnvRef -- @@ -77,7 +54,7 @@ core.setting_save = setting_proxy("write") function core.register_on_auth_fail(func) core.log("deprecated", "core.register_on_auth_fail " .. - "is obsolete and should be replaced by " .. + "is deprecated and should be replaced by " .. "core.register_on_authplayer instead.") core.register_on_authplayer(function (player_name, ip, is_success) diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua index 4bfcca9e7..d5727f2a7 100644 --- a/builtin/game/falling.lua +++ b/builtin/game/falling.lua @@ -39,7 +39,7 @@ local gravity = tonumber(core.settings:get("movement_gravity")) or 9.81 core.register_entity(":__builtin:falling_node", { initial_properties = { visual = "item", - visual_size = {x = SCALE, y = SCALE, z = SCALE}, + visual_size = vector.new(SCALE, SCALE, SCALE), textures = {}, physical = true, is_visible = false, @@ -96,7 +96,7 @@ core.register_entity(":__builtin:falling_node", { local vsize if def.visual_scale then local s = def.visual_scale - vsize = {x = s, y = s, z = s} + vsize = vector.new(s, s, s) end self.object:set_properties({ is_visible = true, @@ -111,15 +111,21 @@ core.register_entity(":__builtin:falling_node", { itemstring = core.itemstring_with_palette(itemstring, node.param2) end -- FIXME: solution needed for paramtype2 == "leveled" - local vsize - if def.visual_scale then - local s = def.visual_scale * SCALE - vsize = {x = s, y = s, z = s} + -- Calculate size of falling node + local s = {} + s.x = (def.visual_scale or 1) * SCALE + s.y = s.x + s.z = s.x + -- Compensate for wield_scale + if def.wield_scale then + s.x = s.x / def.wield_scale.x + s.y = s.y / def.wield_scale.y + s.z = s.z / def.wield_scale.z end self.object:set_properties({ is_visible = true, wield_item = itemstring, - visual_size = vsize, + visual_size = s, glow = def.light_source, }) end @@ -127,7 +133,7 @@ core.register_entity(":__builtin:falling_node", { -- Set collision box (certain nodeboxes only for now) local nb_types = {fixed=true, leveled=true, connected=true} if def.drawtype == "nodebox" and def.node_box and - nb_types[def.node_box.type] then + nb_types[def.node_box.type] and def.node_box.fixed then local box = table.copy(def.node_box.fixed) if type(box[1]) == "table" then box = #box == 1 and box[1] or nil -- We can only use a single box @@ -145,32 +151,49 @@ core.register_entity(":__builtin:falling_node", { -- Rotate entity if def.drawtype == "torchlike" then self.object:set_yaw(math.pi*0.25) - elseif (node.param2 ~= 0 and (def.wield_image == "" - or def.wield_image == nil)) + elseif ((node.param2 ~= 0 or def.drawtype == "nodebox" or def.drawtype == "mesh") + and (def.wield_image == "" or def.wield_image == nil)) or def.drawtype == "signlike" or def.drawtype == "mesh" 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 - elseif (def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted") then + 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 + if (def.drawtype == "signlike" and def.paramtype2 ~= "wallmounted" and def.paramtype2 ~= "colorwallmounted") then + -- Change rotation to "floor" by default for non-wallmounted paramtype2 + rot = 1 + end local pitch, yaw, roll = 0, 0, 0 - if rot == 1 then - pitch, yaw = math.pi, math.pi - elseif rot == 2 then - pitch, yaw = math.pi/2, math.pi/2 - elseif rot == 3 then - pitch, yaw = math.pi/2, -math.pi/2 - elseif rot == 4 then - pitch, yaw = math.pi/2, math.pi - elseif rot == 5 then - pitch, yaw = math.pi/2, 0 + if def.drawtype == "nodebox" or def.drawtype == "mesh" then + if rot == 0 then + pitch, yaw = math.pi/2, 0 + elseif rot == 1 then + pitch, yaw = -math.pi/2, math.pi + elseif rot == 2 then + pitch, yaw = 0, math.pi/2 + elseif rot == 3 then + pitch, yaw = 0, -math.pi/2 + elseif rot == 4 then + pitch, yaw = 0, math.pi + end + else + if rot == 1 then + pitch, yaw = math.pi, math.pi + elseif rot == 2 then + pitch, yaw = math.pi/2, math.pi/2 + elseif rot == 3 then + pitch, yaw = math.pi/2, -math.pi/2 + elseif rot == 4 then + pitch, yaw = math.pi/2, math.pi + elseif rot == 5 then + pitch, yaw = math.pi/2, 0 + end end if def.drawtype == "signlike" then pitch = pitch - math.pi/2 @@ -179,7 +202,7 @@ core.register_entity(":__builtin:falling_node", { elseif rot == 1 then yaw = yaw - math.pi/2 end - elseif def.drawtype == "mesh" or def.drawtype == "normal" then + elseif def.drawtype == "mesh" or def.drawtype == "normal" or def.drawtype == "nodebox" then if rot >= 0 and rot <= 1 then roll = roll + math.pi else @@ -187,6 +210,14 @@ core.register_entity(":__builtin:falling_node", { end end self.object:set_rotation({x=pitch, y=yaw, z=roll}) + elseif (def.drawtype == "mesh" and def.paramtype2 == "degrotate") then + local p2 = (node.param2 - (def.place_param2 or 0)) % 240 + local yaw = (p2 / 240) * (math.pi * 2) + self.object:set_yaw(yaw) + elseif (def.drawtype == "mesh" and def.paramtype2 == "colordegrotate") then + local p2 = (node.param2 % 32 - (def.place_param2 or 0) % 32) % 24 + local yaw = (p2 / 24) * (math.pi * 2) + self.object:set_yaw(yaw) end end end, @@ -201,7 +232,7 @@ core.register_entity(":__builtin:falling_node", { on_activate = function(self, staticdata) self.object:set_armor_groups({immortal = 1}) - self.object:set_acceleration({x = 0, y = -gravity, z = 0}) + self.object:set_acceleration(vector.new(0, -gravity, 0)) local ds = core.deserialize(staticdata) if ds and ds.node then @@ -231,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) @@ -277,7 +308,7 @@ core.register_entity(":__builtin:falling_node", { if self.floats then local pos = self.object:get_pos() - local bcp = vector.round({x = pos.x, y = pos.y - 0.7, z = pos.z}) + local bcp = pos:offset(0, -0.7, 0):round() local bcn = core.get_node(bcp) local bcd = core.registered_nodes[bcn.name] @@ -318,13 +349,12 @@ core.register_entity(":__builtin:falling_node", { -- TODO: this hack could be avoided in the future if objects -- could choose who to collide with local vel = self.object:get_velocity() - self.object:set_velocity({ - x = vel.x, - y = player_collision.old_velocity.y, - z = vel.z - }) - self.object:set_pos(vector.add(self.object:get_pos(), - {x = 0, y = -0.5, z = 0})) + self.object:set_velocity(vector.new( + vel.x, + player_collision.old_velocity.y, + vel.z + )) + self.object:set_pos(self.object:get_pos():offset(0, -0.5, 0)) end return elseif bcn.name == "ignore" then @@ -386,7 +416,7 @@ local function convert_to_falling_node(pos, node) obj:get_luaentity():set_node(node, metatable) core.remove_node(pos) - return true + return true, obj end function core.spawn_falling_node(pos) @@ -404,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 = {x=p.x, y=p.y, z=p.z} + 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 @@ -429,14 +459,14 @@ end function builtin_shared.check_attached_node(p, n) local def = core.registered_nodes[n.name] - local d = {x = 0, y = 0, z = 0} + 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 -- to voxelmanip placing a wallmounted node without resetting a -- pre-existing param2 value that is out-of-range for wallmounted. -- The fallback vector corresponds to param2 = 0. - d = core.wallmounted_to_dir(n.param2) or {x = 0, y = 1, z = 0} + d = core.wallmounted_to_dir(n.param2) or vector.new(0, 1, 0) else d.y = -1 end @@ -456,7 +486,7 @@ end function core.check_single_for_falling(p) local n = core.get_node(p) if core.get_item_group(n.name, "falling_node") ~= 0 then - local p_bottom = {x = p.x, y = p.y - 1, z = p.z} + local p_bottom = vector.offset(p, 0, -1, 0) -- Only spawn falling node if node below is loaded local n_bottom = core.get_node_or_nil(p_bottom) local d_bottom = n_bottom and core.registered_nodes[n_bottom.name] @@ -495,17 +525,17 @@ end -- Down first as likely case, but always before self. The same with sides. -- Up must come last, so that things above self will also fall all at once. local check_for_falling_neighbors = { - {x = -1, y = -1, z = 0}, - {x = 1, y = -1, z = 0}, - {x = 0, y = -1, z = -1}, - {x = 0, y = -1, z = 1}, - {x = 0, y = -1, z = 0}, - {x = -1, y = 0, z = 0}, - {x = 1, y = 0, z = 0}, - {x = 0, y = 0, z = 1}, - {x = 0, y = 0, z = -1}, - {x = 0, y = 0, z = 0}, - {x = 0, y = 1, z = 0}, + vector.new(-1, -1, 0), + vector.new( 1, -1, 0), + vector.new( 0, -1, -1), + vector.new( 0, -1, 1), + 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), + vector.new( 0, 0, 0), + vector.new( 0, 1, 0), } function core.check_for_falling(p) diff --git a/builtin/game/features.lua b/builtin/game/features.lua index a15475333..896a893b2 100644 --- a/builtin/game/features.lua +++ b/builtin/game/features.lua @@ -17,6 +17,14 @@ core.features = { area_store_persistent_ids = true, pathfinder_works = true, object_step_has_moveresult = true, + direct_velocity_on_players = true, + 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, + get_light_data_buffer = true, } function core.has_feature(arg) diff --git a/builtin/game/forceloading.lua b/builtin/game/forceloading.lua index e1e00920c..8043e5dea 100644 --- a/builtin/game/forceloading.lua +++ b/builtin/game/forceloading.lua @@ -86,12 +86,6 @@ local function read_file(filename) return core.deserialize(t) or {} end -local function write_file(filename, table) - local f = io.open(filename, "w") - f:write(core.serialize(table)) - f:close() -end - blocks_forceloaded = read_file(wpath.."/force_loaded.txt") for _, __ in pairs(blocks_forceloaded) do total_forceloaded = total_forceloaded + 1 @@ -106,7 +100,8 @@ end) -- persists the currently forceloaded blocks to disk local function persist_forceloaded_blocks() - write_file(wpath.."/force_loaded.txt", blocks_forceloaded) + local data = core.serialize(blocks_forceloaded) + core.safe_file_write(wpath.."/force_loaded.txt", data) end -- periodical forceload persistence diff --git a/builtin/game/init.lua b/builtin/game/init.lua index 1d62be019..d7606f357 100644 --- a/builtin/game/init.lua +++ b/builtin/game/init.lua @@ -7,9 +7,8 @@ local gamepath = scriptpath .. "game".. DIR_DELIM -- not exposed to outer context local builtin_shared = {} -dofile(commonpath .. "vector.lua") - dofile(gamepath .. "constants.lua") +dofile(gamepath .. "item_s.lua") assert(loadfile(gamepath .. "item.lua"))(builtin_shared) dofile(gamepath .. "register.lua") @@ -18,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") @@ -34,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 f680ce0d4..00601c68c 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,140 +28,16 @@ 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 +local function has_all_groups(tbl, required_groups) + if type(required_groups) == "string" then + return (tbl[required_groups] or 0) ~= 0 + end + for _, group in ipairs(required_groups) do + if (tbl[group] or 0) == 0 then + return false end end -end - --- Table of possible dirs -local facedir_to_dir = { - {x= 0, y=0, z= 1}, - {x= 1, y=0, z= 0}, - {x= 0, y=0, z=-1}, - {x=-1, y=0, z= 0}, - {x= 0, y=-1, z= 0}, - {x= 0, y=1, z= 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] = {x = 0, y = 1, z = 0}, - {x = 0, y = -1, z = 0}, - {x = 1, y = 0, z = 0}, - {x = -1, y = 0, z = 0}, - {x = 0, y = 0, z = 1}, - {x = 0, y = 0, z = -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 {x = -math.sin(yaw), y = 0, z = math.cos(yaw)} -end - -function core.is_colored_paramtype(ptype) - return (ptype == "color") or (ptype == "colorfacedir") or - (ptype == "colorwallmounted") -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 - end - -- paramtype2 == "color" requires no modification. - return param2 + return true end function core.get_node_drops(node, toolname) @@ -212,7 +79,7 @@ function core.get_node_drops(node, toolname) if item.rarity ~= nil then good_rarity = item.rarity < 1 or math.random(item.rarity) == 1 end - if item.tools ~= nil then + if item.tools ~= nil or item.tool_groups ~= nil then good_tool = false end if item.tools ~= nil and toolname then @@ -227,6 +94,27 @@ function core.get_node_drops(node, toolname) end end end + if item.tool_groups ~= nil and toolname then + local tooldef = core.registered_items[toolname] + if tooldef ~= nil and type(tooldef.groups) == "table" then + if type(item.tool_groups) == "string" then + -- tool_groups can be a string which specifies the required group + good_tool = core.get_item_group(toolname, item.tool_groups) ~= 0 + else + -- tool_groups can be a list of sufficient requirements. + -- i.e. if any item in the list can be satisfied then the tool is good + assert(type(item.tool_groups) == "table") + for _, required_groups in ipairs(item.tool_groups) do + -- required_groups can be either a string (a single group), + -- or an array of strings where all must be in tooldef.groups + good_tool = has_all_groups(tooldef.groups, required_groups) + if good_tool then + break + end + end + end + end + end if good_rarity and good_tool then got_count = got_count + 1 for _, add_item in ipairs(item.items) do @@ -288,12 +176,12 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2, end -- Place above pointed node - local place_to = {x = above.x, y = above.y, z = above.z} + 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 = {x = under.x, y = under.y, z = under.z} + place_to = vector.copy(under) end if core.is_protected(place_to, playername) then @@ -313,22 +201,14 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2, newnode.param2 = def.place_param2 elseif (def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted") and not param2 then - local dir = { - x = under.x - above.x, - y = under.y - above.y, - z = under.z - above.z - } + local dir = vector.subtract(under, above) newnode.param2 = core.dir_to_wallmounted(dir) -- Calculate the direction for furnaces and chests and stuff elseif (def.paramtype2 == "facedir" or def.paramtype2 == "colorfacedir") and not param2 then local placer_pos = placer and placer:get_pos() if placer_pos then - local dir = { - x = above.x - placer_pos.x, - y = above.y - placer_pos.y, - z = above.z - placer_pos.z - } + local dir = vector.subtract(above, placer_pos) newnode.param2 = core.dir_to_facedir(dir) log("info", "facedir: " .. newnode.param2) end @@ -345,6 +225,8 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2, color_divisor = 8 elseif def.paramtype2 == "colorfacedir" then color_divisor = 32 + elseif def.paramtype2 == "colordegrotate" then + color_divisor = 32 end if color_divisor then local color = math.floor(metatable.palette_index / color_divisor) @@ -380,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 = {x=place_to.x, y=place_to.y, z=place_to.z} + 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 @@ -391,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 = {x=place_to.x, y=place_to.y, z=place_to.z} + 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) @@ -470,34 +352,41 @@ function core.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed return result end end + -- read definition before potentially emptying the stack local def = itemstack:get_definition() - if itemstack:take_item() ~= nil then - user:set_hp(user:get_hp() + hp_change) + if itemstack:take_item():is_empty() then + return itemstack + end - if def and def.sound and def.sound.eat then - core.sound_play(def.sound.eat, { - pos = user:get_pos(), - max_hear_distance = 16 - }, true) - end + if def and def.sound and def.sound.eat then + core.sound_play(def.sound.eat, { + pos = user:get_pos(), + max_hear_distance = 16 + }, true) + end - if replace_with_item then - if itemstack:is_empty() then - itemstack:add_item(replace_with_item) + -- Changing hp might kill the player causing mods to do who-knows-what to the + -- inventory, so do this before set_hp(). + if replace_with_item then + if itemstack:is_empty() then + itemstack:add_item(replace_with_item) + else + local inv = user:get_inventory() + -- Check if inv is null, since non-players don't have one + if inv and inv:room_for_item("main", {name=replace_with_item}) then + inv:add_item("main", replace_with_item) else - local inv = user:get_inventory() - -- Check if inv is null, since non-players don't have one - if inv and inv:room_for_item("main", {name=replace_with_item}) then - inv:add_item("main", replace_with_item) - else - local pos = user:get_pos() - pos.y = math.floor(pos.y + 0.5) - core.add_item(pos, replace_with_item) - end + local pos = user:get_pos() + pos.y = math.floor(pos.y + 0.5) + core.add_item(pos, replace_with_item) end end end - return itemstack + user:set_wielded_item(itemstack) + + user:set_hp(user:get_hp() + hp_change) + + return nil -- don't overwrite wield item a second time end function core.item_eat(hp_change, replace_with_item) @@ -512,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) @@ -537,11 +426,11 @@ function core.handle_node_drops(pos, drops, digger) for _, dropped_item in pairs(drops) do local left = give_item(dropped_item) if not left:is_empty() then - local p = { - x = pos.x + math.random()/2-0.25, - y = pos.y + math.random()/2-0.25, - z = pos.z + math.random()/2-0.25, - } + local p = vector.offset(pos, + math.random()/2-0.25, + math.random()/2-0.25, + math.random()/2-0.25 + ) core.add_item(p, left) end end @@ -551,12 +440,13 @@ function core.node_dig(pos, node, digger) local diggername = user_name(digger) local log = make_log(diggername) 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(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)) - return + return false end if core.is_protected(pos, diggername) then @@ -565,7 +455,7 @@ function core.node_dig(pos, node, digger) .. " at protected position " .. core.pos_to_string(pos)) core.record_protection_violation(pos, diggername) - return + return false end log('action', diggername .. " digs " @@ -577,7 +467,7 @@ function core.node_dig(pos, node, digger) if wielded then local wdef = wielded:get_definition() local tp = wielded:get_tool_capabilities() - local dp = core.get_dig_params(def and def.groups, tp) + local dp = core.get_dig_params(def and def.groups, tp, wielded:get_wear()) if wdef and wdef.after_use then wielded = wdef.after_use(wielded, digger, node, dp) or wielded else @@ -599,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 = {x=pos.x, y=pos.y, z=pos.z} + 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 @@ -631,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 = {x=pos.x, y=pos.y, z=pos.z} + 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 @@ -639,15 +529,15 @@ function core.node_dig(pos, node, digger) -- Run script hook for _, callback in ipairs(core.registered_on_dignodes) do local origin = core.callback_origins[callback] - if origin then - core.set_last_run_mod(origin.mod) - end + core.set_last_run_mod(origin.mod) -- Copy pos and node because callback can modify them - local pos_copy = {x=pos.x, y=pos.y, z=pos.z} + 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 + + return true end function core.itemstring_with_palette(item, palette_index) @@ -675,7 +565,7 @@ end -- Item definition defaults -- -local default_stack_max = tonumber(minetest.settings:get("default_stack_max")) or 99 +local default_stack_max = tonumber(core.settings:get("default_stack_max")) or 99 core.nodedef_default = { -- Item properties @@ -685,7 +575,7 @@ core.nodedef_default = { groups = {}, inventory_image = "", wield_image = "", - wield_scale = {x=1,y=1,z=1}, + wield_scale = vector.new(1, 1, 1), stack_max = default_stack_max, usable = false, liquids_pointable = false, @@ -704,21 +594,11 @@ core.nodedef_default = { on_receive_fields = nil, - on_metadata_inventory_move = core.node_metadata_inventory_move_allow_all, - on_metadata_inventory_offer = core.node_metadata_inventory_offer_allow_all, - on_metadata_inventory_take = core.node_metadata_inventory_take_allow_all, - -- 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}, - --}, - alpha = 255, + tiles = nil, + special_tiles = nil, post_effect_color = {a=0, r=0, g=0, b=0}, paramtype = "none", paramtype2 = "none", @@ -749,7 +629,7 @@ core.craftitemdef_default = { groups = {}, inventory_image = "", wield_image = "", - wield_scale = {x=1,y=1,z=1}, + wield_scale = vector.new(1, 1, 1), stack_max = default_stack_max, liquids_pointable = false, tool_capabilities = nil, @@ -768,7 +648,7 @@ core.tooldef_default = { groups = {}, inventory_image = "", wield_image = "", - wield_scale = {x=1,y=1,z=1}, + wield_scale = vector.new(1, 1, 1), stack_max = 1, liquids_pointable = false, tool_capabilities = nil, @@ -787,7 +667,7 @@ core.noneitemdef_default = { -- This is used for the hand and unknown items groups = {}, inventory_image = "", wield_image = "", - wield_scale = {x=1,y=1,z=1}, + wield_scale = vector.new(1, 1, 1), stack_max = default_stack_max, liquids_pointable = false, tool_capabilities = nil, 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/knockback.lua b/builtin/game/knockback.lua index b5c4cbc5a..a937aa186 100644 --- a/builtin/game/knockback.lua +++ b/builtin/game/knockback.lua @@ -42,5 +42,5 @@ core.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool return -- barely noticeable, so don't even send end - player:add_player_velocity(kdir) + player:add_velocity(kdir) end) diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua index 5e6a4b4b5..c48470bfe 100644 --- a/builtin/game/misc.lua +++ b/builtin/game/misc.lua @@ -1,9 +1,21 @@ -- Minetest: builtin/misc.lua +local S = core.get_translator("__builtin") + -- -- Misc. API functions -- +-- @spec core.kick_player(String, String) :: Boolean +function core.kick_player(player_name, reason) + if type(reason) == "string" then + reason = "Kicked: " .. reason + else + reason = "Kicked." + end + return core.disconnect_player(player_name, reason) +end + function core.check_player_privs(name, ...) if core.is_player(name) then name = name:get_player_name() @@ -49,12 +61,12 @@ timeout = {" Ran out of memory?", " Client died by servers awesomeness?", " Lid function core.send_join_message(player_name) if not core.is_singleplayer() then - core.chat_send_all(core.colorize("#4ec44e", "➡ ")..core.colorize("#c44eb5", greet[math.random(1,#greet)]..core.colorize("#a74ec4",player_name)..core.colorize("#c44eb5", " joined the game! "..hint[math.random(1,#hint)]))) + core.chat_send_all(core.colorize("#4ec44e", "➡ ") .. S(core.colorize("#c44eb5", greet[math.random(1,#greet)]..core.colorize("#a74ec4", "@1")..core.colorize("#c44eb5", " joined the game! "..hint[math.random(1,#hint)]))), player_name) end end function core.send_leave_message(player_name, timed_out) - local announcement = core.colorize("#c44e4e", "⬅ ")..core.colorize("#c44eb5", bye[math.random(1,#bye)]..core.colorize("#a74ec4",player_name)..core.colorize("#c44eb5", " left the game.")) + local announcement = core.colorize("#c44e4e", "⬅ ").. S(core.colorize("#c44eb5", bye[math.random(1,#bye)]..core.colorize("#a74ec4", "@1")..core.colorize("#c44eb5", " left the game.")), player_name) if timed_out then announcement = announcement..core.colorize("#c44eb5"," Timed out."..timeout[math.random(1,#timeout)]) end @@ -114,48 +126,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 pos = {} - pos.x = (hash % 65536) - 32768 - hash = math.floor(hash / 65536) - pos.y = (hash % 65536) - 32768 - hash = math.floor(hash / 65536) - pos.z = (hash % 65536) - 32768 - return pos -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 - - -- To be overriden by protection mods function core.is_protected(pos, name) @@ -212,7 +182,7 @@ function core.is_area_protected(minp, maxp, player_name, interval) local y = math.floor(yf + 0.5) for xf = minp.x, maxp.x, d.x do local x = math.floor(xf + 0.5) - local pos = {x = x, y = y, z = z} + local pos = vector.new(x, y, z) if core.is_protected(pos, player_name) then return pos end @@ -238,7 +208,7 @@ end -- HTTP callback interface -function core.http_add_fetch(httpenv) +core.set_http_api_lua(function(httpenv) httpenv.fetch = function(req, callback) local handle = httpenv.fetch_async(req) @@ -254,7 +224,8 @@ function core.http_add_fetch(httpenv) end return httpenv -end +end) +core.set_http_api_lua = nil function core.close_formspec(player_name, formname) @@ -265,3 +236,36 @@ end function core.cancel_shutdown_requests() core.request_shutdown("", false, -1) end + + +-- Used for callback handling with dynamic_add_media +core.dynamic_media_callbacks = {} + + +-- Transfer of certain globals into async environment +-- see builtin/async/game.lua for the other side + +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 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 + +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/privileges.lua b/builtin/game/privileges.lua index c7417d2f4..2ff4c093c 100644 --- a/builtin/game/privileges.lua +++ b/builtin/game/privileges.lua @@ -1,5 +1,7 @@ -- Minetest: builtin/privileges.lua +local S = core.get_translator("__builtin") + -- -- Privileges -- @@ -15,7 +17,7 @@ function core.register_privilege(name, param) def.give_to_admin = def.give_to_singleplayer end if def.description == nil then - def.description = "(no description)" + def.description = S("(no description)") end end local def @@ -28,71 +30,76 @@ function core.register_privilege(name, param) core.registered_privileges[name] = def end -core.register_privilege("interact", "Can interact with things and modify the world") -core.register_privilege("shout", "Can speak in chat") -core.register_privilege("basic_privs", "Can modify 'shout' and 'interact' privileges") -core.register_privilege("privs", "Can modify privileges") +core.register_privilege("interact", S("Can interact with things and modify the world")) +core.register_privilege("shout", S("Can speak in chat")) + +local basic_privs = + core.string_to_privs((core.settings:get("basic_privs") or "shout,interact")) +local basic_privs_desc = S("Can modify basic privileges (@1)", + core.privs_to_string(basic_privs, ', ')) +core.register_privilege("basic_privs", basic_privs_desc) + +core.register_privilege("privs", S("Can modify privileges")) core.register_privilege("teleport", { - description = "Can teleport self", + description = S("Can teleport self"), give_to_singleplayer = false, }) core.register_privilege("bring", { - description = "Can teleport other players", + description = S("Can teleport other players"), give_to_singleplayer = false, }) core.register_privilege("settime", { - description = "Can set the time of day using /time", + description = S("Can set the time of day using /time"), give_to_singleplayer = false, }) core.register_privilege("server", { - description = "Can do server maintenance stuff", + description = S("Can do server maintenance stuff"), give_to_singleplayer = false, give_to_admin = true, }) core.register_privilege("protection_bypass", { - description = "Can bypass node protection in the world", + description = S("Can bypass node protection in the world"), give_to_singleplayer = false, }) core.register_privilege("ban", { - description = "Can ban and unban players", + description = S("Can ban and unban players"), give_to_singleplayer = false, give_to_admin = true, }) core.register_privilege("kick", { - description = "Can kick players", + description = S("Can kick players"), give_to_singleplayer = false, give_to_admin = true, }) core.register_privilege("give", { - description = "Can use /give and /giveme", + description = S("Can use /give and /giveme"), give_to_singleplayer = false, }) core.register_privilege("password", { - description = "Can use /setpassword and /clearpassword", + description = S("Can use /setpassword and /clearpassword"), give_to_singleplayer = false, give_to_admin = true, }) core.register_privilege("fly", { - description = "Can use fly mode", + description = S("Can use fly mode"), give_to_singleplayer = false, }) core.register_privilege("fast", { - description = "Can use fast mode", + description = S("Can use fast mode"), give_to_singleplayer = false, }) core.register_privilege("noclip", { - description = "Can fly through solid nodes using noclip mode", + description = S("Can fly through solid nodes using noclip mode"), give_to_singleplayer = false, }) core.register_privilege("rollback", { - description = "Can use the rollback functionality", + description = S("Can use the rollback functionality"), give_to_singleplayer = false, }) core.register_privilege("debug", { - description = "Allows enabling various debug options that may affect gameplay", + description = S("Can enable wireframe"), give_to_singleplayer = false, - give_to_admin = true, }) core.register_can_bypass_userlimit(function(name, ip) diff --git a/builtin/game/register.lua b/builtin/game/register.lua index 1034d4f2b..8b6f5b990 100644 --- a/builtin/game/register.lua +++ b/builtin/game/register.lua @@ -1,4 +1,6 @@ --- Minetest: builtin/misc_register.lua +-- Minetest: builtin/register.lua + +local S = core.get_translator("__builtin") -- -- Make raw registration functions inaccessible to anyone except this file @@ -301,14 +303,16 @@ end function core.on_craft(itemstack, player, old_craft_list, craft_inv) for _, func in ipairs(core.registered_on_crafts) do - itemstack = func(itemstack, player, old_craft_list, craft_inv) or itemstack + -- cast to ItemStack since func() could return a string + itemstack = ItemStack(func(itemstack, player, old_craft_list, craft_inv) or itemstack) end return itemstack end function core.craft_predict(itemstack, player, old_craft_list, craft_inv) for _, func in ipairs(core.registered_craft_predicts) do - itemstack = func(itemstack, player, old_craft_list, craft_inv) or itemstack + -- cast to ItemStack since func() could return a string + itemstack = ItemStack(func(itemstack, player, old_craft_list, craft_inv) or itemstack) end return itemstack end @@ -320,20 +324,13 @@ for name in pairs(forbidden_item_names) do register_alias_raw(name, "") end - --- Obsolete: --- Aliases for core.register_alias (how ironic...) --- core.alias_node = core.register_alias --- core.alias_tool = core.register_alias --- core.alias_craftitem = core.register_alias - -- -- Built-in node definitions. Also defined in C. -- core.register_item(":unknown", { type = "none", - description = "Unknown Item", + description = S("Unknown Item"), inventory_image = "unknown_item.png", on_place = core.item_place, on_secondary_use = core.item_secondary_use, @@ -343,7 +340,7 @@ core.register_item(":unknown", { }) core.register_node(":air", { - description = "Air", + description = S("Air"), inventory_image = "air.png", wield_image = "air.png", drawtype = "airlike", @@ -360,7 +357,7 @@ core.register_node(":air", { }) core.register_node(":ignore", { - description = "Ignore", + description = S("Ignore"), inventory_image = "ignore.png", wield_image = "ignore.png", drawtype = "airlike", @@ -373,11 +370,12 @@ core.register_node(":ignore", { air_equivalent = true, drop = "", groups = {not_in_creative_inventory=1}, + node_placement_prediction = "", on_place = function(itemstack, placer, pointed_thing) core.chat_send_player( placer:get_player_name(), core.colorize("#FF0000", - "You can't place 'ignore' nodes!")) + S("You can't place 'ignore' nodes!"))) return "" end, }) @@ -407,8 +405,14 @@ function core.override_item(name, redefinition) register_item_raw(item) end - -core.callback_origins = {} +do + local default = {mod = "??", name = "??"} + core.callback_origins = setmetatable({}, { + __index = function() + return default + end + }) +end function core.run_callbacks(callbacks, mode, ...) assert(type(callbacks) == "table") @@ -423,9 +427,7 @@ function core.run_callbacks(callbacks, mode, ...) local ret = nil for i = 1, cb_len do local origin = core.callback_origins[callbacks[i]] - if origin then - core.set_last_run_mod(origin.mod) - end + core.set_last_run_mod(origin.mod) local cb_ret = callbacks[i](...) if mode == 0 and i == 1 then @@ -584,6 +586,7 @@ core.unregister_biome = make_wrap_deregistration(core.register_biome, core.clear_registered_biomes, core.registered_biomes) core.registered_on_chat_messages, core.register_on_chat_message = make_registration() +core.registered_on_chatcommands, core.register_on_chatcommand = make_registration() core.registered_globalsteps, core.register_globalstep = make_registration() core.registered_playerevents, core.register_playerevent = make_registration() core.registered_on_mods_loaded, core.register_on_mods_loaded = make_registration() @@ -612,6 +615,8 @@ core.registered_can_bypass_userlimit, core.register_can_bypass_userlimit = make_ core.registered_on_modchannel_message, core.register_on_modchannel_message = make_registration() core.registered_on_player_inventory_actions, core.register_on_player_inventory_action = make_registration() core.registered_allow_player_inventory_actions, core.register_allow_player_inventory_action = make_registration() +core.registered_on_rightclickplayers, core.register_on_rightclickplayer = make_registration() +core.registered_on_liquid_transformed, core.register_on_liquid_transformed = make_registration() -- -- Compatibility for on_mapgen_init() diff --git a/builtin/game/statbars.lua b/builtin/game/statbars.lua index d192029c5..78d1d2728 100644 --- a/builtin/game/statbars.lua +++ b/builtin/game/statbars.lua @@ -1,39 +1,39 @@ -- cache setting local enable_damage = core.settings:get_bool("enable_damage") -local health_bar_definition = { - hud_elem_type = "statbar", - position = {x = 0.5, y = 1}, - text = "heart.png", - text2 = "heart_gone.png", - number = core.PLAYER_MAX_HP_DEFAULT, - item = core.PLAYER_MAX_HP_DEFAULT, - direction = 0, - size = {x = 24, y = 24}, - offset = {x = (-10 * 24) - 25, y = -(48 + 24 + 16)}, -} - -local breath_bar_definition = { - hud_elem_type = "statbar", - position = {x = 0.5, y = 1}, - text = "bubble.png", - text2 = "bubble_gone.png", - number = core.PLAYER_MAX_BREATH_DEFAULT, - item = core.PLAYER_MAX_BREATH_DEFAULT * 2, - direction = 0, - size = {x = 24, y = 24}, - offset = {x = 25, y= -(48 + 24 + 16)}, +local bar_definitions = { + hp = { + hud_elem_type = "statbar", + position = {x = 0.5, y = 1}, + text = "heart.png", + text2 = "heart_gone.png", + number = core.PLAYER_MAX_HP_DEFAULT, + item = core.PLAYER_MAX_HP_DEFAULT, + direction = 0, + size = {x = 24, y = 24}, + offset = {x = (-10 * 24) - 25, y = -(48 + 24 + 16)}, + }, + breath = { + hud_elem_type = "statbar", + position = {x = 0.5, y = 1}, + text = "bubble.png", + text2 = "bubble_gone.png", + number = core.PLAYER_MAX_BREATH_DEFAULT * 2, + item = core.PLAYER_MAX_BREATH_DEFAULT * 2, + direction = 0, + size = {x = 24, y = 24}, + offset = {x = 25, y= -(48 + 24 + 16)}, + }, } local hud_ids = {} -local function scaleToDefault(player, field) - -- Scale "hp" or "breath" to the default dimensions +local function scaleToHudMax(player, field) + -- Scale "hp" or "breath" to the hud maximum dimensions local current = player["get_" .. field](player) - local nominal = core["PLAYER_MAX_" .. field:upper() .. "_DEFAULT"] - local max_display = math.max(nominal, - math.max(player:get_properties()[field .. "_max"], current)) - return current / max_display * nominal + local nominal = bar_definitions[field].item + local max_display = math.max(player:get_properties()[field .. "_max"], current) + return math.ceil(current / max_display * nominal) end local function update_builtin_statbars(player) @@ -55,9 +55,9 @@ local function update_builtin_statbars(player) local immortal = player:get_armor_groups().immortal == 1 if flags.healthbar and enable_damage and not immortal then - local number = scaleToDefault(player, "hp") + local number = scaleToHudMax(player, "hp") if hud.id_healthbar == nil then - local hud_def = table.copy(health_bar_definition) + local hud_def = table.copy(bar_definitions.hp) hud_def.number = number hud.id_healthbar = player:hud_add(hud_def) else @@ -73,9 +73,9 @@ local function update_builtin_statbars(player) local breath = player:get_breath() local breath_max = player:get_properties().breath_max if show_breathbar and breath <= breath_max then - local number = 2 * scaleToDefault(player, "breath") + local number = scaleToHudMax(player, "breath") if not hud.id_breathbar and breath < breath_max then - local hud_def = table.copy(breath_bar_definition) + local hud_def = table.copy(bar_definitions.breath) hud_def.number = number hud.id_breathbar = player:hud_add(hud_def) elseif hud.id_breathbar then @@ -84,8 +84,8 @@ local function update_builtin_statbars(player) end if hud.id_breathbar and (not show_breathbar or breath == breath_max) then - minetest.after(1, function(player_name, breath_bar) - local player = minetest.get_player_by_name(player_name) + core.after(1, function(player_name, breath_bar) + local player = core.get_player_by_name(player_name) if player then player:hud_remove(breath_bar) end @@ -138,14 +138,16 @@ 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 - health_bar_definition = definition + 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 local player = core.get_player_by_name(name) @@ -159,7 +161,8 @@ function core.hud_replace_builtin(hud_name, definition) end if hud_name == "breath" then - breath_bar_definition = definition + 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 local player = core.get_player_by_name(name) diff --git a/builtin/game/voxelarea.lua b/builtin/game/voxelarea.lua index 724761414..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 = {x=1, y=1, z=1}, - MaxEdge = {x=0, y=0, z=0}, + MinEdge = vector_new(1, 1, 1), + MaxEdge = vector_new(0, 0, 0), ystride = 0, zstride = 0, } @@ -19,11 +22,11 @@ end function VoxelArea:getExtent() local MaxEdge, MinEdge = self.MaxEdge, self.MinEdge - return { - x = MaxEdge.x - MinEdge.x + 1, - y = MaxEdge.y - MinEdge.y + 1, - z = MaxEdge.z - MinEdge.z + 1, - } + return vector_new( + MaxEdge.x - MinEdge.x + 1, + MaxEdge.y - MinEdge.y + 1, + MaxEdge.z - MinEdge.z + 1 + ) end function VoxelArea:getVolume() @@ -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 75bb3db85..869136016 100644 --- a/builtin/init.lua +++ b/builtin/init.lua @@ -30,6 +30,7 @@ local clientpath = scriptdir .. "client" .. DIR_DELIM local commonpath = scriptdir .. "common" .. DIR_DELIM local asyncpath = scriptdir .. "async" .. DIR_DELIM +dofile(commonpath .. "vector.lua") dofile(commonpath .. "strict.lua") dofile(commonpath .. "serialize.lua") dofile(commonpath .. "misc_helpers.lua") @@ -39,13 +40,26 @@ if INIT == "game" then assert(not core.get_http_api) elseif INIT == "mainmenu" then local mm_script = core.settings:get("main_menu_script") + local custom_loaded = false if mm_script and mm_script ~= "" then - dofile(mm_script) - else + local testfile = io.open(mm_script, "r") + if testfile then + testfile:close() + dofile(mm_script) + custom_loaded = true + core.log("info", "Loaded custom main menu script: "..mm_script) + else + core.log("error", "Failed to load custom main menu script: "..mm_script) + core.log("info", "Falling back to default main menu script") + end + end + 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 new file mode 100644 index 000000000..4a17f7a4b --- /dev/null +++ b/builtin/locale/__builtin.de.tr @@ -0,0 +1,246 @@ +# textdomain: __builtin +Empty command.=Leerer Befehl. +Invalid command: @1=Ungültiger Befehl: @1 +Invalid command usage.=Ungültige Befehlsverwendung. + (@1 s)= (@1 s) +Command execution took @1 s=Befehlsausführung brauchte @1 s +You don't have permission to run this command (missing privileges: @1).=Sie haben keine Erlaubnis, diesen Befehl auszuführen (fehlende Privilegien: @1). +Unable to get position of player @1.=Konnte Position vom Spieler @1 nicht ermitteln. +Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Ungültiges Gebietsformat. Erwartet: (x1,y1,z1) (x2,y2,z2) += +Show chat action (e.g., '/me orders a pizza' displays ' orders a pizza')=Chataktion zeigen (z.B. wird „/me isst Pizza“ zu „ isst Pizza“) +Show the name of the server owner=Den Namen des Servereigentümers zeigen +The administrator of this server is @1.=Der Administrator dieses Servers ist @1. +There's no administrator named in the config file.=In der Konfigurationsdatei wurde kein Administrator angegeben. +@1 does not have any privileges.=@1 hat keine Privilegien. +Privileges of @1: @2=Privilegien von @1: @2 +[]=[] +Show privileges of yourself or another player=Ihre eigenen Privilegien oder die eines anderen Spielers anzeigen +Player @1 does not exist.=Spieler @1 existiert nicht. += +Return list of all online players with privilege=Liste aller Spieler mit einem Privileg ausgeben +Invalid parameters (see /help haspriv).=Ungültige Parameter (siehe „/help haspriv“). +Unknown privilege!=Unbekanntes Privileg! +No online player has the "@1" privilege.=Kein online spielender Spieler hat das „@1“-Privileg. +Players online with the "@1" privilege: @2=Derzeit online spielende Spieler mit dem „@1“-Privileg: @2 +Your privileges are insufficient.=Ihre Privilegien sind unzureichend. +Your privileges are insufficient. '@1' only allows you to grant: @2=Ihre Privilegien sind unzureichend. Mit „@1“ können Sie nur folgendes gewähren: @2 +Unknown privilege: @1=Unbekanntes Privileg: @1 +@1 granted you privileges: @2=@1 gewährte Ihnen Privilegien: @2 + ( [, [<...>]] | all)= ( [, [<...>]] | all) +Give privileges to player=Privileg an Spieler vergeben +Invalid parameters (see /help grant).=Ungültige Parameter (siehe „/help grant“). + [, [<...>]] | all= [, [<...>]] | all +Grant privileges to yourself=Privilegien an Ihnen selbst vergeben +Invalid parameters (see /help grantme).=Ungültige Parameter (siehe „/help grantme“). +Your privileges are insufficient. '@1' only allows you to revoke: @2=Ihre Privilegien sind unzureichend. Mit „@1“ können Sie nur folgendes entziehen: @2 +Note: Cannot revoke in singleplayer: @1=Anmerkung: Im Einzelspielermodus kann man folgendes nicht entziehen: @1 +Note: Cannot revoke from admin: @1=Anmerkung: Vom Admin kann man folgendes nicht entziehen: @1 +No privileges were revoked.=Es wurden keine Privilegien entzogen. +@1 revoked privileges from you: @2=@1 entfernte Privilegien von Ihnen: @2 +Remove privileges from player=Privilegien von Spieler entfernen +Invalid parameters (see /help revoke).=Ungültige Parameter (siehe „/help revoke“). +Revoke privileges from yourself=Privilegien von Ihnen selbst entfernen +Invalid parameters (see /help revokeme).=Ungültige Parameter (siehe „/help revokeme“). + = +Set player's password=Passwort von Spieler setzen +Name field required.=Namensfeld benötigt. +Your password was cleared by @1.=Ihr Passwort wurde von @1 geleert. +Password of player "@1" cleared.=Passwort von Spieler „@1“ geleert. +Your password was set by @1.=Ihr Passwort wurde von @1 gesetzt. +Password of player "@1" set.=Passwort von Spieler „@1“ gesetzt. += +Set empty password for a player=Leeres Passwort für einen Spieler setzen +Reload authentication data=Authentifizierungsdaten erneut laden +Done.=Fertig. +Failed.=Fehlgeschlagen. +Remove a player's data=Daten eines Spielers löschen +Player "@1" removed.=Spieler „@1“ gelöscht. +No such player "@1" to remove.=Es gibt keinen Spieler „@1“, der gelöscht werden könnte. +Player "@1" is connected, cannot remove.=Spieler „@1“ ist verbunden, er kann nicht gelöscht werden. +Unhandled remove_player return code @1.=Nicht berücksichtigter remove_player-Rückgabewert @1. +Cannot teleport out of map bounds!=Eine Teleportation außerhalb der Kartengrenzen ist nicht möglich! +Cannot get player with name @1.=Spieler mit Namen @1 kann nicht gefunden werden. +Cannot teleport, @1 is attached to an object!=Teleportation nicht möglich, @1 ist an einem Objekt befestigt! +Teleporting @1 to @2.=Teleportation von @1 nach @2 +One does not teleport to oneself.=Man teleportiert sich doch nicht zu sich selbst. +Cannot get teleportee with name @1.=Der zu teleportierende Spieler mit Namen @1 kann nicht gefunden werden. +Cannot get target player with name @1.=Zielspieler mit Namen @1 kann nicht gefunden werden. +Teleporting @1 to @2 at @3.=Teleportation von @1 zu @2 bei @3 +,, | | ,, | =,, | | ,, | +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] ) | =([-n] ) | +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 ' to create a new setting.=Fehlgeschlagen. Benutzen Sie „/set -n “, um eine neue Einstellung zu erstellen. +@1 @= @2=@1 @= @2 += +Invalid parameters (see /help set).=Ungültige Parameter (siehe „/help set“). +Finished emerging @1 blocks in @2ms.=Fertig mit Erzeugung von @1 Blöcken in @2 ms. +emergeblocks update: @1/@2 blocks emerged (@3%)=emergeblocks-Update: @1/@2 Kartenblöcke geladen (@3%) +(here []) | ( )=(here []) | ( ) +Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 ( and must be in parentheses)=Lade (oder, wenn nicht existent, generiere) Kartenblöcke im Gebiet zwischen Pos1 und Pos2 ( und müssen in Klammern stehen) +Started emerge of area ranging from @1 to @2.=Start des Ladevorgangs des Gebiets zwischen @1 und @2. +Delete map blocks contained in area pos1 to pos2 ( and must be in parentheses)=Kartenblöcke innerhalb des Gebiets zwischen Pos1 und Pos2 löschen ( und müssen in Klammern stehen) +Successfully cleared area ranging from @1 to @2.=Gebiet zwischen @1 und @2 erfolgreich geleert. +Failed to clear one or more blocks in area.=Fehlgeschlagen: Ein oder mehrere Kartenblöcke im Gebiet konnten nicht geleert werden. +Resets lighting in the area between pos1 and pos2 ( and must be in parentheses)=Setzt das Licht im Gebiet zwischen Pos1 und Pos2 zurück ( und müssen in Klammern stehen) +Successfully reset light in the area ranging from @1 to @2.=Das Licht im Gebiet zwischen @1 und @2 wurde erfolgreich zurückgesetzt. +Failed to load one or more blocks in area.=Fehlgeschlagen: Ein oder mehrere Kartenblöcke im Gebiet konnten nicht geladen werden. +List mods installed on the server=Installierte Mods auf dem Server auflisten +No mods installed.=Es sind keine Mods installiert. +Cannot give an empty item.=Ein leerer Gegenstand kann nicht gegeben werden. +Cannot give an unknown item.=Ein unbekannter Gegenstand kann nicht gegeben werden. +Giving 'ignore' is not allowed.=„ignore“ darf nicht gegeben werden. +@1 is not a known player.=@1 ist kein bekannter Spieler. +@1 partially added to inventory.=@1 teilweise ins Inventar eingefügt. +@1 could not be added to inventory.=@1 konnte nicht ins Inventar eingefügt werden. +@1 added to inventory.=@1 zum Inventar hinzugefügt. +@1 partially added to inventory of @2.=@1 teilweise ins Inventar von @2 eingefügt. +@1 could not be added to inventory of @2.=@1 konnte nicht ins Inventar von @2 eingefügt werden. +@1 added to inventory of @2.=@1 ins Inventar von @2 eingefügt. + [ []]= [ []] +Give item to player=Gegenstand an Spieler geben +Name and ItemString required.=Name und ItemString benötigt. + [ []]= [ []] +Give item to yourself=Gegenstand Ihnen selbst geben +ItemString required.=ItemString benötigt. + [,,]= [,,] +Spawn entity at given (or your) position=Entity an angegebener (oder Ihrer eigenen) Position spawnen +EntityName required.=EntityName benötigt. +Unable to spawn entity, player is nil.=Entity konnte nicht gespawnt werden, Spieler ist nil. +Cannot spawn an unknown entity.=Ein unbekanntes Entity kann nicht gespawnt werden. +Invalid parameters (@1).=Ungültige Parameter (@1). +@1 spawned.=@1 gespawnt. +@1 failed to spawn.=@1 konnte nicht gespawnt werden. +Destroy item in hand=Gegenstand in der Hand zerstören +Unable to pulverize, no player.=Konnte nicht pulverisieren, kein Spieler. +Unable to pulverize, no item in hand.=Konnte nicht pulverisieren, kein Gegenstand in der Hand. +An item was pulverized.=Ein Gegenstand wurde pulverisiert. +[] [] []=[] [] [] +Check who last touched a node or a node near it within the time specified by . Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set to inf for no time limit=Überprüfen, wer als letztes einen Node oder einen Node in der Nähe innerhalb der in angegebenen Zeitspanne angefasst hat. Standard: Reichweite @= 0, Sekunden @= 86400 @= 24h, Limit @= 5. auf „inf“ setzen, um Zeitlimit zu deaktivieren. +Rollback functions are disabled.=Rollback-Funktionen sind deaktiviert. +That limit is too high!=Dieses Limit ist zu hoch! +Checking @1 ...=Überprüfe @1 ... +Nobody has touched the specified location in @1 seconds.=Niemand hat die angegebene Position seit @1 Sekunden angefasst. +@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 vor @5 Sekunden. +Punch a node (range@=@1, seconds@=@2, limit@=@3).=Hauen Sie einen Node (Reichweite@=@1, Sekunden@=@2, Limit@=@3). +( []) | (: [])=( []) | (: []) +Revert actions of a player. Default for is 60. Set to inf for no time limit=Aktionen eines Spielers zurückrollen. Standard für ist 60. auf „inf“ setzen, um Zeitlimit zu deaktivieren +Invalid parameters. See /help rollback and /help rollback_check.=Ungültige Parameter. Siehe /help rollback und /help rollback_check. +Reverting actions of player '@1' since @2 seconds.=Die Aktionen des Spielers „@1“ seit @2 Sekunden werden rückgängig gemacht. +Reverting actions of @1 since @2 seconds.=Die Aktionen von @1 seit @2 Sekunden werden rückgängig gemacht. +(log is too long to show)=(Protokoll ist zu lang für die Anzeige) +Reverting actions succeeded.=Die Aktionen wurden erfolgreich rückgängig gemacht. +Reverting actions FAILED.=FEHLGESCHLAGEN: Die Aktionen konnten nicht rückgängig gemacht werden. +Show server status=Serverstatus anzeigen +This command was disabled by a mod or game.=Dieser Befehl wurde von einer Mod oder einem Spiel deaktiviert. +[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0..24000>] +Show or set time of day=Tageszeit anzeigen oder setzen +Current time is @1:@2.=Es ist jetzt @1:@2 Uhr. +You don't have permission to run this command (missing privilege: @1).=Sie haben nicht die Erlaubnis, diesen Befehl auszuführen (fehlendes Privileg: @1). +Invalid time (must be between 0 and 24000).=Ungültige Zeit (muss zwischen 0 und 24000 liegen). +Time of day changed.=Tageszeit geändert. +Invalid hour (must be between 0 and 23 inclusive).=Ungültige Stunde (muss zwischen 0 und 23 inklusive liegen). +Invalid minute (must be between 0 and 59 inclusive).=Ungültige Minute (muss zwischen 0 und 59 inklusive liegen). +Show day count since world creation=Anzahl Tage seit der Erschaffung der Welt anzeigen +Current day is @1.=Aktueller Tag ist @1. +[ | -1] [-r] []=[ | -1] [-r] [] +Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=Server herunterfahren (-1 bricht einen verzögerten Abschaltvorgang ab, -r erlaubt Spielern, sich wiederzuverbinden) +Server shutting down (operator request).=Server wird heruntergefahren (Betreiberanfrage). +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. + | = | +Remove IP ban belonging to a player/IP=Einen IP-Bann auf einen Spieler zurücknehmen +Failed to unban player/IP.=Konnte Bann auf Spieler/IP nicht zurücknehmen. +Unbanned @1.=Bann auf @1 zurückgenommen. + []= [] +Kick a player=Spieler hinauswerfen +Failed to kick player @1.=Spieler @1 konnte nicht hinausgeworfen werden. +Kicked @1.=@1 hinausgeworfen. +[full | quick]=[full | quick] +Clear all objects in world=Alle Objekte in der Welt löschen +Invalid usage, see /help clearobjects.=Ungültige Verwendung, siehe /help clearobjects. +Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Lösche alle Objekte. Dies kann eine lange Zeit dauern. Eine Netzwerkzeitüberschreitung könnte für Sie auftreten. (von @1) +Cleared all objects.=Alle Objekte gelöscht. + = +Send a direct message to a player=Eine Direktnachricht an einen Spieler senden +Invalid usage, see /help msg.=Ungültige Verwendung, siehe /help msg. +The player @1 is not online.=Der Spieler @1 ist nicht online. +DM from @1: @2=DN von @1: @2 +Message sent.=Nachricht gesendet. +Get the last login time of a player or yourself=Den letzten Loginzeitpunkt eines Spielers oder Ihren eigenen anfragen +@1's last login time was @2.=Letzter Loginzeitpunkt von @1 war @2. +@1's last login time is unknown.=Letzter Loginzeitpunkt von @1 ist unbekannt. +Clear the inventory of yourself or another player=Das Inventar von Ihnen oder einem anderen Spieler leeren +You don't have permission to clear another player's inventory (missing privilege: @1).=Sie haben nicht die Erlaubnis, das Inventar eines anderen Spielers zu leeren (fehlendes Privileg: @1). +@1 cleared your inventory.=@1 hat Ihr Inventar geleert. +Cleared @1's inventory.=Inventar von @1 geleert. +Player must be online to clear inventory!=Spieler muss online sein, um das Inventar leeren zu können! +Players can't be killed, damage has been disabled.=Spieler können nicht getötet werden, Schaden ist deaktiviert. +Player @1 is not online.=Spieler @1 ist nicht online. +You are already dead.=Sie sind schon tot. +@1 is already dead.=@1 ist bereits tot. +@1 has been killed.=@1 wurde getötet. +Kill player or yourself=Einen Spieler oder Sie selbst töten +Invalid parameters (see /help @1).=Ungültige Parameter (siehe „/help @1“). +Too many arguments, try using just /help =Zu viele Argumente. Probieren Sie es mit „/help “ +Available commands: @1=Verfügbare Befehle: @1 +Use '/help ' to get more information, or '/help all' to list everything.=„/help “ benutzen, um mehr Informationen zu erhalten, oder „/help all“, um alles aufzulisten. +Available commands:=Verfügbare Befehle: +Command not available: @1=Befehl nicht verfügbar: @1 +[all | privs | ] [-t]=[all | privs | ] [-t] +Get help for commands or list privileges (-t: output in chat)=Hilfe für Befehle erhalten oder Privilegien auflisten (-t: Ausgabe im Chat) +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. +Double-click to copy the entry to the chat history.=Doppelklicken, um den Eintrag in die Chathistorie einzufügen. +Command: @1 @2=Befehl: @1 @2 +Available commands: (see also: /help )=Verfügbare Befehle: (siehe auch: /help ) +Close=Schließen +Privilege=Privileg +Description=Beschreibung +Available privileges:=Verfügbare Privilegien: +print [] | dump [] | save [ []] | reset=print [] | dump [] | save [ []] +Handle the profiler and profiling data=Den Profiler und Profilingdaten verwalten +Statistics written to action log.=Statistiken zum Aktionsprotokoll geschrieben. +Statistics were reset.=Statistiken wurden zurückgesetzt. +Usage: @1=Verwendung: @1 +Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=Format kann entweder „txt“, „csv“, „lua“, „json“ oder „json_pretty“ sein (die Struktur kann sich in Zukunft ändern). +@1 joined the game.=@1 ist dem Spiel beigetreten. +@1 left the game.=@1 hat das Spiel verlassen. +@1 left the game (timed out).=@1 hat das Spiel verlassen (Netzwerkzeitüberschreitung). +(no description)=(keine Beschreibung) +Can interact with things and modify the world=Kann mit Dingen interagieren und die Welt verändern +Can speak in chat=Kann im Chat sprechen +Can modify basic privileges (@1)=Kann grundlegende Privilegien anpassen (@1) +Can modify privileges=Kann Privilegien anpassen +Can teleport self=Kann sich selbst teleportieren +Can teleport other players=Kann andere Spieler teleportieren +Can set the time of day using /time=Kann die Tageszeit mit /time setzen +Can do server maintenance stuff=Kann Serverwartungsdinge machen +Can bypass node protection in the world=Kann den Schutz auf Blöcken in der Welt umgehen +Can ban and unban players=Kann Spieler verbannen und entbannen +Can kick players=Kann Spieler hinauswerfen +Can use /give and /giveme=Kann /give und /giveme benutzen +Can use /setpassword and /clearpassword=Kann /setpassword und /clearpassword benutzen +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 enable wireframe=Kann Drahtmodell aktivieren +Unknown Item=Unbekannter Gegenstand +Air=Luft +Ignore=Ignorieren +You can't place 'ignore' nodes!=Sie können keine „ignore“-Blöcke platzieren! +Values below show absolute/relative times spend per server step by the instrumented function.=Die unten angegebenen Werte zeigen absolute/relative Zeitspannen, die je Server-Step von der instrumentierten Funktion in Anspruch genommen wurden. +A total of @1 sample(s) were taken.=Es wurden insgesamt @1 Datenpunkt(e) aufgezeichnet. +The output is limited to '@1'.=Die Ausgabe ist beschränkt auf „@1“. +Saving of profile failed: @1=Speichern des Profils fehlgeschlagen: @1 +Profile saved to @1=Profil abgespeichert nach @1 diff --git a/builtin/locale/__builtin.it.tr b/builtin/locale/__builtin.it.tr new file mode 100644 index 000000000..b04b48926 --- /dev/null +++ b/builtin/locale/__builtin.it.tr @@ -0,0 +1,259 @@ +# textdomain: __builtin +Empty command.=Comando vuoto. +Invalid command: @1=Comando non valido: @1 +Invalid command usage.=Utilizzo del comando non valido. + (@1 s)= +Command execution took @1 s= +You don't have permission to run this command (missing privileges: @1).=Non hai il permesso di eseguire questo comando (privilegi mancanti: @1). +Unable to get position of player @1.=Impossibile ottenere la posizione del giocatore @1. +Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Formato dell'area non corretto. Richiesto: (x1,y1,z1) (x2,y2,z2) += +Show chat action (e.g., '/me orders a pizza' displays ' orders a pizza')=Mostra un'azione in chat (es. `/me ordina una pizza` mostra ` ordina una pizza`) +Show the name of the server owner=Mostra il nome del proprietario del server +The administrator of this server is @1.=L'amministratore di questo server è @1. +There's no administrator named in the config file.=Non c'è nessun amministratore nel file di configurazione. +@1 does not have any privileges.= +Privileges of @1: @2=Privilegi di @1: @2 +[]=[] +Show privileges of yourself or another player=Mostra i privilegi propri o di un altro giocatore +Player @1 does not exist.=Il giocatore @1 non esiste. += +Return list of all online players with privilege=Ritorna una lista di tutti i giocatori connessi col tale privilegio +Invalid parameters (see /help haspriv).=Parametri non validi (vedi /help haspriv). +Unknown privilege!=Privilegio sconosciuto! +No online player has the "@1" privilege.= +Players online with the "@1" privilege: @2=Giocatori connessi con il privilegio "@1": @2 +Your privileges are insufficient.=I tuoi privilegi sono insufficienti. +Your privileges are insufficient. '@1' only allows you to grant: @2= +Unknown privilege: @1=Privilegio sconosciuto: @1 +@1 granted you privileges: @2=@1 ti ha assegnato i seguenti privilegi: @2 + ( [, [<...>]] | all)= +Give privileges to player=Dà privilegi al giocatore +Invalid parameters (see /help grant).=Parametri non validi (vedi /help grant). + [, [<...>]] | all= +Grant privileges to yourself=Assegna dei privilegi a te stessǝ +Invalid parameters (see /help grantme).=Parametri non validi (vedi /help grantme). +Your privileges are insufficient. '@1' only allows you to revoke: @2= +Note: Cannot revoke in singleplayer: @1= +Note: Cannot revoke from admin: @1= +No privileges were revoked.= +@1 revoked privileges from you: @2=@1 ti ha revocato i seguenti privilegi: @2 +Remove privileges from player=Rimuove privilegi dal giocatore +Invalid parameters (see /help revoke).=Parametri non validi (vedi /help revoke). +Revoke privileges from yourself=Revoca privilegi a te stessǝ +Invalid parameters (see /help revokeme).=Parametri non validi (vedi /help revokeme). + = +Set player's password=Imposta la password del giocatore +Name field required.=Campo "nome" richiesto. +Your password was cleared by @1.=La tua password è stata resettata da @1. +Password of player "@1" cleared.=Password del giocatore "@1" resettata. +Your password was set by @1.=La tua password è stata impostata da @1. +Password of player "@1" set.=Password del giocatore "@1" impostata. += +Set empty password for a player=Imposta una password vuota a un giocatore +Reload authentication data=Ricarica i dati d'autenticazione +Done.=Fatto. +Failed.=Errore. +Remove a player's data=Rimuove i dati di un giocatore +Player "@1" removed.=Giocatore "@1" rimosso. +No such player "@1" to remove.=Non è presente nessun giocatore "@1" da rimuovere. +Player "@1" is connected, cannot remove.=Il giocatore "@1" è connesso, non può essere rimosso. +Unhandled remove_player return code @1.=Codice ritornato da remove_player non gestito (@1). +Cannot teleport out of map bounds!=Non ci si può teletrasportare fuori dai limiti della mappa! +Cannot get player with name @1.=Impossibile trovare il giocatore chiamato @1. +Cannot teleport, @1 is attached to an object!=Impossibile teletrasportare, @1 è attaccato a un oggetto! +Teleporting @1 to @2.=Teletrasportando @1 da @2. +One does not teleport to oneself.=Non ci si può teletrasportare su se stessi. +Cannot get teleportee with name @1.=Impossibile trovare il giocatore chiamato @1 per il teletrasporto +Cannot get target player with name @1.=Impossibile trovare il giocatore chiamato @1 per il teletrasporto +Teleporting @1 to @2 at @3.=Teletrasportando @1 da @2 a @3 +,, | | ,, | =,, | | ,, | +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] ) | =([-n] ) | +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 ' to create a new setting.=Errore. Usa 'set -n ' per creare una nuova impostazione +@1 @= @2=@1 @= @2 += +Invalid parameters (see /help set).=Parametri non validi (vedi /help set). +Finished emerging @1 blocks in @2ms.=Finito di emergere @1 blocchi in @2ms +emergeblocks update: @1/@2 blocks emerged (@3%)=aggiornamento emergeblocks: @1/@2 blocchi emersi (@3%) +(here []) | ( )=(here []) | ( ) +Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 ( and must be in parentheses)=Carica (o, se non esiste, genera) blocchi mappa contenuti nell'area tra pos1 e pos2 ( e vanno tra parentesi) +Started emerge of area ranging from @1 to @2.=Iniziata emersione dell'area tra @1 e @2. +Delete map blocks contained in area pos1 to pos2 ( and must be in parentheses)=Cancella i blocchi mappa contenuti nell'area tra pos1 e pos2 ( e vanno tra parentesi) +Successfully cleared area ranging from @1 to @2.=Area tra @1 e @2 ripulita con successo. +Failed to clear one or more blocks in area.=Errore nel ripulire uno o più blocchi mappa nell'area +Resets lighting in the area between pos1 and pos2 ( and must be in parentheses)=Reimposta l'illuminazione nell'area tra pos1 e po2 ( e vanno tra parentesi) +Successfully reset light in the area ranging from @1 to @2.=Luce nell'area tra @1 e @2 reimpostata con successo. +Failed to load one or more blocks in area.=Errore nel caricare uno o più blocchi mappa nell'area. +List mods installed on the server=Elenca le mod installate nel server +No mods installed.= +Cannot give an empty item.=Impossibile dare un oggetto vuoto. +Cannot give an unknown item.=Impossibile dare un oggetto sconosciuto. +Giving 'ignore' is not allowed.=Non è permesso dare 'ignore'. +@1 is not a known player.=@1 non è un giocatore conosciuto. +@1 partially added to inventory.=@1 parzialmente aggiunto all'inventario. +@1 could not be added to inventory.=@1 non può essere aggiunto all'inventario. +@1 added to inventory.=@1 aggiunto all'inventario. +@1 partially added to inventory of @2.=@1 parzialmente aggiunto all'inventario di @2. +@1 could not be added to inventory of @2.=Non è stato possibile aggiungere @1 all'inventario di @2. +@1 added to inventory of @2.=@1 aggiunto all'inventario di @2. + [ []]= [ []] +Give item to player=Dà oggetti ai giocatori +Name and ItemString required.=Richiesti nome e NomeOggetto. + [ []]= [ []] +Give item to yourself=Dà oggetti a te stessǝ +ItemString required.=Richiesto NomeOggetto. + [,,]= [,,] +Spawn entity at given (or your) position=Genera un'entità alla data coordinata (o la tua) +EntityName required.=Richiesto NomeEntità +Unable to spawn entity, player is nil.=Impossibile generare l'entità, il giocatore è nil. +Cannot spawn an unknown entity.=Impossibile generare un'entità sconosciuta. +Invalid parameters (@1).=Parametri non validi (@1). +@1 spawned.=Generata entità @1. +@1 failed to spawn.=Errore nel generare @1 +Destroy item in hand=Distrugge l'oggetto in mano +Unable to pulverize, no player.=Impossibile polverizzare, nessun giocatore. +Unable to pulverize, no item in hand.=Impossibile polverizzare, nessun oggetto in mano. +An item was pulverized.=Un oggetto è stato polverizzato. +[] [] []=[] [] [] +Check who last touched a node or a node near it within the time specified by . Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set to inf for no time limit=Controlla chi è l'ultimo giocatore che ha toccato un nodo o un nodo nelle sue vicinanze, negli ultimi secondi indicati. Di base: raggio @= 0, secondi @= 86400 @= 24h, limite @= 5. +Rollback functions are disabled.=Le funzioni di rollback sono disabilitate. +That limit is too high!=Il limite è troppo alto! +Checking @1 ...=Controllando @1 ... +Nobody has touched the specified location in @1 seconds.=Nessuno ha toccato il punto specificato negli ultimi @1 secondi. +@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 @5 secondi fa. +Punch a node (range@=@1, seconds@=@2, limit@=@3).=Colpisce un nodo (raggio@=@1, secondi@=@2, limite@=@3) +( []) | (: [])=( []) | (: []) +Revert actions of a player. Default for is 60. Set to inf for no time limit=Riavvolge le azioni di un giocatore. Di base, è 60. Imposta a inf per nessun limite di tempo +Invalid parameters. See /help rollback and /help rollback_check.=Parametri non validi. Vedi /help rollback e /help rollback_check. +Reverting actions of player '@1' since @2 seconds.=Riavvolge le azioni del giocatore '@1' avvenute negli ultimi @2 secondi. +Reverting actions of @1 since @2 seconds.=Riavvolge le azioni di @1 avvenute negli ultimi @2 secondi. +(log is too long to show)=(il log è troppo lungo per essere mostrato) +Reverting actions succeeded.=Riavvolgimento azioni avvenuto con successo. +Reverting actions FAILED.=Errore nel riavvolgere le azioni. +Show server status=Mostra lo stato del server +This command was disabled by a mod or game.=Questo comando è stato disabilitato da una mod o dal gioco. +[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0..24000>] +Show or set time of day=Mostra o imposta l'orario della giornata +Current time is @1:@2.=Orario corrente: @1:@2. +You don't have permission to run this command (missing privilege: @1).=Non hai il permesso di eseguire questo comando (privilegio mancante: @1) +Invalid time (must be between 0 and 24000).= +Time of day changed.=Orario della giornata cambiato. +Invalid hour (must be between 0 and 23 inclusive).=Ora non valida (deve essere tra 0 e 23 inclusi) +Invalid minute (must be between 0 and 59 inclusive).=Minuto non valido (deve essere tra 0 e 59 inclusi) +Show day count since world creation=Mostra il conteggio dei giorni da quando il mondo è stato creato +Current day is @1.=Giorno attuale: @1. +[ | -1] [-r] []= +Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)= +Server shutting down (operator request).=Arresto del server in corso (per richiesta dell'operatore) +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ǝ. + | = | +Remove IP ban belonging to a player/IP=Perdona l'IP appartenente a un giocatore/IP +Failed to unban player/IP.=Errore nel perdonare il giocatore/IP +Unbanned @1.=@1 perdonatǝ + []= [] +Kick a player=Caccia un giocatore +Failed to kick player @1.=Errore nel cacciare il giocatore @1. +Kicked @1.=@1 cacciatǝ. +[full | quick]=[full | quick] +Clear all objects in world=Elimina tutti gli oggetti/entità nel mondo +Invalid usage, see /help clearobjects.=Uso incorretto, vedi /help clearobjects. +Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Eliminando tutti gli oggetti/entità. Questo potrebbe richiedere molto tempo e farti eventualmente crashare. (di @1) +Cleared all objects.=Tutti gli oggetti sono stati eliminati. + = +Send a direct message to a player=Invia un messaggio privato al giocatore +Invalid usage, see /help msg.=Uso incorretto, vedi /help msg +The player @1 is not online.=Il giocatore @1 non è connesso. +DM from @1: @2=Messaggio privato da @1: @2 +Message sent.=Messaggio inviato. +Get the last login time of a player or yourself=Ritorna l'ultimo accesso di un giocatore o di te stessǝ +@1's last login time was @2.=L'ultimo accesso di @1 è avvenuto il @2 +@1's last login time is unknown.=L'ultimo accesso di @1 non è conosciuto +Clear the inventory of yourself or another player=Svuota l'inventario tuo o di un altro giocatore +You don't have permission to clear another player's inventory (missing privilege: @1).=Non hai il permesso di svuotare l'inventario di un altro giocatore (privilegio mancante: @1). +@1 cleared your inventory.=@1 ha svuotato il tuo inventario. +Cleared @1's inventory.=L'inventario di @1 è stato svuotato. +Player must be online to clear inventory!=Il giocatore deve essere connesso per svuotarne l'inventario! +Players can't be killed, damage has been disabled.=I giocatori non possono essere uccisi, il danno è disabilitato. +Player @1 is not online.=Il giocatore @1 non è connesso. +You are already dead.=Sei già mortǝ. +@1 is already dead.=@1 è già mortǝ. +@1 has been killed.=@1 è stato uccisǝ. +Kill player or yourself=Uccide un giocatore o te stessǝ +Invalid parameters (see /help @1).= +Too many arguments, try using just /help = +Available commands: @1=Comandi disponibili: @1 +Use '/help ' to get more information, or '/help all' to list everything.=Usa '/help ' per ottenere più informazioni, o '/help all' per elencare tutti i comandi. +Available commands:=Comandi disponibili: +Command not available: @1=Comando non disponibile: @1 +[all | privs | ] [-t]= +Get help for commands or list privileges (-t: output in chat)= +Command=Comando +Parameters=Parametri +For more information, click on any entry in the list.=Per più informazioni, clicca su una qualsiasi voce dell'elenco. +Double-click to copy the entry to the chat history.=Doppio click per copiare la voce nella cronologia della chat. +Command: @1 @2=Comando: @1 @2 +Available commands: (see also: /help )=Comandi disponibili: (vedi anche /help ) +Close=Chiudi +Privilege=Privilegio +Description=Descrizione +Available privileges:=Privilegi disponibili: +print [] | dump [] | save [ []] | reset=print [] | dump [] | save [ []] | 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. +Statistics were reset.=Le statistiche sono state resettate. +Usage: @1=Utilizzo: @1 +Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=I formati supportati sono txt, csv, lua, json e json_pretty (le strutture potrebbero essere soggetti a cambiamenti). +@1 joined the game.= +@1 left the game.= +@1 left the game (timed out).= +(no description)=(nessuna descrizione) +Can interact with things and modify the world=Si può interagire con le cose e modificare il mondo +Can speak in chat=Si può parlare in chat +Can modify basic privileges (@1)= +Can modify privileges=Si possono modificare i privilegi +Can teleport self=Si può teletrasportare se stessз +Can teleport other players=Si possono teletrasportare gli altri giocatori +Can set the time of day using /time=Si può impostate l'orario della giornata tramite /time +Can do server maintenance stuff=Si possono eseguire operazioni di manutenzione del server +Can bypass node protection in the world=Si può aggirare la protezione dei nodi nel mondo +Can ban and unban players=Si possono bandire e perdonare i giocatori +Can kick players=Si possono cacciare i giocatori +Can use /give and /giveme=Si possono usare /give e /give me +Can use /setpassword and /clearpassword=Si possono usare /setpassword e /clearpassword +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 enable wireframe= +Unknown Item=Oggetto sconosciuto +Air=Aria +Ignore=Ignora +You can't place 'ignore' nodes!=Non puoi piazzare nodi 'ignore'! +Values below show absolute/relative times spend per server step by the instrumented function.= +A total of @1 sample(s) were taken.= +The output is limited to '@1'.= +Saving of profile failed: @1= +Profile saved to @1= + + +##### not used anymore ##### + +Invalid time.=Orario non valido. +[all | privs | ]=[all | privs | ] +Get help for commands or list privileges=Richiama la finestra d'aiuto dei comandi o dei privilegi +Allows enabling various debug options that may affect gameplay=Permette di abilitare varie opzioni di debug che potrebbero influenzare l'esperienza di gioco +[ | -1] [reconnect] []=[ | -1] [reconnect] [] +Shutdown server (-1 cancels a delayed shutdown)=Arresta il server (-1 annulla un arresto programmato) + ( | all)= ( | all) + | all= | all +Can modify 'shout' and 'interact' privileges=Si possono modificare i privilegi 'shout' e 'interact' diff --git a/builtin/locale/template.txt b/builtin/locale/template.txt new file mode 100644 index 000000000..fa7352317 --- /dev/null +++ b/builtin/locale/template.txt @@ -0,0 +1,246 @@ +# textdomain: __builtin +Empty command.= +Invalid command: @1= +Invalid command usage.= + (@1 s)= +Command execution took @1 s= +You don't have permission to run this command (missing privileges: @1).= +Unable to get position of player @1.= +Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)= += +Show chat action (e.g., '/me orders a pizza' displays ' orders a pizza')= +Show the name of the server owner= +The administrator of this server is @1.= +There's no administrator named in the config file.= +@1 does not have any privileges.= +Privileges of @1: @2= +[]= +Show privileges of yourself or another player= +Player @1 does not exist.= += +Return list of all online players with privilege= +Invalid parameters (see /help haspriv).= +Unknown privilege!= +No online player has the "@1" privilege.= +Players online with the "@1" privilege: @2= +Your privileges are insufficient.= +Your privileges are insufficient. '@1' only allows you to grant: @2= +Unknown privilege: @1= +@1 granted you privileges: @2= + ( [, [<...>]] | all)= +Give privileges to player= +Invalid parameters (see /help grant).= + [, [<...>]] | all= +Grant privileges to yourself= +Invalid parameters (see /help grantme).= +Your privileges are insufficient. '@1' only allows you to revoke: @2= +Note: Cannot revoke in singleplayer: @1= +Note: Cannot revoke from admin: @1= +No privileges were revoked.= +@1 revoked privileges from you: @2= +Remove privileges from player= +Invalid parameters (see /help revoke).= +Revoke privileges from yourself= +Invalid parameters (see /help revokeme).= + = +Set player's password= +Name field required.= +Your password was cleared by @1.= +Password of player "@1" cleared.= +Your password was set by @1.= +Password of player "@1" set.= += +Set empty password for a player= +Reload authentication data= +Done.= +Failed.= +Remove a player's data= +Player "@1" removed.= +No such player "@1" to remove.= +Player "@1" is connected, cannot remove.= +Unhandled remove_player return code @1.= +Cannot teleport out of map bounds!= +Cannot get player with name @1.= +Cannot teleport, @1 is attached to an object!= +Teleporting @1 to @2.= +One does not teleport to oneself.= +Cannot get teleportee with name @1.= +Cannot get target player with name @1.= +Teleporting @1 to @2 at @3.= +,, | | ,, | = +Teleport to position or player= +You don't have permission to teleport other players (missing privilege: @1).= +([-n] ) | = +Set or read server configuration setting= +Failed. Cannot modify secure settings. Edit the settings file manually.= +Failed. Use '/set -n ' to create a new setting.= +@1 @= @2= += +Invalid parameters (see /help set).= +Finished emerging @1 blocks in @2ms.= +emergeblocks update: @1/@2 blocks emerged (@3%)= +(here []) | ( )= +Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 ( and must be in parentheses)= +Started emerge of area ranging from @1 to @2.= +Delete map blocks contained in area pos1 to pos2 ( and must be in parentheses)= +Successfully cleared area ranging from @1 to @2.= +Failed to clear one or more blocks in area.= +Resets lighting in the area between pos1 and pos2 ( and must be in parentheses)= +Successfully reset light in the area ranging from @1 to @2.= +Failed to load one or more blocks in area.= +List mods installed on the server= +No mods installed.= +Cannot give an empty item.= +Cannot give an unknown item.= +Giving 'ignore' is not allowed.= +@1 is not a known player.= +@1 partially added to inventory.= +@1 could not be added to inventory.= +@1 added to inventory.= +@1 partially added to inventory of @2.= +@1 could not be added to inventory of @2.= +@1 added to inventory of @2.= + [ []]= +Give item to player= +Name and ItemString required.= + [ []]= +Give item to yourself= +ItemString required.= + [,,]= +Spawn entity at given (or your) position= +EntityName required.= +Unable to spawn entity, player is nil.= +Cannot spawn an unknown entity.= +Invalid parameters (@1).= +@1 spawned.= +@1 failed to spawn.= +Destroy item in hand= +Unable to pulverize, no player.= +Unable to pulverize, no item in hand.= +An item was pulverized.= +[] [] []= +Check who last touched a node or a node near it within the time specified by . Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set to inf for no time limit= +Rollback functions are disabled.= +That limit is too high!= +Checking @1 ...= +Nobody has touched the specified location in @1 seconds.= +@1 @2 @3 -> @4 @5 seconds ago.= +Punch a node (range@=@1, seconds@=@2, limit@=@3).= +( []) | (: [])= +Revert actions of a player. Default for is 60. Set to inf for no time limit= +Invalid parameters. See /help rollback and /help rollback_check.= +Reverting actions of player '@1' since @2 seconds.= +Reverting actions of @1 since @2 seconds.= +(log is too long to show)= +Reverting actions succeeded.= +Reverting actions FAILED.= +Show server status= +This command was disabled by a mod or game.= +[<0..23>:<0..59> | <0..24000>]= +Show or set time of day= +Current time is @1:@2.= +You don't have permission to run this command (missing privilege: @1).= +Invalid time (must be between 0 and 24000).= +Time of day changed.= +Invalid hour (must be between 0 and 23 inclusive).= +Invalid minute (must be between 0 and 59 inclusive).= +Show day count since world creation= +Current day is @1.= +[ | -1] [-r] []= +Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)= +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.= + | = +Remove IP ban belonging to a player/IP= +Failed to unban player/IP.= +Unbanned @1.= + []= +Kick a player= +Failed to kick player @1.= +Kicked @1.= +[full | quick]= +Clear all objects in world= +Invalid usage, see /help clearobjects.= +Clearing all objects. This may take a long time. You may experience a timeout. (by @1)= +Cleared all objects.= + = +Send a direct message to a player= +Invalid usage, see /help msg.= +The player @1 is not online.= +DM from @1: @2= +Message sent.= +Get the last login time of a player or yourself= +@1's last login time was @2.= +@1's last login time is unknown.= +Clear the inventory of yourself or another player= +You don't have permission to clear another player's inventory (missing privilege: @1).= +@1 cleared your inventory.= +Cleared @1's inventory.= +Player must be online to clear inventory!= +Players can't be killed, damage has been disabled.= +Player @1 is not online.= +You are already dead.= +@1 is already dead.= +@1 has been killed.= +Kill player or yourself= +Invalid parameters (see /help @1).= +Too many arguments, try using just /help = +Available commands: @1= +Use '/help ' to get more information, or '/help all' to list everything.= +Available commands:= +Command not available: @1= +[all | privs | ] [-t]= +Get help for commands or list privileges (-t: output in chat)= +Command= +Parameters= +For more information, click on any entry in the list.= +Double-click to copy the entry to the chat history.= +Command: @1 @2= +Available commands: (see also: /help )= +Close= +Privilege= +Description= +Available privileges:= +print [] | dump [] | save [ []] | reset= +Handle the profiler and profiling data= +Statistics written to action log.= +Statistics were reset.= +Usage: @1= +Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).= +@1 joined the game.= +@1 left the game.= +@1 left the game (timed out).= +(no description)= +Can interact with things and modify the world= +Can speak in chat= +Can modify basic privileges (@1)= +Can modify privileges= +Can teleport self= +Can teleport other players= +Can set the time of day using /time= +Can do server maintenance stuff= +Can bypass node protection in the world= +Can ban and unban players= +Can kick players= +Can use /give and /giveme= +Can use /setpassword and /clearpassword= +Can use fly mode= +Can use fast mode= +Can fly through solid nodes using noclip mode= +Can use the rollback functionality= +Can enable wireframe= +Unknown Item= +Air= +Ignore= +You can't place 'ignore' nodes!= +Values below show absolute/relative times spend per server step by the instrumented function.= +A total of @1 sample(s) were taken.= +The output is limited to '@1'.= +Saving of profile failed: @1= +Profile saved to @1= diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua index 782d6973f..81e28f2bb 100644 --- a/builtin/mainmenu/common.lua +++ b/builtin/mainmenu/common.lua @@ -14,14 +14,11 @@ --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. --------------------------------------------------------------------------------- + -- Global menu data --------------------------------------------------------------------------------- menudata = {} --------------------------------------------------------------------------------- -- Local cached values --------------------------------------------------------------------------------- local min_supp_proto, max_supp_proto function common_update_cached_supp_proto() @@ -29,14 +26,12 @@ function common_update_cached_supp_proto() max_supp_proto = core.get_max_supp_proto() end common_update_cached_supp_proto() --------------------------------------------------------------------------------- --- Menu helper functions --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- +-- Menu helper functions + local function render_client_count(n) - if n > 99 then return '99+' - elseif n >= 0 then return tostring(n) + if n > 999 then return '99+' + elseif n >= 0 then return tostring(n) else return '?' end end @@ -50,74 +45,40 @@ local function configure_selected_world_params(idx) end end --------------------------------------------------------------------------------- -function image_column(tooltip, flagname) - return "image,tooltip=" .. core.formspec_escape(tooltip) .. "," .. - "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," .. - "1=" .. core.formspec_escape(defaulttexturedir .. - (flagname and "server_flags_" .. flagname .. ".png" or "blank.png")) .. "," .. - "2=" .. core.formspec_escape(defaulttexturedir .. "server_ping_4.png") .. "," .. - "3=" .. core.formspec_escape(defaulttexturedir .. "server_ping_3.png") .. "," .. - "4=" .. core.formspec_escape(defaulttexturedir .. "server_ping_2.png") .. "," .. - "5=" .. core.formspec_escape(defaulttexturedir .. "server_ping_1.png") -end - --------------------------------------------------------------------------------- -function order_favorite_list(list) - local res = {} - --orders the favorite list after support - for i = 1, #list do - local fav = list[i] - if is_server_protocol_compat(fav.proto_min, fav.proto_max) then - res[#res + 1] = fav - end - end - for i = 1, #list do - local fav = list[i] - if not is_server_protocol_compat(fav.proto_min, fav.proto_max) then - res[#res + 1] = fav - end - end - return res -end - --------------------------------------------------------------------------------- -function render_serverlist_row(spec, is_favorite) +function render_serverlist_row(spec) local text = "" if spec.name then text = text .. core.formspec_escape(spec.name:trim()) elseif spec.address then - text = text .. spec.address:trim() + text = text .. core.formspec_escape(spec.address:trim()) if spec.port then text = text .. ":" .. spec.port end end - local grey_out = not is_server_protocol_compat(spec.proto_min, spec.proto_max) + local grey_out = not spec.is_compatible - local details - if is_favorite then - details = "1," - else - details = "0," - end + local details = {} - if spec.ping then - local ping = spec.ping * 1000 - if ping <= 50 then - details = details .. "2," - elseif ping <= 100 then - details = details .. "3," - elseif ping <= 250 then - details = details .. "4," + if spec.lag or spec.ping then + local lag = (spec.lag or 0) * 1000 + (spec.ping or 0) * 250 + if lag <= 125 then + table.insert(details, "1") + elseif lag <= 175 then + table.insert(details, "2") + elseif lag <= 250 then + table.insert(details, "3") else - details = details .. "5," + table.insert(details, "4") end else - details = details .. "0," + table.insert(details, "0") end - if spec.clients and spec.clients_max then + table.insert(details, ",") + + local color = (grey_out and "#aaaaaa") or ((spec.is_favorite and "#ddddaa") or "#ffffff") + if spec.clients and (spec.clients_max or 0) > 0 then local clients_percent = 100 * spec.clients / spec.clients_max -- Choose a color depending on how many clients are connected @@ -128,88 +89,53 @@ function render_serverlist_row(spec, is_favorite) elseif clients_percent <= 60 then clients_color = '#a1e587' -- 0-60%: green elseif clients_percent <= 90 then clients_color = '#ffdc97' -- 60-90%: yellow elseif clients_percent == 100 then clients_color = '#dd5b5b' -- full server: red (darker) - else clients_color = '#ffba97' -- 90-100%: orange + else clients_color = '#ffba97' -- 90-100%: orange end - details = details .. clients_color .. ',' .. - render_client_count(spec.clients) .. ',/,' .. - render_client_count(spec.clients_max) .. ',' - - elseif grey_out then - details = details .. '#aaaaaa,?,/,?,' + table.insert(details, clients_color) + table.insert(details, render_client_count(spec.clients) .. " / " .. + render_client_count(spec.clients_max)) else - details = details .. ',?,/,?,' + table.insert(details, color) + table.insert(details, "?") end if spec.creative then - details = details .. "1," + table.insert(details, "1") -- creative icon else - details = details .. "0," - end - - if spec.damage then - details = details .. "1," - else - details = details .. "0," + table.insert(details, "0") end if spec.pvp then - details = details .. "1," + table.insert(details, "2") -- pvp icon + elseif spec.damage then + table.insert(details, "1") -- heart icon else - details = details .. "0," + table.insert(details, "0") end - return details .. (grey_out and '#aaaaaa,' or ',') .. text + table.insert(details, color) + table.insert(details, text) + + return table.concat(details, ",") end - --------------------------------------------------------------------------------- -os.tempfolder = function() - if core.settings:get("TMPFolder") then - return core.settings:get("TMPFolder") .. DIR_DELIM .. "MT_" .. math.random(0,10000) - end - - local filetocheck = os.tmpname() - os.remove(filetocheck) - - -- luacheck: ignore - -- https://blogs.msdn.microsoft.com/vcblog/2014/06/18/c-runtime-crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1/ - -- The C runtime (CRT) function called by os.tmpname is tmpnam. - -- Microsofts tmpnam implementation in older CRT / MSVC releases is defective. - -- tmpnam return values starting with a backslash characterize this behavior. - -- https://sourceforge.net/p/mingw-w64/bugs/555/ - -- MinGW tmpnam implementation is forwarded to the CRT directly. - -- https://sourceforge.net/p/mingw-w64/discussion/723797/thread/55520785/ - -- MinGW links to an older CRT release (msvcrt.dll). - -- Due to legal concerns MinGW will never use a newer CRT. - -- - -- Make use of TEMP to compose the temporary filename if an old - -- style tmpnam return value is detected. - if filetocheck:sub(1, 1) == "\\" then - local tempfolder = os.getenv("TEMP") - return tempfolder .. filetocheck - end - - local randname = "MTTempModFolder_" .. math.random(0,10000) - local backstring = filetocheck:reverse() - return filetocheck:sub(0, filetocheck:len() - backstring:find(DIR_DELIM) + 1) .. - randname +--------------------------------------------------------------------------------- +os.tmpname = function() + error('do not use') -- instead use core.get_temp_path() end - -------------------------------------------------------------------------------- + function menu_render_worldlist() - local retval = "" + local retval = {} local current_worldlist = menudata.worldlist:get_list() for i, v in ipairs(current_worldlist) do - if retval ~= "" then retval = retval .. "," end - retval = retval .. core.formspec_escape(v.name) .. - " \\[" .. core.formspec_escape(v.gameid) .. "\\]" + retval[#retval+1] = core.formspec_escape(v.name) end - return retval + return table.concat(retval, ",") end --------------------------------------------------------------------------------- function menu_handle_key_up_down(fields, textlist, settingname) local oldidx, newidx = core.get_textlist_index(textlist), 1 if fields.key_up or fields.key_down then @@ -226,42 +152,6 @@ function menu_handle_key_up_down(fields, textlist, settingname) return false end --------------------------------------------------------------------------------- -function asyncOnlineFavourites() - if not menudata.public_known then - menudata.public_known = {{ - name = fgettext("Loading..."), - description = fgettext_ne("Try reenabling public serverlist and check your internet connection.") - }} - end - menudata.favorites = menudata.public_known - menudata.favorites_is_public = true - - if not menudata.public_downloading then - menudata.public_downloading = true - else - return - end - - core.handle_async( - function(param) - return core.get_favorites("online") - end, - nil, - function(result) - menudata.public_downloading = nil - local favs = order_favorite_list(result) - if favs[1] then - menudata.public_known = favs - menudata.favorites = menudata.public_known - menudata.favorites_is_public = true - end - core.event_handler("Refresh") - end - ) -end - --------------------------------------------------------------------------------- function text2textlist(xpos, ypos, width, height, tl_name, textlen, text, transparency) local textlines = core.wrap_text(text, textlen, true) local retval = "textlist[" .. xpos .. "," .. ypos .. ";" .. width .. @@ -279,7 +169,6 @@ function text2textlist(xpos, ypos, width, height, tl_name, textlen, text, transp return retval end --------------------------------------------------------------------------------- function is_server_protocol_compat(server_proto_min, server_proto_max) if (not server_proto_min) or (not server_proto_max) then -- There is no info. Assume the best and act as if we would be compatible. @@ -287,7 +176,7 @@ function is_server_protocol_compat(server_proto_min, server_proto_max) end return min_supp_proto <= server_proto_max and max_supp_proto >= server_proto_min end --------------------------------------------------------------------------------- + function is_server_protocol_compat_or_error(server_proto_min, server_proto_max) if not is_server_protocol_compat(server_proto_min, server_proto_max) then local server_prot_ver_info, client_prot_ver_info @@ -315,7 +204,7 @@ function is_server_protocol_compat_or_error(server_proto_min, server_proto_max) return true end --------------------------------------------------------------------------------- + function menu_worldmt(selected, setting, value) local world = menudata.worldlist:get_list()[selected] if world then @@ -347,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 2cf70c9c9..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]" .. @@ -74,7 +130,7 @@ local function get_formspec(data) "label[1.75,0;" .. data.worldspec.name .. "]" if mod.is_modpack or mod.type == "game" then - local info = minetest.formspec_escape( + local info = core.formspec_escape( core.get_content_info(mod.path).description) if info == "" then if mod.is_modpack then @@ -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 - list[i].enabled = true + 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 6525f6013..32054fae3 100644 --- a/builtin/mainmenu/dlg_contentstore.lua +++ b/builtin/mainmenu/dlg_contentstore.lua @@ -15,7 +15,7 @@ --with this program; if not, write to the Free Software Foundation, Inc., --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -if not minetest.get_http_api then +if not core.get_http_api then function create_store_dlg() return messagebox("store", fgettext("ContentDB is not available when Minetest was compiled without cURL")) @@ -23,9 +23,11 @@ if not minetest.get_http_api then return end -local store = { packages = {}, packages_full = {} } +-- Unordered preserves the original order of the ContentDB API, +-- before the package list is ordered based on installed state. +local store = { packages = {}, packages_full = {}, packages_full_unordered = {}, aliases = {} } -local http = minetest.get_http_api() +local http = core.get_http_api() -- Screenshot local screenshot_dir = core.get_cache_path() .. DIR_DELIM .. "cdb" @@ -55,36 +57,79 @@ local filter_types_type = { "txp", } +local REASON_NEW = "new" +local REASON_UPDATE = "update" +local REASON_DEPENDENCY = "dependency" -local function download_package(param) - if core.download_file(param.package.url, param.filename) then - return { - filename = param.filename, - successful = true, - } - else - core.log("error", "downloading " .. dump(param.package.url) .. " failed") - return { - successful = false, - } + +-- encodes for use as URL parameter or path component +local function urlencode(str) + return str:gsub("[^%a%d()._~-]", function(char) + return string.format("%%%02X", string.byte(char)) + end) +end +assert(urlencode("sample text?") == "sample%20text%3F") + + +local function get_download_url(package, reason) + local base_url = core.settings:get("contentdb_url") + local ret = base_url .. ("/packages/%s/releases/%d/download/"):format( + package.url_part, package.release) + if reason then + ret = ret .. "?reason=" .. reason end + return ret end -local function start_install(package) + +local function download_and_extract(param) + local package = param.package + + local filename = core.get_temp_path(true) + if filename == "" or not core.download_file(param.url, filename) then + core.log("error", "Downloading " .. dump(param.url) .. " failed") + return { + msg = fgettext("Failed to download \"$1\"", package.title) + } + end + + local tempfolder = core.get_temp_path() + if tempfolder ~= "" then + tempfolder = tempfolder .. DIR_DELIM .. "MT_" .. math.random(1, 1024000) + if not core.extract_zip(filename, tempfolder) then + tempfolder = nil + end + else + tempfolder = nil + end + os.remove(filename) + if not tempfolder then + return { + msg = fgettext("Failed to extract \"$1\" (unsupported file type or broken archive)", package.title), + } + end + + return { + path = tempfolder + } +end + +local function start_install(package, reason) local params = { package = package, - filename = os.tempfolder() .. "_MODNAME_" .. package.name .. ".zip", + url = get_download_url(package, reason), } number_downloading = number_downloading + 1 local function callback(result) - if result.successful then - local path, msg = pkgmgr.install(package.type, - result.filename, package.name, - package.path) + if result.msg then + gamedata.errormessage = result.msg + else + local path, msg = pkgmgr.install_dir(package.type, result.path, package.name, package.path) + core.delete_dir(result.path) if not path then - gamedata.errormessage = msg + gamedata.errormessage = fgettext("Error installing \"$1\": $2", package.title, msg) else core.log("action", "Installed package to " .. path) @@ -106,11 +151,9 @@ local function start_install(package) 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) @@ -120,9 +163,6 @@ local function start_install(package) conf:write() end end - os.remove(result.filename) - else - gamedata.errormessage = fgettext("Failed to download $1", package.name) end package.downloading = false @@ -133,7 +173,7 @@ local function start_install(package) if next then table.remove(download_queue, 1) - start_install(next) + start_install(next.package, next.reason) end ui.update() @@ -142,23 +182,346 @@ local function start_install(package) package.queued = false package.downloading = true - if not core.handle_async(download_package, params, callback) then + if not core.handle_async(download_and_extract, params, callback) then core.log("error", "ERROR: async event failed") gamedata.errormessage = fgettext("Failed to download $1", package.name) return end end -local function queue_download(package) - local max_concurrent_downloads = tonumber(minetest.settings:get("contentdb_max_concurrent_downloads")) - if number_downloading < max_concurrent_downloads then - start_install(package) +local function queue_download(package, reason) + local max_concurrent_downloads = tonumber(core.settings:get("contentdb_max_concurrent_downloads")) + if number_downloading < math.max(max_concurrent_downloads, 1) then + start_install(package, reason) else - table.insert(download_queue, package) + table.insert(download_queue, { package = package, reason = reason }) package.queued = true end end +local function get_raw_dependencies(package) + if package.raw_deps then + return package.raw_deps + end + + local url_fmt = "/api/packages/%s/dependencies/?only_hard=1&protocol_version=%s&engine_version=%s" + local version = core.get_version() + local base_url = core.settings:get("contentdb_url") + local url = base_url .. url_fmt:format(package.url_part, core.get_max_supp_proto(), urlencode(version.string)) + + local response = http.fetch_sync({ url = url }) + if not response.succeeded then + return + end + + local data = core.parse_json(response.data) or {} + + local content_lookup = {} + for _, pkg in pairs(store.packages_full) do + content_lookup[pkg.id] = pkg + end + + for id, raw_deps in pairs(data) do + local package2 = content_lookup[id:lower()] + if package2 and not package2.raw_deps then + package2.raw_deps = raw_deps + + for _, dep in pairs(raw_deps) do + local packages = {} + for i=1, #dep.packages do + packages[#packages + 1] = content_lookup[dep.packages[i]:lower()] + end + dep.packages = packages + end + end + end + + return package.raw_deps +end + +local function has_hard_deps(raw_deps) + for i=1, #raw_deps do + if not raw_deps[i].is_optional then + return true + end + end + + return false +end + +-- Recursively resolve dependencies, given the installed mods +local function resolve_dependencies_2(raw_deps, installed_mods, out) + local function resolve_dep(dep) + -- Check whether it's already installed + if installed_mods[dep.name] then + return { + is_optional = dep.is_optional, + name = dep.name, + installed = true, + } + end + + -- Find exact name matches + local fallback + for _, package in pairs(dep.packages) do + if package.type ~= "game" then + if package.name == dep.name then + return { + is_optional = dep.is_optional, + name = dep.name, + installed = false, + package = package, + } + elseif not fallback then + fallback = package + end + end + end + + -- Otherwise, find the first mod that fulfils it + if fallback then + return { + is_optional = dep.is_optional, + name = dep.name, + installed = false, + package = fallback, + } + end + + return { + is_optional = dep.is_optional, + name = dep.name, + installed = false, + } + end + + for _, dep in pairs(raw_deps) do + if not dep.is_optional and not out[dep.name] then + local result = resolve_dep(dep) + out[dep.name] = result + if result and result.package and not result.installed then + local raw_deps2 = get_raw_dependencies(result.package) + if raw_deps2 then + resolve_dependencies_2(raw_deps2, installed_mods, out) + end + end + end + end + + return true +end + +-- Resolve dependencies for a package, calls the recursive version. +local function resolve_dependencies(raw_deps, game) + assert(game) + + local installed_mods = {} + + local mods = {} + pkgmgr.get_game_mods(game, mods) + for _, mod in pairs(mods) do + installed_mods[mod.name] = true + end + + for _, mod in pairs(pkgmgr.global_mods:get_list()) do + installed_mods[mod.name] = true + end + + local out = {} + if not resolve_dependencies_2(raw_deps, installed_mods, out) then + return nil + end + + local retval = {} + for _, dep in pairs(out) do + retval[#retval + 1] = dep + end + + table.sort(retval, function(a, b) + return a.name < b.name + end) + + return retval +end + +local install_dialog = {} +function install_dialog.get_formspec() + local package = install_dialog.package + local raw_deps = install_dialog.raw_deps + local will_install_deps = install_dialog.will_install_deps + + local selected_game_idx = 1 + local selected_gameid = core.settings:get("menu_last_game") + local games = table.copy(pkgmgr.games) + for i=1, #games do + if selected_gameid and games[i].id == selected_gameid then + selected_game_idx = i + end + + games[i] = core.formspec_escape(games[i].title) + end + + local selected_game = pkgmgr.games[selected_game_idx] + local deps_to_install = 0 + local deps_not_found = 0 + + install_dialog.dependencies = resolve_dependencies(raw_deps, selected_game) + local formatted_deps = {} + for _, dep in pairs(install_dialog.dependencies) do + formatted_deps[#formatted_deps + 1] = "#fff" + formatted_deps[#formatted_deps + 1] = core.formspec_escape(dep.name) + if dep.installed then + formatted_deps[#formatted_deps + 1] = "#ccf" + formatted_deps[#formatted_deps + 1] = fgettext("Already installed") + elseif dep.package then + formatted_deps[#formatted_deps + 1] = "#cfc" + formatted_deps[#formatted_deps + 1] = fgettext("$1 by $2", dep.package.title, dep.package.author) + deps_to_install = deps_to_install + 1 + else + formatted_deps[#formatted_deps + 1] = "#f00" + formatted_deps[#formatted_deps + 1] = fgettext("Not found") + deps_not_found = deps_not_found + 1 + end + end + + local message_bg = "#3333" + local message + if will_install_deps then + message = fgettext("$1 and $2 dependencies will be installed.", package.title, deps_to_install) + else + message = fgettext("$1 will be installed, and $2 dependencies will be skipped.", package.title, deps_to_install) + end + if deps_not_found > 0 then + message = fgettext("$1 required dependencies could not be found.", deps_not_found) .. + " " .. fgettext("Please check that the base game is correct.", deps_not_found) .. + "\n" .. message + message_bg = mt_color_orange + end + + local formspec = { + "formspec_version[3]", + "size[7,7.85]", + "style[title;border=false]", + "box[0,0;7,0.5;#3333]", + "button[0,0;7,0.5;title;", fgettext("Install $1", package.title) , "]", + + "container[0.375,0.70]", + + "label[0,0.25;", fgettext("Base Game:"), "]", + "dropdown[2,0;4.25,0.5;selected_game;", table.concat(games, ","), ";", selected_game_idx, "]", + + "label[0,0.8;", fgettext("Dependencies:"), "]", + + "tablecolumns[color;text;color;text]", + "table[0,1.1;6.25,3;packages;", table.concat(formatted_deps, ","), "]", + + "container_end[]", + + "checkbox[0.375,5.1;will_install_deps;", + fgettext("Install missing dependencies"), ";", + will_install_deps and "true" or "false", "]", + + "box[0,5.4;7,1.2;", message_bg, "]", + "textarea[0.375,5.5;6.25,1;;;", message, "]", + + "container[1.375,6.85]", + "button[0,0;2,0.8;install_all;", fgettext("Install"), "]", + "button[2.25,0;2,0.8;cancel;", fgettext("Cancel"), "]", + "container_end[]", + } + + return table.concat(formspec, "") +end + +function install_dialog.handle_submit(this, fields) + if fields.cancel then + this:delete() + return true + end + + if fields.will_install_deps ~= nil then + install_dialog.will_install_deps = core.is_yes(fields.will_install_deps) + return true + end + + if fields.install_all then + queue_download(install_dialog.package, REASON_NEW) + + if install_dialog.will_install_deps then + for _, dep in pairs(install_dialog.dependencies) do + if not dep.is_optional and not dep.installed and dep.package then + queue_download(dep.package, REASON_DEPENDENCY) + end + end + end + + this:delete() + return true + end + + if fields.selected_game then + for _, game in pairs(pkgmgr.games) do + if game.title == fields.selected_game then + core.settings:set("menu_last_game", game.id) + break + end + end + return true + end + + return false +end + +function install_dialog.create(package, raw_deps) + install_dialog.dependencies = nil + install_dialog.package = package + install_dialog.raw_deps = raw_deps + install_dialog.will_install_deps = true + return dialog_create("install_dialog", + install_dialog.get_formspec, + install_dialog.handle_submit, + nil) +end + + +local confirm_overwrite = {} +function confirm_overwrite.get_formspec() + local package = confirm_overwrite.package + + 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) + if fields.cancel then + this:delete() + return true + end + + if fields.install then + this:delete() + confirm_overwrite.callback() + return true + end + + return false +end + +function confirm_overwrite.create(package, callback) + assert(type(package) == "table") + assert(type(callback) == "function") + + confirm_overwrite.package = package + confirm_overwrite.callback = callback + return dialog_create("confirm_overwrite", + confirm_overwrite.get_formspec, + confirm_overwrite.handle_submit, + nil) +end + + local function get_file_extension(path) local parts = path:split(".") return parts[#parts] @@ -217,36 +580,47 @@ function store.load() local base_url = core.settings:get("contentdb_url") local url = base_url .. "/api/packages/?type=mod&type=game&type=txp&protocol_version=" .. - core.get_max_supp_proto() .. "&engine_version=" .. version.string + core.get_max_supp_proto() .. "&engine_version=" .. urlencode(version.string) for _, item in pairs(core.settings:get("contentdb_flag_blacklist"):split(",")) do item = item:trim() if item ~= "" then - url = url .. "&hide=" .. item + url = url .. "&hide=" .. urlencode(item) end end - local timeout = tonumber(minetest.settings:get("curl_file_download_timeout")) - local response = http.fetch_sync({ url = url, timeout = timeout }) + local response = http.fetch_sync({ url = url }) if not response.succeeded then return end store.packages_full = core.parse_json(response.data) or {} + store.aliases = {} for _, package in pairs(store.packages_full) do - package.url = base_url .. "/packages/" .. - package.author .. "/" .. package.name .. - "/releases/" .. package.release .. "/download/" - local name_len = #package.name + -- This must match what store.update_paths() does! + package.id = package.author:lower() .. "/" if package.type == "game" and name_len > 5 and package.name:sub(name_len - 4) == "_game" then - package.id = package.author:lower() .. "/" .. package.name:sub(1, name_len - 5) + package.id = package.id .. package.name:sub(1, name_len - 5) else - package.id = package.author:lower() .. "/" .. package.name + package.id = package.id .. package.name + end + + package.url_part = urlencode(package.author) .. "/" .. urlencode(package.name) + + if package.aliases then + for _, alias in ipairs(package.aliases) do + -- We currently don't support name changing + local suffix = "/" .. package.name + if alias:sub(-#suffix) == suffix then + store.aliases[alias:lower()] = package.id + end + end end end + store.packages_full_unordered = store.packages_full store.packages = store.packages_full store.loaded = true end @@ -255,23 +629,26 @@ function store.update_paths() local mod_hash = {} pkgmgr.refresh_globals() for _, mod in pairs(pkgmgr.global_mods:get_list()) do - if mod.author then - mod_hash[mod.author:lower() .. "/" .. mod.name] = mod + if mod.author and mod.release > 0 then + local id = mod.author:lower() .. "/" .. mod.name + mod_hash[store.aliases[id] or id] = mod end end local game_hash = {} pkgmgr.update_gamelist() for _, game in pairs(pkgmgr.games) do - if game.author ~= "" then - game_hash[game.author:lower() .. "/" .. game.id] = game + if game.author ~= "" and game.release > 0 then + local id = game.author:lower() .. "/" .. game.id + game_hash[store.aliases[id] or id] = game end end local txp_hash = {} for _, txp in pairs(pkgmgr.get_texture_packs()) do - if txp.author then - txp_hash[txp.author:lower() .. "/" .. txp.name] = txp + if txp.author and txp.release > 0 then + local id = txp.author:lower() .. "/" .. txp.name + txp_hash[store.aliases[id] or id] = txp end end @@ -294,6 +671,33 @@ function store.update_paths() end end +function store.sort_packages() + local ret = {} + + -- Add installed content + for i=1, #store.packages_full_unordered do + local package = store.packages_full_unordered[i] + if package.path then + ret[#ret + 1] = package + end + end + + -- Sort installed content by title + table.sort(ret, function(a, b) + return a.title < b.title + end) + + -- Add uninstalled content + for i=1, #store.packages_full_unordered do + local package = store.packages_full_unordered[i] + if not package.path then + ret[#ret + 1] = package + end + end + + store.packages_full = ret +end + function store.filter_packages(query) if query == "" and filter_type == 1 then store.packages = store.packages_full @@ -327,7 +731,6 @@ function store.filter_packages(query) store.packages[#store.packages + 1] = package end end - end function store.get_formspec(dlgdata) @@ -340,7 +743,6 @@ function store.get_formspec(dlgdata) local W = 15.75 local H = 9.5 - local formspec if #store.packages_full > 0 then formspec = { @@ -348,12 +750,13 @@ function store.get_formspec(dlgdata) "size[15.75,9.5]", "position[0.5,0.55]", - "style[status;border=false]", + "style[status,downloading,queued;border=false]", "container[0.375,0.375]", "field[0,0;7.225,0.8;search_string;;", core.formspec_escape(search_string), "]", "field_close_on_enter[search_string;false]", - "button[7.225,0;2,0.8;search;", fgettext("Search"), "]", + "image_button[7.3,0;0.8,0.8;", core.formspec_escape(defaulttexturedir .. "search.png"), ";search;]", + "image_button[8.125,0;0.8,0.8;", core.formspec_escape(defaulttexturedir .. "clear.png"), ";clear;]", "dropdown[9.6,0;2.4,0.8;type;", table.concat(filter_types_titles, ","), ";", filter_type, "]", "container_end[]", @@ -374,7 +777,7 @@ function store.get_formspec(dlgdata) } if number_downloading > 0 then - formspec[#formspec + 1] = "button[12.75,0.375;2.625,0.8;status;" + formspec[#formspec + 1] = "button[12.75,0.375;2.625,0.8;downloading;" if #download_queue > 0 then formspec[#formspec + 1] = fgettext("$1 downloading,\n$2 queued", number_downloading, #download_queue) else @@ -418,11 +821,17 @@ function store.get_formspec(dlgdata) } end + -- download/queued tooltips always have the same message + local tooltip_colors = ";#dff6f5;#302c2e]" + formspec[#formspec + 1] = "tooltip[downloading;" .. fgettext("Downloading...") .. tooltip_colors + formspec[#formspec + 1] = "tooltip[queued;" .. fgettext("Queued") .. tooltip_colors + local start_idx = (cur_page - 1) * num_per_page + 1 for i=start_idx, math.min(#store.packages, start_idx+num_per_page-1) do local package = store.packages[i] + local container_y = (i - start_idx) * 1.375 + (2*0.375 + 0.8) formspec[#formspec + 1] = "container[0.375," - formspec[#formspec + 1] = (i - start_idx) * 1.375 + (2*0.375 + 0.8) + formspec[#formspec + 1] = container_y formspec[#formspec + 1] = "]" -- image @@ -433,57 +842,54 @@ function store.get_formspec(dlgdata) -- title formspec[#formspec + 1] = "label[1.875,0.1;" formspec[#formspec + 1] = core.formspec_escape( - minetest.colorize(mt_color_green, package.title) .. - minetest.colorize("#BFBFBF", " by " .. package.author)) + core.colorize(mt_color_green, package.title) .. + core.colorize("#BFBFBF", " by " .. package.author)) formspec[#formspec + 1] = "]" -- buttons - local description_width = W - 0.375*5 - 1 - 2*1.5 + local left_base = "image_button[-1.55,0;0.7,0.7;" .. core.formspec_escape(defaulttexturedir) formspec[#formspec + 1] = "container[" formspec[#formspec + 1] = W - 0.375*2 formspec[#formspec + 1] = ",0.1]" if package.downloading then - formspec[#formspec + 1] = "button[-3.5,0;2,0.8;status;" - formspec[#formspec + 1] = fgettext("Downloading...") - formspec[#formspec + 1] = "]" + formspec[#formspec + 1] = "animated_image[-1.7,-0.15;1,1;downloading;" + formspec[#formspec + 1] = core.formspec_escape(defaulttexturedir) + formspec[#formspec + 1] = "cdb_downloading.png;3;400;]" elseif package.queued then - formspec[#formspec + 1] = "button[-3.5,0;2,0.8;status;" - formspec[#formspec + 1] = fgettext("Queued") - formspec[#formspec + 1] = "]" + formspec[#formspec + 1] = left_base + formspec[#formspec + 1] = "cdb_queued.png;queued;]" elseif not package.path then - formspec[#formspec + 1] = "button[-3,0;1.5,0.8;install_" - formspec[#formspec + 1] = tostring(i) - formspec[#formspec + 1] = ";" - formspec[#formspec + 1] = fgettext("Install") - formspec[#formspec + 1] = "]" + local elem_name = "install_" .. i .. ";" + formspec[#formspec + 1] = "style[" .. elem_name .. "bgcolor=#71aa34]" + formspec[#formspec + 1] = left_base .. "cdb_add.png;" .. elem_name .. "]" + formspec[#formspec + 1] = "tooltip[" .. elem_name .. fgettext("Install") .. tooltip_colors else if package.installed_release < package.release then - description_width = description_width - 1.5 -- The install_ action also handles updating - formspec[#formspec + 1] = "button[-4.5,0;1.5,0.8;install_" - formspec[#formspec + 1] = tostring(i) - formspec[#formspec + 1] = ";" - formspec[#formspec + 1] = fgettext("Update") - formspec[#formspec + 1] = "]" - end + local elem_name = "install_" .. i .. ";" + formspec[#formspec + 1] = "style[" .. elem_name .. "bgcolor=#28ccdf]" + formspec[#formspec + 1] = left_base .. "cdb_update.png;" .. elem_name .. "]" + formspec[#formspec + 1] = "tooltip[" .. elem_name .. fgettext("Update") .. tooltip_colors + else - formspec[#formspec + 1] = "button[-3,0;1.5,0.8;uninstall_" - formspec[#formspec + 1] = tostring(i) - formspec[#formspec + 1] = ";" - formspec[#formspec + 1] = fgettext("Uninstall") - formspec[#formspec + 1] = "]" + local elem_name = "uninstall_" .. i .. ";" + formspec[#formspec + 1] = "style[" .. elem_name .. "bgcolor=#a93b3b]" + formspec[#formspec + 1] = left_base .. "cdb_clear.png;" .. elem_name .. "]" + formspec[#formspec + 1] = "tooltip[" .. elem_name .. fgettext("Uninstall") .. tooltip_colors + end end - formspec[#formspec + 1] = "button[-1.5,0;1.5,0.8;view_" - formspec[#formspec + 1] = tostring(i) - formspec[#formspec + 1] = ";" - formspec[#formspec + 1] = fgettext("View") - formspec[#formspec + 1] = "]" + local web_elem_name = "view_" .. i .. ";" + formspec[#formspec + 1] = "image_button[-0.7,0;0.7,0.7;" .. + core.formspec_escape(defaulttexturedir) .. "cdb_viewonline.png;" .. web_elem_name .. "]" + formspec[#formspec + 1] = "tooltip[" .. web_elem_name .. + fgettext("View more information in a web browser") .. tooltip_colors formspec[#formspec + 1] = "container_end[]" -- description + local description_width = W - 0.375*5 - 0.85 - 2*0.7 formspec[#formspec + 1] = "textarea[1.855,0.3;" formspec[#formspec + 1] = tostring(description_width) formspec[#formspec + 1] = ",0.8;;;" @@ -504,6 +910,13 @@ function store.handle_submit(this, fields) return true end + if fields.clear then + search_string = "" + cur_page = 1 + store.filter_packages("") + return true + end + if fields.back then this:delete() return true @@ -550,7 +963,7 @@ function store.handle_submit(this, fields) local package = store.packages_full[i] if package.path and package.installed_release < package.release and not (package.downloading or package.queued) then - queue_download(package) + queue_download(package, REASON_UPDATE) end end return true @@ -563,22 +976,54 @@ function store.handle_submit(this, fields) assert(package) if fields["install_" .. i] then - queue_download(package) + local install_parent + if package.type == "mod" then + install_parent = core.get_modpath() + elseif package.type == "game" then + install_parent = core.get_gamepath() + elseif package.type == "txp" then + install_parent = core.get_texturepath() + else + error("Unknown package type: " .. package.type) + end + + + local function on_confirm() + local deps = get_raw_dependencies(package) + if deps and has_hard_deps(deps) then + local dlg = install_dialog.create(package, deps) + dlg:set_parent(this) + this:hide() + dlg:show() + else + queue_download(package, package.path and REASON_UPDATE or REASON_NEW) + end + end + + if not package.path and core.is_dir(install_parent .. DIR_DELIM .. package.name) then + local dlg = confirm_overwrite.create(package, on_confirm) + dlg:set_parent(this) + this:hide() + dlg:show() + else + on_confirm() + end + return true end if fields["uninstall_" .. i] then - local dlg_delmod = create_delete_content_dlg(package) - dlg_delmod:set_parent(this) + local dlg = create_delete_content_dlg(package) + dlg:set_parent(this) this:hide() - dlg_delmod:show() + dlg:show() return true end if fields["view_" .. i] then - local url = ("%s/packages/%s/%s?protocol_version=%d"):format( - core.settings:get("contentdb_url"), - package.author, package.name, core.get_max_supp_proto()) + local url = ("%s/packages/%s?protocol_version=%d"):format( + core.settings:get("contentdb_url"), package.url_part, + core.get_max_supp_proto()) core.open_url(url) return true end @@ -592,6 +1037,9 @@ function create_store_dlg(type) store.load() end + store.update_paths() + store.sort_packages() + search_string = "" cur_page = 1 diff --git a/builtin/mainmenu/dlg_create_world.lua b/builtin/mainmenu/dlg_create_world.lua index b2e706b6b..806e019a9 100644 --- a/builtin/mainmenu/dlg_create_world.lua +++ b/builtin/mainmenu/dlg_create_world.lua @@ -15,8 +15,6 @@ --with this program; if not, write to the Free Software Foundation, Inc., --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -local worldname = "" - local function table_to_flags(ftable) -- Convert e.g. { jungles = true, caves = false } to "jungles,nocaves" local str = {} @@ -31,9 +29,8 @@ local function strflag(flags, flag) return (flags[flag] == true) and "true" or "false" end -local cb_caverns = { "caverns", fgettext("Caverns"), "caverns", +local cb_caverns = { "caverns", fgettext("Caverns"), fgettext("Very large caverns deep in the underground") } -local tt_sea_rivers = fgettext("Sea level rivers") local flag_checkboxes = { v5 = { @@ -41,39 +38,38 @@ local flag_checkboxes = { }, v7 = { cb_caverns, - { "ridges", fgettext("Rivers"), "ridges", tt_sea_rivers }, - { "mountains", fgettext("Mountains"), "mountains" }, - { "floatlands", fgettext("Floatlands (experimental)"), "floatlands", + { "ridges", fgettext("Rivers"), fgettext("Sea level rivers") }, + { "mountains", fgettext("Mountains") }, + { "floatlands", fgettext("Floatlands (experimental)"), fgettext("Floating landmasses in the sky") }, }, carpathian = { cb_caverns, - { "rivers", fgettext("Rivers"), "rivers", tt_sea_rivers }, + { "rivers", fgettext("Rivers"), fgettext("Sea level rivers") }, }, valleys = { - { "altitude-chill", fgettext("Altitude chill"), "altitude_chill", + { "altitude_chill", fgettext("Altitude chill"), fgettext("Reduces heat with altitude") }, - { "altitude-dry", fgettext("Altitude dry"), "altitude_dry", + { "altitude_dry", fgettext("Altitude dry"), fgettext("Reduces humidity with altitude") }, - { "humid-rivers", fgettext("Humid rivers"), "humid_rivers", + { "humid_rivers", fgettext("Humid rivers"), fgettext("Increases humidity around rivers") }, - { "vary-river-depth", fgettext("Vary river depth"), "vary_river_depth", + { "vary_river_depth", fgettext("Vary river depth"), fgettext("Low humidity and high heat causes shallow or dry rivers") }, }, flat = { cb_caverns, - { "hills", fgettext("Hills"), "hills" }, - { "lakes", fgettext("Lakes"), "lakes" }, + { "hills", fgettext("Hills") }, + { "lakes", fgettext("Lakes") }, }, fractal = { - { "terrain", fgettext("Additional terrain"), "terrain", + { "terrain", fgettext("Additional terrain"), fgettext("Generate non-fractal terrain: Oceans and underground") }, }, v6 = { - { "trees", fgettext("Trees and jungle grass"), "trees" }, - { "flat", fgettext("Flat terrain"), "flat" }, - { "mudflow", fgettext("Mud flow"), "mudflow", - fgettext("Terrain surface erosion") }, + { "trees", fgettext("Trees and jungle grass") }, + { "flat", fgettext("Flat terrain") }, + { "mudflow", fgettext("Mud flow"), fgettext("Terrain surface erosion") }, -- Biome settings are in mgv6_biomes below }, } @@ -95,48 +91,33 @@ 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;#ff8800]" .. - "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 local mapgens = core.get_mapgen_names() - local current_seed = core.settings:get("fixed_map_seed") or "" - local current_mg = core.settings:get("mg_name") local gameid = core.settings:get("menu_last_game") - local flags = { - main = core.settings:get_flags("mg_flags"), - v5 = core.settings:get_flags("mgv5_spflags"), - v6 = core.settings:get_flags("mgv6_spflags"), - v7 = core.settings:get_flags("mgv7_spflags"), - fractal = core.settings:get_flags("mgfractal_spflags"), - carpathian = core.settings:get_flags("mgcarpathian_spflags"), - valleys = core.settings:get_flags("mgvalleys_spflags"), - flat = core.settings:get_flags("mgflat_spflags"), - } + local flags = dialogdata.flags - local gameidx = 0 - if gameid ~= nil then - local _ - _, gameidx = pkgmgr.find_by_gameid(gameid) - - if gameidx == nil then - gameidx = 0 - end + 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) + core.settings:set("menu_last_game", game.id) end - local game_by_gameidx = core.get_game(gameidx) local disallowed_mapgen_settings = {} - if game_by_gameidx ~= nil then - local gamepath = game_by_gameidx.path - local gameconfig = Settings(gamepath.."/game.conf") + if game ~= nil then + local gameconfig = Settings(game.path.."/game.conf") local allowed_mapgens = (gameconfig:get("allowed_mapgens") or ""):split() for key, value in pairs(allowed_mapgens) do @@ -156,7 +137,7 @@ local function create_world_formspec(dialogdata) end end - if disallowed_mapgens then + if #disallowed_mapgens > 0 then for i = #mapgens, 1, -1 do if table.indexof(disallowed_mapgens, mapgens[i]) > 0 then table.remove(mapgens, i) @@ -172,23 +153,29 @@ local function create_world_formspec(dialogdata) local mglist = "" local selindex - local i = 1 - local first_mg - for k,v in pairs(mapgens) do - if not first_mg then - first_mg = v + do -- build the list of mapgens + local i = 1 + local first_mg + for k, v in pairs(mapgens) do + if not first_mg then + first_mg = v + end + if current_mg == v then + selindex = i + end + i = i + 1 + mglist = mglist .. core.formspec_escape(v) .. "," end - if current_mg == v then - selindex = i + if not selindex then + selindex = 1 + current_mg = first_mg end - i = i + 1 - mglist = mglist .. v .. "," + mglist = mglist:sub(1, -2) end - if not selindex then - selindex = 1 - current_mg = first_mg - end - mglist = mglist:sub(1, -2) + + -- The logic of the flag element IDs is as follows: + -- "flag_main_foo-bar-baz" controls dialogdata.flags["main"]["foo_bar_baz"] + -- see the buttonhandler for the implementation of this local mg_main_flags = function(mapgen, y) if mapgen == "singlenode" then @@ -198,11 +185,11 @@ local function create_world_formspec(dialogdata) return "", y end - local form = "checkbox[0," .. y .. ";flag_mg_caves;" .. + local form = "checkbox[0," .. y .. ";flag_main_caves;" .. fgettext("Caves") .. ";"..strflag(flags.main, "caves").."]" y = y + 0.5 - form = form .. "checkbox[0,"..y..";flag_mg_dungeons;" .. + form = form .. "checkbox[0,"..y..";flag_main_dungeons;" .. fgettext("Dungeons") .. ";"..strflag(flags.main, "dungeons").."]" y = y + 0.5 @@ -213,7 +200,7 @@ local function create_world_formspec(dialogdata) else d_tt = fgettext("Structures appearing on the terrain, typically trees and plants") end - form = form .. "checkbox[0,"..y..";flag_mg_decorations;" .. + form = form .. "checkbox[0,"..y..";flag_main_decorations;" .. d_name .. ";" .. strflag(flags.main, "decorations").."]" .. "tooltip[flag_mg_decorations;" .. @@ -221,7 +208,7 @@ local function create_world_formspec(dialogdata) "]" y = y + 0.5 - form = form .. "tooltip[flag_mg_caves;" .. + form = form .. "tooltip[flag_main_caves;" .. fgettext("Network of tunnels and caves") .. "]" return form, y @@ -235,13 +222,13 @@ local function create_world_formspec(dialogdata) return "", y end local form = "" - for _,tab in pairs(flag_checkboxes[mapgen]) do - local id = "flag_mg"..mapgen.."_"..tab[1] + for _, tab in pairs(flag_checkboxes[mapgen]) do + local id = "flag_"..mapgen.."_"..tab[1]:gsub("_", "-") form = form .. ("checkbox[0,%f;%s;%s;%s]"): - format(y, id, tab[2], strflag(flags[mapgen], tab[3])) + format(y, id, tab[2], strflag(flags[mapgen], tab[1])) - if tab[4] then - form = form .. "tooltip["..id..";"..tab[4].."]" + if tab[3] then + form = form .. "tooltip["..id..";"..tab[3].."]" end y = y + 0.5 end @@ -277,16 +264,14 @@ local function create_world_formspec(dialogdata) -- biomeblend y = y + 0.55 - form = form .. "checkbox[0,"..y..";flag_mgv6_biomeblend;" .. + form = form .. "checkbox[0,"..y..";flag_v6_biomeblend;" .. fgettext("Biome blending") .. ";"..strflag(flags.v6, "biomeblend").."]" .. - "tooltip[flag_mgv6_biomeblend;" .. + "tooltip[flag_v6_biomeblend;" .. fgettext("Smooth transition between biomes") .. "]" return form, y end - current_seed = core.formspec_escape(current_seed) - local y_start = 0.0 local y = y_start local str_flags, str_spflags @@ -305,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]" .. @@ -323,21 +297,33 @@ local function create_world_formspec(dialogdata) "container[0,0]".. "field[0.3,0.6;6,0.5;te_world_name;" .. fgettext("World name") .. - ";" .. core.formspec_escape(worldname) .. "]" .. + ";" .. core.formspec_escape(dialogdata.worldname) .. "]" .. + "set_focus[te_world_name;false]" - "field[0.3,1.7;6,0.5;te_seed;" .. - fgettext("Seed") .. - ";".. current_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 .. "]" .. + "dropdown[0,2.5;6.3;dd_mapgen;" .. mglist .. ";" .. selindex .. "]" - "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_end[]" .. + -- Warning if only devtest is installed + if #pkgmgr.games == 1 and pkgmgr.games[1].id == "devtest" then + retval = retval .. + "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 + + retval = retval .. "container_end[]" .. -- Right side @@ -356,49 +342,81 @@ 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 gameindex = core.get_textlist_index("games") + local game, gameindex = pkgmgr.find_by_gameid(core.settings:get("menu_last_game")) - if gameindex ~= nil then + local message + if game == nil then + message = fgettext("No game selected") + end + + if message == nil then + -- For unnamed worlds use the generated name 'world', + -- where the number increments: it is set to 1 larger than the largest + -- generated name number found. if worldname == "" then - local random_number = math.random(10000, 99999) - local random_world_name = "Unnamed" .. random_number - worldname = random_world_name + local worldnum_max = 0 + for _, world in ipairs(menudata.worldlist:get_list()) do + if world.name:match("^world%d+$") then + local worldnum = tonumber(world.name:sub(6)) + worldnum_max = math.max(worldnum_max, worldnum) + end + end + worldname = "world" .. worldnum_max + 1 end - core.settings:set("fixed_map_seed", fields["te_seed"]) - - local message - if not menudata.worldlist:uid_exists_raw(worldname) then - core.settings:set("mg_name",fields["dd_mapgen"]) - message = core.create_world(worldname,gameindex) - else + if menudata.worldlist:uid_exists_raw(worldname) then message = fgettext("A world named \"$1\" already exists", worldname) end - - if message ~= nil then - gamedata.errormessage = message - else - core.settings:set("menu_last_game",pkgmgr.games[gameindex].id) - if this.data.update_worldlist_filter then - menudata.worldlist:set_filtercriteria(pkgmgr.games[gameindex].id) - mm_texture.update("singleplayer", pkgmgr.games[gameindex].id) - end - menudata.worldlist:refresh() - core.settings:set("mainmenu_last_selected_world", - menudata.worldlist:raw_index_by_uid(worldname)) - end - else - gamedata.errormessage = fgettext("No game selected") end + + if message == nil then + this.data.seed = fields["te_seed"] or "" + this.data.mg = fields["dd_mapgen"] + + -- actual names as used by engine + local settings = { + fixed_map_seed = this.data.seed, + mg_name = this.data.mg, + mg_flags = table_to_flags(this.data.flags.main), + mgv5_spflags = table_to_flags(this.data.flags.v5), + mgv6_spflags = table_to_flags(this.data.flags.v6), + mgv7_spflags = table_to_flags(this.data.flags.v7), + mgfractal_spflags = table_to_flags(this.data.flags.fractal), + mgcarpathian_spflags = table_to_flags(this.data.flags.carpathian), + mgvalleys_spflags = table_to_flags(this.data.flags.valleys), + mgflat_spflags = table_to_flags(this.data.flags.flat), + } + message = core.create_world(worldname, gameindex, settings) + end + + if message == nil then + core.settings:set("menu_last_game", game.id) + menudata.worldlist:set_filtercriteria(game.id) + menudata.worldlist:refresh() + core.settings:set("mainmenu_last_selected_world", + menudata.worldlist:raw_index_by_uid(worldname)) + end + + gamedata.errormessage = message this:delete() return true end - worldname = fields.te_world_name + this.data.worldname = fields["te_world_name"] + this.data.seed = fields["te_seed"] or "" if fields["games"] then local gameindex = core.get_textlist_index("games") @@ -409,22 +427,11 @@ local function create_world_buttonhandler(this, fields) for k,v in pairs(fields) do local split = string.split(k, "_", nil, 3) if split and split[1] == "flag" then - local setting - if split[2] == "mg" then - setting = "mg_flags" - else - setting = split[2].."_spflags" - end -- We replaced the underscore of flag names with a dash. local flag = string.gsub(split[3], "-", "_") - local ftable = core.settings:get_flags(setting) - if v == "true" then - ftable[flag] = true - else - ftable[flag] = false - end - local flags = table_to_flags(ftable) - core.settings:set(setting, flags) + local ftable = this.data.flags[split[2]] + assert(ftable) + ftable[flag] = v == "true" return true end end @@ -435,21 +442,19 @@ local function create_world_buttonhandler(this, fields) end if fields["mgv6_biomes"] then - local entry = minetest.formspec_escape(fields["mgv6_biomes"]) + local entry = core.formspec_escape(fields["mgv6_biomes"]) for b=1, #mgv6_biomes do if entry == mgv6_biomes[b][1] then - local ftable = core.settings:get_flags("mgv6_spflags") + local ftable = this.data.flags.v6 ftable.jungles = mgv6_biomes[b][2].jungles ftable.snowbiomes = mgv6_biomes[b][2].snowbiomes - local flags = table_to_flags(ftable) - core.settings:set("mgv6_spflags", flags) return true end end end if fields["dd_mapgen"] then - core.settings:set("mg_name", fields["dd_mapgen"]) + this.data.mg = fields["dd_mapgen"] return true end @@ -457,13 +462,27 @@ local function create_world_buttonhandler(this, fields) end -function create_create_world_dlg(update_worldlistfilter) - worldname = "" +function create_create_world_dlg() local retval = dialog_create("sp_create_world", create_world_formspec, create_world_buttonhandler, nil) - retval.update_worldlist_filter = update_worldlistfilter + retval.data = { + worldname = "", + -- settings the world is created with: + seed = core.settings:get("fixed_map_seed") or "", + mg = core.settings:get("mg_name"), + flags = { + main = core.settings:get_flags("mg_flags"), + v5 = core.settings:get_flags("mgv5_spflags"), + v6 = core.settings:get_flags("mgv6_spflags"), + v7 = core.settings:get_flags("mgv7_spflags"), + fractal = core.settings:get_flags("mgfractal_spflags"), + carpathian = core.settings:get_flags("mgcarpathian_spflags"), + valleys = core.settings:get_flags("mgvalleys_spflags"), + flat = core.settings:get_flags("mgflat_spflags"), + } + } return retval end 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 c16e4aad0..69562e6a5 100644 --- a/builtin/mainmenu/dlg_settings_advanced.lua +++ b/builtin/mainmenu/dlg_settings_advanced.lua @@ -31,6 +31,10 @@ end -- returns error message, or nil local function parse_setting_line(settings, line, read_all, base_level, allow_secure) + + -- strip carriage returns (CR, /r) + line = line:gsub("\r", "") + -- comment local comment = line:match("^#" .. CHAR_CLASSES.SPACE .. "*(.*)$") if comment then @@ -347,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", }) @@ -374,21 +378,52 @@ 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", }) mods_category_initialized = true end + 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, @@ -493,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 @@ -620,7 +651,7 @@ local function create_change_setting_formspec(dialogdata) -- Third row add_field(0.3, "te_octaves", fgettext("Octaves"), t[7]) - add_field(3.6, "te_persist", fgettext("Persistance"), t[8]) + add_field(3.6, "te_persist", fgettext("Persistence"), t[8]) add_field(6.9, "te_lacun", fgettext("Lacunarity"), t[9]) height = height + 1.1 @@ -663,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 @@ -956,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 @@ -997,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 @@ -1080,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/textures.lua b/builtin/mainmenu/game_theme.lua similarity index 57% rename from builtin/mainmenu/textures.lua rename to builtin/mainmenu/game_theme.lua index a3acbbdec..89e1b66c8 100644 --- a/builtin/mainmenu/textures.lua +++ b/builtin/mainmenu/game_theme.lua @@ -16,23 +16,25 @@ --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -mm_texture = {} +mm_game_theme = {} -------------------------------------------------------------------------------- -function mm_texture.init() - mm_texture.defaulttexturedir = core.get_texturepath() .. DIR_DELIM .. "base" .. +function mm_game_theme.init() + mm_game_theme.defaulttexturedir = core.get_texturepath_share() .. DIR_DELIM .. "base" .. DIR_DELIM .. "pack" .. DIR_DELIM - mm_texture.basetexturedir = mm_texture.defaulttexturedir + mm_game_theme.basetexturedir = mm_game_theme.defaulttexturedir - mm_texture.texturepack = core.settings:get("texture_path") + mm_game_theme.texturepack = core.settings:get("texture_path") - mm_texture.gameid = nil + mm_game_theme.gameid = nil + + mm_game_theme.music_handle = nil end -------------------------------------------------------------------------------- -function mm_texture.update(tab,gamedetails) +function mm_game_theme.update(tab,gamedetails) if tab ~= "singleplayer" then - mm_texture.reset() + mm_game_theme.reset() return end @@ -40,50 +42,54 @@ function mm_texture.update(tab,gamedetails) return end - mm_texture.update_game(gamedetails) + mm_game_theme.update_game(gamedetails) end -------------------------------------------------------------------------------- -function mm_texture.reset() - mm_texture.gameid = nil +function mm_game_theme.reset() + mm_game_theme.gameid = nil local have_bg = false - local have_overlay = mm_texture.set_generic("overlay") + local have_overlay = mm_game_theme.set_generic("overlay") if not have_overlay then - have_bg = mm_texture.set_generic("background") + have_bg = mm_game_theme.set_generic("background") end - mm_texture.clear("header") - mm_texture.clear("footer") + mm_game_theme.clear("header") + mm_game_theme.clear("footer") core.set_clouds(false) - mm_texture.set_generic("footer") - mm_texture.set_generic("header") + mm_game_theme.set_generic("footer") + mm_game_theme.set_generic("header") if not have_bg then if core.settings:get_bool("menu_clouds") then core.set_clouds(true) else - mm_texture.set_dirt_bg() + mm_game_theme.set_dirt_bg() end end + + if mm_game_theme.music_handle ~= nil then + core.sound_stop(mm_game_theme.music_handle) + end end -------------------------------------------------------------------------------- -function mm_texture.update_game(gamedetails) - if mm_texture.gameid == gamedetails.id then +function mm_game_theme.update_game(gamedetails) + if mm_game_theme.gameid == gamedetails.id then return end local have_bg = false - local have_overlay = mm_texture.set_game("overlay",gamedetails) + local have_overlay = mm_game_theme.set_game("overlay",gamedetails) if not have_overlay then - have_bg = mm_texture.set_game("background",gamedetails) + have_bg = mm_game_theme.set_game("background",gamedetails) end - mm_texture.clear("header") - mm_texture.clear("footer") + mm_game_theme.clear("header") + mm_game_theme.clear("footer") core.set_clouds(false) if not have_bg then @@ -91,34 +97,34 @@ function mm_texture.update_game(gamedetails) if core.settings:get_bool("menu_clouds") then core.set_clouds(true) else - mm_texture.set_dirt_bg() + mm_game_theme.set_dirt_bg() end end - mm_texture.set_game("footer",gamedetails) - mm_texture.set_game("header",gamedetails) + mm_game_theme.set_game("footer",gamedetails) + mm_game_theme.set_game("header",gamedetails) - mm_texture.gameid = gamedetails.id + mm_game_theme.gameid = gamedetails.id end -------------------------------------------------------------------------------- -function mm_texture.clear(identifier) +function mm_game_theme.clear(identifier) core.set_background(identifier,"") end -------------------------------------------------------------------------------- -function mm_texture.set_generic(identifier) +function mm_game_theme.set_generic(identifier) --try texture pack first - if mm_texture.texturepack ~= nil then - local path = mm_texture.texturepack .. DIR_DELIM .."menu_" .. + if mm_game_theme.texturepack ~= nil then + local path = mm_game_theme.texturepack .. DIR_DELIM .."menu_" .. identifier .. ".png" if core.set_background(identifier,path) then return true end end - if mm_texture.defaulttexturedir ~= nil then - local path = mm_texture.defaulttexturedir .. DIR_DELIM .."menu_" .. + if mm_game_theme.defaulttexturedir ~= nil then + local path = mm_game_theme.defaulttexturedir .. DIR_DELIM .."menu_" .. identifier .. ".png" if core.set_background(identifier,path) then return true @@ -129,14 +135,16 @@ function mm_texture.set_generic(identifier) end -------------------------------------------------------------------------------- -function mm_texture.set_game(identifier, gamedetails) +function mm_game_theme.set_game(identifier, gamedetails) if gamedetails == nil then return false end - if mm_texture.texturepack ~= nil then - local path = mm_texture.texturepack .. DIR_DELIM .. + mm_game_theme.set_music(gamedetails) + + if mm_game_theme.texturepack ~= nil then + local path = mm_game_theme.texturepack .. DIR_DELIM .. gamedetails.id .. "_menu_" .. identifier .. ".png" if core.set_background(identifier, path) then return true @@ -171,9 +179,10 @@ function mm_texture.set_game(identifier, gamedetails) return false end -function mm_texture.set_dirt_bg() - if mm_texture.texturepack ~= nil then - local path = mm_texture.texturepack .. DIR_DELIM .."default_dirt.png" +-------------------------------------------------------------------------------- +function mm_game_theme.set_dirt_bg() + if mm_game_theme.texturepack ~= nil then + local path = mm_game_theme.texturepack .. DIR_DELIM .."default_dirt.png" if core.set_background("background", path, true, 128) then return true end @@ -183,3 +192,12 @@ function mm_texture.set_dirt_bg() local minimalpath = defaulttexturedir .. "menu_bg.png" core.set_background("background", minimalpath, true, 128) end + +-------------------------------------------------------------------------------- +function mm_game_theme.set_music(gamedetails) + if mm_game_theme.music_handle ~= nil then + core.sound_stop(mm_game_theme.music_handle) + end + local music_path = gamedetails.path .. DIR_DELIM .. "menu" .. DIR_DELIM .. "theme" + mm_game_theme.music_handle = core.sound_play(music_path, true) +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 96d02d06c..c3a28a570 100644 --- a/builtin/mainmenu/init.lua +++ b/builtin/mainmenu/init.lua @@ -17,8 +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() @@ -33,7 +36,8 @@ dofile(basepath .. "fstk" .. DIR_DELIM .. "ui.lua") dofile(menupath .. DIR_DELIM .. "async_event.lua") dofile(menupath .. DIR_DELIM .. "common.lua") dofile(menupath .. DIR_DELIM .. "pkgmgr.lua") -dofile(menupath .. DIR_DELIM .. "textures.lua") +dofile(menupath .. DIR_DELIM .. "serverlistmgr.lua") +dofile(menupath .. DIR_DELIM .. "game_theme.lua") dofile(menupath .. DIR_DELIM .. "dlg_config_world.lua") dofile(menupath .. DIR_DELIM .. "dlg_settings_advanced.lua") @@ -41,13 +45,15 @@ 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 = {} tabs.settings = dofile(menupath .. DIR_DELIM .. "tab_settings.lua") tabs.content = dofile(menupath .. DIR_DELIM .. "tab_content.lua") -tabs.credits = dofile(menupath .. DIR_DELIM .. "tab_credits.lua") +tabs.about = dofile(menupath .. DIR_DELIM .. "tab_about.lua") tabs.local_game = dofile(menupath .. DIR_DELIM .. "tab_local.lua") tabs.play_online = dofile(menupath .. DIR_DELIM .. "tab_online.lua") @@ -85,10 +91,11 @@ local function init_globals() core.settings:set("menu_last_game", default_game) end - mm_texture.init() + mm_game_theme.init() -- 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) @@ -96,7 +103,7 @@ local function init_globals() tv_main:add(tabs.content) tv_main:add(tabs.settings) - tv_main:add(tabs.credits) + tv_main:add(tabs.about) tv_main:set_global_event_handler(main_event_handler) tv_main:set_fixed_size(false) @@ -105,12 +112,20 @@ local function init_globals() if last_tab and tv_main.current_tab ~= last_tab then tv_main:set_tab(last_tab) end + + -- In case the folder of the last selected game has been deleted, + -- display "Minetest" as a header + if tv_main.current_tab == "local" then + local game = pkgmgr.find_by_gameid(core.settings:get("menu_last_game")) + if game == nil then + mm_game_theme.reset() + end + end + ui.set_default("maintab") + check_new_version() tv_main:show() - ui.update() - - core.sound_play("main_menu", true) end init_globals() diff --git a/builtin/mainmenu/pkgmgr.lua b/builtin/mainmenu/pkgmgr.lua index 5b8807310..9fa9aebb0 100644 --- a/builtin/mainmenu/pkgmgr.lua +++ b/builtin/mainmenu/pkgmgr.lua @@ -72,12 +72,41 @@ local function cleanup_path(temppath) return temppath end -function get_mods(path,retval,modpack) +local function load_texture_packs(txtpath, retval) + local list = core.get_dir_list(txtpath, true) + local current_texture_path = core.settings:get("texture_path") + + for _, item in ipairs(list) do + if item ~= "base" then + local path = txtpath .. DIR_DELIM .. item .. DIR_DELIM + 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, + type = "txp", + path = path, + enabled = enabled, + } + end + end +end + +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, @@ -86,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 @@ -106,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.release = tonumber(mod_conf.release) or 0 + 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") + -- Note: modpack.conf is already checked above + local modpackfile = io.open(mod_path .. DIR_DELIM .. "modpack.txt") if modpackfile then modpackfile:close() toadd.is_modpack = true @@ -125,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 @@ -136,32 +167,13 @@ pkgmgr = {} function pkgmgr.get_texture_packs() local txtpath = core.get_texturepath() - local list = core.get_dir_list(txtpath, true) + local txtpath_system = core.get_texturepath_share() local retval = {} - local current_texture_path = core.settings:get("texture_path") - - 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") - - retval[#retval + 1] = { - name = item, - author = conf:get("author"), - release = tonumber(conf:get("release") or "0"), - list_name = name, - type = "txp", - path = path, - enabled = path == current_texture_path, - } - end + load_texture_packs(txtpath, retval) + -- on portable versions these two paths coincide. It avoids loading the path twice + if txtpath ~= txtpath_system then + load_texture_packs(txtpath_system, retval) end table.sort(retval, function(a, b) @@ -172,21 +184,6 @@ function pkgmgr.get_texture_packs() end -------------------------------------------------------------------------------- -function pkgmgr.extract(modfile) - if modfile.type == "zip" then - local tempfolder = os.tempfolder() - - if tempfolder ~= nil and - tempfolder ~= "" then - core.create_dir(tempfolder) - if core.extract_zip(modfile.name,tempfolder) then - return tempfolder - end - end - end - return nil -end - function pkgmgr.get_folder_type(path) local testfile = io.open(path .. DIR_DELIM .. "init.lua","r") if testfile ~= nil then @@ -246,101 +243,12 @@ function pkgmgr.get_base_folder(temppath) end -------------------------------------------------------------------------------- -function pkgmgr.isValidModname(modpath) - if modpath:find("-") ~= nil then - return false - end - - return true +function pkgmgr.is_valid_modname(modpath) + return modpath:match("[^a-z0-9_]") == nil end -------------------------------------------------------------------------------- -function pkgmgr.parse_register_line(line) - local pos1 = line:find("\"") - local pos2 = nil - if pos1 ~= nil then - pos2 = line:find("\"",pos1+1) - end - - if pos1 ~= nil and pos2 ~= nil then - local item = line:sub(pos1+1,pos2-1) - - if item ~= nil and - item ~= "" then - local pos3 = item:find(":") - - if pos3 ~= nil then - local retval = item:sub(1,pos3-1) - if retval ~= nil and - retval ~= "" then - return retval - end - end - end - end - return nil -end - --------------------------------------------------------------------------------- -function pkgmgr.parse_dofile_line(modpath,line) - local pos1 = line:find("\"") - local pos2 = nil - if pos1 ~= nil then - pos2 = line:find("\"",pos1+1) - end - - if pos1 ~= nil and pos2 ~= nil then - local filename = line:sub(pos1+1,pos2-1) - - if filename ~= nil and - filename ~= "" and - filename:find(".lua") then - return pkgmgr.identify_modname(modpath,filename) - end - end - return nil -end - --------------------------------------------------------------------------------- -function pkgmgr.identify_modname(modpath,filename) - local testfile = io.open(modpath .. DIR_DELIM .. filename,"r") - if testfile ~= nil then - local line = testfile:read() - - while line~= nil do - local modname = nil - - if line:find("minetest.register_tool") then - modname = pkgmgr.parse_register_line(line) - end - - if line:find("minetest.register_craftitem") then - modname = pkgmgr.parse_register_line(line) - end - - - if line:find("minetest.register_node") then - modname = pkgmgr.parse_register_line(line) - end - - if line:find("dofile") then - modname = pkgmgr.parse_dofile_line(modpath,line) - end - - if modname ~= nil then - testfile:close() - return modname - end - - line = testfile:read() - end - testfile:close() - end - - 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() @@ -352,31 +260,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, ",") @@ -403,7 +355,43 @@ 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 + -- Toggle or en/disable the mod + if toset == nil then + toset = not mod.enabled + end + if mod.enabled ~= toset then + 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 + for i = 1, #list do + if list[i].modpack == mod.name then + toggle_mod_or_modpack(list, toggled_mods, enabled_mods, toset, list[i]) + end + end + end +end + function pkgmgr.enable_mod(this, toset) local list = this.data.list:get_list() local mod = list[this.data.selected_mod] @@ -414,54 +402,29 @@ function pkgmgr.enable_mod(this, toset) end local toggled_mods = {} - local enabled_mods = {} - if not mod.is_modpack then - -- Toggle or en/disable the mod - if toset == nil then - 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 - end - else - -- Toggle or en/disable every mod in the modpack, - -- interleaved unsupported - for i = 1, #list do - if list[i].modpack == mod.name then - if toset == nil then - toset = not list[i].enabled - end - if list[i].enabled ~= toset then - list[i].enabled = toset - toggled_mods[#toggled_mods+1] = list[i].name - end - if toset then - enabled_mods[list[i].name] = true - end - end - end - end - if not toset then + toggle_mod_or_modpack(list, toggled_mods, enabled_mods, toset, mod) + + if next(enabled_mods) == nil then -- Mod(s) were disabled, so no dependencies need to be enabled table.sort(toggled_mods) - minetest.log("info", "Following mods were disabled: " .. + core.log("info", "Following mods were disabled: " .. table.concat(toggled_mods, ", ")) return end -- Enable mods' depends after activation - -- Make a list of mod ids indexed by their names + -- Make a list of mod ids indexed by their names. Among mods with the + -- same name, enabled mods take precedence, after which game mods take + -- precedence, being last in the mod list. local mod_ids = {} for id, mod2 in pairs(list) do if mod2.type == "mod" and not mod2.is_modpack then - mod_ids[mod2.name] = id + local prev_id = mod_ids[mod2.name] + if not prev_id or not list[prev_id].enabled then + mod_ids[mod2.name] = id + end end end @@ -478,6 +441,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] @@ -487,17 +451,17 @@ function pkgmgr.enable_mod(this, toset) enabled_mods[name] = true local mod_to_enable = list[mod_ids[name]] if not mod_to_enable then - minetest.log("warning", "Mod dependency \"" .. name .. + core.log("warning", "Mod dependency \"" .. name .. "\" not found!") - else - if mod_to_enable.enabled == false 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 -- Push the dependencies of the dependency onto the stack local depends = pkgmgr.get_dependencies(mod_to_enable.path) for i = 1, #depends do - if not enabled_mods[name] then + if not enabled_mods[depends[i]] then sp = sp+1 to_enable[sp] = depends[i] end @@ -508,7 +472,7 @@ function pkgmgr.enable_mod(this, toset) -- Log the list of enabled mods table.sort(toggled_mods) - minetest.log("info", "Following mods were enabled: " .. + core.log("info", "Following mods were enabled: " .. table.concat(toggled_mods, ", ")) end @@ -544,102 +508,68 @@ function pkgmgr.get_worldconfig(worldpath) end -------------------------------------------------------------------------------- -function pkgmgr.install_dir(type, path, basename, targetpath) +function pkgmgr.install_dir(expected_type, path, basename, targetpath) + assert(type(expected_type) == "string") + assert(type(path) == "string") + assert(basename == nil or type(basename) == "string") + assert(targetpath == nil or type(targetpath) == "string") + local basefolder = pkgmgr.get_base_folder(path) - -- There's no good way to detect a texture pack, so let's just assume - -- it's correct for now. - if type == "txp" then + if expected_type == "txp" then + assert(basename) + + -- There's no good way to detect a texture pack, so let's just assume + -- it's correct for now. if basefolder and basefolder.type ~= "invalid" and basefolder.type ~= "txp" then return nil, fgettext("Unable to install a $1 as a texture pack", basefolder.type) end local from = basefolder and basefolder.path or path - if targetpath then - core.delete_dir(targetpath) - core.create_dir(targetpath) - else + if not targetpath then targetpath = core.get_texturepath() .. DIR_DELIM .. basename end - if not core.copy_dir(from, targetpath) then + core.delete_dir(targetpath) + if not core.copy_dir(from, targetpath, false) then return nil, fgettext("Failed to install $1 to $2", basename, targetpath) end return targetpath, nil elseif not basefolder then - return nil, fgettext("Unable to find a valid mod or modpack") + return nil, fgettext("Unable to find a valid mod, modpack, or game") end - -- - -- Get destination - -- - if basefolder.type == "modpack" then - if type ~= "mod" then - return nil, fgettext("Unable to install a modpack as a $1", type) - end + -- Check type + if basefolder.type ~= expected_type and (basefolder.type ~= "modpack" or expected_type ~= "mod") then + return nil, fgettext("Unable to install a $1 as a $2", basefolder.type, expected_type) + end - -- Get destination name for modpack - if targetpath then - core.delete_dir(targetpath) - core.create_dir(targetpath) + -- Set targetpath if not predetermined + if not targetpath then + local content_path + if basefolder.type == "modpack" or basefolder.type == "mod" then + if not basename then + basename = get_last_folder(cleanup_path(basefolder.path)) + end + content_path = core.get_modpath() + elseif basefolder.type == "game" then + content_path = core.get_gamepath() else - local clean_path = nil - if basename ~= nil then - clean_path = basename - end - if not clean_path then - clean_path = get_last_folder(cleanup_path(basefolder.path)) - end - if clean_path then - targetpath = core.get_modpath() .. DIR_DELIM .. clean_path - else - return nil, - fgettext("Install Mod: Unable to find suitable folder name for modpack $1", - path) - end - end - elseif basefolder.type == "mod" then - if type ~= "mod" then - return nil, fgettext("Unable to install a mod as a $1", type) + error("Unknown content type") end - if targetpath then - core.delete_dir(targetpath) - core.create_dir(targetpath) + if basename and (basefolder.type ~= "mod" or pkgmgr.is_valid_modname(basename)) then + targetpath = content_path .. DIR_DELIM .. basename else - local targetfolder = basename - if targetfolder == nil then - targetfolder = pkgmgr.identify_modname(basefolder.path, "init.lua") - end - - -- If heuristic failed try to use current foldername - if targetfolder == nil then - targetfolder = get_last_folder(basefolder.path) - end - - if targetfolder ~= nil and pkgmgr.isValidModname(targetfolder) then - targetpath = core.get_modpath() .. DIR_DELIM .. targetfolder - else - return nil, fgettext("Install Mod: Unable to find real mod name for: $1", path) - end - end - - elseif basefolder.type == "game" then - if type ~= "game" then - return nil, fgettext("Unable to install a game as a $1", type) - end - - if targetpath then - core.delete_dir(targetpath) - core.create_dir(targetpath) - else - targetpath = core.get_gamepath() .. DIR_DELIM .. basename + return nil, + fgettext("Install: Unable to find suitable folder name for $1", path) end end -- Copy it - if not core.copy_dir(basefolder.path, targetpath) then + core.delete_dir(targetpath) + if not core.copy_dir(basefolder.path, targetpath, false) then return nil, fgettext("Failed to install $1 to $2", basename, targetpath) end @@ -653,23 +583,6 @@ function pkgmgr.install_dir(type, path, basename, targetpath) return targetpath, nil end --------------------------------------------------------------------------------- -function pkgmgr.install(type, modfilename, basename, dest) - local archive_info = pkgmgr.identify_filetype(modfilename) - local path = pkgmgr.extract(archive_info) - - if path == nil then - return nil, - fgettext("Install: file: \"$1\"", archive_info.name) .. "\n" .. - fgettext("Install: Unsupported file type \"$1\" or broken archive", - archive_info.type) - end - - local targetpath, msg = pkgmgr.install_dir(type, path, basename, dest) - core.delete_dir(path) - return targetpath, msg -end - -------------------------------------------------------------------------------- function pkgmgr.preparemodlist(data) local retval = {} @@ -678,16 +591,15 @@ function pkgmgr.preparemodlist(data) local game_mods = {} --read global mods - local modpath = core.get_modpath() - - if modpath ~= nil and - modpath ~= "" then - get_mods(modpath,global_mods) + local modpaths = core.get_modpaths() + 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 @@ -700,7 +612,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 @@ -721,22 +633,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 @@ -815,45 +742,6 @@ function pkgmgr.refresh_globals() pkgmgr.global_mods:set_sortmode("alphabetic") end --------------------------------------------------------------------------------- -function pkgmgr.identify_filetype(name) - - if name:sub(-3):lower() == "zip" then - return { - name = name, - type = "zip" - } - end - - if name:sub(-6):lower() == "tar.gz" or - name:sub(-3):lower() == "tgz"then - return { - name = name, - type = "tgz" - } - end - - if name:sub(-6):lower() == "tar.bz2" then - return { - name = name, - type = "tbz" - } - end - - if name:sub(-2):lower() == "7z" then - return { - name = name, - type = "7z" - } - end - - return { - name = name, - type = "ukn" - } -end - - -------------------------------------------------------------------------------- function pkgmgr.find_by_gameid(gameid) for i=1,#pkgmgr.games,1 do @@ -869,7 +757,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 @@ -905,10 +793,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/serverlistmgr.lua b/builtin/mainmenu/serverlistmgr.lua new file mode 100644 index 000000000..964d0c584 --- /dev/null +++ b/builtin/mainmenu/serverlistmgr.lua @@ -0,0 +1,252 @@ +--Minetest +--Copyright (C) 2020 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. + +serverlistmgr = {} + +-------------------------------------------------------------------------------- +local function order_server_list(list) + local res = {} + --orders the favorite list after support + for i = 1, #list do + local fav = list[i] + if is_server_protocol_compat(fav.proto_min, fav.proto_max) then + res[#res + 1] = fav + end + end + for i = 1, #list do + local fav = list[i] + if not is_server_protocol_compat(fav.proto_min, fav.proto_max) then + res[#res + 1] = fav + end + end + return res +end + +local public_downloading = false + +-------------------------------------------------------------------------------- +function serverlistmgr.sync() + if not serverlistmgr.servers then + serverlistmgr.servers = {{ + name = fgettext("Loading..."), + description = fgettext_ne("Try reenabling public serverlist and check your internet connection.") + }} + end + + local serverlist_url = core.settings:get("serverlist_url") or "" + if not core.get_http_api or serverlist_url == "" then + serverlistmgr.servers = {{ + name = fgettext("Public server list is disabled"), + description = "" + }} + return + end + + if public_downloading then + return + end + public_downloading = true + + core.handle_async( + function(param) + local http = core.get_http_api() + local url = ("%s/list?proto_version_min=%d&proto_version_max=%d"):format( + core.settings:get("serverlist_url"), + core.get_min_supp_proto(), + core.get_max_supp_proto()) + + local response = http.fetch_sync({ url = url }) + if not response.succeeded then + return {} + end + + local retval = core.parse_json(response.data) + return retval and retval.list or {} + end, + nil, + function(result) + public_downloading = nil + local favs = order_server_list(result) + if favs[1] then + serverlistmgr.servers = favs + end + core.event_handler("Refresh") + end + ) +end + +-------------------------------------------------------------------------------- +local function get_favorites_path(folder) + local base = core.get_user_path() .. DIR_DELIM .. "client" .. DIR_DELIM .. "serverlist" .. DIR_DELIM + if folder then + return base + end + return base .. core.settings:get("serverlist_file") +end + +-------------------------------------------------------------------------------- +local function save_favorites(favorites) + local filename = core.settings:get("serverlist_file") + -- If setting specifies legacy format change the filename to the new one + if filename:sub(#filename - 3):lower() == ".txt" then + core.settings:set("serverlist_file", filename:sub(1, #filename - 4) .. ".json") + end + + assert(core.create_dir(get_favorites_path(true))) + core.safe_file_write(get_favorites_path(), core.write_json(favorites)) +end + +-------------------------------------------------------------------------------- +function serverlistmgr.read_legacy_favorites(path) + local file = io.open(path, "r") + if not file then + return nil + end + + local lines = {} + for line in file:lines() do + lines[#lines + 1] = line + end + file:close() + + local favorites = {} + + local i = 1 + while i < #lines do + local function pop() + local line = lines[i] + i = i + 1 + return line and line:trim() + end + + if pop():lower() == "[server]" then + local name = pop() + local address = pop() + local port = tonumber(pop()) + local description = pop() + + if name == "" then + name = nil + end + + if description == "" then + description = nil + end + + if not address or #address < 3 then + core.log("warning", "Malformed favorites file, missing address at line " .. i) + elseif not port or port < 1 or port > 65535 then + core.log("warning", "Malformed favorites file, missing port at line " .. i) + elseif (name and name:upper() == "[SERVER]") or + (address and address:upper() == "[SERVER]") or + (description and description:upper() == "[SERVER]") then + core.log("warning", "Potentially malformed favorites file, overran at line " .. i) + else + favorites[#favorites + 1] = { + name = name, + address = address, + port = port, + description = description + } + end + end + end + + return favorites +end + +-------------------------------------------------------------------------------- +local function read_favorites() + local path = get_favorites_path() + + -- If new format configured fall back to reading the legacy file + if path:sub(#path - 4):lower() == ".json" then + local file = io.open(path, "r") + if file then + local json = file:read("*all") + file:close() + return core.parse_json(json) + end + + path = path:sub(1, #path - 5) .. ".txt" + end + + local favs = serverlistmgr.read_legacy_favorites(path) + if favs then + save_favorites(favs) + os.remove(path) + end + return favs +end + +-------------------------------------------------------------------------------- +local function delete_favorite(favorites, del_favorite) + for i=1, #favorites do + local fav = favorites[i] + + if fav.address == del_favorite.address and fav.port == del_favorite.port then + table.remove(favorites, i) + return + end + end +end + +-------------------------------------------------------------------------------- +function serverlistmgr.get_favorites() + if serverlistmgr.favorites then + return serverlistmgr.favorites + end + + serverlistmgr.favorites = {} + + -- Add favorites, removing duplicates + local seen = {} + for _, fav in ipairs(read_favorites() or {}) do + local key = ("%s:%d"):format(fav.address:lower(), fav.port) + if not seen[key] then + seen[key] = true + serverlistmgr.favorites[#serverlistmgr.favorites + 1] = fav + end + end + + return serverlistmgr.favorites +end + +-------------------------------------------------------------------------------- +function serverlistmgr.add_favorite(new_favorite) + assert(type(new_favorite.port) == "number") + + -- Whitelist favorite keys + new_favorite = { + name = new_favorite.name, + address = new_favorite.address, + port = new_favorite.port, + description = new_favorite.description, + } + + local favorites = serverlistmgr.get_favorites() + delete_favorite(favorites, new_favorite) + table.insert(favorites, 1, new_favorite) + save_favorites(favorites) +end + +-------------------------------------------------------------------------------- +function serverlistmgr.delete_favorite(del_favorite) + local favorites = serverlistmgr.get_favorites() + delete_favorite(favorites, del_favorite) + save_favorites(favorites) +end diff --git a/builtin/mainmenu/tab_about.lua b/builtin/mainmenu/tab_about.lua new file mode 100644 index 000000000..a84ebce3f --- /dev/null +++ b/builtin/mainmenu/tab_about.lua @@ -0,0 +1,195 @@ +--Minetest +--Copyright (C) 2013 sapier +-- +--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. + +-- https://github.com/orgs/minetest/teams/engine/members + +local core_developers = { + "Perttu Ahola (celeron55) [Project founder]", + "sfan5 ", + "ShadowNinja ", + "Nathanaëlle Courant (Nore/Ekdohibs) ", + "Loic Blot (nerzhul/nrz) ", + "Andrew Ward (rubenwardy) ", + "Krock/SmallJoker ", + "Lars Hofhansl ", + "v-rob ", + "hecks", + "Hugues Ross ", + "Dmitry Kostenko (x2048) ", +} + +local core_team = { + "Zughy [Issue triager]", +} + +-- For updating active/previous contributors, see the script in ./util/gather_git_credits.py + +local active_contributors = { + "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]", + "JosiahWI [Fixes, build system]", + "numzero [Graphics and rendering]", + "HybridDog [Fixes]", + "NeroBurner [Joystick]", + "pecksin [Clickable web links]", + "Daroc Alden [Fixes]", + "Jean-Patrick Guerrero (kilbith) [Fixes]", +} + +local previous_core_developers = { + "BlockMen", + "Maciej Kasatkin (RealBadAngel) [RIP]", + "Lisa Milne (darkrose) ", + "proller", + "Ilya Zhuravlev (xyz) ", + "PilzAdam ", + "est31 ", + "kahrl ", + "Ryan Kwolek (kwolekr) ", + "sapier", + "Zeno", + "Auke Kok (sofar) ", + "Aaron Suen ", + "paramat", + "Pierre-Yves Rollo ", +} + +local previous_contributors = { + "Nils Dagsson Moskopp (erlehmann) [Minetest logo]", + "red-001 ", + "Giuseppe Bilotta", + "ClobberXD", + "Dániel Juhász (juhdanad) ", + "MirceaKitsune ", + "MoNTE48", + "Constantin Wenger (SpeedProg)", + "Ciaran Gultnieks (CiaranG)", + "Paul Ouellette (pauloue)", + "stujones11", + "srifqi", + "Rogier ", + "Gregory Currie (gregorycu)", + "JacobF", + "Jeija ", +} + +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 _, 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, ""), y +end + +return { + name = "about", + caption = fgettext("About"), + cbf_formspec = function(tabview, name, tabdata) + local logofile = defaulttexturedir .. "logo.png" + local version = core.get_version() + + 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.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 .. "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 + 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.5,5.1;4.5,0.8;userdata;" .. fgettext("Open User Data Directory") .. "]" + end + + 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 + end, +} diff --git a/builtin/mainmenu/tab_content.lua b/builtin/mainmenu/tab_content.lua index 336730bf4..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 @@ -145,11 +155,29 @@ local function get_formspec(tabview, name, tabdata) return retval end +-------------------------------------------------------------------------------- +local function handle_doubleclick(pkg) + if pkg.type == "txp" then + if core.settings:get("texture_path") == pkg.path then + core.settings:set("texture_path", "") + else + core.settings:set("texture_path", pkg.path) + end + packages = nil + + mm_game_theme.init() + mm_game_theme.reset() + end +end + -------------------------------------------------------------------------------- local function handle_buttons(tabview, fields, tabname, tabdata) if fields["pkglist"] ~= nil then local event = core.explode_table_event(fields["pkglist"]) tabdata.selected_pkg = event.row + if event.type == "DCL" then + handle_doubleclick(packages:get_list()[tabdata.selected_pkg]) + end return true end @@ -182,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_credits.lua b/builtin/mainmenu/tab_credits.lua deleted file mode 100644 index c2b7e503a..000000000 --- a/builtin/mainmenu/tab_credits.lua +++ /dev/null @@ -1,124 +0,0 @@ ---Minetest ---Copyright (C) 2013 sapier --- ---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 core_developers = { - "Perttu Ahola (celeron55) ", - "sfan5 ", - "Nathanaël Courant (Nore/Ekdohibs) ", - "Loic Blot (nerzhul/nrz) ", - "paramat", - "Auke Kok (sofar) ", - "Andrew Ward (rubenwardy) ", - "Krock/SmallJoker ", - "Lars Hofhansl ", -} - -local active_contributors = { - "Hugues Ross [Formspecs]", - "Maksim (MoNTE48) [Android]", - "DS [Formspecs]", - "pyrollo [Formspecs: Hypertext]", - "v-rob [Formspecs]", - "Jordach [set_sky]", - "random-geek [Formspecs]", - "Wuzzy [Pathfinder, builtin, translations]", - "ANAND (ClobberXD) [Fixes, per-player FOV]", - "Warr1024 [Fixes]", - "Paul Ouellette (pauloue) [Fixes, Script API]", - "Jean-Patrick G (kilbith) [Audiovisuals]", - "HybridDog [Script API]", - "dcbrwn [Object shading]", - "srifqi [Fixes]", -} - -local previous_core_developers = { - "BlockMen", - "Maciej Kasatkin (RealBadAngel) [RIP]", - "Lisa Milne (darkrose) ", - "proller", - "Ilya Zhuravlev (xyz) ", - "PilzAdam ", - "est31 ", - "kahrl ", - "Ryan Kwolek (kwolekr) ", - "sapier", - "Zeno", - "ShadowNinja ", -} - -local previous_contributors = { - "Nils Dagsson Moskopp (erlehmann) [Minetest Logo]", - "Dániel Juhász (juhdanad) ", - "red-001 ", - "numberZero [Audiovisuals: meshgen]", - "Giuseppe Bilotta", - "MirceaKitsune ", - "Constantin Wenger (SpeedProg)", - "Ciaran Gultnieks (CiaranG)", - "stujones11 [Android UX improvements]", - "Jeija [HTTP, particles]", - "Vincent Glize (Dumbeldor) [Cleanups, CSM APIs]", - "Ben Deutsch [Rendering, Fixes, SQLite auth]", - "TeTpaAka [Hand overriding, nametag colors]", - "Rui [Sound Pitch]", - "Duane Robertson [MGValleys]", - "Raymoo [Tool Capabilities]", - "Rogier [Fixes]", - "Gregory Currie (gregorycu) [optimisation]", - "TriBlade9 [Audiovisuals]", - "T4im [Profiler]", - "Jurgen Doser (doserj) ", -} - -local function buildCreditList(source) - local ret = {} - for i = 1, #source do - ret[i] = core.formspec_escape(source[i]) - end - return table.concat(ret, ",,") -end - -return { - name = "credits", - caption = fgettext("Credits"), - cbf_formspec = function(tabview, name, tabdata) - local logofile = defaulttexturedir .. "logo.png" - local version = core.get_version() - return "image[0.5,1;" .. core.formspec_escape(logofile) .. "]" .. - "label[0.5,2.8;" .. version.project .. " " .. version.string .. "]" .. - "button[0.5,3;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]" - end, - cbf_button_handler = function(this, fields, name, tabdata) - if fields.homepage then - core.open_url("https://www.minetest.net") - end - end, -} diff --git a/builtin/mainmenu/tab_local.lua b/builtin/mainmenu/tab_local.lua index a21cf12b1..f8de10db6 100644 --- a/builtin/mainmenu/tab_local.lua +++ b/builtin/mainmenu/tab_local.lua @@ -16,143 +16,196 @@ --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -local enable_gamebar = PLATFORM ~= "Android" local current_game, singleplayer_refresh_gamebar -if enable_gamebar then - function current_game() - local last_game_id = core.settings:get("menu_last_game") - local game = pkgmgr.find_by_gameid(last_game_id) +local valid_disabled_settings = { + ["enable_damage"]=true, + ["creative_mode"]=true, + ["enable_server"]=true, +} - return game +-- 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 + +-- 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 + + 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 + end + menu_worldmt_legacy(index) +end + +function singleplayer_refresh_gamebar() + + local old_bar = ui.find_by_name("game_button_bar") + if old_bar ~= nil then + old_bar:delete() end - function singleplayer_refresh_gamebar() - - local old_bar = ui.find_by_name("game_button_bar") - - if old_bar ~= nil then - old_bar:delete() + 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 + end + end - for key,value in pairs(fields) do - for j=1,#pkgmgr.games,1 do - if ("game_btnbar_" .. pkgmgr.games[j].id == key) then - mm_texture.update("singleplayer", pkgmgr.games[j]) - core.set_topleft_text(pkgmgr.games[j].name) - core.settings:set("menu_last_game",pkgmgr.games[j].id) - menudata.worldlist:set_filtercriteria(pkgmgr.games[j].id) - 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 - end - menu_worldmt_legacy(index) - return true - 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}) + + 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.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) + + text = part1 .. "\n" .. part2 + if part3 ~= "" then + text = text .. "\n" .. part3 end end + btnbar:add_button(btn_name, text, image, tooltip) + 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 plus_image = core.formspec_escape(defaulttexturedir .. "plus.png") + btnbar:add_button("game_open_cdb", "", plus_image, fgettext("Install games from ContentDB")) +end - for i=1,#pkgmgr.games,1 do - local btn_name = "game_btnbar_" .. pkgmgr.games[i].id +local function get_disabled_settings(game) + if not game then + return {} + end - local image = nil - local text = nil - local tooltip = core.formspec_escape(pkgmgr.games[i].name) - - if pkgmgr.games[i].menuicon_path ~= nil and - pkgmgr.games[i].menuicon_path ~= "" then - image = core.formspec_escape(pkgmgr.games[i].menuicon_path) + local gameconfig = Settings(game.path .. "/game.conf") + local disabled_settings = {} + if gameconfig then + local disabled_settings_str = (gameconfig:get("disabled_settings") or ""):split() + for _, value in pairs(disabled_settings_str) do + local state = false + value = value:trim() + if string.sub(value, 1, 1) == "!" then + state = true + value = string.sub(value, 2) + end + if valid_disabled_settings[value] then + disabled_settings[value] = state else - - local part1 = pkgmgr.games[i].id:sub(1,5) - local part2 = pkgmgr.games[i].id:sub(6,10) - local part3 = pkgmgr.games[i].id:sub(11) - - text = part1 .. "\n" .. part2 - if part3 ~= nil and - part3 ~= "" then - text = text .. "\n" .. part3 - end + core.log("error", "Invalid disabled setting in game.conf: "..tostring(value)) 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 - function current_game() - return nil end + return disabled_settings end local function get_formspec(tabview, name, tabdata) local retval = "" local index = filterlist.get_current_index(menudata.worldlist, - tonumber(core.settings:get("mainmenu_last_selected_world")) - ) + tonumber(core.settings:get("mainmenu_last_selected_world"))) + local list = menudata.worldlist:get_list() + local world = list and index and list[index] + local game + if world then + game = pkgmgr.find_by_gameid(world.gameid) + else + game = current_game() + end + local disabled_settings = get_disabled_settings(game) + + local creative, damage, host = "", "", "" + + -- Y offsets for game settings checkboxes + local y = -0.2 + local yo = 0.45 + + if disabled_settings["creative_mode"] == nil then + creative = "checkbox[0,"..y..";cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. + dump(core.settings:get_bool("creative_mode")) .. "]" + y = y + yo + end + if disabled_settings["enable_damage"] == nil then + damage = "checkbox[0,"..y..";cb_enable_damage;".. fgettext("Enable Damage") .. ";" .. + dump(core.settings:get_bool("enable_damage")) .. "]" + y = y + yo + end + if disabled_settings["enable_server"] == nil then + host = "checkbox[0,"..y..";cb_server;".. fgettext("Host Server") ..";" .. + dump(core.settings:get_bool("enable_server")) .. "]" + y = y + yo + end retval = retval .. - "button[4,3.95;2.6,1;world_delete;".. fgettext("Delete") .. "]" .. - "button[6.5,3.95;2.8,1;world_configure;".. fgettext("Configure") .. "]" .. - "button[9.2,3.95;2.5,1;world_create;".. fgettext("New") .. "]" .. - "label[4,-0.25;".. fgettext("Select World:") .. "]".. - "checkbox[0.25,0.25;cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. - dump(core.settings:get_bool("creative_mode")) .. "]".. - "checkbox[0.25,0.7;cb_enable_damage;".. fgettext("Enable Damage") .. ";" .. - dump(core.settings:get_bool("enable_damage")) .. "]".. - "checkbox[0.25,1.15;cb_server;".. fgettext("Host Server") ..";" .. - dump(core.settings:get_bool("enable_server")) .. "]" .. - "textlist[4,0.25;7.5,3.7;sp_worlds;" .. + "button[3.9,3.8;2.8,1;world_delete;".. fgettext("Delete") .. "]" .. + "button[6.55,3.8;2.8,1;world_configure;".. fgettext("Select Mods") .. "]" .. + "button[9.2,3.8;2.8,1;world_create;".. fgettext("New") .. "]" .. + "label[3.9,-0.05;".. fgettext("Select World:") .. "]".. + creative .. + damage .. + host .. + "textlist[3.9,0.4;7.9,3.45;sp_worlds;" .. menu_render_worldlist() .. ";" .. index .. "]" - if core.settings:get_bool("enable_server") then + if core.settings:get_bool("enable_server") and disabled_settings["enable_server"] == nil then retval = retval .. - "button[8.5,4.8;3.2,1;play;".. fgettext("Host Game") .. "]" .. - "checkbox[0.25,1.6;cb_server_announce;" .. fgettext("Announce Server") .. ";" .. + "button[7.9,4.75;4.1,1;play;".. fgettext("Host Game") .. "]" .. + "checkbox[0,"..y..";cb_server_announce;" .. fgettext("Announce Server") .. ";" .. dump(core.settings:get_bool("server_announce")) .. "]" .. - "label[0.25,2.2;" .. fgettext("Name/Password") .. "]" .. - "field[0.55,3.2;3.5,0.5;te_playername;;" .. + "field[0.3,2.85;3.8,0.5;te_playername;" .. fgettext("Name") .. ";" .. core.formspec_escape(core.settings:get("name")) .. "]" .. - "pwdfield[0.55,4;3.5,0.5;te_passwd;]" + "pwdfield[0.3,4.05;3.8,0.5;te_passwd;" .. fgettext("Password") .. "]" local bind_addr = core.settings:get("bind_address") if bind_addr ~= nil and bind_addr ~= "" then retval = retval .. - "field[0.55,5.2;2.25,0.5;te_serveraddr;" .. fgettext("Bind Address") .. ";" .. + "field[0.3,5.25;2.5,0.5;te_serveraddr;" .. fgettext("Bind Address") .. ";" .. core.formspec_escape(core.settings:get("bind_address")) .. "]" .. - "field[2.8,5.2;1.25,0.5;te_serverport;" .. fgettext("Port") .. ";" .. + "field[2.85,5.25;1.25,0.5;te_serverport;" .. fgettext("Port") .. ";" .. core.formspec_escape(core.settings:get("port")) .. "]" else retval = retval .. - "field[0.55,5.2;3.5,0.5;te_serverport;" .. fgettext("Server Port") .. ";" .. + "field[0.3,5.25;3.8,0.5;te_serverport;" .. fgettext("Server Port") .. ";" .. core.formspec_escape(core.settings:get("port")) .. "]" end else retval = retval .. - "button[8.5,4.8;3.2,1;play;".. fgettext("Play Game") .. "]" + "button[7.9,4.75;4.1,1;play;" .. fgettext("Play Game") .. "]" end return retval @@ -227,9 +280,21 @@ local function main_button_handler(this, fields, name, tabdata) -- Update last game local world = menudata.worldlist:get_raw_element(gamedata.selected_world) + local game_obj if world then - local game = pkgmgr.find_by_gameid(world.gameid) - core.settings:set("menu_last_game", game.id) + game_obj = pkgmgr.find_by_gameid(world.gameid) + core.settings:set("menu_last_game", game_obj.id) + end + + local disabled_settings = get_disabled_settings(game_obj) + for k, _ in pairs(valid_disabled_settings) do + local v = disabled_settings[k] + if v ~= nil then + if k == "enable_server" and v == true then + error("Setting 'enable_server' cannot be force-enabled! The game.conf needs to be fixed.") + end + core.settings:set_bool(k, disabled_settings[k]) + end end if core.settings:get_bool("enable_server") then @@ -251,11 +316,11 @@ local function main_button_handler(this, fields, name, tabdata) end if fields["world_create"] ~= nil then - local create_world_dlg = create_create_world_dlg(true) + local create_world_dlg = create_create_world_dlg() create_world_dlg:set_parent(this) this:hide() create_world_dlg:show() - mm_texture.update("singleplayer", current_game()) + mm_game_theme.update("singleplayer", current_game()) return true end @@ -272,7 +337,7 @@ local function main_button_handler(this, fields, name, tabdata) delete_world_dlg:set_parent(this) this:hide() delete_world_dlg:show() - mm_texture.update("singleplayer",current_game()) + mm_game_theme.update("singleplayer",current_game()) end end @@ -290,7 +355,7 @@ local function main_button_handler(this, fields, name, tabdata) configdialog:set_parent(this) this:hide() configdialog:show() - mm_texture.update("singleplayer",current_game()) + mm_game_theme.update("singleplayer",current_game()) end end @@ -298,29 +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 - menudata.worldlist:set_filtercriteria(game.id) - core.set_topleft_text(game.name) - mm_texture.update("singleplayer",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_texture.update(new_tab,nil) +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) end end diff --git a/builtin/mainmenu/tab_online.lua b/builtin/mainmenu/tab_online.lua index 7985fd84a..899f30bd1 100644 --- a/builtin/mainmenu/tab_online.lua +++ b/builtin/mainmenu/tab_online.lua @@ -15,17 +15,50 @@ --with this program; if not, write to the Free Software Foundation, Inc., --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --------------------------------------------------------------------------------- +local function get_sorted_servers() + local servers = { + fav = {}, + public = {}, + incompatible = {} + } + + local favs = serverlistmgr.get_favorites() + local taken_favs = {} + local result = menudata.search_result or serverlistmgr.servers + for _, server in ipairs(result) do + server.is_favorite = false + for index, fav in ipairs(favs) do + if server.address == fav.address and server.port == fav.port then + taken_favs[index] = true + server.is_favorite = true + break + end + end + server.is_compatible = is_server_protocol_compat(server.proto_min, server.proto_max) + if server.is_favorite then + table.insert(servers.fav, server) + elseif server.is_compatible then + table.insert(servers.public, server) + else + table.insert(servers.incompatible, server) + end + end + + if not menudata.search_result then + for index, fav in ipairs(favs) do + if not taken_favs[index] then + table.insert(servers.fav, fav) + end + end + end + + return servers +end + local function get_formspec(tabview, name, tabdata) -- Update the cached supported proto info, -- it may have changed after a change by the settings menu. common_update_cached_supp_proto() - local fav_selected - if menudata.search_result then - fav_selected = menudata.search_result[tabdata.fav_selected] - else - fav_selected = menudata.favorites[tabdata.fav_selected] - end if not tabdata.search_for then tabdata.search_for = "" @@ -33,128 +66,228 @@ local function get_formspec(tabview, name, tabdata) local retval = -- Search - "field[0.15,0.075;5.91,1;te_search;;" .. core.formspec_escape(tabdata.search_for) .. "]" .. - "button[5.62,-0.25;1.5,1;btn_mp_search;" .. fgettext("Search") .. "]" .. - "image_button[6.97,-.165;.83,.83;" .. core.formspec_escape(defaulttexturedir .. "refresh.png") - .. ";btn_mp_refresh;]" .. + "field[0.25,0.25;7,0.75;te_search;;" .. core.formspec_escape(tabdata.search_for) .. "]" .. + "container[7.25,0.25]" .. + "image_button[0,0;0.75,0.75;" .. core.formspec_escape(defaulttexturedir .. "search.png") .. ";btn_mp_search;]" .. + "image_button[0.75,0;0.75,0.75;" .. core.formspec_escape(defaulttexturedir .. "clear.png") .. ";btn_mp_clear;]" .. + "image_button[1.5,0;0.75,0.75;" .. core.formspec_escape(defaulttexturedir .. "refresh.png") .. ";btn_mp_refresh;]" .. + "tooltip[btn_mp_clear;" .. fgettext("Clear") .. "]" .. + "tooltip[btn_mp_search;" .. fgettext("Search") .. "]" .. + "tooltip[btn_mp_refresh;" .. fgettext("Refresh") .. "]" .. + "container_end[]" .. + + "container[9.75,0]" .. + "box[0,0;5.75,7;#666666]" .. -- Address / Port - "label[7.75,-0.25;" .. fgettext("Address / Port") .. "]" .. - "field[8,0.65;3.25,0.5;te_address;;" .. + "label[0.25,0.35;" .. fgettext("Address") .. "]" .. + "label[4.25,0.35;" .. fgettext("Port") .. "]" .. + "field[0.25,0.5;4,0.75;te_address;;" .. core.formspec_escape(core.settings:get("address")) .. "]" .. - "field[11.1,0.65;1.4,0.5;te_port;;" .. + "field[4.25,0.5;1.25,0.75;te_port;;" .. core.formspec_escape(core.settings:get("remote_port")) .. "]" .. - -- Name / Password - "label[7.75,0.95;" .. fgettext("Name / Password") .. "]" .. - "field[8,1.85;2.9,0.5;te_name;;" .. - core.formspec_escape(core.settings:get("name")) .. "]" .. - "pwdfield[10.73,1.85;1.77,0.5;te_pwd;]" .. - -- Description Background - "box[7.73,2.25;4.25,2.6;#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[9.88,4.9;2.3,1;btn_mp_connect;" .. fgettext("Connect") .. "]" + "button[3,6;2.5,0.75;btn_mp_login;" .. fgettext("Login") .. "]" - if tabdata.fav_selected and fav_selected then + 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[7.73,4.9;2.3,1;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 fav_selected.description then - retval = retval .. "textarea[8.1,2.3;4.23,2.9;;;" .. - core.formspec_escape((gamedata.serverdescription or ""), true) .. "]" + if gamedata.serverdescription then + retval = retval .. "textarea[0.25,1.85;5.2,2.75;;;" .. + core.formspec_escape(gamedata.serverdescription) .. "]" end end - --favourites + retval = retval .. "container_end[]" + + -- Table retval = retval .. "tablecolumns[" .. - image_column(fgettext("Favorite"), "favorite") .. ";" .. - image_column(fgettext("Ping")) .. ",padding=0.25;" .. - "color,span=3;" .. - "text,align=right;" .. -- clients - "text,align=center,padding=0.25;" .. -- "/" - "text,align=right,padding=0.25;" .. -- clients_max - image_column(fgettext("Creative mode"), "creative") .. ",padding=1;" .. - image_column(fgettext("Damage enabled"), "damage") .. ",padding=0.25;" .. - --~ PvP = Player versus Player - image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. + "image,tooltip=" .. fgettext("Ping") .. "," .. + "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," .. + "1=" .. core.formspec_escape(defaulttexturedir .. "server_ping_4.png") .. "," .. + "2=" .. core.formspec_escape(defaulttexturedir .. "server_ping_3.png") .. "," .. + "3=" .. core.formspec_escape(defaulttexturedir .. "server_ping_2.png") .. "," .. + "4=" .. core.formspec_escape(defaulttexturedir .. "server_ping_1.png") .. "," .. + "5=" .. core.formspec_escape(defaulttexturedir .. "server_favorite.png") .. "," .. + "6=" .. core.formspec_escape(defaulttexturedir .. "server_public.png") .. "," .. + "7=" .. core.formspec_escape(defaulttexturedir .. "server_incompatible.png") .. ";" .. "color,span=1;" .. - "text,padding=1]" .. - "table[-0.15,0.6;7.75,5.15;favourites;" + "text,align=inline;".. + "color,span=1;" .. + "text,align=inline,width=4.25;" .. + "image,tooltip=" .. fgettext("Creative mode") .. "," .. + "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," .. + "1=" .. core.formspec_escape(defaulttexturedir .. "server_flags_creative.png") .. "," .. + "align=inline,padding=0.25,width=1.5;" .. + --~ PvP = Player versus Player + "image,tooltip=" .. fgettext("Damage / PvP") .. "," .. + "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," .. + "1=" .. core.formspec_escape(defaulttexturedir .. "server_flags_damage.png") .. "," .. + "2=" .. core.formspec_escape(defaulttexturedir .. "server_flags_pvp.png") .. "," .. + "align=inline,padding=0.25,width=1.5;" .. + "color,align=inline,span=1;" .. + "text,align=inline,padding=1]" .. + "table[0.25,1;9.25,5.75;servers;" - if menudata.search_result then - for i = 1, #menudata.search_result do - local favs = core.get_favorites("local") - local server = menudata.search_result[i] + local servers = get_sorted_servers() - for fav_id = 1, #favs do - if server.address == favs[fav_id].address and - server.port == favs[fav_id].port then - server.is_favorite = true - end - end + local dividers = { + fav = "5,#ffff00," .. fgettext("Favorites") .. ",,,0,0,,", + public = "6,#4bdd42," .. fgettext("Public Servers") .. ",,,0,0,,", + incompatible = "7,"..mt_color_grey.."," .. fgettext("Incompatible Servers") .. ",,,0,0,," + } + local order = {"fav", "public", "incompatible"} - if i ~= 1 then - retval = retval .. "," + tabdata.lookup = {} -- maps row number to server + local rows = {} + for _, section in ipairs(order) do + local section_servers = servers[section] + if next(section_servers) ~= nil then + rows[#rows + 1] = dividers[section] + for _, server in ipairs(section_servers) do + tabdata.lookup[#rows + 1] = server + rows[#rows + 1] = render_serverlist_row(server) end - - retval = retval .. render_serverlist_row(server, server.is_favorite) - end - elseif #menudata.favorites > 0 then - local favs = core.get_favorites("local") - if #favs > 0 then - for i = 1, #favs do - for j = 1, #menudata.favorites do - if menudata.favorites[j].address == favs[i].address and - menudata.favorites[j].port == favs[i].port then - table.insert(menudata.favorites, i, table.remove(menudata.favorites, j)) - end - end - if favs[i].address ~= menudata.favorites[i].address then - table.insert(menudata.favorites, i, favs[i]) - end - end - end - retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0)) - for i = 2, #menudata.favorites do - retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs)) end end - if tabdata.fav_selected then - retval = retval .. ";" .. tabdata.fav_selected .. "]" + retval = retval .. table.concat(rows, ",") + + if tabdata.selected then + retval = retval .. ";" .. tabdata.selected .. "]" else retval = retval .. ";0]" end - return retval + return retval, "size[15.5,7,false]real_coordinates[true]" end -------------------------------------------------------------------------------- -local function main_button_handler(tabview, fields, name, tabdata) - local serverlist = menudata.search_result or menudata.favorites +local function search_server_list(input) + menudata.search_result = nil + if #serverlistmgr.servers < 2 then + return + end + + -- setup the keyword list + local keywords = {} + for word in input:gmatch("%S+") do + word = word:gsub("(%W)", "%%%1") + table.insert(keywords, word) + end + + if #keywords == 0 then + return + end + + menudata.search_result = {} + + -- Search the serverlist + local search_result = {} + for i = 1, #serverlistmgr.servers do + local server = serverlistmgr.servers[i] + local found = 0 + for k = 1, #keywords do + local keyword = keywords[k] + if server.name then + local sername = server.name:lower() + local _, count = sername:gsub(keyword, keyword) + found = found + count * 4 + end + + if server.description then + local desc = server.description:lower() + local _, count = desc:gsub(keyword, keyword) + found = found + count * 2 + end + end + if found > 0 then + local points = (#serverlistmgr.servers - i) / 5 + found + server.points = points + table.insert(search_result, server) + end + end + + if #search_result == 0 then + return + end + + table.sort(search_result, function(a, b) + return a.points > b.points + end) + menudata.search_result = search_result +end + +local function set_selected_server(tabdata, idx, server) + -- reset selection + if idx == nil or server == nil then + tabdata.selected = nil + + core.settings:set("address", "") + core.settings:set("remote_port", "30000") + return + end + + local address = server.address + local port = server.port + gamedata.serverdescription = server.description + + gamedata.fav = false + for _, fav in ipairs(serverlistmgr.get_favorites()) do + if address == fav.address and port == fav.port then + gamedata.fav = true + break + end + end + + if address and port then + core.settings:set("address", address) + core.settings:set("remote_port", port) + end + tabdata.selected = idx +end + +local function main_button_handler(tabview, fields, name, tabdata) if fields.te_name then gamedata.playername = fields.te_name core.settings:set("name", fields.te_name) end - if fields.favourites then - local event = core.explode_table_event(fields.favourites) - local fav = serverlist[event.row] + if fields.servers then + local event = core.explode_table_event(fields.servers) + local server = tabdata.lookup[event.row] - if event.type == "DCL" then - if event.row <= #serverlist then - if menudata.favorites_is_public and - not is_server_protocol_compat_or_error( - fav.proto_min, fav.proto_max) then + if server then + if event.type == "DCL" then + if not is_server_protocol_compat_or_error( + server.proto_min, server.proto_max) then return true end - gamedata.address = fav.address - gamedata.port = fav.port + gamedata.address = server.address + gamedata.port = server.port gamedata.playername = fields.te_name gamedata.selected_world = 0 @@ -162,195 +295,129 @@ local function main_button_handler(tabview, fields, name, tabdata) gamedata.password = fields.te_pwd end - gamedata.servername = fav.name - gamedata.serverdescription = fav.description + gamedata.servername = server.name + gamedata.serverdescription = server.description if gamedata.address and gamedata.port then core.settings:set("address", gamedata.address) core.settings:set("remote_port", gamedata.port) core.start() end + return true end - return true - end - - if event.type == "CHG" then - if event.row <= #serverlist then - gamedata.fav = false - local favs = core.get_favorites("local") - local address = fav.address - local port = fav.port - gamedata.serverdescription = fav.description - - for i = 1, #favs do - if fav.address == favs[i].address and - fav.port == favs[i].port then - gamedata.fav = true - end - end - - if address and port then - core.settings:set("address", address) - core.settings:set("remote_port", port) - end - tabdata.fav_selected = event.row + if event.type == "CHG" then + set_selected_server(tabdata, event.row, server) + return true end - return true end end - if fields.key_up or fields.key_down then - local fav_idx = core.get_table_index("favourites") - local fav = serverlist[fav_idx] - - if fav_idx then - if fields.key_up and fav_idx > 1 then - fav_idx = fav_idx - 1 - elseif fields.key_down and fav_idx < #menudata.favorites then - fav_idx = fav_idx + 1 - end - else - fav_idx = 1 - end - - if not menudata.favorites or not fav then - tabdata.fav_selected = 0 - return true - end - - local address = fav.address - local port = fav.port - gamedata.serverdescription = fav.description - if address and port then - core.settings:set("address", address) - core.settings:set("remote_port", port) - end - - tabdata.fav_selected = fav_idx - return true - end - if fields.btn_delete_favorite then - local current_favourite = core.get_table_index("favourites") - if not current_favourite then return end + local idx = core.get_table_index("servers") + if not idx then return end + local server = tabdata.lookup[idx] + if not server then return end - core.delete_favorite(current_favourite) - asyncOnlineFavourites() - tabdata.fav_selected = nil + serverlistmgr.delete_favorite(server) + -- the server at [idx+1] will be at idx once list is refreshed + set_selected_server(tabdata, idx, tabdata.lookup[idx+1]) + return true + end - core.settings:set("address", "") - core.settings:set("remote_port", "30000") + if fields.btn_mp_clear then + tabdata.search_for = "" + menudata.search_result = nil return true end if fields.btn_mp_search or fields.key_enter_field == "te_search" then - tabdata.fav_selected = 1 - local input = fields.te_search:lower() tabdata.search_for = fields.te_search - - if #menudata.favorites < 2 then - return true + search_server_list(fields.te_search:lower()) + if menudata.search_result then + -- first server in row 2 due to header + set_selected_server(tabdata, 2, menudata.search_result[1]) end - menudata.search_result = {} - - -- setup the keyword list - local keywords = {} - for word in input:gmatch("%S+") do - word = word:gsub("(%W)", "%%%1") - table.insert(keywords, word) - end - - if #keywords == 0 then - menudata.search_result = nil - return true - end - - -- Search the serverlist - local search_result = {} - for i = 1, #menudata.favorites do - local server = menudata.favorites[i] - local found = 0 - for k = 1, #keywords do - local keyword = keywords[k] - if server.name then - local sername = server.name:lower() - local _, count = sername:gsub(keyword, keyword) - found = found + count * 4 - end - - if server.description then - local desc = server.description:lower() - local _, count = desc:gsub(keyword, keyword) - found = found + count * 2 - end - end - if found > 0 then - local points = (#menudata.favorites - i) / 5 + found - server.points = points - table.insert(search_result, server) - end - end - if #search_result > 0 then - table.sort(search_result, function(a, b) - return a.points > b.points - end) - menudata.search_result = search_result - local first_server = search_result[1] - core.settings:set("address", first_server.address) - core.settings:set("remote_port", first_server.port) - gamedata.serverdescription = first_server.description - end return true end if fields.btn_mp_refresh then - asyncOnlineFavourites() + serverlistmgr.sync() 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 = fields.te_port + 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 fav_idx = core.get_table_index("favourites") - local fav = serverlist[fav_idx] - if fav_idx and fav_idx <= #serverlist and - fav.address == fields.te_address and - fav.port == fields.te_port then + local idx = core.get_table_index("servers") + local server = idx and tabdata.lookup[idx] - gamedata.servername = fav.name - gamedata.serverdescription = fav.description + set_selected_server(tabdata) - if menudata.favorites_is_public and - not is_server_protocol_compat_or_error( - fav.proto_min, fav.proto_max) then + if server and server.address == gamedata.address and + server.port == gamedata.port then + + serverlistmgr.add_favorite(server) + + gamedata.servername = server.name + gamedata.serverdescription = server.description + + if not is_server_protocol_compat_or_error( + server.proto_min, server.proto_max) then return true end else gamedata.servername = "" gamedata.serverdescription = "" + + serverlistmgr.add_favorite({ + address = gamedata.address, + port = gamedata.port, + }) end - core.settings:set("address", fields.te_address) - core.settings:set("remote_port", fields.te_port) + core.settings:set("address", gamedata.address) + core.settings:set("remote_port", gamedata.port) core.start() 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 local function on_change(type, old_tab, new_tab) if type == "LEAVE" then return end - asyncOnlineFavourites() + serverlistmgr.sync() end --------------------------------------------------------------------------------- return { name = "online", caption = fgettext("Join Game"), diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index 510346f8d..21c77aa8e 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -43,6 +43,14 @@ local labels = { fgettext("2x"), fgettext("4x"), fgettext("8x") + }, + shadow_levels = { + fgettext("Disabled"), + fgettext("Very Low"), + fgettext("Low"), + fgettext("Medium"), + fgettext("High"), + fgettext("Very High") } } @@ -66,6 +74,10 @@ local dd_options = { antialiasing = { table.concat(labels.antialiasing, ","), {"0", "2", "4", "8"} + }, + shadow_levels = { + table.concat(labels.shadow_levels, ","), + { "0", "1", "2", "3", "4", "5" } } } @@ -110,6 +122,15 @@ local getSettingIndex = { end end return 1 + end, + ShadowMapping = function() + local shadow_setting = core.settings:get("shadow_levels") + for i = 1, #dd_options.shadow_levels[2] do + if shadow_setting == dd_options.shadow_levels[2][i] then + return i + end + end + return 1 end } @@ -139,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() .. "]" .. @@ -148,21 +169,21 @@ 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") - local shaders_supported = video_driver == "opengl" - local shaders_enabled = false - if shaders_supported then - shaders_enabled = core.settings:get_bool("enable_shaders") + local shaders_enabled = core.settings:get_bool("enable_shaders") + if video_driver == "opengl" then tab_string = tab_string .. "checkbox[8.25,0;cb_shaders;" .. fgettext("Shaders") .. ";" .. tostring(shaders_enabled) .. "]" + elseif video_driver == "ogles2" then + tab_string = tab_string .. + "checkbox[8.25,0;cb_shaders;" .. fgettext("Shaders (experimental)") .. ";" + .. tostring(shaders_enabled) .. "]" else core.settings:set_bool("enable_shaders", false) + shaders_enabled = false tab_string = tab_string .. "label[8.38,0.2;" .. core.colorize("#888888", fgettext("Shaders (unavailable)")) .. "]" @@ -179,40 +200,51 @@ 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 tab_string = tab_string .. - "checkbox[8.25,0.5;cb_bumpmapping;" .. fgettext("Bump Mapping") .. ";" - .. dump(core.settings:get_bool("enable_bumpmapping")) .. "]" .. - "checkbox[8.25,1;cb_tonemapping;" .. fgettext("Tone Mapping") .. ";" + "checkbox[8.25,0.5;cb_tonemapping;" .. fgettext("Tone Mapping") .. ";" .. dump(core.settings:get_bool("tone_mapping")) .. "]" .. - "checkbox[8.25,1.5;cb_parallax;" .. fgettext("Parallax Occlusion") .. ";" - .. dump(core.settings:get_bool("enable_parallax_occlusion")) .. "]" .. - "checkbox[8.25,2;cb_waving_water;" .. fgettext("Waving Liquids") .. ";" + "checkbox[8.25,1;cb_waving_water;" .. fgettext("Waving Liquids") .. ";" .. dump(core.settings:get_bool("enable_waving_water")) .. "]" .. - "checkbox[8.25,2.5;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";" + "checkbox[8.25,1.5;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";" .. dump(core.settings:get_bool("enable_waving_leaves")) .. "]" .. - "checkbox[8.25,3;cb_waving_plants;" .. fgettext("Waving Plants") .. ";" + "checkbox[8.25,2;cb_waving_plants;" .. fgettext("Waving Plants") .. ";" .. dump(core.settings:get_bool("enable_waving_plants")) .. "]" + + 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", - fgettext("Bump Mapping")) .. "]" .. - "label[8.38,1.2;" .. core.colorize("#888888", fgettext("Tone Mapping")) .. "]" .. - "label[8.38,1.7;" .. core.colorize("#888888", - fgettext("Parallax Occlusion")) .. "]" .. - "label[8.38,2.2;" .. core.colorize("#888888", + "label[8.38,1.2;" .. core.colorize("#888888", fgettext("Waving Liquids")) .. "]" .. - "label[8.38,2.7;" .. core.colorize("#888888", + "label[8.38,1.7;" .. core.colorize("#888888", fgettext("Waving Leaves")) .. "]" .. - "label[8.38,3.2;" .. core.colorize("#888888", - fgettext("Waving Plants")) .. "]" + "label[8.38,2.2;" .. core.colorize("#888888", + fgettext("Waving Plants")) .. "]".. + "label[8.38,2.7;" .. core.colorize("#888888", + fgettext("Dynamic shadows")) .. "]" end return tab_string @@ -226,7 +258,7 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) adv_settings_dlg:set_parent(this) this:hide() adv_settings_dlg:show() - --mm_texture.update("singleplayer", current_game()) + --mm_game_theme.update("singleplayer", current_game()) return true end if fields["cb_smooth_lighting"] then @@ -254,27 +286,13 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) return true end if fields["cb_shaders"] then - if (core.settings:get("video_driver") == "direct3d8" or - core.settings:get("video_driver") == "direct3d9") then - core.settings:set("enable_shaders", "false") - gamedata.errormessage = fgettext("To enable shaders the OpenGL driver needs to be used.") - else - core.settings:set("enable_shaders", fields["cb_shaders"]) - end - return true - end - if fields["cb_bumpmapping"] then - core.settings:set("enable_bumpmapping", fields["cb_bumpmapping"]) + core.settings:set("enable_shaders", fields["cb_shaders"]) return true end if fields["cb_tonemapping"] then core.settings:set("tone_mapping", fields["cb_tonemapping"]) return true end - if fields["cb_parallax"] then - core.settings:set("enable_parallax_occlusion", fields["cb_parallax"]) - return true - end if fields["cb_waving_water"] then core.settings:set("enable_waving_water", fields["cb_waving_water"]) return true @@ -346,6 +364,34 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) ddhandled = true end + for i = 1, #labels.shadow_levels do + if fields["dd_shadows"] == labels.shadow_levels[i] then + core.settings:set("shadow_levels", dd_options.shadow_levels[2][i]) + ddhandled = true + end + end + + if fields["dd_shadows"] == labels.shadow_levels[1] then + core.settings:set("enable_dynamic_shadows", "false") + else + local shadow_presets = { + [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 + core.settings:set("enable_dynamic_shadows", "true") + core.settings:set("shadow_map_max_distance", s[1]) + core.settings:set("shadow_map_texture_size", s[2]) + core.settings:set("shadow_map_texture_32bit", s[3]) + core.settings:set("shadow_filters", s[4]) + core.settings:set("shadow_map_color", s[5]) + end + end + return ddhandled end diff --git a/builtin/mainmenu/tests/favorites_wellformed.txt b/builtin/mainmenu/tests/favorites_wellformed.txt new file mode 100644 index 000000000..8b87b4398 --- /dev/null +++ b/builtin/mainmenu/tests/favorites_wellformed.txt @@ -0,0 +1,29 @@ +[server] + +127.0.0.1 +30000 + + +[server] + +localhost +30000 + + +[server] + +vps.rubenwardy.com +30001 + + +[server] + +gundul.ddnss.de +39155 + + +[server] +VanessaE's Dreambuilder creative Server +daconcepts.com +30000 +VanessaE's Dreambuilder creative-mode server. Lots of mods, whitelisted buckets. diff --git a/builtin/mainmenu/tests/pkgmgr_spec.lua b/builtin/mainmenu/tests/pkgmgr_spec.lua new file mode 100644 index 000000000..558fae9fb --- /dev/null +++ b/builtin/mainmenu/tests/pkgmgr_spec.lua @@ -0,0 +1,243 @@ +--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 mods_dir = "/tmp/.minetest/mods" +local games_dir = "/tmp/.minetest/games" +local txp_dir = "/tmp/.minetest/textures" + +local function reset() + local env = { + core = {}, + unpack = table.unpack or unpack, + pkgmgr = {}, + DIR_DELIM = "/", + } + env._G = env + setmetatable(env, { __index = _G }) + + local core = env.core + + local calls = {} + function core.get_games() + return {} + end + function core.delete_dir(...) + table.insert(calls, { "delete_dir", ... }) + return true + end + function core.copy_dir(...) + table.insert(calls, { "copy_dir", ... }) + return true + end + function core.get_texturepath() + return txp_dir + end + function core.get_modpath() + return mods_dir + end + function core.get_gamepath() + return games_dir + end + function env.fgettext(fmt, ...) + return fmt + end + + setfenv(loadfile("builtin/common/misc_helpers.lua"), env)() + setfenv(loadfile("builtin/mainmenu/pkgmgr.lua"), env)() + + function env.pkgmgr.update_gamelist() + table.insert(calls, { "update_gamelist" }) + end + function env.pkgmgr.refresh_globals() + table.insert(calls, { "refresh_globals" }) + end + + function env.assert_calls(list) + assert.are.same(list, calls) + end + + return env +end + + +describe("install_dir", function() + it("installs texture pack", function() + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = "invalid", path = "/tmp/123" } + end + + local path, message = env.pkgmgr.install_dir("txp", "/tmp/123", "mytxp", nil) + assert.is.equal(txp_dir .. "/mytxp", path) + assert.is._nil(message) + env.assert_calls({ + { "delete_dir", txp_dir .. "/mytxp" }, + { "copy_dir", "/tmp/123", txp_dir .. "/mytxp", false }, + }) + end) + + it("prevents installing other as texture pack", function() + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = "mod", path = "/tmp/123" } + end + + local path, message = env.pkgmgr.install_dir("txp", "/tmp/123", "mytxp", nil) + assert.is._nil(path) + assert.is.equal("Unable to install a $1 as a texture pack", message) + end) + + it("installs mod", function() + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = "mod", path = "/tmp/123" } + end + + local path, message = env.pkgmgr.install_dir("mod", "/tmp/123", "mymod", nil) + assert.is.equal(mods_dir .. "/mymod", path) + assert.is._nil(message) + env.assert_calls({ + { "delete_dir", mods_dir .. "/mymod" }, + { "copy_dir", "/tmp/123", mods_dir .. "/mymod", false }, + { "refresh_globals" }, + }) + end) + + it("installs modpack", function() + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = "modpack", path = "/tmp/123" } + end + + local path, message = env.pkgmgr.install_dir("mod", "/tmp/123", "mymod", nil) + assert.is.equal(mods_dir .. "/mymod", path) + assert.is._nil(message) + env.assert_calls({ + { "delete_dir", mods_dir .. "/mymod" }, + { "copy_dir", "/tmp/123", mods_dir .. "/mymod", false }, + { "refresh_globals" }, + }) + end) + + it("installs game", function() + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = "game", path = "/tmp/123" } + end + + local path, message = env.pkgmgr.install_dir("game", "/tmp/123", "mygame", nil) + assert.is.equal(games_dir .. "/mygame", path) + assert.is._nil(message) + env.assert_calls({ + { "delete_dir", games_dir .. "/mygame" }, + { "copy_dir", "/tmp/123", games_dir .. "/mygame", false }, + { "update_gamelist" }, + }) + end) + + it("installs mod detects name", function() + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = "mod", path = "/tmp/123" } + end + + local path, message = env.pkgmgr.install_dir("mod", "/tmp/123", nil, nil) + assert.is.equal(mods_dir .. "/123", path) + assert.is._nil(message) + env.assert_calls({ + { "delete_dir", mods_dir .. "/123" }, + { "copy_dir", "/tmp/123", mods_dir .. "/123", false }, + { "refresh_globals" }, + }) + end) + + it("installs mod detects invalid name", function() + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = "mod", path = "/tmp/hi!" } + end + + local path, message = env.pkgmgr.install_dir("mod", "/tmp/hi!", nil, nil) + assert.is._nil(path) + assert.is.equal("Install: Unable to find suitable folder name for $1", message) + end) + + it("installs mod to target (update)", function() + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = "mod", path = "/tmp/123" } + end + + local path, message = env.pkgmgr.install_dir("mod", "/tmp/123", "mymod", "/tmp/alt-target") + assert.is.equal("/tmp/alt-target", path) + assert.is._nil(message) + env.assert_calls({ + { "delete_dir", "/tmp/alt-target" }, + { "copy_dir", "/tmp/123", "/tmp/alt-target", false }, + { "refresh_globals" }, + }) + end) + + it("checks expected types", function() + local actual_type = "modpack" + local env = reset() + env.pkgmgr.get_base_folder = function() + return { type = actual_type, path = "/tmp/123" } + end + + local path, message = env.pkgmgr.install_dir("mod", "/tmp/123", "name", nil) + assert.is._not._nil(path) + assert.is._nil(message) + + path, message = env.pkgmgr.install_dir("game", "/tmp/123", "name", nil) + assert.is._nil(path) + assert.is.equal("Unable to install a $1 as a $2", message) + + path, message = env.pkgmgr.install_dir("txp", "/tmp/123", "name", nil) + assert.is._nil(path) + assert.is.equal("Unable to install a $1 as a texture pack", message) + + actual_type = "game" + + path, message = env.pkgmgr.install_dir("mod", "/tmp/123", "name", nil) + assert.is._nil(path) + assert.is.equal("Unable to install a $1 as a $2", message) + + path, message = env.pkgmgr.install_dir("game", "/tmp/123", "name", nil) + assert.is._not._nil(path) + assert.is._nil(message) + + path, message = env.pkgmgr.install_dir("txp", "/tmp/123", "name", nil) + assert.is._nil(path) + assert.is.equal("Unable to install a $1 as a texture pack", message) + + actual_type = "txp" + + path, message = env.pkgmgr.install_dir("mod", "/tmp/123", "name", nil) + assert.is._nil(path) + assert.is.equal("Unable to install a $1 as a $2", message) + + path, message = env.pkgmgr.install_dir("game", "/tmp/123", "name", nil) + assert.is._nil(path) + assert.is.equal("Unable to install a $1 as a $2", message) + + path, message = env.pkgmgr.install_dir("txp", "/tmp/123", "name", nil) + assert.is._not._nil(path) + assert.is._nil(message) + + end) +end) diff --git a/builtin/mainmenu/tests/serverlistmgr_spec.lua b/builtin/mainmenu/tests/serverlistmgr_spec.lua new file mode 100644 index 000000000..ab7a6c60c --- /dev/null +++ b/builtin/mainmenu/tests/serverlistmgr_spec.lua @@ -0,0 +1,38 @@ +_G.core = {} +_G.vector = {metatable = {}} +_G.unpack = table.unpack +_G.serverlistmgr = {} + +dofile("builtin/common/vector.lua") +dofile("builtin/common/misc_helpers.lua") +dofile("builtin/mainmenu/serverlistmgr.lua") + +local base = "builtin/mainmenu/tests/" + +describe("legacy favorites", function() + it("loads well-formed correctly", function() + local favs = serverlistmgr.read_legacy_favorites(base .. "favorites_wellformed.txt") + + local expected = { + { + address = "127.0.0.1", + port = 30000, + }, + + { address = "localhost", port = 30000 }, + + { address = "vps.rubenwardy.com", port = 30001 }, + + { address = "gundul.ddnss.de", port = 39155 }, + + { + address = "daconcepts.com", + port = 30000, + name = "VanessaE's Dreambuilder creative Server", + description = "VanessaE's Dreambuilder creative-mode server. Lots of mods, whitelisted buckets." + }, + } + + assert.same(expected, favs) + end) +end) diff --git a/builtin/profiler/init.lua b/builtin/profiler/init.lua index a0033d752..7f63dfaea 100644 --- a/builtin/profiler/init.lua +++ b/builtin/profiler/init.lua @@ -15,6 +15,8 @@ --with this program; if not, write to the Free Software Foundation, Inc., --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +local S = core.get_translator("__builtin") + local function get_bool_default(name, default) local val = core.settings:get_bool(name) if val == nil then @@ -40,9 +42,9 @@ function profiler.init_chatcommand() instrumentation.init_chatcommand() end - local param_usage = "print [filter] | dump [filter] | save [format [filter]] | reset" + local param_usage = S("print [] | dump [] | save [ []] | reset") core.register_chatcommand("profiler", { - description = "handle the profiler and profiling data", + description = S("Handle the profiler and profiling data"), params = param_usage, privs = { server=true }, func = function(name, param) @@ -51,21 +53,19 @@ function profiler.init_chatcommand() if command == "dump" then core.log("action", reporter.print(sampler.profile, arg0)) - return true, "Statistics written to action log" + return true, S("Statistics written to action log.") elseif command == "print" then return true, reporter.print(sampler.profile, arg0) elseif command == "save" then return reporter.save(sampler.profile, args[1] or "txt", args[2]) elseif command == "reset" then sampler.reset() - return true, "Statistics were reset" + return true, S("Statistics were reset.") end - return false, string.format( - "Usage: %s\n" .. - "Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).", - param_usage - ) + return false, + S("Usage: @1", param_usage) .. "\n" .. + S("Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).") end }) diff --git a/builtin/profiler/instrumentation.lua b/builtin/profiler/instrumentation.lua index 237f048fb..f80314b32 100644 --- a/builtin/profiler/instrumentation.lua +++ b/builtin/profiler/instrumentation.lua @@ -102,8 +102,9 @@ local function instrument(def) -- also called https://en.wikipedia.org/wiki/Continuation_passing_style -- Compared to table creation and unpacking it won't lose `nil` returns -- and is expected to be faster - -- `measure` will be executed after time() and func(...) - return measure(modname, instrument_name, time(), func(...)) + -- `measure` will be executed after func(...) + local start = time() + return measure(modname, instrument_name, start, func(...)) end end @@ -160,6 +161,7 @@ local function init() -- Simple iteration would ignore lookup via __index. local entity_instrumentation = { "on_activate", + "on_deactivate", "on_step", "on_punch", "on_rightclick", diff --git a/builtin/profiler/reporter.lua b/builtin/profiler/reporter.lua index fed47a36b..5928a3718 100644 --- a/builtin/profiler/reporter.lua +++ b/builtin/profiler/reporter.lua @@ -15,6 +15,10 @@ --with this program; if not, write to the Free Software Foundation, Inc., --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +local S = core.get_translator("__builtin") +-- Note: In this file, only messages are translated +-- but not the table itself, to keep it simple. + local DIR_DELIM, LINE_DELIM = DIR_DELIM, "\n" local table, unpack, string, pairs, io, os = table, unpack, string, pairs, io, os local rep, sprintf, tonumber = string.rep, string.format, tonumber @@ -104,11 +108,11 @@ local TxtFormatter = Formatter:new { end, format = function(self, filter) local profile = self.profile - self:print("Values below show absolute/relative times spend per server step by the instrumented function.") - self:print("A total of %d samples were taken", profile.stats_total.samples) + self:print(S("Values below show absolute/relative times spend per server step by the instrumented function.")) + self:print(S("A total of @1 sample(s) were taken.", profile.stats_total.samples)) if filter then - self:print("The output is limited to '%s'", filter) + self:print(S("The output is limited to '@1'.", filter)) end self:print() @@ -259,19 +263,18 @@ function reporter.save(profile, format, filter) local output, io_err = io.open(path, "w") if not output then - return false, "Saving of profile failed with: " .. io_err + return false, S("Saving of profile failed: @1", io_err) end local content, err = serialize_profile(profile, format, filter) if not content then output:close() - return false, "Saving of profile failed with: " .. err + return false, S("Saving of profile failed: @1", err) end output:write(content) output:close() - local logmessage = "Profile saved to " .. path - core.log("action", logmessage) - return true, logmessage + core.log("action", "Profile saved to " .. path) + return true, S("Profile saved to @1", path) end return reporter diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 6d9c6f573..7376c0cb7 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 "special" 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,26 +82,20 @@ 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, "special" key instead of "sneak" key is used for climbing down and +# If enabled, "Aux1" key instead of "Sneak" key is used for climbing down and # descending. -aux1_descends (Special key for climbing/descending) bool false +aux1_descends (Aux1 key for climbing/descending) bool false # Double-tapping the jump key toggles fly mode. doubletap_jump (Double tap jump for fly) bool false -# If disabled, "special" key is used to fly fast if both fly and fast mode are +# 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 @@ -135,26 +121,1950 @@ touchscreen_threshold (Touch screen threshold) int 20 0 100 # If disabled, virtual joystick will center to first-touch's position. fixed_virtual_joystick (Fixed virtual joystick) bool false -# (Android) Use virtual joystick to trigger "aux" button. -# If enabled, virtual joystick will also tap "aux" button when out of main circle. -virtual_joystick_triggers_aux (Virtual joystick triggers aux button) bool false +# (Android) Use virtual joystick to trigger "Aux1" button. +# 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 + +[Graphics and Audio] + +[*Graphics] + +[**Screen] + +# Width component of the initial window size. Ignored in fullscreen mode. +screen_w (Screen width) int 1024 1 65535 + +# Height component of the initial window size. Ignored in fullscreen mode. +screen_h (Screen height) int 600 1 65535 + +# Save window size automatically when modified. +autosave_screensize (Autosave screen size) bool true + +# Fullscreen mode. +fullscreen (Full screen) bool false + +# 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 + +[**FPS] + +# 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 + +# Vertical screen synchronization. +vsync (VSync) bool false + +# 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 + +# View distance in nodes. +viewing_range (Viewing range) int 190 20 4000 + +# 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 + +[**Graphics Effects] + +# Makes all liquids opaque +opaque_water (Opaque liquids) bool false + +# 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 + +# Enable smooth lighting with simple ambient occlusion. +# Disable for speed or for different looks. +smooth_lighting (Smooth lighting) bool true + +# 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 + +# Adds particles when digging a node. +enable_particles (Digging particles) bool true + +[**3d] + +# 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 -0.087 0.087 + +[**Bobbing] + +# Arm inertia, gives a more realistic movement of +# the arm when the camera moves. +arm_inertia (Arm inertia) bool true + +# 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 + +# 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 + +[**Camera] + +# 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 + +# Field of view in degrees. +fov (Field of view) int 72 45 160 + +# 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 + +# 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 + +[**Screenshots] + +# 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 + +[**Node and Entity Highlighting] + +# Method used to highlight selected object. +node_highlighting (Node highlighting) enum box box,halo,none + +# Show entity selection boxes +# A restart is required after changing this. +show_entity_selectionbox (Show entity selection boxes) bool false + +# 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 + +[**Fog] + +# Whether to fog out the end of the visible area. +enable_fog (Fog) bool true + +# Make fog and sky colors depend on daytime (dawn/sunset) and view direction. +directional_colored_fog (Colored fog) 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 + +[**Clouds] + +# Clouds are a client side effect. +enable_clouds (Clouds) bool true + +# Use 3D cloud look instead of flat. +enable_3d_clouds (3D clouds) bool true + +[**Filtering and Antialiasing] + +# Use mipmapping to scale textures. May slightly increase performance, +# especially when using a high resolution texture pack. +# Gamma correct downscaling is not supported. +mip_map (Mipmapping) bool false + +# Use anisotropic filtering when viewing at textures from an angle. +anisotropic_filter (Anisotropic filtering) bool false + +# Use bilinear filtering when scaling textures. +bilinear_filter (Bilinear filtering) bool false + +# Use trilinear filtering when scaling textures. +trilinear_filter (Trilinear filtering) bool false + +# Filtered textures can blend RGB values with fully-transparent neighbors, +# which PNG optimizers usually discard, often resulting in dark or +# light edges to transparent textures. Apply a filter to clean that up +# at texture load time. This is automatically enabled if mipmapping is enabled. +texture_clean_transparent (Clean transparent textures) bool false + +# When using bilinear/trilinear/anisotropic filters, low-resolution textures +# can be blurred, so automatically upscale them with nearest-neighbor +# interpolation to preserve crisp pixels. This sets the minimum texture size +# for the upscaled textures; higher values look sharper, but require more +# memory. Powers of 2 are recommended. This setting is ONLY applied if +# 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 1 32768 + +# Use multi-sample antialiasing (MSAA) to smooth out block edges. +# This algorithm smooths out the 3D viewport while keeping the image sharp, +# but it doesn't affect the insides of textures +# (which is especially noticeable with transparent textures). +# Visible spaces appear between nodes when shaders are disabled. +# If set to 0, MSAA is disabled. +# A restart is required after changing this option. +fsaa (FSAA) enum 0 0,1,2,4,8,16 + + +[*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 + +[**Tone Mapping] + +# Enables Hable's 'Uncharted 2' filmic tone mapping. +# Simulates the tone curve of photographic film and how this approximates the +# appearance of high dynamic range images. Mid-range contrast is slightly +# enhanced, highlights and shadows are gradually compressed. +tone_mapping (Filmic tone mapping) bool false + +[**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. +enable_waving_water (Waving liquids) bool false + +# The maximum height of the surface of waving liquids. +# 4.0 = Wave height is two nodes. +# 0.0 = Wave doesn't move at all. +# Default is 1.0 (1/2 node). +# Requires waving liquids to be enabled. +water_wave_height (Waving liquids wave height) float 1.0 0.0 4.0 + +# Length of liquid waves. +# Requires waving liquids to be enabled. +water_wave_length (Waving liquids wavelength) float 20.0 0.1 + +# How fast liquid waves will move. Higher = faster. +# If negative, liquid waves will move backwards. +# Requires waving liquids to be enabled. +water_wave_speed (Waving liquids wave speed) float 5.0 + +[**Dynamic shadows] + +# Set to true to enable Shadow Mapping. +# Requires shaders to be enabled. +enable_dynamic_shadows (Dynamic shadows) bool false + +# 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 + +# 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 + +# 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 + +# 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 + +# Enable Poisson disk filtering. +# On true uses Poisson disk to make "soft shadows". Otherwise uses PCF filtering. +shadow_poisson_filter (Poisson filtering) bool true + +# 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 + +# Enable colored shadows. +# On true translucent nodes cast colored shadows. This is expensive. +shadow_map_color (Colored shadows) bool false + +# 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 + +# 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 + +# 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 + +[*Audio] + +# 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 + +[*User Interfaces] + +# 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 + +[**GUIs] + +# 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 + +# 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 + +# Formspec full-screen background color (R,G,B). +formspec_fullscreen_bg_color (Formspec Full-Screen Background Color) string (0,0,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). +gui_scaling_filter (GUI scaling filter) bool false + +# When gui_scaling_filter_txr2img is true, copy those images +# from hardware to software for scaling. When false, fall back +# to the old scaling method, for video drivers that don't +# properly support downloading textures back from hardware. +gui_scaling_filter_txr2img (GUI scaling filter txr2img) bool true + +# Delay showing tooltips, stated in milliseconds. +tooltip_show_delay (Tooltip delay) int 400 0 18446744073709551615 + +# Append item name to tooltip. +tooltip_append_itemname (Append item name) bool false + +# Use a cloud animation for the main menu background. +menu_clouds (Clouds in menu) bool true + +[**HUD] + +# Modifies the size of the HUD elements. +hud_scaling (HUD scaling) float 1.0 0.5 20 + +# 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 + +[**Chat] + +# Maximum number of recent chat messages to show +recent_chat_messages (Recent Chat Messages) int 6 2 20 + +# In-game chat console height, between 0.1 (10%) and 1.0 (100%). +console_height (Console height) float 0.6 0.1 1.0 + +# In-game chat console background color (R,G,B). +console_color (Console color) string (0,0,0) + +# In-game chat console background alpha (opaqueness, between 0 and 255). +console_alpha (Console alpha) int 200 0 255 + +# 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 + +# Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output. +clickable_chat_weblinks (Chat weblinks) bool true + +# 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 0 72 + + +[**Content Repository] + +# The URL for the content repository +contentdb_url (ContentDB URL) string https://content.minetest.net + +# 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 + +# 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 + + +[Client and Server] + +[*Client] + +# Save the map received by the client on disk. +enable_local_map_saving (Saving map received from server) bool false + +# URL to the server list displayed in the Multiplayer Tab. +serverlist_url (Serverlist URL) string servers.minetest.net + +# 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 + +# 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 + +# 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 + +# 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 + +[*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 (Admin name) string + +[**Serverlist and MOTD] + +# Name of the server, to be displayed when players join and in the serverlist. +server_name (Server name) string Minetest server + +# Description of server, to be displayed when players join and in the serverlist. +server_description (Server description) string mine here + +# Domain name of server, to be displayed in the serverlist. +server_address (Server address) string game.minetest.net + +# Homepage of server, to be displayed in the serverlist. +server_url (Server URL) string https://minetest.net + +# Automatically report to the serverlist. +server_announce (Announce server) bool false + +# Announce to this serverlist. +serverlist_url (Serverlist URL) string servers.minetest.net + +# 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 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 1 65535 + +# The network interface that the server listens on. +bind_address (Bind address) string + +# Enable to disallow old clients from connecting. +# Older clients are compatible in the sense that they will not crash when connecting +# to new servers, but they may not support all new features that you are expecting. +strict_protocol_version_checking (Strict protocol checking) bool false + +# Specifies URL from which client fetches media instead of using UDP. +# $filename should be accessible from $remote_media$filename via cURL +# (obviously, remote_media should end with a slash). +# Files that are not present will be fetched the usual way. +remote_media (Remote media) string + +# Enable/disable running an IPv6 server. +# Ignored if bind_address is set. +# Needs enable_ipv6 to be enabled. +ipv6_server (IPv6 server) bool false + +[*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 + +# Privileges that players with basic_privs can grant +basic_privs (Basic privileges) string interact, shout + +# If enabled, disable cheat prevention in multiplayer. +disable_anticheat (Disable anticheat) bool false + +# If enabled, actions are recorded for rollback. +# This option is only read when server starts. +enable_rollback_recording (Rollback recording) bool false + +[**Client-side Modding] + +# 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 + +# 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 + +[**Chat] + +# 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 + +# 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 + +# Amount of messages a player may send per 10 seconds. +chat_message_limit_per_10sec (Chat message count limit) float 10.0 1.0 + +# Kick players who sent more than X messages per 10 seconds. +chat_message_limit_trigger_kick (Chat message kick threshold) int 50 1 65535 + +[*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 0 + +# Time of day when a new world is started, in millihours (0-23999). +world_start_time (World start time) int 6125 0 23999 + +# 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 + +# 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.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.0 0.0 + +# Horizontal and vertical acceleration in fast mode, +# in nodes per second per second. +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.0 0.0 + +# Sneaking speed, in nodes per second. +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.0 0.0 + +# Vertical climbing speed, in nodes per second. +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 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.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 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 + + +[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: +# - The optional floatlands of v7 (disabled by default). +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 -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 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. +# Value is stored per-world. +mapgen_limit (Map generation limit) int 31007 0 31007 + +# Global map generation attributes. +# In Mapgen v6 the 'decorations' flag controls all decorations except trees +# 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 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 + +# Small-scale temperature variation for blending biomes on borders. +mg_biome_np_heat_blend (Heat blend noise) noise_params_2d 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0, eased + +# Humidity variation for biomes. +mg_biome_np_humidity (Humidity noise) noise_params_2d 50, 50, (1000, 1000, 1000), 842, 3, 0.5, 2.0, eased + +# Small-scale humidity variation for blending biomes on borders. +mg_biome_np_humidity_blend (Humidity blend noise) noise_params_2d 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0, eased + +[*Mapgen V5] + +# Map generation attributes specific to Mapgen v5. +mgv5_spflags (Mapgen V5 specific flags) flags caverns caverns,nocaverns + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +mgv5_cave_width (Cave width) float 0.09 + +# Y of upper limit of large caves. +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 + +# Maximum limit of random number of small caves per mapchunk. +mgv5_small_cave_num_max (Small cave maximum number) int 0 0 256 + +# Minimum limit of random number of large caves per mapchunk. +mgv5_large_cave_num_min (Large cave minimum number) int 0 0 64 + +# Maximum limit of random number of large caves per mapchunk. +mgv5_large_cave_num_max (Large cave maximum number) int 2 0 64 + +# Proportion of large caves that contain liquid. +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 -31000 31000 + +# Y-distance over which caverns expand to full size. +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 -31000 31000 + +# Upper Y limit of dungeons. +mgv5_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000 + +[**Noises] + +# Variation of biome filler depth. +mgv5_np_filler_depth (Filler depth noise) noise_params_2d 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0, eased + +# Variation of terrain vertical scale. +# When noise is < -0.55 terrain is near-flat. +mgv5_np_factor (Factor noise) noise_params_2d 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0, eased + +# Y-level of average terrain surface. +mgv5_np_height (Height noise) noise_params_2d 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0, eased + +# First of two 3D noises that together define tunnels. +mgv5_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of two 3D noises that together define tunnels. +mgv5_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 + +# 3D noise defining giant caverns. +mgv5_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 + +# 3D noise defining terrain. +mgv5_np_ground (Ground noise) noise_params_3d 0, 40, (80, 80, 80), 983240, 4, 0.55, 2.0, eased + +# 3D noise that determines number of dungeons per mapchunk. +mgv5_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 + +[*Mapgen V6] + +# Map generation attributes specific to Mapgen v6. +# The 'snowbiomes' flag enables the new 5 biome system. +# When the 'snowbiomes' flag is enabled jungles are automatically enabled and +# the 'jungles' flag is ignored. +mgv6_spflags (Mapgen V6 specific flags) flags jungles,biomeblend,mudflow,snowbiomes,noflat,trees jungles,biomeblend,mudflow,snowbiomes,flat,trees,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees + +# Deserts occur when np_biome exceeds this value. +# When the 'snowbiomes' flag is enabled, this is ignored. +mgv6_freq_desert (Desert noise threshold) float 0.45 + +# Sandy beaches occur when np_beach exceeds this value. +mgv6_freq_beach (Beach noise threshold) float 0.15 + +# Lower Y limit of dungeons. +mgv6_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000 + +# Upper Y limit of dungeons. +mgv6_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000 + +[**Noises] + +# Y-level of lower terrain and seabed. +mgv6_np_terrain_base (Terrain base noise) noise_params_2d -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0, eased + +# Y-level of higher terrain that creates cliffs. +mgv6_np_terrain_higher (Terrain higher noise) noise_params_2d 20, 16, (500, 500, 500), 85039, 5, 0.6, 2.0, eased + +# Varies steepness of cliffs. +mgv6_np_steepness (Steepness noise) noise_params_2d 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0, eased + +# Defines distribution of higher terrain. +mgv6_np_height_select (Height select noise) noise_params_2d 0.5, 1, (250, 250, 250), 4213, 5, 0.69, 2.0, eased + +# Varies depth of biome surface nodes. +mgv6_np_mud (Mud noise) noise_params_2d 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0, eased + +# Defines areas with sandy beaches. +mgv6_np_beach (Beach noise) noise_params_2d 0, 1, (250, 250, 250), 59420, 3, 0.50, 2.0, eased + +# Temperature variation for biomes. +mgv6_np_biome (Biome noise) noise_params_2d 0, 1, (500, 500, 500), 9130, 3, 0.50, 2.0, eased + +# Variation of number of caves. +mgv6_np_cave (Cave noise) noise_params_2d 6, 6, (250, 250, 250), 34329, 3, 0.50, 2.0, eased + +# Humidity variation for biomes. +mgv6_np_humidity (Humidity noise) noise_params_2d 0.5, 0.5, (500, 500, 500), 72384, 3, 0.50, 2.0, eased + +# Defines tree areas and tree density. +mgv6_np_trees (Trees noise) noise_params_2d 0, 1, (125, 125, 125), 2, 4, 0.66, 2.0, eased + +# Defines areas where trees have apples. +mgv6_np_apple_trees (Apple trees noise) noise_params_2d 0, 1, (100, 100, 100), 342902, 3, 0.45, 2.0, eased + +[*Mapgen V7] + +# Map generation attributes specific to Mapgen v7. +# 'ridges': Rivers. +# 'floatlands': Floating land masses in the atmosphere. +# 'caverns': Giant caves deep underground. +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 -31000 31000 + +# Lower Y limit of floatlands. +mgv7_floatland_ymin (Floatland minimum Y) int 1024 -31000 31000 + +# Upper Y limit of floatlands. +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 0 32767 + +# Exponent of the floatland tapering. Alters the tapering behaviour. +# Value = 1.0 creates a uniform, linear tapering. +# Values > 1.0 create a smooth tapering suitable for the default separated +# floatlands. +# Values < 1.0 (for example 0.25) create a more defined surface level with +# flatter lowlands, suitable for a solid floatland layer. +mgv7_float_taper_exp (Floatland taper exponent) float 2.0 + +# Adjusts the density of the floatland layer. +# Increase value to increase density. Can be positive or negative. +# Value = 0.0: 50% of volume is floatland. +# Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test +# to be sure) creates a solid floatland layer. +mgv7_floatland_density (Floatland density) float -0.6 + +# Surface level of optional water placed on a solid floatland layer. +# Water is disabled by default and will only be placed if this value is set +# to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the +# upper tapering). +# ***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***: +# When enabling water placement the floatlands must be configured and tested +# to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other +# 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 -31000 31000 + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +mgv7_cave_width (Cave width) float 0.09 + +# Y of upper limit of large caves. +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 + +# Maximum limit of random number of small caves per mapchunk. +mgv7_small_cave_num_max (Small cave maximum number) int 0 0 256 + +# Minimum limit of random number of large caves per mapchunk. +mgv7_large_cave_num_min (Large cave minimum number) int 0 0 64 + +# Maximum limit of random number of large caves per mapchunk. +mgv7_large_cave_num_max (Large cave maximum number) int 2 0 64 + +# Proportion of large caves that contain liquid. +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 -31000 31000 + +# Y-distance over which caverns expand to full size. +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 -31000 31000 + +# Upper Y limit of dungeons. +mgv7_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000 + +[**Noises] + +# Y-level of higher terrain that creates cliffs. +mgv7_np_terrain_base (Terrain base noise) noise_params_2d 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0, eased + +# Y-level of lower terrain and seabed. +mgv7_np_terrain_alt (Terrain alternative noise) noise_params_2d 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0, eased + +# Varies roughness of terrain. +# Defines the 'persistence' value for terrain_base and terrain_alt noises. +mgv7_np_terrain_persist (Terrain persistence noise) noise_params_2d 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0, eased + +# Defines distribution of higher terrain and steepness of cliffs. +mgv7_np_height_select (Height select noise) noise_params_2d -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0, eased + +# Variation of biome filler depth. +mgv7_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased + +# Variation of maximum mountain height (in nodes). +mgv7_np_mount_height (Mountain height noise) noise_params_2d 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0, eased + +# Defines large-scale river channel structure. +mgv7_np_ridge_uwater (Ridge underwater noise) noise_params_2d 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0, eased + +# 3D noise defining mountain structure and height. +# Also defines structure of floatland mountain terrain. +mgv7_np_mountain (Mountain noise) noise_params_3d -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0 + +# 3D noise defining structure of river canyon walls. +mgv7_np_ridge (Ridge noise) noise_params_3d 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0 + +# 3D noise defining structure of floatlands. +# If altered from the default, the noise 'scale' (0.7 by default) may need +# to be adjusted, as floatland tapering functions best when this noise has +# a value range of approximately -2.0 to 2.0. +mgv7_np_floatland (Floatland noise) noise_params_3d 0, 0.7, (384, 96, 384), 1009, 4, 0.75, 1.618 + +# 3D noise defining giant caverns. +mgv7_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 + +# First of two 3D noises that together define tunnels. +mgv7_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of two 3D noises that together define tunnels. +mgv7_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 + +# 3D noise that determines number of dungeons per mapchunk. +mgv7_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 + +[*Mapgen Carpathian] + +# Map generation attributes specific to Mapgen Carpathian. +mgcarpathian_spflags (Mapgen Carpathian specific flags) flags caverns,norivers caverns,rivers,nocaverns,norivers + +# Defines the base ground level. +mgcarpathian_base_level (Base ground level) float 12.0 + +# Defines the width of the river channel. +mgcarpathian_river_width (River channel width) float 0.05 + +# Defines the depth of the river channel. +mgcarpathian_river_depth (River channel depth) float 24.0 + +# Defines the width of the river valley. +mgcarpathian_valley_width (River valley width) float 0.25 + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +mgcarpathian_cave_width (Cave width) float 0.09 + +# Y of upper limit of large caves. +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 + +# Maximum limit of random number of small caves per mapchunk. +mgcarpathian_small_cave_num_max (Small cave maximum number) int 0 0 256 + +# Minimum limit of random number of large caves per mapchunk. +mgcarpathian_large_cave_num_min (Large cave minimum number) int 0 0 64 + +# Maximum limit of random number of large caves per mapchunk. +mgcarpathian_large_cave_num_max (Large cave maximum number) int 2 0 64 + +# Proportion of large caves that contain liquid. +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 -31000 31000 + +# Y-distance over which caverns expand to full size. +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 -31000 31000 + +# Upper Y limit of dungeons. +mgcarpathian_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000 + +[**Noises] + +# Variation of biome filler depth. +mgcarpathian_np_filler_depth (Filler depth noise) noise_params_2d 0, 1, (128, 128, 128), 261, 3, 0.7, 2.0, eased + +# First of 4 2D noises that together define hill/mountain range height. +mgcarpathian_np_height1 (Hilliness1 noise) noise_params_2d 0, 5, (251, 251, 251), 9613, 5, 0.5, 2.0, eased + +# Second of 4 2D noises that together define hill/mountain range height. +mgcarpathian_np_height2 (Hilliness2 noise) noise_params_2d 0, 5, (383, 383, 383), 1949, 5, 0.5, 2.0, eased + +# Third of 4 2D noises that together define hill/mountain range height. +mgcarpathian_np_height3 (Hilliness3 noise) noise_params_2d 0, 5, (509, 509, 509), 3211, 5, 0.5, 2.0, eased + +# Fourth of 4 2D noises that together define hill/mountain range height. +mgcarpathian_np_height4 (Hilliness4 noise) noise_params_2d 0, 5, (631, 631, 631), 1583, 5, 0.5, 2.0, eased + +# 2D noise that controls the size/occurrence of rolling hills. +mgcarpathian_np_hills_terrain (Rolling hills spread noise) noise_params_2d 1, 1, (1301, 1301, 1301), 1692, 3, 0.5, 2.0, eased + +# 2D noise that controls the size/occurrence of ridged mountain ranges. +mgcarpathian_np_ridge_terrain (Ridge mountain spread noise) noise_params_2d 1, 1, (1889, 1889, 1889), 3568, 3, 0.5, 2.0, eased + +# 2D noise that controls the size/occurrence of step mountain ranges. +mgcarpathian_np_step_terrain (Step mountain spread noise) noise_params_2d 1, 1, (1889, 1889, 1889), 4157, 3, 0.5, 2.0, eased + +# 2D noise that controls the shape/size of rolling hills. +mgcarpathian_np_hills (Rolling hill size noise) noise_params_2d 0, 3, (257, 257, 257), 6604, 6, 0.5, 2.0, eased + +# 2D noise that controls the shape/size of ridged mountains. +mgcarpathian_np_ridge_mnt (Ridged mountain size noise) noise_params_2d 0, 12, (743, 743, 743), 5520, 6, 0.7, 2.0, eased + +# 2D noise that controls the shape/size of step mountains. +mgcarpathian_np_step_mnt (Step mountain size noise) noise_params_2d 0, 8, (509, 509, 509), 2590, 6, 0.6, 2.0, eased + +# 2D noise that locates the river valleys and channels. +mgcarpathian_np_rivers (River noise) noise_params_2d 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0, eased + +# 3D noise for mountain overhangs, cliffs, etc. Usually small variations. +mgcarpathian_np_mnt_var (Mountain variation noise) noise_params_3d 0, 1, (499, 499, 499), 2490, 5, 0.55, 2.0 + +# First of two 3D noises that together define tunnels. +mgcarpathian_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of two 3D noises that together define tunnels. +mgcarpathian_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 + +# 3D noise defining giant caverns. +mgcarpathian_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 + +# 3D noise that determines number of dungeons per mapchunk. +mgcarpathian_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 + +[*Mapgen Flat] + +# Map generation attributes specific to Mapgen Flat. +# Occasional lakes and hills can be added to the flat world. +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 -31000 31000 + +# Y of upper limit of large caves. +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 + +# Maximum limit of random number of small caves per mapchunk. +mgflat_small_cave_num_max (Small cave maximum number) int 0 0 256 + +# Minimum limit of random number of large caves per mapchunk. +mgflat_large_cave_num_min (Large cave minimum number) int 0 0 64 + +# Maximum limit of random number of large caves per mapchunk. +mgflat_large_cave_num_max (Large cave maximum number) int 2 0 64 + +# Proportion of large caves that contain liquid. +mgflat_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0 + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +mgflat_cave_width (Cave width) float 0.09 + +# Terrain noise threshold for lakes. +# Controls proportion of world area covered by lakes. +# Adjust towards 0.0 for a larger proportion. +mgflat_lake_threshold (Lake threshold) float -0.45 + +# Controls steepness/depth of lake depressions. +mgflat_lake_steepness (Lake steepness) float 48.0 + +# Terrain noise threshold for hills. +# Controls proportion of world area covered by hills. +# Adjust towards 0.0 for a larger proportion. +mgflat_hill_threshold (Hill threshold) float 0.45 + +# Controls steepness/height of hills. +mgflat_hill_steepness (Hill steepness) float 64.0 + +# Y-level of cavern upper limit. +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 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 -31000 31000 + +# Upper Y limit of dungeons. +mgflat_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000 + +[**Noises] + +# Defines location and terrain of optional hills and lakes. +mgflat_np_terrain (Terrain noise) noise_params_2d 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0, eased + +# Variation of biome filler depth. +mgflat_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased + +# First of two 3D noises that together define tunnels. +mgflat_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of two 3D noises that together define tunnels. +mgflat_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 + +# 3D noise defining giant caverns. +mgflat_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 + +# 3D noise that determines number of dungeons per mapchunk. +mgflat_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 + +[*Mapgen Fractal] + +# Map generation attributes specific to Mapgen Fractal. +# 'terrain' enables the generation of non-fractal terrain: +# ocean, islands and underground. +mgfractal_spflags (Mapgen Fractal specific flags) flags terrain terrain,noterrain + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +mgfractal_cave_width (Cave width) float 0.09 + +# Y of upper limit of large caves. +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 + +# Maximum limit of random number of small caves per mapchunk. +mgfractal_small_cave_num_max (Small cave maximum number) int 0 0 256 + +# Minimum limit of random number of large caves per mapchunk. +mgfractal_large_cave_num_min (Large cave minimum number) int 0 0 64 + +# Maximum limit of random number of large caves per mapchunk. +mgfractal_large_cave_num_max (Large cave maximum number) int 2 0 64 + +# Proportion of large caves that contain liquid. +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 -31000 31000 + +# Upper Y limit of dungeons. +mgfractal_dungeon_ymax (Dungeon maximum Y) int 31000 -31000 31000 + +# Selects one of 18 fractal types. +# 1 = 4D "Roundy" Mandelbrot set. +# 2 = 4D "Roundy" Julia set. +# 3 = 4D "Squarry" Mandelbrot set. +# 4 = 4D "Squarry" Julia set. +# 5 = 4D "Mandy Cousin" Mandelbrot set. +# 6 = 4D "Mandy Cousin" Julia set. +# 7 = 4D "Variation" Mandelbrot set. +# 8 = 4D "Variation" Julia set. +# 9 = 3D "Mandelbrot/Mandelbar" Mandelbrot set. +# 10 = 3D "Mandelbrot/Mandelbar" Julia set. +# 11 = 3D "Christmas Tree" Mandelbrot set. +# 12 = 3D "Christmas Tree" Julia set. +# 13 = 3D "Mandelbulb" Mandelbrot set. +# 14 = 3D "Mandelbulb" Julia set. +# 15 = 3D "Cosine Mandelbulb" Mandelbrot set. +# 16 = 3D "Cosine Mandelbulb" Julia set. +# 17 = 4D "Mandelbulb" Mandelbrot set. +# 18 = 4D "Mandelbulb" Julia set. +mgfractal_fractal (Fractal type) int 1 1 18 + +# Iterations of the recursive function. +# 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 1 65535 + +# (X,Y,Z) scale of fractal in nodes. +# Actual fractal size will be 2 to 3 times larger. +# These numbers can be made very large, the fractal does +# not have to fit inside the world. +# Increase these to 'zoom' into the detail of the fractal. +# Default is for a vertically-squashed shape suitable for +# an island, set all 3 numbers equal for the raw shape. +mgfractal_scale (Scale) v3f (4096.0, 1024.0, 4096.0) + +# (X,Y,Z) offset of fractal from world center in units of 'scale'. +# Can be used to move a desired point to (0, 0) to create a +# suitable spawn point, or to allow 'zooming in' on a desired +# point by increasing 'scale'. +# The default is tuned for a suitable spawn point for Mandelbrot +# sets with default parameters, it may need altering in other +# situations. +# Range roughly -2 to 2. Multiply by 'scale' for offset in nodes. +mgfractal_offset (Offset) v3f (1.79, 0.0, 0.0) + +# W coordinate of the generated 3D slice of a 4D fractal. +# Determines which 3D slice of the 4D shape is generated. +# Alters the shape of the fractal. +# Has no effect on 3D fractals. +# Range roughly -2 to 2. +mgfractal_slice_w (Slice w) float 0.0 + +# Julia set only. +# X component of hypercomplex constant. +# Alters the shape of the fractal. +# Range roughly -2 to 2. +mgfractal_julia_x (Julia x) float 0.33 + +# Julia set only. +# Y component of hypercomplex constant. +# Alters the shape of the fractal. +# Range roughly -2 to 2. +mgfractal_julia_y (Julia y) float 0.33 + +# Julia set only. +# Z component of hypercomplex constant. +# Alters the shape of the fractal. +# Range roughly -2 to 2. +mgfractal_julia_z (Julia z) float 0.33 + +# Julia set only. +# W component of hypercomplex constant. +# Alters the shape of the fractal. +# Has no effect on 3D fractals. +# Range roughly -2 to 2. +mgfractal_julia_w (Julia w) float 0.33 + +[**Noises] + +# Y-level of seabed. +mgfractal_np_seabed (Seabed noise) noise_params_2d -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0, eased + +# Variation of biome filler depth. +mgfractal_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased + +# First of two 3D noises that together define tunnels. +mgfractal_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of two 3D noises that together define tunnels. +mgfractal_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 + +# 3D noise that determines number of dungeons per mapchunk. +mgfractal_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 + +[*Mapgen Valleys] + +# Map generation attributes specific to Mapgen Valleys. +# 'altitude_chill': Reduces heat with altitude. +# 'humid_rivers': Increases humidity around rivers. +# 'vary_river_depth': If enabled, low humidity and high heat causes rivers +# to become shallower and occasionally dry. +# 'altitude_dry': Reduces humidity with altitude. +mgvalleys_spflags (Mapgen Valleys specific flags) flags altitude_chill,humid_rivers,vary_river_depth,altitude_dry altitude_chill,humid_rivers,vary_river_depth,altitude_dry,noaltitude_chill,nohumid_rivers,novary_river_depth,noaltitude_dry + +# 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 0 65535 + +# Depth below which you'll find large caves. +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 + +# Maximum limit of random number of small caves per mapchunk. +mgvalleys_small_cave_num_max (Small cave maximum number) int 0 0 256 + +# Minimum limit of random number of large caves per mapchunk. +mgvalleys_large_cave_num_min (Large cave minimum number) int 0 0 64 + +# Maximum limit of random number of large caves per mapchunk. +mgvalleys_large_cave_num_max (Large cave maximum number) int 2 0 64 + +# Proportion of large caves that contain liquid. +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 -31000 31000 + +# Y-distance over which caverns expand to full size. +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 0 65535 + +# How wide to make rivers. +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 +# intensive noise calculations. +mgvalleys_cave_width (Cave width) float 0.09 + +# Lower Y limit of dungeons. +mgvalleys_dungeon_ymin (Dungeon minimum Y) int -31000 -31000 31000 + +# Upper Y limit of dungeons. +mgvalleys_dungeon_ymax (Dungeon maximum Y) int 63 -31000 31000 + +[**Noises] + +# First of two 3D noises that together define tunnels. +mgvalleys_np_cave1 (Cave noise #1) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 + +# Second of two 3D noises that together define tunnels. +mgvalleys_np_cave2 (Cave noise #2) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 + +# The depth of dirt or other biome filler node. +mgvalleys_np_filler_depth (Filler depth) noise_params_2d 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0, eased + +# 3D noise defining giant caverns. +mgvalleys_np_cavern (Cavern noise) noise_params_3d 0, 1, (768, 256, 768), 59033, 6, 0.63, 2.0 + +# Defines large-scale river channel structure. +mgvalleys_np_rivers (River noise) noise_params_2d 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0, eased + +# Base terrain height. +mgvalleys_np_terrain_height (Terrain height) noise_params_2d -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0, eased + +# Raises terrain to make valleys around the rivers. +mgvalleys_np_valley_depth (Valley depth) noise_params_2d 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0, eased + +# Slope and fill work together to modify the heights. +mgvalleys_np_inter_valley_fill (Valley fill) noise_params_3d 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0 + +# Amplifies the valleys. +mgvalleys_np_valley_profile (Valley profile) noise_params_2d 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0, eased + +# Slope and fill work together to modify the heights. +mgvalleys_np_inter_valley_slope (Valley slope) noise_params_2d 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0, eased + +# 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: +# - (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 1 10 + +# Dump the mapgen debug information. +enable_mapgen_debug_info (Mapgen debug) bool false + +# Maximum number of blocks that can be queued for loading. +emergequeue_limit_total (Absolute limit of queued blocks to emerge) int 1024 1 1000000 + +# Maximum number of blocks to be queued that are to be loaded from file. +# This limit is enforced per player. +emergequeue_limit_diskonly (Per-player limit of queued blocks load from disk) int 128 1 1000000 + +# Maximum number of blocks to be queued that are to be generated. +# This limit is enforced per player. +emergequeue_limit_generate (Per-player limit of queued blocks to generate) int 128 1 1000000 + +# Number of emerge threads to use. +# Value 0: +# - Automatic selection. The number of emerge threads will be +# - 'number of processors - 2', with a lower limit of 1. +# Any other value: +# - Specifies the number of emerge threads, with a lower limit of 1. +# WARNING: Increasing the number of emerge threads increases engine mapgen +# 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 0 32767 + +[**cURL] + +# Maximum time an interactive request (e.g. server list fetch) may take, stated in milliseconds. +curl_timeout (cURL interactive timeout) int 20000 100 2147483647 + +# 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 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 +joystick_id (Joystick ID) int 0 0 255 # The type of joystick -joystick_type (Joystick type) enum auto auto,generic,xbox +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 -# ingame view frustum around. -joystick_frustum_sensitivity (Joystick frustum sensitivity) float 170 +# 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 @@ -196,7 +2106,7 @@ 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_special1 (Special key) key KEY_KEY_E +keymap_aux1 (Aux1 key) key KEY_KEY_E # Key for opening the chat window. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 @@ -212,7 +2122,7 @@ 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 +keymap_rangeselect (Range select key) key # Key for toggling flying. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 @@ -441,1771 +2351,3 @@ 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 - - -[Graphics] - -[*In-Game] - -[**Basic] - -# Enable vertex buffer objects. -# This should greatly improve graphics performance. -enable_vbo (VBO) bool true - -# 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 - -# Enable smooth lighting with simple ambient occlusion. -# Disable for speed or for different looks. -smooth_lighting (Smooth lighting) bool true - -# Clouds are a client side effect. -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] - -# Use mip mapping to scale textures. May slightly increase performance, -# especially when using a high resolution texture pack. -# Gamma correct downscaling is not supported. -mip_map (Mipmapping) bool false - -# Use anisotropic filtering when viewing at textures from an angle. -anisotropic_filter (Anisotropic filtering) bool false - -# Use bilinear filtering when scaling textures. -bilinear_filter (Bilinear filtering) bool false - -# Use trilinear filtering when scaling textures. -trilinear_filter (Trilinear filtering) bool false - -# Filtered textures can blend RGB values with fully-transparent neighbors, -# which PNG optimizers usually discard, sometimes resulting in a dark or -# light edge to transparent textures. Apply this filter to clean that up -# at texture load time. -texture_clean_transparent (Clean transparent textures) bool false - -# When using bilinear/trilinear/anisotropic filters, low-resolution textures -# can be blurred, so automatically upscale them with nearest-neighbor -# interpolation to preserve crisp pixels. This sets the minimum texture size -# for the upscaled textures; higher values look sharper, but require more -# memory. Powers of 2 are recommended. Setting this higher than 1 may not -# have a visible effect unless 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 - -# Experimental option, might cause visible spaces between blocks -# when set to higher number than 0. -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 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] - -# Enables Hable's 'Uncharted 2' filmic tone mapping. -# Simulates the tone curve of photographic film and how this approximates the -# appearance of high dynamic range images. Mid-range contrast is slightly -# enhanced, highlights and shadows are gradually compressed. -tone_mapping (Filmic tone mapping) bool false - -[***Bumpmapping] - -# Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack. -# Requires shaders to be enabled. -enable_bumpmapping (Bumpmapping) bool false - -[***Parallax Occlusion] - -# Enables parallax occlusion mapping. -# Requires shaders to be enabled. -enable_parallax_occlusion (Parallax occlusion) bool false - -# 0 = parallax occlusion with slope information (faster). -# 1 = relief mapping (slower, more accurate). -parallax_occlusion_mode (Parallax occlusion mode) int 1 0 1 - -# Number of parallax occlusion iterations. -parallax_occlusion_iterations (Parallax occlusion iterations) int 4 - -# Overall scale of parallax occlusion effect. -parallax_occlusion_scale (Parallax occlusion scale) float 0.08 - -# Overall bias of parallax occlusion effect, usually scale/2. -parallax_occlusion_bias (Parallax occlusion bias) float 0.04 - -[***Waving Nodes] - -# Set to true to enable waving liquids (like water). -# Requires shaders to be enabled. -enable_waving_water (Waving liquids) bool false - -# The maximum height of the surface of waving liquids. -# 4.0 = Wave height is two nodes. -# 0.0 = Wave doesn't move at all. -# Default is 1.0 (1/2 node). -# Requires waving liquids to be enabled. -water_wave_height (Waving liquids wave height) float 1.0 0.0 4.0 - -# Length of liquid waves. -# Requires waving liquids to be enabled. -water_wave_length (Waving liquids wavelength) float 20.0 0.1 - -# How fast liquid waves will move. Higher = faster. -# If negative, liquid waves will move backwards. -# 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 - -# Set to true to enable waving plants. -# Requires shaders to be enabled. -enable_waving_plants (Waving plants) 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 game is paused. -pause_fps_max (FPS in pause menu) int 20 1 - -# 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 100 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. -screen_w (Screen width) int 1024 1 - -# Height component of the initial window size. -screen_h (Screen height) int 600 1 - -# Save window size automatically when modified. -autosave_screensize (Autosave screen size) bool true - -# Fullscreen mode. -fullscreen (Full screen) bool false - -# Bits per pixel (aka color depth) in fullscreen mode. -fullscreen_bpp (Full screen BPP) int 24 - -# Vertical screen synchronization. -vsync (VSync) bool false - -# Field of view in degrees. -fov (Field of view) int 72 45 160 - -# 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 - -# 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 - -# Path to texture directory. All textures are first searched from here. -texture_path (Texture path) path - -# The rendering back-end for Irrlicht. -# 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, and it’s the only driver with -# shader support currently. -video_driver (Video driver) enum opengl null,software,burningsvideo,direct3d8,direct3d9,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 - -# In-game chat console height, between 0.1 (10%) and 1.0 (100%). -console_height (Console height) float 0.6 0.1 1.0 - -# In-game chat console background color (R,G,B). -console_color (Console color) string (0,0,0) - -# In-game chat console background alpha (opaqueness, between 0 and 255). -console_alpha (Console alpha) int 200 0 255 - -# Formspec full-screen background opacity (between 0 and 255). -formspec_fullscreen_bg_opacity (Formspec Full-Screen Background Opacity) int 140 0 255 - -# 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). -# Also controls the object crosshair color -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 hudbar 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). -gui_scaling_filter (GUI scaling filter) bool false - -# When gui_scaling_filter_txr2img is true, copy those images -# from hardware to software for scaling. When false, fall back -# to the old scaling method, for video drivers that don't -# properly support downloading textures back from hardware. -gui_scaling_filter_txr2img (GUI scaling filter txr2img) bool true - -# Delay showing tooltips, stated in milliseconds. -tooltip_show_delay (Tooltip delay) int 400 - -# Append item name to tooltip. -tooltip_append_itemname (Append item name) bool false - -# Whether FreeType fonts are used, requires FreeType support to be compiled in. -# If disabled, bitmap and XML vectors fonts are used instead. -freetype (FreeType fonts) bool true - -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 - -# 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 in point (pt). -font_size (Font size) int 16 1 - -# Path to the default font. -# If “freetype” setting is enabled: Must be a TrueType font. -# If “freetype” setting is disabled: Must be a bitmap or XML vectors 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_bolditalic (Bold and italic font path) filepath fonts/Arimo-BoldItalic.ttf - -# Font size of the monospace font in point (pt). -mono_font_size (Monospace font size) int 15 1 - -# Path to the monospace font. -# If “freetype” setting is enabled: Must be a TrueType font. -# If “freetype” setting is disabled: Must be a bitmap or XML vectors 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_bolditalic (Bold and italic monospace font path) filepath fonts/Cousine-BoldItalic.ttf - -# Font size of the fallback font in point (pt). -fallback_font_size (Fallback font size) int 15 1 - -# Shadow offset (in pixels) of the fallback font. If 0, then shadow will not be drawn. -fallback_font_shadow (Fallback font shadow) int 1 - -# Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255. -fallback_font_shadow_alpha (Fallback font shadow alpha) int 128 0 255 - -# Path of the fallback font. -# If “freetype” setting is enabled: Must be a TrueType font. -# If “freetype” setting is disabled: Must be a bitmap or XML vectors 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 - -# 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,bmp,pcx,ppm,tga - -# 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] - -# Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens. -screen_dpi (DPI) int 72 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). -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] - -[*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 - -# 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 fetch on http://127.0.0.1:30000/metrics -prometheus_listener_address (Prometheus listener address) string 127.0.0.1:30000 - -# 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.txt - -# 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 - -# Enable register confirmation when connecting to server. -# If disabled, new account will be registered automatically. -enable_register_confirmation (Enable register confirmation) bool true - -[*Advanced] - -# Timeout for client to remove unused map data from memory. -client_unload_unused_data_timeout (Mapblock unload timeout) int 600 - -# Maximum number of mapblocks for client to be kept in memory. -# Set to -1 for unlimited amount. -client_mapblock_limit (Mapblock limit) int 5000 - -# Whether to show the client debug info (has the same effect as hitting F5). -show_debug (Show debug info) bool false - -[Server / Singleplayer] - -# Name of the server, to be displayed when players join and in the serverlist. -server_name (Server name) string Minetest server - -# Description of server, to be displayed when players join and in the serverlist. -server_description (Server description) string mine here - -# Domain name of server, to be displayed in the serverlist. -server_address (Server address) string game.minetest.net - -# Homepage of server, to be displayed in the serverlist. -server_url (Server URL) string https://minetest.net - -# Automatically report to the serverlist. -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 - -[*Network] - -# Network port to listen (UDP). -# This value will be overridden when starting from the main menu. -port (Server port) int 30000 - -# The network interface that the server listens on. -bind_address (Bind address) string - -# Enable to disallow old clients from connecting. -# Older clients are compatible in the sense that they will not crash when connecting -# to new servers, but they may not support all new features that you are expecting. -strict_protocol_version_checking (Strict protocol checking) bool false - -# Specifies URL from which client fetches media instead of using UDP. -# $filename should be accessible from $remote_media$filename via cURL -# (obviously, remote_media should end with a slash). -# Files that are not present will be fetched the usual way. -remote_media (Remote media) string - -# Enable/disable running an IPv6 server. -# Ignored if bind_address is set. -# 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 - -[*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 new created maps. -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 - -# New users need to input this password. -default_password (Default password) string - -# 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 - -# 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, new players cannot join with an empty password. -disallow_empty_password (Disallow empty passwords) bool false - -# If enabled, disable cheat prevention in multiplayer. -disable_anticheat (Disable anticheat) bool false - -# If enabled, actions are recorded for rollback. -# 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 - -# 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 - -# 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 4 - -# 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 3 - -# From how far blocks are sent to clients, stated in mapblocks (16 nodes). -max_block_send_distance (Max block send distance) int 10 - -# Maximum number of forceloaded mapblocks. -max_forceloaded_blocks (Maximum forceloaded blocks) int 16 - -# Interval of sending time of day to clients. -time_send_interval (Time send interval) int 5 - -# 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 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 - -# Kick players who sent more than X messages per 10 seconds. -chat_message_limit_trigger_kick (Chat message kick threshold) int 50 - -[**Physics] - -# Horizontal and vertical acceleration on ground or when climbing, -# in nodes per second per second. -movement_acceleration_default (Default acceleration) float 3 - -# Horizontal acceleration in air when jumping or falling, -# in nodes per second per second. -movement_acceleration_air (Acceleration in air) float 2 - -# Horizontal and vertical acceleration in fast mode, -# in nodes per second per second. -movement_acceleration_fast (Fast mode acceleration) float 10 - -# Walking and flying speed, in nodes per second. -movement_speed_walk (Walking speed) float 4 - -# Sneaking speed, in nodes per second. -movement_speed_crouch (Sneaking speed) float 1.35 - -# Walking, flying and climbing speed in fast mode, in nodes per second. -movement_speed_fast (Fast mode speed) float 20 - -# Vertical climbing speed, in nodes per second. -movement_speed_climb (Climbing speed) float 3 - -# Initial vertical speed when jumping, in nodes per second. -movement_speed_jump (Jumping speed) float 6.5 - -# Decrease this to increase liquid resistance to movement. -movement_liquid_fluidity (Liquid fluidity) float 1 - -# 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 - -# Acceleration of gravity, in nodes per second per second. -movement_gravity (Gravity) float 9.81 - -[**Advanced] - -# Handling for deprecated Lua API calls: -# - legacy: (try to) mimic old behaviour (default for release). -# - log: mimic and log backtrace of deprecated call (default for debug). -# - error: abort on usage of deprecated call (suggested for mod developers). -deprecated_lua_api_handling (Deprecated Lua API handling) enum legacy legacy,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 - -# 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 chatcommands on registration. -instrument.chatcommand (Chatcommands) 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 ,ar,ca,cs,da,de,dv,el,en,eo,es,et,eu,fil,fr,hu,id,it,ja,ja_KS,jbo,kk,kn,lo,lt,ms,my,nb,nl,nn,pl,pt,pt_BR,ro,ru,sl,sr_Cyrl,sv,sw,th,tr,uk,vi - -# Level of logging to be written to debug.txt: -# - (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] - -# Default timeout for cURL, stated in milliseconds. -# Only has an effect if compiled with cURL. -curl_timeout (cURL timeout) int 5000 - -# 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 in ms a file download (e.g. a mod download) may take. -curl_file_download_timeout (cURL file download timeout) int 300000 - -# Makes DirectX work with LuaJIT. Disable if it causes troubles. -high_precision_fpu (High-precision FPU) bool true - -# 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] - -# 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: -# - The optional floatlands of v7 (disabled by default). -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 - -# From how far blocks are generated for clients, stated in mapblocks (16 nodes). -max_block_generate_distance (Max block generate distance) int 8 - -# Limit of map generation, in nodes, in all 6 directions from (0, 0, 0). -# Only mapchunks completely within the mapgen limit are generated. -# Value is stored per-world. -mapgen_limit (Map generation limit) int 31000 0 31000 - -# Global map generation attributes. -# In Mapgen v6 the 'decorations' flag controls all decorations except trees -# and junglegrass, 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] - -# 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 - -# Small-scale temperature variation for blending biomes on borders. -mg_biome_np_heat_blend (Heat blend noise) noise_params_2d 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0, eased - -# Humidity variation for biomes. -mg_biome_np_humidity (Humidity noise) noise_params_2d 50, 50, (1000, 1000, 1000), 842, 3, 0.5, 2.0, eased - -# Small-scale humidity variation for blending biomes on borders. -mg_biome_np_humidity_blend (Humidity blend noise) noise_params_2d 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0, eased - -[*Mapgen V5] - -# Map generation attributes specific to Mapgen v5. -mgv5_spflags (Mapgen V5 specific flags) flags caverns caverns,nocaverns - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -mgv5_cave_width (Cave width) float 0.09 - -# Y of upper limit of large caves. -mgv5_large_cave_depth (Large cave depth) int -256 - -# Minimum limit of random number of small caves per mapchunk. -mgv5_small_cave_num_min (Small cave minimum number) int 0 0 256 - -# Maximum limit of random number of small caves per mapchunk. -mgv5_small_cave_num_max (Small cave maximum number) int 0 0 256 - -# Minimum limit of random number of large caves per mapchunk. -mgv5_large_cave_num_min (Large cave minimum number) int 0 0 64 - -# Maximum limit of random number of large caves per mapchunk. -mgv5_large_cave_num_max (Large cave maximum number) int 2 0 64 - -# Proportion of large caves that contain liquid. -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 - -# Y-distance over which caverns expand to full size. -mgv5_cavern_taper (Cavern taper) int 256 - -# 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 - -# Upper Y limit of dungeons. -mgv5_dungeon_ymax (Dungeon maximum Y) int 31000 - -[**Noises] - -# Variation of biome filler depth. -mgv5_np_filler_depth (Filler depth noise) noise_params_2d 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0, eased - -# Variation of terrain vertical scale. -# When noise is < -0.55 terrain is near-flat. -mgv5_np_factor (Factor noise) noise_params_2d 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0, eased - -# Y-level of average terrain surface. -mgv5_np_height (Height noise) noise_params_2d 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0, eased - -# First of two 3D noises that together define tunnels. -mgv5_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 - -# Second of two 3D noises that together define tunnels. -mgv5_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 - -# 3D noise defining giant caverns. -mgv5_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 - -# 3D noise defining terrain. -mgv5_np_ground (Ground noise) noise_params_3d 0, 40, (80, 80, 80), 983240, 4, 0.55, 2.0, eased - -# 3D noise that determines number of dungeons per mapchunk. -mgv5_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 - -[*Mapgen V6] - -# Map generation attributes specific to Mapgen v6. -# The 'snowbiomes' flag enables the new 5 biome system. -# When the 'snowbiomes' flag is enabled jungles are automatically enabled and -# the 'jungles' flag is ignored. -mgv6_spflags (Mapgen V6 specific flags) flags jungles,biomeblend,mudflow,snowbiomes,noflat,trees jungles,biomeblend,mudflow,snowbiomes,flat,trees,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees - -# Deserts occur when np_biome exceeds this value. -# When the 'snowbiomes' flag is enabled, this is ignored. -mgv6_freq_desert (Desert noise threshold) float 0.45 - -# Sandy beaches occur when np_beach exceeds this value. -mgv6_freq_beach (Beach noise threshold) float 0.15 - -# Lower Y limit of dungeons. -mgv6_dungeon_ymin (Dungeon minimum Y) int -31000 - -# Upper Y limit of dungeons. -mgv6_dungeon_ymax (Dungeon maximum Y) int 31000 - -[**Noises] - -# Y-level of lower terrain and seabed. -mgv6_np_terrain_base (Terrain base noise) noise_params_2d -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0, eased - -# Y-level of higher terrain that creates cliffs. -mgv6_np_terrain_higher (Terrain higher noise) noise_params_2d 20, 16, (500, 500, 500), 85039, 5, 0.6, 2.0, eased - -# Varies steepness of cliffs. -mgv6_np_steepness (Steepness noise) noise_params_2d 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0, eased - -# Defines distribution of higher terrain. -mgv6_np_height_select (Height select noise) noise_params_2d 0.5, 1, (250, 250, 250), 4213, 5, 0.69, 2.0, eased - -# Varies depth of biome surface nodes. -mgv6_np_mud (Mud noise) noise_params_2d 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0, eased - -# Defines areas with sandy beaches. -mgv6_np_beach (Beach noise) noise_params_2d 0, 1, (250, 250, 250), 59420, 3, 0.50, 2.0, eased - -# Temperature variation for biomes. -mgv6_np_biome (Biome noise) noise_params_2d 0, 1, (500, 500, 500), 9130, 3, 0.50, 2.0, eased - -# Variation of number of caves. -mgv6_np_cave (Cave noise) noise_params_2d 6, 6, (250, 250, 250), 34329, 3, 0.50, 2.0, eased - -# Humidity variation for biomes. -mgv6_np_humidity (Humidity noise) noise_params_2d 0.5, 0.5, (500, 500, 500), 72384, 3, 0.50, 2.0, eased - -# Defines tree areas and tree density. -mgv6_np_trees (Trees noise) noise_params_2d 0, 1, (125, 125, 125), 2, 4, 0.66, 2.0, eased - -# Defines areas where trees have apples. -mgv6_np_apple_trees (Apple trees noise) noise_params_2d 0, 1, (100, 100, 100), 342902, 3, 0.45, 2.0, eased - -[*Mapgen V7] - -# Map generation attributes specific to Mapgen v7. -# 'ridges': Rivers. -# 'floatlands': Floating land masses in the atmosphere. -# 'caverns': Giant caves deep underground. -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 - -# Lower Y limit of floatlands. -mgv7_floatland_ymin (Floatland minimum Y) int 1024 - -# Upper Y limit of floatlands. -mgv7_floatland_ymax (Floatland maximum Y) int 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. -mgv7_floatland_taper (Floatland tapering distance) int 256 - -# Exponent of the floatland tapering. Alters the tapering behaviour. -# Value = 1.0 creates a uniform, linear tapering. -# Values > 1.0 create a smooth tapering suitable for the default separated -# floatlands. -# Values < 1.0 (for example 0.25) create a more defined surface level with -# flatter lowlands, suitable for a solid floatland layer. -mgv7_float_taper_exp (Floatland taper exponent) float 2.0 - -# Adjusts the density of the floatland layer. -# Increase value to increase density. Can be positive or negative. -# Value = 0.0: 50% of volume is floatland. -# Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test -# to be sure) creates a solid floatland layer. -mgv7_floatland_density (Floatland density) float -0.6 - -# Surface level of optional water placed on a solid floatland layer. -# Water is disabled by default and will only be placed if this value is set -# to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the -# upper tapering). -# ***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***: -# When enabling water placement the floatlands must be configured and tested -# to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other -# 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 - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -mgv7_cave_width (Cave width) float 0.09 - -# Y of upper limit of large caves. -mgv7_large_cave_depth (Large cave depth) int -33 - -# Minimum limit of random number of small caves per mapchunk. -mgv7_small_cave_num_min (Small cave minimum number) int 0 0 256 - -# Maximum limit of random number of small caves per mapchunk. -mgv7_small_cave_num_max (Small cave maximum number) int 0 0 256 - -# Minimum limit of random number of large caves per mapchunk. -mgv7_large_cave_num_min (Large cave minimum number) int 0 0 64 - -# Maximum limit of random number of large caves per mapchunk. -mgv7_large_cave_num_max (Large cave maximum number) int 2 0 64 - -# Proportion of large caves that contain liquid. -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 - -# Y-distance over which caverns expand to full size. -mgv7_cavern_taper (Cavern taper) int 256 - -# 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 - -# Upper Y limit of dungeons. -mgv7_dungeon_ymax (Dungeon maximum Y) int 31000 - -[**Noises] - -# Y-level of higher terrain that creates cliffs. -mgv7_np_terrain_base (Terrain base noise) noise_params_2d 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0, eased - -# Y-level of lower terrain and seabed. -mgv7_np_terrain_alt (Terrain alternative noise) noise_params_2d 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0, eased - -# Varies roughness of terrain. -# Defines the 'persistence' value for terrain_base and terrain_alt noises. -mgv7_np_terrain_persist (Terrain persistence noise) noise_params_2d 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0, eased - -# Defines distribution of higher terrain and steepness of cliffs. -mgv7_np_height_select (Height select noise) noise_params_2d -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0, eased - -# Variation of biome filler depth. -mgv7_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased - -# Variation of maximum mountain height (in nodes). -mgv7_np_mount_height (Mountain height noise) noise_params_2d 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0, eased - -# Defines large-scale river channel structure. -mgv7_np_ridge_uwater (Ridge underwater noise) noise_params_2d 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0, eased - -# 3D noise defining mountain structure and height. -# Also defines structure of floatland mountain terrain. -mgv7_np_mountain (Mountain noise) noise_params_3d -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0 - -# 3D noise defining structure of river canyon walls. -mgv7_np_ridge (Ridge noise) noise_params_3d 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0 - -# 3D noise defining structure of floatlands. -# If altered from the default, the noise 'scale' (0.7 by default) may need -# to be adjusted, as floatland tapering functions best when this noise has -# a value range of approximately -2.0 to 2.0. -mgv7_np_floatland (Floatland noise) noise_params_3d 0, 0.7, (384, 96, 384), 1009, 4, 0.75, 1.618 - -# 3D noise defining giant caverns. -mgv7_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 - -# First of two 3D noises that together define tunnels. -mgv7_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 - -# Second of two 3D noises that together define tunnels. -mgv7_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 - -# 3D noise that determines number of dungeons per mapchunk. -mgv7_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 - -[*Mapgen Carpathian] - -# Map generation attributes specific to Mapgen Carpathian. -mgcarpathian_spflags (Mapgen Carpathian specific flags) flags caverns,norivers caverns,rivers,nocaverns,norivers - -# Defines the base ground level. -mgcarpathian_base_level (Base ground level) float 12.0 - -# Defines the width of the river channel. -mgcarpathian_river_width (River channel width) float 0.05 - -# Defines the depth of the river channel. -mgcarpathian_river_depth (River channel depth) float 24.0 - -# Defines the width of the river valley. -mgcarpathian_valley_width (River valley width) float 0.25 - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -mgcarpathian_cave_width (Cave width) float 0.09 - -# Y of upper limit of large caves. -mgcarpathian_large_cave_depth (Large cave depth) int -33 - -# Minimum limit of random number of small caves per mapchunk. -mgcarpathian_small_cave_num_min (Small cave minimum number) int 0 0 256 - -# Maximum limit of random number of small caves per mapchunk. -mgcarpathian_small_cave_num_max (Small cave maximum number) int 0 0 256 - -# Minimum limit of random number of large caves per mapchunk. -mgcarpathian_large_cave_num_min (Large cave minimum number) int 0 0 64 - -# Maximum limit of random number of large caves per mapchunk. -mgcarpathian_large_cave_num_max (Large cave maximum number) int 2 0 64 - -# Proportion of large caves that contain liquid. -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 - -# Y-distance over which caverns expand to full size. -mgcarpathian_cavern_taper (Cavern taper) int 256 - -# 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 - -# Upper Y limit of dungeons. -mgcarpathian_dungeon_ymax (Dungeon maximum Y) int 31000 - -[**Noises] - -# Variation of biome filler depth. -mgcarpathian_np_filler_depth (Filler depth noise) noise_params_2d 0, 1, (128, 128, 128), 261, 3, 0.7, 2.0, eased - -# First of 4 2D noises that together define hill/mountain range height. -mgcarpathian_np_height1 (Hilliness1 noise) noise_params_2d 0, 5, (251, 251, 251), 9613, 5, 0.5, 2.0, eased - -# Second of 4 2D noises that together define hill/mountain range height. -mgcarpathian_np_height2 (Hilliness2 noise) noise_params_2d 0, 5, (383, 383, 383), 1949, 5, 0.5, 2.0, eased - -# Third of 4 2D noises that together define hill/mountain range height. -mgcarpathian_np_height3 (Hilliness3 noise) noise_params_2d 0, 5, (509, 509, 509), 3211, 5, 0.5, 2.0, eased - -# Fourth of 4 2D noises that together define hill/mountain range height. -mgcarpathian_np_height4 (Hilliness4 noise) noise_params_2d 0, 5, (631, 631, 631), 1583, 5, 0.5, 2.0, eased - -# 2D noise that controls the size/occurrence of rolling hills. -mgcarpathian_np_hills_terrain (Rolling hills spread noise) noise_params_2d 1, 1, (1301, 1301, 1301), 1692, 3, 0.5, 2.0, eased - -# 2D noise that controls the size/occurrence of ridged mountain ranges. -mgcarpathian_np_ridge_terrain (Ridge mountain spread noise) noise_params_2d 1, 1, (1889, 1889, 1889), 3568, 3, 0.5, 2.0, eased - -# 2D noise that controls the size/occurrence of step mountain ranges. -mgcarpathian_np_step_terrain (Step mountain spread noise) noise_params_2d 1, 1, (1889, 1889, 1889), 4157, 3, 0.5, 2.0, eased - -# 2D noise that controls the shape/size of rolling hills. -mgcarpathian_np_hills (Rolling hill size noise) noise_params_2d 0, 3, (257, 257, 257), 6604, 6, 0.5, 2.0, eased - -# 2D noise that controls the shape/size of ridged mountains. -mgcarpathian_np_ridge_mnt (Ridged mountain size noise) noise_params_2d 0, 12, (743, 743, 743), 5520, 6, 0.7, 2.0, eased - -# 2D noise that controls the shape/size of step mountains. -mgcarpathian_np_step_mnt (Step mountain size noise) noise_params_2d 0, 8, (509, 509, 509), 2590, 6, 0.6, 2.0, eased - -# 2D noise that locates the river valleys and channels. -mgcarpathian_np_rivers (River noise) noise_params_2d 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0, eased - -# 3D noise for mountain overhangs, cliffs, etc. Usually small variations. -mgcarpathian_np_mnt_var (Mountain variation noise) noise_params_3d 0, 1, (499, 499, 499), 2490, 5, 0.55, 2.0 - -# First of two 3D noises that together define tunnels. -mgcarpathian_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 - -# Second of two 3D noises that together define tunnels. -mgcarpathian_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 - -# 3D noise defining giant caverns. -mgcarpathian_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 - -# 3D noise that determines number of dungeons per mapchunk. -mgcarpathian_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 - -[*Mapgen Flat] - -# Map generation attributes specific to Mapgen Flat. -# Occasional lakes and hills can be added to the flat world. -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 - -# Y of upper limit of large caves. -mgflat_large_cave_depth (Large cave depth) int -33 - -# Minimum limit of random number of small caves per mapchunk. -mgflat_small_cave_num_min (Small cave minimum number) int 0 0 256 - -# Maximum limit of random number of small caves per mapchunk. -mgflat_small_cave_num_max (Small cave maximum number) int 0 0 256 - -# Minimum limit of random number of large caves per mapchunk. -mgflat_large_cave_num_min (Large cave minimum number) int 0 0 64 - -# Maximum limit of random number of large caves per mapchunk. -mgflat_large_cave_num_max (Large cave maximum number) int 2 0 64 - -# Proportion of large caves that contain liquid. -mgflat_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0 - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -mgflat_cave_width (Cave width) float 0.09 - -# Terrain noise threshold for lakes. -# Controls proportion of world area covered by lakes. -# Adjust towards 0.0 for a larger proportion. -mgflat_lake_threshold (Lake threshold) float -0.45 - -# Controls steepness/depth of lake depressions. -mgflat_lake_steepness (Lake steepness) float 48.0 - -# Terrain noise threshold for hills. -# Controls proportion of world area covered by hills. -# Adjust towards 0.0 for a larger proportion. -mgflat_hill_threshold (Hill threshold) float 0.45 - -# Controls steepness/height of hills. -mgflat_hill_steepness (Hill steepness) float 64.0 - -# Y-level of cavern upper limit. -mgflat_cavern_limit (Cavern limit) int -256 - -# Y-distance over which caverns expand to full size. -mgflat_cavern_taper (Cavern taper) int 256 - -# 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 - -# Upper Y limit of dungeons. -mgflat_dungeon_ymax (Dungeon maximum Y) int 31000 - -[**Noises] - -# Defines location and terrain of optional hills and lakes. -mgflat_np_terrain (Terrain noise) noise_params_2d 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0, eased - -# Variation of biome filler depth. -mgflat_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased - -# First of two 3D noises that together define tunnels. -mgflat_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 - -# Second of two 3D noises that together define tunnels. -mgflat_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 - -# 3D noise defining giant caverns. -mgflat_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 - -# 3D noise that determines number of dungeons per mapchunk. -mgflat_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 - -[*Mapgen Fractal] - -# Map generation attributes specific to Mapgen Fractal. -# 'terrain' enables the generation of non-fractal terrain: -# ocean, islands and underground. -mgfractal_spflags (Mapgen Fractal specific flags) flags terrain terrain,noterrain - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -mgfractal_cave_width (Cave width) float 0.09 - -# Y of upper limit of large caves. -mgfractal_large_cave_depth (Large cave depth) int -33 - -# Minimum limit of random number of small caves per mapchunk. -mgfractal_small_cave_num_min (Small cave minimum number) int 0 0 256 - -# Maximum limit of random number of small caves per mapchunk. -mgfractal_small_cave_num_max (Small cave maximum number) int 0 0 256 - -# Minimum limit of random number of large caves per mapchunk. -mgfractal_large_cave_num_min (Large cave minimum number) int 0 0 64 - -# Maximum limit of random number of large caves per mapchunk. -mgfractal_large_cave_num_max (Large cave maximum number) int 2 0 64 - -# Proportion of large caves that contain liquid. -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 - -# Upper Y limit of dungeons. -mgfractal_dungeon_ymax (Dungeon maximum Y) int 31000 - -# Selects one of 18 fractal types. -# 1 = 4D "Roundy" Mandelbrot set. -# 2 = 4D "Roundy" Julia set. -# 3 = 4D "Squarry" Mandelbrot set. -# 4 = 4D "Squarry" Julia set. -# 5 = 4D "Mandy Cousin" Mandelbrot set. -# 6 = 4D "Mandy Cousin" Julia set. -# 7 = 4D "Variation" Mandelbrot set. -# 8 = 4D "Variation" Julia set. -# 9 = 3D "Mandelbrot/Mandelbar" Mandelbrot set. -# 10 = 3D "Mandelbrot/Mandelbar" Julia set. -# 11 = 3D "Christmas Tree" Mandelbrot set. -# 12 = 3D "Christmas Tree" Julia set. -# 13 = 3D "Mandelbulb" Mandelbrot set. -# 14 = 3D "Mandelbulb" Julia set. -# 15 = 3D "Cosine Mandelbulb" Mandelbrot set. -# 16 = 3D "Cosine Mandelbulb" Julia set. -# 17 = 4D "Mandelbulb" Mandelbrot set. -# 18 = 4D "Mandelbulb" Julia set. -mgfractal_fractal (Fractal type) int 1 1 18 - -# Iterations of the recursive function. -# 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 - -# (X,Y,Z) scale of fractal in nodes. -# Actual fractal size will be 2 to 3 times larger. -# These numbers can be made very large, the fractal does -# not have to fit inside the world. -# Increase these to 'zoom' into the detail of the fractal. -# Default is for a vertically-squashed shape suitable for -# an island, set all 3 numbers equal for the raw shape. -mgfractal_scale (Scale) v3f (4096.0, 1024.0, 4096.0) - -# (X,Y,Z) offset of fractal from world center in units of 'scale'. -# Can be used to move a desired point to (0, 0) to create a -# suitable spawn point, or to allow 'zooming in' on a desired -# point by increasing 'scale'. -# The default is tuned for a suitable spawn point for Mandelbrot -# sets with default parameters, it may need altering in other -# situations. -# Range roughly -2 to 2. Multiply by 'scale' for offset in nodes. -mgfractal_offset (Offset) v3f (1.79, 0.0, 0.0) - -# W coordinate of the generated 3D slice of a 4D fractal. -# Determines which 3D slice of the 4D shape is generated. -# Alters the shape of the fractal. -# Has no effect on 3D fractals. -# Range roughly -2 to 2. -mgfractal_slice_w (Slice w) float 0.0 - -# Julia set only. -# X component of hypercomplex constant. -# Alters the shape of the fractal. -# Range roughly -2 to 2. -mgfractal_julia_x (Julia x) float 0.33 - -# Julia set only. -# Y component of hypercomplex constant. -# Alters the shape of the fractal. -# Range roughly -2 to 2. -mgfractal_julia_y (Julia y) float 0.33 - -# Julia set only. -# Z component of hypercomplex constant. -# Alters the shape of the fractal. -# Range roughly -2 to 2. -mgfractal_julia_z (Julia z) float 0.33 - -# Julia set only. -# W component of hypercomplex constant. -# Alters the shape of the fractal. -# Has no effect on 3D fractals. -# Range roughly -2 to 2. -mgfractal_julia_w (Julia w) float 0.33 - -[**Noises] - -# Y-level of seabed. -mgfractal_np_seabed (Seabed noise) noise_params_2d -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0, eased - -# Variation of biome filler depth. -mgfractal_np_filler_depth (Filler depth noise) noise_params_2d 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0, eased - -# First of two 3D noises that together define tunnels. -mgfractal_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 - -# Second of two 3D noises that together define tunnels. -mgfractal_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 - -# 3D noise that determines number of dungeons per mapchunk. -mgfractal_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 - -[*Mapgen Valleys] - -# Map generation attributes specific to Mapgen Valleys. -# 'altitude_chill': Reduces heat with altitude. -# 'humid_rivers': Increases humidity around rivers. -# 'vary_river_depth': If enabled, low humidity and high heat causes rivers -# to become shallower and occasionally dry. -# 'altitude_dry': Reduces humidity with altitude. -mgvalleys_spflags (Mapgen Valleys specific flags) flags altitude_chill,humid_rivers,vary_river_depth,altitude_dry altitude_chill,humid_rivers,vary_river_depth,altitude_dry,noaltitude_chill,nohumid_rivers,novary_river_depth,noaltitude_dry - -# 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 - -# Depth below which you'll find large caves. -mgvalleys_large_cave_depth (Large cave depth) int -33 - -# Minimum limit of random number of small caves per mapchunk. -mgvalleys_small_cave_num_min (Small cave minimum number) int 0 0 256 - -# Maximum limit of random number of small caves per mapchunk. -mgvalleys_small_cave_num_max (Small cave maximum number) int 0 0 256 - -# Minimum limit of random number of large caves per mapchunk. -mgvalleys_large_cave_num_min (Large cave minimum number) int 0 0 64 - -# Maximum limit of random number of large caves per mapchunk. -mgvalleys_large_cave_num_max (Large cave maximum number) int 2 0 64 - -# Proportion of large caves that contain liquid. -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 - -# Y-distance over which caverns expand to full size. -mgvalleys_cavern_taper (Cavern taper) int 192 - -# 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 - -# How wide to make rivers. -mgvalleys_river_size (River size) int 5 - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -mgvalleys_cave_width (Cave width) float 0.09 - -# Lower Y limit of dungeons. -mgvalleys_dungeon_ymin (Dungeon minimum Y) int -31000 - -# Upper Y limit of dungeons. -mgvalleys_dungeon_ymax (Dungeon maximum Y) int 63 - -[**Noises] - -# First of two 3D noises that together define tunnels. -mgvalleys_np_cave1 (Cave noise #1) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0 - -# Second of two 3D noises that together define tunnels. -mgvalleys_np_cave2 (Cave noise #2) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 - -# The depth of dirt or other biome filler node. -mgvalleys_np_filler_depth (Filler depth) noise_params_2d 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0, eased - -# 3D noise defining giant caverns. -mgvalleys_np_cavern (Cavern noise) noise_params_3d 0, 1, (768, 256, 768), 59033, 6, 0.63, 2.0 - -# Defines large-scale river channel structure. -mgvalleys_np_rivers (River noise) noise_params_2d 0, 1, (256, 256, 256), -6050, 5, 0.6, 2.0, eased - -# Base terrain height. -mgvalleys_np_terrain_height (Terrain height) noise_params_2d -10, 50, (1024, 1024, 1024), 5202, 6, 0.4, 2.0, eased - -# Raises terrain to make valleys around the rivers. -mgvalleys_np_valley_depth (Valley depth) noise_params_2d 5, 4, (512, 512, 512), -1914, 1, 1.0, 2.0, eased - -# Slope and fill work together to modify the heights. -mgvalleys_np_inter_valley_fill (Valley fill) noise_params_3d 0, 1, (256, 512, 256), 1993, 6, 0.8, 2.0 - -# Amplifies the valleys. -mgvalleys_np_valley_profile (Valley profile) noise_params_2d 0.6, 0.5, (512, 512, 512), 777, 1, 1.0, 2.0, eased - -# Slope and fill work together to modify the heights. -mgvalleys_np_inter_valley_slope (Valley slope) noise_params_2d 0.5, 0.5, (128, 128, 128), 746, 1, 1.0, 2.0, eased - -# 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] - -# 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 - -# Dump the mapgen debug information. -enable_mapgen_debug_info (Mapgen debug) bool false - -# Maximum number of blocks that can be queued for loading. -emergequeue_limit_total (Absolute limit of queued blocks to emerge) int 512 - -# Maximum number of blocks to be queued that are to be loaded from file. -# This limit is enforced per player. -emergequeue_limit_diskonly (Per-player limit of queued blocks load from disk) int 64 - -# Maximum number of blocks to be queued that are to be generated. -# This limit is enforced per player. -emergequeue_limit_generate (Per-player limit of queued blocks to generate) int 64 - -# Number of emerge threads to use. -# Value 0: -# - Automatic selection. The number of emerge threads will be -# - 'number of processors - 2', with a lower limit of 1. -# Any other value: -# - Specifies the number of emerge threads, with a lower limit of 1. -# WARNING: Increasing the number of emerge threads increases engine mapgen -# 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 - -[Online Content Repository] - -# The URL for the content repository -contentdb_url (ContentDB URL) string https://content.minetest.net - -# 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 - -# Maximum number of concurrent downloads. Downloads exceeding this limit will be queued. -contentdb_max_concurrent_downloads (ContentDB Max Concurrent Downloads) int 3 diff --git a/client/shaders/3d_interlaced_merge/opengl_fragment.glsl b/client/shaders/3d_interlaced_merge/opengl_fragment.glsl index 25945ad7f..6d3ae5093 100644 --- a/client/shaders/3d_interlaced_merge/opengl_fragment.glsl +++ b/client/shaders/3d_interlaced_merge/opengl_fragment.glsl @@ -6,9 +6,11 @@ uniform sampler2D textureFlags; #define rightImage normalTexture #define maskImage textureFlags +varying mediump vec4 varTexCoord; + void main(void) { - vec2 uv = gl_TexCoord[0].st; + vec2 uv = varTexCoord.st; vec4 left = texture2D(leftImage, uv).rgba; vec4 right = texture2D(rightImage, uv).rgba; vec4 mask = texture2D(maskImage, uv).rgba; diff --git a/client/shaders/3d_interlaced_merge/opengl_vertex.glsl b/client/shaders/3d_interlaced_merge/opengl_vertex.glsl index 4e0b2b125..224b7d183 100644 --- a/client/shaders/3d_interlaced_merge/opengl_vertex.glsl +++ b/client/shaders/3d_interlaced_merge/opengl_vertex.glsl @@ -1,6 +1,7 @@ +varying mediump vec4 varTexCoord; + void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = gl_Vertex; - gl_FrontColor = gl_BackColor = gl_Color; + varTexCoord = inTexCoord0; + gl_Position = inVertexPosition; } diff --git a/client/shaders/default_shader/opengl_fragment.glsl b/client/shaders/default_shader/opengl_fragment.glsl index 925ab6e1d..5018ac6ea 100644 --- a/client/shaders/default_shader/opengl_fragment.glsl +++ b/client/shaders/default_shader/opengl_fragment.glsl @@ -1,4 +1,6 @@ +varying lowp vec4 varColor; + void main(void) { - gl_FragColor = gl_Color; + gl_FragColor = varColor; } diff --git a/client/shaders/default_shader/opengl_vertex.glsl b/client/shaders/default_shader/opengl_vertex.glsl index d0b16c8b0..a908ac953 100644 --- a/client/shaders/default_shader/opengl_vertex.glsl +++ b/client/shaders/default_shader/opengl_vertex.glsl @@ -1,9 +1,11 @@ -uniform mat4 mWorldViewProj; +varying lowp vec4 varColor; void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = mWorldViewProj * gl_Vertex; - - gl_FrontColor = gl_BackColor = gl_Color; + gl_Position = mWorldViewProj * inVertexPosition; +#ifdef GL_ES + varColor = inVertexColor.bgra; +#else + varColor = inVertexColor; +#endif } diff --git a/client/shaders/minimap_shader/opengl_fragment.glsl b/client/shaders/minimap_shader/opengl_fragment.glsl index fa4f9cb1a..cef359e8a 100644 --- a/client/shaders/minimap_shader/opengl_fragment.glsl +++ b/client/shaders/minimap_shader/opengl_fragment.glsl @@ -2,9 +2,12 @@ uniform sampler2D baseTexture; uniform sampler2D normalTexture; uniform vec3 yawVec; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; + void main (void) { - vec2 uv = gl_TexCoord[0].st; + vec2 uv = varTexCoord.st; //texture sampling rate const float step = 1.0 / 256.0; @@ -27,6 +30,6 @@ void main (void) vec3 color = (1.1 * diffuse + 0.05 * height + 0.5 * specular) * base.rgb; vec4 col = vec4(color.rgb, base.a); - col *= gl_Color; + col *= varColor; gl_FragColor = vec4(col.rgb, base.a); } diff --git a/client/shaders/minimap_shader/opengl_vertex.glsl b/client/shaders/minimap_shader/opengl_vertex.glsl index 88f9356d5..b23d27181 100644 --- a/client/shaders/minimap_shader/opengl_vertex.glsl +++ b/client/shaders/minimap_shader/opengl_vertex.glsl @@ -1,9 +1,15 @@ -uniform mat4 mWorldViewProj; uniform mat4 mWorld; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; + void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = mWorldViewProj * gl_Vertex; - gl_FrontColor = gl_BackColor = gl_Color; + varTexCoord = inTexCoord0.st; + gl_Position = mWorldViewProj * inVertexPosition; +#ifdef GL_ES + varColor = inVertexColor.bgra; +#else + varColor = inVertexColor; +#endif } diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 437b325d3..c4b947e72 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -1,7 +1,6 @@ uniform sampler2D baseTexture; -uniform sampler2D normalTexture; -uniform sampler2D textureFlags; +uniform vec3 dayLight; uniform vec4 skyBgColor; uniform float fogDistance; uniform vec3 eyePosition; @@ -9,7 +8,28 @@ uniform vec3 eyePosition; // 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; + // shadow uniforms + uniform vec3 v_LightDirection; + uniform float f_textureresolution; + uniform mat4 m_ShadowViewProj; + uniform float f_shadowfar; + 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 + +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. @@ -17,21 +37,329 @@ varying vec3 vPosition; // cameraOffset + worldPosition (for large coordinates the limits of float // precision must be considered). varying vec3 worldPosition; -varying float area_enable_parallax; - +varying lowp vec4 varColor; +#ifdef GL_ES +varying mediump vec2 varTexCoord; +#else +centroid varying vec2 varTexCoord; +#endif varying vec3 eyeVec; -varying vec3 tsEyeVec; -varying vec3 lightVec; -varying vec3 tsLightVec; +varying float nightRatio; -bool normalTexturePresent = false; - -const float e = 2.718281828459; -const float BS = 10.0; const float fogStart = FOG_START; -const float fogShadingParameter = 1 / ( 1 - fogStart); +const float fogShadingParameter = 1.0 / ( 1.0 - fogStart); -#ifdef ENABLE_TONE_MAPPING +#ifdef ENABLE_DYNAMIC_SHADOWS + +// assuming near is always 1.0 +float getLinearDepth() +{ + return 2.0 * f_shadowfar / (f_shadowfar + 1.0 - (2.0 * gl_FragCoord.z - 1.0) * (f_shadowfar - 1.0)); +} + +vec3 getLightSpacePosition() +{ + 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 + +// c_precision of 128 fits within 7 base-10 digits +const float c_precision = 128.0; +const float c_precisionp1 = c_precision + 1.0; + +float packColor(vec3 color) +{ + return floor(color.b * c_precision + 0.5) + + floor(color.g * c_precision + 0.5) * c_precisionp1 + + floor(color.r * c_precision + 0.5) * c_precisionp1 * c_precisionp1; +} + +vec3 unpackColor(float value) +{ + vec3 color; + color.b = mod(value, c_precisionp1) / c_precision; + color.g = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision; + color.r = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision; + return color; +} + +vec4 getHardShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance) +{ + vec4 texDepth = texture2D(shadowsampler, smTexCoord.xy).rgba; + + 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 - texDepth.b); + result = vec4(visibility, unpackColor(texDepth.a)); + } + return result; +} + +#else + +float getHardShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance) +{ + float texDepth = texture2D(shadowsampler, smTexCoord.xy).r; + float visibility = step(0.0, realDistance - texDepth); + return visibility; +} + +#endif + + +#if SHADOW_FILTER == 2 + #define PCFBOUND 2.0 // 5x5 + #define PCFSAMPLES 25 +#elif SHADOW_FILTER == 1 + #define PCFBOUND 1.0 // 3x3 + #define PCFSAMPLES 9 +#else + #define PCFBOUND 0.0 + #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), + vec2(-0.299417, 0.791925), + vec2(0.645680, 0.493210), + vec2(-0.651784, 0.717887), + vec2(0.421003, 0.027070), + vec2(-0.817194, -0.271096), + vec2(-0.705374, -0.668203), + vec2(0.977050, -0.108615), + vec2(0.063326, 0.142369), + vec2(0.203528, 0.214331), + vec2(-0.667531, 0.326090), + vec2(-0.098422, -0.295755), + vec2(-0.885922, 0.215369), + vec2(0.566637, 0.605213), + vec2(0.039766, -0.396100), + vec2(0.751946, 0.453352), + vec2(0.078707, -0.715323), + vec2(-0.075838, -0.529344), + vec2(0.724479, -0.580798), + vec2(0.222999, -0.215125), + vec2(-0.467574, -0.405438), + vec2(-0.248268, -0.814753), + vec2(0.354411, -0.887570), + vec2(0.175817, 0.382366), + vec2(0.487472, -0.063082), + vec2(0.355476, 0.025357), + vec2(-0.084078, 0.898312), + vec2(0.488876, -0.783441), + vec2(0.470016, 0.217933), + vec2(-0.696890, -0.549791), + vec2(-0.149693, 0.605762), + vec2(0.034211, 0.979980), + vec2(0.503098, -0.308878), + vec2(-0.016205, -0.872921), + vec2(0.385784, -0.393902), + vec2(-0.146886, -0.859249), + vec2(0.643361, 0.164098), + vec2(0.634388, -0.049471), + vec2(-0.688894, 0.007843), + vec2(0.464034, -0.188818), + vec2(-0.440840, 0.137486), + vec2(0.364483, 0.511704), + vec2(0.034028, 0.325968), + vec2(0.099094, -0.308023), + vec2(0.693960, -0.366253), + vec2(0.678884, -0.204688), + vec2(0.001801, 0.780328), + vec2(0.145177, -0.898984), + vec2(0.062655, -0.611866), + vec2(0.315226, -0.604297), + vec2(-0.780145, 0.486251), + vec2(-0.371868, 0.882138), + vec2(0.200476, 0.494430), + vec2(-0.494552, -0.711051), + vec2(0.612476, 0.705252), + vec2(-0.578845, -0.768792), + vec2(-0.772454, -0.090976), + vec2(0.504440, 0.372295), + vec2(0.155736, 0.065157), + vec2(0.391522, 0.849605), + vec2(-0.620106, -0.328104), + vec2(0.789239, -0.419965), + vec2(-0.545396, 0.538133), + vec2(-0.178564, -0.596057) +); + +#ifdef COLORED_SHADOWS + +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; + + 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] * scale_factor + smTexCoord.xy; + visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance); + } + + 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; + + 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] * scale_factor + smTexCoord.xy; + visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance); + } + + return visibility / samples; +} + +#endif + +#else +/* poisson filter disabled */ + +#ifdef COLORED_SHADOWS + +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 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) * scale_factor + smTexCoord.xy; + visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance); + n += 1.0; + } + + 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 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) * scale_factor + smTexCoord.xy; + visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance); + n += 1.0; + } + + return visibility / max(n, 1.0); +} + +#endif + +#endif +#endif + +#if ENABLE_TONE_MAPPING /* Hable's UC2 Tone mapping parameters A = 0.22; @@ -55,7 +383,7 @@ vec4 applyToneMapping(vec4 color) const float gamma = 1.6; const float exposureBias = 5.5; color.rgb = uncharted2Tonemap(exposureBias * color.rgb); - // Precalculated white_scale from + // Precalculated white_scale from //vec3 whiteScale = 1.0 / uncharted2Tonemap(vec3(W)); vec3 whiteScale = vec3(1.036015346); color.rgb *= whiteScale; @@ -63,115 +391,86 @@ vec4 applyToneMapping(vec4 color) } #endif -void get_texture_flags() -{ - vec4 flags = texture2D(textureFlags, vec2(0.0, 0.0)); - if (flags.r > 0.5) { - normalTexturePresent = true; - } -} -vec4 get_normal_map(vec2 uv) -{ - vec4 bump = texture2D(normalTexture, uv).rgba; - bump.xyz = normalize(bump.xyz * 2.0 - 1.0); - return bump; -} - -float find_intersection(vec2 dp, vec2 ds) -{ - float depth = 1.0; - float best_depth = 0.0; - float size = 0.0625; - for (int i = 0; i < 15; i++) { - depth -= size; - float h = texture2D(normalTexture, dp + ds * depth).a; - if (depth <= h) { - best_depth = depth; - break; - } - } - depth = best_depth; - for (int i = 0; i < 4; i++) { - size *= 0.5; - float h = texture2D(normalTexture,dp + ds * depth).a; - if (depth <= h) { - best_depth = depth; - depth += size; - } else { - depth -= size; - } - } - return best_depth; -} void main(void) { vec3 color; - vec4 bump; - vec2 uv = gl_TexCoord[0].st; - bool use_normalmap = false; - get_texture_flags(); - -#ifdef ENABLE_PARALLAX_OCCLUSION - vec2 eyeRay = vec2 (tsEyeVec.x, -tsEyeVec.y); - const float scale = PARALLAX_OCCLUSION_SCALE / PARALLAX_OCCLUSION_ITERATIONS; - const float bias = PARALLAX_OCCLUSION_BIAS / PARALLAX_OCCLUSION_ITERATIONS; - -#if PARALLAX_OCCLUSION_MODE == 0 - // Parallax occlusion with slope information - if (normalTexturePresent && area_enable_parallax > 0.0) { - for (int i = 0; i < PARALLAX_OCCLUSION_ITERATIONS; i++) { - vec4 normal = texture2D(normalTexture, uv.xy); - float h = normal.a * scale - bias; - uv += h * normal.z * eyeRay; - } - } -#endif -#if PARALLAX_OCCLUSION_MODE == 1 - // Relief mapping - if (normalTexturePresent && area_enable_parallax > 0.0) { - vec2 ds = eyeRay * PARALLAX_OCCLUSION_SCALE; - float dist = find_intersection(uv, ds); - uv += dist * ds; - } -#endif -#endif - -#if USE_NORMALMAPS == 1 - if (normalTexturePresent) { - bump = get_normal_map(uv); - use_normalmap = true; - } -#endif + vec2 uv = varTexCoord.st; vec4 base = texture2D(baseTexture, uv).rgba; - -#ifdef USE_DISCARD // 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. - if (base.a == 0.0) { + // 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. +#ifdef USE_DISCARD + if (base.a == 0.0) + discard; +#endif +#ifdef USE_DISCARD_REF + if (base.a < 0.5) discard; - } #endif -#ifdef ENABLE_BUMPMAPPING - if (use_normalmap) { - vec3 L = normalize(lightVec); - vec3 E = normalize(eyeVec); - float specular = pow(clamp(dot(reflect(L, bump.xyz), E), 0.0, 1.0), 1.0); - float diffuse = dot(-E,bump.xyz); - color = (diffuse + 0.1 * specular) * base.rgb; - } else { - color = base.rgb; - } -#else color = base.rgb; + vec4 col = vec4(color.rgb * varColor.rgb, 1.0); + +#ifdef ENABLE_DYNAMIC_SHADOWS + 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 || 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 || 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); + + } + + // 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); + } + + 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 + } #endif - vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); - -#ifdef ENABLE_TONE_MAPPING +#if ENABLE_TONE_MAPPING col = applyToneMapping(col); #endif diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index 0d8d0a2a5..40f0965e1 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -1,6 +1,4 @@ -uniform mat4 mWorldViewProj; uniform mat4 mWorld; - // Color of the light emitted by the sun. uniform vec3 dayLight; uniform vec3 eyePosition; @@ -9,6 +7,7 @@ uniform vec3 eyePosition; uniform vec3 cameraOffset; uniform float animationTimer; +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. @@ -16,17 +15,80 @@ varying vec3 vPosition; // cameraOffset + worldPosition (for large coordinates the limits of float // precision must be considered). varying vec3 worldPosition; +varying lowp vec4 varColor; +// The centroid keyword ensures that after interpolation the texture coordinates +// lie within the same bounds when MSAA is en- and disabled. +// This fixes the stripes problem with nearest-neighbour textures and MSAA. +#ifdef GL_ES +varying mediump vec2 varTexCoord; +#else +centroid varying vec2 varTexCoord; +#endif +#ifdef ENABLE_DYNAMIC_SHADOWS + // shadow uniforms + uniform vec3 v_LightDirection; + uniform float f_textureresolution; + uniform mat4 m_ShadowViewProj; + 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 vec3 lightVec; -varying vec3 tsEyeVec; -varying vec3 tsLightVec; -varying float area_enable_parallax; - +varying float nightRatio; // Color of the light emitted by the light sources. 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) +{ + float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); + return t * t * (3.0 - 2.0 * t); +} +#endif float smoothCurve(float x) @@ -83,27 +145,18 @@ float snoise(vec3 p) #endif + + + void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - //TODO: make offset depending on view angle and parallax uv displacement - //thats for textures that doesnt align vertically, like dirt with grass - //gl_TexCoord[0].y += 0.008; + varTexCoord = inTexCoord0.st; - //Allow parallax/relief mapping only for certain kind of nodes - //Variable is also used to control area of the effect -#if (DRAW_TYPE == NDT_NORMAL || DRAW_TYPE == NDT_LIQUID || DRAW_TYPE == NDT_FLOWINGLIQUID) - area_enable_parallax = 1.0; -#else - area_enable_parallax = 0.0; -#endif - - -float disp_x; -float disp_z; + float disp_x; + float disp_z; // OpenGL < 4.3 does not support continued preprocessor lines #if (MATERIAL_TYPE == TILE_MATERIAL_WAVING_LEAVES && ENABLE_WAVING_LEAVES) || (MATERIAL_TYPE == TILE_MATERIAL_WAVING_PLANTS && ENABLE_WAVING_PLANTS) - vec4 pos2 = mWorld * gl_Vertex; + vec4 pos2 = mWorld * inVertexPosition; float tOffset = (pos2.x + pos2.y) * 0.001 + pos2.z * 0.002; disp_x = (smoothTriangleWave(animationTimer * 23.0 + tOffset) + smoothTriangleWave(animationTimer * 11.0 + tOffset)) * 0.4; @@ -112,86 +165,108 @@ float disp_z; smoothTriangleWave(animationTimer * 13.0 + tOffset)) * 0.5; #endif - worldPosition = (mWorld * gl_Vertex).xyz; - + vec4 pos = inVertexPosition; // OpenGL < 4.3 does not support continued preprocessor lines #if (MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_OPAQUE || MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_BASIC) && ENABLE_WAVING_WATER // Generate waves with Perlin-type noise. // The constants are calibrated such that they roughly // correspond to the old sine waves. - vec4 pos = gl_Vertex; - vec3 wavePos = worldPosition + cameraOffset; + vec3 wavePos = (mWorld * pos).xyz + cameraOffset; // The waves are slightly compressed along the z-axis to get // wave-fronts along the x-axis. - wavePos.x /= WATER_WAVE_LENGTH * 3; - wavePos.z /= WATER_WAVE_LENGTH * 2; - wavePos.z += animationTimer * WATER_WAVE_SPEED * 10; - pos.y += (snoise(wavePos) - 1) * WATER_WAVE_HEIGHT * 5; - gl_Position = mWorldViewProj * pos; + wavePos.x /= WATER_WAVE_LENGTH * 3.0; + wavePos.z /= WATER_WAVE_LENGTH * 2.0; + wavePos.z += animationTimer * WATER_WAVE_SPEED * 10.0; + pos.y += (snoise(wavePos) - 1.0) * WATER_WAVE_HEIGHT * 5.0; #elif MATERIAL_TYPE == TILE_MATERIAL_WAVING_LEAVES && ENABLE_WAVING_LEAVES - vec4 pos = gl_Vertex; pos.x += disp_x; pos.y += disp_z * 0.1; pos.z += disp_z; - gl_Position = mWorldViewProj * pos; #elif MATERIAL_TYPE == TILE_MATERIAL_WAVING_PLANTS && ENABLE_WAVING_PLANTS - vec4 pos = gl_Vertex; - if (gl_TexCoord[0].y < 0.05) { + if (varTexCoord.y < 0.05) { pos.x += disp_x; pos.z += disp_z; } - gl_Position = mWorldViewProj * pos; -#else - gl_Position = mWorldViewProj * gl_Vertex; #endif - + worldPosition = (mWorld * pos).xyz; + gl_Position = mWorldViewProj * pos; vPosition = gl_Position.xyz; - - // Don't generate heightmaps when too far from the eye - float dist = distance (vec3(0.0, 0.0, 0.0), vPosition); - if (dist > 150.0) { - area_enable_parallax = 0.0; - } - - vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0); - - vec3 normal, tangent, binormal; - normal = normalize(gl_NormalMatrix * gl_Normal); - tangent = normalize(gl_NormalMatrix * gl_MultiTexCoord1.xyz); - binormal = normalize(gl_NormalMatrix * gl_MultiTexCoord2.xyz); - - vec3 v; - - lightVec = sunPosition - worldPosition; - v.x = dot(lightVec, tangent); - v.y = dot(lightVec, binormal); - v.z = dot(lightVec, normal); - tsLightVec = normalize (v); - - eyeVec = -(gl_ModelViewMatrix * gl_Vertex).xyz; - v.x = dot(eyeVec, tangent); - v.y = dot(eyeVec, binormal); - v.z = dot(eyeVec, normal); - tsEyeVec = normalize (v); + eyeVec = -(mWorldView * pos).xyz; + vNormal = inVertexNormal; // Calculate color. // Red, green and blue components are pre-multiplied with // the brightness, so now we have to multiply these // colors with the color of the incoming light. // The pre-baked colors are halved to prevent overflow. - vec4 color; +#ifdef GL_ES + vec4 color = inVertexColor.bgra; +#else + vec4 color = inVertexColor; +#endif // The alpha gives the ratio of sunlight in the incoming light. - float nightRatio = 1 - gl_Color.a; - color.rgb = gl_Color.rgb * (gl_Color.a * dayLight.rgb + - nightRatio * artificialLight.rgb) * 2; - color.a = 1; + 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; + 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); - gl_FrontColor = gl_BackColor = clamp(color, 0.0, 1.0); + varColor = clamp(color, 0.0, 1.0); + +#ifdef ENABLE_DYNAMIC_SHADOWS + if (f_shadow_strength > 0.0) { +#if MATERIAL_TYPE == TILE_MATERIAL_WAVING_PLANTS && ENABLE_WAVING_PLANTS + // The shadow shaders don't apply waving when creating the shadow-map. + // We are using the not waved inVertexPosition to avoid ugly self-shadowing. + vec4 shadow_pos = inVertexPosition; +#else + vec4 shadow_pos = pos; +#endif + 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 * shadow_pos)); + 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 * (shadow_pos + 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/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl index a8a43e1e2..1fefc764b 100644 --- a/client/shaders/object_shader/opengl_fragment.glsl +++ b/client/shaders/object_shader/opengl_fragment.glsl @@ -1,31 +1,367 @@ uniform sampler2D baseTexture; -uniform sampler2D normalTexture; -uniform sampler2D textureFlags; -uniform vec4 emissiveColor; +uniform vec3 dayLight; uniform vec4 skyBgColor; uniform float fogDistance; uniform vec3 eyePosition; +// 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; + // shadow uniforms + uniform vec3 v_LightDirection; + uniform float f_textureresolution; + uniform mat4 m_ShadowViewProj; + uniform float f_shadowfar; + 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 + + 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 vec3 lightVec; +varying float nightRatio; + varying float vIDiff; -bool normalTexturePresent = false; -bool texTileableHorizontal = false; -bool texTileableVertical = false; -bool texSeamless = false; - -const float e = 2.718281828459; -const float BS = 10.0; const float fogStart = FOG_START; -const float fogShadingParameter = 1 / ( 1 - fogStart); +const float fogShadingParameter = 1.0 / (1.0 - fogStart); -#ifdef ENABLE_TONE_MAPPING +#ifdef ENABLE_DYNAMIC_SHADOWS + +// assuming near is always 1.0 +float getLinearDepth() +{ + return 2.0 * f_shadowfar / (f_shadowfar + 1.0 - (2.0 * gl_FragCoord.z - 1.0) * (f_shadowfar - 1.0)); +} + +vec3 getLightSpacePosition() +{ + 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 + +// c_precision of 128 fits within 7 base-10 digits +const float c_precision = 128.0; +const float c_precisionp1 = c_precision + 1.0; + +float packColor(vec3 color) +{ + return floor(color.b * c_precision + 0.5) + + floor(color.g * c_precision + 0.5) * c_precisionp1 + + floor(color.r * c_precision + 0.5) * c_precisionp1 * c_precisionp1; +} + +vec3 unpackColor(float value) +{ + vec3 color; + color.b = mod(value, c_precisionp1) / c_precision; + color.g = mod(floor(value / c_precisionp1), c_precisionp1) / c_precision; + color.r = floor(value / (c_precisionp1 * c_precisionp1)) / c_precision; + return color; +} + +vec4 getHardShadowColor(sampler2D shadowsampler, vec2 smTexCoord, float realDistance) +{ + vec4 texDepth = texture2D(shadowsampler, smTexCoord.xy).rgba; + + 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 - texDepth.b); + result = vec4(visibility, unpackColor(texDepth.a)); + } + return result; +} + +#else + +float getHardShadow(sampler2D shadowsampler, vec2 smTexCoord, float realDistance) +{ + float texDepth = texture2D(shadowsampler, smTexCoord.xy).r; + float visibility = step(0.0, realDistance - texDepth); + return visibility; +} + +#endif + + +#if SHADOW_FILTER == 2 + #define PCFBOUND 2.0 // 5x5 + #define PCFSAMPLES 25 +#elif SHADOW_FILTER == 1 + #define PCFBOUND 1.0 // 3x3 + #define PCFSAMPLES 9 +#else + #define PCFBOUND 0.0 + #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), + vec2(-0.299417, 0.791925), + vec2(0.645680, 0.493210), + vec2(-0.651784, 0.717887), + vec2(0.421003, 0.027070), + vec2(-0.817194, -0.271096), + vec2(-0.705374, -0.668203), + vec2(0.977050, -0.108615), + vec2(0.063326, 0.142369), + vec2(0.203528, 0.214331), + vec2(-0.667531, 0.326090), + vec2(-0.098422, -0.295755), + vec2(-0.885922, 0.215369), + vec2(0.566637, 0.605213), + vec2(0.039766, -0.396100), + vec2(0.751946, 0.453352), + vec2(0.078707, -0.715323), + vec2(-0.075838, -0.529344), + vec2(0.724479, -0.580798), + vec2(0.222999, -0.215125), + vec2(-0.467574, -0.405438), + vec2(-0.248268, -0.814753), + vec2(0.354411, -0.887570), + vec2(0.175817, 0.382366), + vec2(0.487472, -0.063082), + vec2(0.355476, 0.025357), + vec2(-0.084078, 0.898312), + vec2(0.488876, -0.783441), + vec2(0.470016, 0.217933), + vec2(-0.696890, -0.549791), + vec2(-0.149693, 0.605762), + vec2(0.034211, 0.979980), + vec2(0.503098, -0.308878), + vec2(-0.016205, -0.872921), + vec2(0.385784, -0.393902), + vec2(-0.146886, -0.859249), + vec2(0.643361, 0.164098), + vec2(0.634388, -0.049471), + vec2(-0.688894, 0.007843), + vec2(0.464034, -0.188818), + vec2(-0.440840, 0.137486), + vec2(0.364483, 0.511704), + vec2(0.034028, 0.325968), + vec2(0.099094, -0.308023), + vec2(0.693960, -0.366253), + vec2(0.678884, -0.204688), + vec2(0.001801, 0.780328), + vec2(0.145177, -0.898984), + vec2(0.062655, -0.611866), + vec2(0.315226, -0.604297), + vec2(-0.780145, 0.486251), + vec2(-0.371868, 0.882138), + vec2(0.200476, 0.494430), + vec2(-0.494552, -0.711051), + vec2(0.612476, 0.705252), + vec2(-0.578845, -0.768792), + vec2(-0.772454, -0.090976), + vec2(0.504440, 0.372295), + vec2(0.155736, 0.065157), + vec2(0.391522, 0.849605), + vec2(-0.620106, -0.328104), + vec2(0.789239, -0.419965), + vec2(-0.545396, 0.538133), + vec2(-0.178564, -0.596057) +); + +#ifdef COLORED_SHADOWS + +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; + + 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] * scale_factor + smTexCoord.xy; + visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance); + } + + 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; + + 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] * scale_factor + smTexCoord.xy; + visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance); + } + + return visibility / samples; +} + +#endif + +#else +/* poisson filter disabled */ + +#ifdef COLORED_SHADOWS + +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 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) * scale_factor + smTexCoord.xy; + visibility += getHardShadowColor(shadowsampler, clampedpos.xy, realDistance); + n += 1.0; + } + + 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 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) * scale_factor + smTexCoord.xy; + visibility += getHardShadow(shadowsampler, clampedpos.xy, realDistance); + n += 1.0; + } + + return visibility / max(n, 1.0); +} + +#endif + +#endif +#endif + +#if ENABLE_TONE_MAPPING /* Hable's UC2 Tone mapping parameters A = 0.22; @@ -49,7 +385,7 @@ vec4 applyToneMapping(vec4 color) const float gamma = 1.6; const float exposureBias = 5.5; color.rgb = uncharted2Tonemap(exposureBias * color.rgb); - // Precalculated white_scale from + // Precalculated white_scale from //vec3 whiteScale = 1.0 / uncharted2Tonemap(vec3(W)); vec3 whiteScale = vec3(1.036015346); color.rgb *= whiteScale; @@ -57,76 +393,87 @@ vec4 applyToneMapping(vec4 color) } #endif -void get_texture_flags() -{ - vec4 flags = texture2D(textureFlags, vec2(0.0, 0.0)); - if (flags.r > 0.5) { - normalTexturePresent = true; - } - if (flags.g > 0.5) { - texTileableHorizontal = true; - } - if (flags.b > 0.5) { - texTileableVertical = true; - } - if (texTileableHorizontal && texTileableVertical) { - texSeamless = true; - } -} -vec4 get_normal_map(vec2 uv) -{ - vec4 bump = texture2D(normalTexture, uv).rgba; - bump.xyz = normalize(bump.xyz * 2.0 - 1.0); - return bump; -} void main(void) { vec3 color; - vec4 bump; - vec2 uv = gl_TexCoord[0].st; - bool use_normalmap = false; - get_texture_flags(); - -#if USE_NORMALMAPS == 1 - if (normalTexturePresent) { - bump = get_normal_map(uv); - use_normalmap = true; - } -#endif + vec2 uv = varTexCoord.st; vec4 base = texture2D(baseTexture, uv).rgba; - -#ifdef USE_DISCARD // 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. - if (base.a == 0.0) { + // 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. +#ifdef USE_DISCARD + if (base.a == 0.0) + discard; +#endif +#ifdef USE_DISCARD_REF + if (base.a < 0.5) discard; - } #endif -#ifdef ENABLE_BUMPMAPPING - if (use_normalmap) { - vec3 L = normalize(lightVec); - vec3 E = normalize(eyeVec); - float specular = pow(clamp(dot(reflect(L, bump.xyz), E), 0.0, 1.0), 1.0); - float diffuse = dot(-E,bump.xyz); - color = (diffuse + 0.1 * specular) * base.rgb; - } else { - color = base.rgb; - } -#else color = base.rgb; + vec4 col = vec4(color.rgb * varColor.rgb, 1.0); + col.rgb *= vIDiff; + +#ifdef ENABLE_DYNAMIC_SHADOWS + 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 || 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 || 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); + + } + + // 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 + } #endif - vec4 col = vec4(color.rgb, base.a); - - col.rgb *= gl_Color.rgb; - - col.rgb *= emissiveColor.rgb * vIDiff; - -#ifdef ENABLE_TONE_MAPPING +#if ENABLE_TONE_MAPPING col = applyToneMapping(col); #endif @@ -142,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 968a07e22..dc9c70cdf 100644 --- a/client/shaders/object_shader/opengl_vertex.glsl +++ b/client/shaders/object_shader/opengl_vertex.glsl @@ -1,53 +1,181 @@ -uniform mat4 mWorldViewProj; uniform mat4 mWorld; - +uniform vec3 dayLight; uniform vec3 eyePosition; uniform float animationTimer; +uniform vec4 emissiveColor; +uniform vec3 cameraOffset; + 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 + +#ifdef ENABLE_DYNAMIC_SHADOWS + // shadow uniforms + uniform vec3 v_LightDirection; + uniform float f_textureresolution; + uniform mat4 m_ShadowViewProj; + uniform float f_shadowfar; + uniform float f_shadow_strength; + uniform float f_timeofday; + uniform vec4 CameraPos; + + varying float cosLight; + varying float adj_shadow_strength; + varying float f_normal_length; + varying vec3 shadow_position; + varying float perspective_factor; +#endif varying vec3 eyeVec; -varying vec3 lightVec; +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) +{ + float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); + return t * t * (3.0 - 2.0 * t); +} +#endif + float directional_ambient(vec3 normal) { vec3 v = normal * normal; - if (normal.y < 0) - return dot(v, vec3(0.670820f, 0.447213f, 0.836660f)); + if (normal.y < 0.0) + return dot(v, vec3(0.670820, 0.447213, 0.836660)); - return dot(v, vec3(0.670820f, 1.000000f, 0.836660f)); + return dot(v, vec3(0.670820, 1.000000, 0.836660)); } void main(void) { - gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; - gl_Position = mWorldViewProj * gl_Vertex; + varTexCoord = (mTexture * inTexCoord0).st; + gl_Position = mWorldViewProj * inVertexPosition; vPosition = gl_Position.xyz; - vNormal = gl_Normal; - worldPosition = (mWorld * gl_Vertex).xyz; - - vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0); - - lightVec = sunPosition - worldPosition; - eyeVec = -(gl_ModelViewMatrix * gl_Vertex).xyz; + vNormal = (mWorld * vec4(inVertexNormal, 0.0)).xyz; + worldPosition = (mWorld * inVertexPosition).xyz; + eyeVec = -(mWorldView * inVertexPosition).xyz; #if (MATERIAL_TYPE == TILE_MATERIAL_PLAIN) || (MATERIAL_TYPE == TILE_MATERIAL_PLAIN_ALPHA) vIDiff = 1.0; #else // This is intentional comparison with zero without any margin. // If normal is not equal to zero exactly, then we assume it's a valid, just not normalized vector - vIDiff = length(gl_Normal) == 0.0 + vIDiff = length(inVertexNormal) == 0.0 ? 1.0 - : directional_ambient(normalize(gl_Normal)); + : directional_ambient(normalize(inVertexNormal)); #endif - gl_FrontColor = gl_BackColor = gl_Color; +#ifdef GL_ES + vec4 color = inVertexColor.bgra; +#else + vec4 color = inVertexColor; +#endif + + color *= emissiveColor; + + // 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/selection_shader/opengl_fragment.glsl b/client/shaders/selection_shader/opengl_fragment.glsl index c679d0e12..35b1f8902 100644 --- a/client/shaders/selection_shader/opengl_fragment.glsl +++ b/client/shaders/selection_shader/opengl_fragment.glsl @@ -1,9 +1,12 @@ uniform sampler2D baseTexture; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; + void main(void) { - vec2 uv = gl_TexCoord[0].st; + vec2 uv = varTexCoord.st; vec4 color = texture2D(baseTexture, uv); - color.rgb *= gl_Color.rgb; + color.rgb *= varColor.rgb; gl_FragColor = color; } diff --git a/client/shaders/selection_shader/opengl_vertex.glsl b/client/shaders/selection_shader/opengl_vertex.glsl index d0b16c8b0..39dde3056 100644 --- a/client/shaders/selection_shader/opengl_vertex.glsl +++ b/client/shaders/selection_shader/opengl_vertex.glsl @@ -1,9 +1,14 @@ -uniform mat4 mWorldViewProj; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = mWorldViewProj * gl_Vertex; + varTexCoord = inTexCoord0.st; + gl_Position = mWorldViewProj * inVertexPosition; - gl_FrontColor = gl_BackColor = gl_Color; +#ifdef GL_ES + varColor = inVertexColor.bgra; +#else + varColor = inVertexColor; +#endif } diff --git a/client/shaders/shadow_shaders/pass1_fragment.glsl b/client/shaders/shadow_shaders/pass1_fragment.glsl new file mode 100644 index 000000000..2105def96 --- /dev/null +++ b/client/shaders/shadow_shaders/pass1_fragment.glsl @@ -0,0 +1,13 @@ +uniform sampler2D ColorMapSampler; +varying vec4 tPos; + +void main() +{ + vec4 col = texture2D(ColorMapSampler, gl_TexCoord[0].st); + + if (col.a < 0.70) + discard; + + float depth = 0.5 + tPos.z * 0.5; + gl_FragColor = vec4(depth, 0.0, 0.0, 1.0); +} diff --git a/client/shaders/shadow_shaders/pass1_trans_fragment.glsl b/client/shaders/shadow_shaders/pass1_trans_fragment.glsl new file mode 100644 index 000000000..b267c2214 --- /dev/null +++ b/client/shaders/shadow_shaders/pass1_trans_fragment.glsl @@ -0,0 +1,42 @@ +uniform sampler2D ColorMapSampler; +varying vec4 tPos; + +#ifdef COLORED_SHADOWS +varying vec3 varColor; + +// c_precision of 128 fits within 7 base-10 digits +const float c_precision = 128.0; +const float c_precisionp1 = c_precision + 1.0; + +float packColor(vec3 color) +{ + return floor(color.b * c_precision + 0.5) + + floor(color.g * c_precision + 0.5) * c_precisionp1 + + floor(color.r * c_precision + 0.5) * c_precisionp1 * c_precisionp1; +} + +const vec3 black = vec3(0.0); +#endif + +void main() +{ + vec4 col = texture2D(ColorMapSampler, gl_TexCoord[0].st); +#ifndef COLORED_SHADOWS + if (col.a < 0.5) + discard; +#endif + + float depth = 0.5 + tPos.z * 0.5; + // ToDo: Liso: Apply movement on waving plants + // depth in [0, 1] for texture + + //col.rgb = col.a == 1.0 ? vec3(1.0) : col.rgb; +#ifdef COLORED_SHADOWS + col.rgb *= varColor.rgb; + // premultiply color alpha (see-through side) + float packedColor = packColor(col.rgb * (1.0 - col.a)); + gl_FragColor = vec4(depth, packedColor, 0.0,1.0); +#else + gl_FragColor = vec4(depth, 0.0, 0.0, 1.0); +#endif +} diff --git a/client/shaders/shadow_shaders/pass1_trans_vertex.glsl b/client/shaders/shadow_shaders/pass1_trans_vertex.glsl new file mode 100644 index 000000000..244d2562a --- /dev/null +++ b/client/shaders/shadow_shaders/pass1_trans_vertex.glsl @@ -0,0 +1,50 @@ +uniform mat4 LightMVP; // world matrix +uniform vec4 CameraPos; +varying vec4 tPos; +#ifdef COLORED_SHADOWS +varying vec3 varColor; +#endif + +uniform float xyPerspectiveBias0; +uniform float xyPerspectiveBias1; +uniform float zPerspectiveBias; + +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; +} + +void main() +{ + vec4 pos = LightMVP * gl_Vertex; + + tPos = applyPerspectiveDistortion(LightMVP * gl_Vertex); + + gl_Position = vec4(tPos.xyz, 1.0); + gl_TexCoord[0].st = gl_MultiTexCoord0.st; + +#ifdef COLORED_SHADOWS + varColor = gl_Color.rgb; +#endif +} diff --git a/client/shaders/shadow_shaders/pass1_vertex.glsl b/client/shaders/shadow_shaders/pass1_vertex.glsl new file mode 100644 index 000000000..1dceb93c6 --- /dev/null +++ b/client/shaders/shadow_shaders/pass1_vertex.glsl @@ -0,0 +1,43 @@ +uniform mat4 LightMVP; // world matrix +uniform vec4 CameraPos; // camera position +varying vec4 tPos; + +uniform float xyPerspectiveBias0; +uniform float xyPerspectiveBias1; +uniform float zPerspectiveBias; + +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; +} + +void main() +{ + vec4 pos = LightMVP * gl_Vertex; + + tPos = applyPerspectiveDistortion(pos); + + gl_Position = vec4(tPos.xyz, 1.0); + gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; +} diff --git a/client/shaders/shadow_shaders/pass2_fragment.glsl b/client/shaders/shadow_shaders/pass2_fragment.glsl new file mode 100644 index 000000000..00b4f9f6c --- /dev/null +++ b/client/shaders/shadow_shaders/pass2_fragment.glsl @@ -0,0 +1,23 @@ +uniform sampler2D ShadowMapClientMap; +#ifdef COLORED_SHADOWS +uniform sampler2D ShadowMapClientMapTraslucent; +#endif +uniform sampler2D ShadowMapSamplerdynamic; + +void main() { + +#ifdef COLORED_SHADOWS + vec2 first_depth = texture2D(ShadowMapClientMap, gl_TexCoord[0].st).rg; + vec2 depth_splitdynamics = vec2(texture2D(ShadowMapSamplerdynamic, gl_TexCoord[2].st).r, 0.0); + if (first_depth.r > depth_splitdynamics.r) + first_depth = depth_splitdynamics; + vec2 depth_color = texture2D(ShadowMapClientMapTraslucent, gl_TexCoord[1].st).rg; + gl_FragColor = vec4(first_depth.r, first_depth.g, depth_color.r, depth_color.g); +#else + float first_depth = texture2D(ShadowMapClientMap, gl_TexCoord[0].st).r; + float depth_splitdynamics = texture2D(ShadowMapSamplerdynamic, gl_TexCoord[2].st).r; + first_depth = min(first_depth, depth_splitdynamics); + gl_FragColor = vec4(first_depth, 0.0, 0.0, 1.0); +#endif + +} diff --git a/client/shaders/shadow_shaders/pass2_vertex.glsl b/client/shaders/shadow_shaders/pass2_vertex.glsl new file mode 100644 index 000000000..ac445c9c7 --- /dev/null +++ b/client/shaders/shadow_shaders/pass2_vertex.glsl @@ -0,0 +1,9 @@ + +void main() +{ + vec4 uv = vec4(gl_Vertex.xyz, 1.0) * 0.5 + 0.5; + gl_TexCoord[0] = uv; + gl_TexCoord[1] = uv; + gl_TexCoord[2] = uv; + gl_Position = vec4(gl_Vertex.xyz, 1.0); +} diff --git a/client/shaders/stars_shader/opengl_fragment.glsl b/client/shaders/stars_shader/opengl_fragment.glsl new file mode 100644 index 000000000..a9ed741bf --- /dev/null +++ b/client/shaders/stars_shader/opengl_fragment.glsl @@ -0,0 +1,6 @@ +uniform vec4 starColor; + +void main(void) +{ + gl_FragColor = starColor; +} diff --git a/client/shaders/stars_shader/opengl_vertex.glsl b/client/shaders/stars_shader/opengl_vertex.glsl new file mode 100644 index 000000000..77c401f34 --- /dev/null +++ b/client/shaders/stars_shader/opengl_vertex.glsl @@ -0,0 +1,4 @@ +void main(void) +{ + gl_Position = mWorldViewProj * inVertexPosition; +} diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua index 089955d2f..46d59ec9a 100644 --- a/clientmods/preview/init.lua +++ b/clientmods/preview/init.lua @@ -109,6 +109,10 @@ core.register_on_sending_chat_message(function(message) return false end) +core.register_on_chatcommand(function(command, params) + print("[PREVIEW] caught command '"..command.."'. Parameters: '"..params.."'") +end) + -- This is an example function to ensure it's working properly, should be removed before merge core.register_on_hp_modification(function(hp) print("[PREVIEW] HP modified " .. hp) @@ -161,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 new file mode 100644 index 000000000..23a5c3e90 --- /dev/null +++ b/clientmods/preview/mod.conf @@ -0,0 +1 @@ +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/FindGMP.cmake b/cmake/Modules/FindGMP.cmake index 7b45f16c7..190b7c548 100644 --- a/cmake/Modules/FindGMP.cmake +++ b/cmake/Modules/FindGMP.cmake @@ -12,8 +12,6 @@ if(ENABLE_SYSTEM_GMP) else() message (STATUS "Detecting GMP from system failed.") endif() -else() - message (STATUS "Detecting GMP from system disabled! (ENABLE_SYSTEM_GMP=0)") endif() if(NOT USE_SYSTEM_GMP) diff --git a/cmake/Modules/FindGettextLib.cmake b/cmake/Modules/FindGettextLib.cmake index 529452a4a..b7681827c 100644 --- a/cmake/Modules/FindGettextLib.cmake +++ b/cmake/Modules/FindGettextLib.cmake @@ -42,15 +42,6 @@ if(WIN32) NAMES ${GETTEXT_LIB_NAMES} PATHS "${CUSTOM_GETTEXT_PATH}/lib" DOC "GetText library") - find_file(GETTEXT_DLL - NAMES libintl.dll intl.dll libintl3.dll intl3.dll - PATHS "${CUSTOM_GETTEXT_PATH}/bin" "${CUSTOM_GETTEXT_PATH}/lib" - DOC "gettext *intl*.dll") - find_file(GETTEXT_ICONV_DLL - NAMES libiconv2.dll - PATHS "${CUSTOM_GETTEXT_PATH}/bin" "${CUSTOM_GETTEXT_PATH}/lib" - DOC "gettext *iconv*.lib") - set(GETTEXT_REQUIRED_VARS ${GETTEXT_REQUIRED_VARS} GETTEXT_DLL GETTEXT_ICONV_DLL) endif(WIN32) diff --git a/cmake/Modules/FindIrrlicht.cmake b/cmake/Modules/FindIrrlicht.cmake deleted file mode 100644 index 6f361e829..000000000 --- a/cmake/Modules/FindIrrlicht.cmake +++ /dev/null @@ -1,77 +0,0 @@ - -mark_as_advanced(IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR IRRLICHT_DLL) -set(IRRLICHT_SOURCE_DIR "" CACHE PATH "Path to irrlicht source directory (optional)") - - -# Find include directory - -if(NOT IRRLICHT_SOURCE_DIR STREQUAL "") - set(IRRLICHT_SOURCE_DIR_INCLUDE - "${IRRLICHT_SOURCE_DIR}/include" - ) - - set(IRRLICHT_LIBRARY_NAMES libIrrlicht.a Irrlicht Irrlicht.lib) - - if(WIN32) - if(MSVC) - set(IRRLICHT_SOURCE_DIR_LIBS "${IRRLICHT_SOURCE_DIR}/lib/Win32-visualstudio") - set(IRRLICHT_LIBRARY_NAMES Irrlicht.lib) - else() - set(IRRLICHT_SOURCE_DIR_LIBS "${IRRLICHT_SOURCE_DIR}/lib/Win32-gcc") - set(IRRLICHT_LIBRARY_NAMES libIrrlicht.a libIrrlicht.dll.a) - endif() - else() - set(IRRLICHT_SOURCE_DIR_LIBS "${IRRLICHT_SOURCE_DIR}/lib/Linux") - set(IRRLICHT_LIBRARY_NAMES libIrrlicht.a) - endif() - - find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h - PATHS - ${IRRLICHT_SOURCE_DIR_INCLUDE} - NO_DEFAULT_PATH - ) - - find_library(IRRLICHT_LIBRARY NAMES ${IRRLICHT_LIBRARY_NAMES} - PATHS - ${IRRLICHT_SOURCE_DIR_LIBS} - NO_DEFAULT_PATH - ) - -else() - find_path(IRRLICHT_INCLUDE_DIR NAMES irrlicht.h - PATHS - /usr/local/include/irrlicht - /usr/include/irrlicht - /system/develop/headers/irrlicht #Haiku - PATH_SUFFIXES "include/irrlicht" - ) - - find_library(IRRLICHT_LIBRARY NAMES libIrrlicht.so libIrrlicht.a Irrlicht - PATHS - /usr/local/lib - /usr/lib - /system/develop/lib # Haiku - ) -endif() - - -# On Windows, find the DLL for installation -if(WIN32) - # If VCPKG_APPLOCAL_DEPS is ON, dll's are automatically handled by VCPKG - if(NOT VCPKG_APPLOCAL_DEPS) - if(MSVC) - set(IRRLICHT_COMPILER "VisualStudio") - else() - set(IRRLICHT_COMPILER "gcc") - endif() - find_file(IRRLICHT_DLL NAMES Irrlicht.dll - PATHS - "${IRRLICHT_SOURCE_DIR}/bin/Win32-${IRRLICHT_COMPILER}" - DOC "Path of the Irrlicht dll (for installation)" - ) - endif() -endif(WIN32) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Irrlicht DEFAULT_MSG IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR) - diff --git a/cmake/Modules/FindJson.cmake b/cmake/Modules/FindJson.cmake index a5e9098f8..cce2d387f 100644 --- a/cmake/Modules/FindJson.cmake +++ b/cmake/Modules/FindJson.cmake @@ -1,26 +1,25 @@ -# Look for JSONCPP if asked to. -# We use a bundled version by default because some distros ship versions of -# JSONCPP that cause segfaults and other memory errors when we link with them. -# See https://github.com/minetest/minetest/issues/1793 +# Look for JsonCpp, with fallback to bundeled version mark_as_advanced(JSON_LIBRARY JSON_INCLUDE_DIR) -option(ENABLE_SYSTEM_JSONCPP "Enable using a system-wide JSONCPP. May cause segfaults and other memory errors!" FALSE) +option(ENABLE_SYSTEM_JSONCPP "Enable using a system-wide JsonCpp" TRUE) +set(USE_SYSTEM_JSONCPP FALSE) if(ENABLE_SYSTEM_JSONCPP) find_library(JSON_LIBRARY NAMES jsoncpp) find_path(JSON_INCLUDE_DIR json/allocator.h PATH_SUFFIXES jsoncpp) - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(Json DEFAULT_MSG JSON_LIBRARY JSON_INCLUDE_DIR) - - if(JSON_FOUND) - message(STATUS "Using system JSONCPP library.") + if(JSON_LIBRARY AND JSON_INCLUDE_DIR) + message(STATUS "Using JsonCpp provided by system.") + set(USE_SYSTEM_JSONCPP TRUE) endif() endif() -if(NOT JSON_FOUND) - message(STATUS "Using bundled JSONCPP library.") +if(NOT USE_SYSTEM_JSONCPP) + message(STATUS "Using bundled JsonCpp library.") set(JSON_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/jsoncpp) set(JSON_LIBRARY jsoncpp) add_subdirectory(lib/jsoncpp) endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Json DEFAULT_MSG JSON_LIBRARY JSON_INCLUDE_DIR) diff --git a/cmake/Modules/FindLuaJIT.cmake b/cmake/Modules/FindLuaJIT.cmake index 97b0b7c64..217415d14 100644 --- a/cmake/Modules/FindLuaJIT.cmake +++ b/cmake/Modules/FindLuaJIT.cmake @@ -1,8 +1,8 @@ # Locate LuaJIT library # This module defines # LUAJIT_FOUND, if false, do not try to link to Lua +# LUA_LIBRARY, where to find the lua library # LUA_INCLUDE_DIR, where to find lua.h -# LUA_VERSION_STRING, the version of Lua found (since CMake 2.8.8) # # This module is similar to FindLua51.cmake except that it finds LuaJit instead. @@ -44,19 +44,10 @@ else() ) endif() - -IF(LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/luajit.h") - FILE(STRINGS "${LUA_INCLUDE_DIR}/luajit.h" lua_version_str REGEX "^#define[ \t]+LUA_RELEASE[ \t]+\"LuaJIT .+\"") - - STRING(REGEX REPLACE "^#define[ \t]+LUA_RELEASE[ \t]+\"LuaJIT ([^\"]+)\".*" "\\1" LUA_VERSION_STRING "${lua_version_str}") - UNSET(lua_version_str) -ENDIF() - INCLUDE(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set LUAJIT_FOUND to TRUE if -# all listed variables are TRUE +# all listed variables exist FIND_PACKAGE_HANDLE_STANDARD_ARGS(LuaJIT - REQUIRED_VARS LUA_LIBRARY LUA_INCLUDE_DIR - VERSION_VAR LUA_VERSION_STRING) + REQUIRED_VARS LUA_LIBRARY LUA_INCLUDE_DIR) -MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARY LUA_MATH_LIBRARY) +MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARY) diff --git a/cmake/Modules/FindOpenGLES2.cmake b/cmake/Modules/FindOpenGLES2.cmake deleted file mode 100644 index a47126705..000000000 --- a/cmake/Modules/FindOpenGLES2.cmake +++ /dev/null @@ -1,74 +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 - ) - - include(FindPackageHandleStandardArgs) - 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/FindZstd.cmake b/cmake/Modules/FindZstd.cmake new file mode 100644 index 000000000..e28e1334b --- /dev/null +++ b/cmake/Modules/FindZstd.cmake @@ -0,0 +1,25 @@ +mark_as_advanced(ZSTD_LIBRARY ZSTD_INCLUDE_DIR) + +find_path(ZSTD_INCLUDE_DIR NAMES zstd.h) + +find_library(ZSTD_LIBRARY NAMES zstd) + +if(ZSTD_INCLUDE_DIR AND ZSTD_LIBRARY) + # Check that the API we use exists + include(CheckSymbolExists) + unset(HAVE_ZSTD_INITCSTREAM CACHE) + set(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR}) + set(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY}) + check_symbol_exists(ZSTD_initCStream zstd.h HAVE_ZSTD_INITCSTREAM) + unset(CMAKE_REQUIRED_INCLUDES) + unset(CMAKE_REQUIRED_LIBRARIES) + + if(NOT HAVE_ZSTD_INITCSTREAM) + unset(ZSTD_INCLUDE_DIR CACHE) + unset(ZSTD_LIBRARY CACHE) + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Zstd DEFAULT_MSG ZSTD_LIBRARY ZSTD_INCLUDE_DIR) + diff --git a/cmake/Modules/MinetestFindIrrlichtHeaders.cmake b/cmake/Modules/MinetestFindIrrlichtHeaders.cmake new file mode 100644 index 000000000..e434b582f --- /dev/null +++ b/cmake/Modules/MinetestFindIrrlichtHeaders.cmake @@ -0,0 +1,18 @@ +# Locate IrrlichtMt headers on system. + +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 + NOT EXISTS "${IRRLICHT_INCLUDE_DIR}/irrlicht.h")) + message(WARNING "IRRLICHT_INCLUDE_DIR was set to ${IRRLICHT_INCLUDE_DIR} " + "but irrlicht.h does not exist inside. The path will not be used.") + unset(IRRLICHT_INCLUDE_DIR CACHE) +endif() diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index d7816f0e4..ae36fd6bf 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -16,7 +16,6 @@ PREDEFINED = "USE_SPATIAL=1" \ "USE_REDIS=1" \ "USE_SOUND=1" \ "USE_CURL=1" \ - "USE_FREETYPE=1" \ "USE_GETTEXT=1" # Input diff --git a/doc/README.android b/doc/README.android index f6b67978f..3833688b1 100644 --- a/doc/README.android +++ b/doc/README.android @@ -74,7 +74,7 @@ automatically. Or you can create a `local.properties` file and specify are different tutorials on the web explaining how to do it - choose one yourself. -* Once your keystore is setup, enter build/android subdirectory and create a new +* Once your keystore is setup, enter the android subdirectory and create a new file "ant.properties" there. Add following lines to that file: > key.store= diff --git a/doc/breakages.md b/doc/breakages.md new file mode 100644 index 000000000..f625a0f4d --- /dev/null +++ b/doc/breakages.md @@ -0,0 +1,10 @@ +# 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) +* rotate moon texture by 180°, making it coherent with the sun (see https://github.com/minetest/minetest/pull/11902) +* remove undocumented `set_physics_override(num, num, num)` diff --git a/doc/builtin_entities.txt b/doc/builtin_entities.txt new file mode 100644 index 000000000..be3f73357 --- /dev/null +++ b/doc/builtin_entities.txt @@ -0,0 +1,101 @@ +# Builtin Entities +Minetest registers two entities by default: Falling nodes and dropped items. +This document describes how they behave and what you can do with them. + +## Falling node (`__builtin:falling_node`) + +This entity is created by `minetest.check_for_falling` in place of a node +with the special group `falling_node=1`. Falling nodes can also be created +artificially with `minetest.spawn_falling_node`. + +Needs manual initialization when spawned using `/spawnentity`. + +Default behaviour: + +* Falls down in a straight line (gravity = `movement_gravity` setting) +* Collides with `walkable` node +* Collides with all physical objects except players +* If the node group `float=1` is set, it also collides with liquid nodes +* When it hits a solid (=`walkable`) node, it will try to place itself as a + node, replacing the node above. + * If the falling node cannot replace the destination node, it is dropped. + * If the destination node is a leveled node (`paramtype2="leveled"`) of the + same node name, the levels of both are summed. + +### Entity fields + +* `set_node(self, node[, meta])` + * Function to initialize the falling node + * `node` and `meta` are explained below. + * The `meta` argument is optional. +* `node`: Node table of the node (`name`, `param1`, `param2`) that this + entity represents. Read-only. +* `meta`: Node metadata of the falling node. Will be used when the falling + nodes tries to place itself as a node. Read-only. + +### Rendering / supported nodes + +Falling nodes have visuals to look as close as possible to the original node. +This works for most drawtypes, but there are limitations. + +Supported drawtypes: + +* `normal` +* `signlike` +* `torchlike` +* `nodebox` +* `raillike` +* `glasslike` +* `glasslike_framed` +* `glasslike_framed_optional` +* `allfaces` +* `allfaces_optional` +* `firelike` +* `mesh` +* `fencelike` +* `liquid` +* `airlike` (not pointable) + +Other drawtypes still kinda work, but they might look weird. + +Supported `paramtype2` values: + +* `wallmounted` +* `facedir` +* `colorwallmounted` +* `colorfacedir` +* `color` + +## Dropped item stack (`__builtin:item`) + +This is an item stack in a collectable form. + +Common cases that spawn a dropped item: + +* Item dropped by player +* The root node of a node with the group `attached_node=1` is removed +* `minetest.add_item` is called + +Needs manual initialization when spawned using `/spawnentity`. + +### Behavior + +* Players can collect it by punching +* Lifespan is defined by the setting `item_entity_ttl` +* Slides on `slippery` nodes +* Subject to gravity (uses `movement_gravity` setting) +* Collides with `walkable` nodes +* Does not collide physical objects +* When it's inside a solid (`walkable=true`) node, it tries to escape to a + neighboring non-solid (`walkable=false`) node + +### Entity fields + +* `set_item(self, item)`: + * Function to initialize the dropped item + * `item` (type `ItemStack`) specifies the item to represent +* `age`: Age in seconds. Behaviour according to the setting `item_entity_ttl` +* `itemstring`: Itemstring of the item that this item entity represents. + Read-only. + +Other fields are for internal use only. diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt index 4c5231b79..c789e8ca3 100644 --- a/doc/client_lua_api.txt +++ b/doc/client_lua_api.txt @@ -1,4 +1,4 @@ -Minetest Lua Client Modding API Reference 5.4.0 +Minetest Lua Client Modding API Reference 5.7.0 ================================================ * More information at * Developer Wiki: @@ -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: @@ -620,7 +621,7 @@ Helper functions * `minetest.is_yes(arg)` * returns whether `arg` can be interpreted as yes * `minetest.is_nan(arg)` - * returns true true when the passed number represents NaN. + * returns true when the passed number represents NaN. * `table.copy(table)`: returns a table * returns a deep copy of `table` @@ -651,6 +652,9 @@ Minetest namespace reference * `minetest.sha1(data, [raw])`: returns the sha1 hash of data * `data`: string of data to hash * `raw`: return raw bytes instead of hex digits, default: false +* `minetest.colorspec_to_colorstring(colorspec)`: Converts a ColorSpec to a + ColorString. If the ColorSpec is invalid, returns `nil`. + * `colorspec`: The ColorSpec to convert * `minetest.get_csm_restrictions()`: returns a table of `Flags` indicating the restrictions applied to the current mod. * If a flag in this table is set to true, the feature is RESTRICTED. @@ -686,6 +690,11 @@ Call these functions only at load time! * Adds definition to minetest.registered_chatcommands * `minetest.unregister_chatcommand(name)` * Unregisters a chatcommands registered with register_chatcommand. +* `minetest.register_on_chatcommand(function(command, params))` + * Called always when a chatcommand is triggered, before `minetest.registered_chatcommands` + is checked to see if that the command exists, but after the input is parsed. + * Return `true` to mark the command as handled, which means that the default + handlers will be prevented. * `minetest.register_on_death(function())` * Called when the local player dies * `minetest.register_on_hp_modification(function(hp))` @@ -902,7 +911,9 @@ Call these functions only at load time! * Example: `minetest.rgba(10, 20, 30, 40)`, returns `"#0A141E28"` * `minetest.encode_base64(string)`: returns string encoded in base64 * Encodes a string in base64. -* `minetest.decode_base64(string)`: returns string +* `minetest.decode_base64(string)`: returns string or nil on failure + * Padding characters are only supported starting at version 5.4.0, where + 5.5.0 and newer perform proper checks. * Decodes a string encoded in base64. * `minetest.gettext(string)` : returns string * look up the translation of a string in the gettext message catalog @@ -927,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 --------------- @@ -996,6 +1015,7 @@ Please do not try to access the reference until the camera is initialized, other ### LocalPlayer An interface to retrieve information about the player. +This object will only be available after the client is initialized. Earlier accesses will yield a `nil` value. Methods: @@ -1019,8 +1039,8 @@ Methods: * returns true if player is in a liquid (This oscillates so that the player jumps a bit above the surface) * `is_in_liquid_stable()` * returns true if player is in a stable liquid (This is more stable and defines the maximum speed of the player) -* `get_liquid_viscosity()` - * returns liquid viscosity (Gets the viscosity of liquid to calculate friction) +* `get_move_resistance()` + * returns move resistance of current node, the higher the slower the player moves * `is_climbing()` * returns true if player is climbing * `swimming_vertical()` @@ -1222,7 +1242,7 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or liquid_type = , -- A string containing "none", "flowing", or "source" *May not exist* liquid_alternative_flowing = , -- Alternative node for liquid *May not exist* liquid_alternative_source = , -- Alternative node for liquid *May not exist* - liquid_viscosity = , -- How fast the liquid flows *May not exist* + liquid_viscosity = , -- How slow the liquid flows *May not exist* liquid_renewable = , -- Whether the liquid makes an infinite source *May not exist* liquid_range = , -- How far the liquid flows *May not exist* drowning = bool, -- Whether the player will drown in the node @@ -1237,6 +1257,7 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or }, legacy_facedir_simple = bool, -- Whether to use old facedir legacy_wallmounted = bool -- Whether to use old wallmounted + move_resistance = , -- How slow players can move through the node *May not exist* } ``` @@ -1303,6 +1324,8 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or -- ^ See "HUD Element Types" size = { x=100, y=100 }, -- default {x=0, y=0} -- ^ Size of element in pixels + style = 0, + -- ^ For "text" elements sets font style: bitfield with 1 = bold, 2 = italic, 4 = monospace } ``` @@ -1342,9 +1365,8 @@ The following functions provide escape sequences: Named colors are also supported and are equivalent to [CSS Color Module Level 4](http://dev.w3.org/csswg/css-color/#named-colors). -To specify the value of the alpha channel, append `#AA` to the end of the color name -(e.g. `colorname#08`). For named colors the hexadecimal string representing the alpha -value must (always) be two hexadecimal digits. +To specify the value of the alpha channel, append `#A` or `#AA` to the end of +the color name (e.g. `colorname#08`). `Color` ------------- diff --git a/doc/direction.md b/doc/direction.md new file mode 100644 index 000000000..826dd47b3 --- /dev/null +++ b/doc/direction.md @@ -0,0 +1,69 @@ +# Minetest Direction Document + +## 1. Long-term Roadmap + +The long-term roadmaps, aims, and guiding philosophies are set out using the +following documents: + +* [What is Minetest?](http://c55.me/blog/?p=1491) +* [celeron55's roadmap](https://forum.minetest.net/viewtopic.php?t=9177) +* [celeron55's comment in "A clear mission statement for Minetest is missing"](https://github.com/minetest/minetest/issues/3476#issuecomment-167399287) +* [Core developer to-do/wish lists](https://forum.minetest.net/viewforum.php?f=7) + +## 2. Medium-term Roadmap + +These are the current medium-term goals for Minetest development, in no +particular order. + +These goals were created from the top points in a +[roadmap brainstorm](https://github.com/minetest/minetest/issues/10461). +This should be reviewed approximately yearly, or when goals are achieved. + +Pull requests that address one of these goals will be labelled as "Roadmap". +PRs that are not on the roadmap will be closed unless they receive a concept +approval within a week, issues can be used for preapproval. +Bug fixes are exempt for this, and are always accepted and prioritised. +See [CONTRIBUTING.md](../.github/CONTRIBUTING.md) for more info. + +### 2.1 Rendering/Graphics improvements + +The priority is fixing the issues, performance, and general correctness. +Once that is done, fancier features can be worked on, such as water shaders, +shadows, and improved lighting. + +Examples include +[transparency sorting](https://github.com/minetest/minetest/issues/95), +[particle performance](https://github.com/minetest/minetest/issues/1414), +[general view distance](https://github.com/minetest/minetest/issues/7222). + +This includes work on maintaining +[our Irrlicht fork](https://github.com/minetest/irrlicht), and switching to +alternative libraries to replace Irrlicht functionality as needed + +### 2.2 Internal code refactoring + +To ensure sustainable development, Minetest's code needs to be +[refactored and improved](https://github.com/minetest/minetest/pulls?q=is%3Aopen+sort%3Aupdated-desc+label%3A%22Code+quality%22+). +This will remove code rot and allow for more efficient development. + +### 2.3 UI Improvements + +A [formspec replacement](https://github.com/minetest/minetest/issues/6527) is +needed to make GUIs better and easier to create. This replacement could also +be a replacement for HUDs, allowing for a unified API. + +A [new mainmenu](https://github.com/minetest/minetest/issues/6733) is needed to +improve user experience. First impressions matter, and the current main menu +doesn't do a very good job at selling Minetest or explaining what it is. +A new main menu should promote games to users, allowing Minetest Game to no +longer be bundled by default. + +The UI code is undergoing rapid changes, so it is especially important to make +an issue for any large changes before spending lots of time. + +### 2.4 Object and entity improvements + +There are still a significant number of issues with objects. +Collisions, +[performance](https://github.com/minetest/minetest/issues/6453), +API convenience, and discrepancies between players and entities. 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 bd845aad3..9403de670 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`: `` - * `$path_share`: `` -* `RUN_IN_PLACE=0`: (Linux release) - * `$path_share`: - * Linux: `/usr/share/minetest` - * Windows: `/minetest-0.4.x` - * `$path_user`: - * Linux: `$HOME/.minetest` - * Windows: `C:/users//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 `` 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 = ` e.g. `allowed_mapgens = v5,v6,flat` @@ -77,8 +75,16 @@ The game directory can contain the following files: `disallowed_mapgens`. * `disallowed_mapgen_settings= ` e.g. `disallowed_mapgen_settings = mgv5_spflags` - These settings are hidden for this game in the world creation - dialog and game start menu. + These mapgen settings are hidden for this game in the world creation + dialog and game start menu. Add `seed` to hide the seed input field. + * `disabled_settings = ` + e.g. `disabled_settings = enable_damage, creative_mode` + These settings are hidden for this game in the "Start game" tab + and will be initialized as `false` when the game is started. + Prepend a setting name with an exclamation mark to initialize it to `true` + (this does not work for `enable_server`). + Only these settings are supported: + `enable_damage`, `creative_mode`, `enable_server`. * `author`: The author of the game. It only appears when downloaded from ContentDB. * `release`: Ignore this: Should only ever be set by ContentDB, as it is @@ -105,8 +111,16 @@ If you want to specify multiple images for one identifier, add additional images named like `$identifier.$n.png`, with an ascending number $n starting with 1, and a random image will be chosen from the provided ones. +Menu music +----------- +Games can provide custom main menu music. They are put inside a `menu` +directory inside the game directory. +The music files are named `theme.ogg`. +If you want to specify multiple music files for one game, add additional +images named like `theme.$n.ogg`, with an ascending number $n starting +with 1 (max 10), and a random music file will be chosen from the provided ones. Mods ==== @@ -197,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 @@ -247,7 +259,7 @@ Media files (textures, sounds, whatever) that will be transferred to the client and will be available for use by the mod and translation files for the clients (see [Translations]). -It is suggested to use the folders for the purpous they are thought for, +It is suggested to use the folders for the purpose they are thought for, eg. put textures into `textures`, translation files into `locale`, models for entities or meshnodes into `models` et cetera. @@ -256,6 +268,9 @@ Subfolders with names starting with `_` or `.` are ignored. If a subfolder contains a media file with the same name as a media file in one of its parents, the parent's file is used. +Although it is discouraged, a mod can overwrite a media file of any mod that it +depends on by supplying a file with an equal name. + Naming conventions ------------------ @@ -284,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. @@ -326,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 @@ -336,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. +Deprecated, define dungeon nodes in biome definitions instead. -### Aliases needed for Mapgen V6 +### Aliases 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 +#### Essential -* mapgen_tree -* mapgen_leaves -* mapgen_apple -* mapgen_jungletree -* mapgen_jungleleaves -* mapgen_junglegrass -* mapgen_pine_tree -* mapgen_pine_needles +* `mapgen_stone` +* `mapgen_water_source` +* `mapgen_lava_source` +* `mapgen_dirt` +* `mapgen_dirt_with_grass` +* `mapgen_sand` -* mapgen_cobble -* mapgen_stair_cobble -* mapgen_mossycobble -* mapgen_stair_desert_stone +* `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") @@ -400,41 +421,17 @@ stripping out the file extension: * e.g. `foomod_foothing.png` * e.g. `foomod_foothing` - -Normalmap Textures ------------------- - -If shaders and bumpmapping or parallax occlusion is enabled, Minetest tries -to load normalmaps. -Those image files have to end with `_normal.png` and start with the same name -as their corresponding texture. -For example a normalmap for `foomod_foothing.png` has to be called -`foomod_foothing_normal.png`. - -The sRGB R, G and B colour values of a normalmap pixel are each directly -mapped from `{0, ..., 255}` to `[-1, 1]` and, taken together, -define the normal vector. -The alpha channel defines the heightmap for parallax occlusion. -To be safe, the alpha values should always be bigger than zero -because the colour values, which define the normal vector, -may be undefined for image formats where colour is discarded in fully -transparent pixels. - -Bumpmapping and parallax occlusion are currently experimental features: - -* Bumpmapping in Minetest happens in an obscure way; there are no light sources - defined in the shaders except the sunlight direction. -* Parallax occlusion with relief-mapping mode does not yet work correctly - together with Minetest's Fastfaces. -* The normalmap files must end with `.png`, so other image files are not - supported. - +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 ----------------- There are various texture modifiers that can be used -to generate textures on-the-fly. +to let the client generate textures on-the-fly. +The modifiers are applied directly in sRGB colorspace, +i.e. without gamma-correction. ### Texture overlaying @@ -644,6 +641,23 @@ Result is more like what you'd expect if you put a color on top of another color, meaning white surfaces get a lot of your new color while black parts don't change very much. +#### `[png:` + +Embed a base64 encoded PNG image in the texture string. +You can produce a valid string for this by calling +`minetest.encode_base64(minetest.encode_png(tex))`, +refer to the documentation of these functions for details. +You can use this to send disposable images such as captchas +to individual clients, or render things that would be too +expensive to compose with `[combine:`. + +IMPORTANT: Avoid sending large images this way. +This is not a replacement for asset files, do not use it to do anything +that you could instead achieve by just using a file. +In particular consider `minetest.dynamic_add_media` and test whether +using other texture modifiers could result in a shorter string than +embedding a whole image, this may vary by use case. + Hardware coloring ----------------- @@ -832,7 +846,7 @@ Example (colored grass block): -- Overlay tiles: define them in the same style -- The top and bottom tile does not have overlay overlay_tiles = {"", "", - {name = "default_grass_side.png", tileable_vertical = false}}, + {name = "default_grass_side.png"}}, -- Global color, used in inventory color = "green", -- Palette in the world @@ -972,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 @@ -1017,7 +1026,7 @@ The function of `param1` is determined by `paramtype` in node definition. `param1` is reserved for the engine when `paramtype != "none"`. * `paramtype = "light"` - * The value stores light with and without sun in its upper and lower 4 bits + * The value stores light with and without sun in its lower and upper 4 bits respectively. * Required by a light source node to enable spreading its light. * Required by the following drawtypes as they determine their visual @@ -1041,10 +1050,13 @@ The function of `param2` is determined by `paramtype2` in node definition. * `paramtype2 = "flowingliquid"` * Used by `drawtype = "flowingliquid"` and `liquidtype = "flowing"` * The liquid level and a flag of the liquid are stored in `param2` - * Bits 0-2: Liquid level (0-7). The higher, the more liquid is in this node + * Bits 0-2: Liquid level (0-7). The higher, the more liquid is in this node; + see `minetest.get_node_level`, `minetest.set_node_level` and `minetest.add_node_level` + to access/manipulate the content of this field * Bit 3: If set, liquid is flowing downwards (no graphical effect) * `paramtype2 = "wallmounted"` - * Supported drawtypes: "torchlike", "signlike", "normal", "nodebox", "mesh" + * Supported drawtypes: "torchlike", "signlike", "plantlike", + "plantlike_rooted", "normal", "nodebox", "mesh" * The rotation of the node is stored in `param2` * You can make this value by using `minetest.dir_to_wallmounted()` * Values range 0 - 5 @@ -1070,9 +1082,9 @@ The function of `param2` is determined by `paramtype2` in node definition. * The height of the 'plantlike' section is stored in `param2`. * The height is (`param2` / 16) nodes. * `paramtype2 = "degrotate"` - * Only valid for "plantlike" drawtype. The rotation of the node is stored in - `param2`. - * Values range 0 - 179. The value stored in `param2` is multiplied by two to + * Valid for `plantlike` and `mesh` drawtypes. The rotation of the node is + stored in `param2`. + * Values range 0–239. The value stored in `param2` is multiplied by 1.5 to get the actual rotation in degrees of the node. * `paramtype2 = "meshoptions"` * Only valid for "plantlike" drawtype. `param2` encodes the shape and @@ -1106,10 +1118,20 @@ The function of `param2` is determined by `paramtype2` in node definition. palette. The palette should have 32 pixels. * `paramtype2 = "glasslikeliquidlevel"` * Only valid for "glasslike_framed" or "glasslike_framed_optional" - drawtypes. - * `param2` values 0-63 define 64 levels of internal liquid, 0 being empty - and 63 being full. + drawtypes. "glasslike_framed_optional" nodes are only affected if the + "Connected Glass" setting is enabled. + * Bits 0-5 define 64 levels of internal liquid, 0 being empty and 63 being + full. + * Bits 6 and 7 modify the appearance of the frame and node faces. One or + both of these values may be added to `param2`: + * 64 - Makes the node not connect with neighbors above or below it. + * 128 - Makes the node not connect with neighbors to its sides. * Liquid texture is defined using `special_tiles = {"modname_tilename.png"}` +* `paramtype2 = "colordegrotate"` + * Same as `degrotate`, but with colors. + * The first (most-significant) three bits of `param2` tells which color + is picked from the palette. The palette should have 8 pixels. + * Remaining 5 bits store rotation in range 0–23 (i.e. in 15° steps) * `paramtype2 = "none"` * `param2` will not be used by the engine and can be used to store an arbitrary value @@ -1129,8 +1151,20 @@ Look for examples in `games/devtest` or `games/minetest_game`. * Invisible, uses no texture. * `liquid` * The cubic source node for a liquid. + * Faces bordering to the same node are never rendered. + * Connects to node specified in `liquid_alternative_flowing`. + * Use `backface_culling = false` for the tiles you want to make + visible when inside the node. * `flowingliquid` * The flowing version of a liquid, appears with various heights and slopes. + * Faces bordering to the same node are never rendered. + * Connects to node specified in `liquid_alternative_source`. + * Node textures are defined with `special_tiles` where the first tile + is for the top and bottom faces and the second tile is for the side + faces. + * `tiles` is used for the item/inventory/wield image rendering. + * Use `backface_culling = false` for the special tiles you want to make + visible when inside the node * `glasslike` * Often used for partially-transparent nodes. * Only external sides of textures are visible. @@ -1157,14 +1191,20 @@ 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 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`. - * If placed on the side of a node, uses the third texture specified in - `tiles` and is perpendicular to that node. + * 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`. + * If placed on the side of a node, uses the third texture specified in + `tiles` and is perpendicular to that node. + * If `paramtype2="none"`: + * Will be rendered as if placed on top of a node (see + above) and only the first texture is used. * `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="none"`, it will always be on the floor. * `plantlike` * Two vertical and diagonal textures at right-angles to each other. * See `paramtype2 = "meshoptions"` above for other options. @@ -1197,12 +1237,17 @@ Look for examples in `games/devtest` or `games/minetest_game`. * `plantlike_rooted` * Enables underwater `plantlike` without air bubbles around the nodes. * Consists of a base cube at the co-ordinates of the node plus a - `plantlike` extension above with a height of `param2 / 16` nodes. + `plantlike` extension above + * If `paramtype2="leveled", the `plantlike` extension has a height + of `param2 / 16` nodes, otherwise it's the height of 1 node + * If `paramtype2="wallmounted"`, the `plantlike` extension + will be at one of the corresponding 6 sides of the base cube. + Also, the base cube rotates like a `normal` cube would * The `plantlike` extension visually passes through any nodes above the base cube without affecting them. * The base cube texture tiles are defined as normal, the `plantlike` extension uses the defined special tile, for example: - `special_tiles = {{name = "default_papyrus.png", tileable_vertical = true}},` + `special_tiles = {{name = "default_papyrus.png"}},` `*_optional` drawtypes need less rendering time if deactivated (always client-side). @@ -1272,6 +1317,9 @@ A box of a regular node would look like: {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, +To avoid collision issues, keep each value within the range of +/- 1.45. +This also applies to leveled nodeboxes, where the final height shall not +exceed this soft limit. @@ -1340,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. @@ -1377,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. @@ -1410,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` @@ -1432,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` @@ -1476,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 @@ -1484,15 +1532,24 @@ Displays an image oriented or translated according to current heading direction. If translation is chosen, texture is repeated horizontally to fill the whole element. +### `minimap` + +Displays a minimap on the HUD. + +* `size`: Size of the minimap to display. Minimap should be a square to avoid + distortion. +* `alignment`: The alignment of the minimap. +* `offset`: offset in pixels from position. + Representations of simple things ================================ -Position/vector ---------------- +Vector (ie. a position) +----------------------- - {x=num, y=num, z=num} + vector.new(x, y, z) -For helper functions see [Spatial Vectors]. +See [Spatial Vectors] for details. `pointed_thing` --------------- @@ -1513,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. @@ -1559,15 +1615,37 @@ since, by default, no schematic attributes are set. Items ===== +Items are things that can be held by players, dropped in the map and +stored in inventories. +Items come in the form of item stacks, which are collections of equal +items that occupy a single inventory slot. + Item types ---------- There are three kinds of items: nodes, tools and craftitems. -* Node: Can be placed in the world's voxel grid -* Tool: Has a wear property but cannot be stacked. The default use action is to - dig nodes or hit objects according to its tool capabilities. -* Craftitem: Cannot dig nodes or be placed +* Node: Placeable item form of a node in the world's voxel grid +* Tool: Has a changable wear property but cannot be stacked +* Craftitem: Has no special properties + +Every registered node (the voxel in the world) has a corresponding +item form (the thing in your inventory) that comes along with it. +This item form can be placed which will create a node in the +world (by default). +Both the 'actual' node and its item form share the same identifier. +For all practical purposes, you can treat the node and its item form +interchangeably. We usually just say 'node' to the item form of +the node as well. + +Note the definition of tools is purely technical. The only really +unique thing about tools is their wear, and that's basically it. +Beyond that, you can't make any gameplay-relevant assumptions +about tools or non-tools. It is perfectly valid to register something +that acts as tool in a gameplay sense as a craftitem, and vice-versa. + +Craftitems can be used for items that neither need to be a node +nor a tool. Amount and wear --------------- @@ -1578,7 +1656,9 @@ default. Tool item stacks can not have an amount greater than 1. Tools use a wear (damage) value ranging from 0 to 65535. The value 0 is the default and is used for unworn tools. The values 1 to 65535 are used for worn tools, where a higher value stands for -a higher wear. Non-tools always have a wear value of 0. +a higher wear. Non-tools technically also have a wear property, +but it is always 0. There is also a special 'toolrepair' crafting +recipe that is only available to tools. Item formats ------------ @@ -1592,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 + +Syntax: + + [[ [ ]]] 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 @@ -1632,8 +1738,8 @@ Groups ====== In a number of places, there is a group table. Groups define the -properties of a thing (item, node, armor of entity, capabilities of -tool) in such a way that the engine and other mods can can interact with +properties of a thing (item, node, armor of entity, tool capabilities) +in such a way that the engine and other mods can can interact with the thing without actually knowing what the thing is. Usage @@ -1674,17 +1780,17 @@ Groups of entities ------------------ For entities, groups are, as of now, used only for calculating damage. -The rating is the percentage of damage caused by tools with this damage group. +The rating is the percentage of damage caused by items with this damage group. See [Entity damage mechanism]. object.get_armor_groups() --> a group-rating table (e.g. {fleshy=100}) object.set_armor_groups({fleshy=30, cracky=80}) -Groups of tools ---------------- +Groups of tool capabilities +--------------------------- -Groups in tools define which groups of nodes and entities they are -effective towards. +Groups in tool capabilities define which groups of nodes and entities they +are effective towards. Groups in crafting recipes -------------------------- @@ -1692,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 @@ -1716,7 +1821,7 @@ The asterisk `(*)` after a group name describes that there is no engine functionality bound to it, and implementation is left up as a suggestion to games. -### Node, item and tool groups +### Node and item groups * `not_in_creative_inventory`: (*) Special group for inventory mods to indicate that the item should be hidden in item lists. @@ -1735,16 +1840,24 @@ to games. * `3`: the node always gets the digging time 0 seconds (torch) * `disable_jump`: Player (and possibly other things) cannot jump from node or if their feet are in the node. Note: not supported for `new_move = false` -* `fall_damage_add_percent`: damage speed = `speed * (1 + value/100)` +* `fall_damage_add_percent`: modifies the fall damage suffered when hitting + the top of this node. There's also an armor group with the same name. + The final player damage is determined by the following formula: + damage = + collision speed + * ((node_fall_damage_add_percent + 100) / 100) -- node group + * ((player_fall_damage_add_percent + 100) / 100) -- player armor group + - (14) -- constant tolerance + Negative damage values are discarded as no damage. * `falling_node`: if there is no walkable block under the node it will fall -* `float`: the node will not fall through liquids +* `float`: the node will not fall through liquids (`liquidtype ~= "none"`) * `level`: Can be used to give an additional sense of progression in the game. * A larger level will cause e.g. a weapon of a lower level make much less damage, and get worn out much faster, or not be able to get drops from destroyed nodes. * `0` is something that is directly accessible at the start of gameplay * There is no upper limit - * See also: `leveldiff` in [Tools] + * See also: `leveldiff` in [Tool Capabilities] * `slippery`: Players and items will slide on the node. Slipperiness rises steadily with `slippery` value, starting at 1. @@ -1755,11 +1868,15 @@ to games. `"toolrepair"` crafting recipe -### `ObjectRef` groups +### `ObjectRef` armor groups * `immortal`: Skips all damage and breath handling for an object. This group - will also hide the integrated HUD status bars for players, and is - automatically set to all players when damage is disabled on the server. + will also hide the integrated HUD status bars for players. It is + automatically set to all players when damage is disabled on the server and + cannot be reset (subject to change). +* `fall_damage_add_percent`: Modifies the fall damage suffered by players + when they hit the ground. It is analog to the node group with the same + name. See the node group above for the exact calculation. * `punch_operable`: For entities; disables the regular damage mechanism for players punching it by hand or a non-tool item, so that it can do something else than take damage. @@ -1771,8 +1888,8 @@ Known damage and digging time defining groups * `crumbly`: dirt, sand * `cracky`: tough but crackable stuff like stone. -* `snappy`: something that can be cut using fine tools; e.g. leaves, small - plants, wire, sheets of metal +* `snappy`: something that can be cut using things like scissors, shears, + bolt cutters and the like, e.g. leaves, small plants, wire, sheets of metal * `choppy`: something that can be cut using force; e.g. trees, wooden planks * `fleshy`: Living things like animals and the player. This could imply some blood effects when hitting. @@ -1781,7 +1898,7 @@ Known damage and digging time defining groups Can be added to nodes that shouldn't logically be breakable by the hand but are. Somewhat similar to `dig_immediate`, but times are more like `{[1]=3.50,[2]=2.00,[3]=0.70}` and this does not override the - speed of a tool if the tool can dig at a faster speed than this + digging speed of an item if it can dig at a faster speed than this suggests for the hand. Examples of custom groups @@ -1807,54 +1924,67 @@ Groups such as `crumbly`, `cracky` and `snappy` are used for this purpose. Rating is `1`, `2` or `3`. A higher rating for such a group implies faster digging time. -The `level` group is used to limit the toughness of nodes a tool can dig -and to scale the digging times / damage to a greater extent. +The `level` group is used to limit the toughness of nodes an item capable +of digging can dig and to scale the digging times / damage to a greater extent. **Please do understand this**, otherwise you cannot use the system to it's full potential. -Tools define their properties by a list of parameters for groups. They +Items define their properties by a list of parameters for groups. They cannot dig other groups; thus it is important to use a standard bunch of -groups to enable interaction with tools. +groups to enable interaction with items. -Tools -===== +Tool Capabilities +================= -Tools definition ----------------- +'Tool capabilities' is a property of items that defines two things: -Tools define: +1) Which nodes it can dig and how fast +2) Which objects it can hurt by punching and by how much + +Tool capabilities are available for all items, not just tools. +But only tools can receive wear from digging and punching. + +Missing or incomplete tool capabilities will default to the +player's hand. + +Tool capabilities definition +---------------------------- + +Tool capabilities define: * Full punch interval * Maximum drop level -* For an arbitrary list of groups: +* For an arbitrary list of node groups: * Uses (until the tool breaks) - * Maximum level (usually `0`, `1`, `2` or `3`) - * Digging times - * Damage groups + * Maximum level (usually `0`, `1`, `2` or `3`) + * Digging times +* Damage groups +* Punch attack uses (until the tool breaks) -### Full punch interval +### Full punch interval `full_punch_interval` -When used as a weapon, the tool will do full damage if this time is spent -between punches. If e.g. half the time is spent, the tool will do half +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 tool, that will drop -it's useful item. (e.g. iron ore to drop a lump of iron). +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 +### 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. For lower leveled nodes, the use count -is multiplied by `3^leveldiff`. +of this group, of the maximum level. The maximum supported number of +uses is 65535. The special number 0 is used for infinite uses. +For lower leveled nodes, the use count is multiplied by `3^leveldiff`. `leveldiff` is the difference of the tool's `maxlevel` `groupcaps` and the node's `level` group. The node cannot be dug if `leveldiff` is less than zero. @@ -1862,18 +1992,20 @@ node's `level` group. The node cannot be dug if `leveldiff` is less than zero. * `uses=10, leveldiff=1`: actual uses: 30 * `uses=10, leveldiff=2`: actual uses: 90 -### Maximum level +For non-tools, this has no effect. -Tells what is the maximum level of a node of this group that the tool will +### 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 -result in the tool to be able to dig nodes that have a rating of `2` or `3` +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. @@ -1885,19 +2017,27 @@ i.e. players can more quickly click the nodes away instead of holding LMB. List of damage for groups of entities. See [Entity damage mechanism]. -Example definition of the capabilities of a tool ------------------------------------------------- +### Punch attack uses (tools only) + +Determines how many uses (before breaking) the tool has when dealing damage +to an object, when the full punch interval (see above) was always +waited out fully. + +Wear received by the tool is proportional to the time spent, scaled by +the full punch interval. + +For non-tools, this has no effect. + +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 tool be able to dig nodes that fulfil both of these: +This makes the item capable of digging nodes that fulfil both of these: * Have the `crumbly` group * Have a `level` group less or equal to `2` @@ -2001,8 +2141,12 @@ Node metadata contains two things: Some of the values in the key-value store are handled specially: -* `formspec`: Defines a right-click inventory menu. See [Formspec]. -* `infotext`: Text shown on the screen when the node is pointed at +* `formspec`: Defines an inventory menu that is opened with the + 'place/use' key. Only works if no `on_rightclick` was + defined for the node. See also [Formspec]. +* `infotext`: Text shown on the screen when the node is pointed at. + Line-breaks will be applied automatically. + If the infotext is very long, it will be truncated. Example: @@ -2041,11 +2185,20 @@ Item metadata only contains a key-value store. Some of the values in the key-value store are handled specially: -* `description`: Set the item stack's description. Defaults to - `idef.description`. +* `description`: Set the item stack's description. + See also: `get_description` in [`ItemStack`] +* `short_description`: Set the item stack's short description. + See also: `get_short_description` in [`ItemStack`] * `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: @@ -2053,6 +2206,21 @@ Example: meta:set_string("key", "value") print(dump(meta:to_table())) +Example manipulations of "description" and expected output behaviors: + + print(ItemStack("default:pick_steel"):get_description()) --> Steel Pickaxe + print(ItemStack("foobar"):get_description()) --> Unknown Item + + local stack = ItemStack("default:stone") + stack:get_meta():set_string("description", "Custom description\nAnother line") + print(stack:get_description()) --> Custom description\nAnother line + print(stack:get_short_description()) --> Custom description + + stack:get_meta():set_string("short_description", "Short") + print(stack:get_description()) --> Custom description\nAnother line + print(stack:get_short_description()) --> Short + + print(ItemStack("mod:item_with_no_desc"):get_description()) --> mod:item_with_no_desc @@ -2087,7 +2255,7 @@ player named ``. 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. @@ -2125,6 +2293,26 @@ Examples list[current_player;craft;3,0;3,3;] list[current_player;craftpreview;7,1;1,1;] +Version History +--------------- + +* Formspec version 1 (pre-5.1.0): + * (too much) +* Formspec version 2 (5.1.0): + * Forced real coordinates + * background9[]: 9-slice scaling parameters +* Formspec version 3 (5.2.0): + * Formspec elements are drawn in the order of definition + * bgcolor[]: use 3 parameters (bgcolor, formspec (now an enum), fbgcolor) + * box[] and image[] elements enable clipping by default + * new element: scroll_container[] +* Formspec version 4 (5.4.0): + * 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 -------- @@ -2136,6 +2324,7 @@ Elements * Clients older than this version can neither show newer elements nor display elements with new arguments correctly. * Available since feature `formspec_version_element`. +* See also: [Version History] ### `size[,,]` @@ -2166,9 +2355,20 @@ Elements * `position` and `anchor` elements need suitable values to avoid a formspec extending off the game window due to particular game window sizes. -### `no_prepend[]` +### `padding[,]` * Must be used after the `size`, `position`, and `anchor` elements (if present). +* Defines how much space is padded around the formspec if the formspec tries to + increase past the size of the screen and coordinates have to be shrunk. +* For X and Y, 0.0 represents no padding (the formspec can touch the edge of the + screen), and 0.5 represents half the screen (which forces the coordinate size + to 0). If negative, the formspec can extend off the edge of the screen. +* Defaults to [0.05, 0.05]. + +### `no_prepend[]` + +* Must be used after the `size`, `position`, `anchor`, and `padding` elements + (if present). * Disables player:set_formspec_prepend() from applying to this formspec. ### `real_coordinates[]` @@ -2215,23 +2415,26 @@ Elements * End of a scroll_container, following elements are no longer bound to this container. -### `list[;;,;,;]` - -* 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. - ### `list[;;,;,;]` -* 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. + slots is one-fourth the size of an inventory slot by default. Also see + [Styling Formspecs] for changing the size of slots and spacing. ### `listring[;]` -* 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 @@ -2273,20 +2476,41 @@ Elements * `bgcolor` tooltip background color as `ColorString` (optional) * `fontcolor` tooltip font color as `ColorString` (optional) -### `image[,;,;]` +### `image[,;,;;]` -* 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[,;,;;;;;]` +### `animated_image[,;,;;;;;;]` * 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[,;,;;;;;;;;]` + +* Show a mesh model. +* `name`: Element name that can be used for styling +* `mesh`: The mesh model to use. +* `textures`: The mesh textures to use according to the mesh materials. + Texture names must be separated by commas. +* `rotation {X,Y}` (Optional): Initial rotation of the camera. + The axes are euler angles in degrees. +* `continuous` (Optional): Whether the rotation is continuous. Default `false`. +* `mouse control` (Optional): Whether the model can be controlled with the mouse. Default `true`. +* `frame loop range` (Optional): Range of the animation frames. + * Defaults to the full range of all available frames. + * Syntax: `,` +* `animation speed` (Optional): Sets the animation speed. Default 0 FPS. ### `item_image[,;,;]` @@ -2328,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 @@ -2652,7 +2874,7 @@ Elements * `span=`: number of following columns to affect (default: infinite). -### `style[,;;;...]` +### `style[,,...;;;...]` * Set the style for the element(s) matching `selector` by name. * `selector` can be one of: @@ -2665,7 +2887,7 @@ Elements * See [Styling Formspecs]. -### `style_type[,;;;...]` +### `style_type[,,...;;;...]` * Set the style for the element(s) matching `selector` by type. * `selector` can be one of: @@ -2738,10 +2960,10 @@ Styling Formspecs Formspec elements can be themed using the style elements: - style[,;;;...] - style[:,:;;;...] - style_type[,;;;...] - style_type[:,:;;;...] + style[,,...;;;...] + style[:,:,...;;;...] + style_type[,,...;;;...] + style_type[:,:,...;;;...] Where a prop is: @@ -2788,6 +3010,8 @@ Some types may inherit styles from parent types. * image_button * item_image_button * label +* list +* model * pwdfield, inherits from field * scrollbar * tabheader @@ -2847,17 +3071,24 @@ Some types may inherit styles from parent types. * noclip - boolean, set to true to allow the element to exceed formspec bounds. * padding - rect, adds space between the edges of the button and the content. This value is relative to bgimg_middle. + * sound - a sound to be played when triggered. * textcolor - color, default white. * checkbox * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * sound - a sound to be played when triggered. * dropdown * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * sound - a sound to be played when the entry is changed. * field, pwdfield, textarea * border - set to false to hide the textbox background and border. Default true. * font - Sets font type. See button `font` property for more information. * font_size - Sets font size. See button `font_size` property for more information. * noclip - boolean, set to true to allow the element to exceed formspec bounds. * textcolor - color. Default white. +* model + * bgcolor - color, sets background color. + * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * Default to false in formspec_version version 3 or higher * image * noclip - boolean, set to true to allow the element to exceed formspec bounds. * Default to false in formspec_version version 3 or higher @@ -2867,17 +3098,25 @@ Some types may inherit styles from parent types. * font - Sets font type. See button `font` property for more information. * font_size - Sets font size. See button `font_size` property for more information. * noclip - boolean, set to true to allow the element to exceed formspec bounds. +* list + * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * size - 2d vector, sets the size of inventory slots in coordinates. + * spacing - 2d vector, sets the space between inventory slots in coordinates. * image_button (additional properties) * fgimg - standard image. Defaults to none. * fgimg_hovered - image when hovered. Defaults to fgimg when not provided. * 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 * noclip - boolean, set to true to allow the element to exceed formspec bounds. * tabheader * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * sound - a sound to be played when a different tab is selected. * textcolor - color. Default white. * table, textlist * font - Sets font type. See button `font` property for more information. @@ -2901,6 +3140,9 @@ Some tags can enclose text, they open with `` and close with `...` @@ -3035,10 +3277,9 @@ 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). -To specify the value of the alpha channel, append `#AA` to the end of the color -name (e.g. `colorname#08`). For named colors the hexadecimal string -representing the alpha value must (always) be two hexadecimal digits. +[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`). `ColorSpec` ----------- @@ -3087,38 +3328,119 @@ 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}`. +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. -For the following functions, `v`, `v1`, `v2` are vectors, -`p1`, `p2` are positions, -`s` is a scalar (a number): +Spatial vectors are used for various things, including, but not limited to: -* `vector.new(a[, b, c])`: - * Returns a vector. - * A copy of `a` if `a` is a vector. - * `{x = a, y = b, z = c}`, if all of `a`, `b`, `c` are defined numbers. +* 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. +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. + +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)`: + +* `vector.new([a[, b, c]])`: + * Returns a new vector `(a, b, c)`. + * Deprecated: `vector.new()` does the same as `vector.zero()` and + `vector.new(v)` does the same as `vector.copy(v)` +* `vector.zero()`: + * Returns a new vector `(0, 0, 0)`. +* `vector.copy(v)`: + * Returns a copy of the vector `v`. +* `vector.from_string(s[, init])`: + * Returns `v, np`, where `v` is a vector read from the given string `s` and + `np` is the next position in the string after the vector. + * Returns `nil` on failure. + * `s`: Has to begin with a substring of the form `"(x, y, z)"`. Additional + spaces, leaving away commas and adding an additional comma to the end + is allowed. + * `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 `{x = 0, y = 0, z = 0}`. + * If `p1` and `p2` are identical, returns `(0, 0, 0)`. * `vector.distance(p1, p2)`: * Returns zero or a positive number, the distance between `p1` and `p2`. * `vector.length(v)`: * Returns zero or a positive number, the length of vector `v`. * `vector.normalize(v)`: * Returns a vector of length 1 with direction of vector `v`. - * If `v` has zero length, returns `{x = 0, y = 0, z = 0}`. + * If `v` has zero length, returns `(0, 0, 0)`. * `vector.floor(v)`: * Returns a vector, each dimension rounded down. * `vector.round(v)`: * Returns a vector, each dimension rounded to nearest integer. + * At a multiple of 0.5, rounds away from zero. * `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)`: @@ -3130,7 +3452,11 @@ For the following functions, `v`, `v1`, `v2` are vectors, * `vector.cross(v1, v2)`: * Returns the cross product of `v1` and `v2`. * `vector.offset(v, x, y, z)`: - * Returns the sum of the vectors `v` and `{x = x, y = y, z = z}`. + * Returns the sum of the vectors `v` and `(x, y, z)`. +* `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}`. For the following functions `x` can be either a vector or a number: @@ -3149,14 +3475,36 @@ 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. +* `-v`: + * Returns the additive inverse of v. +* `v1 + v2`: + * Returns the sum of both vectors. + * Note: `+` can not be used together with scalars. +* `v1 - v2`: + * Returns the difference of `v1` subtracted by `v2`. + * Note: `-` can not be used together with scalars. +* `v * s` or `s * v`: + * Returns `v` scaled by `s`. +* `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 = , y = , z = }) where pitch, yaw and roll are +vector (`{x = , y = , z = }`) where pitch, yaw and roll are angles in radians. * `vector.rotate(v, r)`: * Applies the rotation `r` to `v` and returns the result. - * `vector.rotate({x = 0, y = 0, z = 1}, r)` and - `vector.rotate({x = 0, y = 1, z = 0}, r)` return vectors pointing + * `vector.rotate(vector.new(0, 0, 1), r)` and + `vector.rotate(vector.new(0, 1, 0), r)` return vectors pointing forward and up relative to an entity's rotation `r`. * `vector.rotate_around_axis(v1, v2, a)`: * Returns `v1` rotated around axis `v2` by `a` radians according to @@ -3167,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.) + @@ -3190,6 +3550,8 @@ Helper functions * If the absolute value of `x` is within the `tolerance` or `x` is NaN, `0` is returned. * `math.factorial(x)`: returns the factorial of `x` +* `math.round(x)`: Returns `x` rounded to the nearest integer. + * At a multiple of 0.5, rounds away from zero. * `string.split(str, separator, include_empty, max_splits, sep_is_pattern)` * `separator`: string, default: `","` * `include_empty`: boolean, default: `false` @@ -3216,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 + "~": Relative coordinate plus + * 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. @@ -3237,7 +3607,8 @@ Helper functions * Appends all values in `other_table` to `table` - uses `#table + 1` to find new indices. * `table.key_value_swap(t)`: returns a table with keys and values swapped - * If multiple keys in `t` map to the same value, the result is undefined. + * If multiple keys in `t` map to the same value, it is unspecified which + value maps to that key. * `table.shuffle(table, [from], [to], [random_func])`: * Shuffles elements `from` to `to` in `table` in place * `from` defaults to `1` @@ -3248,25 +3619,33 @@ 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_dig_params(groups, tool_capabilities)`: Simulates a tool - that digs a 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: * `diggable`: `true` if node can be dug, `false` otherwise. * `time`: Time it would take to dig the node. - * `wear`: How much wear would be added to the tool. + * `wear`: How much wear would be added to the tool (ignored for non-tools). `time` and `wear` are meaningless if node's not diggable Parameters: * `groups`: Table of the node groups of the node that would be dug - * `tool_capabilities`: Tool capabilities table of the tool -* `minetest.get_hit_params(groups, tool_capabilities [, time_from_last_punch])`: + * `tool_capabilities`: Tool capabilities table of the item + * `wear`: Amount of wear the tool starts with (default: 0) +* `minetest.get_hit_params(groups, tool_capabilities [, time_from_last_punch [, wear]])`: Simulates an item that punches an object. Returns a table with the following fields: - * `hp`: How much damage the punch would cause. - * `wear`: How much wear would be added to the tool. + * `hp`: How much damage the punch would cause (between -65535 and 65535). + * `wear`: How much wear would be added to the tool (ignored for non-tools). Parameters: * `groups`: Damage groups of the object * `tool_capabilities`: Tool capabilities table of the item * `time_from_last_punch`: time in seconds since last punch action + * `wear`: Amount of wear the item starts with (default: 0) @@ -3277,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 -------------------- @@ -3466,7 +3848,7 @@ A whole number, 1 or more. Each additional octave adds finer detail to the noise but also increases the noise calculation load. 3 is a typical minimum for a high quality, complex and natural-looking noise -variation. 1 octave has a slight 'gridlike' appearence. +variation. 1 octave has a slight 'gridlike' appearance. Choose the number of octaves according to the `spread` and `lacunarity`, and the size of the finest detail you require. For example: @@ -3541,7 +3923,7 @@ For 2D or 3D perlin noise or perlin noise maps: spread = {x = 500, y = 500, z = 500}, seed = 571347, octaves = 5, - persist = 0.63, + persistence = 0.63, lacunarity = 2.0, flags = "defaults, absvalue", } @@ -3631,7 +4013,7 @@ The following is a decent set of parameters to work from: spread = {x=200, y=200, z=200}, seed = 5390, octaves = 4, - persist = 0.5, + persistence = 0.5, lacunarity = 2.0, flags = "eased", }, @@ -3920,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 @@ -3937,7 +4319,7 @@ differences: ### Other API functions operating on a VoxelManip -If any VoxelManip contents were set to a liquid node, +If any VoxelManip contents were set to a liquid node (`liquidtype ~= "none"`), `VoxelManip:update_liquids()` must be called for these liquid nodes to begin flowing. It is recommended to call this function only after having written all buffered data back to the VoxelManip object, save for special situations where @@ -4004,12 +4386,15 @@ Methods `minetest.get_mapgen_object`. * (`p1`, `p2`) is the area in which lighting is set, defaults to the whole area if left out. -* `get_light_data()`: Gets the light data read into the `VoxelManip` object +* `get_light_data([buffer])`: Gets the light data read into the + `VoxelManip` object * Returns an array (indices 1 to volume) of integers ranging from `0` to `255`. * Each value is the bitwise combination of day and night light values (`0` to `15` each). * `light = day + (night * 16)` + * If the param `buffer` is present, this table will be used to store the + result instead. * `set_light_data(light_data)`: Sets the `param1` (light) contents of each node in the `VoxelManip`. * expects lighting data in the same format that `get_light_data()` returns @@ -4041,7 +4426,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 @@ -4089,7 +4474,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`. @@ -4138,36 +4523,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: @@ -4175,10 +4560,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_step(self, dtime)` +* `on_deactivate(self, removal)` + * Called when the object is about to get removed or unloaded. + * `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 @@ -4186,7 +4579,7 @@ Callbacks: * `puncher`: an `ObjectRef` (can be `nil`) * `time_from_last_punch`: Meant for disallowing spamming of clicks (can be `nil`). - * `tool_capabilities`: capability table of used tool (can be `nil`) + * `tool_capabilities`: capability table of used item (can be `nil`) * `dir`: unit vector of direction of punch. Always defined. Points from the puncher to the punched. * `damage`: damage that will be done to entity. @@ -4195,6 +4588,9 @@ Callbacks: * Called when the object dies. * `killer`: an `ObjectRef` (can be `nil`) * `on_rightclick(self, clicker)` + * Called when `clicker` pressed the 'place/use' key while pointing + to the object (not neccessarily an actual rightclick) + * `clicker`: an `ObjectRef` (may or may not be a player) * `on_attach_child(self, child)` * `child`: an `ObjectRef` of the child that attaches * `on_detach_child(self, child)` @@ -4206,6 +4602,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 + } @@ -4285,7 +4705,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 ============================== @@ -4295,11 +4800,14 @@ Utilities * `minetest.get_current_modname()`: returns the currently loading mod's name, when loading a mod. -* `minetest.get_modpath(modname)`: returns e.g. - `"/home/user/.minetest/usermods/modname"`. - * Useful for loading additional `.lua` modules or static data from mod -* `minetest.get_modnames()`: returns a list of installed mods - * Return a list of installed mods, sorted alphabetically +* `minetest.get_modpath(modname)`: returns the directory path for a mod, + e.g. `"/home/user/.minetest/usermods/modname"`. + * Returns nil if the mod is not enabled or does not exist (not installed). + * Works regardless of whether the mod has been loaded yet. + * Useful for loading additional `.lua` modules or static data from a mod, + or checking if a mod is enabled. +* `minetest.get_modnames()`: returns a list of enabled mods, sorted alphabetically. + * Does not include disabled mods, even if they are installed. * `minetest.get_worldpath()`: returns e.g. `"/home/user/.minetest/world"` * Useful for storing custom data * `minetest.is_singleplayer()` @@ -4340,6 +4848,26 @@ Utilities pathfinder_works = true, -- Whether Collision info is available to an objects' on_step (5.3.0) object_step_has_moveresult = true, + -- Whether get_velocity() and add_velocity() can be used on players (5.4.0) + direct_velocity_on_players = true, + -- nodedef's use_texture_alpha accepts new string modes (5.4.0) + use_texture_alpha_string_modes = true, + -- degrotate param2 rotates in units of 1.5° instead of 2° + -- thus changing the range of values from 0-179 to 0-240 (5.5.0) + degrotate_240_steps = true, + -- ABM supports min_y and max_y fields in definition (5.5.0) + 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, + -- VoxelManip:get_light_data accepts an optional buffer argument (5.7.0) + get_light_data_buffer = true, } * `minetest.has_feature(arg)`: returns `boolean, missing_features` @@ -4375,6 +4903,19 @@ Utilities * `minetest.mkdir(path)`: returns success. * Creates a directory specified by `path`, creating parent directories if they don't exist. +* `minetest.rmdir(path, recursive)`: returns success. + * Removes a directory specified by `path`. + * If `recursive` is set to `true`, the directory is recursively removed. + Otherwise, the directory will only be removed if it is empty. + * Returns true on success, false on failure. +* `minetest.cpdir(source, destination)`: returns success. + * Copies a directory specified by `path` to `destination` + * Any files in `destination` will be overwritten if they already exist. + * Returns true on success, false on failure. +* `minetest.mvdir(source, destination)`: returns success. + * Moves a directory specified by `path` to `destination`. + * If the `destination` is a non-empty directory, then the move will fail. + * Returns true on success, false on failure. * `minetest.get_dir_list(path, [is_dir])`: returns list of entry names * is_dir is one of: * nil: return all entries, @@ -4390,6 +4931,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 @@ -4399,6 +4941,26 @@ Utilities * `minetest.sha1(data, [raw])`: returns the sha1 hash of data * `data`: string of data to hash * `raw`: return raw bytes instead of hex digits, default: false +* `minetest.colorspec_to_colorstring(colorspec)`: Converts a ColorSpec to a + ColorString. If the ColorSpec is invalid, returns `nil`. + * `colorspec`: The ColorSpec to convert +* `minetest.colorspec_to_bytes(colorspec)`: Converts a ColorSpec to a raw + string of four bytes in an RGBA layout, returned as a string. + * `colorspec`: The ColorSpec to convert +* `minetest.encode_png(width, height, data, [compression])`: Encode a PNG + image and return it in string form. + * `width`: Width of the image + * `height`: Height of the image + * `data`: Image data, one of: + * array table of ColorSpec, length must be width*height + * string with raw RGBA pixels, length must be width*height*4 + * `compression`: Optional zlib compression level, number in range 0 to 9. + The data is one-dimensional, starting in the upper left corner of the image + and laid out in scanlines going from left to right, then top to bottom. + Please note that it's not safe to use string.char to generate raw data, + use `colorspec_to_bytes` to generate raw RGBA values in a predictable way. + The resulting PNG image is always 32-bit. Palettes are not supported at the moment. + You may use this to procedurally generate textures during server init. Logging ------- @@ -4533,7 +5095,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))` @@ -4543,11 +5105,16 @@ Call these functions only at load time! * `hitter`: ObjectRef - Player that hit * `time_from_last_punch`: Meant for disallowing spamming of clicks (can be nil). - * `tool_capabilities`: Capability table of used tool (can be nil) + * `tool_capabilities`: Capability table of used item (can be nil) * `dir`: Unit vector of direction of punch. Always defined. Points from the puncher to the punched. * `damage`: Number that represents the damage calculated by the engine * should return `true` to prevent the default damage mechanism +* `minetest.register_on_rightclickplayer(function(player, clicker))` + * Called when the 'place/use' key was used while pointing a player + (not neccessarily an actual rightclick) + * `player`: ObjectRef - Player that is acted upon + * `clicker`: ObjectRef - Object that acted upon `player`, may or may not be a player * `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)` * Called when the player gets damaged or healed * `player`: ObjectRef of the player @@ -4598,6 +5165,7 @@ Call these functions only at load time! * `cheat`: `{type=}`, where `` is one of: * `moved_too_fast` * `interacted_too_far` + * `interacted_with_self` * `interacted_while_dead` * `finished_unknown_dig` * `dug_unbreakable` @@ -4606,6 +5174,11 @@ Call these functions only at load time! * Called always when a player says something * Return `true` to mark the message as handled, which means that it will not be sent to other players. +* `minetest.register_on_chatcommand(function(name, command, params))` + * Called always when a chatcommand is triggered, before `minetest.registered_chatcommands` + is checked to see if the command exists, but after the input is parsed. + * Return `true` to mark the command as handled, which means that the default + handlers will be prevented. * `minetest.register_on_player_receive_fields(function(player, formname, fields))` * Called when the server received input from `player` in a formspec with the given `formname`. Specifically, this is called on any of the @@ -4697,6 +5270,12 @@ Call these functions only at load time! * Called when an incoming mod channel message is received * You should have joined some channels to receive events. * If message comes from a server mod, `sender` field is an empty string. +* `minetest.register_on_liquid_transformed(function(pos_list, node_list))` + * Called after liquid nodes (`liquidtype ~= "none"`) are modified by the + engine's liquid transformation process. + * `pos_list` is an array of all modified positions. + * `node_list` is an array of the old node that was previously at the position + with the corresponding index in pos_list. Setting-related --------------- @@ -4808,6 +5387,22 @@ Environment access * `pos`: The position where to measure the light. * `timeofday`: `nil` for current time, `0` for night, `0.5` for day * Returns a number between `0` and `15` or `nil` + * `nil` is returned e.g. when the map isn't loaded at `pos` +* `minetest.get_natural_light(pos[, timeofday])` + * Figures out the sunlight (or moonlight) value at pos at the given time of + day. + * `pos`: The position of the node + * `timeofday`: `nil` for current time, `0` for night, `0.5` for day + * Returns a number between `0` and `15` or `nil` + * This function tests 203 nodes in the worst case, which happens very + unlikely +* `minetest.get_artificial_light(param1)` + * Calculates the artificial light (light from e.g. torches) value from the + `param1` value. + * `param1`: The param1 value of a `paramtype = "light"` node. + * Returns a number between `0` and `15` + * Currently it's the same as `math.floor(param1 / 16)`, except that it + ensures compatibility. * `minetest.place_node(pos, node)` * Place node with the same effects that a player would cause * `minetest.dig_node(pos)` @@ -4817,7 +5412,7 @@ Environment access * Punch node with the same effects that a player would cause * `minetest.spawn_falling_node(pos)` * Change node into falling node - * Returns `true` if successful, `false` on failure + * Returns `true` and the ObjectRef of the spawned entity if successful, `false` on failure * `minetest.find_nodes_with_meta(pos1, pos2)` * Get a table of positions of nodes that have metadata within a region @@ -4836,6 +5431,9 @@ Environment access * `minetest.get_objects_inside_radius(pos, radius)`: returns a list of ObjectRefs. * `radius`: using an euclidean metric +* `minetest.get_objects_in_area(pos1, pos2)`: returns a list of + ObjectRefs. + * `pos1` and `pos2` are the min and max positions of the area to search. * `minetest.set_timeofday(val)` * `val` is between `0` and `1`; `0` for midnight, `0.5` for midday * `minetest.get_timeofday()` @@ -4922,8 +5520,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` @@ -5016,7 +5613,8 @@ Environment access * `pos1`: start of the ray * `pos2`: end of the ray * `objects`: if false, only nodes will be returned. Default is `true`. - * `liquids`: if false, liquid nodes won't be returned. Default is `false`. + * `liquids`: if false, liquid nodes (`liquidtype ~= "none"`) won't be + returned. Default is `false`. * `minetest.find_path(pos1,pos2,searchdistance,max_jump,max_drop,algorithm)` * returns table containing path that can be walked on * returns a table of 3D points representing a path from `pos1` to `pos2` or @@ -5040,7 +5638,7 @@ Environment access * `minetest.spawn_tree (pos, {treedef})` * spawns L-system tree at given `pos` with definition in `treedef` table * `minetest.transforming_liquid_add(pos)` - * add node to liquid update queue + * add node to liquid flow update queue * `minetest.get_node_max_level(pos)` * get max available level for leveled node * `minetest.get_node_level(pos)` @@ -5118,7 +5716,7 @@ Inventory * `minetest.remove_detached_inventory(name)` * Returns a `boolean` indicating whether the removal succeeded. * `minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)`: - returns left over ItemStack. + returns leftover ItemStack or nil to indicate no inventory change * See `minetest.item_eat` and `minetest.register_on_item_eat` Formspec @@ -5198,9 +5796,9 @@ Item handling information. * `minetest.get_node_drops(node, toolname)` * Returns list of itemstrings that are dropped by `node` when dug - with `toolname`. + with the item `toolname` (not limited to tools). * `node`: node as table or node name - * `toolname`: name of the tool item (can be `nil`) + * `toolname`: name of the item used to dig (can be `nil`) * `minetest.get_craft_result(input)`: returns `output, decremented_input` * `input.method` = `"normal"` or `"cooking"` or `"fuel"` * `input.width` = for example `3` @@ -5228,14 +5826,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 @@ -5343,6 +5946,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 ------ @@ -5361,6 +6026,8 @@ Server a player joined. * This function may be overwritten by mods to customize the status message. * `minetest.get_server_uptime()`: returns the server uptime in seconds +* `minetest.get_server_max_lag()`: returns the current maximum lag + of the server in seconds or nil if server is not fully loaded yet * `minetest.remove_player(name)`: remove player from database (if they are not connected). * As auth data is not removed, minetest.player_exists will continue to @@ -5369,20 +6036,33 @@ Server * Returns a code (0: successful, 1: no such player, 2: player is connected) * `minetest.remove_player_auth(name)`: remove player authentication data * Returns boolean indicating success (false if player nonexistant) -* `minetest.dynamic_add_media(filepath)` - * Adds the file at the given path to the media sent to clients by the server - on startup and also pushes this file to already connected clients. - The file must be a supported image, sound or model format. It must not be - modified, deleted, moved or renamed after calling this function. - The list of dynamically added media is not persisted. - * Returns boolean indicating success (duplicate files count as error) - * The media will be ready to use (in e.g. entity textures, sound_play) - immediately after calling this function. - Old clients that lack support for this feature will not see the media - unless they reconnect to the server. - * Since media transferred this way does not use client caching or HTTP - transfers, dynamic media should not be used with big files or performance - will suffer. +* `minetest.dynamic_add_media(options, callback)` + * `options`: table containing the following parameters + * `filepath`: path to a media file on the filesystem + * `to_player`: name of the player the media should be sent to instead of + all players (optional) + * `ephemeral`: boolean that marks the media as ephemeral, + it will not be cached on the client (optional, default false) + * `callback`: function with arguments `name`, which is a player name + * Pushes the specified media file to client(s). (details below) + The file must be a supported image, sound or model format. + Dynamically added media is not persisted between server restarts. + * Returns false on error, true if the request was accepted + * The given callback will be called for every player as soon as the + media is available on the client. + * Details/Notes: + * If `ephemeral`=false and `to_player` is unset the file is added to the media + sent to clients on startup, this means the media will appear even on + old clients if they rejoin the server. + * If `ephemeral`=false the file must not be modified, deleted, moved or + renamed after calling this function. + * Regardless of any use of `ephemeral`, adding media files with the same + name twice is not possible/guaranteed to work. An exception to this is the + use of `to_player` to send the same, already existent file to multiple + chosen players. + * Clients will attempt to fetch files added this way via remote media, + this can make transfer of bigger files painless (if set up). Nevertheless + it is advised not to use dynamic media for big media files. Bans ---- @@ -5397,6 +6077,10 @@ Bans * `minetest.kick_player(name, [reason])`: disconnect a player with an optional reason. * Returns boolean indicating success (false if player nonexistant) +* `minetest.disconnect_player(name, [reason])`: disconnect a player with an + optional reason, this will not prefix with 'Kicked: ' like kick_player. + If no reason is given, it will default to 'Disconnected.' + * Returns boolean indicating success (false if player nonexistant) Particles --------- @@ -5599,11 +6283,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. @@ -5615,7 +6299,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)` @@ -5638,7 +6322,9 @@ Misc. * Example: `minetest.rgba(10, 20, 30, 40)`, returns `"#0A141E28"` * `minetest.encode_base64(string)`: returns string encoded in base64 * Encodes a string in base64. -* `minetest.decode_base64(string)`: returns string or nil for invalid base64 +* `minetest.decode_base64(string)`: returns string or nil on failure + * Padding characters are only supported starting at version 5.4.0, where + 5.5.0 and newer perform proper checks. * Decodes a string encoded in base64. * `minetest.is_protected(pos, name)`: returns boolean * Returning `true` restricts the player `name` from modifying (i.e. digging, @@ -5726,6 +6412,19 @@ Misc. * If `transient` is `false` or absent, frees a persistent forceload. If `true`, frees a transient forceload. +* `minetest.compare_block_status(pos, condition)` + * Checks whether the mapblock at positition `pos` is in the wanted condition. + * `condition` may be one of the following values: + * `"unknown"`: not in memory + * `"emerging"`: in the queue for loading from disk or generating + * `"loaded"`: in memory but inactive (no ABMs are executed) + * `"active"`: in memory and active + * Other values are reserved for future functionality extensions + * Return value, the comparison status: + * `false`: Mapblock does not fulfil the wanted condition + * `true`: Mapblock meets the requirement + * `nil`: Unsupported `condition` value + * `minetest.request_insecure_environment()`: returns an environment containing insecure functions if the calling mod has been listed as trusted in the `secure.trusted_mods` setting or security is disabled, otherwise returns @@ -5762,6 +6461,9 @@ Global tables * Map of registered tool definitions, indexed by name * `minetest.registered_entities` * Map of registered entity prototypes, indexed by name + * Values in this table may be modified directly. + Note: changes to initial properties will only affect entities spawned afterwards, + as they are only read when spawning. * `minetest.object_refs` * Map of object references, indexed by active object id * `minetest.luaentities` @@ -5792,6 +6494,7 @@ Global tables * Map of registered chat command definitions, indexed by name * `minetest.registered_privileges` * Map of registered privilege definitions, indexed by name + * Registered privileges can be modified directly in this table. ### Registered callback tables @@ -5809,45 +6512,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. @@ -5885,9 +6596,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`. @@ -5956,6 +6667,18 @@ an itemstring, a table or `nil`. stack). * `set_metadata(metadata)`: (DEPRECATED) Returns true. * `get_description()`: returns the description shown in inventory list tooltips. + * The engine uses this when showing item descriptions in tooltips. + * Fields for finding the description, in order: + * `description` in item metadata (See [Item Metadata].) + * `description` in item definition + * item name +* `get_short_description()`: returns the short description or nil. + * Unlike the description, this does not include new lines. + * Fields for finding the short description, in order: + * `short_description` in item metadata (See [Item Metadata].) + * `short_description` in item definition + * first line of the description (From item meta or def, see `get_description()`.) + * Returns nil if none of the above are set * `clear()`: removes all items from the stack, making it empty. * `replace(item)`: replace the contents of this stack. * `item` can also be an itemstring or table. @@ -5969,8 +6692,14 @@ an itemstring, a table or `nil`. * `get_tool_capabilities()`: returns the digging properties of the item, 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 + * 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 @@ -6104,11 +6833,39 @@ 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 * `get_pos()`: returns `{x=num, y=num, z=num}` * `set_pos(pos)`: `pos`=`{x=num, y=num, z=num}` +* `get_velocity()`: returns the velocity, a vector. +* `add_velocity(vel)` + * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}` + * In comparison to using get_velocity, adding the velocity and then using + set_velocity, add_velocity is supposed to avoid synchronization problems. + Additionally, players also do not support set_velocity. + * If a player: + * Does not apply during free_move. + * Note that since the player speed is normalized at each move step, + increasing e.g. Y velocity beyond what would usually be achieved + (see: physics overrides) will cause existing X/Z velocity to be reduced. + * Example: `add_velocity({x=0, y=6.5, z=0})` is equivalent to + pressing the jump key (assuming default settings) * `move_to(pos, continuous=false)` * Does an interpolated move for Lua entities for visually smooth transitions. * If `continuous` is true, the Lua entity will not be moved to the current @@ -6119,12 +6876,11 @@ object you are working with still exists. * `time_from_last_punch` = time since last punch action of the puncher * `direction`: can be `nil` * `right_click(clicker)`; `clicker` is another `ObjectRef` -* `get_hp()`: returns number of hitpoints (2 * number of hearts) -* `set_hp(hp, reason)`: set number of hitpoints (2 * number of hearts). +* `get_hp()`: returns number of health points +* `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. @@ -6143,17 +6899,25 @@ object you are working with still exists. `frame_loop`. * `set_animation_frame_speed(frame_speed)` * `frame_speed`: number, default: `15.0` -* `set_attach(parent, bone, position, rotation)` - * `bone`: string - * `position`: `{x=num, y=num, z=num}` (relative) - * `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees -* `get_attach()`: returns parent, bone, position, rotation or nil if it isn't - attached. +* `set_attach(parent[, bone, position, rotation, forced_visible])` + * `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`. + * 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, + or nil if it isn't attached. +* `get_children()`: returns a list of ObjectRefs that are attached to the + object. * `set_detach()` -* `set_bone_position(bone, position, rotation)` - * `bone`: string - * `position`: `{x=num, y=num, z=num}` (relative) - * `rotation`: `{x=num, y=num, z=num}` +* `set_bone_position([bone, position, rotation])` + * `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}`, default `{x=0, y=0, z=0}` * `get_bone_position(bone)`: returns position and rotation of the bone * `set_properties(object property table)` * `get_properties()`: returns object property table @@ -6161,15 +6925,21 @@ object you are working with still exists. * `get_nametag_attributes()` * returns a table with the attributes of the nametag of an object * { - color = {a=0..255, r=0..255, g=0..255, b=0..255}, text = "", + color = {a=0..255, r=0..255, g=0..255, b=0..255}, + bgcolor = {a=0..255, r=0..255, g=0..255, b=0..255}, } * `set_nametag_attributes(attributes)` * sets the attributes of the nametag of an object * `attributes`: { - color = ColorSpec, text = "My Nametag", + color = ColorSpec, + -- ^ Text color + bgcolor = ColorSpec or false, + -- ^ Sets background color of nametag + -- `false` will cause the background to be set automatically based on user settings + -- Default: false } #### Lua entity only (no-op for other objects) @@ -6180,11 +6950,6 @@ object you are working with still exists. no effect and returning `nil`. * `set_velocity(vel)` * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}` -* `add_velocity(vel)` - * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}` - * In comparison to using get_velocity, adding the velocity and then using - set_velocity, add_velocity is supposed to avoid synchronization problems. -* `get_velocity()`: returns the velocity, a vector * `set_acceleration(acc)` * `acc` is a vector * `get_acceleration()`: returns the acceleration, a vector @@ -6192,18 +6957,18 @@ object you are working with still exists. * `rot` is a vector (radians). X is pitch (elevation), Y is yaw (heading) and Z is roll (bank). * `get_rotation()`: returns the rotation, a vector (radians) -* `set_yaw(radians)`: sets the yaw (heading). +* `set_yaw(yaw)`: sets the yaw in radians (heading). * `get_yaw()`: returns number in radians * `set_texture_mod(mod)` * Set a texture modifier to the base texture, for sprites and meshes. * When calling `set_texture_mod` again, the previous one is discarded. * `mod` the texture modifier. See [Texture modifiers]. * `get_texture_mod()` returns current texture modifier -* `set_sprite(p, num_frames, framelength, select_x_by_camera)` +* `set_sprite(start_frame, num_frames, framelength, select_x_by_camera)` * Specifies and starts a sprite animation * Animations iterate along the frame `y` position. - * `p`: {x=column number, y=row number}, the coordinate of the first frame - default: `{x=0, y=0}` + * `start_frame`: {x=column number, y=row number}, the coordinate of the + first frame, default: `{x=0, y=0}` * `num_frames`: Total frames in the texture, default: `1` * `framelength`: Time per animated frame in seconds, default: `0.2` * `select_x_by_camera`: Only for visual = `sprite`. Changes the frame `x` @@ -6214,22 +6979,15 @@ 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) * `get_player_name()`: returns `""` if is not a player -* `get_player_velocity()`: returns `nil` if is not a player, otherwise a +* `get_player_velocity()`: **DEPRECATED**, use get_velocity() instead. table {x, y, z} representing the player's instantaneous velocity in nodes/s -* `add_player_velocity(vel)` - * Adds to player velocity, this happens client-side and only once. - * Does not apply during free_move. - * Note that since the player speed is normalized at each move step, - increasing e.g. Y velocity beyond what would usually be achieved - (see: physics overrides) will cause existing X/Z velocity to be reduced. - * Example: `add_player_velocity({x=0, y=6.5, z=0})` is equivalent to - pressing the jump key (assuming default settings) +* `add_player_velocity(vel)`: **DEPRECATED**, use add_velocity(vel) instead. * `get_look_dir()`: get camera direction as a unit vector * `get_look_vertical()`: pitch in radians * Angle ranges between -pi/2 and pi/2, which are straight up and down @@ -6282,6 +7040,7 @@ object you are working with still exists. * `set_inventory_formspec(formspec)` * Redefine player's inventory form * Should usually be called in `on_joinplayer` + * If `formspec` is `""`, the player's inventory is disabled. * `get_inventory_formspec()`: returns a formspec string * `set_formspec_prepend(formspec)`: * the formspec string will be added to every formspec shown to the user, @@ -6296,18 +7055,21 @@ object you are working with still exists. `aux1`, `sneak`, `dig`, `place`, `LMB`, `RMB`, and `zoom`. * The fields `LMB` and `RMB` are equal to `dig` and `place` respectively, and exist only to preserve backwards compatibility. + * Returns an empty table `{}` if the object is not a player. * `get_player_control_bits()`: returns integer with bit packed player pressed - keys. Bits: - * 0 - up - * 1 - down - * 2 - left - * 3 - right - * 4 - jump - * 5 - aux1 - * 6 - sneak - * 7 - dig - * 8 - place - * 9 - zoom + keys. + * Bits: + * 0 - up + * 1 - down + * 2 - left + * 3 - right + * 4 - jump + * 5 - aux1 + * 6 - sneak + * 7 - dig + * 8 - place + * 9 - zoom + * Returns `0` (no bits set) if the object is not a player. * `set_physics_override(override_table)` * `override_table` is a table with the following fields: * `speed`: multiplier to default walking speed value (default: `1`) @@ -6325,22 +7087,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 @@ -6352,57 +7115,99 @@ object you are working with still exists. * `hud_set_hotbar_selected_image(texturename)` * sets image for selected item of hotbar * `hud_get_hotbar_selected_image`: returns texturename -* `set_sky(parameters)` - * `parameters` is a table with the following optional fields: +* `set_minimap_modes({mode, mode, ...}, selected_mode)` + * Overrides the available minimap modes (and toggle order), and changes the + selected mode. + * `mode` is a table consisting of up to four fields: + * `type`: Available type: + * `off`: Minimap off + * `surface`: Minimap in surface mode + * `radar`: Minimap in radar mode + * `texture`: Texture to be displayed instead of terrain map + (texture is centered around 0,0 and can be scaled). + Texture size is limited to 512 x 512 pixel. + * `label`: Optional label to display on minimap mode toggle + The translation must be handled within the mod. + * `size`: Sidelength or diameter, in number of nodes, of the terrain + displayed in minimap + * `texture`: Only for texture type, name of the texture to display + * `scale`: Only for texture type, scale of the texture map in nodes per + pixel (for example a `scale` of 2 means each pixel represents a 2x2 + nodes square) + * `selected_mode` is the mode index to be selected after modes have been changed + (0 is the first mode). +* `set_sky(sky_parameters)` + * The presence of the function `set_sun`, `set_moon` or `set_stars` indicates + whether `set_sky` accepts this format. Check the legacy format otherwise. + * Passing no arguments resets the sky to its default values. + * `sky_parameters` is a table with the following optional fields: * `base_color`: ColorSpec, changes fog in "skybox" and "plain". + (default: `#ffffff`) * `type`: Available types: * `"regular"`: Uses 0 textures, `base_color` ignored * `"skybox"`: Uses 6 textures, `base_color` used as fog. * `"plain"`: Uses 0 textures, `base_color` used as both fog and sky. + (default: `"regular"`) * `textures`: A table containing up to six textures in the following order: Y+ (top), Y- (bottom), X- (west), X+ (east), Z+ (north), Z- (south). * `clouds`: Boolean for whether clouds appear. (default: `true`) - * `sky_color`: A table containing the following values, alpha is ignored: - * `day_sky`: ColorSpec, for the top half of the `"regular"` - sky during the day. (default: `#8cbafa`) - * `day_horizon`: ColorSpec, for the bottom half of the - `"regular"` sky during the day. (default: `#9bc1f0`) - * `dawn_sky`: ColorSpec, for the top half of the `"regular"` - sky during dawn/sunset. (default: `#b4bafa`) + * `sky_color`: A table used in `"regular"` type only, containing the + following values (alpha is ignored): + * `day_sky`: ColorSpec, for the top half of the sky during the day. + (default: `#61b5f5`) + * `day_horizon`: ColorSpec, for the bottom half of the sky during the day. + (default: `#90d3f6`) + * `dawn_sky`: ColorSpec, for the top half of the sky during dawn/sunset. + (default: `#b4bafa`) The resulting sky color will be a darkened version of the ColorSpec. Warning: The darkening of the ColorSpec is subject to change. - * `dawn_horizon`: ColorSpec, for the bottom half of the `"regular"` - sky during dawn/sunset. (default: `#bac1f0`) + * `dawn_horizon`: ColorSpec, for the bottom half of the sky during dawn/sunset. + (default: `#bac1f0`) The resulting sky color will be a darkened version of the ColorSpec. Warning: The darkening of the ColorSpec is subject to change. - * `night_sky`: ColorSpec, for the top half of the `"regular"` - sky during the night. (default: `#006aff`) + * `night_sky`: ColorSpec, for the top half of the sky during the night. + (default: `#006bff`) The resulting sky color will be a dark version of the ColorSpec. Warning: The darkening of the ColorSpec is subject to change. - * `night_horizon`: ColorSpec, for the bottom half of the `"regular"` - sky during the night. (default: `#4090ff`) + * `night_horizon`: ColorSpec, for the bottom half of the sky during the night. + (default: `#4090ff`) The resulting sky color will be a dark version of the ColorSpec. Warning: The darkening of the ColorSpec is subject to change. - * `indoors`: ColorSpec, for when you're either indoors or - underground. Only applies to the `"regular"` sky. + * `indoors`: ColorSpec, for when you're either indoors or underground. (default: `#646464`) * `fog_sun_tint`: ColorSpec, changes the fog tinting for the sun - at sunrise and sunset. + at sunrise and sunset. (default: `#f47d1d`) * `fog_moon_tint`: ColorSpec, changes the fog tinting for the moon - at sunrise and sunset. + at sunrise and sunset. (default: `#7f99cc`) * `fog_tint_type`: string, changes which mode the directional fog abides by, `"custom"` uses `sun_tint` and `moon_tint`, while `"default"` uses the classic Minetest sun and moon tinting. Will use tonemaps, if set to `"default"`. (default: `"default"`) -* `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`. -* `set_sun(parameters)`: - * `parameters` is a table with the following optional fields: +* `set_sky(base_color, type, {texture names}, clouds)` + * Deprecated. Use `set_sky(sky_parameters)` + * `base_color`: ColorSpec, defaults to white + * `type`: Available types: + * `"regular"`: Uses 0 textures, `bgcolor` ignored + * `"skybox"`: Uses 6 textures, `bgcolor` used + * `"plain"`: Uses 0 textures, `bgcolor` used + * `clouds`: Boolean for whether clouds appear in front of `"skybox"` or + `"plain"` custom skyboxes (default: `true`) +* `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: * `visible`: Boolean for whether the sun is visible. (default: `true`) * `texture`: A regular texture for the sun. Setting to `""` - will re-enable the mesh sun. (default: `"sun.png"`) + will re-enable the mesh sun. (default: "sun.png", if it exists) * `tonemap`: A 512x1 texture containing the tonemap for the sun (default: `"sun_tonemap.png"`) * `sunrise`: A regular texture for the sunrise texture. @@ -6412,21 +7217,28 @@ object you are working with still exists. * `scale`: Float controlling the overall size of the sun. (default: `1`) * `get_sun()`: returns a table with the current sun parameters as in `set_sun`. -* `set_moon(parameters)`: - * `parameters` is a table with the following optional fields: +* `set_moon(moon_parameters)`: + * Passing no arguments resets the moon to its default values. + * `moon_parameters` is a table with the following optional fields: * `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"`) + 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`) * `get_moon()`: returns a table with the current moon parameters as in `set_moon`. -* `set_stars(parameters)`: - * `parameters` is a table with the following optional fields: +* `set_stars(star_parameters)`: + * Passing no arguments resets stars to their default values. + * `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`) @@ -6436,8 +7248,9 @@ object you are working with still exists. * `scale`: Float controlling the overall size of the stars (default: `1`) * `get_stars()`: returns a table with the current stars parameters as in `set_stars`. -* `set_clouds(parameters)`: set cloud parameters - * `parameters` is a table with the following optional fields: +* `set_clouds(cloud_parameters)`: set cloud parameters + * Passing no arguments resets clouds to their default values. + * `cloud_parameters` is a table with the following optional fields: * `density`: from `0` (no clouds) to `1` (full clouds) (default `0.4`) * `color`: basic cloud color with alpha channel, ColorSpec (default `#fff0f0e5`). @@ -6455,26 +7268,30 @@ object you are working with still exists. amount. * `nil`: Disables override, defaulting to sunlight based on day-night cycle * `get_day_night_ratio()`: returns the ratio or nil if it isn't overridden -* `set_local_animation(stand/idle, walk, dig, walk+dig, frame_speed=frame_speed)`: - set animation for player model in third person view - - set_local_animation({x=0, y=79}, -- stand/idle animation key frames - {x=168, y=187}, -- walk animation key frames - {x=189, y=198}, -- dig animation key frames - {x=200, y=219}, -- walk+dig animation key frames - frame_speed=30) -- animation frame speed -* `get_local_animation()`: returns stand, walk, dig, dig+walk tables and +* `set_local_animation(idle, walk, dig, walk_while_dig, frame_speed)`: + set animation for player model in third person view. + * Every animation equals to a `{x=starting frame, y=ending frame}` table. + * `frame_speed` sets the animations frame speed. Default is 30. +* `get_local_animation()`: returns idle, walk, dig, walk_while_dig tables and `frame_speed`. -* `set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})`: defines offset value for - camera per player. +* `set_eye_offset([firstperson, thirdperson])`: defines offset vectors for + camera per player. An argument defaults to `{x=0, y=0, z=0}` if unspecified. * in first person view * in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`) -* `get_eye_offset()`: returns `offset_first` and `offset_third` +* `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` ----------- @@ -6607,7 +7424,8 @@ It can be created via `Raycast(pos1, pos2, objects, liquids)` or * `pos1`: start of the ray * `pos2`: end of the ray * `objects`: if false, only nodes will be returned. Default is true. -* `liquids`: if false, liquid nodes won't be returned. Default is false. +* `liquids`: if false, liquid nodes (`liquidtype ~= "none"`) won't be + returned. Default is false. ### Methods @@ -6678,7 +7496,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 @@ -6700,8 +7518,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`. @@ -6716,22 +7536,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. @@ -6766,6 +7585,7 @@ Player properties need to be saved manually. -- "sprite" uses 1 texture. -- "upright_sprite" uses 2 textures: {front, back}. -- "wielditem" expects 'textures = {itemname}' (see 'visual' above). + -- "mesh" requires one texture for each mesh buffer/material (in order) colors = {}, -- Number of required colors depends on visual @@ -6822,13 +7642,21 @@ Player properties need to be saved manually. -- in mods. nametag = "", - -- By default empty, for players their name is shown if empty + -- The name to display on the head of the object. By default empty. + -- If the object is a player, a nil or empty nametag is replaced by the player's name. + -- For all other objects, a nil or empty string removes the nametag. + -- To hide a nametag, set its color alpha to zero. That will disable it entirely. nametag_color = , - -- Sets color of nametag + -- Sets text color of nametag + + nametag_bgcolor = , + -- Sets background color of nametag + -- `false` will cause the background to be set automatically based on user settings. + -- Default: false infotext = "", - -- By default empty, text to be shown when pointed at object + -- Same as infotext for nodes. Empty by default static_save = true, -- If false, never save this object statically. It will simply be @@ -6841,6 +7669,10 @@ Player properties need to be saved manually. shaded = true, -- Setting this to 'false' disables diffuse lighting of entity + + show_on_minimap = false, + -- Defaults to true for players, false for other entities. + -- If set to true the entity will show as a marker on the minimap. } Entity definition @@ -6855,48 +7687,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 ------------------------------------ @@ -6925,6 +7735,11 @@ Used by `minetest.register_abm`. -- Chance of triggering `action` per-node per-interval is 1.0 / this -- value + min_y = -32768, + max_y = 32767, + -- min and max height levels where ABM will be processed (inclusive) + -- can be used to reduce CPU usage + catch_up = true, -- If true, catch-up behaviour is enabled: The `chance` value is -- temporarily reduced when returning to an area to simulate time lost @@ -6948,7 +7763,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", @@ -6956,18 +7771,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: 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 @@ -6975,13 +7792,8 @@ Tile definition * `"image.png"` * `{name="image.png", animation={Tile Animation definition}}` -* `{name="image.png", backface_culling=bool, tileable_vertical=bool, - tileable_horizontal=bool, align_style="node"/"world"/"user", scale=int}` +* `{name="image.png", backface_culling=bool, align_style="node"/"world"/"user", scale=int}` * backface culling enabled by default for most nodes - * tileable flags are info for shaders, how they should treat texture - when displacement mapping is used. - Directions are from the point of view of the tile texture, - not the node it's on. * align style determines whether the texture will be rotated with the node or kept aligned with its surroundings. "user" means that client setting will be used, similar to `glasslike_framed_optional`. @@ -7033,24 +7845,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 = "", + -- Must not contain new lines. + -- Defaults to nil. + -- 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 = . -- 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. @@ -7059,18 +7887,19 @@ 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. + color = "#ffffffff", + -- Color the item is colorized with. The palette overrides this. - wield_scale = {x = 1, y = 1, z = 1}, - - -- 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 can point to all liquid nodes (`liquidtype ~= "none"`), + -- even those for which `pointable = false` light_source = 0, -- When used for nodes: Defines amount of light emitted by node. @@ -7079,14 +7908,13 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and -- A value outside the range 0 to minetest.LIGHT_MAX causes undefined -- behavior. - -- See "Tools" section for an example including explanation + -- See "Tool Capabilities" section for an example including explanation tool_capabilities = { full_punch_interval = 1.0, 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) @@ -7106,16 +7934,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 = , @@ -7126,12 +7954,17 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and }, on_place = function(itemstack, placer, pointed_thing), - -- Shall place item and return the leftover itemstack. + -- When the 'place' key was pressed with the item in hand + -- and a node was pointed at. + -- Shall place item and return the leftover itemstack + -- or nil to not modify the inventory. -- The placer may be any ObjectRef or nil. -- default: minetest.item_place on_secondary_use = function(itemstack, user, pointed_thing), -- Same as on_place but called when not pointing at a node. + -- Function must return either nil if inventory shall not be modified, + -- or an itemstack to replace the original itemstack. -- The user may be any ObjectRef or nil. -- default: nil @@ -7142,8 +7975,9 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and on_use = function(itemstack, user, pointed_thing), -- default: nil - -- Function must return either nil if no item shall be removed from - -- inventory, or an itemstack to replace the original itemstack. + -- When user pressed the 'punch/mine' key with the item in hand. + -- Function must return either nil if inventory shall not be modified, + -- or an itemstack to replace the original itemstack. -- e.g. itemstack:take_item(); return itemstack -- Otherwise, the function is free to do what it wants. -- The user may be any ObjectRef or nil. @@ -7152,7 +7986,7 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and after_use = function(itemstack, user, node, digparams), -- default: nil -- If defined, should return an itemstack and will be called instead of - -- wearing out the tool. If returns nil, does nothing. + -- wearing out the item (if tool). If returns nil, does nothing. -- If after_use doesn't exist, it is the same as: -- function(itemstack, user, node, digparams) -- itemstack:add_wear(digparams.wear) @@ -7172,7 +8006,7 @@ Node definition Used by `minetest.register_node`. { - -- , + -- drawtype = "normal", -- See "Node drawtypes" @@ -7186,7 +8020,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}, @@ -7198,7 +8031,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, @@ -7206,26 +8038,35 @@ Used by `minetest.register_node`. -- If the node has a palette, then this setting only has an effect in -- the inventory and on the wield item. - use_texture_alpha = false, - -- Use texture's alpha channel - -- If this is set to false, the node will be rendered fully opaque - -- regardless of any texture transparency. + use_texture_alpha = ..., + -- Specifies how the texture's alpha channel will be used for rendering. + -- possible values: + -- * "opaque": Node is rendered opaque regardless of alpha channel + -- * "clip": A given pixel is either fully see-through or opaque + -- depending on the alpha channel being below/above 50% in value + -- * "blend": The alpha channel specifies how transparent a given pixel + -- of the rendered node is + -- The default is "opaque" for drawtypes normal, liquid and flowingliquid; + -- "clip" otherwise. + -- 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 @@ -7243,7 +8084,14 @@ 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). + -- If this is nil, it will be equal to liquid_viscosity. + -- Note: If liquid movement physics apply to the node + -- (see `liquid_move_physics`), the movement speed will also be + -- affected by the `movement_liquid_*` settings. buildable_to = false, -- If true, placed nodes can replace this node @@ -7251,18 +8099,42 @@ Used by `minetest.register_node`. -- If true, liquids flow into and replace this node. -- Warning: making a liquid node 'floodable' will cause problems. - liquidtype = "none", -- "none" / "source" / "flowing" + liquidtype = "none", -- specifies liquid flowing physics + -- * "none": no liquid flowing physics + -- * "source": spawns flowing liquid nodes at all 4 sides and below; + -- recommended drawtype: "liquid". + -- * "flowing": spawned from source, spawns more flowing liquid nodes + -- around it until `liquid_range` is reached; + -- will drain out without a source; + -- recommended drawtype: "flowingliquid". + -- 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, -- Higher viscosity = slower flow (max. 7) + liquid_viscosity = 0, + -- Controls speed at which the liquid spreads/flows (max. 7). + -- 0 is fastest, 7 is slowest. + -- By default, this also slows down movement of players inside the node + -- (can be overridden using `move_resistance`) liquid_renewable = true, -- If true, a new liquid source can be created by placing two or more -- sources nearby + liquid_move_physics = nil, -- specifies movement physics if inside node + -- * false: No liquid movement physics apply. + -- * true: Enables liquid movement physics. Enables things like + -- ability to "swim" up/down, sinking slowly if not moving, + -- smoother speed change when falling into, etc. The `movement_liquid_*` + -- settings apply. + -- * nil: Will be treated as true if `liquidype ~= "none"` + -- and as false otherwise. + leveled = 0, -- Only valid for "nodebox" drawtype with 'type = "leveled"'. -- Allows defining the nodebox height without using param2. @@ -7272,8 +8144,12 @@ Used by `minetest.register_node`. leveled_max = 127, -- Maximum value for `leveled` (0-127), enforced in -- `minetest.set_node_level` and `minetest.add_node_level`. + -- Values above 124 might causes collision detection issues. - liquid_range = 8, -- Number of flowing nodes around source (max. 8) + liquid_range = 8, + -- Maximum distance that flowing liquid nodes can spread around + -- source on flat land; + -- maximum = 8; set to 0 to disable liquid flow drowning = 0, -- Player will take this amount of damage if no bubbles are left @@ -7281,41 +8157,33 @@ 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}, - }, + -- 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}, - }, + -- 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 -- definition is used for the collision box. - -- Both of the boxes above are defined as: - -- {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from node center. -- Support maps made in and before January 2012 legacy_facedir_simple = false, @@ -7344,7 +8212,7 @@ Used by `minetest.register_node`. -- While digging node. -- If `"__group"`, then the sound will be -- `default_dig_`, where `` is the - -- name of the tool's digging group with the fastest digging time. + -- name of the item's digging group with the fastest digging time. -- In case of a tie, one of the sounds will be played (but we -- cannot predict which one) -- Default value: `"__group"` @@ -7368,20 +8236,19 @@ 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 tool filtering. - -- Tool filtering was undocumented until recently, tool 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. -- The entries in 'items' are processed in order. For each: - -- Tool filtering is applied, chance of drop is applied, if both are + -- Item filtering is applied, chance of drop is applied, if both are -- successful the entire item list is dropped. -- Entry processing continues until the number of dropped item lists -- 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'. @@ -7389,7 +8256,7 @@ Used by `minetest.register_node`. items = {"default:diamond"}, }, { - -- Only drop if using a tool whose name is identical to one + -- Only drop if using an item whose name is identical to one -- of these. tools = {"default:shovel_mese", "default:shovel_diamond"}, rarity = 5, @@ -7400,14 +8267,24 @@ Used by `minetest.register_node`. inherit_color = true, }, { - -- Only drop if using a tool whose name contains - -- "default:shovel_" (this tool filtering by string matching - -- is deprecated). + -- Only drop if using an item whose name contains + -- "default:shovel_" (this item filtering by string matching + -- is deprecated, use tool_groups instead). tools = {"~default:shovel_"}, rarity = 2, -- The item list dropped. items = {"default:sand", "default:desert_sand"}, }, + { + -- Only drop if using an item in the "magicwand" group, or + -- an item that is in both the "pickaxe" and the "lucky" + -- groups. + tool_groups = { + "magicwand", + {"pickaxe", "lucky"} + }, + items = {"default:coal_lump"}, + }, }, }, @@ -7441,7 +8318,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". @@ -7471,9 +8348,9 @@ Used by `minetest.register_node`. on_rightclick = function(pos, node, clicker, itemstack, pointed_thing), -- default: nil - -- Called when clicker (an ObjectRef) "rightclicks" - -- ("rightclick" here stands for the placement key) while pointing at - -- the node at pos with 'node' being the node table. + -- Called when clicker (an ObjectRef) used the 'place/build' key + -- (not neccessarily an actual rightclick) + -- while pointing at the node at pos with 'node' being the node table. -- itemstack will hold clicker's wielded item. -- Shall return the leftover itemstack. -- Note: pointed_thing can be nil, if a mod calls this function. @@ -7482,7 +8359,9 @@ Used by `minetest.register_node`. on_dig = function(pos, node, digger), -- default: minetest.node_dig - -- By default checks privileges, wears out tool and removes node. + -- By default checks privileges, wears out item (if tool) and removes node. + -- return true if the node was dug successfully, false otherwise. + -- Deprecated: returning nil is the same as returning true. on_timer = function(pos, elapsed), -- default: nil @@ -7522,6 +8401,13 @@ Used by `minetest.register_node`. -- intensity: 1.0 = mid range of regular TNT. -- If defined, called when an explosion touches the node, instead of -- removing the node. + + mod_origin = "modname", + -- stores which mod actually registered a node + -- 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" } Crafting recipes @@ -7532,11 +8418,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 = , -- replacements: replace one input item with another item on crafting @@ -7547,7 +8433,7 @@ Used by `minetest.register_craft`. { type = "shapeless", - output = 'mushrooms:mushroom_stew', + output = "mushrooms:mushroom_stew", recipe = { "mushrooms:bowl", "mushrooms:mushroom_brown", @@ -7560,10 +8446,22 @@ Used by `minetest.register_craft`. { type = "toolrepair", - additional_wear = -0.02, + additional_wear = -0.02, -- multiplier of 65536 } -Note: Tools with group `disable_repair=1` will not repairable by this recipe. +Adds a shapeless recipe for *every* tool that doesn't have the `disable_repair=1` +group. Player can put 2 equal tools in the craft grid to get one "repaired" tool +back. +The wear of the output is determined by the wear of both tools, plus a +'repair bonus' given by `additional_wear`. To reduce the wear (i.e. 'repair'), +you want `additional_wear` to be negative. + +The formula used to calculate the resulting wear is: + + 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. ### Cooking @@ -7583,6 +8481,10 @@ Note: Tools with group `disable_repair=1` will not repairable by this recipe. 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 -------------- @@ -7591,15 +8493,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. @@ -7615,13 +8519,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. @@ -7631,7 +8535,7 @@ See [Ores] section above for essential information. spread = {x = 100, y = 100, z = 100}, seed = 23, octaves = 3, - persist = 0.7 + persistence = 0.7 }, -- NoiseParams structure describing one of the perlin noises used for -- ore distribution. @@ -7648,19 +8552,19 @@ 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, spread = {x = 100, y = 100, z = 100}, seed = 47, octaves = 3, - persist = 0.7 + persistence = 0.7 }, np_puff_bottom = { offset = 4, @@ -7668,22 +8572,22 @@ See [Ores] section above for essential information. spread = {x = 100, y = 100, z = 100}, seed = 11, octaves = 3, - persist = 0.7 + persistence = 0.7 }, - -- vein + -- "vein" random_factor = 1.0, - -- stratum + -- "stratum" np_stratum_thickness = { offset = 8, scale = 4, spread = {x = 100, y = 100, z = 100}, seed = 17, octaves = 3, - persist = 0.7 + persistence = 0.7 }, - stratum_thickness = 8, + stratum_thickness = 8, -- only used if no noise defined } Biome definition @@ -7745,8 +8649,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. @@ -7786,12 +8689,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. @@ -7808,7 +8712,7 @@ See [Decoration types]. Used by `minetest.register_decoration`. spread = {x = 100, y = 100, z = 100}, seed = 354, octaves = 3, - persist = 0.7, + persistence = 0.7, lacunarity = 2.0, flags = "absvalue" }, @@ -7827,14 +8731,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 @@ -7918,6 +8821,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'. @@ -7949,6 +8853,8 @@ Used by `minetest.register_chatcommand`. func = function(name, param), -- Called when command is run. Returns boolean success and text output. + -- Special case: The help message is shown to the player if `func` + -- returns false without a text output. } Note that in params, use of symbols is as follows: @@ -8025,29 +8931,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 - -- Type of element, can be "image", "text", "statbar", "inventory" or "compass" + hud_elem_type = "image", + -- Type of element, can be "image", "text", "statbar", "inventory", + -- "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 = "", - scale = {x = 2, y = 2}, + scale = {x = 1, y = 1}, text = "", text2 = "", - 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 @@ -8056,11 +8963,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, } Particle definition @@ -8100,6 +9010,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 @@ -8121,6 +9033,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 } @@ -8129,7 +9047,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`. @@ -8138,22 +9069,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. @@ -8182,8 +9097,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. @@ -8197,8 +9115,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 ------------------------ @@ -8208,7 +9425,7 @@ Used by `HTTPApiTable.fetch` and `HTTPApiTable.fetch_async`. url = "http://example.org", timeout = 10, - -- Timeout for connection in seconds. Default is 3 seconds. + -- Timeout for request to be completed in seconds. Default depends on engine settings. method = "GET", "POST", "PUT" or "DELETE" -- The http method to use. Defaults to "GET". @@ -8300,3 +9517,10 @@ Used by `minetest.register_authentication_handler`. -- Returns an iterator (use with `for` loops) for all player names -- currently in the auth database } + +Bit Library +----------- + +Functions: bit.tobit, bit.tohex, bit.bnot, bit.band, bit.bor, bit.bxor, bit.lshift, bit.rshift, bit.arshift, bit.rol, bit.ror, bit.bswap + +See http://bitop.luajit.org/ for advanced information. diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt index 76bebe08b..a7722be6e 100644 --- a/doc/menu_lua_api.txt +++ b/doc/menu_lua_api.txt @@ -1,4 +1,4 @@ -Minetest Lua Mainmenu API Reference 5.4.0 +Minetest Lua Mainmenu API Reference 5.7.0 ========================================= Introduction @@ -43,10 +43,16 @@ core.get_max_supp_proto() core.open_url(url) ^ opens the URL in a web browser, returns false on failure. ^ Must begin with http:// or https:// +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 + Filesystem ---------- @@ -63,6 +69,8 @@ core.copy_dir(source,destination,keep_soure) (possible in async calls) ^ destination folder ^ keep_source DEFAULT true --> if set to false source is deleted after copying ^ returns true/false +core.is_dir(path) (possible in async calls) +^ returns true if path is a valid dir core.extract_zip(zipfile,destination) [unzip within path required] ^ zipfile to extract ^ destination folder to extract to @@ -79,6 +87,9 @@ core.get_video_drivers() core.get_mapgen_names([include_hidden=false]) -> table of map generator algorithms registered in the core (possible in async calls) core.get_cache_path() -> path of cache +core.get_temp_path([param]) (possible in async calls) +^ param=true: returns path to a temporary file +^ otherwise: returns path to the temporary folder HTTP Requests @@ -197,7 +208,8 @@ core.get_screen_info() display_width = , display_height = , window_width = , - window_height = + window_height = , + render_info = } @@ -207,8 +219,28 @@ Content and Packages Content - an installed mod, modpack, game, or texture pack (txt) Package - content which is downloadable from the content db, may or may not be installed. +* core.get_user_path() (possible in async calls) + * 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 + * returns path to global modpath in the user path, where mods can be installed +* core.get_modpaths() (possible in async calls) + * 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) @@ -216,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 = , path = , gamemods_path = , - name = , + title = , menuicon_path = <full path to menuicon>, author = "author", DEPRECATED: @@ -234,41 +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: - -Favorites ---------- - -core.get_favorites(location) -> list of favorites (possible in async calls) -^ location: "local" or "online" -^ returns { - [1] = { - clients = <number of clients/nil>, - clients_max = <maximum number of clients/nil>, - version = <server version/nil>, - password = <true/nil>, - creative = <true/nil>, - damage = <true/nil>, - pvp = <true/nil>, - description = <server description/nil>, - name = <server name/nil>, - address = <address of server/nil>, - port = <port> - clients_list = <array of clients/nil> - mods = <array of mods/nil> - }, - ... -} -core.delete_favorite(id, location) -> success - + { + 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 bac70fe1a..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 @@ -112,6 +110,10 @@ leveldb, and files. Migrate from current players backend to another. Possible values are sqlite3, leveldb, postgresql, dummy, and files. .TP +.B \-\-migrate-mod-storage <value> +Migrate from current mod storage backend to another. Possible values are +sqlite3, dummy, and files. +.TP .B \-\-terminal Display an interactive terminal over ncurses during execution. @@ -119,6 +121,9 @@ Display an interactive terminal over ncurses during execution. .TP .B MINETEST_SUBGAME_PATH Colon delimited list of directories to search for games. +.TP +.B MINETEST_MOD_PATH +Colon delimited list of directories to search for mods. .SH BUGS Please report all bugs at https://github.com/minetest/minetest/issues. diff --git a/doc/mkdocs/requirements.txt b/doc/mkdocs/requirements.txt new file mode 100644 index 000000000..e16265312 --- /dev/null +++ b/doc/mkdocs/requirements.txt @@ -0,0 +1,2 @@ +mkdocs~=1.3.0 +pygments~=2.12.0 diff --git a/doc/texture_packs.txt b/doc/texture_packs.txt index 8af2cbad6..2e92e56f2 100644 --- a/doc/texture_packs.txt +++ b/doc/texture_packs.txt @@ -90,9 +90,10 @@ by texture packs. All existing fallback textures can be found in the directory * `minimap_mask_square.png`: mask used for the square minimap * `minimap_overlay_round.png`: overlay texture for the round minimap * `minimap_overlay_square.png`: overlay texture for the square minimap -* `no_texture_airlike.png`: fallback inventory image for airlike nodes * `object_marker_red.png`: texture for players on the minimap * `player_marker.png`: texture for the own player on the square minimap +* `no_texture_airlike.png`: fallback inventory image for airlike nodes +* `no_texture.png`: fallback image for unspecified textures * `player.png`: front texture of the 2D upright sprite player * `player_back.png`: back texture of the 2D upright sprite player @@ -203,10 +204,13 @@ Here are targets you can choose from: | special6 | The sixth entry in the special_tiles list | | inventory | The inventory texture | | wield | The texture used when held by the player | +| align_world=N | Overrides the "world align" behaviour of tiles ¹ | Nodes support all targets, but other items only support 'inventory' and 'wield'. +¹ : `N` is an integer [0,255]. Sets align_style = "world" and scale = N on the tile, refer to lua_api.txt for details. + ### Using the special targets The special* targets only apply to specific drawtypes: diff --git a/doc/world_format.txt b/doc/world_format.txt index 73a03e5ee..17923df8e 100644 --- a/doc/world_format.txt +++ b/doc/world_format.txt @@ -1,5 +1,5 @@ ============================= -Minetest World Format 22...27 +Minetest World Format 22...29 ============================= This applies to a world format carrying the block serialization version @@ -8,6 +8,7 @@ This applies to a world format carrying the block serialization version - 0.4.0 (23) - 24 was never released as stable and existed for ~2 days - 27 was added in 0.4.15-dev +- 29 was added in 5.5.0-dev The block serialization version does not fully specify every aspect of this format; if compliance with this format is to be checked, it needs to be @@ -128,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 =================== @@ -281,6 +307,8 @@ MapBlock serialization format NOTE: Byte order is MSB first (big-endian). NOTE: Zlib data is in such a format that Python's zlib at least can directly decompress. +NOTE: Since version 29 zstd is used instead of zlib. In addition the entire + block is first serialized and then compressed (except the version byte). u8 version - map format version number, see serialisation.h for the latest number @@ -324,6 +352,23 @@ u16 lighting_complete then Minetest will correct lighting in the day light bank when the block at (1, 0, 0) is also loaded. +if map format version >= 29: + u32 timestamp + - Timestamp when last saved, as seconds from starting the game. + - 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 + u16 name_len + u8[name_len] name +if map format version < 29: + -- Nothing right here, timpstamp and node id mappings are serialized later + u8 content_width - Number of bytes in the content (param0) fields of nodes if map format version <= 23: @@ -335,7 +380,7 @@ u8 params_width - Number of bytes used for parameters per node - Always 2 -zlib-compressed node data: +node data (zlib-compressed if version < 29): if content_width == 1: - content: u8[4096]: param0 fields @@ -348,31 +393,31 @@ if content_width == 2: u8[4096]: param2 fields - The location of a node in each of those arrays is (z*16*16 + y*16 + x). -zlib-compressed node metadata list +node metadata list (zlib-compressed if version < 29): - content: -if map format version <= 22: - u16 version (=1) - u16 count of metadata - foreach count: - u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X) - u16 type_id - u16 content_size - u8[content_size] content of metadata. Format depends on type_id, see below. -if map format version >= 23: - u8 version -- Note: type was u16 for map format version <= 22 - -- = 1 for map format version < 28 - -- = 2 since map format version 28 - u16 count of metadata - foreach count: - u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X) - u32 num_vars - foreach num_vars: - u16 key_len - u8[key_len] key - u32 val_len - u8[val_len] value - u8 is_private -- only for version >= 2. 0 = not private, 1 = private - serialized inventory + if map format version <= 22: + u16 version (=1) + u16 count of metadata + foreach count: + u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X) + u16 type_id + u16 content_size + u8[content_size] content of metadata. Format depends on type_id, see below. + if map format version >= 23: + u8 version -- Note: type was u16 for map format version <= 22 + -- = 1 for map format version < 28 + -- = 2 since map format version 28 + u16 count of metadata + foreach count: + u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X) + u32 num_vars + foreach num_vars: + u16 key_len + u8[key_len] key + u32 val_len + u8[val_len] value + u8 is_private -- only for version >= 2. 0 = not private, 1 = private + serialized inventory - Node timers if map format version == 23: @@ -403,23 +448,21 @@ foreach static_object_count: u16 data_size u8[data_size] data -u32 timestamp -- Timestamp when last saved, as seconds from starting the game. -- 0xffffffff = invalid/unknown timestamp, nothing should be done with the time - difference when loaded +if map format version < 29: + u32 timestamp + - Same meaning as the timestamp further up -u8 name-id-mapping version -- Always 0 + u8 name-id-mapping version + - Always 0 -u16 num_name_id_mappings - -foreach num_name_id_mappings - u16 id - u16 name_len - u8[name_len] name + u16 num_name_id_mappings + foreach num_name_id_mappings + u16 id + u16 name_len + 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: @@ -493,19 +536,8 @@ Static objects are persistent freely moving objects in the world. Object types: 1: Test object -2: Item -3: Rat (obsolete) -4: Oerkki (obsolete) -5: Firefly (obsolete) -6: MobV2 (obsolete) 7: LuaEntity -1: Item: - u8 version - version 0: - u16 len - u8[len] itemstring - 7: LuaEntity: u8 compatibility_byte (always 1) u16 len diff --git a/fonts/DroidSansFallbackFull-LICENSE.txt b/fonts/DroidSansFallbackFull-LICENSE.txt index d3a2eaa8c..a7bf409b7 100644 --- a/fonts/DroidSansFallbackFull-LICENSE.txt +++ b/fonts/DroidSansFallbackFull-LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (C) 2008 The Android Open Source Project +Copyright (C) 2012 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/fonts/DroidSansFallbackFull.ttf b/fonts/DroidSansFallbackFull.ttf index a9df00585..0cacabedc 100644 Binary files a/fonts/DroidSansFallbackFull.ttf and b/fonts/DroidSansFallbackFull.ttf differ diff --git a/fonts/mono_dejavu_sans_10.xml b/fonts/mono_dejavu_sans_10.xml deleted file mode 100644 index 0276cedb6..000000000 Binary files a/fonts/mono_dejavu_sans_10.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_100.png b/fonts/mono_dejavu_sans_100.png deleted file mode 100644 index 45a312542..000000000 Binary files a/fonts/mono_dejavu_sans_100.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_11.xml b/fonts/mono_dejavu_sans_11.xml deleted file mode 100644 index f727ed2bb..000000000 Binary files a/fonts/mono_dejavu_sans_11.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_110.png b/fonts/mono_dejavu_sans_110.png deleted file mode 100644 index c90c0e242..000000000 Binary files a/fonts/mono_dejavu_sans_110.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_12.xml b/fonts/mono_dejavu_sans_12.xml deleted file mode 100644 index 38f6427be..000000000 Binary files a/fonts/mono_dejavu_sans_12.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_120.png b/fonts/mono_dejavu_sans_120.png deleted file mode 100644 index 0cebd70e8..000000000 Binary files a/fonts/mono_dejavu_sans_120.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_14.xml b/fonts/mono_dejavu_sans_14.xml deleted file mode 100644 index b90a34960..000000000 Binary files a/fonts/mono_dejavu_sans_14.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_140.png b/fonts/mono_dejavu_sans_140.png deleted file mode 100644 index a413759ea..000000000 Binary files a/fonts/mono_dejavu_sans_140.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_16.xml b/fonts/mono_dejavu_sans_16.xml deleted file mode 100644 index 3f7d2c2a2..000000000 Binary files a/fonts/mono_dejavu_sans_16.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_160.png b/fonts/mono_dejavu_sans_160.png deleted file mode 100644 index bd8a2f40a..000000000 Binary files a/fonts/mono_dejavu_sans_160.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_18.xml b/fonts/mono_dejavu_sans_18.xml deleted file mode 100644 index 92865cbfc..000000000 Binary files a/fonts/mono_dejavu_sans_18.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_180.png b/fonts/mono_dejavu_sans_180.png deleted file mode 100644 index a299afcbe..000000000 Binary files a/fonts/mono_dejavu_sans_180.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_20.xml b/fonts/mono_dejavu_sans_20.xml deleted file mode 100644 index acd8c77d0..000000000 Binary files a/fonts/mono_dejavu_sans_20.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_200.png b/fonts/mono_dejavu_sans_200.png deleted file mode 100644 index 68ee62681..000000000 Binary files a/fonts/mono_dejavu_sans_200.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_22.xml b/fonts/mono_dejavu_sans_22.xml deleted file mode 100644 index eafb4def6..000000000 Binary files a/fonts/mono_dejavu_sans_22.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_220.png b/fonts/mono_dejavu_sans_220.png deleted file mode 100644 index 042d7e094..000000000 Binary files a/fonts/mono_dejavu_sans_220.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_24.xml b/fonts/mono_dejavu_sans_24.xml deleted file mode 100644 index fc8b6232e..000000000 Binary files a/fonts/mono_dejavu_sans_24.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_240.png b/fonts/mono_dejavu_sans_240.png deleted file mode 100644 index d2d68c5bb..000000000 Binary files a/fonts/mono_dejavu_sans_240.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_26.xml b/fonts/mono_dejavu_sans_26.xml deleted file mode 100644 index 829f09948..000000000 Binary files a/fonts/mono_dejavu_sans_26.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_260.png b/fonts/mono_dejavu_sans_260.png deleted file mode 100644 index 3a8cb6c57..000000000 Binary files a/fonts/mono_dejavu_sans_260.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_28.xml b/fonts/mono_dejavu_sans_28.xml deleted file mode 100644 index b5b25bd07..000000000 Binary files a/fonts/mono_dejavu_sans_28.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_280.png b/fonts/mono_dejavu_sans_280.png deleted file mode 100644 index ccf62ba48..000000000 Binary files a/fonts/mono_dejavu_sans_280.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_4.xml b/fonts/mono_dejavu_sans_4.xml deleted file mode 100644 index cfebb39b3..000000000 Binary files a/fonts/mono_dejavu_sans_4.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_40.png b/fonts/mono_dejavu_sans_40.png deleted file mode 100644 index 24ed693f7..000000000 Binary files a/fonts/mono_dejavu_sans_40.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_6.xml b/fonts/mono_dejavu_sans_6.xml deleted file mode 100644 index d0e1de21d..000000000 Binary files a/fonts/mono_dejavu_sans_6.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_60.png b/fonts/mono_dejavu_sans_60.png deleted file mode 100644 index 326af996f..000000000 Binary files a/fonts/mono_dejavu_sans_60.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_8.xml b/fonts/mono_dejavu_sans_8.xml deleted file mode 100644 index c48bf7ccc..000000000 Binary files a/fonts/mono_dejavu_sans_8.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_80.png b/fonts/mono_dejavu_sans_80.png deleted file mode 100644 index 04326dbb2..000000000 Binary files a/fonts/mono_dejavu_sans_80.png and /dev/null differ diff --git a/fonts/mono_dejavu_sans_9.xml b/fonts/mono_dejavu_sans_9.xml deleted file mode 100644 index 74e841034..000000000 Binary files a/fonts/mono_dejavu_sans_9.xml and /dev/null differ diff --git a/fonts/mono_dejavu_sans_90.png b/fonts/mono_dejavu_sans_90.png deleted file mode 100644 index 65ac51858..000000000 Binary files a/fonts/mono_dejavu_sans_90.png and /dev/null differ 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/README.md b/games/devtest/README.md index 8b71da625..77e722af7 100644 --- a/games/devtest/README.md +++ b/games/devtest/README.md @@ -23,7 +23,6 @@ Basically, just create a world and start. A few important things to note: * Use the `/infplace` command to toggle infinite node placement in-game * Use the Param2 Tool to change the param2 of nodes; it's useful to experiment with the various drawtype test nodes * Check out the game settings and server commands for additional tests and features -* Creative Mode does nothing (apart from default engine behavior) Confused by a certain node or item? Check out for inline code comments. The usages of most tools are explained in their tooltips. 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/menu/background.png b/games/devtest/menu/background.png index 415bb3d14..89c45fcd5 100644 Binary files a/games/devtest/menu/background.png and b/games/devtest/menu/background.png differ diff --git a/games/devtest/mods/basenodes/init.lua b/games/devtest/mods/basenodes/init.lua index 7ffbadbea..2c808c35e 100644 --- a/games/devtest/mods/basenodes/init.lua +++ b/games/devtest/mods/basenodes/init.lua @@ -1,4 +1,4 @@ -local WATER_ALPHA = 160 +local WATER_ALPHA = "^[opacity:" .. 160 local WATER_VISC = 1 local LAVA_VISC = 7 @@ -127,12 +127,13 @@ minetest.register_node("basenodes:water_source", { description = "Water Source".."\n".. "Drowning damage: 1", drawtype = "liquid", - tiles = {"default_water.png"}, + waving = 3, + tiles = {"default_water.png"..WATER_ALPHA}, special_tiles = { - {name = "default_water.png", backface_culling = false}, - {name = "default_water.png", backface_culling = true}, + {name = "default_water.png"..WATER_ALPHA, backface_culling = false}, + {name = "default_water.png"..WATER_ALPHA, backface_culling = true}, }, - alpha = WATER_ALPHA, + use_texture_alpha = "blend", paramtype = "light", walkable = false, pointable = false, @@ -152,12 +153,15 @@ minetest.register_node("basenodes:water_flowing", { description = "Flowing Water".."\n".. "Drowning damage: 1", drawtype = "flowingliquid", + waving = 3, tiles = {"default_water_flowing.png"}, special_tiles = { - {name = "default_water_flowing.png", backface_culling = false}, - {name = "default_water_flowing.png", backface_culling = false}, + {name = "default_water_flowing.png"..WATER_ALPHA, + backface_culling = false}, + {name = "default_water_flowing.png"..WATER_ALPHA, + backface_culling = false}, }, - alpha = WATER_ALPHA, + use_texture_alpha = "blend", paramtype = "light", paramtype2 = "flowingliquid", walkable = false, @@ -178,12 +182,13 @@ minetest.register_node("basenodes:river_water_source", { description = "River Water Source".."\n".. "Drowning damage: 1", drawtype = "liquid", - tiles = { "default_river_water.png" }, + waving = 3, + tiles = { "default_river_water.png"..WATER_ALPHA }, special_tiles = { - {name = "default_river_water.png", backface_culling = false}, - {name = "default_river_water.png", backface_culling = true}, + {name = "default_river_water.png"..WATER_ALPHA, backface_culling = false}, + {name = "default_river_water.png"..WATER_ALPHA, backface_culling = true}, }, - alpha = WATER_ALPHA, + use_texture_alpha = "blend", paramtype = "light", walkable = false, pointable = false, @@ -205,12 +210,15 @@ minetest.register_node("basenodes:river_water_flowing", { description = "Flowing River Water".."\n".. "Drowning damage: 1", drawtype = "flowingliquid", - tiles = {"default_river_water_flowing.png"}, + waving = 3, + tiles = {"default_river_water_flowing.png"..WATER_ALPHA}, special_tiles = { - {name = "default_river_water_flowing.png", backface_culling = false}, - {name = "default_river_water_flowing.png", backface_culling = false}, + {name = "default_river_water_flowing.png"..WATER_ALPHA, + backface_culling = false}, + {name = "default_river_water_flowing.png"..WATER_ALPHA, + backface_culling = false}, }, - alpha = WATER_ALPHA, + use_texture_alpha = "blend", paramtype = "light", paramtype2 = "flowingliquid", walkable = false, diff --git a/games/devtest/mods/basenodes/textures/default_dirt.png b/games/devtest/mods/basenodes/textures/default_dirt.png index 58670305d..aa75bffb6 100644 Binary files a/games/devtest/mods/basenodes/textures/default_dirt.png and b/games/devtest/mods/basenodes/textures/default_dirt.png differ diff --git a/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt b/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt deleted file mode 100644 index 8db21ed9c..000000000 --- a/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is for testing loading textures from subfolders. -If it works correctly, the default_grass_side.png file in this folder is used but -default_grass.png is not overwritten by the file in this folder. diff --git a/games/devtest/mods/basenodes/textures/info.txt b/games/devtest/mods/basenodes/textures/info.txt new file mode 100644 index 000000000..2d4ef7efa --- /dev/null +++ b/games/devtest/mods/basenodes/textures/info.txt @@ -0,0 +1,7 @@ + +The dirt_with_grass folder is for testing loading textures from subfolders. +If it works correctly, the default_grass_side.png file in the folder is used but +default_grass.png is not overwritten by the file in the folder. + +default_dirt.png should be overwritten by the default_dirt.png in the unittests +mod which depends on basenodes. diff --git a/games/devtest/mods/basetools/init.lua b/games/devtest/mods/basetools/init.lua index e4a36ca46..3ec69d39f 100644 --- a/games/devtest/mods/basetools/init.lua +++ b/games/devtest/mods/basetools/init.lua @@ -6,7 +6,7 @@ Tool types: -* Hand: basic tool/weapon (just for convenience, not optimized for testing) +* Hand: basic tool/weapon (special capabilities in creative mode) * Pickaxe: dig cracky * Axe: dig choppy * Shovel: dig crumbly @@ -16,29 +16,57 @@ Tool types: Tool materials: -* Dirt: dig nodes of rating 3, one use only * Wood: dig nodes of rating 3 * Stone: dig nodes of rating 3 or 2 * Steel: dig nodes of rating 3, 2 or 1 * Mese: dig "everything" instantly +* n-Uses: can be used n times before breaking ]] -- The hand -minetest.register_item(":", { - type = "none", - wield_image = "wieldhand.png", - wield_scale = {x=1,y=1,z=2.5}, - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level = 0, - groupcaps = { - crumbly = {times={[3]=1.50}, uses=0, maxlevel=0}, - snappy = {times={[3]=1.50}, uses=0, maxlevel=0}, - oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=2.00}, uses=0, maxlevel=0}, - }, - damage_groups = {fleshy=1}, - } -}) +if minetest.settings:get_bool("creative_mode") then + local digtime = 42 + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} + + minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x = 1, y = 1, z = 2.5}, + range = 10, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = caps, + cracky = caps, + snappy = caps, + choppy = caps, + oddly_breakable_by_hand = caps, + -- dig_immediate group doesn't use value 1. Value 3 is instant dig + dig_immediate = + {times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256}, + }, + damage_groups = {fleshy = 10}, + } + }) +else + minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x = 1, y = 1, z = 2.5}, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = {times = {[2] = 3.00, [3] = 0.70}, uses = 0, maxlevel = 1}, + snappy = {times = {[3] = 0.40}, uses = 0, maxlevel = 1}, + oddly_breakable_by_hand = + {times = {[1] = 3.50, [2] = 2.00, [3] = 0.70}, uses = 0} + }, + damage_groups = {fleshy = 1}, + } + }) +end -- Mese Pickaxe: special tool that digs "everything" instantly minetest.register_tool("basetools:pick_mese", { @@ -64,20 +92,6 @@ minetest.register_tool("basetools:pick_mese", { -- Pickaxes: Dig cracky -- --- This should break after only 1 use -minetest.register_tool("basetools:pick_dirt", { - description = "Dirt Pickaxe".."\n".. - "Digs cracky=3".."\n".. - "1 use only", - inventory_image = "basetools_dirtpick.png", - tool_capabilities = { - max_drop_level=0, - groupcaps={ - cracky={times={[3]=2.00}, uses=1, maxlevel=0} - }, - }, -}) - minetest.register_tool("basetools:pick_wood", { description = "Wooden Pickaxe".."\n".. "Digs cracky=3", @@ -265,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".. @@ -320,3 +419,31 @@ minetest.register_tool("basetools:dagger_steel", { damage_groups = {fleshy=2}, } }) + +-- Test tool uses and punch_attack_uses +local uses = { 1, 2, 3, 5, 10, 50, 100, 1000, 10000, 65535 } +for i=1, #uses do + local u = uses[i] + local color = string.format("#FF00%02X", math.floor(((i-1)/#uses) * 255)) + minetest.register_tool("basetools:pick_uses_"..string.format("%05d", u), { + description = u.."-Uses Pickaxe".."\n".. + "Digs cracky=3", + inventory_image = "basetools_usespick.png^[colorize:"..color..":127", + tool_capabilities = { + max_drop_level=0, + groupcaps={ + cracky={times={[3]=0.1, [2]=0.2, [1]=0.3}, uses=u, maxlevel=0} + }, + }, + }) + + minetest.register_tool("basetools:sword_uses_"..string.format("%05d", u), { + description = u.."-Uses Sword".."\n".. + "Damage: fleshy=1", + inventory_image = "basetools_usessword.png^[colorize:"..color..":127", + tool_capabilities = { + damage_groups = {fleshy=1}, + punch_attack_uses = u, + }, + }) +end 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_bloodsword.png differ diff --git a/games/devtest/mods/basetools/textures/basetools_dirtpick.png b/games/devtest/mods/basetools/textures/basetools_dirtpick.png deleted file mode 100644 index 20a021d72..000000000 Binary files a/games/devtest/mods/basetools/textures/basetools_dirtpick.png and /dev/null 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_elementalsword.png 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 Binary files a/games/devtest/mods/basetools/textures/basetools_firesword.png and b/games/devtest/mods/basetools/textures/basetools_firesword.png 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_healdagger.png 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_healsword.png 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 Binary files a/games/devtest/mods/basetools/textures/basetools_icesword.png and b/games/devtest/mods/basetools/textures/basetools_icesword.png 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 Binary files a/games/devtest/mods/basetools/textures/basetools_mesepick.png and b/games/devtest/mods/basetools/textures/basetools_mesepick.png 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_mesesword.png 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_superhealsword.png 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_titaniumsword.png 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_usespick.png 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_usessword.png 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 Binary files /dev/null and b/games/devtest/mods/basetools/textures/basetools_wooddagger.png differ diff --git a/games/devtest/mods/broken/init.lua b/games/devtest/mods/broken/init.lua new file mode 100644 index 000000000..04993ca16 --- /dev/null +++ b/games/devtest/mods/broken/init.lua @@ -0,0 +1,11 @@ +-- Register stuff with empty definitions to test if Minetest fallback options +-- for these things work properly. + +-- The itemstrings are deliberately kept descriptive to keep them easy to +-- recognize. + +minetest.register_node("broken:node_with_empty_definition", {}) +minetest.register_tool("broken:tool_with_empty_definition", {}) +minetest.register_craftitem("broken:craftitem_with_empty_definition", {}) + +minetest.register_entity("broken:entity_with_empty_definition", {}) diff --git a/games/devtest/mods/broken/mod.conf b/games/devtest/mods/broken/mod.conf new file mode 100644 index 000000000..a24378a34 --- /dev/null +++ b/games/devtest/mods/broken/mod.conf @@ -0,0 +1,2 @@ +name = broken +description = Register items and an entity with empty definitions to test fallback diff --git a/games/devtest/mods/chest/init.lua b/games/devtest/mods/chest/init.lua index fc92bfdd1..5798c13e7 100644 --- a/games/devtest/mods/chest/init.lua +++ b/games/devtest/mods/chest/init.lua @@ -23,6 +23,18 @@ minetest.register_node("chest:chest", { local inv = meta:get_inventory() return inv:is_empty("main") end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.chat_send_player(player:get_player_name(), "Allow put: " .. stack:to_string()) + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.chat_send_player(player:get_player_name(), "Allow take: " .. stack:to_string()) + return stack:get_count() + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.chat_send_player(player:get_player_name(), "On put: " .. stack:to_string()) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.chat_send_player(player:get_player_name(), "On take: " .. stack:to_string()) + end, }) - - diff --git a/games/devtest/mods/experimental/commands.lua b/games/devtest/mods/experimental/commands.lua index 158e5039d..e42ae954d 100644 --- a/games/devtest/mods/experimental/commands.lua +++ b/games/devtest/mods/experimental/commands.lua @@ -131,10 +131,11 @@ local function place_nodes(param) p2_max = 63 elseif def.paramtype2 == "leveled" then p2_max = 127 - elseif def.paramtype2 == "degrotate" and def.drawtype == "plantlike" then - p2_max = 179 + elseif def.paramtype2 == "degrotate" and (def.drawtype == "plantlike" or def.drawtype == "mesh") then + p2_max = 239 elseif def.paramtype2 == "colorfacedir" or def.paramtype2 == "colorwallmounted" or + def.paramtype2 == "colordegrotate" or def.paramtype2 == "color" then p2_max = 255 end @@ -143,7 +144,8 @@ local function place_nodes(param) -- Skip undefined param2 values if not ((def.paramtype2 == "meshoptions" and p2 % 8 > 4) or (def.paramtype2 == "colorwallmounted" and p2 % 8 > 5) or - (def.paramtype2 == "colorfacedir" and p2 % 32 > 23)) then + ((def.paramtype2 == "colorfacedir" or def.paramtype2 == "colordegrotate") + and p2 % 32 > 23)) then minetest.set_node(pos, { name = itemstring, param2 = p2 }) nodes_placed = nodes_placed + 1 @@ -214,3 +216,6 @@ minetest.register_chatcommand("test_place_nodes", { end, }) +core.register_on_chatcommand(function(name, command, params) + minetest.log("action", "caught command '"..command.."', issued by '"..name.."'. Parameters: '"..params.."'") +end) diff --git a/games/devtest/mods/soundstuff/init.lua b/games/devtest/mods/soundstuff/init.lua index 40ad8f562..b263a3f35 100644 --- a/games/devtest/mods/soundstuff/init.lua +++ b/games/devtest/mods/soundstuff/init.lua @@ -60,11 +60,13 @@ minetest.register_node("soundstuff:footstep_liquid", { description = "Liquid Footstep Sound Node", drawtype = "liquid", tiles = { - "soundstuff_node_sound.png^[colorize:#0000FF:127", + "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190", }, special_tiles = { - {name = "soundstuff_node_sound.png^[colorize:#0000FF:127", backface_culling = false}, - {name = "soundstuff_node_sound.png^[colorize:#0000FF:127", backface_culling = true}, + {name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190", + backface_culling = false}, + {name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190", + backface_culling = true}, }, liquids_pointable = true, liquidtype = "source", @@ -73,7 +75,7 @@ minetest.register_node("soundstuff:footstep_liquid", { liquid_renewable = false, liquid_range = 0, liquid_viscosity = 0, - alpha = 190, + use_texture_alpha = "blend", paramtype = "light", walkable = false, pointable = false, @@ -92,7 +94,6 @@ minetest.register_node("soundstuff:footstep_climbable", { tiles = { "soundstuff_node_climbable.png", }, - alpha = 120, paramtype = "light", sunlight_propagates = true, walkable = false, 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 711079f87..a212fbfbe 100644 --- a/games/devtest/mods/testentities/callbacks.lua +++ b/games/devtest/mods/testentities/callbacks.lua @@ -31,6 +31,9 @@ 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, 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) message( diff --git a/games/devtest/mods/testentities/textures/testentities_armorball.png b/games/devtest/mods/testentities/textures/testentities_armorball.png index 88147bd1f..708c7b36d 100644 Binary files a/games/devtest/mods/testentities/textures/testentities_armorball.png and b/games/devtest/mods/testentities/textures/testentities_armorball.png differ diff --git a/games/devtest/mods/testentities/visuals.lua b/games/devtest/mods/testentities/visuals.lua index 8848ba49f..e382ec44c 100644 --- a/games/devtest/mods/testentities/visuals.lua +++ b/games/devtest/mods/testentities/visuals.lua @@ -94,3 +94,44 @@ minetest.register_entity("testentities:upright_animated", { self.object:set_sprite({x=0, y=0}, 4, 1.0, false) end, }) + +minetest.register_entity("testentities:nametag", { + initial_properties = { + visual = "sprite", + textures = { "testentities_sprite.png" }, + }, + + on_activate = function(self, staticdata) + if staticdata ~= "" then + local data = minetest.deserialize(staticdata) + self.color = data.color + self.bgcolor = data.bgcolor + else + self.color = { + r = math.random(0, 255), + g = math.random(0, 255), + b = math.random(0, 255), + } + + if math.random(0, 10) > 5 then + self.bgcolor = { + r = math.random(0, 255), + g = math.random(0, 255), + b = math.random(0, 255), + a = math.random(0, 255), + } + end + end + + assert(self.color) + self.object:set_properties({ + nametag = tostring(math.random(1000, 10000)), + nametag_color = self.color, + nametag_bgcolor = self.bgcolor, + }) + end, + + get_staticdata = function(self) + return minetest.serialize({ color = self.color, bgcolor = self.bgcolor }) + end, +}) diff --git a/games/devtest/mods/testfood/init.lua b/games/devtest/mods/testfood/init.lua index a6236ff68..39b121306 100644 --- a/games/devtest/mods/testfood/init.lua +++ b/games/devtest/mods/testfood/init.lua @@ -22,3 +22,10 @@ minetest.register_craftitem("testfood:bad5", { on_use = minetest.item_eat(-5), }) +minetest.register_craftitem("testfood:replace1", { + description = S("Replacing Food (+1)").."\n".. + S("Replaced with 'Good Food (+1)' when eaten"), + inventory_image = "testfood_replace.png", + on_use = minetest.item_eat(1, "testfood:good1"), +}) + diff --git a/games/devtest/mods/testfood/textures/testfood_replace.png b/games/devtest/mods/testfood/textures/testfood_replace.png new file mode 100644 index 000000000..1ef6876e5 Binary files /dev/null and b/games/devtest/mods/testfood/textures/testfood_replace.png differ diff --git a/games/devtest/mods/testformspec/LICENSE.txt b/games/devtest/mods/testformspec/LICENSE.txt new file mode 100644 index 000000000..07696cc30 --- /dev/null +++ b/games/devtest/mods/testformspec/LICENSE.txt @@ -0,0 +1,14 @@ +License of media files +---------------------- +Content imported from minetest_game. + + +BlockMen (CC BY-SA 3.0) + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png + +stujones11 (CC BY-SA 3.0) +An0n3m0us (CC BY-SA 3.0) + testformspec_character.b3d diff --git a/games/devtest/mods/testformspec/formspec.lua b/games/devtest/mods/testformspec/formspec.lua index 87a05fc96..5f1f8970e 100644 --- a/games/devtest/mods/testformspec/formspec.lua +++ b/games/devtest/mods/testformspec/formspec.lua @@ -33,6 +33,34 @@ local tabheaders_fs = [[ tabheader[8,6;10,1.5;tabs_size2;Height=1.5;1;false;false] ]] +local inv_style_fs = [[ + style_type[list;noclip=true] + list[current_player;main;-0.75,0.75;2,2] + + real_coordinates[false] + list[current_player;main;1.5,0;3,2] + real_coordinates[true] + + real_coordinates[false] + style_type[list;size=1.1;spacing=0.1] + list[current_player;main;5,0;3,2] + real_coordinates[true] + + style_type[list;size=.001;spacing=0] + list[current_player;main;7,3.5;8,4] + + box[3,3.5;1,1;#000000] + box[5,3.5;1,1;#000000] + box[4,4.5;1,1;#000000] + box[3,5.5;1,1;#000000] + box[5,5.5;1,1;#000000] + style_type[list;spacing=.25,.125;size=.75,.875] + list[current_player;main;3,3.5;3,3] + + style_type[list;spacing=0;size=1.1] + list[current_player;main;.5,7;8,4] +]] + local hypertext_basic = [[ <bigger>Normal test</bigger> This is a normal text. @@ -167,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] @@ -199,6 +229,7 @@ local scroll_fs = "box[1,1;8,6;#00aa]".. "scroll_container[1,1;8,6;scrbar;vertical]".. "button[0,1;1,1;lorem;Lorem]".. + "animated_image[0,1;4.5,1;clip_animated_image;testformspec_animation.png;4;100]" .. "button[0,10;1,1;ipsum;Ipsum]".. "pwdfield[2,2;1,1;lorem2;Lorem]".. "list[current_player;main;4,4;1,5;]".. @@ -211,6 +242,8 @@ local scroll_fs = "tooltip[0,11;3,2;Buz;#f00;#000]".. "box[0,11;3,2;#00ff00]".. "hypertext[3,13;3,3;;" .. hypertext_basic .. "]" .. + "hypertext[3,17;3,3;;Hypertext with no scrollbar\\; the scroll container should scroll.]" .. + "textarea[3,21;3,1;textarea;;More scroll within scroll]" .. "container[0,18]".. "box[1,2;3,2;#0a0a]".. "scroll_container[1,2;3,2;scrbar2;horizontal;0.06]".. @@ -239,6 +272,16 @@ local scroll_fs = --style_type[label;border=;bgcolor=] --label[0.75,2;Reset] +local window = { + sizex = 12, + sizey = 13, + positionx = 0.5, + positiony = 0.5, + anchorx = 0.5, + anchory = 0.5, + paddingx = 0.05, + paddingy = 0.05 +} local pages = { -- Real Coordinates @@ -310,14 +353,40 @@ local pages = { "size[12,13]real_coordinates[true]" .. "container[0.5,1.5]" .. tabheaders_fs .. "container_end[]", + -- Inv + "size[12,13]real_coordinates[true]" .. inv_style_fs, + + -- Window + function() + return "formspec_version[3]" .. + string.format("size[%s,%s]position[%s,%s]anchor[%s,%s]padding[%s,%s]", + window.sizex, window.sizey, window.positionx, window.positiony, + window.anchorx, window.anchory, window.paddingx, window.paddingy) .. + string.format("field[0.5,0.5;2.5,0.5;sizex;X Size;%s]field[3.5,0.5;2.5,0.5;sizey;Y Size;%s]" .. + "field[0.5,1.5;2.5,0.5;positionx;X Position;%s]field[3.5,1.5;2.5,0.5;positiony;Y Position;%s]" .. + "field[0.5,2.5;2.5,0.5;anchorx;X Anchor;%s]field[3.5,2.5;2.5,0.5;anchory;Y Anchor;%s]" .. + "field[0.5,3.5;2.5,0.5;paddingx;X Padding;%s]field[3.5,3.5;2.5,0.5;paddingy;Y Padding;%s]" .. + "button[2,4.5;2.5,0.5;submit_window;Submit]", + window.sizex, window.sizey, window.positionx, window.positiony, + window.anchorx, window.anchory, window.paddingx, window.paddingy) .. + "field_close_on_enter[sizex;false]field_close_on_enter[sizey;false]" .. + "field_close_on_enter[positionx;false]field_close_on_enter[positiony;false]" .. + "field_close_on_enter[anchorx;false]field_close_on_enter[anchory;false]" .. + "field_close_on_enter[paddingx;false]field_close_on_enter[paddingy;false]" + end, + -- 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] @@ -327,17 +396,83 @@ Number] animated_image[3,4.25;1,1;;testformspec_animation.png;4;0;3] animated_image[5.5,0.5;5,2;;testformspec_animation.png;4;100] animated_image[5.5,2.75;5,2;;testformspec_animation.jpg;4;100] + + ]], + + -- Model + [[ + formspec_version[3] + size[12,13] + style[m1;bgcolor=black] + style[m2;bgcolor=black] + label[5,1;all defaults] + label[5,5.1;angle = 0, 180 +continuous = false +mouse control = false +frame loop range = 0,30] + label[5,9.2;continuous = true +mouse control = true] + model[0.5,0.1;4,4;m1;testformspec_character.b3d;testformspec_character.png] + model[0.5,4.2;4,4;m2;testformspec_character.b3d;testformspec_character.png;0,180;false;false;0,30] + model[0.5,8.3;4,4;m3;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true] ]], -- Scroll containers "formspec_version[3]size[12,13]" .. scroll_fs, + + -- Sound + [[ + formspec_version[3] + size[12,13] + style[snd_btn;sound=soundstuff_mono] + style[snd_ibtn;sound=soundstuff_mono] + style[snd_drp;sound=soundstuff_mono] + style[snd_chk;sound=soundstuff_mono] + style[snd_tab;sound=soundstuff_mono] + button[0.5,0.5;2,1;snd_btn;Sound] + image_button[0.5,2;2,1;testformspec_item.png;snd_ibtn;Sound] + dropdown[0.5,4;4;snd_drp;Sound,Two,Three;] + 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 function show_test_formspec(pname, page_id) - page_id = page_id or 2 +local page_id = 2 +local function show_test_formspec(pname) + local page = pages[page_id] + if type(page) == "function" then + page = page() + end - local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Anim,ScrollC;" .. 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 @@ -347,9 +482,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return false end - if fields.maintabs then - show_test_formspec(player:get_player_name(), tonumber(fields.maintabs)) + page_id = tonumber(fields.maintabs) + show_test_formspec(player:get_player_name()) return true end @@ -365,6 +500,26 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.chat_send_player(player:get_player_name(), "Hypertext action received: " .. tostring(fields.hypertext)) return true end + + for name, value in pairs(fields) do + if window[name] then + print(name, window[name]) + local num_val = tonumber(value) or 0 + + if name == "sizex" and num_val < 4 then + num_val = 6.5 + elseif name == "sizey" and num_val < 5 then + num_val = 5.5 + end + + window[name] = num_val + print(name, window[name]) + end + end + + if fields.submit_window then + show_test_formspec(player:get_player_name()) + end end) minetest.register_chatcommand("test_formspec", { diff --git a/games/devtest/mods/testformspec/models/testformspec_character.b3d b/games/devtest/mods/testformspec/models/testformspec_character.b3d new file mode 100644 index 000000000..8edbaf637 Binary files /dev/null and b/games/devtest/mods/testformspec/models/testformspec_character.b3d differ diff --git a/games/devtest/mods/testformspec/models/testformspec_chest.obj b/games/devtest/mods/testformspec/models/testformspec_chest.obj new file mode 100644 index 000000000..72ba175a0 --- /dev/null +++ b/games/devtest/mods/testformspec/models/testformspec_chest.obj @@ -0,0 +1,79 @@ +# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' +# www.blender.org +o Top_Cube.002_None_Top_Cube.002_None_bottom +v -0.500000 0.408471 0.720970 +v -0.500000 1.115578 0.013863 +v -0.500000 0.894607 -0.207108 +v -0.500000 0.187501 0.499999 +v 0.500000 1.115578 0.013863 +v 0.500000 0.408471 0.720970 +v 0.500000 0.187501 0.499999 +v 0.500000 0.894607 -0.207108 +v -0.500000 0.187500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 0.0000 0.6875 +vt 1.0000 1.0000 +vt 0.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.6875 +vt 0.0000 0.6875 +vt 0.0000 0.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 1.0000 -0.0000 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top +s off +f 6/1/1 5/2/1 2/3/1 1/4/1 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom +f 11/5/2 10/6/2 14/7/2 13/8/2 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left +f 1/9/3 2/10/3 3/11/3 4/12/3 +f 5/13/4 6/1/4 7/14/4 8/15/4 +f 4/12/3 9/16/3 10/17/3 11/18/3 +f 12/19/4 7/14/4 13/8/4 14/20/4 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back +f 6/21/5 1/9/5 4/12/5 7/22/5 +f 7/22/6 4/12/6 11/18/6 13/23/6 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front +f 2/10/7 5/24/7 8/25/7 3/11/7 +f 9/16/8 12/26/8 14/27/8 10/17/8 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside +f 4/28/9 3/29/9 8/30/9 7/31/9 +f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/games/devtest/mods/testformspec/textures/default_chest_front.png b/games/devtest/mods/testformspec/textures/default_chest_front.png new file mode 100644 index 000000000..85227d8fd Binary files /dev/null and b/games/devtest/mods/testformspec/textures/default_chest_front.png differ diff --git a/games/devtest/mods/testformspec/textures/default_chest_inside.png b/games/devtest/mods/testformspec/textures/default_chest_inside.png new file mode 100644 index 000000000..5f7b6b132 Binary files /dev/null and b/games/devtest/mods/testformspec/textures/default_chest_inside.png differ diff --git a/games/devtest/mods/testformspec/textures/default_chest_side.png b/games/devtest/mods/testformspec/textures/default_chest_side.png new file mode 100644 index 000000000..44a65a43d Binary files /dev/null and b/games/devtest/mods/testformspec/textures/default_chest_side.png differ diff --git a/games/devtest/mods/testformspec/textures/default_chest_top.png b/games/devtest/mods/testformspec/textures/default_chest_top.png new file mode 100644 index 000000000..f4a92ee07 Binary files /dev/null and b/games/devtest/mods/testformspec/textures/default_chest_top.png differ 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 Binary files /dev/null and b/games/devtest/mods/testformspec/textures/testformspec_9slice.png differ diff --git a/games/devtest/mods/testformspec/textures/testformspec_character.png b/games/devtest/mods/testformspec/textures/testformspec_character.png new file mode 100644 index 000000000..05021781e Binary files /dev/null and b/games/devtest/mods/testformspec/textures/testformspec_character.png differ diff --git a/games/devtest/mods/testhud/init.lua b/games/devtest/mods/testhud/init.lua new file mode 100644 index 000000000..2fa12fd71 --- /dev/null +++ b/games/devtest/mods/testhud/init.lua @@ -0,0 +1,81 @@ +local player_huds = {} + +local states = { + {0, "Normal font"}, + {1, "Bold font"}, + {2, "Italic font"}, + {3, "Bold and italic font"}, + {4, "Monospace font"}, + {5, "Bold and monospace font"}, + {7, "ZOMG all the font styles"}, +} + + +local default_def = { + hud_elem_type = "text", + position = {x = 0.5, y = 0.5}, + scale = {x = 2, y = 2}, + alignment = { x = 0, y = 0 }, +} + +local function add_hud(player, state) + local def = table.copy(default_def) + local statetbl = states[state] + def.offset = {x = 0, y = 32 * state} + def.style = statetbl[1] + def.text = statetbl[2] + return player:hud_add(def) +end + +minetest.register_on_leaveplayer(function(player) + player_huds[player:get_player_name()] = nil +end) + +local etime = 0 +local state = 0 + +minetest.register_globalstep(function(dtime) + etime = etime + dtime + if etime < 1 then + return + end + etime = 0 + for _, player in ipairs(minetest.get_connected_players()) do + local huds = player_huds[player:get_player_name()] + if huds then + for i, hud_id in ipairs(huds) do + local statetbl = states[(state + i) % #states + 1] + player:hud_change(hud_id, "style", statetbl[1]) + player:hud_change(hud_id, "text", statetbl[2]) + end + end + end + state = state + 1 +end) + +minetest.register_chatcommand("hudfonts", { + params = "", + description = "Show/Hide some text on the HUD with various font options", + func = function(name, param) + local player = minetest.get_player_by_name(name) + local param = tonumber(param) or 0 + param = math.min(math.max(param, 1), #states) + if player_huds[name] == nil then + player_huds[name] = {} + for i = 1, param do + table.insert(player_huds[name], add_hud(player, i)) + end + minetest.chat_send_player(name, ("%d HUD element(s) added."):format(param)) + else + local huds = player_huds[name] + if huds then + for _, hud_id in ipairs(huds) do + player:hud_remove(hud_id) + end + minetest.chat_send_player(name, "All HUD elements removed.") + end + player_huds[name] = nil + end + return true + end, +}) diff --git a/games/devtest/mods/testhud/mod.conf b/games/devtest/mods/testhud/mod.conf new file mode 100644 index 000000000..ed9f65c59 --- /dev/null +++ b/games/devtest/mods/testhud/mod.conf @@ -0,0 +1,2 @@ +name = testhud +description = For testing HUD functionality 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 Binary files /dev/null and b/games/devtest/mods/testitems/textures/testitems_overlay_base.png 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 Binary files /dev/null and b/games/devtest/mods/testitems/textures/testitems_overlay_overlay.png differ diff --git a/games/devtest/mods/testnodes/drawtypes.lua b/games/devtest/mods/testnodes/drawtypes.lua index 82d862819..208774f6c 100644 --- a/games/devtest/mods/testnodes/drawtypes.lua +++ b/games/devtest/mods/testnodes/drawtypes.lua @@ -15,22 +15,6 @@ testing this node easier and more convenient. local S = minetest.get_translator("testnodes") --- If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0. --- This is due to <https://github.com/minetest/minetest/issues/9209>. --- This is only added to make the items more visible to avoid confusion, but you will no longer see --- the default inventory images for these items. When you want to test the default inventory image of drawtypes, --- this should be turned off. --- TODO: Remove support for fallback inventory image as soon #9209 is fixed. -local SHOW_FALLBACK_IMAGE = minetest.settings:get_bool("testnodes_show_fallback_image", false) - -local fallback_image = function(img) - if SHOW_FALLBACK_IMAGE then - return img - else - return nil - end -end - -- A regular cube minetest.register_node("testnodes:normal", { description = S("Normal Drawtype Test Node"), @@ -145,6 +129,18 @@ minetest.register_node("testnodes:fencelike", { }) minetest.register_node("testnodes:torchlike", { + description = S("Floor Torchlike Drawtype Test Node"), + drawtype = "torchlike", + paramtype = "light", + tiles = { "testnodes_torchlike_floor.png^[colorize:#FF0000:64" }, + + + walkable = false, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:torchlike_wallmounted", { description = S("Wallmounted Torchlike Drawtype Test Node"), drawtype = "torchlike", paramtype = "light", @@ -159,10 +155,22 @@ minetest.register_node("testnodes:torchlike", { walkable = false, sunlight_propagates = true, groups = { dig_immediate = 3 }, - inventory_image = fallback_image("testnodes_torchlike_floor.png"), }) minetest.register_node("testnodes:signlike", { + description = S("Floor Signlike Drawtype Test Node"), + drawtype = "signlike", + paramtype = "light", + tiles = { "testnodes_signlike.png^[colorize:#FF0000:64" }, + + + walkable = false, + groups = { dig_immediate = 3 }, + sunlight_propagates = true, +}) + + +minetest.register_node("testnodes:signlike_wallmounted", { description = S("Wallmounted Signlike Drawtype Test Node"), drawtype = "signlike", paramtype = "light", @@ -173,7 +181,6 @@ minetest.register_node("testnodes:signlike", { walkable = false, groups = { dig_immediate = 3 }, sunlight_propagates = true, - inventory_image = fallback_image("testnodes_signlike.png"), }) minetest.register_node("testnodes:plantlike", { @@ -201,9 +208,46 @@ minetest.register_node("testnodes:plantlike_waving", { groups = { dig_immediate = 3 }, }) +minetest.register_node("testnodes:plantlike_wallmounted", { + description = S("Wallmounted Plantlike Drawtype Test Node"), + drawtype = "plantlike", + paramtype = "light", + paramtype2 = "wallmounted", + tiles = { "testnodes_plantlike_wallmounted.png" }, + leveled = 1, + + + walkable = false, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) -- param2 will rotate +local function rotate_on_rightclick(pos, node, clicker) + local def = minetest.registered_nodes[node.name] + local aux1 = clicker:get_player_control().aux1 + + local deg, deg_max + local color, color_mult = 0, 0 + if def.paramtype2 == "degrotate" then + deg = node.param2 + deg_max = 240 + elseif def.paramtype2 == "colordegrotate" then + -- MSB [3x color, 5x rotation] LSB + deg = node.param2 % 2^5 + deg_max = 24 + color_mult = 2^5 + color = math.floor(node.param2 / color_mult) + end + + deg = (deg + (aux1 and 10 or 1)) % deg_max + node.param2 = color * color_mult + deg + minetest.swap_node(pos, node) + minetest.chat_send_player(clicker:get_player_name(), + "Rotation is now " .. deg .. " / " .. deg_max) +end + minetest.register_node("testnodes:plantlike_degrotate", { description = S("Degrotate Plantlike Drawtype Test Node"), drawtype = "plantlike", @@ -211,12 +255,43 @@ minetest.register_node("testnodes:plantlike_degrotate", { paramtype2 = "degrotate", tiles = { "testnodes_plantlike_degrotate.png" }, - + on_rightclick = rotate_on_rightclick, + place_param2 = 7, walkable = false, sunlight_propagates = true, groups = { dig_immediate = 3 }, }) +minetest.register_node("testnodes:mesh_degrotate", { + description = S("Degrotate Mesh Drawtype Test Node"), + drawtype = "mesh", + paramtype = "light", + paramtype2 = "degrotate", + mesh = "testnodes_ocorner.obj", + tiles = { "testnodes_mesh_stripes2.png" }, + + on_rightclick = rotate_on_rightclick, + place_param2 = 10, -- 15° + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + +minetest.register_node("testnodes:mesh_colordegrotate", { + description = S("Color Degrotate Mesh Drawtype Test Node"), + drawtype = "mesh", + paramtype = "light", + paramtype2 = "colordegrotate", + palette = "testnodes_palette_facedir.png", + mesh = "testnodes_ocorner.obj", + tiles = { "testnodes_mesh_stripes3.png" }, + + on_rightclick = rotate_on_rightclick, + -- color index 1, 1 step (=15°) rotated + place_param2 = 1 * 2^5 + 1, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, +}) + -- param2 will change height minetest.register_node("testnodes:plantlike_leveled", { description = S("Leveled Plantlike Drawtype Test Node"), @@ -258,6 +333,20 @@ minetest.register_node("testnodes:plantlike_rooted", { groups = { dig_immediate = 3 }, }) +minetest.register_node("testnodes:plantlike_rooted_wallmounted", { + description = S("Wallmounted Rooted Plantlike Drawtype Test Node"), + drawtype = "plantlike_rooted", + paramtype = "light", + paramtype2 = "wallmounted", + tiles = { + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base.png", + "testnodes_plantlike_rooted_base_side_wallmounted.png" }, + special_tiles = { "testnodes_plantlike_rooted_wallmounted.png" }, + + groups = { dig_immediate = 3 }, +}) + minetest.register_node("testnodes:plantlike_rooted_waving", { description = S("Waving Rooted Plantlike Drawtype Test Node"), drawtype = "plantlike_rooted", @@ -331,68 +420,72 @@ minetest.register_node("testnodes:plantlike_rooted_degrotate", { }) -- Demonstrative liquid nodes, source and flowing form. -minetest.register_node("testnodes:liquid", { - description = S("Source Liquid Drawtype Test Node"), - drawtype = "liquid", - paramtype = "light", - tiles = { - "testnodes_liquidsource.png", - }, - special_tiles = { - {name="testnodes_liquidsource.png", backface_culling=false}, - {name="testnodes_liquidsource.png", backface_culling=true}, - }, - use_texture_alpha = true, +-- DRAWTYPE ONLY, NO LIQUID PHYSICS! +-- Liquid ranges 0 to 8 +for r = 0, 8 do + minetest.register_node("testnodes:liquid_"..r, { + description = S("Source Liquid Drawtype Test Node, Range @1", r), + drawtype = "liquid", + paramtype = "light", + tiles = { + "testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", + }, + special_tiles = { + {name="testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false}, + {name="testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=true}, + }, + use_texture_alpha = "blend", - walkable = false, - liquidtype = "source", - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquid_flowing", - liquid_alternative_source = "testnodes:liquid", - groups = { dig_immediate = 3 }, -}) -minetest.register_node("testnodes:liquid_flowing", { - description = S("Flowing Liquid Drawtype Test Node"), - drawtype = "flowingliquid", - paramtype = "light", - paramtype2 = "flowingliquid", - tiles = { - "testnodes_liquidflowing.png", - }, - special_tiles = { - {name="testnodes_liquidflowing.png", backface_culling=false}, - {name="testnodes_liquidflowing.png", backface_culling=false}, - }, - use_texture_alpha = true, + walkable = false, + liquid_range = r, + liquid_viscosity = 0, + liquid_alternative_flowing = "testnodes:liquid_flowing_"..r, + liquid_alternative_source = "testnodes:liquid_"..r, + groups = { dig_immediate = 3 }, + }) + minetest.register_node("testnodes:liquid_flowing_"..r, { + description = S("Flowing Liquid Drawtype Test Node, Range @1", r), + drawtype = "flowingliquid", + paramtype = "light", + paramtype2 = "flowingliquid", + tiles = { + "testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", + }, + special_tiles = { + {name="testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false}, + {name="testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false}, + }, + use_texture_alpha = "blend", - walkable = false, - liquidtype = "flowing", - liquid_range = 1, - liquid_viscosity = 0, - liquid_alternative_flowing = "testnodes:liquid_flowing", - liquid_alternative_source = "testnodes:liquid", - groups = { dig_immediate = 3 }, -}) + walkable = false, + liquid_range = r, + liquid_viscosity = 0, + liquid_alternative_flowing = "testnodes:liquid_flowing_"..r, + liquid_alternative_source = "testnodes:liquid_"..r, + groups = { dig_immediate = 3 }, + }) + +end + +-- Waving liquid test (drawtype only) minetest.register_node("testnodes:liquid_waving", { description = S("Waving Source Liquid Drawtype Test Node"), drawtype = "liquid", paramtype = "light", tiles = { - "testnodes_liquidsource.png^[brighten", + "testnodes_liquidsource.png^[colorize:#0000FF:127", }, special_tiles = { - {name="testnodes_liquidsource.png^[brighten", backface_culling=false}, - {name="testnodes_liquidsource.png^[brighten", backface_culling=true}, + {name="testnodes_liquidsource.png^[colorize:#0000FF:127", backface_culling=false}, + {name="testnodes_liquidsource.png^[colorize:#0000FF:127", backface_culling=true}, }, - use_texture_alpha = true, + use_texture_alpha = "blend", waving = 3, walkable = false, - liquidtype = "source", liquid_range = 1, liquid_viscosity = 0, liquid_alternative_flowing = "testnodes:liquid_flowing_waving", @@ -405,18 +498,17 @@ minetest.register_node("testnodes:liquid_flowing_waving", { paramtype = "light", paramtype2 = "flowingliquid", tiles = { - "testnodes_liquidflowing.png^[brighten", + "testnodes_liquidflowing.png^[colorize:#0000FF:127", }, special_tiles = { - {name="testnodes_liquidflowing.png^[brighten", backface_culling=false}, - {name="testnodes_liquidflowing.png^[brighten", backface_culling=false}, + {name="testnodes_liquidflowing.png^[colorize:#0000FF:127", backface_culling=false}, + {name="testnodes_liquidflowing.png^[colorize:#0000FF:127", backface_culling=false}, }, - use_texture_alpha = true, + use_texture_alpha = "blend", waving = 3, walkable = false, - liquidtype = "flowing", liquid_range = 1, liquid_viscosity = 0, liquid_alternative_flowing = "testnodes:liquid_flowing_waving", @@ -424,8 +516,6 @@ minetest.register_node("testnodes:liquid_flowing_waving", { groups = { dig_immediate = 3 }, }) - - -- Invisible node minetest.register_node("testnodes:airlike", { description = S("Airlike Drawtype Test Node"), @@ -436,7 +526,6 @@ minetest.register_node("testnodes:airlike", { walkable = false, groups = { dig_immediate = 3 }, sunlight_propagates = true, - inventory_image = fallback_image("testnodes_airlike.png"), }) -- param2 changes liquid height @@ -526,10 +615,13 @@ scale("allfaces_optional_waving", scale("plantlike", S("Double-sized Plantlike Drawtype Test Node"), S("Half-sized Plantlike Drawtype Test Node")) -scale("torchlike", +scale("plantlike_wallmounted", + S("Double-sized Wallmounted Plantlike Drawtype Test Node"), + S("Half-sized Wallmounted Plantlike Drawtype Test Node")) +scale("torchlike_wallmounted", S("Double-sized Wallmounted Torchlike Drawtype Test Node"), S("Half-sized Wallmounted Torchlike Drawtype Test Node")) -scale("signlike", +scale("signlike_wallmounted", S("Double-sized Wallmounted Signlike Drawtype Test Node"), S("Half-sized Wallmounted Signlike Drawtype Test Node")) scale("firelike", 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/liquids.lua b/games/devtest/mods/testnodes/liquids.lua index e316782ad..be33814af 100644 --- a/games/devtest/mods/testnodes/liquids.lua +++ b/games/devtest/mods/testnodes/liquids.lua @@ -9,11 +9,9 @@ for d=0, 8 do {name = "testnodes_liquidsource_r"..d..".png", backface_culling = false}, {name = "testnodes_liquidsource_r"..d..".png", backface_culling = true}, }, - alpha = 192, + use_texture_alpha = "blend", paramtype = "light", walkable = false, - pointable = false, - diggable = false, buildable_to = true, is_ground_content = false, liquidtype = "source", @@ -30,12 +28,10 @@ for d=0, 8 do {name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false}, {name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false}, }, - alpha = 192, + use_texture_alpha = "blend", paramtype = "light", paramtype2 = "flowingliquid", walkable = false, - pointable = false, - diggable = false, buildable_to = true, is_ground_content = false, liquidtype = "flowing", @@ -44,20 +40,20 @@ for d=0, 8 do liquid_range = d, }) + if d <= 7 then + local mod = "^[colorize:#000000:127" minetest.register_node("testnodes:vliquid_"..d, { - description = "Test Liquid Source, Viscosity "..d, + description = "Test Liquid Source, Viscosity/Resistance "..d, drawtype = "liquid", tiles = {"testnodes_liquidsource_r"..d..".png"..mod}, special_tiles = { {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = false}, {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = true}, }, - alpha = 192, + use_texture_alpha = "blend", paramtype = "light", walkable = false, - pointable = false, - diggable = false, buildable_to = true, is_ground_content = false, liquidtype = "source", @@ -67,19 +63,17 @@ for d=0, 8 do }) minetest.register_node("testnodes:vliquid_flowing_"..d, { - description = "Flowing Test Liquid, Viscosity "..d, + description = "Flowing Test Liquid, Viscosity/Resistance "..d, drawtype = "flowingliquid", tiles = {"testnodes_liquidflowing_r"..d..".png"..mod}, special_tiles = { {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, }, - alpha = 192, + use_texture_alpha = "blend", paramtype = "light", paramtype2 = "flowingliquid", walkable = false, - pointable = false, - diggable = false, buildable_to = true, is_ground_content = false, liquidtype = "flowing", @@ -88,4 +82,53 @@ for d=0, 8 do liquid_viscosity = d, }) + mod = "^[colorize:#000000:192" + local v = 4 + minetest.register_node("testnodes:vrliquid_"..d, { + description = "Test Liquid Source, Viscosity "..v..", Resistance "..d, + drawtype = "liquid", + tiles = {"testnodes_liquidsource_r"..d..".png"..mod}, + special_tiles = { + {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = false}, + {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = true}, + }, + use_texture_alpha = "blend", + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + liquidtype = "source", + liquid_alternative_flowing = "testnodes:vrliquid_flowing_"..d, + liquid_alternative_source = "testnodes:vrliquid_"..d, + liquid_viscosity = v, + move_resistance = d, + }) + + minetest.register_node("testnodes:vrliquid_flowing_"..d, { + description = "Flowing Test Liquid, Viscosity "..v..", Resistance "..d, + drawtype = "flowingliquid", + tiles = {"testnodes_liquidflowing_r"..d..".png"..mod}, + special_tiles = { + {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, + {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + liquidtype = "flowing", + liquid_alternative_flowing = "testnodes:vrliquid_flowing_"..d, + liquid_alternative_source = "testnodes:vrliquid_"..d, + liquid_viscosity = v, + move_resistance = d, + }) + + end + end diff --git a/games/devtest/mods/testnodes/mod.conf b/games/devtest/mods/testnodes/mod.conf index 4824c6ed0..d894c3452 100644 --- a/games/devtest/mods/testnodes/mod.conf +++ b/games/devtest/mods/testnodes/mod.conf @@ -1,2 +1,3 @@ name = testnodes description = Contains a bunch of basic example nodes for demonstrative purposes, development and testing +depends = stairs diff --git a/games/devtest/mods/testnodes/nodeboxes.lua b/games/devtest/mods/testnodes/nodeboxes.lua index ebd858337..7e966fdce 100644 --- a/games/devtest/mods/testnodes/nodeboxes.lua +++ b/games/devtest/mods/testnodes/nodeboxes.lua @@ -18,7 +18,7 @@ minetest.register_node("testnodes:nodebox_fixed", { -- 50% higher than a regular node minetest.register_node("testnodes:nodebox_overhigh", { - description = S("Overhigh Nodebox Test Node"), + description = S("+50% high Nodebox Test Node"), tiles = {"testnodes_nodebox.png"}, drawtype = "nodebox", paramtype = "light", @@ -30,15 +30,16 @@ minetest.register_node("testnodes:nodebox_overhigh", { groups = {dig_immediate=3}, }) --- 100% higher than a regular node +-- 95% higher than a regular node minetest.register_node("testnodes:nodebox_overhigh2", { - description = S("Double-height Nodebox Test Node"), + description = S("+95% high Nodebox Test Node"), tiles = {"testnodes_nodebox.png"}, drawtype = "nodebox", paramtype = "light", node_box = { type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}, + -- Y max: more is possible, but glitchy + fixed = {-0.5, -0.5, -0.5, 0.5, 1.45, 0.5}, }, groups = {dig_immediate=3}, 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 01846a5f0..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"), @@ -114,11 +128,10 @@ minetest.register_node("testnodes:liquid_nojump", { {name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = false}, {name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = true}, }, - use_texture_alpha = true, + use_texture_alpha = "blend", paramtype = "light", pointable = false, liquids_pointable = true, - diggable = false, buildable_to = true, is_ground_content = false, post_effect_color = {a = 70, r = 255, g = 0, b = 200}, @@ -143,17 +156,76 @@ minetest.register_node("testnodes:liquidflowing_nojump", { {name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false}, {name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false}, }, - use_texture_alpha = true, + use_texture_alpha = "blend", paramtype = "light", paramtype2 = "flowingliquid", pointable = false, liquids_pointable = true, - diggable = false, buildable_to = true, is_ground_content = false, post_effect_color = {a = 70, r = 255, g = 0, b = 200}, }) +-- A liquid which doesn't have liquid movement physics (source variant) +minetest.register_node("testnodes:liquid_noswim", { + description = S("No-swim Liquid Source Node"), + liquidtype = "source", + liquid_range = 1, + liquid_viscosity = 0, + liquid_alternative_flowing = "testnodes:liquidflowing_noswim", + liquid_alternative_source = "testnodes:liquid_noswim", + liquid_renewable = false, + liquid_move_physics = false, + groups = {dig_immediate=3}, + walkable = false, + + drawtype = "liquid", + tiles = {"testnodes_liquidsource.png^[colorize:#FF00FF:127"}, + special_tiles = { + {name = "testnodes_liquidsource.png^[colorize:#FF00FF:127", backface_culling = false}, + {name = "testnodes_liquidsource.png^[colorize:#FF00FF:127", backface_culling = true}, + }, + use_texture_alpha = "blend", + paramtype = "light", + pointable = false, + liquids_pointable = true, + buildable_to = true, + is_ground_content = false, + post_effect_color = {a = 70, r = 255, g = 200, b = 200}, +}) + +-- A liquid which doen't have liquid movement physics (flowing variant) +minetest.register_node("testnodes:liquidflowing_noswim", { + description = S("No-swim Flowing Liquid Node"), + liquidtype = "flowing", + liquid_range = 1, + liquid_viscosity = 0, + liquid_alternative_flowing = "testnodes:liquidflowing_noswim", + liquid_alternative_source = "testnodes:liquid_noswim", + liquid_renewable = false, + liquid_move_physics = false, + groups = {dig_immediate=3}, + walkable = false, + + + drawtype = "flowingliquid", + tiles = {"testnodes_liquidflowing.png^[colorize:#FF00FF:127"}, + special_tiles = { + {name = "testnodes_liquidflowing.png^[colorize:#FF00FF:127", backface_culling = false}, + {name = "testnodes_liquidflowing.png^[colorize:#FF00FF:127", backface_culling = false}, + }, + use_texture_alpha = "blend", + paramtype = "light", + paramtype2 = "flowingliquid", + pointable = false, + liquids_pointable = true, + buildable_to = true, + is_ground_content = false, + post_effect_color = {a = 70, r = 255, g = 200, b = 200}, +}) + + + -- Nodes that modify fall damage (various damage modifiers) for i=-100, 100, 25 do if i ~= 0 then @@ -194,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}, @@ -218,6 +290,54 @@ for i=1, 5 do }) end +-- Move resistance nodes (various resistance levels) +for r=0, 7 do + if r > 0 then + minetest.register_node("testnodes:move_resistance"..r, { + description = S("Move-resistant Node (@1)", r), + walkable = false, + move_resistance = r, + + drawtype = "glasslike", + paramtype = "light", + sunlight_propagates = true, + tiles = { "testnodes_move_resistance.png" }, + is_ground_content = false, + groups = { dig_immediate = 3 }, + color = { b = 0, g = 255, r = math.floor((r/7)*255), a = 255 }, + }) + end + + minetest.register_node("testnodes:move_resistance_liquidlike"..r, { + description = S("Move-resistant Node, liquidlike (@1)", r), + walkable = false, + move_resistance = r, + liquid_move_physics = true, + + drawtype = "glasslike", + paramtype = "light", + sunlight_propagates = true, + tiles = { "testnodes_move_resistance.png" }, + is_ground_content = false, + groups = { dig_immediate = 3 }, + color = { b = 255, g = 0, r = math.floor((r/7)*255), a = 255 }, + }) +end + +minetest.register_node("testnodes:climbable_move_resistance_4", { + description = S("Climbable Move-resistant Node (4)"), + walkable = false, + climbable = true, + move_resistance = 4, + + drawtype = "glasslike", + paramtype = "light", + sunlight_propagates = true, + tiles = {"testnodes_climbable_resistance_side.png"}, + is_ground_content = false, + groups = { dig_immediate = 3 }, +}) + -- By placing something on the node, the node itself will be replaced minetest.register_node("testnodes:buildable_to", { description = S("Replacable Node"), diff --git a/games/devtest/mods/testnodes/settingtypes.txt b/games/devtest/mods/testnodes/settingtypes.txt deleted file mode 100644 index 7f753bf3e..000000000 --- a/games/devtest/mods/testnodes/settingtypes.txt +++ /dev/null @@ -1,4 +0,0 @@ -# If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0. -# This is due to <https://github.com/minetest/minetest/issues/9209>. -# This is only added to make the items more visible to avoid confusion, but you will no longer see the default inventory images for these items. When you want to test the default inventory image of drawtypes, this should be turned off. -testnodes_show_fallback_image (Use fallback inventory images) bool false diff --git a/games/devtest/mods/testnodes/textures.lua b/games/devtest/mods/testnodes/textures.lua index 6ffef8fe9..2faacdd78 100644 --- a/games/devtest/mods/testnodes/textures.lua +++ b/games/devtest/mods/testnodes/textures.lua @@ -46,28 +46,245 @@ for a=1,#alphas do tiles = { "testnodes_alpha"..alpha..".png", }, - use_texture_alpha = true, + use_texture_alpha = "blend", groups = { dig_immediate = 3 }, }) - -- Transparency set via "alpha" parameter + -- Transparency set via texture modifier minetest.register_node("testnodes:alpha_"..alpha, { description = S("Alpha Test Node (@1)", alpha), - -- It seems that only the liquid drawtype supports the alpha parameter - drawtype = "liquid", + drawtype = "glasslike", paramtype = "light", tiles = { - "testnodes_alpha.png", + "testnodes_alpha.png^[opacity:" .. alpha, }, - alpha = alpha, + use_texture_alpha = "blend", - - liquidtype = "source", - liquid_range = 0, - liquid_viscosity = 0, - liquid_alternative_source = "testnodes:alpha_"..alpha, - liquid_alternative_flowing = "testnodes:alpha_"..alpha, groups = { dig_immediate = 3 }, }) end + +-- Generate PNG textures + +local function mandelbrot(w, h, iterations) + local r = {} + for y=0, h-1 do + for x=0, w-1 do + local re = (x - w/2) * 4/w + local im = (y - h/2) * 4/h + -- zoom in on a nice view + re = re / 128 - 0.23 + im = im / 128 - 0.82 + + local px, py = 0, 0 + local i = 0 + while px*px + py*py <= 4 and i < iterations do + px, py = px*px - py*py + re, 2 * px * py + im + i = i + 1 + end + r[w*y+x+1] = i / iterations + end + end + return r +end + +local function gen_checkers(w, h, tile) + local r = {} + for y=0, h-1 do + for x=0, w-1 do + local hori = math.floor(x / tile) % 2 == 0 + local vert = math.floor(y / tile) % 2 == 0 + r[w*y+x+1] = hori ~= vert and 1 or 0 + end + end + return r +end + +local fractal = mandelbrot(512, 512, 128) +local frac_emb = mandelbrot(64, 64, 64) +local checker = gen_checkers(512, 512, 32) + +local floor = math.floor +local abs = math.abs +local data_emb = {} +local data_mb = {} +local data_ck = {} +for i=1, #frac_emb do + data_emb[i] = { + r = floor(abs(frac_emb[i] * 2 - 1) * 255), + g = floor(abs(1 - frac_emb[i]) * 255), + b = floor(frac_emb[i] * 255), + a = frac_emb[i] < 0.95 and 255 or 0, + } +end +for i=1, #fractal do + data_mb[i] = { + r = floor(fractal[i] * 255), + g = floor(abs(fractal[i] * 2 - 1) * 255), + b = floor(abs(1 - fractal[i]) * 255), + a = 255, + } + data_ck[i] = checker[i] > 0 and "#F80" or "#000" +end + +local textures_path = minetest.get_modpath( minetest.get_current_modname() ) .. "/textures/" +minetest.safe_file_write( + textures_path .. "testnodes_generated_mb.png", + minetest.encode_png(512,512,data_mb) +) +minetest.safe_file_write( + textures_path .. "testnodes_generated_ck.png", + minetest.encode_png(512,512,data_ck) +) + +minetest.register_node("testnodes:generated_png_mb", { + description = S("Generated Mandelbrot PNG Test Node"), + tiles = { "testnodes_generated_mb.png" }, + + groups = { dig_immediate = 2 }, +}) +minetest.register_node("testnodes:generated_png_ck", { + description = S("Generated Checker PNG Test Node"), + tiles = { "testnodes_generated_ck.png" }, + + groups = { dig_immediate = 2 }, +}) + +local png_emb = "[png:" .. minetest.encode_base64(minetest.encode_png(64,64,data_emb)) + +minetest.register_node("testnodes:generated_png_emb", { + description = S("Generated In-Band Mandelbrot PNG Test Node"), + tiles = { png_emb }, + + groups = { dig_immediate = 2 }, +}) +minetest.register_node("testnodes:generated_png_src_emb", { + description = S("Generated In-Band Source Blit Mandelbrot PNG Test Node"), + tiles = { png_emb .. "^testnodes_damage_neg.png" }, + + groups = { dig_immediate = 2 }, +}) +minetest.register_node("testnodes:generated_png_dst_emb", { + description = S("Generated In-Band Dest Blit Mandelbrot PNG Test Node"), + tiles = { "testnodes_generated_ck.png^" .. png_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_climbable_resistance_side.png b/games/devtest/mods/testnodes/textures/testnodes_climbable_resistance_side.png new file mode 100644 index 000000000..be01583e6 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_climbable_resistance_side.png differ diff --git a/games/devtest/mods/testnodes/textures/testnodes_move_resistance.png b/games/devtest/mods/testnodes/textures/testnodes_move_resistance.png new file mode 100644 index 000000000..cac3944bf Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_move_resistance.png differ 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_overlay.png 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_overlayable.png differ diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png new file mode 100644 index 000000000..b0be8d077 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png differ diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png new file mode 100644 index 000000000..421466407 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png differ diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png new file mode 100644 index 000000000..c89b29e30 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_bt.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type10_32bpp_tb.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_bt.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type1_24bpp_tb.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_bt.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_16bpp_tb.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_bt.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type2_32bpp_tb.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_bt.tga 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 Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_tga_type3_16bpp_tb.tga differ diff --git a/games/devtest/mods/testtools/README.md b/games/devtest/mods/testtools/README.md index 9cfe29ea4..72f0a2db0 100644 --- a/games/devtest/mods/testtools/README.md +++ b/games/devtest/mods/testtools/README.md @@ -33,6 +33,21 @@ Usage: * Punch node: Make it fall * Place: Try to teleport up to 2 units upwards, then make it fall +## Node Meta Editor +Edit and view metadata of nodes. + +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`). @@ -90,6 +105,13 @@ Usage: * Place: Increase move distance * Sneak+place: Decrease move distance +## Children Getter +Shows list of objects that are attached to an object (aka "children") in chat. + +Usage: +* Punch object: Show children of punched object +* Punch air: Show your own children + ## Entity Visual Scaler Change visual size of entities @@ -97,3 +119,10 @@ Usage: * Punch entity to increase visual size * Sneak+punch entity to decrease visual size + +## Light Tool +Show light level of node. + +Usage: +* Punch: Show light info of node in front of the punched node's side +* Place: Show light info of the node that you touched diff --git a/games/devtest/mods/testtools/init.lua b/games/devtest/mods/testtools/init.lua index df5bc8e55..abc1ed79b 100644 --- a/games/devtest/mods/testtools/init.lua +++ b/games/devtest/mods/testtools/init.lua @@ -1,7 +1,7 @@ local S = minetest.get_translator("testtools") local F = minetest.formspec_escape --- TODO: Add a Node Metadata tool +dofile(minetest.get_modpath("testtools") .. "/light.lua") minetest.register_tool("testtools:param2tool", { description = S("Param2 Tool") .."\n".. @@ -109,25 +109,6 @@ minetest.register_tool("testtools:node_setter", { end, }) -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname == "testtools:node_setter" then - local playername = player:get_player_name() - local witem = player:get_wielded_item() - if witem:get_name() == "testtools:node_setter" then - if fields.nodename and fields.param2 then - local param2 = tonumber(fields.param2) - if not param2 then - return - end - local meta = witem:get_meta() - meta:set_string("node", fields.nodename) - meta:set_int("node_param2", param2) - player:set_wielded_item(witem) - end - end - end -end) - minetest.register_tool("testtools:remover", { description = S("Remover") .."\n".. S("Punch: Remove pointed node or object"), @@ -632,6 +613,54 @@ minetest.register_tool("testtools:object_attacher", { end, }) +local function print_object(obj) + if obj:is_player() then + return "player '"..obj:get_player_name().."'" + elseif obj:get_luaentity() then + return "LuaEntity '"..obj:get_luaentity().name.."'" + else + return "object" + end +end + +minetest.register_tool("testtools:children_getter", { + description = S("Children Getter") .."\n".. + S("Shows list of objects attached to object") .."\n".. + S("Punch object to show its 'children'") .."\n".. + S("Punch air to show your own 'children'"), + inventory_image = "testtools_children_getter.png", + groups = { testtool = 1, disable_repair = 1 }, + on_use = function(itemstack, user, pointed_thing) + if user and user:is_player() then + local name = user:get_player_name() + local selected_object + local self_name + if pointed_thing.type == "object" then + selected_object = pointed_thing.ref + elseif pointed_thing.type == "nothing" then + selected_object = user + else + return + end + self_name = print_object(selected_object) + local children = selected_object:get_children() + local ret = "" + for c=1, #children do + ret = ret .. "* " .. print_object(children[c]) + if c < #children then + ret = ret .. "\n" + end + end + if ret == "" then + ret = S("No children attached to @1.", self_name) + else + ret = S("Children of @1:", self_name) .. "\n" .. ret + end + minetest.chat_send_player(user:get_player_name(), ret) + end + end, +}) + -- Use loadstring to parse param as a Lua value local function use_loadstring(param, player) -- For security reasons, require 'server' priv, just in case @@ -664,6 +693,114 @@ local function use_loadstring(param, player) return true, errOrResult end +-- Item Meta Editor + Node Meta Editor +local node_meta_posses = {} +local meta_latest_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 + + 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[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_meta_keylist(meta, playername, escaped) + local keys = {} + local ekeys = {} + local mtable = meta:to_table() + for k,_ in pairs(mtable.fields) do + table.insert(keys, k) + if escaped then + table.insert(ekeys, F(k)) + else + table.insert(ekeys, k) + end + end + if playername then + meta_latest_keylist[playername] = keys + end + return table.concat(ekeys, ",") +end + +minetest.register_tool("testtools:node_meta_editor", { + description = S("Node Meta Editor") .. "\n" .. + S("Place: Edit node metadata"), + inventory_image = "testtools_node_meta_editor.png", + groups = { testtool = 1, disable_repair = 1 }, + on_place = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + if not user:is_player() then + return itemstack + end + local pos = pointed_thing.under + node_meta_posses[user:get_player_name()] = pos + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + 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 @@ -726,5 +863,89 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) editor_formspec(name, selected_objects[name], prop_to_string(props[key]), sel) return end + elseif formname == "testtools:node_setter" then + local playername = player:get_player_name() + local witem = player:get_wielded_item() + if witem:get_name() == "testtools:node_setter" then + if fields.nodename and fields.param2 then + local param2 = tonumber(fields.param2) + if not param2 then + return + end + local meta = witem:get_meta() + meta:set_string("node", fields.nodename) + meta:set_int("node_param2", param2) + player:set_wielded_item(witem) + end + end + elseif formname == "testtools:node_meta_editor" or formname == "testtools:item_meta_editor" then + local name = player:get_player_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 = meta_latest_keylist[name] + if metatype == "node" and not pos_or_item then + return + end + 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 + if #keylist_table == 0 then + return + end + local key = keylist_table[evnt.index] + local value = meta:get_string(key) + local keylist_escaped = {} + for k,v in pairs(keylist_table) do + keylist_escaped[k] = F(v) + end + local keylist = table.concat(keylist_escaped, ",") + show_meta_formspec(player, metatype, pos_or_item, key, value, keylist) + return + end + elseif fields.key and fields.key ~= "" and fields.value then + if metatype == "node" and not pos_or_item then + return + end + 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) + 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() + meta_latest_keylist[name] = nil + node_meta_posses[name] = nil +end) diff --git a/games/devtest/mods/testtools/light.lua b/games/devtest/mods/testtools/light.lua new file mode 100644 index 000000000..afca9a489 --- /dev/null +++ b/games/devtest/mods/testtools/light.lua @@ -0,0 +1,37 @@ + +local S = minetest.get_translator("testtools") + +local function get_func(is_place) + return function(itemstack, user, pointed_thing) + local pos + if is_place then + pos = pointed_thing.under + else + pos = pointed_thing.above + end + if pointed_thing.type ~= "node" or not pos then + return + end + + local node = minetest.get_node(pos) + local pstr = minetest.pos_to_string(pos) + local time = minetest.get_timeofday() + local sunlight = minetest.get_natural_light(pos) + local artificial = minetest.get_artificial_light(node.param1) + local message = ("pos=%s | param1=0x%02x | " .. + "sunlight=%d | artificial=%d | timeofday=%.5f" ) + :format(pstr, node.param1, sunlight, artificial, time) + minetest.chat_send_player(user:get_player_name(), message) + end +end + +minetest.register_tool("testtools:lighttool", { + description = S("Light Tool") .. "\n" .. + S("Show light values of node") .. "\n" .. + S("Punch: Light of node above touched node") .. "\n" .. + S("Place: Light of touched node itself"), + inventory_image = "testtools_lighttool.png", + groups = { testtool = 1, disable_repair = 1 }, + on_use = get_func(false), + on_place = get_func(true), +}) diff --git a/games/devtest/mods/testtools/textures/testtools_children_getter.png b/games/devtest/mods/testtools/textures/testtools_children_getter.png new file mode 100644 index 000000000..b7fa34025 Binary files /dev/null and b/games/devtest/mods/testtools/textures/testtools_children_getter.png differ 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 Binary files /dev/null and b/games/devtest/mods/testtools/textures/testtools_item_meta_editor.png differ diff --git a/games/devtest/mods/testtools/textures/testtools_lighttool.png b/games/devtest/mods/testtools/textures/testtools_lighttool.png new file mode 100644 index 000000000..6f744b7fa Binary files /dev/null and b/games/devtest/mods/testtools/textures/testtools_lighttool.png differ diff --git a/games/devtest/mods/testtools/textures/testtools_node_meta_editor.png b/games/devtest/mods/testtools/textures/testtools_node_meta_editor.png new file mode 100644 index 000000000..89eafd65c Binary files /dev/null and b/games/devtest/mods/testtools/textures/testtools_node_meta_editor.png 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/crafting.lua b/games/devtest/mods/unittests/crafting.lua index eff13ce09..8c16d3efb 100644 --- a/games/devtest/mods/unittests/crafting.lua +++ b/games/devtest/mods/unittests/crafting.lua @@ -1,6 +1,7 @@ +dofile(core.get_modpath(core.get_current_modname()) .. "/crafting_prepare.lua") + -- Test minetest.clear_craft function local function test_clear_craft() - minetest.log("info", "[unittests] Testing minetest.clear_craft") -- Clearing by output minetest.register_craft({ output = "foo", @@ -22,11 +23,10 @@ local function test_clear_craft() minetest.clear_craft({recipe={{"foo", "bar"}}}) assert(minetest.get_all_craft_recipes("foo") == nil) end +unittests.register("test_clear_craft", test_clear_craft) -- Test minetest.get_craft_result function local function test_get_craft_result() - minetest.log("info", "[unittests] Testing minetest.get_craft_result") - -- normal local input = { method = "normal", @@ -107,14 +107,6 @@ local function test_get_craft_result() assert(output.item) minetest.log("info", "[unittests] unrepairable tool crafting output.item:to_table(): "..dump(output.item:to_table())) -- unrepairable tool must not yield any output - assert(output.item:get_name() == "") - + assert(output.item:is_empty()) end - -function unittests.test_crafting() - test_clear_craft() - test_get_craft_result() - minetest.log("action", "[unittests] Crafting tests passed!") - return true -end - +unittests.register("test_get_craft_result", test_get_craft_result) diff --git a/games/devtest/mods/unittests/crafting_prepare.lua b/games/devtest/mods/unittests/crafting_prepare.lua index a09734827..5cf5775e0 100644 --- a/games/devtest/mods/unittests/crafting_prepare.lua +++ b/games/devtest/mods/unittests/crafting_prepare.lua @@ -31,25 +31,31 @@ minetest.register_craftitem("unittests:steel_ingot", { groups = { dummy = 1 }, }) +-- Use aliases in recipes for more complete testing + +minetest.register_alias("unittests:steel_ingot_alias", "unittests:steel_ingot") +minetest.register_alias("unittests:coal_lump_alias", "unittests:coal_lump") +minetest.register_alias("unittests:iron_lump_alias", "unittests:iron_lump") + -- Recipes for tests: Normal crafting, cooking and fuel minetest.register_craft({ output = 'unittests:torch 4', recipe = { - {'unittests:coal_lump'}, + {'unittests:coal_lump_alias'}, {'unittests:stick'}, } }) minetest.register_craft({ type = "cooking", - output = "unittests:steel_ingot", - recipe = "unittests:iron_lump", + output = "unittests:steel_ingot_alias", + recipe = "unittests:iron_lump_alias", }) minetest.register_craft({ type = "fuel", - recipe = "unittests:coal_lump", + recipe = "unittests:coal_lump_alias", burntime = 40, }) 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 6c1728420..0e041be76 100644 --- a/games/devtest/mods/unittests/init.lua +++ b/games/devtest/mods/unittests/init.lua @@ -1,16 +1,202 @@ unittests = {} -local modpath = minetest.get_modpath("unittests") -dofile(modpath .. "/random.lua") -dofile(modpath .. "/player.lua") -dofile(modpath .. "/crafting_prepare.lua") -dofile(modpath .. "/crafting.lua") +unittests.list = {} -if minetest.settings:get_bool("devtest_unittests_autostart", false) then - unittests.test_random() - unittests.test_crafting() - minetest.register_on_joinplayer(function(player) - unittests.test_player(player) +-- name: Name of the test +-- func: +-- for sync: function(player, pos), should error on failure +-- for async: function(callback, player, pos) +-- MUST call callback() or callback("error msg") in case of error once test is finished +-- this means you cannot use assert() in the test implementation +-- opts: { +-- player = false, -- Does test require a player? +-- map = false, -- Does test require map access? +-- async = false, -- Does the test run asynchronously? (read notes above!) +-- } +function unittests.register(name, func, opts) + local def = table.copy(opts or {}) + def.name = name + def.func = func + table.insert(unittests.list, def) +end + +function unittests.on_finished(all_passed) + -- free to override +end + +-- Calls invoke with a callback as argument +-- Suspends coroutine until that callback is called +-- Return values are passed through +local function await(invoke) + local co = coroutine.running() + assert(co) + local called_early = true + invoke(function(...) + if called_early == true then + called_early = {...} + else + coroutine.resume(co, ...) + co = nil + end + end) + if called_early ~= true then + -- callback was already called before yielding + return unpack(called_early) + end + called_early = nil + return coroutine.yield() +end + +function unittests.run_one(idx, counters, out_callback, player, pos) + local def = unittests.list[idx] + if not def.player then + player = nil + elseif player == nil then + out_callback(false) + return false + end + if not def.map then + pos = nil + elseif pos == nil then + out_callback(false) + return false + end + + local tbegin = core.get_us_time() + local function done(status, err) + local tend = core.get_us_time() + local ms_taken = (tend - tbegin) / 1000 + + if not status then + core.log("error", err) + end + print(string.format("[%s] %s - %dms", + status and "PASS" or "FAIL", def.name, ms_taken)) + counters.time = counters.time + ms_taken + counters.total = counters.total + 1 + if status then + counters.passed = counters.passed + 1 + end + end + + if def.async then + core.log("info", "[unittest] running " .. def.name .. " (async)") + def.func(function(err) + done(err == nil, err) + out_callback(true) + end, player, pos) + else + core.log("info", "[unittest] running " .. def.name) + local status, err = pcall(def.func, player, pos) + done(status, err) + out_callback(true) + end + + return true +end + +local function wait_for_player(callback) + if #core.get_connected_players() > 0 then + return callback(core.get_connected_players()[1]) + end + local first = true + core.register_on_joinplayer(function(player) + if first then + callback(player) + first = false + end end) end +local function wait_for_map(player, callback) + local check = function() + if core.get_node_or_nil(player:get_pos()) ~= nil then + callback() + else + core.after(0, check) + end + end + check() +end + +function unittests.run_all() + -- This runs in a coroutine so it uses await(). + local counters = { time = 0, total = 0, passed = 0 } + + -- Run standalone tests first + for idx = 1, #unittests.list do + local def = unittests.list[idx] + def.done = await(function(cb) + unittests.run_one(idx, counters, cb, nil, nil) + end) + end + + -- Wait for a player to join, run tests that require a player + local player = await(wait_for_player) + for idx = 1, #unittests.list do + local def = unittests.list[idx] + if not def.done then + def.done = await(function(cb) + unittests.run_one(idx, counters, cb, player, nil) + end) + end + end + + -- Wait for the world to generate/load, run tests that require map access + await(function(cb) + wait_for_map(player, cb) + end) + local pos = vector.round(player:get_pos()) + for idx = 1, #unittests.list do + local def = unittests.list[idx] + if not def.done then + def.done = await(function(cb) + unittests.run_one(idx, counters, cb, player, pos) + end) + end + end + + -- Print stats + assert(#unittests.list == counters.total) + print(string.rep("+", 80)) + print(string.format("Unit Test Results: %s", + counters.total == counters.passed and "PASSED" or "FAILED")) + print(string.format(" %d / %d failed tests.", + counters.total - counters.passed, counters.total)) + print(string.format(" Testing took %dms total.", counters.time)) + print(string.rep("+", 80)) + unittests.on_finished(counters.total == counters.passed) + return counters.total == counters.passed +end + +-------------- + +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") + +-------------- + +if core.settings:get_bool("devtest_unittests_autostart", false) then + core.after(0, function() + coroutine.wrap(unittests.run_all)() + end) +else + core.register_chatcommand("unittests", { + privs = {basic_privs=true}, + description = "Runs devtest unittests (may modify player or map state)", + func = function(name, param) + unittests.on_finished = function(ok) + core.chat_send_player(name, + (ok and "All tests passed." or "There were test failures.") .. + " Check the console for detailed output.") + end + coroutine.wrap(unittests.run_all)() + return true, "" + end, + }) +end 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 new file mode 100644 index 000000000..b4c218c98 --- /dev/null +++ b/games/devtest/mods/unittests/itemdescription.lua @@ -0,0 +1,42 @@ +local full_description = "Description Test Item\nFor testing item decription" +minetest.register_tool("unittests:description_test", { + description = full_description, + inventory_image = "unittests_description_test.png", +}) + +minetest.register_chatcommand("item_description", { + param = "", + description = "Show the short and full description of the wielded item.", + func = function(name) + local player = minetest.get_player_by_name(name) + local item = player:get_wielded_item() + return true, string.format("short_description: %s\ndescription: %s", + item:get_short_description(), item:get_description()) + end +}) + +local function test_short_desc() + local function get_short_description(item) + return ItemStack(item):get_short_description() + end + + 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: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:description_test") == "Description Test Item") + + stack:get_meta():set_string("short_description", "Foo Bar") + assert(stack:get_short_description() == "Foo Bar") + assert(stack:get_description() == "Hello World") + + return true +end +unittests.register("test_short_desc", test_short_desc) diff --git a/games/devtest/mods/unittests/misc.lua b/games/devtest/mods/unittests/misc.lua new file mode 100644 index 000000000..4811c8008 --- /dev/null +++ b/games/devtest/mods/unittests/misc.lua @@ -0,0 +1,82 @@ +local function test_random() + -- Try out PseudoRandom + local pseudo = PseudoRandom(13) + assert(pseudo:next() == 22290) + assert(pseudo:next() == 13854) +end +unittests.register("test_random", test_random) + +local function test_dynamic_media(cb, player) + if core.get_player_information(player:get_player_name()).protocol_version < 40 then + core.log("warning", "test_dynamic_media: Client too old, skipping test.") + return cb() + end + + -- Check that the client acknowledges media transfers + local path = core.get_worldpath() .. "/test_media.obj" + local f = io.open(path, "w") + f:write("# contents don't matter\n") + f:close() + + local call_ok = false + local ok = core.dynamic_add_media({ + filepath = path, + to_player = player:get_player_name(), + }, function(name) + if not call_ok then + return cb("impossible condition") + end + cb() + end) + if not ok then + return cb("dynamic_add_media() returned error") + end + call_ok = true + + -- 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/mod.conf b/games/devtest/mods/unittests/mod.conf index 0d5e3c959..fa94e01a6 100644 --- a/games/devtest/mods/unittests/mod.conf +++ b/games/devtest/mods/unittests/mod.conf @@ -1,2 +1,3 @@ name = unittests description = Adds automated unit tests for the engine +depends = basenodes diff --git a/games/devtest/mods/unittests/player.lua b/games/devtest/mods/unittests/player.lua index 4a681310d..fa0557960 100644 --- a/games/devtest/mods/unittests/player.lua +++ b/games/devtest/mods/unittests/player.lua @@ -2,6 +2,21 @@ -- HP Change Reasons -- local expect = nil +minetest.register_on_player_hpchange(function(player, hp, reason) + if expect == nil then + return + end + + for key, value in pairs(reason) do + assert(expect[key] == value) + end + for key, value in pairs(expect) do + assert(reason[key] == value) + end + + expect = nil +end) + local function run_hpchangereason_tests(player) local old_hp = player:get_hp() @@ -20,7 +35,11 @@ local function run_hpchangereason_tests(player) player:set_hp(old_hp) end +unittests.register("test_hpchangereason", run_hpchangereason_tests, {player=true}) +-- +-- Player meta +-- local function run_player_meta_tests(player) local meta = player:get_meta() meta:set_string("foo", "bar") @@ -48,29 +67,4 @@ local function run_player_meta_tests(player) assert(meta:get_string("foo") == "") assert(meta:equals(meta2)) end - -function unittests.test_player(player) - minetest.register_on_player_hpchange(function(player, hp, reason) - if not expect then - return - end - - for key, value in pairs(reason) do - assert(expect[key] == value) - end - - for key, value in pairs(expect) do - assert(reason[key] == value) - end - - expect = nil - end) - - run_hpchangereason_tests(player) - run_player_meta_tests(player) - local msg = "Player tests passed for player '"..player:get_player_name().."'!" - minetest.chat_send_all(msg) - minetest.log("action", "[unittests] "..msg) - return true -end - +unittests.register("test_player_meta", run_player_meta_tests, {player=true}) diff --git a/games/devtest/mods/unittests/random.lua b/games/devtest/mods/unittests/random.lua deleted file mode 100644 index f94f0a88e..000000000 --- a/games/devtest/mods/unittests/random.lua +++ /dev/null @@ -1,10 +0,0 @@ -function unittests.test_random() - -- Try out PseudoRandom - minetest.log("action", "[unittests] Testing PseudoRandom ...") - local pseudo = PseudoRandom(13) - assert(pseudo:next() == 22290) - assert(pseudo:next() == 13854) - minetest.log("action", "[unittests] PseudoRandom test passed!") - return true -end - diff --git a/games/devtest/mods/unittests/textures/default_dirt.png b/games/devtest/mods/unittests/textures/default_dirt.png new file mode 100644 index 000000000..58670305d Binary files /dev/null and b/games/devtest/mods/unittests/textures/default_dirt.png differ 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 Binary files /dev/null and b/games/devtest/mods/unittests/textures/unittests_description_test.png differ diff --git a/games/devtest/mods/util_commands/init.lua b/games/devtest/mods/util_commands/init.lua index f2a155fb2..c37364042 100644 --- a/games/devtest/mods/util_commands/init.lua +++ b/games/devtest/mods/util_commands/init.lua @@ -36,8 +36,12 @@ minetest.register_chatcommand("hp", { end, }) -minetest.register_chatcommand("zoom", { - params = "[<zoom_fov>]", +minetest.register_on_joinplayer(function(player) + player:set_properties({zoom_fov = 15}) +end) + +minetest.register_chatcommand("zoomfov", { + params = "[<FOV>]", description = "Set or display your zoom_fov", func = function(name, param) local player = minetest.get_player_by_name(name) @@ -58,8 +62,6 @@ minetest.register_chatcommand("zoom", { end, }) - - local s_infplace = minetest.settings:get("devtest_infplace") if s_infplace == "true" then infplace = true @@ -112,6 +114,59 @@ minetest.register_chatcommand("detach", { end, }) +minetest.register_chatcommand("use_tool", { + params = "(dig <group> <leveldiff>) | (hit <damage_group> <time_from_last_punch>) [<uses>]", + description = "Apply tool wear a number of times, as if it were used for digging", + func = function(name, param) + local player = minetest.get_player_by_name(name) + if not player then + return false, "No player." + end + local mode, group, level, uses = string.match(param, "([a-z]+) ([a-z0-9]+) (-?%d+) (%d+)") + if not mode then + mode, group, level = string.match(param, "([a-z]+) ([a-z0-9]+) (-?%d+)") + uses = 1 + end + if not mode or not group or not level then + return false + end + if mode ~= "dig" and mode ~= "hit" then + return false + end + local tool = player:get_wielded_item() + local caps = tool:get_tool_capabilities() + if not caps or tool:get_count() == 0 then + return false, "No tool in hand." + end + local actual_uses = 0 + for u=1, uses do + local wear = tool:get_wear() + local dp + if mode == "dig" then + dp = minetest.get_dig_params({[group]=3, level=level}, caps, wear) + else + dp = minetest.get_hit_params({[group]=100}, caps, level, wear) + end + tool:add_wear(dp.wear) + actual_uses = actual_uses + 1 + if tool:get_count() == 0 then + break + end + end + player:set_wielded_item(tool) + if tool:get_count() == 0 then + return true, string.format("Tool used %d time(s). ".. + "The tool broke after %d use(s).", uses, actual_uses) + else + local wear = tool:get_wear() + return true, string.format("Tool used %d time(s). ".. + "Final wear=%d", uses, wear) + end + end, +}) + + + -- Use this to test waypoint capabilities minetest.register_chatcommand("test_waypoints", { params = "[change_immediate]", @@ -191,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/games/devtest/settingtypes.txt b/games/devtest/settingtypes.txt index 40ee5845b..c4365643e 100644 --- a/games/devtest/settingtypes.txt +++ b/games/devtest/settingtypes.txt @@ -30,8 +30,3 @@ devtest_dungeon_mossycobble (Generate mossy cobblestone) bool false # If enabled, some very basic biomes will be registered. devtest_register_biomes (Register biomes) bool true - -# If set to true, will show an inventory image for nodes that have no inventory image as of Minetest 5.1.0. -# This is due to <https://github.com/minetest/minetest/issues/9209>. -# This is only added to make the items more visible to avoid confusion, but you will no longer see the default inventory images for these items. When you want to test the default inventory image of drawtypes, this should be turned off. -testnodes_show_fallback_image (Use fallback inventory images) bool false diff --git a/lib/bitop/CMakeLists.txt b/lib/bitop/CMakeLists.txt new file mode 100644 index 000000000..02e8a421d --- /dev/null +++ b/lib/bitop/CMakeLists.txt @@ -0,0 +1,4 @@ +add_library(bitop STATIC bit.c) +target_link_libraries(bitop) + +include_directories(${LUA_INCLUDE_DIR}) diff --git a/lib/bitop/bit.c b/lib/bitop/bit.c new file mode 100644 index 000000000..f23c31a4c --- /dev/null +++ b/lib/bitop/bit.c @@ -0,0 +1,189 @@ +/* +** Lua BitOp -- a bit operations library for Lua 5.1/5.2. +** http://bitop.luajit.org/ +** +** Copyright (C) 2008-2012 Mike Pall. All rights reserved. +** +** Permission is hereby granted, free of charge, to any person obtaining +** a copy of this software and associated documentation files (the +** "Software"), to deal in the Software without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Software, and to +** permit persons to whom the Software is furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be +** included in all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +** [ MIT license: http://www.opensource.org/licenses/mit-license.php ] +*/ + +#include "bit.h" + +#define LUA_BITOP_VERSION "1.0.2" + +#define LUA_LIB +#include "lauxlib.h" + +#ifdef _MSC_VER +/* MSVC is stuck in the last century and doesn't have C99's stdint.h. */ +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +#else +#include <stdint.h> +#endif + +typedef int32_t SBits; +typedef uint32_t UBits; + +typedef union { + lua_Number n; +#ifdef LUA_NUMBER_DOUBLE + uint64_t b; +#else + UBits b; +#endif +} BitNum; + +/* Convert argument to bit type. */ +static UBits barg(lua_State *L, int idx) +{ + BitNum bn; + UBits b; +#if LUA_VERSION_NUM < 502 + bn.n = lua_tonumber(L, idx); +#else + bn.n = luaL_checknumber(L, idx); +#endif +#if defined(LUA_NUMBER_DOUBLE) + bn.n += 6755399441055744.0; /* 2^52+2^51 */ +#ifdef SWAPPED_DOUBLE + b = (UBits)(bn.b >> 32); +#else + b = (UBits)bn.b; +#endif +#elif defined(LUA_NUMBER_INT) || defined(LUA_NUMBER_LONG) || \ + defined(LUA_NUMBER_LONGLONG) || defined(LUA_NUMBER_LONG_LONG) || \ + defined(LUA_NUMBER_LLONG) + if (sizeof(UBits) == sizeof(lua_Number)) + b = bn.b; + else + b = (UBits)(SBits)bn.n; +#elif defined(LUA_NUMBER_FLOAT) +#error "A 'float' lua_Number type is incompatible with this library" +#else +#error "Unknown number type, check LUA_NUMBER_* in luaconf.h" +#endif +#if LUA_VERSION_NUM < 502 + if (b == 0 && !lua_isnumber(L, idx)) { + luaL_typerror(L, idx, "number"); + } +#endif + return b; +} + +/* Return bit type. */ +#define BRET(b) lua_pushnumber(L, (lua_Number)(SBits)(b)); return 1; + +static int bit_tobit(lua_State *L) { BRET(barg(L, 1)) } +static int bit_bnot(lua_State *L) { BRET(~barg(L, 1)) } + +#define BIT_OP(func, opr) \ + static int func(lua_State *L) { int i; UBits b = barg(L, 1); \ + for (i = lua_gettop(L); i > 1; i--) b opr barg(L, i); BRET(b) } +BIT_OP(bit_band, &=) +BIT_OP(bit_bor, |=) +BIT_OP(bit_bxor, ^=) + +#define bshl(b, n) (b << n) +#define bshr(b, n) (b >> n) +#define bsar(b, n) ((SBits)b >> n) +#define brol(b, n) ((b << n) | (b >> (32-n))) +#define bror(b, n) ((b << (32-n)) | (b >> n)) +#define BIT_SH(func, fn) \ + static int func(lua_State *L) { \ + UBits b = barg(L, 1); UBits n = barg(L, 2) & 31; BRET(fn(b, n)) } +BIT_SH(bit_lshift, bshl) +BIT_SH(bit_rshift, bshr) +BIT_SH(bit_arshift, bsar) +BIT_SH(bit_rol, brol) +BIT_SH(bit_ror, bror) + +static int bit_bswap(lua_State *L) +{ + UBits b = barg(L, 1); + b = (b >> 24) | ((b >> 8) & 0xff00) | ((b & 0xff00) << 8) | (b << 24); + BRET(b) +} + +static int bit_tohex(lua_State *L) +{ + UBits b = barg(L, 1); + SBits n = lua_isnone(L, 2) ? 8 : (SBits)barg(L, 2); + const char *hexdigits = "0123456789abcdef"; + char buf[8]; + int i; + if (n < 0) { n = -n; hexdigits = "0123456789ABCDEF"; } + if (n > 8) n = 8; + for (i = (int)n; --i >= 0; ) { buf[i] = hexdigits[b & 15]; b >>= 4; } + lua_pushlstring(L, buf, (size_t)n); + return 1; +} + +static const struct luaL_Reg bit_funcs[] = { + { "tobit", bit_tobit }, + { "bnot", bit_bnot }, + { "band", bit_band }, + { "bor", bit_bor }, + { "bxor", bit_bxor }, + { "lshift", bit_lshift }, + { "rshift", bit_rshift }, + { "arshift", bit_arshift }, + { "rol", bit_rol }, + { "ror", bit_ror }, + { "bswap", bit_bswap }, + { "tohex", bit_tohex }, + { NULL, NULL } +}; + +/* Signed right-shifts are implementation-defined per C89/C99. +** But the de facto standard are arithmetic right-shifts on two's +** complement CPUs. This behaviour is required here, so test for it. +*/ +#define BAD_SAR (bsar(-8, 2) != (SBits)-2) + +LUALIB_API int luaopen_bit(lua_State *L) +{ + UBits b; + lua_pushnumber(L, (lua_Number)1437217655L); + b = barg(L, -1); + if (b != (UBits)1437217655L || BAD_SAR) { /* Perform a simple self-test. */ + const char *msg = "compiled with incompatible luaconf.h"; +#ifdef LUA_NUMBER_DOUBLE +#ifdef _WIN32 + if (b == (UBits)1610612736L) + msg = "use D3DCREATE_FPU_PRESERVE with DirectX"; +#endif + if (b == (UBits)1127743488L) + msg = "not compiled with SWAPPED_DOUBLE"; +#endif + if (BAD_SAR) + msg = "arithmetic right-shift broken"; + luaL_error(L, "bit library self-test failed (%s)", msg); + } +#if LUA_VERSION_NUM < 502 + luaL_register(L, "bit", bit_funcs); +#else + luaL_newlib(L, bit_funcs); +#endif + return 1; +} diff --git a/lib/bitop/bit.h b/lib/bitop/bit.h new file mode 100644 index 000000000..3e5845ee5 --- /dev/null +++ b/lib/bitop/bit.h @@ -0,0 +1,34 @@ +/* +** Lua BitOp -- a bit operations library for Lua 5.1/5.2. +** http://bitop.luajit.org/ +** +** Copyright (C) 2008-2012 Mike Pall. All rights reserved. +** +** Permission is hereby granted, free of charge, to any person obtaining +** a copy of this software and associated documentation files (the +** "Software"), to deal in the Software without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Software, and to +** permit persons to whom the Software is furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be +** included in all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +** [ MIT license: http://www.opensource.org/licenses/mit-license.php ] +*/ + +#pragma once + +#include "lua.h" + +#define LUA_BITLIBNAME "bit" +LUALIB_API int luaopen_bit(lua_State *L); 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, ¤tTracker ); + 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(§ionTracker); + + 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, ¤tTracker ); + 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 << "<"; break; + case '&': os << "&"; break; + + case '>': + // See: http://www.w3.org/TR/xml/#syntax + if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']') + os << ">"; + else + os << c; + break; + + case '\"': + if (m_forWhat == ForAttributes) + os << """; + 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/gmp/CMakeLists.txt b/lib/gmp/CMakeLists.txt index 884c4d389..f0604a43d 100644 --- a/lib/gmp/CMakeLists.txt +++ b/lib/gmp/CMakeLists.txt @@ -1,3 +1,3 @@ -add_library(gmp mini-gmp.c) +add_library(gmp STATIC mini-gmp.c) target_link_libraries(gmp) diff --git a/lib/jsoncpp/CMakeLists.txt b/lib/jsoncpp/CMakeLists.txt index 0531712ae..cdd1a7ead 100644 --- a/lib/jsoncpp/CMakeLists.txt +++ b/lib/jsoncpp/CMakeLists.txt @@ -1,3 +1,3 @@ -add_library(jsoncpp jsoncpp.cpp) +add_library(jsoncpp STATIC jsoncpp.cpp) target_link_libraries(jsoncpp) diff --git a/lib/jsoncpp/json/UPDATING b/lib/jsoncpp/json/UPDATING index f0226e8ee..0893244cf 100644 --- a/lib/jsoncpp/json/UPDATING +++ b/lib/jsoncpp/json/UPDATING @@ -1,6 +1,6 @@ #!/bin/sh cd .. -git clone https://github.com/open-source-parsers/jsoncpp -b 1.8.3 --depth 1 +git clone https://github.com/open-source-parsers/jsoncpp -b 1.9.4 --depth 1 cd jsoncpp python amalgamate.py cp -R dist/json ../json diff --git a/lib/jsoncpp/json/json-forwards.h b/lib/jsoncpp/json/json-forwards.h index de2e4bd79..d3260c57c 100644 --- a/lib/jsoncpp/json/json-forwards.h +++ b/lib/jsoncpp/json/json-forwards.h @@ -79,6 +79,151 @@ license you like. /// to prevent private header inclusion. #define JSON_IS_AMALGAMATION +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + +#ifndef JSON_VERSION_H_INCLUDED +#define JSON_VERSION_H_INCLUDED + +// Note: version must be updated in three places when doing a release. This +// annoying process ensures that amalgamate, CMake, and meson all report the +// correct version. +// 1. /meson.build +// 2. /include/json/version.h +// 3. /CMakeLists.txt +// IMPORTANT: also update the SOVERSION!! + +#define JSONCPP_VERSION_STRING "1.9.4" +#define JSONCPP_VERSION_MAJOR 1 +#define JSONCPP_VERSION_MINOR 9 +#define JSONCPP_VERSION_PATCH 3 +#define JSONCPP_VERSION_QUALIFIER +#define JSONCPP_VERSION_HEXA \ + ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \ + (JSONCPP_VERSION_PATCH << 8)) + +#ifdef JSONCPP_USING_SECURE_MEMORY +#undef JSONCPP_USING_SECURE_MEMORY +#endif +#define JSONCPP_USING_SECURE_MEMORY 0 +// If non-zero, the library zeroes any memory that it has allocated before +// it frees its memory. + +#endif // JSON_VERSION_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_ALLOCATOR_H_INCLUDED +#define JSON_ALLOCATOR_H_INCLUDED + +#include <cstring> +#include <memory> + +#pragma pack(push, 8) + +namespace Json { +template <typename T> class SecureAllocator { +public: + // Type definitions + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + + /** + * Allocate memory for N items using the standard allocator. + */ + pointer allocate(size_type n) { + // allocate using "global operator new" + return static_cast<pointer>(::operator new(n * sizeof(T))); + } + + /** + * Release memory which was allocated for N items at pointer P. + * + * The memory block is filled with zeroes before being released. + * The pointer argument is tagged as "volatile" to prevent the + * compiler optimizing out this critical step. + */ + void deallocate(volatile pointer p, size_type n) { + std::memset(p, 0, n * sizeof(T)); + // free using "global operator delete" + ::operator delete(p); + } + + /** + * Construct an item in-place at pointer P. + */ + template <typename... Args> void construct(pointer p, Args&&... args) { + // construct using "placement new" and "perfect forwarding" + ::new (static_cast<void*>(p)) T(std::forward<Args>(args)...); + } + + size_type max_size() const { return size_t(-1) / sizeof(T); } + + pointer address(reference x) const { return std::addressof(x); } + + const_pointer address(const_reference x) const { return std::addressof(x); } + + /** + * Destroy an item in-place at pointer P. + */ + void destroy(pointer p) { + // destroy using "explicit destructor" + p->~T(); + } + + // Boilerplate + SecureAllocator() {} + template <typename U> SecureAllocator(const SecureAllocator<U>&) {} + template <typename U> struct rebind { using other = SecureAllocator<U>; }; +}; + +template <typename T, typename U> +bool operator==(const SecureAllocator<T>&, const SecureAllocator<U>&) { + return true; +} + +template <typename T, typename U> +bool operator!=(const SecureAllocator<T>&, const SecureAllocator<U>&) { + return false; +} + +} // namespace Json + +#pragma pack(pop) + +#endif // JSON_ALLOCATOR_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + + + + + + // ////////////////////////////////////////////////////////////////////// // Beginning of content of file: include/json/config.h // ////////////////////////////////////////////////////////////////////// @@ -90,19 +235,14 @@ license you like. #ifndef JSON_CONFIG_H_INCLUDED #define JSON_CONFIG_H_INCLUDED -#include <stddef.h> -#include <string> //typedef String -#include <stdint.h> //typedef int64_t, uint64_t - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of -/// std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 +#include <cstddef> +#include <cstdint> +#include <istream> +#include <memory> +#include <ostream> +#include <sstream> +#include <string> +#include <type_traits> // If non-zero, the library uses exceptions to report bad input instead of C // assertion macros. The default is to use exceptions. @@ -110,164 +250,132 @@ license you like. #define JSON_USE_EXCEPTION 1 #endif +// Temporary, tracked for removal with issue #982. +#ifndef JSON_USE_NULLREF +#define JSON_USE_NULLREF 1 +#endif + /// If defined, indicates that the source file is amalgamated /// to prevent private header inclusion. /// Remarks: it is automatically defined in the generated amalgamated header. // #define JSON_IS_AMALGAMATION -#ifdef JSON_IN_CPPTL -#include <cpptl/config.h> -#ifndef JSON_USE_CPPTL -#define JSON_USE_CPPTL 1 -#endif -#endif - -#ifdef JSON_IN_CPPTL -#define JSON_API CPPTL_API -#elif defined(JSON_DLL_BUILD) +// Export macros for DLL visibility +#if defined(JSON_DLL_BUILD) #if defined(_MSC_VER) || defined(__MINGW32__) #define JSON_API __declspec(dllexport) #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#elif defined(__GNUC__) || defined(__clang__) +#define JSON_API __attribute__((visibility("default"))) #endif // if defined(_MSC_VER) + #elif defined(JSON_DLL) #if defined(_MSC_VER) || defined(__MINGW32__) #define JSON_API __declspec(dllimport) #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING #endif // if defined(_MSC_VER) -#endif // ifdef JSON_IN_CPPTL +#endif // ifdef JSON_DLL_BUILD + #if !defined(JSON_API) #define JSON_API #endif +#if defined(_MSC_VER) && _MSC_VER < 1800 +#error \ + "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +// As recommended at +// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 +extern JSON_API int msvc_pre1900_c99_snprintf(char* outBuf, size_t size, + const char* format, ...); +#define jsoncpp_snprintf msvc_pre1900_c99_snprintf +#else +#define jsoncpp_snprintf std::snprintf +#endif + // If JSON_NO_INT64 is defined, then Json only support C++ "int" type for // integer // Storages, and 64 bits integer support is disabled. // #define JSON_NO_INT64 1 -#if defined(_MSC_VER) // MSVC -# if _MSC_VER <= 1200 // MSVC 6 - // Microsoft Visual Studio 6 only support conversion from __int64 to double - // (no conversion from unsigned __int64). -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 - // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' - // characters in the debug information) - // All projects I've ever seen with VS6 were using this globally (not bothering - // with pragma push/pop). -# pragma warning(disable : 4786) -# endif // MSVC 6 - -# if _MSC_VER >= 1500 // MSVC 2008 - /// Indicates that the following function is deprecated. -# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -# endif - -#endif // defined(_MSC_VER) - -// In c++11 the override keyword allows you to explicitly define that a function -// is intended to override the base-class version. This makes the code more -// managable and fixes a set of common hard-to-find bugs. -#if __cplusplus >= 201103L -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT noexcept -#elif defined(_MSC_VER) && _MSC_VER > 1600 && _MSC_VER < 1900 -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT throw() -#elif defined(_MSC_VER) && _MSC_VER >= 1900 -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT noexcept -#else -# define JSONCPP_OVERRIDE -# define JSONCPP_NOEXCEPT throw() -#endif - -#ifndef JSON_HAS_RVALUE_REFERENCES - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010 -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // MSVC >= 2010 +// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. +// C++11 should be used directly in JSONCPP. +#define JSONCPP_OVERRIDE override #ifdef __clang__ -#if __has_feature(cxx_rvalue_references) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // has_feature - -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // GXX_EXPERIMENTAL - -#endif // __clang__ || __GNUC__ - -#endif // not defined JSON_HAS_RVALUE_REFERENCES - -#ifndef JSON_HAS_RVALUE_REFERENCES -#define JSON_HAS_RVALUE_REFERENCES 0 +#if __has_extension(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) #endif - -#ifdef __clang__ -# if __has_extension(attribute_deprecated_with_message) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# endif -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) -# endif // GNUC version -#endif // __clang__ || __GNUC__ +#elif defined(__GNUC__) // not clang (gcc comes later since clang emulates gcc) +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif // GNUC version +#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates + // MSVC) +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#endif // __clang__ || __GNUC__ || _MSC_VER #if !defined(JSONCPP_DEPRECATED) #define JSONCPP_DEPRECATED(message) #endif // if !defined(JSONCPP_DEPRECATED) -#if __GNUC__ >= 6 -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 #endif #if !defined(JSON_IS_AMALGAMATION) -# include "version.h" - -# if JSONCPP_USING_SECURE_MEMORY -# include "allocator.h" //typedef Allocator -# endif +#include "allocator.h" +#include "version.h" #endif // if !defined(JSON_IS_AMALGAMATION) namespace Json { -typedef int Int; -typedef unsigned int UInt; +using Int = int; +using UInt = unsigned int; #if defined(JSON_NO_INT64) -typedef int LargestInt; -typedef unsigned int LargestUInt; +using LargestInt = int; +using LargestUInt = unsigned int; #undef JSON_HAS_INT64 #else // if defined(JSON_NO_INT64) // For Microsoft Visual use specific types as long long is not supported #if defined(_MSC_VER) // Microsoft Visual Studio -typedef __int64 Int64; -typedef unsigned __int64 UInt64; +using Int64 = __int64; +using UInt64 = unsigned __int64; #else // if defined(_MSC_VER) // Other platforms, use long long -typedef int64_t Int64; -typedef uint64_t UInt64; -#endif // if defined(_MSC_VER) -typedef Int64 LargestInt; -typedef UInt64 LargestUInt; +using Int64 = int64_t; +using UInt64 = uint64_t; +#endif // if defined(_MSC_VER) +using LargestInt = Int64; +using LargestUInt = UInt64; #define JSON_HAS_INT64 #endif // if defined(JSON_NO_INT64) -#if JSONCPP_USING_SECURE_MEMORY -#define JSONCPP_STRING std::basic_string<char, std::char_traits<char>, Json::SecureAllocator<char> > -#define JSONCPP_OSTRINGSTREAM std::basic_ostringstream<char, std::char_traits<char>, Json::SecureAllocator<char> > -#define JSONCPP_OSTREAM std::basic_ostream<char, std::char_traits<char>> -#define JSONCPP_ISTRINGSTREAM std::basic_istringstream<char, std::char_traits<char>, Json::SecureAllocator<char> > -#define JSONCPP_ISTREAM std::istream -#else -#define JSONCPP_STRING std::string -#define JSONCPP_OSTRINGSTREAM std::ostringstream -#define JSONCPP_OSTREAM std::ostream -#define JSONCPP_ISTRINGSTREAM std::istringstream -#define JSONCPP_ISTREAM std::istream -#endif // if JSONCPP_USING_SECURE_MEMORY -} // end namespace Json + +template <typename T> +using Allocator = + typename std::conditional<JSONCPP_USING_SECURE_MEMORY, SecureAllocator<T>, + std::allocator<T>>::type; +using String = std::basic_string<char, std::char_traits<char>, Allocator<char>>; +using IStringStream = + std::basic_istringstream<String::value_type, String::traits_type, + String::allocator_type>; +using OStringStream = + std::basic_ostringstream<String::value_type, String::traits_type, + String::allocator_type>; +using IStream = std::istream; +using OStream = std::ostream; +} // namespace Json + +// Legacy names (formerly macros). +using JSONCPP_STRING = Json::String; +using JSONCPP_ISTRINGSTREAM = Json::IStringStream; +using JSONCPP_OSTRINGSTREAM = Json::OStringStream; +using JSONCPP_ISTREAM = Json::IStream; +using JSONCPP_OSTREAM = Json::OStream; #endif // JSON_CONFIG_H_INCLUDED @@ -299,17 +407,23 @@ typedef UInt64 LargestUInt; namespace Json { // writer.h +class StreamWriter; +class StreamWriterBuilder; +class Writer; class FastWriter; class StyledWriter; +class StyledStreamWriter; // reader.h class Reader; +class CharReader; +class CharReaderBuilder; -// features.h +// json_features.h class Features; // value.h -typedef unsigned int ArrayIndex; +using ArrayIndex = unsigned int; class StaticString; class Path; class PathArgument; diff --git a/lib/jsoncpp/json/json.h b/lib/jsoncpp/json/json.h index 625ba02e9..3f4813a95 100644 --- a/lib/jsoncpp/json/json.h +++ b/lib/jsoncpp/json/json.h @@ -82,17 +82,25 @@ license you like. // Beginning of content of file: include/json/version.h // ////////////////////////////////////////////////////////////////////// -// DO NOT EDIT. This file (and "version") is generated by CMake. -// Run CMake configure step to update it. #ifndef JSON_VERSION_H_INCLUDED -# define JSON_VERSION_H_INCLUDED +#define JSON_VERSION_H_INCLUDED -# define JSONCPP_VERSION_STRING "1.8.4" -# define JSONCPP_VERSION_MAJOR 1 -# define JSONCPP_VERSION_MINOR 8 -# define JSONCPP_VERSION_PATCH 4 -# define JSONCPP_VERSION_QUALIFIER -# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8)) +// Note: version must be updated in three places when doing a release. This +// annoying process ensures that amalgamate, CMake, and meson all report the +// correct version. +// 1. /meson.build +// 2. /include/json/version.h +// 3. /CMakeLists.txt +// IMPORTANT: also update the SOVERSION!! + +#define JSONCPP_VERSION_STRING "1.9.4" +#define JSONCPP_VERSION_MAJOR 1 +#define JSONCPP_VERSION_MINOR 9 +#define JSONCPP_VERSION_PATCH 3 +#define JSONCPP_VERSION_QUALIFIER +#define JSONCPP_VERSION_HEXA \ + ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \ + (JSONCPP_VERSION_PATCH << 8)) #ifdef JSONCPP_USING_SECURE_MEMORY #undef JSONCPP_USING_SECURE_MEMORY @@ -112,6 +120,109 @@ license you like. +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_ALLOCATOR_H_INCLUDED +#define JSON_ALLOCATOR_H_INCLUDED + +#include <cstring> +#include <memory> + +#pragma pack(push, 8) + +namespace Json { +template <typename T> class SecureAllocator { +public: + // Type definitions + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + + /** + * Allocate memory for N items using the standard allocator. + */ + pointer allocate(size_type n) { + // allocate using "global operator new" + return static_cast<pointer>(::operator new(n * sizeof(T))); + } + + /** + * Release memory which was allocated for N items at pointer P. + * + * The memory block is filled with zeroes before being released. + * The pointer argument is tagged as "volatile" to prevent the + * compiler optimizing out this critical step. + */ + void deallocate(volatile pointer p, size_type n) { + std::memset(p, 0, n * sizeof(T)); + // free using "global operator delete" + ::operator delete(p); + } + + /** + * Construct an item in-place at pointer P. + */ + template <typename... Args> void construct(pointer p, Args&&... args) { + // construct using "placement new" and "perfect forwarding" + ::new (static_cast<void*>(p)) T(std::forward<Args>(args)...); + } + + size_type max_size() const { return size_t(-1) / sizeof(T); } + + pointer address(reference x) const { return std::addressof(x); } + + const_pointer address(const_reference x) const { return std::addressof(x); } + + /** + * Destroy an item in-place at pointer P. + */ + void destroy(pointer p) { + // destroy using "explicit destructor" + p->~T(); + } + + // Boilerplate + SecureAllocator() {} + template <typename U> SecureAllocator(const SecureAllocator<U>&) {} + template <typename U> struct rebind { using other = SecureAllocator<U>; }; +}; + +template <typename T, typename U> +bool operator==(const SecureAllocator<T>&, const SecureAllocator<U>&) { + return true; +} + +template <typename T, typename U> +bool operator!=(const SecureAllocator<T>&, const SecureAllocator<U>&) { + return false; +} + +} // namespace Json + +#pragma pack(pop) + +#endif // JSON_ALLOCATOR_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + + + + + + // ////////////////////////////////////////////////////////////////////// // Beginning of content of file: include/json/config.h // ////////////////////////////////////////////////////////////////////// @@ -123,19 +234,14 @@ license you like. #ifndef JSON_CONFIG_H_INCLUDED #define JSON_CONFIG_H_INCLUDED -#include <stddef.h> -#include <string> //typedef String -#include <stdint.h> //typedef int64_t, uint64_t - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of -/// std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 +#include <cstddef> +#include <cstdint> +#include <istream> +#include <memory> +#include <ostream> +#include <sstream> +#include <string> +#include <type_traits> // If non-zero, the library uses exceptions to report bad input instead of C // assertion macros. The default is to use exceptions. @@ -143,164 +249,132 @@ license you like. #define JSON_USE_EXCEPTION 1 #endif +// Temporary, tracked for removal with issue #982. +#ifndef JSON_USE_NULLREF +#define JSON_USE_NULLREF 1 +#endif + /// If defined, indicates that the source file is amalgamated /// to prevent private header inclusion. /// Remarks: it is automatically defined in the generated amalgamated header. // #define JSON_IS_AMALGAMATION -#ifdef JSON_IN_CPPTL -#include <cpptl/config.h> -#ifndef JSON_USE_CPPTL -#define JSON_USE_CPPTL 1 -#endif -#endif - -#ifdef JSON_IN_CPPTL -#define JSON_API CPPTL_API -#elif defined(JSON_DLL_BUILD) +// Export macros for DLL visibility +#if defined(JSON_DLL_BUILD) #if defined(_MSC_VER) || defined(__MINGW32__) #define JSON_API __declspec(dllexport) #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#elif defined(__GNUC__) || defined(__clang__) +#define JSON_API __attribute__((visibility("default"))) #endif // if defined(_MSC_VER) + #elif defined(JSON_DLL) #if defined(_MSC_VER) || defined(__MINGW32__) #define JSON_API __declspec(dllimport) #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING #endif // if defined(_MSC_VER) -#endif // ifdef JSON_IN_CPPTL +#endif // ifdef JSON_DLL_BUILD + #if !defined(JSON_API) #define JSON_API #endif +#if defined(_MSC_VER) && _MSC_VER < 1800 +#error \ + "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +// As recommended at +// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 +extern JSON_API int msvc_pre1900_c99_snprintf(char* outBuf, size_t size, + const char* format, ...); +#define jsoncpp_snprintf msvc_pre1900_c99_snprintf +#else +#define jsoncpp_snprintf std::snprintf +#endif + // If JSON_NO_INT64 is defined, then Json only support C++ "int" type for // integer // Storages, and 64 bits integer support is disabled. // #define JSON_NO_INT64 1 -#if defined(_MSC_VER) // MSVC -# if _MSC_VER <= 1200 // MSVC 6 - // Microsoft Visual Studio 6 only support conversion from __int64 to double - // (no conversion from unsigned __int64). -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 - // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' - // characters in the debug information) - // All projects I've ever seen with VS6 were using this globally (not bothering - // with pragma push/pop). -# pragma warning(disable : 4786) -# endif // MSVC 6 - -# if _MSC_VER >= 1500 // MSVC 2008 - /// Indicates that the following function is deprecated. -# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -# endif - -#endif // defined(_MSC_VER) - -// In c++11 the override keyword allows you to explicitly define that a function -// is intended to override the base-class version. This makes the code more -// managable and fixes a set of common hard-to-find bugs. -#if __cplusplus >= 201103L -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT noexcept -#elif defined(_MSC_VER) && _MSC_VER > 1600 && _MSC_VER < 1900 -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT throw() -#elif defined(_MSC_VER) && _MSC_VER >= 1900 -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT noexcept -#else -# define JSONCPP_OVERRIDE -# define JSONCPP_NOEXCEPT throw() -#endif - -#ifndef JSON_HAS_RVALUE_REFERENCES - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010 -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // MSVC >= 2010 +// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. +// C++11 should be used directly in JSONCPP. +#define JSONCPP_OVERRIDE override #ifdef __clang__ -#if __has_feature(cxx_rvalue_references) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // has_feature - -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // GXX_EXPERIMENTAL - -#endif // __clang__ || __GNUC__ - -#endif // not defined JSON_HAS_RVALUE_REFERENCES - -#ifndef JSON_HAS_RVALUE_REFERENCES -#define JSON_HAS_RVALUE_REFERENCES 0 +#if __has_extension(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) #endif - -#ifdef __clang__ -# if __has_extension(attribute_deprecated_with_message) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# endif -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) -# endif // GNUC version -#endif // __clang__ || __GNUC__ +#elif defined(__GNUC__) // not clang (gcc comes later since clang emulates gcc) +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif // GNUC version +#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates + // MSVC) +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#endif // __clang__ || __GNUC__ || _MSC_VER #if !defined(JSONCPP_DEPRECATED) #define JSONCPP_DEPRECATED(message) #endif // if !defined(JSONCPP_DEPRECATED) -#if __GNUC__ >= 6 -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 #endif #if !defined(JSON_IS_AMALGAMATION) -# include "version.h" - -# if JSONCPP_USING_SECURE_MEMORY -# include "allocator.h" //typedef Allocator -# endif +#include "allocator.h" +#include "version.h" #endif // if !defined(JSON_IS_AMALGAMATION) namespace Json { -typedef int Int; -typedef unsigned int UInt; +using Int = int; +using UInt = unsigned int; #if defined(JSON_NO_INT64) -typedef int LargestInt; -typedef unsigned int LargestUInt; +using LargestInt = int; +using LargestUInt = unsigned int; #undef JSON_HAS_INT64 #else // if defined(JSON_NO_INT64) // For Microsoft Visual use specific types as long long is not supported #if defined(_MSC_VER) // Microsoft Visual Studio -typedef __int64 Int64; -typedef unsigned __int64 UInt64; +using Int64 = __int64; +using UInt64 = unsigned __int64; #else // if defined(_MSC_VER) // Other platforms, use long long -typedef int64_t Int64; -typedef uint64_t UInt64; -#endif // if defined(_MSC_VER) -typedef Int64 LargestInt; -typedef UInt64 LargestUInt; +using Int64 = int64_t; +using UInt64 = uint64_t; +#endif // if defined(_MSC_VER) +using LargestInt = Int64; +using LargestUInt = UInt64; #define JSON_HAS_INT64 #endif // if defined(JSON_NO_INT64) -#if JSONCPP_USING_SECURE_MEMORY -#define JSONCPP_STRING std::basic_string<char, std::char_traits<char>, Json::SecureAllocator<char> > -#define JSONCPP_OSTRINGSTREAM std::basic_ostringstream<char, std::char_traits<char>, Json::SecureAllocator<char> > -#define JSONCPP_OSTREAM std::basic_ostream<char, std::char_traits<char>> -#define JSONCPP_ISTRINGSTREAM std::basic_istringstream<char, std::char_traits<char>, Json::SecureAllocator<char> > -#define JSONCPP_ISTREAM std::istream -#else -#define JSONCPP_STRING std::string -#define JSONCPP_OSTRINGSTREAM std::ostringstream -#define JSONCPP_OSTREAM std::ostream -#define JSONCPP_ISTRINGSTREAM std::istringstream -#define JSONCPP_ISTREAM std::istream -#endif // if JSONCPP_USING_SECURE_MEMORY -} // end namespace Json + +template <typename T> +using Allocator = + typename std::conditional<JSONCPP_USING_SECURE_MEMORY, SecureAllocator<T>, + std::allocator<T>>::type; +using String = std::basic_string<char, std::char_traits<char>, Allocator<char>>; +using IStringStream = + std::basic_istringstream<String::value_type, String::traits_type, + String::allocator_type>; +using OStringStream = + std::basic_ostringstream<String::value_type, String::traits_type, + String::allocator_type>; +using IStream = std::istream; +using OStream = std::ostream; +} // namespace Json + +// Legacy names (formerly macros). +using JSONCPP_STRING = Json::String; +using JSONCPP_ISTRINGSTREAM = Json::IStringStream; +using JSONCPP_OSTRINGSTREAM = Json::OStringStream; +using JSONCPP_ISTREAM = Json::IStream; +using JSONCPP_OSTREAM = Json::OStream; #endif // JSON_CONFIG_H_INCLUDED @@ -332,17 +406,23 @@ typedef UInt64 LargestUInt; namespace Json { // writer.h +class StreamWriter; +class StreamWriterBuilder; +class Writer; class FastWriter; class StyledWriter; +class StyledStreamWriter; // reader.h class Reader; +class CharReader; +class CharReaderBuilder; -// features.h +// json_features.h class Features; // value.h -typedef unsigned int ArrayIndex; +using ArrayIndex = unsigned int; class StaticString; class Path; class PathArgument; @@ -365,7 +445,7 @@ class ValueConstIterator; // ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/features.h +// Beginning of content of file: include/json/json_features.h // ////////////////////////////////////////////////////////////////////// // Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors @@ -373,8 +453,8 @@ class ValueConstIterator; // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE -#ifndef CPPTL_JSON_FEATURES_H_INCLUDED -#define CPPTL_JSON_FEATURES_H_INCLUDED +#ifndef JSON_FEATURES_H_INCLUDED +#define JSON_FEATURES_H_INCLUDED #if !defined(JSON_IS_AMALGAMATION) #include "forwards.h" @@ -411,27 +491,27 @@ public: Features(); /// \c true if comments are allowed. Default: \c true. - bool allowComments_; + bool allowComments_{true}; /// \c true if root must be either an array or an object value. Default: \c /// false. - bool strictRoot_; + bool strictRoot_{false}; /// \c true if dropped null placeholders are allowed. Default: \c false. - bool allowDroppedNullPlaceholders_; + bool allowDroppedNullPlaceholders_{false}; /// \c true if numeric object key are allowed. Default: \c false. - bool allowNumericKeys_; + bool allowNumericKeys_{false}; }; } // namespace Json #pragma pack(pop) -#endif // CPPTL_JSON_FEATURES_H_INCLUDED +#endif // JSON_FEATURES_H_INCLUDED // ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/features.h +// End of content of file: include/json/json_features.h // ////////////////////////////////////////////////////////////////////// @@ -448,37 +528,48 @@ public: // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE -#ifndef CPPTL_JSON_H_INCLUDED -#define CPPTL_JSON_H_INCLUDED +#ifndef JSON_H_INCLUDED +#define JSON_H_INCLUDED #if !defined(JSON_IS_AMALGAMATION) #include "forwards.h" #endif // if !defined(JSON_IS_AMALGAMATION) -#include <string> -#include <vector> -#include <exception> -#ifndef JSON_USE_CPPTL_SMALLMAP -#include <map> -#else -#include <cpptl/smallmap.h> -#endif -#ifdef JSON_USE_CPPTL -#include <cpptl/forwards.h> -#endif - -//Conditional NORETURN attribute on the throw functions would: +// Conditional NORETURN attribute on the throw functions would: // a) suppress false positives from static code analysis // b) possibly improve optimization opportunities. #if !defined(JSONCPP_NORETURN) -# if defined(_MSC_VER) -# define JSONCPP_NORETURN __declspec(noreturn) -# elif defined(__GNUC__) -# define JSONCPP_NORETURN __attribute__ ((__noreturn__)) -# else -# define JSONCPP_NORETURN -# endif +#if defined(_MSC_VER) && _MSC_VER == 1800 +#define JSONCPP_NORETURN __declspec(noreturn) +#else +#define JSONCPP_NORETURN [[noreturn]] #endif +#endif + +// Support for '= delete' with template declarations was a late addition +// to the c++11 standard and is rejected by clang 3.8 and Apple clang 8.2 +// even though these declare themselves to be c++11 compilers. +#if !defined(JSONCPP_TEMPLATE_DELETE) +#if defined(__clang__) && defined(__apple_build_version__) +#if __apple_build_version__ <= 8000042 +#define JSONCPP_TEMPLATE_DELETE +#endif +#elif defined(__clang__) +#if __clang_major__ == 3 && __clang_minor__ <= 8 +#define JSONCPP_TEMPLATE_DELETE +#endif +#endif +#if !defined(JSONCPP_TEMPLATE_DELETE) +#define JSONCPP_TEMPLATE_DELETE = delete +#endif +#endif + +#include <array> +#include <exception> +#include <map> +#include <memory> +#include <string> +#include <vector> // Disable warning C4251: <data member>: <type> needs to have dll-interface to // be used by... @@ -493,17 +584,19 @@ public: */ namespace Json { +#if JSON_USE_EXCEPTION /** Base class for all exceptions we throw. * * We use nothing but these internally. Of course, STL can throw others. */ class JSON_API Exception : public std::exception { public: - Exception(JSONCPP_STRING const& msg); - ~Exception() JSONCPP_NOEXCEPT JSONCPP_OVERRIDE; - char const* what() const JSONCPP_NOEXCEPT JSONCPP_OVERRIDE; + Exception(String msg); + ~Exception() noexcept override; + char const* what() const noexcept override; + protected: - JSONCPP_STRING msg_; + String msg_; }; /** Exceptions which the user cannot easily avoid. @@ -514,7 +607,7 @@ protected: */ class JSON_API RuntimeError : public Exception { public: - RuntimeError(JSONCPP_STRING const& msg); + RuntimeError(String const& msg); }; /** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. @@ -525,13 +618,14 @@ public: */ class JSON_API LogicError : public Exception { public: - LogicError(JSONCPP_STRING const& msg); + LogicError(String const& msg); }; +#endif /// used internally -JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg); +JSONCPP_NORETURN void throwRuntimeError(String const& msg); /// used internally -JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg); +JSONCPP_NORETURN void throwLogicError(String const& msg); /** \brief Type of the value held by a Value object. */ @@ -554,10 +648,12 @@ enum CommentPlacement { numberOfCommentPlacement }; -//# ifdef JSON_USE_CPPTL -// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames; -// typedef CppTL::AnyEnumerator<const Value &> EnumValues; -//# endif +/** \brief Type of precision for formatting of real values. + */ +enum PrecisionType { + significantDigits = 0, ///< we set max number of significant digits in string + decimalPlaces ///< we set max number of digits after "." in string +}; /** \brief Lightweight wrapper to tag static string. * @@ -610,7 +706,7 @@ private: * The get() methods can be used to obtain default value in the case the * required element does not exist. * - * It is possible to iterate over the list of a #objectValue values using + * It is possible to iterate over the list of member keys of an object using * the getMemberNames() method. * * \note #Value string-length fit in size_t, but keys must be < 2^30. @@ -621,76 +717,86 @@ private: */ class JSON_API Value { friend class ValueIteratorBase; + public: - typedef std::vector<JSONCPP_STRING> Members; - typedef ValueIterator iterator; - typedef ValueConstIterator const_iterator; - typedef Json::UInt UInt; - typedef Json::Int Int; + using Members = std::vector<String>; + using iterator = ValueIterator; + using const_iterator = ValueConstIterator; + using UInt = Json::UInt; + using Int = Json::Int; #if defined(JSON_HAS_INT64) - typedef Json::UInt64 UInt64; - typedef Json::Int64 Int64; + using UInt64 = Json::UInt64; + using Int64 = Json::Int64; #endif // defined(JSON_HAS_INT64) - typedef Json::LargestInt LargestInt; - typedef Json::LargestUInt LargestUInt; - typedef Json::ArrayIndex ArrayIndex; + using LargestInt = Json::LargestInt; + using LargestUInt = Json::LargestUInt; + using ArrayIndex = Json::ArrayIndex; // Required for boost integration, e. g. BOOST_TEST - typedef std::string value_type; + using value_type = std::string; - static const Value& null; ///< We regret this reference to a global instance; prefer the simpler Value(). - static const Value& nullRef; ///< just a kludge for binary-compatibility; same as null - static Value const& nullSingleton(); ///< Prefer this to null or nullRef. +#if JSON_USE_NULLREF + // Binary compatibility kludges, do not use. + static const Value& null; + static const Value& nullRef; +#endif + + // null and nullRef are deprecated, use this instead. + static Value const& nullSingleton(); /// Minimum signed integer value that can be stored in a Json::Value. - static const LargestInt minLargestInt; + static constexpr LargestInt minLargestInt = + LargestInt(~(LargestUInt(-1) / 2)); /// Maximum signed integer value that can be stored in a Json::Value. - static const LargestInt maxLargestInt; + static constexpr LargestInt maxLargestInt = LargestInt(LargestUInt(-1) / 2); /// Maximum unsigned integer value that can be stored in a Json::Value. - static const LargestUInt maxLargestUInt; + static constexpr LargestUInt maxLargestUInt = LargestUInt(-1); /// Minimum signed int value that can be stored in a Json::Value. - static const Int minInt; + static constexpr Int minInt = Int(~(UInt(-1) / 2)); /// Maximum signed int value that can be stored in a Json::Value. - static const Int maxInt; + static constexpr Int maxInt = Int(UInt(-1) / 2); /// Maximum unsigned int value that can be stored in a Json::Value. - static const UInt maxUInt; + static constexpr UInt maxUInt = UInt(-1); #if defined(JSON_HAS_INT64) /// Minimum signed 64 bits int value that can be stored in a Json::Value. - static const Int64 minInt64; + static constexpr Int64 minInt64 = Int64(~(UInt64(-1) / 2)); /// Maximum signed 64 bits int value that can be stored in a Json::Value. - static const Int64 maxInt64; + static constexpr Int64 maxInt64 = Int64(UInt64(-1) / 2); /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. - static const UInt64 maxUInt64; + static constexpr UInt64 maxUInt64 = UInt64(-1); #endif // defined(JSON_HAS_INT64) - + /// Default precision for real value for string representation. + static constexpr UInt defaultRealPrecision = 17; + // The constant is hard-coded because some compiler have trouble + // converting Value::maxUInt64 to a double correctly (AIX/xlC). + // Assumes that UInt64 is a 64 bits integer. + static constexpr double maxUInt64AsDouble = 18446744073709551615.0; +// Workaround for bug in the NVIDIAs CUDA 9.1 nvcc compiler +// when using gcc and clang backend compilers. CZString +// cannot be defined as private. See issue #486 +#ifdef __NVCC__ +public: +#else private: +#endif #ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION class CZString { public: - enum DuplicationPolicy { - noDuplication = 0, - duplicate, - duplicateOnCopy - }; + enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy }; CZString(ArrayIndex index); CZString(char const* str, unsigned length, DuplicationPolicy allocate); CZString(CZString const& other); -#if JSON_HAS_RVALUE_REFERENCES CZString(CZString&& other); -#endif ~CZString(); CZString& operator=(const CZString& other); - -#if JSON_HAS_RVALUE_REFERENCES CZString& operator=(CZString&& other); -#endif bool operator<(CZString const& other) const; bool operator==(CZString const& other) const; ArrayIndex index() const; - //const char* c_str() const; ///< \deprecated + // const char* c_str() const; ///< \deprecated char const* data() const; unsigned length() const; bool isStaticString() const; @@ -699,11 +805,11 @@ private: void swap(CZString& other); struct StringStorage { - unsigned policy_: 2; - unsigned length_: 30; // 1GB max + unsigned policy_ : 2; + unsigned length_ : 30; // 1GB max }; - char const* cstr_; // actually, a prefixed string, unless policy is noDup + char const* cstr_; // actually, a prefixed string, unless policy is noDup union { ArrayIndex index_; StringStorage storage_; @@ -711,29 +817,26 @@ private: }; public: -#ifndef JSON_USE_CPPTL_SMALLMAP typedef std::map<CZString, Value> ObjectValues; -#else - typedef CppTL::SmallMap<CZString, Value> ObjectValues; -#endif // ifndef JSON_USE_CPPTL_SMALLMAP #endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION public: - /** \brief Create a default Value of the given type. - - This is a very useful constructor. - To create an empty array, pass arrayValue. - To create an empty object, pass objectValue. - Another Value can then be set to this one by assignment. -This is useful since clear() and resize() will not alter types. - - Examples: -\code -Json::Value null_value; // null -Json::Value arr_value(Json::arrayValue); // [] -Json::Value obj_value(Json::objectValue); // {} -\endcode - */ + /** + * \brief Create a default Value of the given type. + * + * This is a very useful constructor. + * To create an empty array, pass arrayValue. + * To create an empty object, pass objectValue. + * Another Value can then be set to this one by assignment. + * This is useful since clear() and resize() will not alter types. + * + * Examples: + * \code + * Json::Value null_value; // null + * Json::Value arr_value(Json::arrayValue); // [] + * Json::Value obj_value(Json::objectValue); // {} + * \endcode + */ Value(ValueType type = nullValue); Value(Int value); Value(UInt value); @@ -744,38 +847,35 @@ Json::Value obj_value(Json::objectValue); // {} Value(double value); Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) Value(const char* begin, const char* end); ///< Copy all, incl zeroes. - /** \brief Constructs a value from a static string. - + /** + * \brief Constructs a value from a static string. + * * Like other value string constructor but do not duplicate the string for - * internal storage. The given string must remain alive after the call to this - * constructor. + * internal storage. The given string must remain alive after the call to + * this constructor. + * * \note This works only for null-terminated strings. (We cannot change the - * size of this class, so we have nowhere to store the length, - * which might be computed later for various operations.) + * size of this class, so we have nowhere to store the length, which might be + * computed later for various operations.) * * Example of usage: - * \code - * static StaticString foo("some text"); - * Json::Value aValue(foo); - * \endcode + * \code + * static StaticString foo("some text"); + * Json::Value aValue(foo); + * \endcode */ Value(const StaticString& value); - Value(const JSONCPP_STRING& value); ///< Copy data() til size(). Embedded zeroes too. -#ifdef JSON_USE_CPPTL - Value(const CppTL::ConstString& value); -#endif + Value(const String& value); Value(bool value); - /// Deep copy. + Value(std::nullptr_t ptr) = delete; Value(const Value& other); -#if JSON_HAS_RVALUE_REFERENCES - /// Move constructor Value(Value&& other); -#endif ~Value(); - /// Deep copy, then swap(other). - /// \note Over-write existing comments. To preserve comments, use #swapPayload(). - Value& operator=(Value other); + /// \note Overwrite existing comments. To preserve comments, use + /// #swapPayload(). + Value& operator=(const Value& other); + Value& operator=(Value&& other); /// Swap everything. void swap(Value& other); @@ -800,17 +900,14 @@ Json::Value obj_value(Json::objectValue); // {} const char* asCString() const; ///< Embedded zeroes could cause you trouble! #if JSONCPP_USING_SECURE_MEMORY - unsigned getCStringLength() const; //Allows you to understand the length of the CString + unsigned getCStringLength() const; // Allows you to understand the length of + // the CString #endif - JSONCPP_STRING asString() const; ///< Embedded zeroes are possible. + String asString() const; ///< Embedded zeroes are possible. /** Get raw char* of string-value. * \return false if !string. (Seg-fault if str or end are NULL.) */ - bool getString( - char const** begin, char const** end) const; -#ifdef JSON_USE_CPPTL - CppTL::ConstString asConstString() const; -#endif + bool getString(char const** begin, char const** end) const; Int asInt() const; UInt asUInt() const; #if defined(JSON_HAS_INT64) @@ -836,6 +933,10 @@ Json::Value obj_value(Json::objectValue); // {} bool isArray() const; bool isObject() const; + /// The `as<T>` and `is<T>` member function templates and specializations. + template <typename T> T as() const JSONCPP_TEMPLATE_DELETE; + template <typename T> bool is() const JSONCPP_TEMPLATE_DELETE; + bool isConvertibleTo(ValueType other) const; /// Number of values in array or object @@ -853,42 +954,33 @@ Json::Value obj_value(Json::objectValue); // {} /// \post type() is unchanged void clear(); - /// Resize the array to size elements. + /// Resize the array to newSize elements. /// New elements are initialized to null. /// May only be called on nullValue or arrayValue. /// \pre type() is arrayValue or nullValue /// \post type() is arrayValue - void resize(ArrayIndex size); + void resize(ArrayIndex newSize); - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are - /// inserted - /// in the array so that its size is index+1. + //@{ + /// Access an array element (zero based index). If the array contains less + /// than index element, then null value are inserted in the array so that + /// its size is index+1. /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) + /// this from the operator[] which takes a string.) Value& operator[](ArrayIndex index); - - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are - /// inserted - /// in the array so that its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) Value& operator[](int index); + //@} - /// Access an array element (zero based index ) + //@{ + /// Access an array element (zero based index). /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) + /// this from the operator[] which takes a string.) const Value& operator[](ArrayIndex index) const; - - /// Access an array element (zero based index ) - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) const Value& operator[](int index) const; + //@} /// If the array contains at least index+1 elements, returns the element - /// value, - /// otherwise returns defaultValue. + /// value, otherwise returns defaultValue. Value get(ArrayIndex index, const Value& defaultValue) const; /// Return true if index < size(). bool isValidIndex(ArrayIndex index) const; @@ -896,61 +988,51 @@ Json::Value obj_value(Json::objectValue); // {} /// /// Equivalent to jsonvalue[jsonvalue.size()] = value; Value& append(const Value& value); - -#if JSON_HAS_RVALUE_REFERENCES Value& append(Value&& value); -#endif + + /// \brief Insert value in array at specific index + bool insert(ArrayIndex index, const Value& newValue); + bool insert(ArrayIndex index, Value&& newValue); /// Access an object value by name, create a null member if it does not exist. /// \note Because of our implementation, keys are limited to 2^30 -1 chars. - /// Exceeding that will cause an exception. + /// Exceeding that will cause an exception. Value& operator[](const char* key); /// Access an object value by name, returns null if there is no member with /// that name. const Value& operator[](const char* key) const; /// Access an object value by name, create a null member if it does not exist. /// \param key may contain embedded nulls. - Value& operator[](const JSONCPP_STRING& key); + Value& operator[](const String& key); /// Access an object value by name, returns null if there is no member with /// that name. /// \param key may contain embedded nulls. - const Value& operator[](const JSONCPP_STRING& key) const; + const Value& operator[](const String& key) const; /** \brief Access an object value by name, create a null member if it does not - exist. - - * If the object has no entry for that name, then the member name used to store - * the new entry is not duplicated. + * exist. + * + * If the object has no entry for that name, then the member name used to + * store the new entry is not duplicated. * Example of use: - * \code - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode */ Value& operator[](const StaticString& key); -#ifdef JSON_USE_CPPTL - /// Access an object value by name, create a null member if it does not exist. - Value& operator[](const CppTL::ConstString& key); - /// Access an object value by name, returns null if there is no member with - /// that name. - const Value& operator[](const CppTL::ConstString& key) const; -#endif /// Return the member named key if it exist, defaultValue otherwise. /// \note deep copy Value get(const char* key, const Value& defaultValue) const; /// Return the member named key if it exist, defaultValue otherwise. /// \note deep copy /// \note key may contain embedded nulls. - Value get(const char* begin, const char* end, const Value& defaultValue) const; + Value get(const char* begin, const char* end, + const Value& defaultValue) const; /// Return the member named key if it exist, defaultValue otherwise. /// \note deep copy /// \param key may contain embedded nulls. - Value get(const JSONCPP_STRING& key, const Value& defaultValue) const; -#ifdef JSON_USE_CPPTL - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - Value get(const CppTL::ConstString& key, const Value& defaultValue) const; -#endif + Value get(const String& key, const Value& defaultValue) const; /// Most general and efficient version of isMember()const, get()const, /// and operator[]const /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 @@ -958,51 +1040,44 @@ Json::Value obj_value(Json::objectValue); // {} /// Most general and efficient version of object-mutators. /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. - Value const* demand(char const* begin, char const* end); + Value* demand(char const* begin, char const* end); /// \brief Remove and return the named member. /// /// Do nothing if it did not exist. - /// \return the removed Value, or null. /// \pre type() is objectValue or nullValue /// \post type() is unchanged - /// \deprecated void removeMember(const char* key); /// Same as removeMember(const char*) /// \param key may contain embedded nulls. - /// \deprecated - void removeMember(const JSONCPP_STRING& key); + void removeMember(const String& key); /// Same as removeMember(const char* begin, const char* end, Value* removed), /// but 'key' is null-terminated. bool removeMember(const char* key, Value* removed); /** \brief Remove the named map member. - - Update 'removed' iff removed. - \param key may contain embedded nulls. - \return true iff removed (no exceptions) - */ - bool removeMember(JSONCPP_STRING const& key, Value* removed); - /// Same as removeMember(JSONCPP_STRING const& key, Value* removed) + * + * Update 'removed' iff removed. + * \param key may contain embedded nulls. + * \return true iff removed (no exceptions) + */ + bool removeMember(String const& key, Value* removed); + /// Same as removeMember(String const& key, Value* removed) bool removeMember(const char* begin, const char* end, Value* removed); /** \brief Remove the indexed array element. - - O(n) expensive operations. - Update 'removed' iff removed. - \return true iff removed (no exceptions) - */ - bool removeIndex(ArrayIndex i, Value* removed); + * + * O(n) expensive operations. + * Update 'removed' iff removed. + * \return true if removed (no exceptions) + */ + bool removeIndex(ArrayIndex index, Value* removed); /// Return true if the object has a member named key. /// \note 'key' must be null-terminated. bool isMember(const char* key) const; /// Return true if the object has a member named key. /// \param key may contain embedded nulls. - bool isMember(const JSONCPP_STRING& key) const; - /// Same as isMember(JSONCPP_STRING const& key)const + bool isMember(const String& key) const; + /// Same as isMember(String const& key)const bool isMember(const char* begin, const char* end) const; -#ifdef JSON_USE_CPPTL - /// Return true if the object has a member named key. - bool isMember(const CppTL::ConstString& key) const; -#endif /// \brief Return a list of the member names. /// @@ -1011,23 +1086,22 @@ Json::Value obj_value(Json::objectValue); // {} /// \post if type() was nullValue, it remains nullValue Members getMemberNames() const; - //# ifdef JSON_USE_CPPTL - // EnumMemberNames enumMemberNames() const; - // EnumValues enumValues() const; - //# endif - /// \deprecated Always pass len. - JSONCPP_DEPRECATED("Use setComment(JSONCPP_STRING const&) instead.") - void setComment(const char* comment, CommentPlacement placement); + JSONCPP_DEPRECATED("Use setComment(String const&) instead.") + void setComment(const char* comment, CommentPlacement placement) { + setComment(String(comment, strlen(comment)), placement); + } /// Comments must be //... or /* ... */ - void setComment(const char* comment, size_t len, CommentPlacement placement); + void setComment(const char* comment, size_t len, CommentPlacement placement) { + setComment(String(comment, len), placement); + } /// Comments must be //... or /* ... */ - void setComment(const JSONCPP_STRING& comment, CommentPlacement placement); + void setComment(String comment, CommentPlacement placement); bool hasComment(CommentPlacement placement) const; /// Include delimiters and embedded newlines. - JSONCPP_STRING getComment(CommentPlacement placement) const; + String getComment(CommentPlacement placement) const; - JSONCPP_STRING toStyledString() const; + String toStyledString() const; const_iterator begin() const; const_iterator end() const; @@ -1043,20 +1117,20 @@ Json::Value obj_value(Json::objectValue); // {} ptrdiff_t getOffsetLimit() const; private: + void setType(ValueType v) { + bits_.value_type_ = static_cast<unsigned char>(v); + } + bool isAllocated() const { return bits_.allocated_; } + void setIsAllocated(bool v) { bits_.allocated_ = v; } + void initBasic(ValueType type, bool allocated = false); + void dupPayload(const Value& other); + void releasePayload(); + void dupMeta(const Value& other); Value& resolveReference(const char* key); Value& resolveReference(const char* key, const char* end); - struct CommentInfo { - CommentInfo(); - ~CommentInfo(); - - void setComment(const char* text, size_t len); - - char* comment_; - }; - // struct MemberNamesTransform //{ // typedef const char *result_type; @@ -1071,13 +1145,33 @@ private: LargestUInt uint_; double real_; bool bool_; - char* string_; // actually ptr to unsigned, followed by str, unless !allocated_ + char* string_; // if allocated_, ptr to { unsigned, char[] }. ObjectValues* map_; } value_; - ValueType type_ : 8; - unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. - // If not allocated_, string_ must be null-terminated. - CommentInfo* comments_; + + struct { + // Really a ValueType, but types should agree for bitfield packing. + unsigned int value_type_ : 8; + // Unless allocated_, string_ must be null-terminated. + unsigned int allocated_ : 1; + } bits_; + + class Comments { + public: + Comments() = default; + Comments(const Comments& that); + Comments(Comments&& that); + Comments& operator=(const Comments& that); + Comments& operator=(Comments&& that); + bool has(CommentPlacement slot) const; + String get(CommentPlacement slot) const; + void set(CommentPlacement slot, String comment); + + private: + using Array = std::array<String, numberOfCommentPlacement>; + std::unique_ptr<Array> ptr_; + }; + Comments comments_; // [start, limit) byte offsets in the source JSON text from which this Value // was extracted. @@ -1085,6 +1179,36 @@ private: ptrdiff_t limit_; }; +template <> inline bool Value::as<bool>() const { return asBool(); } +template <> inline bool Value::is<bool>() const { return isBool(); } + +template <> inline Int Value::as<Int>() const { return asInt(); } +template <> inline bool Value::is<Int>() const { return isInt(); } + +template <> inline UInt Value::as<UInt>() const { return asUInt(); } +template <> inline bool Value::is<UInt>() const { return isUInt(); } + +#if defined(JSON_HAS_INT64) +template <> inline Int64 Value::as<Int64>() const { return asInt64(); } +template <> inline bool Value::is<Int64>() const { return isInt64(); } + +template <> inline UInt64 Value::as<UInt64>() const { return asUInt64(); } +template <> inline bool Value::is<UInt64>() const { return isUInt64(); } +#endif + +template <> inline double Value::as<double>() const { return asDouble(); } +template <> inline bool Value::is<double>() const { return isDouble(); } + +template <> inline String Value::as<String>() const { return asString(); } +template <> inline bool Value::is<String>() const { return isString(); } + +/// These `as` specializations are type conversions, and do not have a +/// corresponding `is`. +template <> inline float Value::as<float>() const { return asFloat(); } +template <> inline const char* Value::as<const char*>() const { + return asCString(); +} + /** \brief Experimental and untested: represents an element of the "path" to * access a node. */ @@ -1095,17 +1219,13 @@ public: PathArgument(); PathArgument(ArrayIndex index); PathArgument(const char* key); - PathArgument(const JSONCPP_STRING& key); + PathArgument(String key); private: - enum Kind { - kindNone = 0, - kindIndex, - kindKey - }; - JSONCPP_STRING key_; - ArrayIndex index_; - Kind kind_; + enum Kind { kindNone = 0, kindIndex, kindKey }; + String key_; + ArrayIndex index_{}; + Kind kind_{kindNone}; }; /** \brief Experimental and untested: represents a "path" to access a node. @@ -1117,12 +1237,11 @@ private: * - ".name1.name2.name3" * - ".[0][1][2].name1[3]" * - ".%" => member name is provided as parameter - * - ".[%]" => index is provied as parameter + * - ".[%]" => index is provided as parameter */ class JSON_API Path { public: - Path(const JSONCPP_STRING& path, - const PathArgument& a1 = PathArgument(), + Path(const String& path, const PathArgument& a1 = PathArgument(), const PathArgument& a2 = PathArgument(), const PathArgument& a3 = PathArgument(), const PathArgument& a4 = PathArgument(), @@ -1135,15 +1254,13 @@ public: Value& make(Value& root) const; private: - typedef std::vector<const PathArgument*> InArgs; - typedef std::vector<PathArgument> Args; + using InArgs = std::vector<const PathArgument*>; + using Args = std::vector<PathArgument>; - void makePath(const JSONCPP_STRING& path, const InArgs& in); - void addPathInArg(const JSONCPP_STRING& path, - const InArgs& in, - InArgs::const_iterator& itInArg, - PathArgument::Kind kind); - void invalidPath(const JSONCPP_STRING& path, int location); + void makePath(const String& path, const InArgs& in); + void addPathInArg(const String& path, const InArgs& in, + InArgs::const_iterator& itInArg, PathArgument::Kind kind); + static void invalidPath(const String& path, int location); Args args_; }; @@ -1153,10 +1270,10 @@ private: */ class JSON_API ValueIteratorBase { public: - typedef std::bidirectional_iterator_tag iterator_category; - typedef unsigned int size_t; - typedef int difference_type; - typedef ValueIteratorBase SelfType; + using iterator_category = std::bidirectional_iterator_tag; + using size_t = unsigned int; + using difference_type = int; + using SelfType = ValueIteratorBase; bool operator==(const SelfType& other) const { return isEqual(other); } @@ -1170,17 +1287,19 @@ public: /// Value. Value key() const; - /// Return the index of the referenced Value, or -1 if it is not an arrayValue. + /// Return the index of the referenced Value, or -1 if it is not an + /// arrayValue. UInt index() const; /// Return the member name of the referenced Value, or "" if it is not an /// objectValue. /// \note Avoid `c_str()` on result, as embedded zeroes are possible. - JSONCPP_STRING name() const; + String name() const; /// Return the member name of the referenced Value. "" if it is not an /// objectValue. - /// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls. + /// \deprecated This cannot be used for UTF-8 strings, since there can be + /// embedded nulls. JSONCPP_DEPRECATED("Use `key = name();` instead.") char const* memberName() const; /// Return the member name of the referenced Value, or NULL if it is not an @@ -1189,7 +1308,14 @@ public: char const* memberName(char const** end) const; protected: - Value& deref() const; + /*! Internal utility functions to assist with implementing + * other iterator functions. The const and non-const versions + * of the "deref" protected methods expose the protected + * current_ member variable in a way that can often be + * optimized away by the compiler. + */ + const Value& deref() const; + Value& deref(); void increment(); @@ -1204,7 +1330,7 @@ protected: private: Value::ObjectValues::iterator current_; // Indicates that iterator is for a null value. - bool isNull_; + bool isNull_{true}; public: // For some reason, BORLAND needs these at the end, rather @@ -1220,20 +1346,21 @@ class JSON_API ValueConstIterator : public ValueIteratorBase { friend class Value; public: - typedef const Value value_type; - //typedef unsigned int size_t; - //typedef int difference_type; - typedef const Value& reference; - typedef const Value* pointer; - typedef ValueConstIterator SelfType; + using value_type = const Value; + // typedef unsigned int size_t; + // typedef int difference_type; + using reference = const Value&; + using pointer = const Value*; + using SelfType = ValueConstIterator; ValueConstIterator(); ValueConstIterator(ValueIterator const& other); private: -/*! \internal Use by Value to create an iterator. - */ + /*! \internal Use by Value to create an iterator. + */ explicit ValueConstIterator(const Value::ObjectValues::iterator& current); + public: SelfType& operator=(const ValueIteratorBase& other); @@ -1270,21 +1397,22 @@ class JSON_API ValueIterator : public ValueIteratorBase { friend class Value; public: - typedef Value value_type; - typedef unsigned int size_t; - typedef int difference_type; - typedef Value& reference; - typedef Value* pointer; - typedef ValueIterator SelfType; + using value_type = Value; + using size_t = unsigned int; + using difference_type = int; + using reference = Value&; + using pointer = Value*; + using SelfType = ValueIterator; ValueIterator(); explicit ValueIterator(const ValueConstIterator& other); ValueIterator(const ValueIterator& other); private: -/*! \internal Use by Value to create an iterator. - */ + /*! \internal Use by Value to create an iterator. + */ explicit ValueIterator(const Value::ObjectValues::iterator& current); + public: SelfType& operator=(const SelfType& other); @@ -1310,27 +1438,26 @@ public: return *this; } - reference operator*() const { return deref(); } - - pointer operator->() const { return &deref(); } + /*! The return value of non-const iterators can be + * changed, so the these functions are not const + * because the returned references/pointers can be used + * to change state of the base class. + */ + reference operator*() { return deref(); } + pointer operator->() { return &deref(); } }; +inline void swap(Value& a, Value& b) { a.swap(b); } + } // namespace Json - -namespace std { -/// Specialize std::swap() for Json::Value. -template<> -inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } -} - #pragma pack(pop) #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) #pragma warning(pop) #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#endif // CPPTL_JSON_H_INCLUDED +#endif // JSON_H_INCLUDED // ////////////////////////////////////////////////////////////////////// // End of content of file: include/json/value.h @@ -1350,18 +1477,18 @@ inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE -#ifndef CPPTL_JSON_READER_H_INCLUDED -#define CPPTL_JSON_READER_H_INCLUDED +#ifndef JSON_READER_H_INCLUDED +#define JSON_READER_H_INCLUDED #if !defined(JSON_IS_AMALGAMATION) -#include "features.h" +#include "json_features.h" #include "value.h" #endif // if !defined(JSON_IS_AMALGAMATION) #include <deque> #include <iosfwd> +#include <istream> #include <stack> #include <string> -#include <istream> // Disable warning C4251: <data member>: <type> needs to have dll-interface to // be used by... @@ -1375,132 +1502,130 @@ inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } namespace Json { /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a - *Value. + * Value. * * \deprecated Use CharReader and CharReaderBuilder. */ -class JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") JSON_API Reader { + +class JSONCPP_DEPRECATED( + "Use CharReader and CharReaderBuilder instead.") JSON_API Reader { public: - typedef char Char; - typedef const Char* Location; + using Char = char; + using Location = const Char*; /** \brief An error tagged with where in the JSON text it was encountered. * * The offsets give the [start, limit) range of bytes within the text. Note * that this is bytes, not codepoints. - * */ struct StructuredError { ptrdiff_t offset_start; ptrdiff_t offset_limit; - JSONCPP_STRING message; + String message; }; - /** \brief Constructs a Reader allowing all features - * for parsing. + /** \brief Constructs a Reader allowing all features for parsing. */ + JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") Reader(); - /** \brief Constructs a Reader allowing the specified feature set - * for parsing. + /** \brief Constructs a Reader allowing the specified feature set for parsing. */ + JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") Reader(const Features& features); /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> * document. - * \param document UTF-8 encoded string containing the document to read. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them - * back during - * serialization, \c false to discard comments. - * This parameter is ignored if - * Features::allowComments_ - * is \c false. + * + * \param document UTF-8 encoded string containing the document + * to read. + * \param[out] root Contains the root value of the document if it + * was successfully parsed. + * \param collectComments \c true to collect comment and allow writing + * them back during serialization, \c false to + * discard comments. This parameter is ignored + * if Features::allowComments_ is \c false. * \return \c true if the document was successfully parsed, \c false if an * error occurred. */ - bool - parse(const std::string& document, Value& root, bool collectComments = true); + bool parse(const std::string& document, Value& root, + bool collectComments = true); /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> - document. - * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the - document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string of the - document to read. - * Must be >= beginDoc. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them - back during - * serialization, \c false to discard comments. - * This parameter is ignored if - Features::allowComments_ - * is \c false. + * document. + * + * \param beginDoc Pointer on the beginning of the UTF-8 encoded + * string of the document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string + * of the document to read. Must be >= beginDoc. + * \param[out] root Contains the root value of the document if it + * was successfully parsed. + * \param collectComments \c true to collect comment and allow writing + * them back during serialization, \c false to + * discard comments. This parameter is ignored + * if Features::allowComments_ is \c false. * \return \c true if the document was successfully parsed, \c false if an - error occurred. + * error occurred. */ - bool parse(const char* beginDoc, - const char* endDoc, - Value& root, + bool parse(const char* beginDoc, const char* endDoc, Value& root, bool collectComments = true); /// \brief Parse from input stream. /// \see Json::operator>>(std::istream&, Json::Value&). - bool parse(JSONCPP_ISTREAM& is, Value& root, bool collectComments = true); + bool parse(IStream& is, Value& root, bool collectComments = true); /** \brief Returns a user friendly string that list errors in the parsed * document. - * \return Formatted error message with the list of errors with their location - * in - * the parsed document. An empty string is returned if no error - * occurred - * during parsing. + * + * \return Formatted error message with the list of errors with their + * location in the parsed document. An empty string is returned if no error + * occurred during parsing. * \deprecated Use getFormattedErrorMessages() instead (typo fix). */ JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") - JSONCPP_STRING getFormatedErrorMessages() const; + String getFormatedErrorMessages() const; /** \brief Returns a user friendly string that list errors in the parsed * document. - * \return Formatted error message with the list of errors with their location - * in - * the parsed document. An empty string is returned if no error - * occurred - * during parsing. + * + * \return Formatted error message with the list of errors with their + * location in the parsed document. An empty string is returned if no error + * occurred during parsing. */ - JSONCPP_STRING getFormattedErrorMessages() const; + String getFormattedErrorMessages() const; - /** \brief Returns a vector of structured erros encounted while parsing. + /** \brief Returns a vector of structured errors encountered while parsing. + * * \return A (possibly empty) vector of StructuredError objects. Currently - * only one error can be returned, but the caller should tolerate - * multiple - * errors. This can occur if the parser recovers from a non-fatal - * parse error and then encounters additional errors. + * only one error can be returned, but the caller should tolerate multiple + * errors. This can occur if the parser recovers from a non-fatal parse + * error and then encounters additional errors. */ std::vector<StructuredError> getStructuredErrors() const; /** \brief Add a semantic error message. - * \param value JSON Value location associated with the error + * + * \param value JSON Value location associated with the error * \param message The error message. - * \return \c true if the error was successfully added, \c false if the - * Value offset exceeds the document size. + * \return \c true if the error was successfully added, \c false if the Value + * offset exceeds the document size. */ - bool pushError(const Value& value, const JSONCPP_STRING& message); + bool pushError(const Value& value, const String& message); /** \brief Add a semantic error message with extra context. - * \param value JSON Value location associated with the error + * + * \param value JSON Value location associated with the error * \param message The error message. - * \param extra Additional JSON Value location to contextualize the error + * \param extra Additional JSON Value location to contextualize the error * \return \c true if the error was successfully added, \c false if either * Value offset exceeds the document size. */ - bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra); + bool pushError(const Value& value, const String& message, const Value& extra); /** \brief Return whether there are any errors. - * \return \c true if there are no errors to report \c false if - * errors have occurred. + * + * \return \c true if there are no errors to report \c false if errors have + * occurred. */ bool good() const; @@ -1532,15 +1657,15 @@ private: class ErrorInfo { public: Token token_; - JSONCPP_STRING message_; + String message_; Location extra_; }; - typedef std::deque<ErrorInfo> Errors; + using Errors = std::deque<ErrorInfo>; bool readToken(Token& token); void skipSpaces(); - bool match(Location pattern, int patternLength); + bool match(const Char* pattern, int patternLength); bool readComment(); bool readCStyleComment(); bool readCppStyleComment(); @@ -1552,142 +1677,138 @@ private: bool decodeNumber(Token& token); bool decodeNumber(Token& token, Value& decoded); bool decodeString(Token& token); - bool decodeString(Token& token, JSONCPP_STRING& decoded); + bool decodeString(Token& token, String& decoded); bool decodeDouble(Token& token); bool decodeDouble(Token& token, Value& decoded); - bool decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, + bool decodeUnicodeCodePoint(Token& token, Location& current, Location end, unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& unicode); - bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0); + bool decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, unsigned int& unicode); + bool addError(const String& message, Token& token, Location extra = nullptr); bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const JSONCPP_STRING& message, - Token& token, + bool addErrorAndRecover(const String& message, Token& token, TokenType skipUntilToken); void skipUntilSpace(); Value& currentValue(); Char getNextChar(); - void - getLocationLineAndColumn(Location location, int& line, int& column) const; - JSONCPP_STRING getLocationLineAndColumn(Location location) const; + void getLocationLineAndColumn(Location location, int& line, + int& column) const; + String getLocationLineAndColumn(Location location) const; void addComment(Location begin, Location end, CommentPlacement placement); void skipCommentTokens(Token& token); static bool containsNewLine(Location begin, Location end); - static JSONCPP_STRING normalizeEOL(Location begin, Location end); + static String normalizeEOL(Location begin, Location end); - typedef std::stack<Value*> Nodes; + using Nodes = std::stack<Value*>; Nodes nodes_; Errors errors_; - JSONCPP_STRING document_; - Location begin_; - Location end_; - Location current_; - Location lastValueEnd_; - Value* lastValue_; - JSONCPP_STRING commentsBefore_; + String document_; + Location begin_{}; + Location end_{}; + Location current_{}; + Location lastValueEnd_{}; + Value* lastValue_{}; + String commentsBefore_; Features features_; - bool collectComments_; -}; // Reader + bool collectComments_{}; +}; // Reader /** Interface for reading JSON from a char array. */ class JSON_API CharReader { public: - virtual ~CharReader() {} + virtual ~CharReader() = default; /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> - document. - * The document must be a UTF-8 encoded string containing the document to read. + * document. The document must be a UTF-8 encoded string containing the + * document to read. * - * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the - document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string of the - document to read. - * Must be >= beginDoc. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param errs [out] Formatted error messages (if not NULL) - * a user friendly string that lists errors in the parsed - * document. + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string + * of the document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + * document to read. Must be >= beginDoc. + * \param[out] root Contains the root value of the document if it was + * successfully parsed. + * \param[out] errs Formatted error messages (if not NULL) a user + * friendly string that lists errors in the parsed + * document. * \return \c true if the document was successfully parsed, \c false if an - error occurred. + * error occurred. */ - virtual bool parse( - char const* beginDoc, char const* endDoc, - Value* root, JSONCPP_STRING* errs) = 0; + virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, + String* errs) = 0; class JSON_API Factory { public: - virtual ~Factory() {} + virtual ~Factory() = default; /** \brief Allocate a CharReader via operator new(). * \throw std::exception if something goes wrong (e.g. invalid settings) */ virtual CharReader* newCharReader() const = 0; - }; // Factory -}; // CharReader + }; // Factory +}; // CharReader /** \brief Build a CharReader implementation. - -Usage: -\code - using namespace Json; - CharReaderBuilder builder; - builder["collectComments"] = false; - Value value; - JSONCPP_STRING errs; - bool ok = parseFromStream(builder, std::cin, &value, &errs); -\endcode -*/ + * + * Usage: + * \code + * using namespace Json; + * CharReaderBuilder builder; + * builder["collectComments"] = false; + * Value value; + * String errs; + * bool ok = parseFromStream(builder, std::cin, &value, &errs); + * \endcode + */ class JSON_API CharReaderBuilder : public CharReader::Factory { public: // Note: We use a Json::Value so that we can add data-members to this class // without a major version bump. /** Configuration of this builder. - These are case-sensitive. - Available settings (case-sensitive): - - `"collectComments": false or true` - - true to collect comment and allow writing them - back during serialization, false to discard comments. - This parameter is ignored if allowComments is false. - - `"allowComments": false or true` - - true if comments are allowed. - - `"strictRoot": false or true` - - true if root must be either an array or an object value - - `"allowDroppedNullPlaceholders": false or true` - - true if dropped null placeholders are allowed. (See StreamWriterBuilder.) - - `"allowNumericKeys": false or true` - - true if numeric object keys are allowed. - - `"allowSingleQuotes": false or true` - - true if '' are allowed for strings (both keys and values) - - `"stackLimit": integer` - - Exceeding stackLimit (recursive depth of `readValue()`) will - cause an exception. - - This is a security issue (seg-faults caused by deeply nested JSON), - so the default is low. - - `"failIfExtra": false or true` - - If true, `parse()` returns false when extra non-whitespace trails - the JSON value in the input string. - - `"rejectDupKeys": false or true` - - If true, `parse()` returns false when a key is duplicated within an object. - - `"allowSpecialFloats": false or true` - - If true, special float values (NaNs and infinities) are allowed - and their values are lossfree restorable. - - You can examine 'settings_` yourself - to see the defaults. You can also write and read them just like any - JSON Value. - \sa setDefaults() - */ + * These are case-sensitive. + * Available settings (case-sensitive): + * - `"collectComments": false or true` + * - true to collect comment and allow writing them back during + * serialization, false to discard comments. This parameter is ignored + * if allowComments is false. + * - `"allowComments": false or true` + * - true if comments are allowed. + * - `"allowTrailingCommas": false or true` + * - true if trailing commas in objects and arrays are allowed. + * - `"strictRoot": false or true` + * - true if root must be either an array or an object value + * - `"allowDroppedNullPlaceholders": false or true` + * - true if dropped null placeholders are allowed. (See + * StreamWriterBuilder.) + * - `"allowNumericKeys": false or true` + * - true if numeric object keys are allowed. + * - `"allowSingleQuotes": false or true` + * - true if '' are allowed for strings (both keys and values) + * - `"stackLimit": integer` + * - Exceeding stackLimit (recursive depth of `readValue()`) will cause an + * exception. + * - This is a security issue (seg-faults caused by deeply nested JSON), so + * the default is low. + * - `"failIfExtra": false or true` + * - If true, `parse()` returns false when extra non-whitespace trails the + * JSON value in the input string. + * - `"rejectDupKeys": false or true` + * - If true, `parse()` returns false when a key is duplicated within an + * object. + * - `"allowSpecialFloats": false or true` + * - If true, special float values (NaNs and infinities) are allowed and + * their values are lossfree restorable. + * + * You can examine 'settings_` yourself to see the defaults. You can also + * write and read them just like any JSON Value. + * \sa setDefaults() + */ Json::Value settings_; CharReaderBuilder(); - ~CharReaderBuilder() JSONCPP_OVERRIDE; + ~CharReaderBuilder() override; - CharReader* newCharReader() const JSONCPP_OVERRIDE; + CharReader* newCharReader() const override; /** \return true if 'settings' are legal and consistent; * otherwise, indicate bad settings via 'invalid'. @@ -1696,7 +1817,7 @@ public: /** A simple way to update a specific setting. */ - Value& operator[](JSONCPP_STRING key); + Value& operator[](const String& key); /** Called by ctor, but you can use this to reset settings_. * \pre 'settings' != NULL (but Json::null is fine) @@ -1713,39 +1834,37 @@ public: }; /** Consume entire stream and use its begin/end. - * Someday we might have a real StreamReader, but for now this - * is convenient. - */ -bool JSON_API parseFromStream( - CharReader::Factory const&, - JSONCPP_ISTREAM&, - Value* root, std::string* errs); + * Someday we might have a real StreamReader, but for now this + * is convenient. + */ +bool JSON_API parseFromStream(CharReader::Factory const&, IStream&, Value* root, + String* errs); /** \brief Read from 'sin' into 'root'. - - Always keep comments from the input JSON. - - This can be used to read a file into a particular sub-object. - For example: - \code - Json::Value root; - cin >> root["dir"]["file"]; - cout << root; - \endcode - Result: - \verbatim - { - "dir": { - "file": { - // The input stream JSON would be nested here. - } - } - } - \endverbatim - \throw std::exception on parse error. - \see Json::operator<<() -*/ -JSON_API JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM&, Value&); + * + * Always keep comments from the input JSON. + * + * This can be used to read a file into a particular sub-object. + * For example: + * \code + * Json::Value root; + * cin >> root["dir"]["file"]; + * cout << root; + * \endcode + * Result: + * \verbatim + * { + * "dir": { + * "file": { + * // The input stream JSON would be nested here. + * } + * } + * } + * \endverbatim + * \throw std::exception on parse error. + * \see Json::operator<<() + */ +JSON_API IStream& operator>>(IStream&, Value&); } // namespace Json @@ -1755,7 +1874,7 @@ JSON_API JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM&, Value&); #pragma warning(pop) #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#endif // CPPTL_JSON_READER_H_INCLUDED +#endif // JSON_READER_H_INCLUDED // ////////////////////////////////////////////////////////////////////// // End of content of file: include/json/reader.h @@ -1781,9 +1900,9 @@ JSON_API JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM&, Value&); #if !defined(JSON_IS_AMALGAMATION) #include "value.h" #endif // if !defined(JSON_IS_AMALGAMATION) -#include <vector> -#include <string> #include <ostream> +#include <string> +#include <vector> // Disable warning C4251: <data member>: <type> needs to have dll-interface to // be used by... @@ -1799,31 +1918,31 @@ namespace Json { class Value; /** - -Usage: -\code - using namespace Json; - void writeToStdout(StreamWriter::Factory const& factory, Value const& value) { - std::unique_ptr<StreamWriter> const writer( - factory.newStreamWriter()); - writer->write(value, &std::cout); - std::cout << std::endl; // add lf and flush - } -\endcode -*/ + * + * Usage: + * \code + * using namespace Json; + * void writeToStdout(StreamWriter::Factory const& factory, Value const& value) + * { std::unique_ptr<StreamWriter> const writer( factory.newStreamWriter()); + * writer->write(value, &std::cout); + * std::cout << std::endl; // add lf and flush + * } + * \endcode + */ class JSON_API StreamWriter { protected: - JSONCPP_OSTREAM* sout_; // not owned; will not delete + OStream* sout_; // not owned; will not delete public: StreamWriter(); virtual ~StreamWriter(); /** Write Value into document as configured in sub-class. - Do not take ownership of sout, but maintain a reference during function. - \pre sout != NULL - \return zero on success (For now, we always return zero, so check the stream instead.) - \throw std::exception possibly, depending on configuration + * Do not take ownership of sout, but maintain a reference during function. + * \pre sout != NULL + * \return zero on success (For now, we always return zero, so check the + * stream instead.) \throw std::exception possibly, depending on + * configuration */ - virtual int write(Value const& root, JSONCPP_OSTREAM* sout) = 0; + virtual int write(Value const& root, OStream* sout) = 0; /** \brief A simple abstract factory. */ @@ -1834,64 +1953,69 @@ public: * \throw std::exception if something goes wrong (e.g. invalid settings) */ virtual StreamWriter* newStreamWriter() const = 0; - }; // Factory -}; // StreamWriter + }; // Factory +}; // StreamWriter /** \brief Write into stringstream, then return string, for convenience. * A StreamWriter will be created from the factory, used, and then deleted. */ -JSONCPP_STRING JSON_API writeString(StreamWriter::Factory const& factory, Value const& root); - +String JSON_API writeString(StreamWriter::Factory const& factory, + Value const& root); /** \brief Build a StreamWriter implementation. -Usage: -\code - using namespace Json; - Value value = ...; - StreamWriterBuilder builder; - builder["commentStyle"] = "None"; - builder["indentation"] = " "; // or whatever you like - std::unique_ptr<Json::StreamWriter> writer( - builder.newStreamWriter()); - writer->write(value, &std::cout); - std::cout << std::endl; // add lf and flush -\endcode +* Usage: +* \code +* using namespace Json; +* Value value = ...; +* StreamWriterBuilder builder; +* builder["commentStyle"] = "None"; +* builder["indentation"] = " "; // or whatever you like +* std::unique_ptr<Json::StreamWriter> writer( +* builder.newStreamWriter()); +* writer->write(value, &std::cout); +* std::cout << std::endl; // add lf and flush +* \endcode */ class JSON_API StreamWriterBuilder : public StreamWriter::Factory { public: // Note: We use a Json::Value so that we can add data-members to this class // without a major version bump. /** Configuration of this builder. - Available settings (case-sensitive): - - "commentStyle": "None" or "All" - - "indentation": "<anything>" - - "enableYAMLCompatibility": false or true - - slightly change the whitespace around colons - - "dropNullPlaceholders": false or true - - Drop the "null" string from the writer's output for nullValues. - Strictly speaking, this is not valid JSON. But when the output is being - fed to a browser's JavaScript, it makes for smaller output and the - browser can handle the output just fine. - - "useSpecialFloats": false or true - - If true, outputs non-finite floating point values in the following way: - NaN values as "NaN", positive infinity as "Infinity", and negative infinity - as "-Infinity". + * Available settings (case-sensitive): + * - "commentStyle": "None" or "All" + * - "indentation": "<anything>". + * - Setting this to an empty string also omits newline characters. + * - "enableYAMLCompatibility": false or true + * - slightly change the whitespace around colons + * - "dropNullPlaceholders": false or true + * - Drop the "null" string from the writer's output for nullValues. + * Strictly speaking, this is not valid JSON. But when the output is being + * fed to a browser's JavaScript, it makes for smaller output and the + * browser can handle the output just fine. + * - "useSpecialFloats": false or true + * - If true, outputs non-finite floating point values in the following way: + * NaN values as "NaN", positive infinity as "Infinity", and negative + * infinity as "-Infinity". + * - "precision": int + * - Number of precision digits for formatting of real values. + * - "precisionType": "significant"(default) or "decimal" + * - Type of precision for formatting of real values. - You can examine 'settings_` yourself - to see the defaults. You can also write and read them just like any - JSON Value. - \sa setDefaults() - */ + * You can examine 'settings_` yourself + * to see the defaults. You can also write and read them just like any + * JSON Value. + * \sa setDefaults() + */ Json::Value settings_; StreamWriterBuilder(); - ~StreamWriterBuilder() JSONCPP_OVERRIDE; + ~StreamWriterBuilder() override; /** * \throw std::exception if something goes wrong (e.g. invalid settings) */ - StreamWriter* newStreamWriter() const JSONCPP_OVERRIDE; + StreamWriter* newStreamWriter() const override; /** \return true if 'settings' are legal and consistent; * otherwise, indicate bad settings via 'invalid'. @@ -1899,7 +2023,7 @@ public: bool validate(Json::Value* invalid) const; /** A simple way to update a specific setting. */ - Value& operator[](JSONCPP_STRING key); + Value& operator[](const String& key); /** Called by ctor, but you can use this to reset settings_. * \pre 'settings' != NULL (but Json::null is fine) @@ -1916,7 +2040,7 @@ class JSONCPP_DEPRECATED("Use StreamWriter instead") JSON_API Writer { public: virtual ~Writer(); - virtual JSONCPP_STRING write(const Value& root) = 0; + virtual String write(const Value& root) = 0; }; /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format @@ -1924,18 +2048,19 @@ public: * * The JSON document is written in a single line. It is not intended for 'human' *consumption, - * but may be usefull to support feature such as RPC where bandwith is limited. + * but may be useful to support feature such as RPC where bandwidth is limited. * \sa Reader, Value * \deprecated Use StreamWriterBuilder. */ #if defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4996) // Deriving from deprecated class +#pragma warning(disable : 4996) // Deriving from deprecated class #endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter : public Writer { +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter + : public Writer { public: FastWriter(); - ~FastWriter() JSONCPP_OVERRIDE {} + ~FastWriter() override = default; void enableYAMLCompatibility(); @@ -1949,15 +2074,15 @@ public: void omitEndingLineFeed(); public: // overridden from Writer - JSONCPP_STRING write(const Value& root) JSONCPP_OVERRIDE; + String write(const Value& root) override; private: void writeValue(const Value& value); - JSONCPP_STRING document_; - bool yamlCompatibilityEnabled_; - bool dropNullPlaceholders_; - bool omitEndingLineFeed_; + String document_; + bool yamlCompatibilityEnabled_{false}; + bool dropNullPlaceholders_{false}; + bool omitEndingLineFeed_{false}; }; #if defined(_MSC_VER) #pragma warning(pop) @@ -1989,42 +2114,43 @@ private: */ #if defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4996) // Deriving from deprecated class +#pragma warning(disable : 4996) // Deriving from deprecated class #endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API StyledWriter : public Writer { +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API + StyledWriter : public Writer { public: StyledWriter(); - ~StyledWriter() JSONCPP_OVERRIDE {} + ~StyledWriter() override = default; public: // overridden from Writer /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. * \param root Value to serialize. * \return String containing the JSON document that represents the root value. */ - JSONCPP_STRING write(const Value& root) JSONCPP_OVERRIDE; + String write(const Value& root) override; private: void writeValue(const Value& value); void writeArrayValue(const Value& value); bool isMultilineArray(const Value& value); - void pushValue(const JSONCPP_STRING& value); + void pushValue(const String& value); void writeIndent(); - void writeWithIndent(const JSONCPP_STRING& value); + void writeWithIndent(const String& value); void indent(); void unindent(); void writeCommentBeforeValue(const Value& root); void writeCommentAfterValueOnSameLine(const Value& root); - bool hasCommentForValue(const Value& value); - static JSONCPP_STRING normalizeEOL(const JSONCPP_STRING& text); + static bool hasCommentForValue(const Value& value); + static String normalizeEOL(const String& text); - typedef std::vector<JSONCPP_STRING> ChildValues; + using ChildValues = std::vector<String>; ChildValues childValues_; - JSONCPP_STRING document_; - JSONCPP_STRING indentString_; - unsigned int rightMargin_; - unsigned int indentSize_; - bool addChildValues_; + String document_; + String indentString_; + unsigned int rightMargin_{74}; + unsigned int indentSize_{3}; + bool addChildValues_{false}; }; #if defined(_MSC_VER) #pragma warning(pop) @@ -2057,15 +2183,16 @@ private: */ #if defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4996) // Deriving from deprecated class +#pragma warning(disable : 4996) // Deriving from deprecated class #endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API StyledStreamWriter { +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API + StyledStreamWriter { public: -/** - * \param indentation Each level will be indented by this amount extra. - */ - StyledStreamWriter(JSONCPP_STRING indentation = "\t"); - ~StyledStreamWriter() {} + /** + * \param indentation Each level will be indented by this amount extra. + */ + StyledStreamWriter(String indentation = "\t"); + ~StyledStreamWriter() = default; public: /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. @@ -2074,29 +2201,29 @@ public: * \note There is no point in deriving from Writer, since write() should not * return a value. */ - void write(JSONCPP_OSTREAM& out, const Value& root); + void write(OStream& out, const Value& root); private: void writeValue(const Value& value); void writeArrayValue(const Value& value); bool isMultilineArray(const Value& value); - void pushValue(const JSONCPP_STRING& value); + void pushValue(const String& value); void writeIndent(); - void writeWithIndent(const JSONCPP_STRING& value); + void writeWithIndent(const String& value); void indent(); void unindent(); void writeCommentBeforeValue(const Value& root); void writeCommentAfterValueOnSameLine(const Value& root); - bool hasCommentForValue(const Value& value); - static JSONCPP_STRING normalizeEOL(const JSONCPP_STRING& text); + static bool hasCommentForValue(const Value& value); + static String normalizeEOL(const String& text); - typedef std::vector<JSONCPP_STRING> ChildValues; + using ChildValues = std::vector<String>; ChildValues childValues_; - JSONCPP_OSTREAM* document_; - JSONCPP_STRING indentString_; - unsigned int rightMargin_; - JSONCPP_STRING indentation_; + OStream* document_; + String indentString_; + unsigned int rightMargin_{74}; + String indentation_; bool addChildValues_ : 1; bool indented_ : 1; }; @@ -2105,18 +2232,20 @@ private: #endif #if defined(JSON_HAS_INT64) -JSONCPP_STRING JSON_API valueToString(Int value); -JSONCPP_STRING JSON_API valueToString(UInt value); +String JSON_API valueToString(Int value); +String JSON_API valueToString(UInt value); #endif // if defined(JSON_HAS_INT64) -JSONCPP_STRING JSON_API valueToString(LargestInt value); -JSONCPP_STRING JSON_API valueToString(LargestUInt value); -JSONCPP_STRING JSON_API valueToString(double value); -JSONCPP_STRING JSON_API valueToString(bool value); -JSONCPP_STRING JSON_API valueToQuotedString(const char* value); +String JSON_API valueToString(LargestInt value); +String JSON_API valueToString(LargestUInt value); +String JSON_API valueToString( + double value, unsigned int precision = Value::defaultRealPrecision, + PrecisionType precisionType = PrecisionType::significantDigits); +String JSON_API valueToString(bool value); +String JSON_API valueToQuotedString(const char* value); /// \brief Output using the StyledStreamWriter. /// \see Json::operator>>() -JSON_API JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM&, const Value& root); +JSON_API OStream& operator<<(OStream&, const Value& root); } // namespace Json @@ -2146,10 +2275,10 @@ JSON_API JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM&, const Value& root); // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE -#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED -#define CPPTL_JSON_ASSERTIONS_H_INCLUDED +#ifndef JSON_ASSERTIONS_H_INCLUDED +#define JSON_ASSERTIONS_H_INCLUDED -#include <stdlib.h> +#include <cstdlib> #include <sstream> #if !defined(JSON_IS_AMALGAMATION) @@ -2163,38 +2292,45 @@ JSON_API JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM&, const Value& root); #if JSON_USE_EXCEPTION // @todo <= add detail about condition in exception -# define JSON_ASSERT(condition) \ - {if (!(condition)) {Json::throwLogicError( "assert json failed" );}} +#define JSON_ASSERT(condition) \ + do { \ + if (!(condition)) { \ + Json::throwLogicError("assert json failed"); \ + } \ + } while (0) -# define JSON_FAIL_MESSAGE(message) \ - { \ - JSONCPP_OSTRINGSTREAM oss; oss << message; \ +#define JSON_FAIL_MESSAGE(message) \ + do { \ + OStringStream oss; \ + oss << message; \ Json::throwLogicError(oss.str()); \ abort(); \ - } + } while (0) #else // JSON_USE_EXCEPTION -# define JSON_ASSERT(condition) assert(condition) +#define JSON_ASSERT(condition) assert(condition) // The call to assert() will show the failure message in debug builds. In // release builds we abort, for a core-dump or debugger. -# define JSON_FAIL_MESSAGE(message) \ +#define JSON_FAIL_MESSAGE(message) \ { \ - JSONCPP_OSTRINGSTREAM oss; oss << message; \ + OStringStream oss; \ + oss << message; \ assert(false && oss.str().c_str()); \ abort(); \ } - #endif #define JSON_ASSERT_MESSAGE(condition, message) \ - if (!(condition)) { \ - JSON_FAIL_MESSAGE(message); \ - } + do { \ + if (!(condition)) { \ + JSON_FAIL_MESSAGE(message); \ + } \ + } while (0) -#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED +#endif // JSON_ASSERTIONS_H_INCLUDED // ////////////////////////////////////////////////////////////////////// // End of content of file: include/json/assertions.h diff --git a/lib/jsoncpp/jsoncpp.cpp b/lib/jsoncpp/jsoncpp.cpp index 507a1c6ad..30e0a69f7 100644 --- a/lib/jsoncpp/jsoncpp.cpp +++ b/lib/jsoncpp/jsoncpp.cpp @@ -92,6 +92,9 @@ license you like. #ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED #define LIB_JSONCPP_JSON_TOOL_H_INCLUDED +#if !defined(JSON_IS_AMALGAMATION) +#include <json/config.h> +#endif // Also support old flag NO_LOCALE_SUPPORT #ifdef NO_LOCALE_SUPPORT @@ -109,7 +112,7 @@ license you like. */ namespace Json { -static char getDecimalPoint() { +static inline char getDecimalPoint() { #ifdef JSONCPP_NO_LOCALE_SUPPORT return '\0'; #else @@ -119,8 +122,8 @@ static char getDecimalPoint() { } /// Converts a unicode code-point to UTF-8. -static inline JSONCPP_STRING codePointToUTF8(unsigned int cp) { - JSONCPP_STRING result; +static inline String codePointToUTF8(unsigned int cp) { + String result; // based on description from http://en.wikipedia.org/wiki/UTF-8 @@ -154,7 +157,7 @@ enum { }; // Defines a char buffer for use with uintToString(). -typedef char UIntToStringBuffer[uintToStringBufferSize]; +using UIntToStringBuffer = char[uintToStringBufferSize]; /** Converts an unsigned integer to string. * @param value Unsigned integer to convert to string @@ -174,28 +177,45 @@ static inline void uintToString(LargestUInt value, char*& current) { * We had a sophisticated way, but it did not work in WinCE. * @see https://github.com/open-source-parsers/jsoncpp/pull/9 */ -static inline void fixNumericLocale(char* begin, char* end) { - while (begin < end) { +template <typename Iter> Iter fixNumericLocale(Iter begin, Iter end) { + for (; begin != end; ++begin) { if (*begin == ',') { *begin = '.'; } - ++begin; } + return begin; } -static inline void fixNumericLocaleInput(char* begin, char* end) { +template <typename Iter> void fixNumericLocaleInput(Iter begin, Iter end) { char decimalPoint = getDecimalPoint(); - if (decimalPoint != '\0' && decimalPoint != '.') { - while (begin < end) { - if (*begin == '.') { - *begin = decimalPoint; - } - ++begin; + if (decimalPoint == '\0' || decimalPoint == '.') { + return; + } + for (; begin != end; ++begin) { + if (*begin == '.') { + *begin = decimalPoint; } } } -} // namespace Json { +/** + * Return iterator that would be the new end of the range [begin,end), if we + * were to delete zeros in the end of string, but not the last zero before '.'. + */ +template <typename Iter> Iter fixZerosInTheEnd(Iter begin, Iter end) { + for (; begin != end; --end) { + if (*(end - 1) != '0') { + return end; + } + // Don't delete the last zero before the decimal point. + if (begin != (end - 1) && *(end - 2) == '.') { + return end; + } + } + return end; +} + +} // namespace Json #endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED @@ -219,69 +239,65 @@ static inline void fixNumericLocaleInput(char* begin, char* end) { // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE #if !defined(JSON_IS_AMALGAMATION) +#include "json_tool.h" #include <json/assertions.h> #include <json/reader.h> #include <json/value.h> -#include "json_tool.h" #endif // if !defined(JSON_IS_AMALGAMATION) -#include <utility> -#include <cstdio> +#include <algorithm> #include <cassert> #include <cstring> +#include <iostream> #include <istream> -#include <sstream> +#include <limits> #include <memory> #include <set> -#include <limits> +#include <sstream> +#include <utility> -#if defined(_MSC_VER) -#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above -#define snprintf sprintf_s -#elif _MSC_VER >= 1900 // VC++ 14.0 and above -#define snprintf std::snprintf -#else -#define snprintf _snprintf -#endif -#elif defined(__ANDROID__) || defined(__QNXNTO__) -#define snprintf snprintf -#elif __cplusplus >= 201103L -#if !defined(__MINGW32__) && !defined(__CYGWIN__) -#define snprintf std::snprintf -#endif -#endif +#include <cstdio> +#if __cplusplus >= 201103L -#if defined(__QNXNTO__) +#if !defined(sscanf) #define sscanf std::sscanf #endif -#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +#endif //__cplusplus + +#if defined(_MSC_VER) +#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES +#endif //_MSC_VER + +#if defined(_MSC_VER) // Disable warning about strdup being deprecated. #pragma warning(disable : 4996) #endif -// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile time to change the stack limit +// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile +// time to change the stack limit #if !defined(JSONCPP_DEPRECATED_STACK_LIMIT) #define JSONCPP_DEPRECATED_STACK_LIMIT 1000 #endif -static size_t const stackLimit_g = JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() +static size_t const stackLimit_g = + JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() namespace Json { #if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) -typedef std::unique_ptr<CharReader> CharReaderPtr; +using CharReaderPtr = std::unique_ptr<CharReader>; #else -typedef std::auto_ptr<CharReader> CharReaderPtr; +using CharReaderPtr = std::auto_ptr<CharReader>; #endif // Implementation of class Features // //////////////////////////////// -Features::Features() - : allowComments_(true), strictRoot_(false), - allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) {} +Features::Features() = default; -Features Features::all() { return Features(); } +Features Features::all() { return {}; } Features Features::strictMode() { Features features; @@ -296,49 +312,38 @@ Features Features::strictMode() { // //////////////////////////////// bool Reader::containsNewLine(Reader::Location begin, Reader::Location end) { - for (; begin < end; ++begin) - if (*begin == '\n' || *begin == '\r') - return true; - return false; + return std::any_of(begin, end, [](char b) { return b == '\n' || b == '\r'; }); } // Class Reader // ////////////////////////////////////////////////////////////////// -Reader::Reader() - : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), - lastValue_(), commentsBefore_(), features_(Features::all()), - collectComments_() {} +Reader::Reader() : features_(Features::all()) {} -Reader::Reader(const Features& features) - : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), - lastValue_(), commentsBefore_(), features_(features), collectComments_() { -} +Reader::Reader(const Features& features) : features_(features) {} -bool -Reader::parse(const std::string& document, Value& root, bool collectComments) { +bool Reader::parse(const std::string& document, Value& root, + bool collectComments) { document_.assign(document.begin(), document.end()); const char* begin = document_.c_str(); const char* end = begin + document_.length(); return parse(begin, end, root, collectComments); } -bool Reader::parse(std::istream& sin, Value& root, bool collectComments) { - // std::istream_iterator<char> begin(sin); +bool Reader::parse(std::istream& is, Value& root, bool collectComments) { + // std::istream_iterator<char> begin(is); // std::istream_iterator<char> end; // Those would allow streamed input from a file, if parse() were a // template function. - // Since JSONCPP_STRING is reference-counted, this at least does not + // Since String is reference-counted, this at least does not // create an extra copy. - JSONCPP_STRING doc; - std::getline(sin, doc, (char)EOF); + String doc; + std::getline(is, doc, static_cast<char> EOF); return parse(doc.data(), doc.data() + doc.size(), root, collectComments); } -bool Reader::parse(const char* beginDoc, - const char* endDoc, - Value& root, +bool Reader::parse(const char* beginDoc, const char* endDoc, Value& root, bool collectComments) { if (!features_.allowComments_) { collectComments = false; @@ -348,8 +353,8 @@ bool Reader::parse(const char* beginDoc, end_ = endDoc; collectComments_ = collectComments; current_ = begin_; - lastValueEnd_ = 0; - lastValue_ = 0; + lastValueEnd_ = nullptr; + lastValue_ = nullptr; commentsBefore_.clear(); errors_.clear(); while (!nodes_.empty()) @@ -379,9 +384,11 @@ bool Reader::parse(const char* beginDoc, bool Reader::readValue() { // readValue() may call itself only if it calls readObject() or ReadArray(). - // These methods execute nodes_.push() just before and nodes_.pop)() just after calling readValue(). - // parse() executes one nodes_.push(), so > instead of >=. - if (nodes_.size() > stackLimit_g) throwRuntimeError("Exceeded stackLimit in readValue()."); + // These methods execute nodes_.push() just before and nodes_.pop)() just + // after calling readValue(). parse() executes one nodes_.push(), so > instead + // of >=. + if (nodes_.size() > stackLimit_g) + throwRuntimeError("Exceeded stackLimit in readValue()."); Token token; skipCommentTokens(token); @@ -407,30 +414,24 @@ bool Reader::readValue() { case tokenString: successful = decodeString(token); break; - case tokenTrue: - { + case tokenTrue: { Value v(true); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenFalse: - { + } break; + case tokenFalse: { Value v(false); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenNull: - { + } break; + case tokenNull: { Value v; currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; + } break; case tokenArraySeparator: case tokenObjectEnd: case tokenArrayEnd: @@ -536,7 +537,7 @@ bool Reader::readToken(Token& token) { if (!ok) token.type_ = tokenError; token.end_ = current_; - return true; + return ok; } void Reader::skipSpaces() { @@ -549,7 +550,7 @@ void Reader::skipSpaces() { } } -bool Reader::match(Location pattern, int patternLength) { +bool Reader::match(const Char* pattern, int patternLength) { if (end_ - current_ < patternLength) return false; int index = patternLength; @@ -583,16 +584,16 @@ bool Reader::readComment() { return true; } -JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { - JSONCPP_STRING normalized; +String Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { + String normalized; normalized.reserve(static_cast<size_t>(end - begin)); Reader::Location current = begin; while (current != end) { char c = *current++; if (c == '\r') { if (current != end && *current == '\n') - // convert dos EOL - ++current; + // convert dos EOL + ++current; // convert Mac EOL normalized += '\n'; } else { @@ -602,12 +603,12 @@ JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin, Reader::Location end return normalized; } -void -Reader::addComment(Location begin, Location end, CommentPlacement placement) { +void Reader::addComment(Location begin, Location end, + CommentPlacement placement) { assert(collectComments_); - const JSONCPP_STRING& normalized = normalizeEOL(begin, end); + const String& normalized = normalizeEOL(begin, end); if (placement == commentAfterOnSameLine) { - assert(lastValue_ != 0); + assert(lastValue_ != nullptr); lastValue_->setComment(normalized, placement); } else { commentsBefore_ += normalized; @@ -640,7 +641,7 @@ bool Reader::readCppStyleComment() { } void Reader::readNumber() { - const char *p = current_; + Location p = current_; char c = '0'; // stopgap for already consumed character // integral part while (c >= '0' && c <= '9') @@ -673,12 +674,12 @@ bool Reader::readString() { return c == '"'; } -bool Reader::readObject(Token& tokenStart) { +bool Reader::readObject(Token& token) { Token tokenName; - JSONCPP_STRING name; + String name; Value init(objectValue); currentValue().swapPayload(init); - currentValue().setOffsetStart(tokenStart.start_ - begin_); + currentValue().setOffsetStart(token.start_ - begin_); while (readToken(tokenName)) { bool initialTokenOk = true; while (tokenName.type_ == tokenComment && initialTokenOk) @@ -695,15 +696,15 @@ bool Reader::readObject(Token& tokenStart) { Value numberName; if (!decodeNumber(tokenName, numberName)) return recoverFromError(tokenObjectEnd); - name = JSONCPP_STRING(numberName.asCString()); + name = numberName.asString(); } else { break; } Token colon; if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { - return addErrorAndRecover( - "Missing ':' after object member name", colon, tokenObjectEnd); + return addErrorAndRecover("Missing ':' after object member name", colon, + tokenObjectEnd); } Value& value = currentValue()[name]; nodes_.push(&value); @@ -716,8 +717,8 @@ bool Reader::readObject(Token& tokenStart) { if (!readToken(comma) || (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && comma.type_ != tokenComment)) { - return addErrorAndRecover( - "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + return addErrorAndRecover("Missing ',' or '}' in object declaration", + comma, tokenObjectEnd); } bool finalizeTokenOk = true; while (comma.type_ == tokenComment && finalizeTokenOk) @@ -725,14 +726,14 @@ bool Reader::readObject(Token& tokenStart) { if (comma.type_ == tokenObjectEnd) return true; } - return addErrorAndRecover( - "Missing '}' or object member name", tokenName, tokenObjectEnd); + return addErrorAndRecover("Missing '}' or object member name", tokenName, + tokenObjectEnd); } -bool Reader::readArray(Token& tokenStart) { +bool Reader::readArray(Token& token) { Value init(arrayValue); currentValue().swapPayload(init); - currentValue().setOffsetStart(tokenStart.start_ - begin_); + currentValue().setOffsetStart(token.start_ - begin_); skipSpaces(); if (current_ != end_ && *current_ == ']') // empty array { @@ -749,19 +750,19 @@ bool Reader::readArray(Token& tokenStart) { if (!ok) // error already set return recoverFromError(tokenArrayEnd); - Token token; + Token currentToken; // Accept Comment after last item in the array. - ok = readToken(token); - while (token.type_ == tokenComment && ok) { - ok = readToken(token); + ok = readToken(currentToken); + while (currentToken.type_ == tokenComment && ok) { + ok = readToken(currentToken); } - bool badTokenType = - (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + bool badTokenType = (currentToken.type_ != tokenArraySeparator && + currentToken.type_ != tokenArrayEnd); if (!ok || badTokenType) { - return addErrorAndRecover( - "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + return addErrorAndRecover("Missing ',' or ']' in array declaration", + currentToken, tokenArrayEnd); } - if (token.type_ == tokenArrayEnd) + if (currentToken.type_ == tokenArrayEnd) break; } return true; @@ -785,7 +786,8 @@ bool Reader::decodeNumber(Token& token, Value& decoded) { bool isNegative = *current == '-'; if (isNegative) ++current; - // TODO: Help the compiler do the div and mod at compile time or get rid of them. + // TODO: Help the compiler do the div and mod at compile time or get rid of + // them. Value::LargestUInt maxIntegerValue = isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 : Value::maxLargestUInt; @@ -795,7 +797,7 @@ bool Reader::decodeNumber(Token& token, Value& decoded) { Char c = *current++; if (c < '0' || c > '9') return decodeDouble(token, decoded); - Value::UInt digit(static_cast<Value::UInt>(c - '0')); + auto digit(static_cast<Value::UInt>(c - '0')); if (value >= threshold) { // We've hit or exceeded the max value divided by 10 (rounded down). If // a) we've only just touched the limit, b) this is the last digit, and @@ -831,18 +833,17 @@ bool Reader::decodeDouble(Token& token) { bool Reader::decodeDouble(Token& token, Value& decoded) { double value = 0; - JSONCPP_STRING buffer(token.start_, token.end_); - JSONCPP_ISTRINGSTREAM is(buffer); + String buffer(token.start_, token.end_); + IStringStream is(buffer); if (!(is >> value)) - return addError("'" + JSONCPP_STRING(token.start_, token.end_) + - "' is not a number.", - token); + return addError( + "'" + String(token.start_, token.end_) + "' is not a number.", token); decoded = value; return true; } bool Reader::decodeString(Token& token) { - JSONCPP_STRING decoded_string; + String decoded_string; if (!decodeString(token, decoded_string)) return false; Value decoded(decoded_string); @@ -852,7 +853,7 @@ bool Reader::decodeString(Token& token) { return true; } -bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) { +bool Reader::decodeString(Token& token, String& decoded) { decoded.reserve(static_cast<size_t>(token.end_ - token.start_ - 2)); Location current = token.start_ + 1; // skip '"' Location end = token.end_ - 1; // do not include '"' @@ -860,7 +861,7 @@ bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) { Char c = *current++; if (c == '"') break; - else if (c == '\\') { + if (c == '\\') { if (current == end) return addError("Empty escape sequence in string", token, current); Char escape = *current++; @@ -905,10 +906,8 @@ bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) { return true; } -bool Reader::decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, - unsigned int& unicode) { +bool Reader::decodeUnicodeCodePoint(Token& token, Location& current, + Location end, unsigned int& unicode) { if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) return false; @@ -917,10 +916,9 @@ bool Reader::decodeUnicodeCodePoint(Token& token, if (end - current < 6) return addError( "additional six characters expected to parse unicode surrogate pair.", - token, - current); - unsigned int surrogatePair; + token, current); if (*(current++) == '\\' && *(current++) == 'u') { + unsigned int surrogatePair; if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); } else @@ -928,20 +926,17 @@ bool Reader::decodeUnicodeCodePoint(Token& token, } else return addError("expecting another \\u token to begin the second half of " "a unicode surrogate pair", - token, - current); + token, current); } return true; } -bool Reader::decodeUnicodeEscapeSequence(Token& token, - Location& current, +bool Reader::decodeUnicodeEscapeSequence(Token& token, Location& current, Location end, unsigned int& ret_unicode) { if (end - current < 4) return addError( - "Bad unicode escape sequence in string: four digits expected.", - token, + "Bad unicode escape sequence in string: four digits expected.", token, current); int unicode = 0; for (int index = 0; index < 4; ++index) { @@ -956,15 +951,13 @@ bool Reader::decodeUnicodeEscapeSequence(Token& token, else return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", - token, - current); + token, current); } ret_unicode = static_cast<unsigned int>(unicode); return true; } -bool -Reader::addError(const JSONCPP_STRING& message, Token& token, Location extra) { +bool Reader::addError(const String& message, Token& token, Location extra) { ErrorInfo info; info.token_ = token; info.message_ = message; @@ -986,8 +979,7 @@ bool Reader::recoverFromError(TokenType skipUntilToken) { return false; } -bool Reader::addErrorAndRecover(const JSONCPP_STRING& message, - Token& token, +bool Reader::addErrorAndRecover(const String& message, Token& token, TokenType skipUntilToken) { addError(message, token); return recoverFromError(skipUntilToken); @@ -1001,8 +993,7 @@ Reader::Char Reader::getNextChar() { return *current_++; } -void Reader::getLocationLineAndColumn(Location location, - int& line, +void Reader::getLocationLineAndColumn(Location location, int& line, int& column) const { Location current = begin_; Location lastLineStart = current; @@ -1024,25 +1015,22 @@ void Reader::getLocationLineAndColumn(Location location, ++line; } -JSONCPP_STRING Reader::getLocationLineAndColumn(Location location) const { +String Reader::getLocationLineAndColumn(Location location) const { int line, column; getLocationLineAndColumn(location, line, column); char buffer[18 + 16 + 16 + 1]; - snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); return buffer; } // Deprecated. Preserved for backward compatibility -JSONCPP_STRING Reader::getFormatedErrorMessages() const { +String Reader::getFormatedErrorMessages() const { return getFormattedErrorMessages(); } -JSONCPP_STRING Reader::getFormattedErrorMessages() const { - JSONCPP_STRING formattedMessage; - for (Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError) { - const ErrorInfo& error = *itError; +String Reader::getFormattedErrorMessages() const { + String formattedMessage; + for (const auto& error : errors_) { formattedMessage += "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; formattedMessage += " " + error.message_ + "\n"; @@ -1055,10 +1043,7 @@ JSONCPP_STRING Reader::getFormattedErrorMessages() const { std::vector<Reader::StructuredError> Reader::getStructuredErrors() const { std::vector<Reader::StructuredError> allErrors; - for (Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError) { - const ErrorInfo& error = *itError; + for (const auto& error : errors_) { Reader::StructuredError structured; structured.offset_start = error.token_.start_ - begin_; structured.offset_limit = error.token_.end_ - begin_; @@ -1068,28 +1053,27 @@ std::vector<Reader::StructuredError> Reader::getStructuredErrors() const { return allErrors; } -bool Reader::pushError(const Value& value, const JSONCPP_STRING& message) { +bool Reader::pushError(const Value& value, const String& message) { ptrdiff_t const length = end_ - begin_; - if(value.getOffsetStart() > length - || value.getOffsetLimit() > length) + if (value.getOffsetStart() > length || value.getOffsetLimit() > length) return false; Token token; token.type_ = tokenError; token.start_ = begin_ + value.getOffsetStart(); - token.end_ = end_ + value.getOffsetLimit(); + token.end_ = begin_ + value.getOffsetLimit(); ErrorInfo info; info.token_ = token; info.message_ = message; - info.extra_ = 0; + info.extra_ = nullptr; errors_.push_back(info); return true; } -bool Reader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) { +bool Reader::pushError(const Value& value, const String& message, + const Value& extra) { ptrdiff_t const length = end_ - begin_; - if(value.getOffsetStart() > length - || value.getOffsetLimit() > length - || extra.getOffsetLimit() > length) + if (value.getOffsetStart() > length || value.getOffsetLimit() > length || + extra.getOffsetLimit() > length) return false; Token token; token.type_ = tokenError; @@ -1103,15 +1087,15 @@ bool Reader::pushError(const Value& value, const JSONCPP_STRING& message, const return true; } -bool Reader::good() const { - return !errors_.size(); -} +bool Reader::good() const { return errors_.empty(); } -// exact copy of Features +// Originally copied from the Features class (now deprecated), used internally +// for features implementation. class OurFeatures { public: static OurFeatures all(); bool allowComments_; + bool allowTrailingCommas_; bool strictRoot_; bool allowDroppedNullPlaceholders_; bool allowNumericKeys_; @@ -1119,42 +1103,36 @@ public: bool failIfExtra_; bool rejectDupKeys_; bool allowSpecialFloats_; - int stackLimit_; -}; // OurFeatures + bool skipBom_; + size_t stackLimit_; +}; // OurFeatures -// exact copy of Implementation of class Features -// //////////////////////////////// - -OurFeatures OurFeatures::all() { return OurFeatures(); } +OurFeatures OurFeatures::all() { return {}; } // Implementation of class Reader // //////////////////////////////// -// exact copy of Reader, renamed to OurReader +// Originally copied from the Reader class (now deprecated), used internally +// for implementing JSON reading. class OurReader { public: - typedef char Char; - typedef const Char* Location; + using Char = char; + using Location = const Char*; struct StructuredError { ptrdiff_t offset_start; ptrdiff_t offset_limit; - JSONCPP_STRING message; + String message; }; - OurReader(OurFeatures const& features); - bool parse(const char* beginDoc, - const char* endDoc, - Value& root, + explicit OurReader(OurFeatures const& features); + bool parse(const char* beginDoc, const char* endDoc, Value& root, bool collectComments = true); - JSONCPP_STRING getFormattedErrorMessages() const; + String getFormattedErrorMessages() const; std::vector<StructuredError> getStructuredErrors() const; - bool pushError(const Value& value, const JSONCPP_STRING& message); - bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra); - bool good() const; private: - OurReader(OurReader const&); // no impl - void operator=(OurReader const&); // no impl + OurReader(OurReader const&); // no impl + void operator=(OurReader const&); // no impl enum TokenType { tokenEndOfStream = 0, @@ -1186,17 +1164,18 @@ private: class ErrorInfo { public: Token token_; - JSONCPP_STRING message_; + String message_; Location extra_; }; - typedef std::deque<ErrorInfo> Errors; + using Errors = std::deque<ErrorInfo>; bool readToken(Token& token); void skipSpaces(); - bool match(Location pattern, int patternLength); + void skipBom(bool skipBom); + bool match(const Char* pattern, int patternLength); bool readComment(); - bool readCStyleComment(); + bool readCStyleComment(bool* containsNewLineResult); bool readCppStyleComment(); bool readString(); bool readStringSingleQuote(); @@ -1207,68 +1186,57 @@ private: bool decodeNumber(Token& token); bool decodeNumber(Token& token, Value& decoded); bool decodeString(Token& token); - bool decodeString(Token& token, JSONCPP_STRING& decoded); + bool decodeString(Token& token, String& decoded); bool decodeDouble(Token& token); bool decodeDouble(Token& token, Value& decoded); - bool decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, + bool decodeUnicodeCodePoint(Token& token, Location& current, Location end, unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& unicode); - bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0); + bool decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, unsigned int& unicode); + bool addError(const String& message, Token& token, Location extra = nullptr); bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const JSONCPP_STRING& message, - Token& token, + bool addErrorAndRecover(const String& message, Token& token, TokenType skipUntilToken); void skipUntilSpace(); Value& currentValue(); Char getNextChar(); - void - getLocationLineAndColumn(Location location, int& line, int& column) const; - JSONCPP_STRING getLocationLineAndColumn(Location location) const; + void getLocationLineAndColumn(Location location, int& line, + int& column) const; + String getLocationLineAndColumn(Location location) const; void addComment(Location begin, Location end, CommentPlacement placement); void skipCommentTokens(Token& token); - static JSONCPP_STRING normalizeEOL(Location begin, Location end); + static String normalizeEOL(Location begin, Location end); static bool containsNewLine(Location begin, Location end); - typedef std::stack<Value*> Nodes; - Nodes nodes_; - Errors errors_; - JSONCPP_STRING document_; - Location begin_; - Location end_; - Location current_; - Location lastValueEnd_; - Value* lastValue_; - JSONCPP_STRING commentsBefore_; + using Nodes = std::stack<Value*>; + + Nodes nodes_{}; + Errors errors_{}; + String document_{}; + Location begin_ = nullptr; + Location end_ = nullptr; + Location current_ = nullptr; + Location lastValueEnd_ = nullptr; + Value* lastValue_ = nullptr; + bool lastValueHasAComment_ = false; + String commentsBefore_{}; OurFeatures const features_; - bool collectComments_; -}; // OurReader + bool collectComments_ = false; +}; // OurReader // complete copy of Read impl, for OurReader -bool OurReader::containsNewLine(OurReader::Location begin, OurReader::Location end) { - for (; begin < end; ++begin) - if (*begin == '\n' || *begin == '\r') - return true; - return false; +bool OurReader::containsNewLine(OurReader::Location begin, + OurReader::Location end) { + return std::any_of(begin, end, [](char b) { return b == '\n' || b == '\r'; }); } -OurReader::OurReader(OurFeatures const& features) - : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), - lastValue_(), commentsBefore_(), - features_(features), collectComments_() { -} +OurReader::OurReader(OurFeatures const& features) : features_(features) {} -bool OurReader::parse(const char* beginDoc, - const char* endDoc, - Value& root, - bool collectComments) { +bool OurReader::parse(const char* beginDoc, const char* endDoc, Value& root, + bool collectComments) { if (!features_.allowComments_) { collectComments = false; } @@ -1277,22 +1245,23 @@ bool OurReader::parse(const char* beginDoc, end_ = endDoc; collectComments_ = collectComments; current_ = begin_; - lastValueEnd_ = 0; - lastValue_ = 0; + lastValueEnd_ = nullptr; + lastValue_ = nullptr; commentsBefore_.clear(); errors_.clear(); while (!nodes_.empty()) nodes_.pop(); nodes_.push(&root); + // skip byte order mark if it exists at the beginning of the UTF-8 text. + skipBom(features_.skipBom_); bool successful = readValue(); + nodes_.pop(); Token token; skipCommentTokens(token); - if (features_.failIfExtra_) { - if ((features_.strictRoot_ || token.type_ != tokenError) && token.type_ != tokenEndOfStream) { - addError("Extra non-whitespace after JSON value.", token); - return false; - } + if (features_.failIfExtra_ && (token.type_ != tokenEndOfStream)) { + addError("Extra non-whitespace after JSON value.", token); + return false; } if (collectComments_ && !commentsBefore_.empty()) root.setComment(commentsBefore_, commentAfter); @@ -1314,7 +1283,8 @@ bool OurReader::parse(const char* beginDoc, bool OurReader::readValue() { // To preserve the old behaviour we cast size_t to int. - if (static_cast<int>(nodes_.size()) > features_.stackLimit_) throwRuntimeError("Exceeded stackLimit in readValue()."); + if (nodes_.size() > features_.stackLimit_) + throwRuntimeError("Exceeded stackLimit in readValue()."); Token token; skipCommentTokens(token); bool successful = true; @@ -1339,54 +1309,42 @@ bool OurReader::readValue() { case tokenString: successful = decodeString(token); break; - case tokenTrue: - { + case tokenTrue: { Value v(true); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenFalse: - { + } break; + case tokenFalse: { Value v(false); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenNull: - { + } break; + case tokenNull: { Value v; currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenNaN: - { + } break; + case tokenNaN: { Value v(std::numeric_limits<double>::quiet_NaN()); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenPosInf: - { + } break; + case tokenPosInf: { Value v(std::numeric_limits<double>::infinity()); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenNegInf: - { + } break; + case tokenNegInf: { Value v(-std::numeric_limits<double>::infinity()); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; + } break; case tokenArraySeparator: case tokenObjectEnd: case tokenArrayEnd: @@ -1408,6 +1366,7 @@ bool OurReader::readValue() { if (collectComments_) { lastValueEnd_ = current_; + lastValueHasAComment_ = false; lastValue_ = ¤tValue(); } @@ -1448,10 +1407,13 @@ bool OurReader::readToken(Token& token) { break; case '\'': if (features_.allowSingleQuotes_) { - token.type_ = tokenString; - ok = readStringSingleQuote(); + token.type_ = tokenString; + ok = readStringSingleQuote(); + } else { + // If we don't allow single quotes, this is a failure case. + ok = false; + } break; - } // else fall through case '/': token.type_ = tokenComment; ok = readComment(); @@ -1477,6 +1439,14 @@ bool OurReader::readToken(Token& token) { ok = features_.allowSpecialFloats_ && match("nfinity", 7); } break; + case '+': + if (readNumber(true)) { + token.type_ = tokenNumber; + } else { + token.type_ = tokenPosInf; + ok = features_.allowSpecialFloats_ && match("nfinity", 7); + } + break; case 't': token.type_ = tokenTrue; ok = match("rue", 3); @@ -1521,7 +1491,7 @@ bool OurReader::readToken(Token& token) { if (!ok) token.type_ = tokenError; token.end_ = current_; - return true; + return ok; } void OurReader::skipSpaces() { @@ -1534,7 +1504,17 @@ void OurReader::skipSpaces() { } } -bool OurReader::match(Location pattern, int patternLength) { +void OurReader::skipBom(bool skipBom) { + // The default behavior is to skip BOM. + if (skipBom) { + if ((end_ - begin_) >= 3 && strncmp(begin_, "\xEF\xBB\xBF", 3) == 0) { + begin_ += 3; + current_ = begin_; + } + } +} + +bool OurReader::match(const Char* pattern, int patternLength) { if (end_ - current_ < patternLength) return false; int index = patternLength; @@ -1546,21 +1526,32 @@ bool OurReader::match(Location pattern, int patternLength) { } bool OurReader::readComment() { - Location commentBegin = current_ - 1; - Char c = getNextChar(); + const Location commentBegin = current_ - 1; + const Char c = getNextChar(); bool successful = false; - if (c == '*') - successful = readCStyleComment(); - else if (c == '/') + bool cStyleWithEmbeddedNewline = false; + + const bool isCStyleComment = (c == '*'); + const bool isCppStyleComment = (c == '/'); + if (isCStyleComment) { + successful = readCStyleComment(&cStyleWithEmbeddedNewline); + } else if (isCppStyleComment) { successful = readCppStyleComment(); + } + if (!successful) return false; if (collectComments_) { CommentPlacement placement = commentBefore; - if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { - if (c != '*' || !containsNewLine(commentBegin, current_)) - placement = commentAfterOnSameLine; + + if (!lastValueHasAComment_) { + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (isCppStyleComment || !cStyleWithEmbeddedNewline) { + placement = commentAfterOnSameLine; + lastValueHasAComment_ = true; + } + } } addComment(commentBegin, current_, placement); @@ -1568,16 +1559,17 @@ bool OurReader::readComment() { return true; } -JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin, OurReader::Location end) { - JSONCPP_STRING normalized; +String OurReader::normalizeEOL(OurReader::Location begin, + OurReader::Location end) { + String normalized; normalized.reserve(static_cast<size_t>(end - begin)); OurReader::Location current = begin; while (current != end) { char c = *current++; if (c == '\r') { if (current != end && *current == '\n') - // convert dos EOL - ++current; + // convert dos EOL + ++current; // convert Mac EOL normalized += '\n'; } else { @@ -1587,24 +1579,29 @@ JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin, OurReader::Loc return normalized; } -void -OurReader::addComment(Location begin, Location end, CommentPlacement placement) { +void OurReader::addComment(Location begin, Location end, + CommentPlacement placement) { assert(collectComments_); - const JSONCPP_STRING& normalized = normalizeEOL(begin, end); + const String& normalized = normalizeEOL(begin, end); if (placement == commentAfterOnSameLine) { - assert(lastValue_ != 0); + assert(lastValue_ != nullptr); lastValue_->setComment(normalized, placement); } else { commentsBefore_ += normalized; } } -bool OurReader::readCStyleComment() { +bool OurReader::readCStyleComment(bool* containsNewLineResult) { + *containsNewLineResult = false; + while ((current_ + 1) < end_) { Char c = getNextChar(); if (c == '*' && *current_ == '/') break; + if (c == '\n') + *containsNewLineResult = true; } + return getNextChar() == '/'; } @@ -1625,7 +1622,7 @@ bool OurReader::readCppStyleComment() { } bool OurReader::readNumber(bool checkInf) { - const char *p = current_; + Location p = current_; if (checkInf && p != end_ && *p == 'I') { current_ = ++p; return false; @@ -1662,7 +1659,6 @@ bool OurReader::readString() { return c == '"'; } - bool OurReader::readStringSingleQuote() { Char c = 0; while (current_ != end_) { @@ -1675,19 +1671,21 @@ bool OurReader::readStringSingleQuote() { return c == '\''; } -bool OurReader::readObject(Token& tokenStart) { +bool OurReader::readObject(Token& token) { Token tokenName; - JSONCPP_STRING name; + String name; Value init(objectValue); currentValue().swapPayload(init); - currentValue().setOffsetStart(tokenStart.start_ - begin_); + currentValue().setOffsetStart(token.start_ - begin_); while (readToken(tokenName)) { bool initialTokenOk = true; while (tokenName.type_ == tokenComment && initialTokenOk) initialTokenOk = readToken(tokenName); if (!initialTokenOk) break; - if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + if (tokenName.type_ == tokenObjectEnd && + (name.empty() || + features_.allowTrailingCommas_)) // empty object or trailing comma return true; name.clear(); if (tokenName.type_ == tokenString) { @@ -1701,17 +1699,17 @@ bool OurReader::readObject(Token& tokenStart) { } else { break; } + if (name.length() >= (1U << 30)) + throwRuntimeError("keylength >= 2^30"); + if (features_.rejectDupKeys_ && currentValue().isMember(name)) { + String msg = "Duplicate key: '" + name + "'"; + return addErrorAndRecover(msg, tokenName, tokenObjectEnd); + } Token colon; if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { - return addErrorAndRecover( - "Missing ':' after object member name", colon, tokenObjectEnd); - } - if (name.length() >= (1U<<30)) throwRuntimeError("keylength >= 2^30"); - if (features_.rejectDupKeys_ && currentValue().isMember(name)) { - JSONCPP_STRING msg = "Duplicate key: '" + name + "'"; - return addErrorAndRecover( - msg, tokenName, tokenObjectEnd); + return addErrorAndRecover("Missing ':' after object member name", colon, + tokenObjectEnd); } Value& value = currentValue()[name]; nodes_.push(&value); @@ -1724,8 +1722,8 @@ bool OurReader::readObject(Token& tokenStart) { if (!readToken(comma) || (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && comma.type_ != tokenComment)) { - return addErrorAndRecover( - "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + return addErrorAndRecover("Missing ',' or '}' in object declaration", + comma, tokenObjectEnd); } bool finalizeTokenOk = true; while (comma.type_ == tokenComment && finalizeTokenOk) @@ -1733,23 +1731,27 @@ bool OurReader::readObject(Token& tokenStart) { if (comma.type_ == tokenObjectEnd) return true; } - return addErrorAndRecover( - "Missing '}' or object member name", tokenName, tokenObjectEnd); + return addErrorAndRecover("Missing '}' or object member name", tokenName, + tokenObjectEnd); } -bool OurReader::readArray(Token& tokenStart) { +bool OurReader::readArray(Token& token) { Value init(arrayValue); currentValue().swapPayload(init); - currentValue().setOffsetStart(tokenStart.start_ - begin_); - skipSpaces(); - if (current_ != end_ && *current_ == ']') // empty array - { - Token endArray; - readToken(endArray); - return true; - } + currentValue().setOffsetStart(token.start_ - begin_); int index = 0; for (;;) { + skipSpaces(); + if (current_ != end_ && *current_ == ']' && + (index == 0 || + (features_.allowTrailingCommas_ && + !features_.allowDroppedNullPlaceholders_))) // empty array or trailing + // comma + { + Token endArray; + readToken(endArray); + return true; + } Value& value = currentValue()[index++]; nodes_.push(&value); bool ok = readValue(); @@ -1757,19 +1759,19 @@ bool OurReader::readArray(Token& tokenStart) { if (!ok) // error already set return recoverFromError(tokenArrayEnd); - Token token; + Token currentToken; // Accept Comment after last item in the array. - ok = readToken(token); - while (token.type_ == tokenComment && ok) { - ok = readToken(token); + ok = readToken(currentToken); + while (currentToken.type_ == tokenComment && ok) { + ok = readToken(currentToken); } - bool badTokenType = - (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + bool badTokenType = (currentToken.type_ != tokenArraySeparator && + currentToken.type_ != tokenArrayEnd); if (!ok || badTokenType) { - return addErrorAndRecover( - "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + return addErrorAndRecover("Missing ',' or ']' in array declaration", + currentToken, tokenArrayEnd); } - if (token.type_ == tokenArrayEnd) + if (currentToken.type_ == tokenArrayEnd) break; } return true; @@ -1790,38 +1792,78 @@ bool OurReader::decodeNumber(Token& token, Value& decoded) { // larger than the maximum supported value of an integer then // we decode the number as a double. Location current = token.start_; - bool isNegative = *current == '-'; - if (isNegative) + const bool isNegative = *current == '-'; + if (isNegative) { ++current; - // TODO: Help the compiler do the div and mod at compile time or get rid of them. - Value::LargestUInt maxIntegerValue = - isNegative ? Value::LargestUInt(-Value::minLargestInt) - : Value::maxLargestUInt; - Value::LargestUInt threshold = maxIntegerValue / 10; + } + + // We assume we can represent the largest and smallest integer types as + // unsigned integers with separate sign. This is only true if they can fit + // into an unsigned integer. + static_assert(Value::maxLargestInt <= Value::maxLargestUInt, + "Int must be smaller than UInt"); + + // We need to convert minLargestInt into a positive number. The easiest way + // to do this conversion is to assume our "threshold" value of minLargestInt + // divided by 10 can fit in maxLargestInt when absolute valued. This should + // be a safe assumption. + static_assert(Value::minLargestInt <= -Value::maxLargestInt, + "The absolute value of minLargestInt must be greater than or " + "equal to maxLargestInt"); + static_assert(Value::minLargestInt / 10 >= -Value::maxLargestInt, + "The absolute value of minLargestInt must be only 1 magnitude " + "larger than maxLargest Int"); + + static constexpr Value::LargestUInt positive_threshold = + Value::maxLargestUInt / 10; + static constexpr Value::UInt positive_last_digit = Value::maxLargestUInt % 10; + + // For the negative values, we have to be more careful. Since typically + // -Value::minLargestInt will cause an overflow, we first divide by 10 and + // then take the inverse. This assumes that minLargestInt is only a single + // power of 10 different in magnitude, which we check above. For the last + // digit, we take the modulus before negating for the same reason. + static constexpr auto negative_threshold = + Value::LargestUInt(-(Value::minLargestInt / 10)); + static constexpr auto negative_last_digit = + Value::UInt(-(Value::minLargestInt % 10)); + + const Value::LargestUInt threshold = + isNegative ? negative_threshold : positive_threshold; + const Value::UInt max_last_digit = + isNegative ? negative_last_digit : positive_last_digit; + Value::LargestUInt value = 0; while (current < token.end_) { Char c = *current++; if (c < '0' || c > '9') return decodeDouble(token, decoded); - Value::UInt digit(static_cast<Value::UInt>(c - '0')); + + const auto digit(static_cast<Value::UInt>(c - '0')); if (value >= threshold) { // We've hit or exceeded the max value divided by 10 (rounded down). If - // a) we've only just touched the limit, b) this is the last digit, and + // a) we've only just touched the limit, meaing value == threshold, + // b) this is the last digit, or // c) it's small enough to fit in that rounding delta, we're okay. // Otherwise treat this number as a double to avoid overflow. if (value > threshold || current != token.end_ || - digit > maxIntegerValue % 10) { + digit > max_last_digit) { return decodeDouble(token, decoded); } } value = value * 10 + digit; } - if (isNegative) - decoded = -Value::LargestInt(value); - else if (value <= Value::LargestUInt(Value::maxInt)) + + if (isNegative) { + // We use the same magnitude assumption here, just in case. + const auto last_digit = static_cast<Value::UInt>(value % 10); + decoded = -Value::LargestInt(value / 10) * 10 - last_digit; + } else if (value <= Value::LargestUInt(Value::maxLargestInt)) { decoded = Value::LargestInt(value); - else + } else { decoded = value; + } + return true; } @@ -1837,44 +1879,18 @@ bool OurReader::decodeDouble(Token& token) { bool OurReader::decodeDouble(Token& token, Value& decoded) { double value = 0; - const int bufferSize = 32; - int count; - ptrdiff_t const length = token.end_ - token.start_; - - // Sanity check to avoid buffer overflow exploits. - if (length < 0) { - return addError("Unable to parse token length", token); + const String buffer(token.start_, token.end_); + IStringStream is(buffer); + if (!(is >> value)) { + return addError( + "'" + String(token.start_, token.end_) + "' is not a number.", token); } - size_t const ulength = static_cast<size_t>(length); - - // Avoid using a string constant for the format control string given to - // sscanf, as this can cause hard to debug crashes on OS X. See here for more - // info: - // - // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html - char format[] = "%lf"; - - if (length <= bufferSize) { - Char buffer[bufferSize + 1]; - memcpy(buffer, token.start_, ulength); - buffer[length] = 0; - fixNumericLocaleInput(buffer, buffer + length); - count = sscanf(buffer, format, &value); - } else { - JSONCPP_STRING buffer(token.start_, token.end_); - count = sscanf(buffer.c_str(), format, &value); - } - - if (count != 1) - return addError("'" + JSONCPP_STRING(token.start_, token.end_) + - "' is not a number.", - token); decoded = value; return true; } bool OurReader::decodeString(Token& token) { - JSONCPP_STRING decoded_string; + String decoded_string; if (!decodeString(token, decoded_string)) return false; Value decoded(decoded_string); @@ -1884,7 +1900,7 @@ bool OurReader::decodeString(Token& token) { return true; } -bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) { +bool OurReader::decodeString(Token& token, String& decoded) { decoded.reserve(static_cast<size_t>(token.end_ - token.start_ - 2)); Location current = token.start_ + 1; // skip '"' Location end = token.end_ - 1; // do not include '"' @@ -1892,7 +1908,7 @@ bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) { Char c = *current++; if (c == '"') break; - else if (c == '\\') { + if (c == '\\') { if (current == end) return addError("Empty escape sequence in string", token, current); Char escape = *current++; @@ -1937,10 +1953,8 @@ bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) { return true; } -bool OurReader::decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, - unsigned int& unicode) { +bool OurReader::decodeUnicodeCodePoint(Token& token, Location& current, + Location end, unsigned int& unicode) { if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) return false; @@ -1949,10 +1963,9 @@ bool OurReader::decodeUnicodeCodePoint(Token& token, if (end - current < 6) return addError( "additional six characters expected to parse unicode surrogate pair.", - token, - current); - unsigned int surrogatePair; + token, current); if (*(current++) == '\\' && *(current++) == 'u') { + unsigned int surrogatePair; if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); } else @@ -1960,20 +1973,17 @@ bool OurReader::decodeUnicodeCodePoint(Token& token, } else return addError("expecting another \\u token to begin the second half of " "a unicode surrogate pair", - token, - current); + token, current); } return true; } -bool OurReader::decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& ret_unicode) { +bool OurReader::decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, + unsigned int& ret_unicode) { if (end - current < 4) return addError( - "Bad unicode escape sequence in string: four digits expected.", - token, + "Bad unicode escape sequence in string: four digits expected.", token, current); int unicode = 0; for (int index = 0; index < 4; ++index) { @@ -1988,15 +1998,13 @@ bool OurReader::decodeUnicodeEscapeSequence(Token& token, else return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", - token, - current); + token, current); } ret_unicode = static_cast<unsigned int>(unicode); return true; } -bool -OurReader::addError(const JSONCPP_STRING& message, Token& token, Location extra) { +bool OurReader::addError(const String& message, Token& token, Location extra) { ErrorInfo info; info.token_ = token; info.message_ = message; @@ -2018,9 +2026,8 @@ bool OurReader::recoverFromError(TokenType skipUntilToken) { return false; } -bool OurReader::addErrorAndRecover(const JSONCPP_STRING& message, - Token& token, - TokenType skipUntilToken) { +bool OurReader::addErrorAndRecover(const String& message, Token& token, + TokenType skipUntilToken) { addError(message, token); return recoverFromError(skipUntilToken); } @@ -2033,9 +2040,8 @@ OurReader::Char OurReader::getNextChar() { return *current_++; } -void OurReader::getLocationLineAndColumn(Location location, - int& line, - int& column) const { +void OurReader::getLocationLineAndColumn(Location location, int& line, + int& column) const { Location current = begin_; Location lastLineStart = current; line = 0; @@ -2056,20 +2062,17 @@ void OurReader::getLocationLineAndColumn(Location location, ++line; } -JSONCPP_STRING OurReader::getLocationLineAndColumn(Location location) const { +String OurReader::getLocationLineAndColumn(Location location) const { int line, column; getLocationLineAndColumn(location, line, column); char buffer[18 + 16 + 16 + 1]; - snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); return buffer; } -JSONCPP_STRING OurReader::getFormattedErrorMessages() const { - JSONCPP_STRING formattedMessage; - for (Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError) { - const ErrorInfo& error = *itError; +String OurReader::getFormattedErrorMessages() const { + String formattedMessage; + for (const auto& error : errors_) { formattedMessage += "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; formattedMessage += " " + error.message_ + "\n"; @@ -2082,10 +2085,7 @@ JSONCPP_STRING OurReader::getFormattedErrorMessages() const { std::vector<OurReader::StructuredError> OurReader::getStructuredErrors() const { std::vector<OurReader::StructuredError> allErrors; - for (Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError) { - const ErrorInfo& error = *itError; + for (const auto& error : errors_) { OurReader::StructuredError structured; structured.offset_start = error.token_.start_ - begin_; structured.offset_limit = error.token_.end_ - begin_; @@ -2095,59 +2095,15 @@ std::vector<OurReader::StructuredError> OurReader::getStructuredErrors() const { return allErrors; } -bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message) { - ptrdiff_t length = end_ - begin_; - if(value.getOffsetStart() > length - || value.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = end_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = 0; - errors_.push_back(info); - return true; -} - -bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) { - ptrdiff_t length = end_ - begin_; - if(value.getOffsetStart() > length - || value.getOffsetLimit() > length - || extra.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = begin_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = begin_ + extra.getOffsetStart(); - errors_.push_back(info); - return true; -} - -bool OurReader::good() const { - return !errors_.size(); -} - - class OurCharReader : public CharReader { bool const collectComments_; OurReader reader_; + public: - OurCharReader( - bool collectComments, - OurFeatures const& features) - : collectComments_(collectComments) - , reader_(features) - {} - bool parse( - char const* beginDoc, char const* endDoc, - Value* root, JSONCPP_STRING* errs) JSONCPP_OVERRIDE { + OurCharReader(bool collectComments, OurFeatures const& features) + : collectComments_(collectComments), reader_(features) {} + bool parse(char const* beginDoc, char const* endDoc, Value* root, + String* errs) override { bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); if (errs) { *errs = reader_.getFormattedErrorMessages(); @@ -2156,67 +2112,64 @@ public: } }; -CharReaderBuilder::CharReaderBuilder() -{ - setDefaults(&settings_); -} -CharReaderBuilder::~CharReaderBuilder() -{} -CharReader* CharReaderBuilder::newCharReader() const -{ +CharReaderBuilder::CharReaderBuilder() { setDefaults(&settings_); } +CharReaderBuilder::~CharReaderBuilder() = default; +CharReader* CharReaderBuilder::newCharReader() const { bool collectComments = settings_["collectComments"].asBool(); OurFeatures features = OurFeatures::all(); features.allowComments_ = settings_["allowComments"].asBool(); + features.allowTrailingCommas_ = settings_["allowTrailingCommas"].asBool(); features.strictRoot_ = settings_["strictRoot"].asBool(); - features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool(); + features.allowDroppedNullPlaceholders_ = + settings_["allowDroppedNullPlaceholders"].asBool(); features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); - features.stackLimit_ = settings_["stackLimit"].asInt(); + + // Stack limit is always a size_t, so we get this as an unsigned int + // regardless of it we have 64-bit integer support enabled. + features.stackLimit_ = static_cast<size_t>(settings_["stackLimit"].asUInt()); features.failIfExtra_ = settings_["failIfExtra"].asBool(); features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); + features.skipBom_ = settings_["skipBom"].asBool(); return new OurCharReader(collectComments, features); } -static void getValidReaderKeys(std::set<JSONCPP_STRING>* valid_keys) -{ - valid_keys->clear(); - valid_keys->insert("collectComments"); - valid_keys->insert("allowComments"); - valid_keys->insert("strictRoot"); - valid_keys->insert("allowDroppedNullPlaceholders"); - valid_keys->insert("allowNumericKeys"); - valid_keys->insert("allowSingleQuotes"); - valid_keys->insert("stackLimit"); - valid_keys->insert("failIfExtra"); - valid_keys->insert("rejectDupKeys"); - valid_keys->insert("allowSpecialFloats"); -} -bool CharReaderBuilder::validate(Json::Value* invalid) const -{ - Json::Value my_invalid; - if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL - Json::Value& inv = *invalid; - std::set<JSONCPP_STRING> valid_keys; - getValidReaderKeys(&valid_keys); - Value::Members keys = settings_.getMemberNames(); - size_t n = keys.size(); - for (size_t i = 0; i < n; ++i) { - JSONCPP_STRING const& key = keys[i]; - if (valid_keys.find(key) == valid_keys.end()) { - inv[key] = settings_[key]; - } + +bool CharReaderBuilder::validate(Json::Value* invalid) const { + static const auto& valid_keys = *new std::set<String>{ + "collectComments", + "allowComments", + "allowTrailingCommas", + "strictRoot", + "allowDroppedNullPlaceholders", + "allowNumericKeys", + "allowSingleQuotes", + "stackLimit", + "failIfExtra", + "rejectDupKeys", + "allowSpecialFloats", + "skipBom", + }; + for (auto si = settings_.begin(); si != settings_.end(); ++si) { + auto key = si.name(); + if (valid_keys.count(key)) + continue; + if (invalid) + (*invalid)[std::move(key)] = *si; + else + return false; } - return 0u == inv.size(); + return invalid ? invalid->empty() : true; } -Value& CharReaderBuilder::operator[](JSONCPP_STRING key) -{ + +Value& CharReaderBuilder::operator[](const String& key) { return settings_[key]; } // static -void CharReaderBuilder::strictMode(Json::Value* settings) -{ -//! [CharReaderBuilderStrictMode] +void CharReaderBuilder::strictMode(Json::Value* settings) { + //! [CharReaderBuilderStrictMode] (*settings)["allowComments"] = false; + (*settings)["allowTrailingCommas"] = false; (*settings)["strictRoot"] = true; (*settings)["allowDroppedNullPlaceholders"] = false; (*settings)["allowNumericKeys"] = false; @@ -2225,14 +2178,15 @@ void CharReaderBuilder::strictMode(Json::Value* settings) (*settings)["failIfExtra"] = true; (*settings)["rejectDupKeys"] = true; (*settings)["allowSpecialFloats"] = false; -//! [CharReaderBuilderStrictMode] + (*settings)["skipBom"] = true; + //! [CharReaderBuilderStrictMode] } // static -void CharReaderBuilder::setDefaults(Json::Value* settings) -{ -//! [CharReaderBuilderDefaults] +void CharReaderBuilder::setDefaults(Json::Value* settings) { + //! [CharReaderBuilderDefaults] (*settings)["collectComments"] = true; (*settings)["allowComments"] = true; + (*settings)["allowTrailingCommas"] = true; (*settings)["strictRoot"] = false; (*settings)["allowDroppedNullPlaceholders"] = false; (*settings)["allowNumericKeys"] = false; @@ -2241,19 +2195,18 @@ void CharReaderBuilder::setDefaults(Json::Value* settings) (*settings)["failIfExtra"] = false; (*settings)["rejectDupKeys"] = false; (*settings)["allowSpecialFloats"] = false; -//! [CharReaderBuilderDefaults] + (*settings)["skipBom"] = true; + //! [CharReaderBuilderDefaults] } ////////////////////////////////// // global functions -bool parseFromStream( - CharReader::Factory const& fact, JSONCPP_ISTREAM& sin, - Value* root, JSONCPP_STRING* errs) -{ - JSONCPP_OSTRINGSTREAM ssin; +bool parseFromStream(CharReader::Factory const& fact, IStream& sin, Value* root, + String* errs) { + OStringStream ssin; ssin << sin.rdbuf(); - JSONCPP_STRING doc = ssin.str(); + String doc = ssin.str(); char const* begin = doc.data(); char const* end = begin + doc.size(); // Note that we do not actually need a null-terminator. @@ -2261,9 +2214,9 @@ bool parseFromStream( return reader->parse(begin, end, root, errs); } -JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM& sin, Value& root) { +IStream& operator>>(IStream& sin, Value& root) { CharReaderBuilder b; - JSONCPP_STRING errs; + String errs; bool ok = parseFromStream(b, sin, &root, &errs); if (!ok) { throwRuntimeError(errs); @@ -2303,31 +2256,21 @@ namespace Json { // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// -ValueIteratorBase::ValueIteratorBase() - : current_(), isNull_(true) { -} +ValueIteratorBase::ValueIteratorBase() : current_() {} ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator& current) : current_(current), isNull_(false) {} -Value& ValueIteratorBase::deref() const { - return current_->second; -} +Value& ValueIteratorBase::deref() { return current_->second; } +const Value& ValueIteratorBase::deref() const { return current_->second; } -void ValueIteratorBase::increment() { - ++current_; -} +void ValueIteratorBase::increment() { ++current_; } -void ValueIteratorBase::decrement() { - --current_; -} +void ValueIteratorBase::decrement() { --current_; } ValueIteratorBase::difference_type ValueIteratorBase::computeDistance(const SelfType& other) const { -#ifdef JSON_USE_CPPTL_SMALLMAP - return other.current_ - current_; -#else // Iterator for null value are initialized using the default // constructor, which initialize current_ to the default // std::map::iterator. As begin() and end() are two instance @@ -2348,7 +2291,6 @@ ValueIteratorBase::computeDistance(const SelfType& other) const { ++myDistance; } return myDistance; -#endif } bool ValueIteratorBase::isEqual(const SelfType& other) const { @@ -2380,12 +2322,13 @@ UInt ValueIteratorBase::index() const { return Value::UInt(-1); } -JSONCPP_STRING ValueIteratorBase::name() const { +String ValueIteratorBase::name() const { char const* keey; char const* end; keey = memberName(&end); - if (!keey) return JSONCPP_STRING(); - return JSONCPP_STRING(keey, end); + if (!keey) + return String(); + return String(keey, end); } char const* ValueIteratorBase::memberName() const { @@ -2396,8 +2339,8 @@ char const* ValueIteratorBase::memberName() const { char const* ValueIteratorBase::memberName(char const** end) const { const char* cname = (*current_).first.data(); if (!cname) { - *end = NULL; - return NULL; + *end = nullptr; + return nullptr; } *end = cname + (*current_).first.length(); return cname; @@ -2411,7 +2354,7 @@ char const* ValueIteratorBase::memberName(char const** end) const { // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// -ValueConstIterator::ValueConstIterator() {} +ValueConstIterator::ValueConstIterator() = default; ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator& current) @@ -2434,7 +2377,7 @@ operator=(const ValueIteratorBase& other) { // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// -ValueIterator::ValueIterator() {} +ValueIterator::ValueIterator() = default; ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) : ValueIteratorBase(current) {} @@ -2444,8 +2387,7 @@ ValueIterator::ValueIterator(const ValueConstIterator& other) throwRuntimeError("ConstIterator to Iterator should never be allowed."); } -ValueIterator::ValueIterator(const ValueIterator& other) - : ValueIteratorBase(other) {} +ValueIterator::ValueIterator(const ValueIterator& other) = default; ValueIterator& ValueIterator::operator=(const SelfType& other) { copy(other); @@ -2477,20 +2419,54 @@ ValueIterator& ValueIterator::operator=(const SelfType& other) { #include <json/value.h> #include <json/writer.h> #endif // if !defined(JSON_IS_AMALGAMATION) -#include <math.h> +#include <algorithm> +#include <cassert> +#include <cmath> +#include <cstddef> +#include <cstring> +#include <iostream> #include <sstream> #include <utility> -#include <cstring> -#include <cassert> -#ifdef JSON_USE_CPPTL -#include <cpptl/conststring.h> + +// Provide implementation equivalent of std::snprintf for older _MSC compilers +#if defined(_MSC_VER) && _MSC_VER < 1900 +#include <stdarg.h> +static int msvc_pre1900_c99_vsnprintf(char* outBuf, size_t size, + const char* format, va_list ap) { + int count = -1; + if (size != 0) + count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); + if (count == -1) + count = _vscprintf(format, ap); + return count; +} + +int JSON_API msvc_pre1900_c99_snprintf(char* outBuf, size_t size, + const char* format, ...) { + va_list ap; + va_start(ap, format); + const int count = msvc_pre1900_c99_vsnprintf(outBuf, size, format, ap); + va_end(ap); + return count; +} +#endif + +// Disable warning C4702 : unreachable code +#if defined(_MSC_VER) +#pragma warning(disable : 4702) #endif -#include <cstddef> // size_t -#include <algorithm> // min() #define JSON_ASSERT_UNREACHABLE assert(false) namespace Json { +template <typename T> +static std::unique_ptr<T> cloneUnique(const std::unique_ptr<T>& p) { + std::unique_ptr<T> r; + if (p) { + r = std::unique_ptr<T>(new T(*p)); + } + return r; +} // This is a walkaround to avoid the static initialization of Value::null. // kNull must be word-aligned to avoid crashing on ARM. We use an alignment of @@ -2500,50 +2476,34 @@ namespace Json { #else #define ALIGNAS(byte_alignment) #endif -//static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 }; -//const unsigned char& kNullRef = kNull[0]; -//const Value& Value::null = reinterpret_cast<const Value&>(kNullRef); -//const Value& Value::nullRef = null; // static -Value const& Value::nullSingleton() -{ - static Value const nullStatic; - return nullStatic; +Value const& Value::nullSingleton() { + static Value const nullStatic; + return nullStatic; } -// for backwards compatibility, we'll leave these global references around, but DO NOT -// use them in JSONCPP library code any more! +#if JSON_USE_NULLREF +// for backwards compatibility, we'll leave these global references around, but +// DO NOT use them in JSONCPP library code any more! +// static Value const& Value::null = Value::nullSingleton(); -Value const& Value::nullRef = Value::nullSingleton(); -const Int Value::minInt = Int(~(UInt(-1) / 2)); -const Int Value::maxInt = Int(UInt(-1) / 2); -const UInt Value::maxUInt = UInt(-1); -#if defined(JSON_HAS_INT64) -const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2)); -const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2); -const UInt64 Value::maxUInt64 = UInt64(-1); -// The constant is hard-coded because some compiler have trouble -// converting Value::maxUInt64 to a double correctly (AIX/xlC). -// Assumes that UInt64 is a 64 bits integer. -static const double maxUInt64AsDouble = 18446744073709551615.0; -#endif // defined(JSON_HAS_INT64) -const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2)); -const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2); -const LargestUInt Value::maxLargestUInt = LargestUInt(-1); +// static +Value const& Value::nullRef = Value::nullSingleton(); +#endif #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) template <typename T, typename U> static inline bool InRange(double d, T min, U max) { // The casts can lose precision, but we are looking only for // an approximate range. Might fail on edge cases though. ~cdunn - //return d >= static_cast<double>(min) && d <= static_cast<double>(max); - return d >= min && d <= max; + return d >= static_cast<double>(min) && d <= static_cast<double>(max); } #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) static inline double integerToDouble(Json::UInt64 value) { - return static_cast<double>(Int64(value / 2)) * 2.0 + static_cast<double>(Int64(value & 1)); + return static_cast<double>(Int64(value / 2)) * 2.0 + + static_cast<double>(Int64(value & 1)); } template <typename T> static inline double integerToDouble(T value) { @@ -2563,19 +2523,16 @@ static inline bool InRange(double d, T min, U max) { * computed using strlen(value). * @return Pointer on the duplicate instance of string. */ -static inline char* duplicateStringValue(const char* value, - size_t length) -{ +static inline char* duplicateStringValue(const char* value, size_t length) { // Avoid an integer overflow in the call to malloc below by limiting length // to a sane value. if (length >= static_cast<size_t>(Value::maxInt)) length = Value::maxInt - 1; - char* newString = static_cast<char*>(malloc(length + 1)); - if (newString == NULL) { - throwRuntimeError( - "in Json::Value::duplicateStringValue(): " - "Failed to allocate string value buffer"); + auto newString = static_cast<char*>(malloc(length + 1)); + if (newString == nullptr) { + throwRuntimeError("in Json::Value::duplicateStringValue(): " + "Failed to allocate string value buffer"); } memcpy(newString, value, length); newString[length] = 0; @@ -2584,31 +2541,28 @@ static inline char* duplicateStringValue(const char* value, /* Record the length as a prefix. */ -static inline char* duplicateAndPrefixStringValue( - const char* value, - unsigned int length) -{ +static inline char* duplicateAndPrefixStringValue(const char* value, + unsigned int length) { // Avoid an integer overflow in the call to malloc below by limiting length // to a sane value. - JSON_ASSERT_MESSAGE(length <= static_cast<unsigned>(Value::maxInt) - sizeof(unsigned) - 1U, + JSON_ASSERT_MESSAGE(length <= static_cast<unsigned>(Value::maxInt) - + sizeof(unsigned) - 1U, "in Json::Value::duplicateAndPrefixStringValue(): " "length too big for prefixing"); - unsigned actualLength = length + static_cast<unsigned>(sizeof(unsigned)) + 1U; - char* newString = static_cast<char*>(malloc(actualLength)); - if (newString == 0) { - throwRuntimeError( - "in Json::Value::duplicateAndPrefixStringValue(): " - "Failed to allocate string value buffer"); + size_t actualLength = sizeof(length) + length + 1; + auto newString = static_cast<char*>(malloc(actualLength)); + if (newString == nullptr) { + throwRuntimeError("in Json::Value::duplicateAndPrefixStringValue(): " + "Failed to allocate string value buffer"); } *reinterpret_cast<unsigned*>(newString) = length; memcpy(newString + sizeof(unsigned), value, length); - newString[actualLength - 1U] = 0; // to avoid buffer over-run accidents by users later + newString[actualLength - 1U] = + 0; // to avoid buffer over-run accidents by users later return newString; } -inline static void decodePrefixedString( - bool isPrefixed, char const* prefixed, - unsigned* length, char const** value) -{ +inline static void decodePrefixedString(bool isPrefixed, char const* prefixed, + unsigned* length, char const** value) { if (!isPrefixed) { *length = static_cast<unsigned>(strlen(prefixed)); *value = prefixed; @@ -2617,7 +2571,8 @@ inline static void decodePrefixedString( *value = prefixed + sizeof(unsigned); } } -/** Free the string duplicated by duplicateStringValue()/duplicateAndPrefixStringValue(). +/** Free the string duplicated by + * duplicateStringValue()/duplicateAndPrefixStringValue(). */ #if JSONCPP_USING_SECURE_MEMORY static inline void releasePrefixedStringValue(char* value) { @@ -2630,17 +2585,13 @@ static inline void releasePrefixedStringValue(char* value) { } static inline void releaseStringValue(char* value, unsigned length) { // length==0 => we allocated the strings memory - size_t size = (length==0) ? strlen(value) : length; + size_t size = (length == 0) ? strlen(value) : length; memset(value, 0, size); free(value); } -#else // !JSONCPP_USING_SECURE_MEMORY -static inline void releasePrefixedStringValue(char* value) { - free(value); -} -static inline void releaseStringValue(char* value, unsigned) { - free(value); -} +#else // !JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { free(value); } +static inline void releaseStringValue(char* value, unsigned) { free(value); } #endif // JSONCPP_USING_SECURE_MEMORY } // namespace Json @@ -2659,58 +2610,28 @@ static inline void releaseStringValue(char* value, unsigned) { namespace Json { -Exception::Exception(JSONCPP_STRING const& msg) - : msg_(msg) -{} -Exception::~Exception() JSONCPP_NOEXCEPT -{} -char const* Exception::what() const JSONCPP_NOEXCEPT -{ - return msg_.c_str(); -} -RuntimeError::RuntimeError(JSONCPP_STRING const& msg) - : Exception(msg) -{} -LogicError::LogicError(JSONCPP_STRING const& msg) - : Exception(msg) -{} -JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg) -{ +#if JSON_USE_EXCEPTION +Exception::Exception(String msg) : msg_(std::move(msg)) {} +Exception::~Exception() noexcept = default; +char const* Exception::what() const noexcept { return msg_.c_str(); } +RuntimeError::RuntimeError(String const& msg) : Exception(msg) {} +LogicError::LogicError(String const& msg) : Exception(msg) {} +JSONCPP_NORETURN void throwRuntimeError(String const& msg) { throw RuntimeError(msg); } -JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg) -{ +JSONCPP_NORETURN void throwLogicError(String const& msg) { throw LogicError(msg); } - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CommentInfo -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -Value::CommentInfo::CommentInfo() : comment_(0) -{} - -Value::CommentInfo::~CommentInfo() { - if (comment_) - releaseStringValue(comment_, 0u); +#else // !JSON_USE_EXCEPTION +JSONCPP_NORETURN void throwRuntimeError(String const& msg) { + std::cerr << msg << std::endl; + abort(); } - -void Value::CommentInfo::setComment(const char* text, size_t len) { - if (comment_) { - releaseStringValue(comment_, 0u); - comment_ = 0; - } - JSON_ASSERT(text != 0); - JSON_ASSERT_MESSAGE( - text[0] == '\0' || text[0] == '/', - "in Json::Value::setComment(): Comments must start with /"); - // It seems that /**/ style comments are acceptable as well. - comment_ = duplicateStringValue(text, len); +JSONCPP_NORETURN void throwLogicError(String const& msg) { + std::cerr << msg << std::endl; + abort(); } +#endif // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// @@ -2723,36 +2644,44 @@ void Value::CommentInfo::setComment(const char* text, size_t len) { // Notes: policy_ indicates if the string was allocated when // a string is stored. -Value::CZString::CZString(ArrayIndex aindex) : cstr_(0), index_(aindex) {} +Value::CZString::CZString(ArrayIndex index) : cstr_(nullptr), index_(index) {} -Value::CZString::CZString(char const* str, unsigned ulength, DuplicationPolicy allocate) +Value::CZString::CZString(char const* str, unsigned length, + DuplicationPolicy allocate) : cstr_(str) { // allocate != duplicate storage_.policy_ = allocate & 0x3; - storage_.length_ = ulength & 0x3FFFFFFF; + storage_.length_ = length & 0x3FFFFFFF; } Value::CZString::CZString(const CZString& other) { - cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != 0 - ? duplicateStringValue(other.cstr_, other.storage_.length_) - : other.cstr_); - storage_.policy_ = static_cast<unsigned>(other.cstr_ - ? (static_cast<DuplicationPolicy>(other.storage_.policy_) == noDuplication - ? noDuplication : duplicate) - : static_cast<DuplicationPolicy>(other.storage_.policy_)) & 3U; + cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != nullptr + ? duplicateStringValue(other.cstr_, other.storage_.length_) + : other.cstr_); + storage_.policy_ = + static_cast<unsigned>( + other.cstr_ + ? (static_cast<DuplicationPolicy>(other.storage_.policy_) == + noDuplication + ? noDuplication + : duplicate) + : static_cast<DuplicationPolicy>(other.storage_.policy_)) & + 3U; storage_.length_ = other.storage_.length_; } -#if JSON_HAS_RVALUE_REFERENCES Value::CZString::CZString(CZString&& other) - : cstr_(other.cstr_), index_(other.index_) { + : cstr_(other.cstr_), index_(other.index_) { other.cstr_ = nullptr; } -#endif Value::CZString::~CZString() { if (cstr_ && storage_.policy_ == duplicate) { - releaseStringValue(const_cast<char*>(cstr_), storage_.length_ + 1u); //+1 for null terminating character for sake of completeness but not actually necessary + releaseStringValue(const_cast<char*>(cstr_), + storage_.length_ + 1U); // +1 for null terminating + // character for sake of + // completeness but not actually + // necessary } } @@ -2767,36 +2696,39 @@ Value::CZString& Value::CZString::operator=(const CZString& other) { return *this; } -#if JSON_HAS_RVALUE_REFERENCES Value::CZString& Value::CZString::operator=(CZString&& other) { cstr_ = other.cstr_; index_ = other.index_; other.cstr_ = nullptr; return *this; } -#endif bool Value::CZString::operator<(const CZString& other) const { - if (!cstr_) return index_ < other.index_; - //return strcmp(cstr_, other.cstr_) < 0; + if (!cstr_) + return index_ < other.index_; + // return strcmp(cstr_, other.cstr_) < 0; // Assume both are strings. unsigned this_len = this->storage_.length_; unsigned other_len = other.storage_.length_; unsigned min_len = std::min<unsigned>(this_len, other_len); JSON_ASSERT(this->cstr_ && other.cstr_); int comp = memcmp(this->cstr_, other.cstr_, min_len); - if (comp < 0) return true; - if (comp > 0) return false; + if (comp < 0) + return true; + if (comp > 0) + return false; return (this_len < other_len); } bool Value::CZString::operator==(const CZString& other) const { - if (!cstr_) return index_ == other.index_; - //return strcmp(cstr_, other.cstr_) == 0; + if (!cstr_) + return index_ == other.index_; + // return strcmp(cstr_, other.cstr_) == 0; // Assume both are strings. unsigned this_len = this->storage_.length_; unsigned other_len = other.storage_.length_; - if (this_len != other_len) return false; + if (this_len != other_len) + return false; JSON_ASSERT(this->cstr_ && other.cstr_); int comp = memcmp(this->cstr_, other.cstr_, this_len); return comp == 0; @@ -2804,10 +2736,12 @@ bool Value::CZString::operator==(const CZString& other) const { ArrayIndex Value::CZString::index() const { return index_; } -//const char* Value::CZString::c_str() const { return cstr_; } +// const char* Value::CZString::c_str() const { return cstr_; } const char* Value::CZString::data() const { return cstr_; } unsigned Value::CZString::length() const { return storage_.length_; } -bool Value::CZString::isStaticString() const { return storage_.policy_ == noDuplication; } +bool Value::CZString::isStaticString() const { + return storage_.policy_ == noDuplication; +} // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// @@ -2821,10 +2755,10 @@ bool Value::CZString::isStaticString() const { return storage_.policy_ == noDupl * memset( this, 0, sizeof(Value) ) * This optimization is used in ValueInternalMap fast allocator. */ -Value::Value(ValueType vtype) { +Value::Value(ValueType type) { static char const emptyString[] = ""; - initBasic(vtype); - switch (vtype) { + initBasic(type); + switch (type) { case nullValue: break; case intValue: @@ -2877,20 +2811,22 @@ Value::Value(double value) { Value::Value(const char* value) { initBasic(stringValue, true); - JSON_ASSERT_MESSAGE(value != NULL, "Null Value Passed to Value Constructor"); - value_.string_ = duplicateAndPrefixStringValue(value, static_cast<unsigned>(strlen(value))); + JSON_ASSERT_MESSAGE(value != nullptr, + "Null Value Passed to Value Constructor"); + value_.string_ = duplicateAndPrefixStringValue( + value, static_cast<unsigned>(strlen(value))); } -Value::Value(const char* beginValue, const char* endValue) { +Value::Value(const char* begin, const char* end) { initBasic(stringValue, true); value_.string_ = - duplicateAndPrefixStringValue(beginValue, static_cast<unsigned>(endValue - beginValue)); + duplicateAndPrefixStringValue(begin, static_cast<unsigned>(end - begin)); } -Value::Value(const JSONCPP_STRING& value) { +Value::Value(const String& value) { initBasic(stringValue, true); - value_.string_ = - duplicateAndPrefixStringValue(value.data(), static_cast<unsigned>(value.length())); + value_.string_ = duplicateAndPrefixStringValue( + value.data(), static_cast<unsigned>(value.length())); } Value::Value(const StaticString& value) { @@ -2898,114 +2834,44 @@ Value::Value(const StaticString& value) { value_.string_ = const_cast<char*>(value.c_str()); } -#ifdef JSON_USE_CPPTL -Value::Value(const CppTL::ConstString& value) { - initBasic(stringValue, true); - value_.string_ = duplicateAndPrefixStringValue(value, static_cast<unsigned>(value.length())); -} -#endif - Value::Value(bool value) { initBasic(booleanValue); value_.bool_ = value; } -Value::Value(Value const& other) - : type_(other.type_), allocated_(false) - , - comments_(0), start_(other.start_), limit_(other.limit_) -{ - switch (type_) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - value_ = other.value_; - break; - case stringValue: - if (other.value_.string_ && other.allocated_) { - unsigned len; - char const* str; - decodePrefixedString(other.allocated_, other.value_.string_, - &len, &str); - value_.string_ = duplicateAndPrefixStringValue(str, len); - allocated_ = true; - } else { - value_.string_ = other.value_.string_; - allocated_ = false; - } - break; - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(*other.value_.map_); - break; - default: - JSON_ASSERT_UNREACHABLE; - } - if (other.comments_) { - comments_ = new CommentInfo[numberOfCommentPlacement]; - for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { - const CommentInfo& otherComment = other.comments_[comment]; - if (otherComment.comment_) - comments_[comment].setComment( - otherComment.comment_, strlen(otherComment.comment_)); - } - } +Value::Value(const Value& other) { + dupPayload(other); + dupMeta(other); } -#if JSON_HAS_RVALUE_REFERENCES -// Move constructor Value::Value(Value&& other) { initBasic(nullValue); swap(other); } -#endif Value::~Value() { - switch (type_) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue: - if (allocated_) - releasePrefixedStringValue(value_.string_); - break; - case arrayValue: - case objectValue: - delete value_.map_; - break; - default: - JSON_ASSERT_UNREACHABLE; - } - - delete[] comments_; - + releasePayload(); value_.uint_ = 0; } -Value& Value::operator=(Value other) { - swap(other); +Value& Value::operator=(const Value& other) { + Value(other).swap(*this); + return *this; +} + +Value& Value::operator=(Value&& other) { + other.swap(*this); return *this; } void Value::swapPayload(Value& other) { - ValueType temp = type_; - type_ = other.type_; - other.type_ = temp; + std::swap(bits_, other.bits_); std::swap(value_, other.value_); - int temp2 = allocated_; - allocated_ = other.allocated_; - other.allocated_ = temp2 & 0x1; } void Value::copyPayload(const Value& other) { - type_ = other.type_; - value_ = other.value_; - allocated_ = other.allocated_; + releasePayload(); + dupPayload(other); } void Value::swap(Value& other) { @@ -3017,12 +2883,12 @@ void Value::swap(Value& other) { void Value::copy(const Value& other) { copyPayload(other); - comments_ = other.comments_; - start_ = other.start_; - limit_ = other.limit_; + dupMeta(other); } -ValueType Value::type() const { return type_; } +ValueType Value::type() const { + return static_cast<ValueType>(bits_.value_type_); +} int Value::compare(const Value& other) const { if (*this < other) @@ -3033,10 +2899,10 @@ int Value::compare(const Value& other) const { } bool Value::operator<(const Value& other) const { - int typeDelta = type_ - other.type_; + int typeDelta = type() - other.type(); if (typeDelta) - return typeDelta < 0 ? true : false; - switch (type_) { + return typeDelta < 0; + switch (type()) { case nullValue: return false; case intValue: @@ -3047,30 +2913,33 @@ bool Value::operator<(const Value& other) const { return value_.real_ < other.value_.real_; case booleanValue: return value_.bool_ < other.value_.bool_; - case stringValue: - { - if ((value_.string_ == 0) || (other.value_.string_ == 0)) { - if (other.value_.string_) return true; - else return false; + case stringValue: { + if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { + return other.value_.string_ != nullptr; } unsigned this_len; unsigned other_len; char const* this_str; char const* other_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); - decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, + &other_str); unsigned min_len = std::min<unsigned>(this_len, other_len); JSON_ASSERT(this_str && other_str); int comp = memcmp(this_str, other_str, min_len); - if (comp < 0) return true; - if (comp > 0) return false; + if (comp < 0) + return true; + if (comp > 0) + return false; return (this_len < other_len); } case arrayValue: case objectValue: { - int delta = int(value_.map_->size() - other.value_.map_->size()); - if (delta) - return delta < 0; + auto thisSize = value_.map_->size(); + auto otherSize = other.value_.map_->size(); + if (thisSize != otherSize) + return thisSize < otherSize; return (*value_.map_) < (*other.value_.map_); } default: @@ -3086,14 +2955,9 @@ bool Value::operator>=(const Value& other) const { return !(*this < other); } bool Value::operator>(const Value& other) const { return other < *this; } bool Value::operator==(const Value& other) const { - // if ( type_ != other.type_ ) - // GCC 2.95.3 says: - // attempt to take address of bit-field structure member `Json::Value::type_' - // Beats me, but a temp solves the problem. - int temp = other.type_; - if (type_ != temp) + if (type() != other.type()) return false; - switch (type_) { + switch (type()) { case nullValue: return true; case intValue: @@ -3104,18 +2968,20 @@ bool Value::operator==(const Value& other) const { return value_.real_ == other.value_.real_; case booleanValue: return value_.bool_ == other.value_.bool_; - case stringValue: - { - if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + case stringValue: { + if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { return (value_.string_ == other.value_.string_); } unsigned this_len; unsigned other_len; char const* this_str; char const* other_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); - decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); - if (this_len != other_len) return false; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, + &other_str); + if (this_len != other_len) + return false; JSON_ASSERT(this_str && other_str); int comp = memcmp(this_str, other_str, this_len); return comp == 0; @@ -3133,47 +2999,55 @@ bool Value::operator==(const Value& other) const { bool Value::operator!=(const Value& other) const { return !(*this == other); } const char* Value::asCString() const { - JSON_ASSERT_MESSAGE(type_ == stringValue, + JSON_ASSERT_MESSAGE(type() == stringValue, "in Json::Value::asCString(): requires stringValue"); - if (value_.string_ == 0) return 0; + if (value_.string_ == nullptr) + return nullptr; unsigned this_len; char const* this_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); return this_str; } #if JSONCPP_USING_SECURE_MEMORY unsigned Value::getCStringLength() const { - JSON_ASSERT_MESSAGE(type_ == stringValue, - "in Json::Value::asCString(): requires stringValue"); - if (value_.string_ == 0) return 0; + JSON_ASSERT_MESSAGE(type() == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) + return 0; unsigned this_len; char const* this_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); return this_len; } #endif -bool Value::getString(char const** str, char const** cend) const { - if (type_ != stringValue) return false; - if (value_.string_ == 0) return false; +bool Value::getString(char const** begin, char const** end) const { + if (type() != stringValue) + return false; + if (value_.string_ == nullptr) + return false; unsigned length; - decodePrefixedString(this->allocated_, this->value_.string_, &length, str); - *cend = *str + length; + decodePrefixedString(this->isAllocated(), this->value_.string_, &length, + begin); + *end = *begin + length; return true; } -JSONCPP_STRING Value::asString() const { - switch (type_) { +String Value::asString() const { + switch (type()) { case nullValue: return ""; - case stringValue: - { - if (value_.string_ == 0) return ""; + case stringValue: { + if (value_.string_ == nullptr) + return ""; unsigned this_len; char const* this_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); - return JSONCPP_STRING(this_str, this_len); + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + return String(this_str, this_len); } case booleanValue: return value_.bool_ ? "true" : "false"; @@ -3188,18 +3062,8 @@ JSONCPP_STRING Value::asString() const { } } -#ifdef JSON_USE_CPPTL -CppTL::ConstString Value::asConstString() const { - unsigned len; - char const* str; - decodePrefixedString(allocated_, value_.string_, - &len, &str); - return CppTL::ConstString(str, len); -} -#endif - Value::Int Value::asInt() const { - switch (type_) { + switch (type()) { case intValue: JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); return Int(value_.int_); @@ -3221,7 +3085,7 @@ Value::Int Value::asInt() const { } Value::UInt Value::asUInt() const { - switch (type_) { + switch (type()) { case intValue: JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); return UInt(value_.int_); @@ -3245,7 +3109,7 @@ Value::UInt Value::asUInt() const { #if defined(JSON_HAS_INT64) Value::Int64 Value::asInt64() const { - switch (type_) { + switch (type()) { case intValue: return Int64(value_.int_); case uintValue: @@ -3266,7 +3130,7 @@ Value::Int64 Value::asInt64() const { } Value::UInt64 Value::asUInt64() const { - switch (type_) { + switch (type()) { case intValue: JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); return UInt64(value_.int_); @@ -3304,7 +3168,7 @@ LargestUInt Value::asLargestUInt() const { } double Value::asDouble() const { - switch (type_) { + switch (type()) { case intValue: return static_cast<double>(value_.int_); case uintValue: @@ -3326,7 +3190,7 @@ double Value::asDouble() const { } float Value::asFloat() const { - switch (type_) { + switch (type()) { case intValue: return static_cast<float>(value_.int_); case uintValue: @@ -3341,7 +3205,7 @@ float Value::asFloat() const { case nullValue: return 0.0; case booleanValue: - return value_.bool_ ? 1.0f : 0.0f; + return value_.bool_ ? 1.0F : 0.0F; default: break; } @@ -3349,18 +3213,20 @@ float Value::asFloat() const { } bool Value::asBool() const { - switch (type_) { + switch (type()) { case booleanValue: return value_.bool_; case nullValue: return false; case intValue: - return value_.int_ ? true : false; + return value_.int_ != 0; case uintValue: - return value_.uint_ ? true : false; - case realValue: - // This is kind of strange. Not recommended. - return (value_.real_ != 0.0) ? true : false; + return value_.uint_ != 0; + case realValue: { + // According to JavaScript language zero or NaN is regarded as false + const auto value_classification = std::fpclassify(value_.real_); + return value_classification != FP_ZERO && value_classification != FP_NAN; + } default: break; } @@ -3371,30 +3237,30 @@ bool Value::isConvertibleTo(ValueType other) const { switch (other) { case nullValue: return (isNumeric() && asDouble() == 0.0) || - (type_ == booleanValue && value_.bool_ == false) || - (type_ == stringValue && asString().empty()) || - (type_ == arrayValue && value_.map_->size() == 0) || - (type_ == objectValue && value_.map_->size() == 0) || - type_ == nullValue; + (type() == booleanValue && !value_.bool_) || + (type() == stringValue && asString().empty()) || + (type() == arrayValue && value_.map_->empty()) || + (type() == objectValue && value_.map_->empty()) || + type() == nullValue; case intValue: return isInt() || - (type_ == realValue && InRange(value_.real_, minInt, maxInt)) || - type_ == booleanValue || type_ == nullValue; + (type() == realValue && InRange(value_.real_, minInt, maxInt)) || + type() == booleanValue || type() == nullValue; case uintValue: return isUInt() || - (type_ == realValue && InRange(value_.real_, 0, maxUInt)) || - type_ == booleanValue || type_ == nullValue; + (type() == realValue && InRange(value_.real_, 0, maxUInt)) || + type() == booleanValue || type() == nullValue; case realValue: - return isNumeric() || type_ == booleanValue || type_ == nullValue; + return isNumeric() || type() == booleanValue || type() == nullValue; case booleanValue: - return isNumeric() || type_ == booleanValue || type_ == nullValue; + return isNumeric() || type() == booleanValue || type() == nullValue; case stringValue: - return isNumeric() || type_ == booleanValue || type_ == stringValue || - type_ == nullValue; + return isNumeric() || type() == booleanValue || type() == stringValue || + type() == nullValue; case arrayValue: - return type_ == arrayValue || type_ == nullValue; + return type() == arrayValue || type() == nullValue; case objectValue: - return type_ == objectValue || type_ == nullValue; + return type() == objectValue || type() == nullValue; } JSON_ASSERT_UNREACHABLE; return false; @@ -3402,7 +3268,7 @@ bool Value::isConvertibleTo(ValueType other) const { /// Number of values in array or object ArrayIndex Value::size() const { - switch (type_) { + switch (type()) { case nullValue: case intValue: case uintValue: @@ -3426,20 +3292,19 @@ ArrayIndex Value::size() const { bool Value::empty() const { if (isNull() || isArray() || isObject()) - return size() == 0u; - else - return false; + return size() == 0U; + return false; } -Value::operator bool() const { return ! isNull(); } +Value::operator bool() const { return !isNull(); } void Value::clear() { - JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue || - type_ == objectValue, + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue || + type() == objectValue, "in Json::Value::clear(): requires complex value"); start_ = 0; limit_ = 0; - switch (type_) { + switch (type()) { case arrayValue: case objectValue: value_.map_->clear(); @@ -3450,15 +3315,15 @@ void Value::clear() { } void Value::resize(ArrayIndex newSize) { - JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue, + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, "in Json::Value::resize(): requires arrayValue"); - if (type_ == nullValue) + if (type() == nullValue) *this = Value(arrayValue); ArrayIndex oldSize = size(); if (newSize == 0) clear(); else if (newSize > oldSize) - (*this)[newSize - 1]; + this->operator[](newSize - 1); else { for (ArrayIndex index = newSize; index < oldSize; ++index) { value_.map_->erase(index); @@ -3469,12 +3334,12 @@ void Value::resize(ArrayIndex newSize) { Value& Value::operator[](ArrayIndex index) { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == arrayValue, + type() == nullValue || type() == arrayValue, "in Json::Value::operator[](ArrayIndex): requires arrayValue"); - if (type_ == nullValue) + if (type() == nullValue) *this = Value(arrayValue); CZString key(index); - ObjectValues::iterator it = value_.map_->lower_bound(key); + auto it = value_.map_->lower_bound(key); if (it != value_.map_->end() && (*it).first == key) return (*it).second; @@ -3492,9 +3357,9 @@ Value& Value::operator[](int index) { const Value& Value::operator[](ArrayIndex index) const { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == arrayValue, + type() == nullValue || type() == arrayValue, "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); - if (type_ == nullValue) + if (type() == nullValue) return nullSingleton(); CZString key(index); ObjectValues::const_iterator it = value_.map_->find(key); @@ -3510,26 +3375,85 @@ const Value& Value::operator[](int index) const { return (*this)[ArrayIndex(index)]; } -void Value::initBasic(ValueType vtype, bool allocated) { - type_ = vtype; - allocated_ = allocated; - comments_ = 0; +void Value::initBasic(ValueType type, bool allocated) { + setType(type); + setIsAllocated(allocated); + comments_ = Comments{}; start_ = 0; limit_ = 0; } +void Value::dupPayload(const Value& other) { + setType(other.type()); + setIsAllocated(false); + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if (other.value_.string_ && other.isAllocated()) { + unsigned len; + char const* str; + decodePrefixedString(other.isAllocated(), other.value_.string_, &len, + &str); + value_.string_ = duplicateAndPrefixStringValue(str, len); + setIsAllocated(true); + } else { + value_.string_ = other.value_.string_; + } + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(*other.value_.map_); + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +void Value::releasePayload() { + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if (isAllocated()) + releasePrefixedStringValue(value_.string_); + break; + case arrayValue: + case objectValue: + delete value_.map_; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +void Value::dupMeta(const Value& other) { + comments_ = other.comments_; + start_ = other.start_; + limit_ = other.limit_; +} + // Access an object value by name, create a null member if it does not exist. // @pre Type of '*this' is object or null. // @param key is null-terminated. Value& Value::resolveReference(const char* key) { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == objectValue, + type() == nullValue || type() == objectValue, "in Json::Value::resolveReference(): requires objectValue"); - if (type_ == nullValue) + if (type() == nullValue) *this = Value(objectValue); - CZString actualKey( - key, static_cast<unsigned>(strlen(key)), CZString::noDuplication); // NOTE! - ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + CZString actualKey(key, static_cast<unsigned>(strlen(key)), + CZString::noDuplication); // NOTE! + auto it = value_.map_->lower_bound(actualKey); if (it != value_.map_->end() && (*it).first == actualKey) return (*it).second; @@ -3540,16 +3464,15 @@ Value& Value::resolveReference(const char* key) { } // @param key is not null-terminated. -Value& Value::resolveReference(char const* key, char const* cend) -{ +Value& Value::resolveReference(char const* key, char const* end) { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == objectValue, + type() == nullValue || type() == objectValue, "in Json::Value::resolveReference(key, end): requires objectValue"); - if (type_ == nullValue) + if (type() == nullValue) *this = Value(objectValue); - CZString actualKey( - key, static_cast<unsigned>(cend-key), CZString::duplicateOnCopy); - ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + CZString actualKey(key, static_cast<unsigned>(end - key), + CZString::duplicateOnCopy); + auto it = value_.map_->lower_bound(actualKey); if (it != value_.map_->end() && (*it).first == actualKey) return (*it).second; @@ -3566,27 +3489,35 @@ Value Value::get(ArrayIndex index, const Value& defaultValue) const { bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } -Value const* Value::find(char const* key, char const* cend) const -{ - JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == objectValue, - "in Json::Value::find(key, end, found): requires objectValue or nullValue"); - if (type_ == nullValue) return NULL; - CZString actualKey(key, static_cast<unsigned>(cend-key), CZString::noDuplication); +Value const* Value::find(char const* begin, char const* end) const { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::find(begin, end): requires " + "objectValue or nullValue"); + if (type() == nullValue) + return nullptr; + CZString actualKey(begin, static_cast<unsigned>(end - begin), + CZString::noDuplication); ObjectValues::const_iterator it = value_.map_->find(actualKey); - if (it == value_.map_->end()) return NULL; + if (it == value_.map_->end()) + return nullptr; return &(*it).second; } -const Value& Value::operator[](const char* key) const -{ +Value* Value::demand(char const* begin, char const* end) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::demand(begin, end): requires " + "objectValue or nullValue"); + return &resolveReference(begin, end); +} +const Value& Value::operator[](const char* key) const { Value const* found = find(key, key + strlen(key)); - if (!found) return nullSingleton(); + if (!found) + return nullSingleton(); return *found; } -Value const& Value::operator[](JSONCPP_STRING const& key) const -{ +Value const& Value::operator[](const String& key) const { Value const* found = find(key.data(), key.data() + key.length()); - if (!found) return nullSingleton(); + if (!found) + return nullSingleton(); return *found; } @@ -3594,7 +3525,7 @@ Value& Value::operator[](const char* key) { return resolveReference(key, key + strlen(key)); } -Value& Value::operator[](const JSONCPP_STRING& key) { +Value& Value::operator[](const String& key) { return resolveReference(key.data(), key.data() + key.length()); } @@ -3602,178 +3533,140 @@ Value& Value::operator[](const StaticString& key) { return resolveReference(key.c_str()); } -#ifdef JSON_USE_CPPTL -Value& Value::operator[](const CppTL::ConstString& key) { - return resolveReference(key.c_str(), key.end_c_str()); +Value& Value::append(const Value& value) { return append(Value(value)); } + +Value& Value::append(Value&& value) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, + "in Json::Value::append: requires arrayValue"); + if (type() == nullValue) { + *this = Value(arrayValue); + } + return this->value_.map_->emplace(size(), std::move(value)).first->second; } -Value const& Value::operator[](CppTL::ConstString const& key) const -{ - Value const* found = find(key.c_str(), key.end_c_str()); - if (!found) return nullSingleton(); - return *found; + +bool Value::insert(ArrayIndex index, const Value& newValue) { + return insert(index, Value(newValue)); } -#endif -Value& Value::append(const Value& value) { return (*this)[size()] = value; } +bool Value::insert(ArrayIndex index, Value&& newValue) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, + "in Json::Value::insert: requires arrayValue"); + ArrayIndex length = size(); + if (index > length) { + return false; + } + for (ArrayIndex i = length; i > index; i--) { + (*this)[i] = std::move((*this)[i - 1]); + } + (*this)[index] = std::move(newValue); + return true; +} -#if JSON_HAS_RVALUE_REFERENCES - Value& Value::append(Value&& value) { return (*this)[size()] = std::move(value); } -#endif - -Value Value::get(char const* key, char const* cend, Value const& defaultValue) const -{ - Value const* found = find(key, cend); +Value Value::get(char const* begin, char const* end, + Value const& defaultValue) const { + Value const* found = find(begin, end); return !found ? defaultValue : *found; } -Value Value::get(char const* key, Value const& defaultValue) const -{ +Value Value::get(char const* key, Value const& defaultValue) const { return get(key, key + strlen(key), defaultValue); } -Value Value::get(JSONCPP_STRING const& key, Value const& defaultValue) const -{ +Value Value::get(String const& key, Value const& defaultValue) const { return get(key.data(), key.data() + key.length(), defaultValue); } - -bool Value::removeMember(const char* key, const char* cend, Value* removed) -{ - if (type_ != objectValue) { +bool Value::removeMember(const char* begin, const char* end, Value* removed) { + if (type() != objectValue) { return false; } - CZString actualKey(key, static_cast<unsigned>(cend-key), CZString::noDuplication); - ObjectValues::iterator it = value_.map_->find(actualKey); + CZString actualKey(begin, static_cast<unsigned>(end - begin), + CZString::noDuplication); + auto it = value_.map_->find(actualKey); if (it == value_.map_->end()) return false; - *removed = it->second; + if (removed) + *removed = std::move(it->second); value_.map_->erase(it); return true; } -bool Value::removeMember(const char* key, Value* removed) -{ +bool Value::removeMember(const char* key, Value* removed) { return removeMember(key, key + strlen(key), removed); } -bool Value::removeMember(JSONCPP_STRING const& key, Value* removed) -{ +bool Value::removeMember(String const& key, Value* removed) { return removeMember(key.data(), key.data() + key.length(), removed); } -void Value::removeMember(const char* key) -{ - JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue, +void Value::removeMember(const char* key) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, "in Json::Value::removeMember(): requires objectValue"); - if (type_ == nullValue) + if (type() == nullValue) return; CZString actualKey(key, unsigned(strlen(key)), CZString::noDuplication); value_.map_->erase(actualKey); } -void Value::removeMember(const JSONCPP_STRING& key) -{ - removeMember(key.c_str()); -} +void Value::removeMember(const String& key) { removeMember(key.c_str()); } bool Value::removeIndex(ArrayIndex index, Value* removed) { - if (type_ != arrayValue) { + if (type() != arrayValue) { return false; } CZString key(index); - ObjectValues::iterator it = value_.map_->find(key); + auto it = value_.map_->find(key); if (it == value_.map_->end()) { return false; } - *removed = it->second; + if (removed) + *removed = it->second; ArrayIndex oldSize = size(); // shift left all items left, into the place of the "removed" - for (ArrayIndex i = index; i < (oldSize - 1); ++i){ + for (ArrayIndex i = index; i < (oldSize - 1); ++i) { CZString keey(i); (*value_.map_)[keey] = (*this)[i + 1]; } // erase the last one ("leftover") CZString keyLast(oldSize - 1); - ObjectValues::iterator itLast = value_.map_->find(keyLast); + auto itLast = value_.map_->find(keyLast); value_.map_->erase(itLast); return true; } -#ifdef JSON_USE_CPPTL -Value Value::get(const CppTL::ConstString& key, - const Value& defaultValue) const { - return get(key.c_str(), key.end_c_str(), defaultValue); +bool Value::isMember(char const* begin, char const* end) const { + Value const* value = find(begin, end); + return nullptr != value; } -#endif - -bool Value::isMember(char const* key, char const* cend) const -{ - Value const* value = find(key, cend); - return NULL != value; -} -bool Value::isMember(char const* key) const -{ +bool Value::isMember(char const* key) const { return isMember(key, key + strlen(key)); } -bool Value::isMember(JSONCPP_STRING const& key) const -{ +bool Value::isMember(String const& key) const { return isMember(key.data(), key.data() + key.length()); } -#ifdef JSON_USE_CPPTL -bool Value::isMember(const CppTL::ConstString& key) const { - return isMember(key.c_str(), key.end_c_str()); -} -#endif - Value::Members Value::getMemberNames() const { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == objectValue, + type() == nullValue || type() == objectValue, "in Json::Value::getMemberNames(), value must be objectValue"); - if (type_ == nullValue) + if (type() == nullValue) return Value::Members(); Members members; members.reserve(value_.map_->size()); ObjectValues::const_iterator it = value_.map_->begin(); ObjectValues::const_iterator itEnd = value_.map_->end(); for (; it != itEnd; ++it) { - members.push_back(JSONCPP_STRING((*it).first.data(), - (*it).first.length())); + members.push_back(String((*it).first.data(), (*it).first.length())); } return members; } -// -//# ifdef JSON_USE_CPPTL -// EnumMemberNames -// Value::enumMemberNames() const -//{ -// if ( type_ == objectValue ) -// { -// return CppTL::Enum::any( CppTL::Enum::transform( -// CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ), -// MemberNamesTransform() ) ); -// } -// return EnumMemberNames(); -//} -// -// -// EnumValues -// Value::enumValues() const -//{ -// if ( type_ == objectValue || type_ == arrayValue ) -// return CppTL::Enum::anyValues( *(value_.map_), -// CppTL::Type<const Value &>() ); -// return EnumValues(); -//} -// -//# endif static bool IsIntegral(double d) { double integral_part; return modf(d, &integral_part) == 0.0; } -bool Value::isNull() const { return type_ == nullValue; } +bool Value::isNull() const { return type() == nullValue; } -bool Value::isBool() const { return type_ == booleanValue; } +bool Value::isBool() const { return type() == booleanValue; } bool Value::isInt() const { - switch (type_) { + switch (type()) { case intValue: #if defined(JSON_HAS_INT64) return value_.int_ >= minInt && value_.int_ <= maxInt; @@ -3792,7 +3685,7 @@ bool Value::isInt() const { } bool Value::isUInt() const { - switch (type_) { + switch (type()) { case intValue: #if defined(JSON_HAS_INT64) return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); @@ -3816,7 +3709,7 @@ bool Value::isUInt() const { bool Value::isInt64() const { #if defined(JSON_HAS_INT64) - switch (type_) { + switch (type()) { case intValue: return true; case uintValue: @@ -3836,7 +3729,7 @@ bool Value::isInt64() const { bool Value::isUInt64() const { #if defined(JSON_HAS_INT64) - switch (type_) { + switch (type()) { case intValue: return value_.int_ >= 0; case uintValue: @@ -3855,61 +3748,92 @@ bool Value::isUInt64() const { } bool Value::isIntegral() const { - switch (type_) { - case intValue: - case uintValue: - return true; - case realValue: + switch (type()) { + case intValue: + case uintValue: + return true; + case realValue: #if defined(JSON_HAS_INT64) - // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a - // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= double(minInt64) && value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); #else - return value_.real_ >= minInt && value_.real_ <= maxUInt && IsIntegral(value_.real_); + return value_.real_ >= minInt && value_.real_ <= maxUInt && + IsIntegral(value_.real_); #endif // JSON_HAS_INT64 - default: - break; + default: + break; } return false; } -bool Value::isDouble() const { return type_ == intValue || type_ == uintValue || type_ == realValue; } +bool Value::isDouble() const { + return type() == intValue || type() == uintValue || type() == realValue; +} bool Value::isNumeric() const { return isDouble(); } -bool Value::isString() const { return type_ == stringValue; } +bool Value::isString() const { return type() == stringValue; } -bool Value::isArray() const { return type_ == arrayValue; } +bool Value::isArray() const { return type() == arrayValue; } -bool Value::isObject() const { return type_ == objectValue; } +bool Value::isObject() const { return type() == objectValue; } -void Value::setComment(const char* comment, size_t len, CommentPlacement placement) { - if (!comments_) - comments_ = new CommentInfo[numberOfCommentPlacement]; - if ((len > 0) && (comment[len-1] == '\n')) { - // Always discard trailing newline, to aid indentation. - len -= 1; +Value::Comments::Comments(const Comments& that) + : ptr_{cloneUnique(that.ptr_)} {} + +Value::Comments::Comments(Comments&& that) : ptr_{std::move(that.ptr_)} {} + +Value::Comments& Value::Comments::operator=(const Comments& that) { + ptr_ = cloneUnique(that.ptr_); + return *this; +} + +Value::Comments& Value::Comments::operator=(Comments&& that) { + ptr_ = std::move(that.ptr_); + return *this; +} + +bool Value::Comments::has(CommentPlacement slot) const { + return ptr_ && !(*ptr_)[slot].empty(); +} + +String Value::Comments::get(CommentPlacement slot) const { + if (!ptr_) + return {}; + return (*ptr_)[slot]; +} + +void Value::Comments::set(CommentPlacement slot, String comment) { + if (!ptr_) { + ptr_ = std::unique_ptr<Array>(new Array()); + } + // check comments array boundry. + if (slot < CommentPlacement::numberOfCommentPlacement) { + (*ptr_)[slot] = std::move(comment); } - comments_[placement].setComment(comment, len); } -void Value::setComment(const char* comment, CommentPlacement placement) { - setComment(comment, strlen(comment), placement); -} - -void Value::setComment(const JSONCPP_STRING& comment, CommentPlacement placement) { - setComment(comment.c_str(), comment.length(), placement); +void Value::setComment(String comment, CommentPlacement placement) { + if (!comment.empty() && (comment.back() == '\n')) { + // Always discard trailing newline, to aid indentation. + comment.pop_back(); + } + JSON_ASSERT(!comment.empty()); + JSON_ASSERT_MESSAGE( + comment[0] == '\0' || comment[0] == '/', + "in Json::Value::setComment(): Comments must start with /"); + comments_.set(placement, std::move(comment)); } bool Value::hasComment(CommentPlacement placement) const { - return comments_ != 0 && comments_[placement].comment_ != 0; + return comments_.has(placement); } -JSONCPP_STRING Value::getComment(CommentPlacement placement) const { - if (hasComment(placement)) - return comments_[placement].comment_; - return ""; +String Value::getComment(CommentPlacement placement) const { + return comments_.get(placement); } void Value::setOffsetStart(ptrdiff_t start) { start_ = start; } @@ -3920,18 +3844,18 @@ ptrdiff_t Value::getOffsetStart() const { return start_; } ptrdiff_t Value::getOffsetLimit() const { return limit_; } -JSONCPP_STRING Value::toStyledString() const { +String Value::toStyledString() const { StreamWriterBuilder builder; - JSONCPP_STRING out = this->hasComment(commentBefore) ? "\n" : ""; + String out = this->hasComment(commentBefore) ? "\n" : ""; out += Json::writeString(builder, *this); - out += "\n"; + out += '\n'; return out; } Value::const_iterator Value::begin() const { - switch (type_) { + switch (type()) { case arrayValue: case objectValue: if (value_.map_) @@ -3940,11 +3864,11 @@ Value::const_iterator Value::begin() const { default: break; } - return const_iterator(); + return {}; } Value::const_iterator Value::end() const { - switch (type_) { + switch (type()) { case arrayValue: case objectValue: if (value_.map_) @@ -3953,11 +3877,11 @@ Value::const_iterator Value::end() const { default: break; } - return const_iterator(); + return {}; } Value::iterator Value::begin() { - switch (type_) { + switch (type()) { case arrayValue: case objectValue: if (value_.map_) @@ -3970,7 +3894,7 @@ Value::iterator Value::begin() { } Value::iterator Value::end() { - switch (type_) { + switch (type()) { case arrayValue: case objectValue: if (value_.map_) @@ -3985,25 +3909,20 @@ Value::iterator Value::end() { // class PathArgument // ////////////////////////////////////////////////////////////////// -PathArgument::PathArgument() : key_(), index_(), kind_(kindNone) {} +PathArgument::PathArgument() = default; PathArgument::PathArgument(ArrayIndex index) - : key_(), index_(index), kind_(kindIndex) {} + : index_(index), kind_(kindIndex) {} -PathArgument::PathArgument(const char* key) - : key_(key), index_(), kind_(kindKey) {} +PathArgument::PathArgument(const char* key) : key_(key), kind_(kindKey) {} -PathArgument::PathArgument(const JSONCPP_STRING& key) - : key_(key.c_str()), index_(), kind_(kindKey) {} +PathArgument::PathArgument(String key) : key_(std::move(key)), kind_(kindKey) {} // class Path // ////////////////////////////////////////////////////////////////// -Path::Path(const JSONCPP_STRING& path, - const PathArgument& a1, - const PathArgument& a2, - const PathArgument& a3, - const PathArgument& a4, +Path::Path(const String& path, const PathArgument& a1, const PathArgument& a2, + const PathArgument& a3, const PathArgument& a4, const PathArgument& a5) { InArgs in; in.reserve(5); @@ -4015,10 +3934,10 @@ Path::Path(const JSONCPP_STRING& path, makePath(path, in); } -void Path::makePath(const JSONCPP_STRING& path, const InArgs& in) { +void Path::makePath(const String& path, const InArgs& in) { const char* current = path.c_str(); const char* end = current + path.length(); - InArgs::const_iterator itInArg = in.begin(); + auto itInArg = in.begin(); while (current != end) { if (*current == '[') { ++current; @@ -4041,13 +3960,12 @@ void Path::makePath(const JSONCPP_STRING& path, const InArgs& in) { const char* beginName = current; while (current != end && !strchr("[.", *current)) ++current; - args_.push_back(JSONCPP_STRING(beginName, current)); + args_.push_back(String(beginName, current)); } } } -void Path::addPathInArg(const JSONCPP_STRING& /*path*/, - const InArgs& in, +void Path::addPathInArg(const String& /*path*/, const InArgs& in, InArgs::const_iterator& itInArg, PathArgument::Kind kind) { if (itInArg == in.end()) { @@ -4059,30 +3977,29 @@ void Path::addPathInArg(const JSONCPP_STRING& /*path*/, } } -void Path::invalidPath(const JSONCPP_STRING& /*path*/, int /*location*/) { +void Path::invalidPath(const String& /*path*/, int /*location*/) { // Error: invalid path. } const Value& Path::resolve(const Value& root) const { const Value* node = &root; - for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { - const PathArgument& arg = *it; + for (const auto& arg : args_) { if (arg.kind_ == PathArgument::kindIndex) { if (!node->isArray() || !node->isValidIndex(arg.index_)) { - // Error: unable to resolve path (array value expected at position... - return Value::null; + // Error: unable to resolve path (array value expected at position... ) + return Value::nullSingleton(); } node = &((*node)[arg.index_]); } else if (arg.kind_ == PathArgument::kindKey) { if (!node->isObject()) { // Error: unable to resolve path (object value expected at position...) - return Value::null; + return Value::nullSingleton(); } node = &((*node)[arg.key_]); if (node == &Value::nullSingleton()) { // Error: unable to resolve path (object has no member named '' at // position...) - return Value::null; + return Value::nullSingleton(); } } } @@ -4091,8 +4008,7 @@ const Value& Path::resolve(const Value& root) const { Value Path::resolve(const Value& root, const Value& defaultValue) const { const Value* node = &root; - for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { - const PathArgument& arg = *it; + for (const auto& arg : args_) { if (arg.kind_ == PathArgument::kindIndex) { if (!node->isArray() || !node->isValidIndex(arg.index_)) return defaultValue; @@ -4110,8 +4026,7 @@ Value Path::resolve(const Value& root, const Value& defaultValue) const { Value& Path::make(Value& root) const { Value* node = &root; - for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { - const PathArgument& arg = *it; + for (const auto& arg : args_) { if (arg.kind_ == PathArgument::kindIndex) { if (!node->isArray()) { // Error: node is not an array at position ... @@ -4148,71 +4063,81 @@ Value& Path::make(Value& root) const { // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE #if !defined(JSON_IS_AMALGAMATION) -#include <json/writer.h> #include "json_tool.h" +#include <json/writer.h> #endif // if !defined(JSON_IS_AMALGAMATION) +#include <algorithm> +#include <cassert> +#include <cctype> +#include <cstring> #include <iomanip> #include <memory> +#include <set> #include <sstream> #include <utility> -#include <set> -#include <cassert> -#include <cstring> + +#if __cplusplus >= 201103L +#include <cmath> #include <cstdio> -#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0 +#if !defined(isnan) +#define isnan std::isnan +#endif + +#if !defined(isfinite) +#define isfinite std::isfinite +#endif + +#else +#include <cmath> +#include <cstdio> + +#if defined(_MSC_VER) +#if !defined(isnan) +#include <float.h> +#define isnan _isnan +#endif + +#if !defined(isfinite) #include <float.h> #define isfinite _finite -#elif defined(__sun) && defined(__SVR4) //Solaris +#endif + +#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES + +#endif //_MSC_VER + +#if defined(__sun) && defined(__SVR4) // Solaris #if !defined(isfinite) #include <ieeefp.h> #define isfinite finite #endif -#elif defined(_AIX) -#if !defined(isfinite) -#include <math.h> -#define isfinite finite #endif -#elif defined(__hpux) + +#if defined(__hpux) #if !defined(isfinite) #if defined(__ia64) && !defined(finite) -#define isfinite(x) ((sizeof(x) == sizeof(float) ? \ - _Isfinitef(x) : _IsFinite(x))) -#else -#include <math.h> +#define isfinite(x) \ + ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _IsFinite(x))) +#endif +#endif +#endif + +#if !defined(isnan) +// IEEE standard states that NaN values will not compare to themselves +#define isnan(x) (x != x) +#endif + +#if !defined(__APPLE__) +#if !defined(isfinite) #define isfinite finite #endif #endif -#else -#include <cmath> -#if !(defined(__QNXNTO__)) // QNX already defines isfinite -#define isfinite std::isfinite -#endif #endif #if defined(_MSC_VER) -#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above -#define snprintf sprintf_s -#elif _MSC_VER >= 1900 // VC++ 14.0 and above -#define snprintf std::snprintf -#else -#define snprintf _snprintf -#endif -#elif defined(__ANDROID__) || defined(__QNXNTO__) -#define snprintf snprintf -#elif __cplusplus >= 201103L -#if !defined(__MINGW32__) && !defined(__CYGWIN__) -#define snprintf std::snprintf -#endif -#endif - -#if defined(__BORLANDC__) -#include <float.h> -#define isfinite _finite -#define snprintf _snprintf -#endif - -#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 // Disable warning about strdup being deprecated. #pragma warning(disable : 4996) #endif @@ -4220,12 +4145,12 @@ Value& Path::make(Value& root) const { namespace Json { #if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) -typedef std::unique_ptr<StreamWriter> StreamWriterPtr; +using StreamWriterPtr = std::unique_ptr<StreamWriter>; #else -typedef std::auto_ptr<StreamWriter> StreamWriterPtr; +using StreamWriterPtr = std::auto_ptr<StreamWriter>; #endif -JSONCPP_STRING valueToString(LargestInt value) { +String valueToString(LargestInt value) { UIntToStringBuffer buffer; char* current = buffer + sizeof(buffer); if (value == Value::minLargestInt) { @@ -4241,7 +4166,7 @@ JSONCPP_STRING valueToString(LargestInt value) { return current; } -JSONCPP_STRING valueToString(LargestUInt value) { +String valueToString(LargestUInt value) { UIntToStringBuffer buffer; char* current = buffer + sizeof(buffer); uintToString(value, current); @@ -4251,67 +4176,70 @@ JSONCPP_STRING valueToString(LargestUInt value) { #if defined(JSON_HAS_INT64) -JSONCPP_STRING valueToString(Int value) { - return valueToString(LargestInt(value)); -} +String valueToString(Int value) { return valueToString(LargestInt(value)); } -JSONCPP_STRING valueToString(UInt value) { - return valueToString(LargestUInt(value)); -} +String valueToString(UInt value) { return valueToString(LargestUInt(value)); } #endif // # if defined(JSON_HAS_INT64) namespace { -JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int precision) { - // Allocate a buffer that is more than large enough to store the 16 digits of - // precision requested below. - char buffer[36]; - int len = -1; - - char formatString[15]; - snprintf(formatString, sizeof(formatString), "%%.%ug", precision); - +String valueToString(double value, bool useSpecialFloats, + unsigned int precision, PrecisionType precisionType) { // Print into the buffer. We need not request the alternative representation // that always has a decimal point because JSON doesn't distinguish the // concepts of reals and integers. - if (isfinite(value)) { - len = snprintf(buffer, sizeof(buffer), formatString, value); - fixNumericLocale(buffer, buffer + len); - - // try to ensure we preserve the fact that this was given to us as a double on input - if (!strchr(buffer, '.') && !strchr(buffer, 'e')) { - strcat(buffer, ".0"); - } - - } else { - // IEEE standard states that NaN values will not compare to themselves - if (value != value) { - len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null"); - } else if (value < 0) { - len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "-Infinity" : "-1e+9999"); - } else { - len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "Infinity" : "1e+9999"); - } + if (!isfinite(value)) { + static const char* const reps[2][3] = {{"NaN", "-Infinity", "Infinity"}, + {"null", "-1e+9999", "1e+9999"}}; + return reps[useSpecialFloats ? 0 : 1] + [isnan(value) ? 0 : (value < 0) ? 1 : 2]; + } + + String buffer(size_t(36), '\0'); + while (true) { + int len = jsoncpp_snprintf( + &*buffer.begin(), buffer.size(), + (precisionType == PrecisionType::significantDigits) ? "%.*g" : "%.*f", + precision, value); + assert(len >= 0); + auto wouldPrint = static_cast<size_t>(len); + if (wouldPrint >= buffer.size()) { + buffer.resize(wouldPrint + 1); + continue; + } + buffer.resize(wouldPrint); + break; + } + + buffer.erase(fixNumericLocale(buffer.begin(), buffer.end()), buffer.end()); + + // strip the zero padding from the right + if (precisionType == PrecisionType::decimalPlaces) { + buffer.erase(fixZerosInTheEnd(buffer.begin(), buffer.end()), buffer.end()); + } + + // try to ensure we preserve the fact that this was given to us as a double on + // input + if (buffer.find('.') == buffer.npos && buffer.find('e') == buffer.npos) { + buffer += ".0"; } - assert(len >= 0); return buffer; } +} // namespace + +String valueToString(double value, unsigned int precision, + PrecisionType precisionType) { + return valueToString(value, false, precision, precisionType); } -JSONCPP_STRING valueToString(double value) { return valueToString(value, false, 17); } +String valueToString(bool value) { return value ? "true" : "false"; } -JSONCPP_STRING valueToString(bool value) { return value ? "true" : "false"; } - -static bool isAnyCharRequiredQuoting(char const* s, size_t n) { +static bool doesAnyCharRequireEscaping(char const* s, size_t n) { assert(s || !n); - char const* const end = s + n; - for (char const* cur = s; cur < end; ++cur) { - if (*cur == '\\' || *cur == '\"' || *cur < ' ' - || static_cast<unsigned char>(*cur) < 0x80) - return true; - } - return false; + return std::any_of(s, s + n, [](unsigned char c) { + return c == '\\' || c == '"' || c < 0x20 || c > 0x7F; + }); } static unsigned int utf8ToCodepoint(const char*& s, const char* e) { @@ -4326,8 +4254,8 @@ static unsigned int utf8ToCodepoint(const char*& s, const char* e) { if (e - s < 2) return REPLACEMENT_CHARACTER; - unsigned int calculated = ((firstByte & 0x1F) << 6) - | (static_cast<unsigned int>(s[1]) & 0x3F); + unsigned int calculated = + ((firstByte & 0x1F) << 6) | (static_cast<unsigned int>(s[1]) & 0x3F); s += 1; // oversized encoded characters are invalid return calculated < 0x80 ? REPLACEMENT_CHARACTER : calculated; @@ -4337,9 +4265,9 @@ static unsigned int utf8ToCodepoint(const char*& s, const char* e) { if (e - s < 3) return REPLACEMENT_CHARACTER; - unsigned int calculated = ((firstByte & 0x0F) << 12) - | ((static_cast<unsigned int>(s[1]) & 0x3F) << 6) - | (static_cast<unsigned int>(s[2]) & 0x3F); + unsigned int calculated = ((firstByte & 0x0F) << 12) | + ((static_cast<unsigned int>(s[1]) & 0x3F) << 6) | + (static_cast<unsigned int>(s[2]) & 0x3F); s += 2; // surrogates aren't valid codepoints itself // shouldn't be UTF-8 encoded @@ -4353,10 +4281,10 @@ static unsigned int utf8ToCodepoint(const char*& s, const char* e) { if (e - s < 4) return REPLACEMENT_CHARACTER; - unsigned int calculated = ((firstByte & 0x07) << 24) - | ((static_cast<unsigned int>(s[1]) & 0x3F) << 12) - | ((static_cast<unsigned int>(s[2]) & 0x3F) << 6) - | (static_cast<unsigned int>(s[3]) & 0x3F); + unsigned int calculated = ((firstByte & 0x07) << 18) | + ((static_cast<unsigned int>(s[1]) & 0x3F) << 12) | + ((static_cast<unsigned int>(s[2]) & 0x3F) << 6) | + (static_cast<unsigned int>(s[3]) & 0x3F); s += 3; // oversized encoded characters are invalid return calculated < 0x10000 ? REPLACEMENT_CHARACTER : calculated; @@ -4365,28 +4293,27 @@ static unsigned int utf8ToCodepoint(const char*& s, const char* e) { return REPLACEMENT_CHARACTER; } -static const char hex2[] = - "000102030405060708090a0b0c0d0e0f" - "101112131415161718191a1b1c1d1e1f" - "202122232425262728292a2b2c2d2e2f" - "303132333435363738393a3b3c3d3e3f" - "404142434445464748494a4b4c4d4e4f" - "505152535455565758595a5b5c5d5e5f" - "606162636465666768696a6b6c6d6e6f" - "707172737475767778797a7b7c7d7e7f" - "808182838485868788898a8b8c8d8e8f" - "909192939495969798999a9b9c9d9e9f" - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" - "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; +static const char hex2[] = "000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f" + "606162636465666768696a6b6c6d6e6f" + "707172737475767778797a7b7c7d7e7f" + "808182838485868788898a8b8c8d8e8f" + "909192939495969798999a9b9c9d9e9f" + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; -static JSONCPP_STRING toHex16Bit(unsigned int x) { +static String toHex16Bit(unsigned int x) { const unsigned int hi = (x >> 8) & 0xff; const unsigned int lo = x & 0xff; - JSONCPP_STRING result(4, ' '); + String result(4, ' '); result[0] = hex2[2 * hi]; result[1] = hex2[2 * hi + 1]; result[2] = hex2[2 * lo]; @@ -4394,18 +4321,26 @@ static JSONCPP_STRING toHex16Bit(unsigned int x) { return result; } -static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length) { - if (value == NULL) +static void appendRaw(String& result, unsigned ch) { + result += static_cast<char>(ch); +} + +static void appendHex(String& result, unsigned ch) { + result.append("\\u").append(toHex16Bit(ch)); +} + +static String valueToQuotedStringN(const char* value, unsigned length, + bool emitUTF8 = false) { + if (value == nullptr) return ""; - if (!isAnyCharRequiredQuoting(value, length)) - return JSONCPP_STRING("\"") + value + "\""; + if (!doesAnyCharRequireEscaping(value, length)) + return String("\"") + value + "\""; // We have to walk value and escape any special characters. - // Appending to JSONCPP_STRING is not efficient, but this should be rare. + // Appending to String is not efficient, but this should be rare. // (Note: forward slashes are *not* rare, but I am not escaping them.) - JSONCPP_STRING::size_type maxsize = - length * 2 + 3; // allescaped+quotes+NULL - JSONCPP_STRING result; + String::size_type maxsize = length * 2 + 3; // allescaped+quotes+NULL + String result; result.reserve(maxsize); // to avoid lots of mallocs result += "\""; char const* end = value + length; @@ -4441,45 +4376,50 @@ static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length) { // Should add a flag to allow this compatibility mode and prevent this // sequence from occurring. default: { - unsigned int cp = utf8ToCodepoint(c, end); - // don't escape non-control characters - // (short escape sequence are applied above) - if (cp < 0x80 && cp >= 0x20) - result += static_cast<char>(cp); - else if (cp < 0x10000) { // codepoint is in Basic Multilingual Plane - result += "\\u"; - result += toHex16Bit(cp); + if (emitUTF8) { + unsigned codepoint = static_cast<unsigned char>(*c); + if (codepoint < 0x20) { + appendHex(result, codepoint); + } else { + appendRaw(result, codepoint); } - else { // codepoint is not in Basic Multilingual Plane - // convert to surrogate pair first - cp -= 0x10000; - result += "\\u"; - result += toHex16Bit((cp >> 10) + 0xD800); - result += "\\u"; - result += toHex16Bit((cp & 0x3FF) + 0xDC00); + } else { + unsigned codepoint = utf8ToCodepoint(c, end); // modifies `c` + if (codepoint < 0x20) { + appendHex(result, codepoint); + } else if (codepoint < 0x80) { + appendRaw(result, codepoint); + } else if (codepoint < 0x10000) { + // Basic Multilingual Plane + appendHex(result, codepoint); + } else { + // Extended Unicode. Encode 20 bits as a surrogate pair. + codepoint -= 0x10000; + appendHex(result, 0xd800 + ((codepoint >> 10) & 0x3ff)); + appendHex(result, 0xdc00 + (codepoint & 0x3ff)); } } - break; + } break; } } result += "\""; return result; } -JSONCPP_STRING valueToQuotedString(const char* value) { +String valueToQuotedString(const char* value) { return valueToQuotedStringN(value, static_cast<unsigned int>(strlen(value))); } // Class Writer // ////////////////////////////////////////////////////////////////// -Writer::~Writer() {} +Writer::~Writer() = default; // Class FastWriter // ////////////////////////////////////////////////////////////////// FastWriter::FastWriter() - : yamlCompatibilityEnabled_(false), dropNullPlaceholders_(false), - omitEndingLineFeed_(false) {} + + = default; void FastWriter::enableYAMLCompatibility() { yamlCompatibilityEnabled_ = true; } @@ -4487,11 +4427,11 @@ void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; } void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; } -JSONCPP_STRING FastWriter::write(const Value& root) { +String FastWriter::write(const Value& root) { document_.clear(); writeValue(root); if (!omitEndingLineFeed_) - document_ += "\n"; + document_ += '\n'; return document_; } @@ -4510,13 +4450,13 @@ void FastWriter::writeValue(const Value& value) { case realValue: document_ += valueToString(value.asDouble()); break; - case stringValue: - { + case stringValue: { // Is NULL possible for value.string_? No. char const* str; char const* end; bool ok = value.getString(&str, &end); - if (ok) document_ += valueToQuotedStringN(str, static_cast<unsigned>(end-str)); + if (ok) + document_ += valueToQuotedStringN(str, static_cast<unsigned>(end - str)); break; } case booleanValue: @@ -4535,12 +4475,12 @@ void FastWriter::writeValue(const Value& value) { case objectValue: { Value::Members members(value.getMemberNames()); document_ += '{'; - for (Value::Members::iterator it = members.begin(); it != members.end(); - ++it) { - const JSONCPP_STRING& name = *it; + for (auto it = members.begin(); it != members.end(); ++it) { + const String& name = *it; if (it != members.begin()) document_ += ','; - document_ += valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length())); + document_ += valueToQuotedStringN(name.data(), + static_cast<unsigned>(name.length())); document_ += yamlCompatibilityEnabled_ ? ": " : ":"; writeValue(value[name]); } @@ -4552,17 +4492,16 @@ void FastWriter::writeValue(const Value& value) { // Class StyledWriter // ////////////////////////////////////////////////////////////////// -StyledWriter::StyledWriter() - : rightMargin_(74), indentSize_(3), addChildValues_() {} +StyledWriter::StyledWriter() = default; -JSONCPP_STRING StyledWriter::write(const Value& root) { +String StyledWriter::write(const Value& root) { document_.clear(); addChildValues_ = false; indentString_.clear(); writeCommentBeforeValue(root); writeValue(root); writeCommentAfterValueOnSameLine(root); - document_ += "\n"; + document_ += '\n'; return document_; } @@ -4580,14 +4519,15 @@ void StyledWriter::writeValue(const Value& value) { case realValue: pushValue(valueToString(value.asDouble())); break; - case stringValue: - { + case stringValue: { // Is NULL possible for value.string_? No. char const* str; char const* end; bool ok = value.getString(&str, &end); - if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str))); - else pushValue(""); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end - str))); + else + pushValue(""); break; } case booleanValue: @@ -4603,9 +4543,9 @@ void StyledWriter::writeValue(const Value& value) { else { writeWithIndent("{"); indent(); - Value::Members::iterator it = members.begin(); + auto it = members.begin(); for (;;) { - const JSONCPP_STRING& name = *it; + const String& name = *it; const Value& childValue = value[name]; writeCommentBeforeValue(childValue); writeWithIndent(valueToQuotedString(name.c_str())); @@ -4675,7 +4615,7 @@ bool StyledWriter::isMultilineArray(const Value& value) { for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { const Value& childValue = value[index]; isMultiLine = ((childValue.isArray() || childValue.isObject()) && - childValue.size() > 0); + !childValue.empty()); } if (!isMultiLine) // check if line length > max line length { @@ -4695,7 +4635,7 @@ bool StyledWriter::isMultilineArray(const Value& value) { return isMultiLine; } -void StyledWriter::pushValue(const JSONCPP_STRING& value) { +void StyledWriter::pushValue(const String& value) { if (addChildValues_) childValues_.push_back(value); else @@ -4713,12 +4653,12 @@ void StyledWriter::writeIndent() { document_ += indentString_; } -void StyledWriter::writeWithIndent(const JSONCPP_STRING& value) { +void StyledWriter::writeWithIndent(const String& value) { writeIndent(); document_ += value; } -void StyledWriter::indent() { indentString_ += JSONCPP_STRING(indentSize_, ' '); } +void StyledWriter::indent() { indentString_ += String(indentSize_, ' '); } void StyledWriter::unindent() { assert(indentString_.size() >= indentSize_); @@ -4729,20 +4669,19 @@ void StyledWriter::writeCommentBeforeValue(const Value& root) { if (!root.hasComment(commentBefore)) return; - document_ += "\n"; + document_ += '\n'; writeIndent(); - const JSONCPP_STRING& comment = root.getComment(commentBefore); - JSONCPP_STRING::const_iterator iter = comment.begin(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); while (iter != comment.end()) { document_ += *iter; - if (*iter == '\n' && - ((iter+1) != comment.end() && *(iter + 1) == '/')) + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) writeIndent(); ++iter; } // Comments are stripped of trailing newlines, so add one here - document_ += "\n"; + document_ += '\n'; } void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { @@ -4750,9 +4689,9 @@ void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { document_ += " " + root.getComment(commentAfterOnSameLine); if (root.hasComment(commentAfter)) { - document_ += "\n"; + document_ += '\n'; document_ += root.getComment(commentAfter); - document_ += "\n"; + document_ += '\n'; } } @@ -4765,22 +4704,23 @@ bool StyledWriter::hasCommentForValue(const Value& value) { // Class StyledStreamWriter // ////////////////////////////////////////////////////////////////// -StyledStreamWriter::StyledStreamWriter(JSONCPP_STRING indentation) - : document_(NULL), rightMargin_(74), indentation_(indentation), - addChildValues_() {} +StyledStreamWriter::StyledStreamWriter(String indentation) + : document_(nullptr), indentation_(std::move(indentation)), + addChildValues_(), indented_(false) {} -void StyledStreamWriter::write(JSONCPP_OSTREAM& out, const Value& root) { +void StyledStreamWriter::write(OStream& out, const Value& root) { document_ = &out; addChildValues_ = false; indentString_.clear(); indented_ = true; writeCommentBeforeValue(root); - if (!indented_) writeIndent(); + if (!indented_) + writeIndent(); indented_ = true; writeValue(root); writeCommentAfterValueOnSameLine(root); *document_ << "\n"; - document_ = NULL; // Forget the stream, for safety. + document_ = nullptr; // Forget the stream, for safety. } void StyledStreamWriter::writeValue(const Value& value) { @@ -4797,14 +4737,15 @@ void StyledStreamWriter::writeValue(const Value& value) { case realValue: pushValue(valueToString(value.asDouble())); break; - case stringValue: - { + case stringValue: { // Is NULL possible for value.string_? No. char const* str; char const* end; bool ok = value.getString(&str, &end); - if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str))); - else pushValue(""); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end - str))); + else + pushValue(""); break; } case booleanValue: @@ -4820,9 +4761,9 @@ void StyledStreamWriter::writeValue(const Value& value) { else { writeWithIndent("{"); indent(); - Value::Members::iterator it = members.begin(); + auto it = members.begin(); for (;;) { - const JSONCPP_STRING& name = *it; + const String& name = *it; const Value& childValue = value[name]; writeCommentBeforeValue(childValue); writeWithIndent(valueToQuotedString(name.c_str())); @@ -4859,7 +4800,8 @@ void StyledStreamWriter::writeArrayValue(const Value& value) { if (hasChildValue) writeWithIndent(childValues_[index]); else { - if (!indented_) writeIndent(); + if (!indented_) + writeIndent(); indented_ = true; writeValue(childValue); indented_ = false; @@ -4894,7 +4836,7 @@ bool StyledStreamWriter::isMultilineArray(const Value& value) { for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { const Value& childValue = value[index]; isMultiLine = ((childValue.isArray() || childValue.isObject()) && - childValue.size() > 0); + !childValue.empty()); } if (!isMultiLine) // check if line length > max line length { @@ -4914,7 +4856,7 @@ bool StyledStreamWriter::isMultilineArray(const Value& value) { return isMultiLine; } -void StyledStreamWriter::pushValue(const JSONCPP_STRING& value) { +void StyledStreamWriter::pushValue(const String& value) { if (addChildValues_) childValues_.push_back(value); else @@ -4929,8 +4871,9 @@ void StyledStreamWriter::writeIndent() { *document_ << '\n' << indentString_; } -void StyledStreamWriter::writeWithIndent(const JSONCPP_STRING& value) { - if (!indented_) writeIndent(); +void StyledStreamWriter::writeWithIndent(const String& value) { + if (!indented_) + writeIndent(); *document_ << value; indented_ = false; } @@ -4946,13 +4889,13 @@ void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { if (!root.hasComment(commentBefore)) return; - if (!indented_) writeIndent(); - const JSONCPP_STRING& comment = root.getComment(commentBefore); - JSONCPP_STRING::const_iterator iter = comment.begin(); + if (!indented_) + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); while (iter != comment.end()) { *document_ << *iter; - if (*iter == '\n' && - ((iter+1) != comment.end() && *(iter + 1) == '/')) + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) // writeIndent(); // would include newline *document_ << indentString_; ++iter; @@ -4984,84 +4927,73 @@ bool StyledStreamWriter::hasCommentForValue(const Value& value) { struct CommentStyle { /// Decide whether to write comments. enum Enum { - None, ///< Drop all comments. - Most, ///< Recover odd behavior of previous versions (not implemented yet). - All ///< Keep all comments. + None, ///< Drop all comments. + Most, ///< Recover odd behavior of previous versions (not implemented yet). + All ///< Keep all comments. }; }; -struct BuiltStyledStreamWriter : public StreamWriter -{ - BuiltStyledStreamWriter( - JSONCPP_STRING const& indentation, - CommentStyle::Enum cs, - JSONCPP_STRING const& colonSymbol, - JSONCPP_STRING const& nullSymbol, - JSONCPP_STRING const& endingLineFeedSymbol, - bool useSpecialFloats, - unsigned int precision); - int write(Value const& root, JSONCPP_OSTREAM* sout) JSONCPP_OVERRIDE; +struct BuiltStyledStreamWriter : public StreamWriter { + BuiltStyledStreamWriter(String indentation, CommentStyle::Enum cs, + String colonSymbol, String nullSymbol, + String endingLineFeedSymbol, bool useSpecialFloats, + bool emitUTF8, unsigned int precision, + PrecisionType precisionType); + int write(Value const& root, OStream* sout) override; + private: void writeValue(Value const& value); void writeArrayValue(Value const& value); bool isMultilineArray(Value const& value); - void pushValue(JSONCPP_STRING const& value); + void pushValue(String const& value); void writeIndent(); - void writeWithIndent(JSONCPP_STRING const& value); + void writeWithIndent(String const& value); void indent(); void unindent(); void writeCommentBeforeValue(Value const& root); void writeCommentAfterValueOnSameLine(Value const& root); static bool hasCommentForValue(const Value& value); - typedef std::vector<JSONCPP_STRING> ChildValues; + using ChildValues = std::vector<String>; ChildValues childValues_; - JSONCPP_STRING indentString_; + String indentString_; unsigned int rightMargin_; - JSONCPP_STRING indentation_; + String indentation_; CommentStyle::Enum cs_; - JSONCPP_STRING colonSymbol_; - JSONCPP_STRING nullSymbol_; - JSONCPP_STRING endingLineFeedSymbol_; + String colonSymbol_; + String nullSymbol_; + String endingLineFeedSymbol_; bool addChildValues_ : 1; bool indented_ : 1; bool useSpecialFloats_ : 1; + bool emitUTF8_ : 1; unsigned int precision_; + PrecisionType precisionType_; }; BuiltStyledStreamWriter::BuiltStyledStreamWriter( - JSONCPP_STRING const& indentation, - CommentStyle::Enum cs, - JSONCPP_STRING const& colonSymbol, - JSONCPP_STRING const& nullSymbol, - JSONCPP_STRING const& endingLineFeedSymbol, - bool useSpecialFloats, - unsigned int precision) - : rightMargin_(74) - , indentation_(indentation) - , cs_(cs) - , colonSymbol_(colonSymbol) - , nullSymbol_(nullSymbol) - , endingLineFeedSymbol_(endingLineFeedSymbol) - , addChildValues_(false) - , indented_(false) - , useSpecialFloats_(useSpecialFloats) - , precision_(precision) -{ -} -int BuiltStyledStreamWriter::write(Value const& root, JSONCPP_OSTREAM* sout) -{ + String indentation, CommentStyle::Enum cs, String colonSymbol, + String nullSymbol, String endingLineFeedSymbol, bool useSpecialFloats, + bool emitUTF8, unsigned int precision, PrecisionType precisionType) + : rightMargin_(74), indentation_(std::move(indentation)), cs_(cs), + colonSymbol_(std::move(colonSymbol)), nullSymbol_(std::move(nullSymbol)), + endingLineFeedSymbol_(std::move(endingLineFeedSymbol)), + addChildValues_(false), indented_(false), + useSpecialFloats_(useSpecialFloats), emitUTF8_(emitUTF8), + precision_(precision), precisionType_(precisionType) {} +int BuiltStyledStreamWriter::write(Value const& root, OStream* sout) { sout_ = sout; addChildValues_ = false; indented_ = true; indentString_.clear(); writeCommentBeforeValue(root); - if (!indented_) writeIndent(); + if (!indented_) + writeIndent(); indented_ = true; writeValue(root); writeCommentAfterValueOnSameLine(root); *sout_ << endingLineFeedSymbol_; - sout_ = NULL; + sout_ = nullptr; return 0; } void BuiltStyledStreamWriter::writeValue(Value const& value) { @@ -5076,16 +5008,19 @@ void BuiltStyledStreamWriter::writeValue(Value const& value) { pushValue(valueToString(value.asLargestUInt())); break; case realValue: - pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_)); + pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_, + precisionType_)); break; - case stringValue: - { + case stringValue: { // Is NULL is possible for value.string_? No. char const* str; char const* end; bool ok = value.getString(&str, &end); - if (ok) pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end-str))); - else pushValue(""); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast<unsigned>(end - str), + emitUTF8_)); + else + pushValue(""); break; } case booleanValue: @@ -5101,12 +5036,13 @@ void BuiltStyledStreamWriter::writeValue(Value const& value) { else { writeWithIndent("{"); indent(); - Value::Members::iterator it = members.begin(); + auto it = members.begin(); for (;;) { - JSONCPP_STRING const& name = *it; + String const& name = *it; Value const& childValue = value[name]; writeCommentBeforeValue(childValue); - writeWithIndent(valueToQuotedStringN(name.data(), static_cast<unsigned>(name.length()))); + writeWithIndent(valueToQuotedStringN( + name.data(), static_cast<unsigned>(name.length()), emitUTF8_)); *sout_ << colonSymbol_; writeValue(childValue); if (++it == members.end()) { @@ -5140,7 +5076,8 @@ void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { if (hasChildValue) writeWithIndent(childValues_[index]); else { - if (!indented_) writeIndent(); + if (!indented_) + writeIndent(); indented_ = true; writeValue(childValue); indented_ = false; @@ -5158,13 +5095,15 @@ void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { { assert(childValues_.size() == size); *sout_ << "["; - if (!indentation_.empty()) *sout_ << " "; + if (!indentation_.empty()) + *sout_ << " "; for (unsigned index = 0; index < size; ++index) { if (index > 0) *sout_ << ((!indentation_.empty()) ? ", " : ","); *sout_ << childValues_[index]; } - if (!indentation_.empty()) *sout_ << " "; + if (!indentation_.empty()) + *sout_ << " "; *sout_ << "]"; } } @@ -5177,7 +5116,7 @@ bool BuiltStyledStreamWriter::isMultilineArray(Value const& value) { for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { Value const& childValue = value[index]; isMultiLine = ((childValue.isArray() || childValue.isObject()) && - childValue.size() > 0); + !childValue.empty()); } if (!isMultiLine) // check if line length > max line length { @@ -5197,7 +5136,7 @@ bool BuiltStyledStreamWriter::isMultilineArray(Value const& value) { return isMultiLine; } -void BuiltStyledStreamWriter::pushValue(JSONCPP_STRING const& value) { +void BuiltStyledStreamWriter::pushValue(String const& value) { if (addChildValues_) childValues_.push_back(value); else @@ -5216,8 +5155,9 @@ void BuiltStyledStreamWriter::writeIndent() { } } -void BuiltStyledStreamWriter::writeWithIndent(JSONCPP_STRING const& value) { - if (!indented_) writeIndent(); +void BuiltStyledStreamWriter::writeWithIndent(String const& value) { + if (!indented_) + writeIndent(); *sout_ << value; indented_ = false; } @@ -5230,17 +5170,18 @@ void BuiltStyledStreamWriter::unindent() { } void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { - if (cs_ == CommentStyle::None) return; + if (cs_ == CommentStyle::None) + return; if (!root.hasComment(commentBefore)) return; - if (!indented_) writeIndent(); - const JSONCPP_STRING& comment = root.getComment(commentBefore); - JSONCPP_STRING::const_iterator iter = comment.begin(); + if (!indented_) + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); while (iter != comment.end()) { *sout_ << *iter; - if (*iter == '\n' && - ((iter+1) != comment.end() && *(iter + 1) == '/')) + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) // writeIndent(); // would write extra newline *sout_ << indentString_; ++iter; @@ -5248,8 +5189,10 @@ void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { indented_ = false; } -void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) { - if (cs_ == CommentStyle::None) return; +void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine( + Value const& root) { + if (cs_ == CommentStyle::None) + return; if (root.hasComment(commentAfterOnSameLine)) *sout_ << " " + root.getComment(commentAfterOnSameLine); @@ -5269,28 +5212,19 @@ bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { /////////////// // StreamWriter -StreamWriter::StreamWriter() - : sout_(NULL) -{ -} -StreamWriter::~StreamWriter() -{ -} -StreamWriter::Factory::~Factory() -{} -StreamWriterBuilder::StreamWriterBuilder() -{ - setDefaults(&settings_); -} -StreamWriterBuilder::~StreamWriterBuilder() -{} -StreamWriter* StreamWriterBuilder::newStreamWriter() const -{ - JSONCPP_STRING indentation = settings_["indentation"].asString(); - JSONCPP_STRING cs_str = settings_["commentStyle"].asString(); - bool eyc = settings_["enableYAMLCompatibility"].asBool(); - bool dnp = settings_["dropNullPlaceholders"].asBool(); - bool usf = settings_["useSpecialFloats"].asBool(); +StreamWriter::StreamWriter() : sout_(nullptr) {} +StreamWriter::~StreamWriter() = default; +StreamWriter::Factory::~Factory() = default; +StreamWriterBuilder::StreamWriterBuilder() { setDefaults(&settings_); } +StreamWriterBuilder::~StreamWriterBuilder() = default; +StreamWriter* StreamWriterBuilder::newStreamWriter() const { + const String indentation = settings_["indentation"].asString(); + const String cs_str = settings_["commentStyle"].asString(); + const String pt_str = settings_["precisionType"].asString(); + const bool eyc = settings_["enableYAMLCompatibility"].asBool(); + const bool dnp = settings_["dropNullPlaceholders"].asBool(); + const bool usf = settings_["useSpecialFloats"].asBool(); + const bool emitUTF8 = settings_["emitUTF8"].asBool(); unsigned int pre = settings_["precision"].asUInt(); CommentStyle::Enum cs = CommentStyle::All; if (cs_str == "All") { @@ -5300,74 +5234,80 @@ StreamWriter* StreamWriterBuilder::newStreamWriter() const } else { throwRuntimeError("commentStyle must be 'All' or 'None'"); } - JSONCPP_STRING colonSymbol = " : "; + PrecisionType precisionType(significantDigits); + if (pt_str == "significant") { + precisionType = PrecisionType::significantDigits; + } else if (pt_str == "decimal") { + precisionType = PrecisionType::decimalPlaces; + } else { + throwRuntimeError("precisionType must be 'significant' or 'decimal'"); + } + String colonSymbol = " : "; if (eyc) { colonSymbol = ": "; } else if (indentation.empty()) { colonSymbol = ":"; } - JSONCPP_STRING nullSymbol = "null"; + String nullSymbol = "null"; if (dnp) { nullSymbol.clear(); } - if (pre > 17) pre = 17; - JSONCPP_STRING endingLineFeedSymbol; - return new BuiltStyledStreamWriter( - indentation, cs, - colonSymbol, nullSymbol, endingLineFeedSymbol, usf, pre); + if (pre > 17) + pre = 17; + String endingLineFeedSymbol; + return new BuiltStyledStreamWriter(indentation, cs, colonSymbol, nullSymbol, + endingLineFeedSymbol, usf, emitUTF8, pre, + precisionType); } -static void getValidWriterKeys(std::set<JSONCPP_STRING>* valid_keys) -{ - valid_keys->clear(); - valid_keys->insert("indentation"); - valid_keys->insert("commentStyle"); - valid_keys->insert("enableYAMLCompatibility"); - valid_keys->insert("dropNullPlaceholders"); - valid_keys->insert("useSpecialFloats"); - valid_keys->insert("precision"); -} -bool StreamWriterBuilder::validate(Json::Value* invalid) const -{ - Json::Value my_invalid; - if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL - Json::Value& inv = *invalid; - std::set<JSONCPP_STRING> valid_keys; - getValidWriterKeys(&valid_keys); - Value::Members keys = settings_.getMemberNames(); - size_t n = keys.size(); - for (size_t i = 0; i < n; ++i) { - JSONCPP_STRING const& key = keys[i]; - if (valid_keys.find(key) == valid_keys.end()) { - inv[key] = settings_[key]; - } + +bool StreamWriterBuilder::validate(Json::Value* invalid) const { + static const auto& valid_keys = *new std::set<String>{ + "indentation", + "commentStyle", + "enableYAMLCompatibility", + "dropNullPlaceholders", + "useSpecialFloats", + "emitUTF8", + "precision", + "precisionType", + }; + for (auto si = settings_.begin(); si != settings_.end(); ++si) { + auto key = si.name(); + if (valid_keys.count(key)) + continue; + if (invalid) + (*invalid)[std::move(key)] = *si; + else + return false; } - return 0u == inv.size(); + return invalid ? invalid->empty() : true; } -Value& StreamWriterBuilder::operator[](JSONCPP_STRING key) -{ + +Value& StreamWriterBuilder::operator[](const String& key) { return settings_[key]; } // static -void StreamWriterBuilder::setDefaults(Json::Value* settings) -{ +void StreamWriterBuilder::setDefaults(Json::Value* settings) { //! [StreamWriterBuilderDefaults] (*settings)["commentStyle"] = "All"; (*settings)["indentation"] = "\t"; (*settings)["enableYAMLCompatibility"] = false; (*settings)["dropNullPlaceholders"] = false; (*settings)["useSpecialFloats"] = false; + (*settings)["emitUTF8"] = false; (*settings)["precision"] = 17; + (*settings)["precisionType"] = "significant"; //! [StreamWriterBuilderDefaults] } -JSONCPP_STRING writeString(StreamWriter::Factory const& builder, Value const& root) { - JSONCPP_OSTRINGSTREAM sout; - StreamWriterPtr const writer(builder.newStreamWriter()); +String writeString(StreamWriter::Factory const& factory, Value const& root) { + OStringStream sout; + StreamWriterPtr const writer(factory.newStreamWriter()); writer->write(root, &sout); return sout.str(); } -JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM& sout, Value const& root) { +OStream& operator<<(OStream& sout, Value const& root) { StreamWriterBuilder builder; StreamWriterPtr const writer(builder.newStreamWriter()); writer->write(root, &sout); diff --git a/lib/lua/CMakeLists.txt b/lib/lua/CMakeLists.txt index 119dd6302..2de4840cb 100644 --- a/lib/lua/CMakeLists.txt +++ b/lib/lua/CMakeLists.txt @@ -1,23 +1,18 @@ -cmake_minimum_required(VERSION 2.4 FATAL_ERROR) - -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) if(APPLE) set(DEFAULT_POSIX TRUE) - set(DEFAULT_DLOPEN ON) - # use this on Mac OS X 10.3- - option(LUA_USE_MACOSX "Mac OS X 10.3-" OFF) + set(DEFAULT_DLOPEN OFF) + set(COMMON_CFLAGS "${COMMON_CFLAGS} -DLUA_USE_MACOSX") elseif(UNIX OR CYGWIN) set(DEFAULT_POSIX TRUE) elseif(WIN32) @@ -32,12 +27,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(DEFAULT_DLOPEN ON) endif() -# For "Mac OS X 10.3-" -if(LUA_USE_MACOSX) - set(COMMON_CFLAGS "${COMMON_CFLAGS} -DLUA_USE_MACOSX") - set(LUA_USE_DLOPEN FALSE) -endif(LUA_USE_MACOSX) - option(LUA_USE_DLOPEN "Enable dlopen support." ${DEFAULT_DLOPEN}) mark_as_advanced(LUA_USE_DLOPEN) @@ -59,19 +48,12 @@ if(LUA_ANSI) set(COMMON_CFLAGS "${COMMON_CFLAGS} -DLUA_ANSI") endif(LUA_ANSI) +# 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() + # 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) - - -add_subdirectory(src build) +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 6b315b6ea..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 "special" 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,15 +36,7 @@ # 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, "special" key instead of "sneak" key is used for climbing down and +# If enabled, "Aux1" key instead of "Sneak" key is used for climbing down and # descending. # type: bool # aux1_descends = false @@ -70,15 +45,15 @@ # type: bool # doubletap_jump = false -# If disabled, "special" key is used to fly fast if both fly and fast mode are +# If disabled, "Aux1" key is used to fly fast if both fly and fast mode are # enabled. # type: bool # always_fly_fast = true -# The time in seconds it takes between repeated right clicks when holding the right -# mouse button. -# type: float min: 0.001 -# repeat_rightclick_time = 0.25 +# The time in seconds it takes between repeated node placements when holding +# the place button. +# type: float min: 0.25 max: 2 +# repeat_place_time = 0.25 # Automatically jump up single-node obstacles. # type: bool @@ -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 @@ -107,21 +85,2982 @@ # type: bool # fixed_virtual_joystick = false -# (Android) Use virtual joystick to trigger "aux" button. -# If enabled, virtual joystick will also tap "aux" button when out of main circle. +# (Android) Use virtual joystick to trigger "Aux1" button. +# If enabled, virtual joystick will also tap "Aux1" button when out of main circle. # type: bool -# virtual_joystick_triggers_aux = false +# virtual_joystick_triggers_aux1 = false -# Enable joysticks +# +# Graphics and Audio +# + +## Graphics + +### Screen + +# Width component of the initial window size. Ignored in fullscreen mode. +# type: int min: 1 max: 65535 +# screen_w = 1024 + +# Height component of the initial window size. Ignored in fullscreen mode. +# type: int min: 1 max: 65535 +# screen_h = 600 + +# Save window size automatically when modified. +# type: bool +# autosave_screensize = true + +# Fullscreen mode. +# type: bool +# fullscreen = false + +# 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 + +### FPS + +# 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 + +# Vertical screen synchronization. +# type: bool +# vsync = false + +# Maximum FPS when the window is not focused, or when the game is paused. +# type: int min: 1 max: 4294967295 +# fps_max_unfocused = 20 + +# View distance in nodes. +# type: int min: 20 max: 4000 +# viewing_range = 190 + +# 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 + +### Graphics Effects + +# Makes all liquids opaque +# type: bool +# opaque_water = false + +# 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. +# type: bool +# connected_glass = false + +# Enable smooth lighting with simple ambient occlusion. +# Disable for speed or for different looks. +# type: bool +# smooth_lighting = true + +# 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 + +# Adds particles when digging a node. +# type: bool +# enable_particles = true + +### 3d + +# 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 + +# Strength of 3D mode parallax. +# type: float min: -0.087 max: 0.087 +# 3d_paralax_strength = 0.025 + +### Bobbing + +# Arm inertia, gives a more realistic movement of +# the arm when the camera moves. +# type: bool +# arm_inertia = true + +# 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 + +# 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 + +### Camera + +# 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 + +# Field of view in degrees. +# type: int min: 45 max: 160 +# fov = 72 + +# 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 + +# 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 + +### Screenshots + +# 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 + +# 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 + +### Node and Entity Highlighting + +# Method used to highlight selected object. +# type: enum values: box, halo, none +# node_highlighting = box + +# Show entity selection boxes +# A restart is required after changing this. +# type: bool +# show_entity_selectionbox = false + +# 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 + +### Fog + +# Whether to fog out the end of the visible area. +# type: bool +# enable_fog = true + +# Make fog and sky colors depend on daytime (dawn/sunset) and view direction. +# type: bool +# directional_colored_fog = true + +# Fraction of the visible distance at which fog starts to be rendered +# type: float min: 0 max: 0.99 +# fog_start = 0.4 + +### Clouds + +# Clouds are a client side effect. +# type: bool +# enable_clouds = true + +# Use 3D cloud look instead of flat. +# type: bool +# enable_3d_clouds = true + +### Filtering and Antialiasing + +# Use mipmapping to scale textures. May slightly increase performance, +# especially when using a high resolution texture pack. +# Gamma correct downscaling is not supported. +# type: bool +# mip_map = false + +# Use anisotropic filtering when viewing at textures from an angle. +# type: bool +# anisotropic_filter = false + +# Use bilinear filtering when scaling textures. +# type: bool +# bilinear_filter = false + +# Use trilinear filtering when scaling textures. +# type: bool +# trilinear_filter = false + +# Filtered textures can blend RGB values with fully-transparent neighbors, +# which PNG optimizers usually discard, often resulting in dark or +# light edges to transparent textures. Apply a filter to clean that up +# at texture load time. This is automatically enabled if mipmapping is enabled. +# type: bool +# texture_clean_transparent = false + +# When using bilinear/trilinear/anisotropic filters, low-resolution textures +# can be blurred, so automatically upscale them with nearest-neighbor +# interpolation to preserve crisp pixels. This sets the minimum texture size +# for the upscaled textures; higher values look sharper, but require more +# memory. Powers of 2 are recommended. This setting is ONLY applied if +# bilinear/trilinear/anisotropic filtering is enabled. +# This is also used as the base node texture size for world-aligned +# texture autoscaling. +# type: int min: 1 max: 32768 +# texture_min_size = 64 + +# Use multi-sample antialiasing (MSAA) to smooth out block edges. +# This algorithm smooths out the 3D viewport while keeping the image sharp, +# but it doesn't affect the insides of textures +# (which is especially noticeable with transparent textures). +# Visible spaces appear between nodes when shaders are disabled. +# If set to 0, MSAA is disabled. +# A restart is required after changing this option. +# type: enum values: 0, 1, 2, 4, 8, 16 +# fsaa = 0 + +## Shaders + +# Shaders allow advanced visual effects and may increase performance on some video +# cards. +# This only works with the OpenGL video backend. +# type: bool +# enable_shaders = true + +### Tone Mapping + +# Enables Hable's 'Uncharted 2' filmic tone mapping. +# Simulates the tone curve of photographic film and how this approximates the +# appearance of high dynamic range images. Mid-range contrast is slightly +# enhanced, highlights and shadows are gradually compressed. +# type: bool +# tone_mapping = false + +### 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. +# type: bool +# enable_waving_water = false + +# The maximum height of the surface of waving liquids. +# 4.0 = Wave height is two nodes. +# 0.0 = Wave doesn't move at all. +# Default is 1.0 (1/2 node). +# Requires waving liquids to be enabled. +# type: float min: 0 max: 4 +# water_wave_height = 1.0 + +# Length of liquid waves. +# Requires waving liquids to be enabled. +# type: float min: 0.1 +# water_wave_length = 20.0 + +# How fast liquid waves will move. Higher = faster. +# If negative, liquid waves will move backwards. +# Requires waving liquids to be enabled. +# type: float +# water_wave_speed = 5.0 + +### Dynamic shadows + +# Set to true to enable Shadow Mapping. +# Requires shaders to be enabled. +# type: bool +# enable_dynamic_shadows = false + +# 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 + +# Maximum distance to render shadows. +# type: float min: 10 max: 1000 +# shadow_map_max_distance = 120.0 + +# 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 + +# 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 +# shadow_map_texture_32bit = true + +# Enable Poisson disk filtering. +# On true uses Poisson disk to make "soft shadows". Otherwise uses PCF filtering. +# type: bool +# shadow_poisson_filter = true + +# 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 + +# Enable colored shadows. +# On true translucent nodes cast colored shadows. This is expensive. +# type: bool +# shadow_map_color = false + +# 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 + +# 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 + +# 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 + +## Audio + +# 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 + +## User Interfaces + +# 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 = + +### GUIs + +# 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 + +# 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 +# formspec_fullscreen_bg_opacity = 140 + +# Formspec full-screen background color (R,G,B). +# type: string +# formspec_fullscreen_bg_color = (0,0,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). +# type: bool +# gui_scaling_filter = false + +# When gui_scaling_filter_txr2img is true, copy those images +# from hardware to software for scaling. When false, fall back +# to the old scaling method, for video drivers that don't +# properly support downloading textures back from hardware. +# type: bool +# gui_scaling_filter_txr2img = true + +# Delay showing tooltips, stated in milliseconds. +# 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 +# menu_clouds = true + +### HUD + +# Modifies the size of the HUD elements. +# type: float min: 0.5 max: 20 +# hud_scaling = 1.0 + +# Whether name tag backgrounds should be shown by default. +# Mods may still set a background. +# type: bool +# show_nametag_backgrounds = true + +### Chat + +# Maximum number of recent chat messages to show +# type: int min: 2 max: 20 +# recent_chat_messages = 6 + +# 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) + +# In-game chat console background alpha (opaqueness, between 0 and 255). +# type: int min: 0 max: 255 +# console_alpha = 200 + +# 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 + +# Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output. +# type: bool +# clickable_chat_weblinks = true + +# 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 min: 0 max: 72 +# chat_font_size = 0 + +### Content Repository + +# The URL for the content repository +# type: string +# contentdb_url = https://content.minetest.net + +# 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 + +# Maximum number of concurrent downloads. Downloads exceeding this limit will be queued. +# This should be lower than curl_parallel_limit. +# type: int min: 1 +# contentdb_max_concurrent_downloads = 3 + +# +# Client and Server +# + +## Client + +# Save the map received by the client on disk. +# type: bool +# enable_local_map_saving = false + +# URL to the server list displayed in the Multiplayer Tab. +# type: string +# serverlist_url = servers.minetest.net + +# 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_split_login_register = true + +## 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. +# type: string +# name = + +### Serverlist and MOTD + +# Name of the server, to be displayed when players join and in the serverlist. +# type: string +# server_name = Minetest server + +# Description of server, to be displayed when players join and in the serverlist. +# type: string +# server_description = mine here + +# Domain name of server, to be displayed in the serverlist. +# type: string +# server_address = game.minetest.net + +# Homepage of server, to be displayed in the serverlist. +# type: string +# server_url = https://minetest.net + +# Automatically report to the serverlist. +# type: bool +# server_announce = false + +# Announce to this serverlist. +# type: string +# serverlist_url = servers.minetest.net + +# Message of the day displayed to players connecting. +# type: string +# motd = + +# 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 min: 1 max: 65535 +# port = 30000 + +# The network interface that the server listens on. +# type: string +# bind_address = + +# Enable to disallow old clients from connecting. +# Older clients are compatible in the sense that they will not crash when connecting +# to new servers, but they may not support all new features that you are expecting. +# type: bool +# strict_protocol_version_checking = false + +# Specifies URL from which client fetches media instead of using UDP. +# $filename should be accessible from $remote_media$filename via cURL +# (obviously, remote_media should end with a slash). +# Files that are not present will be fetched the usual way. +# type: string +# remote_media = + +# Enable/disable running an IPv6 server. +# Ignored if bind_address is set. +# Needs enable_ipv6 to be enabled. +# type: bool +# ipv6_server = false + +## 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 +# default_privs = interact, shout + +# Privileges that players with basic_privs can grant +# type: string +# basic_privs = interact, shout + +# If enabled, disable cheat prevention in multiplayer. +# type: bool +# disable_anticheat = false + +# If enabled, actions are recorded for rollback. +# This option is only read when server starts. +# type: bool +# enable_rollback_recording = false + +### Client-side Modding + +# 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 + +# 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 + +### Chat + +# 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 + +# Set the maximum length of a chat message (in characters) sent by clients. +# type: int min: 10 max: 65535 +# chat_message_max_size = 500 + +# Amount of messages a player may send per 10 seconds. +# type: float min: 1 +# chat_message_limit_per_10sec = 10.0 + +# Kick players who sent more than X messages per 10 seconds. +# type: int min: 1 max: 65535 +# chat_message_limit_trigger_kick = 50 + +## Server Gameplay + +# Controls length of day/night cycle. +# Examples: +# 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged. +# 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 + +# 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 + +# 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 min: 0 +# movement_acceleration_default = 3.0 + +# Horizontal acceleration in air when jumping or falling, +# in nodes per second per second. +# type: float min: 0 +# movement_acceleration_air = 2.0 + +# Horizontal and vertical acceleration in fast mode, +# in nodes per second per second. +# type: float min: 0 +# movement_acceleration_fast = 10.0 + +# Walking and flying speed, in nodes per second. +# type: float min: 0 +# movement_speed_walk = 4.0 + +# Sneaking speed, in nodes per second. +# type: float min: 0 +# movement_speed_crouch = 1.35 + +# Walking, flying and climbing speed in fast mode, in nodes per second. +# type: float min: 0 +# movement_speed_fast = 20.0 + +# Vertical climbing speed, in nodes per second. +# type: float min: 0 +# movement_speed_climb = 3.0 + +# Initial vertical speed when jumping, in nodes per second. +# 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 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 when idling. Negative values will cause +# you to rise instead. +# type: float +# movement_liquid_sink = 10.0 + +# Acceleration of gravity, in nodes per second per second. +# type: float +# movement_gravity = 9.81 + +# +# 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. +# type: string +# 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. +# Current mapgens in a highly unstable state: +# - The optional floatlands of v7 (disabled by default). +# type: enum values: v7, valleys, carpathian, v5, flat, fractal, singlenode, v6 +# mg_name = v7 + +# Water surface level of the world. +# type: int min: -31000 max: 31000 +# water_level = 1 + +# From how far blocks are generated for clients, stated in mapblocks (16 nodes). +# 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). +# Only mapchunks completely within the mapgen limit are generated. +# Value is stored per-world. +# type: int min: 0 max: 31007 +# mapgen_limit = 31007 + +# Global map generation attributes. +# In Mapgen v6 the 'decorations' flag controls all decorations except trees +# and jungle grass, in all other mapgens this flag controls all decorations. +# 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 noise parameters + +# Temperature variation for biomes. +# type: noise_params_2d +# mg_biome_np_heat = { +# offset = 50, +# scale = 50, +# spread = (1000, 1000, 1000), +# seed = 5349, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# Small-scale temperature variation for blending biomes on borders. +# type: noise_params_2d +# mg_biome_np_heat_blend = { +# offset = 0, +# scale = 1.5, +# spread = (8, 8, 8), +# seed = 13, +# octaves = 2, +# persistence = 1.0, +# lacunarity = 2.0, +# flags = eased +# } + +# Humidity variation for biomes. +# type: noise_params_2d +# mg_biome_np_humidity = { +# offset = 50, +# scale = 50, +# spread = (1000, 1000, 1000), +# seed = 842, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# Small-scale humidity variation for blending biomes on borders. +# type: noise_params_2d +# mg_biome_np_humidity_blend = { +# offset = 0, +# scale = 1.5, +# spread = (8, 8, 8), +# seed = 90003, +# octaves = 2, +# persistence = 1.0, +# lacunarity = 2.0, +# flags = eased +# } + +## Mapgen V5 + +# Map generation attributes specific to Mapgen v5. +# type: flags possible values: caverns, nocaverns +# mgv5_spflags = caverns + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +# type: float +# mgv5_cave_width = 0.09 + +# Y of upper limit of large caves. +# type: int min: -31000 max: 31000 +# mgv5_large_cave_depth = -256 + +# Minimum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgv5_small_cave_num_min = 0 + +# Maximum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgv5_small_cave_num_max = 0 + +# Minimum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgv5_large_cave_num_min = 0 + +# Maximum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgv5_large_cave_num_max = 2 + +# Proportion of large caves that contain liquid. +# type: float min: 0 max: 1 +# mgv5_large_cave_flooded = 0.5 + +# Y-level of cavern upper limit. +# type: int min: -31000 max: 31000 +# mgv5_cavern_limit = -256 + +# Y-distance over which caverns expand to full size. +# type: int min: 0 max: 32767 +# mgv5_cavern_taper = 256 + +# Defines full size of caverns, smaller values create larger caverns. +# type: float +# mgv5_cavern_threshold = 0.7 + +# Lower Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgv5_dungeon_ymin = -31000 + +# Upper Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgv5_dungeon_ymax = 31000 + +### Noises + +# Variation of biome filler depth. +# type: noise_params_2d +# mgv5_np_filler_depth = { +# offset = 0, +# scale = 1, +# spread = (150, 150, 150), +# seed = 261, +# octaves = 4, +# persistence = 0.7, +# lacunarity = 2.0, +# flags = eased +# } + +# Variation of terrain vertical scale. +# When noise is < -0.55 terrain is near-flat. +# type: noise_params_2d +# mgv5_np_factor = { +# offset = 0, +# scale = 1, +# spread = (250, 250, 250), +# seed = 920381, +# octaves = 3, +# persistence = 0.45, +# lacunarity = 2.0, +# flags = eased +# } + +# Y-level of average terrain surface. +# type: noise_params_2d +# mgv5_np_height = { +# offset = 0, +# scale = 10, +# spread = (250, 250, 250), +# seed = 84174, +# octaves = 4, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# First of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgv5_np_cave1 = { +# offset = 0, +# scale = 12, +# spread = (61, 61, 61), +# seed = 52534, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# Second of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgv5_np_cave2 = { +# offset = 0, +# scale = 12, +# spread = (67, 67, 67), +# seed = 10325, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise defining giant caverns. +# type: noise_params_3d +# mgv5_np_cavern = { +# offset = 0, +# scale = 1, +# spread = (384, 128, 384), +# seed = 723, +# octaves = 5, +# persistence = 0.63, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise defining terrain. +# type: noise_params_3d +# mgv5_np_ground = { +# offset = 0, +# scale = 40, +# spread = (80, 80, 80), +# seed = 983240, +# octaves = 4, +# persistence = 0.55, +# lacunarity = 2.0, +# flags = eased +# } + +# 3D noise that determines number of dungeons per mapchunk. +# type: noise_params_3d +# mgv5_np_dungeons = { +# offset = 0.9, +# scale = 0.5, +# spread = (500, 500, 500), +# seed = 0, +# octaves = 2, +# persistence = 0.8, +# lacunarity = 2.0, +# flags = +# } + +## Mapgen V6 + +# Map generation attributes specific to Mapgen v6. +# The 'snowbiomes' flag enables the new 5 biome system. +# When the 'snowbiomes' flag is enabled jungles are automatically enabled and +# the 'jungles' flag is ignored. +# type: flags possible values: jungles, biomeblend, mudflow, snowbiomes, flat, trees, nojungles, nobiomeblend, nomudflow, nosnowbiomes, noflat, notrees +# mgv6_spflags = jungles,biomeblend,mudflow,snowbiomes,noflat,trees + +# Deserts occur when np_biome exceeds this value. +# When the 'snowbiomes' flag is enabled, this is ignored. +# type: float +# mgv6_freq_desert = 0.45 + +# Sandy beaches occur when np_beach exceeds this value. +# type: float +# mgv6_freq_beach = 0.15 + +# Lower Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgv6_dungeon_ymin = -31000 + +# Upper Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgv6_dungeon_ymax = 31000 + +### Noises + +# Y-level of lower terrain and seabed. +# type: noise_params_2d +# mgv6_np_terrain_base = { +# offset = -4, +# scale = 20, +# spread = (250, 250, 250), +# seed = 82341, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Y-level of higher terrain that creates cliffs. +# type: noise_params_2d +# mgv6_np_terrain_higher = { +# offset = 20, +# scale = 16, +# spread = (500, 500, 500), +# seed = 85039, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Varies steepness of cliffs. +# type: noise_params_2d +# mgv6_np_steepness = { +# offset = 0.85, +# scale = 0.5, +# spread = (125, 125, 125), +# seed = -932, +# octaves = 5, +# persistence = 0.7, +# lacunarity = 2.0, +# flags = eased +# } + +# Defines distribution of higher terrain. +# type: noise_params_2d +# mgv6_np_height_select = { +# offset = 0.5, +# scale = 1, +# spread = (250, 250, 250), +# seed = 4213, +# octaves = 5, +# persistence = 0.69, +# lacunarity = 2.0, +# flags = eased +# } + +# Varies depth of biome surface nodes. +# type: noise_params_2d +# mgv6_np_mud = { +# offset = 4, +# scale = 2, +# spread = (200, 200, 200), +# seed = 91013, +# octaves = 3, +# persistence = 0.55, +# lacunarity = 2.0, +# flags = eased +# } + +# Defines areas with sandy beaches. +# type: noise_params_2d +# mgv6_np_beach = { +# offset = 0, +# scale = 1, +# spread = (250, 250, 250), +# seed = 59420, +# octaves = 3, +# persistence = 0.50, +# lacunarity = 2.0, +# flags = eased +# } + +# Temperature variation for biomes. +# type: noise_params_2d +# mgv6_np_biome = { +# offset = 0, +# scale = 1, +# spread = (500, 500, 500), +# seed = 9130, +# octaves = 3, +# persistence = 0.50, +# lacunarity = 2.0, +# flags = eased +# } + +# Variation of number of caves. +# type: noise_params_2d +# mgv6_np_cave = { +# offset = 6, +# scale = 6, +# spread = (250, 250, 250), +# seed = 34329, +# octaves = 3, +# persistence = 0.50, +# lacunarity = 2.0, +# flags = eased +# } + +# Humidity variation for biomes. +# type: noise_params_2d +# mgv6_np_humidity = { +# offset = 0.5, +# scale = 0.5, +# spread = (500, 500, 500), +# seed = 72384, +# octaves = 3, +# persistence = 0.50, +# lacunarity = 2.0, +# flags = eased +# } + +# Defines tree areas and tree density. +# type: noise_params_2d +# mgv6_np_trees = { +# offset = 0, +# scale = 1, +# spread = (125, 125, 125), +# seed = 2, +# octaves = 4, +# persistence = 0.66, +# lacunarity = 2.0, +# flags = eased +# } + +# Defines areas where trees have apples. +# type: noise_params_2d +# mgv6_np_apple_trees = { +# offset = 0, +# scale = 1, +# spread = (100, 100, 100), +# seed = 342902, +# octaves = 3, +# persistence = 0.45, +# lacunarity = 2.0, +# flags = eased +# } + +## Mapgen V7 + +# Map generation attributes specific to Mapgen v7. +# 'ridges': Rivers. +# 'floatlands': Floating land masses in the atmosphere. +# 'caverns': Giant caves deep underground. +# type: flags possible values: mountains, ridges, floatlands, caverns, nomountains, noridges, nofloatlands, nocaverns +# mgv7_spflags = mountains,ridges,nofloatlands,caverns + +# Y of mountain density gradient zero level. Used to shift mountains vertically. +# type: int min: -31000 max: 31000 +# mgv7_mount_zero_level = 0 + +# Lower Y limit of floatlands. +# type: int min: -31000 max: 31000 +# mgv7_floatland_ymin = 1024 + +# Upper Y limit of floatlands. +# 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 min: 0 max: 32767 +# mgv7_floatland_taper = 256 + +# Exponent of the floatland tapering. Alters the tapering behaviour. +# Value = 1.0 creates a uniform, linear tapering. +# Values > 1.0 create a smooth tapering suitable for the default separated +# floatlands. +# Values < 1.0 (for example 0.25) create a more defined surface level with +# flatter lowlands, suitable for a solid floatland layer. +# type: float +# mgv7_float_taper_exp = 2.0 + +# Adjusts the density of the floatland layer. +# Increase value to increase density. Can be positive or negative. +# Value = 0.0: 50% of volume is floatland. +# Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test +# to be sure) creates a solid floatland layer. +# type: float +# mgv7_floatland_density = -0.6 + +# Surface level of optional water placed on a solid floatland layer. +# Water is disabled by default and will only be placed if this value is set +# to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the +# upper tapering). +# ***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***: +# When enabling water placement the floatlands must be configured and tested +# to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other +# 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 min: -31000 max: 31000 +# mgv7_floatland_ywater = -31000 + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +# type: float +# mgv7_cave_width = 0.09 + +# Y of upper limit of large caves. +# type: int min: -31000 max: 31000 +# mgv7_large_cave_depth = -33 + +# Minimum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgv7_small_cave_num_min = 0 + +# Maximum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgv7_small_cave_num_max = 0 + +# Minimum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgv7_large_cave_num_min = 0 + +# Maximum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgv7_large_cave_num_max = 2 + +# Proportion of large caves that contain liquid. +# type: float min: 0 max: 1 +# mgv7_large_cave_flooded = 0.5 + +# Y-level of cavern upper limit. +# type: int min: -31000 max: 31000 +# mgv7_cavern_limit = -256 + +# Y-distance over which caverns expand to full size. +# type: int min: 0 max: 32767 +# mgv7_cavern_taper = 256 + +# Defines full size of caverns, smaller values create larger caverns. +# type: float +# mgv7_cavern_threshold = 0.7 + +# Lower Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgv7_dungeon_ymin = -31000 + +# Upper Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgv7_dungeon_ymax = 31000 + +### Noises + +# Y-level of higher terrain that creates cliffs. +# type: noise_params_2d +# mgv7_np_terrain_base = { +# offset = 4, +# scale = 70, +# spread = (600, 600, 600), +# seed = 82341, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Y-level of lower terrain and seabed. +# type: noise_params_2d +# mgv7_np_terrain_alt = { +# offset = 4, +# scale = 25, +# spread = (600, 600, 600), +# seed = 5934, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Varies roughness of terrain. +# Defines the 'persistence' value for terrain_base and terrain_alt noises. +# type: noise_params_2d +# mgv7_np_terrain_persist = { +# offset = 0.6, +# scale = 0.1, +# spread = (2000, 2000, 2000), +# seed = 539, +# octaves = 3, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Defines distribution of higher terrain and steepness of cliffs. +# type: noise_params_2d +# mgv7_np_height_select = { +# offset = -8, +# scale = 16, +# spread = (500, 500, 500), +# seed = 4213, +# octaves = 6, +# persistence = 0.7, +# lacunarity = 2.0, +# flags = eased +# } + +# Variation of biome filler depth. +# type: noise_params_2d +# mgv7_np_filler_depth = { +# offset = 0, +# scale = 1.2, +# spread = (150, 150, 150), +# seed = 261, +# octaves = 3, +# persistence = 0.7, +# lacunarity = 2.0, +# flags = eased +# } + +# Variation of maximum mountain height (in nodes). +# type: noise_params_2d +# mgv7_np_mount_height = { +# offset = 256, +# scale = 112, +# spread = (1000, 1000, 1000), +# seed = 72449, +# octaves = 3, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Defines large-scale river channel structure. +# type: noise_params_2d +# mgv7_np_ridge_uwater = { +# offset = 0, +# scale = 1, +# spread = (1000, 1000, 1000), +# seed = 85039, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# 3D noise defining mountain structure and height. +# Also defines structure of floatland mountain terrain. +# type: noise_params_3d +# mgv7_np_mountain = { +# offset = -0.6, +# scale = 1, +# spread = (250, 350, 250), +# seed = 5333, +# octaves = 5, +# persistence = 0.63, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise defining structure of river canyon walls. +# type: noise_params_3d +# mgv7_np_ridge = { +# offset = 0, +# scale = 1, +# spread = (100, 100, 100), +# seed = 6467, +# octaves = 4, +# persistence = 0.75, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise defining structure of floatlands. +# If altered from the default, the noise 'scale' (0.7 by default) may need +# to be adjusted, as floatland tapering functions best when this noise has +# a value range of approximately -2.0 to 2.0. +# type: noise_params_3d +# mgv7_np_floatland = { +# offset = 0, +# scale = 0.7, +# spread = (384, 96, 384), +# seed = 1009, +# octaves = 4, +# persistence = 0.75, +# lacunarity = 1.618, +# flags = +# } + +# 3D noise defining giant caverns. +# type: noise_params_3d +# mgv7_np_cavern = { +# offset = 0, +# scale = 1, +# spread = (384, 128, 384), +# seed = 723, +# octaves = 5, +# persistence = 0.63, +# lacunarity = 2.0, +# flags = +# } + +# First of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgv7_np_cave1 = { +# offset = 0, +# scale = 12, +# spread = (61, 61, 61), +# seed = 52534, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# Second of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgv7_np_cave2 = { +# offset = 0, +# scale = 12, +# spread = (67, 67, 67), +# seed = 10325, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise that determines number of dungeons per mapchunk. +# type: noise_params_3d +# mgv7_np_dungeons = { +# offset = 0.9, +# scale = 0.5, +# spread = (500, 500, 500), +# seed = 0, +# octaves = 2, +# persistence = 0.8, +# lacunarity = 2.0, +# flags = +# } + +## Mapgen Carpathian + +# Map generation attributes specific to Mapgen Carpathian. +# type: flags possible values: caverns, rivers, nocaverns, norivers +# mgcarpathian_spflags = caverns,norivers + +# Defines the base ground level. +# type: float +# mgcarpathian_base_level = 12.0 + +# Defines the width of the river channel. +# type: float +# mgcarpathian_river_width = 0.05 + +# Defines the depth of the river channel. +# type: float +# mgcarpathian_river_depth = 24.0 + +# Defines the width of the river valley. +# type: float +# mgcarpathian_valley_width = 0.25 + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +# type: float +# mgcarpathian_cave_width = 0.09 + +# Y of upper limit of large caves. +# type: int min: -31000 max: 31000 +# mgcarpathian_large_cave_depth = -33 + +# Minimum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgcarpathian_small_cave_num_min = 0 + +# Maximum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgcarpathian_small_cave_num_max = 0 + +# Minimum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgcarpathian_large_cave_num_min = 0 + +# Maximum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgcarpathian_large_cave_num_max = 2 + +# Proportion of large caves that contain liquid. +# type: float min: 0 max: 1 +# mgcarpathian_large_cave_flooded = 0.5 + +# Y-level of cavern upper limit. +# type: int min: -31000 max: 31000 +# mgcarpathian_cavern_limit = -256 + +# Y-distance over which caverns expand to full size. +# type: int min: 0 max: 32767 +# mgcarpathian_cavern_taper = 256 + +# Defines full size of caverns, smaller values create larger caverns. +# type: float +# mgcarpathian_cavern_threshold = 0.7 + +# Lower Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgcarpathian_dungeon_ymin = -31000 + +# Upper Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgcarpathian_dungeon_ymax = 31000 + +### Noises + +# Variation of biome filler depth. +# type: noise_params_2d +# mgcarpathian_np_filler_depth = { +# offset = 0, +# scale = 1, +# spread = (128, 128, 128), +# seed = 261, +# octaves = 3, +# persistence = 0.7, +# lacunarity = 2.0, +# flags = eased +# } + +# First of 4 2D noises that together define hill/mountain range height. +# type: noise_params_2d +# mgcarpathian_np_height1 = { +# offset = 0, +# scale = 5, +# spread = (251, 251, 251), +# seed = 9613, +# octaves = 5, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# Second of 4 2D noises that together define hill/mountain range height. +# type: noise_params_2d +# mgcarpathian_np_height2 = { +# offset = 0, +# scale = 5, +# spread = (383, 383, 383), +# seed = 1949, +# octaves = 5, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# Third of 4 2D noises that together define hill/mountain range height. +# type: noise_params_2d +# mgcarpathian_np_height3 = { +# offset = 0, +# scale = 5, +# spread = (509, 509, 509), +# seed = 3211, +# octaves = 5, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# Fourth of 4 2D noises that together define hill/mountain range height. +# type: noise_params_2d +# mgcarpathian_np_height4 = { +# offset = 0, +# scale = 5, +# spread = (631, 631, 631), +# seed = 1583, +# octaves = 5, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# 2D noise that controls the size/occurrence of rolling hills. +# type: noise_params_2d +# mgcarpathian_np_hills_terrain = { +# offset = 1, +# scale = 1, +# spread = (1301, 1301, 1301), +# seed = 1692, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# 2D noise that controls the size/occurrence of ridged mountain ranges. +# type: noise_params_2d +# mgcarpathian_np_ridge_terrain = { +# offset = 1, +# scale = 1, +# spread = (1889, 1889, 1889), +# seed = 3568, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# 2D noise that controls the size/occurrence of step mountain ranges. +# type: noise_params_2d +# mgcarpathian_np_step_terrain = { +# offset = 1, +# scale = 1, +# spread = (1889, 1889, 1889), +# seed = 4157, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# 2D noise that controls the shape/size of rolling hills. +# type: noise_params_2d +# mgcarpathian_np_hills = { +# offset = 0, +# scale = 3, +# spread = (257, 257, 257), +# seed = 6604, +# octaves = 6, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# 2D noise that controls the shape/size of ridged mountains. +# type: noise_params_2d +# mgcarpathian_np_ridge_mnt = { +# offset = 0, +# scale = 12, +# spread = (743, 743, 743), +# seed = 5520, +# octaves = 6, +# persistence = 0.7, +# lacunarity = 2.0, +# flags = eased +# } + +# 2D noise that controls the shape/size of step mountains. +# type: noise_params_2d +# mgcarpathian_np_step_mnt = { +# offset = 0, +# scale = 8, +# spread = (509, 509, 509), +# seed = 2590, +# octaves = 6, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# 2D noise that locates the river valleys and channels. +# type: noise_params_2d +# mgcarpathian_np_rivers = { +# offset = 0, +# scale = 1, +# spread = (1000, 1000, 1000), +# seed = 85039, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# 3D noise for mountain overhangs, cliffs, etc. Usually small variations. +# type: noise_params_3d +# mgcarpathian_np_mnt_var = { +# offset = 0, +# scale = 1, +# spread = (499, 499, 499), +# seed = 2490, +# octaves = 5, +# persistence = 0.55, +# lacunarity = 2.0, +# flags = +# } + +# First of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgcarpathian_np_cave1 = { +# offset = 0, +# scale = 12, +# spread = (61, 61, 61), +# seed = 52534, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# Second of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgcarpathian_np_cave2 = { +# offset = 0, +# scale = 12, +# spread = (67, 67, 67), +# seed = 10325, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise defining giant caverns. +# type: noise_params_3d +# mgcarpathian_np_cavern = { +# offset = 0, +# scale = 1, +# spread = (384, 128, 384), +# seed = 723, +# octaves = 5, +# persistence = 0.63, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise that determines number of dungeons per mapchunk. +# type: noise_params_3d +# mgcarpathian_np_dungeons = { +# offset = 0.9, +# scale = 0.5, +# spread = (500, 500, 500), +# seed = 0, +# octaves = 2, +# persistence = 0.8, +# lacunarity = 2.0, +# flags = +# } + +## Mapgen Flat + +# Map generation attributes specific to Mapgen Flat. +# Occasional lakes and hills can be added to the flat world. +# type: flags possible values: lakes, hills, caverns, nolakes, nohills, nocaverns +# mgflat_spflags = nolakes,nohills,nocaverns + +# Y of flat ground. +# type: int min: -31000 max: 31000 +# mgflat_ground_level = 8 + +# Y of upper limit of large caves. +# type: int min: -31000 max: 31000 +# mgflat_large_cave_depth = -33 + +# Minimum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgflat_small_cave_num_min = 0 + +# Maximum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgflat_small_cave_num_max = 0 + +# Minimum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgflat_large_cave_num_min = 0 + +# Maximum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgflat_large_cave_num_max = 2 + +# Proportion of large caves that contain liquid. +# type: float min: 0 max: 1 +# mgflat_large_cave_flooded = 0.5 + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +# type: float +# mgflat_cave_width = 0.09 + +# Terrain noise threshold for lakes. +# Controls proportion of world area covered by lakes. +# Adjust towards 0.0 for a larger proportion. +# type: float +# mgflat_lake_threshold = -0.45 + +# Controls steepness/depth of lake depressions. +# type: float +# mgflat_lake_steepness = 48.0 + +# Terrain noise threshold for hills. +# Controls proportion of world area covered by hills. +# Adjust towards 0.0 for a larger proportion. +# type: float +# mgflat_hill_threshold = 0.45 + +# Controls steepness/height of hills. +# type: float +# mgflat_hill_steepness = 64.0 + +# Y-level of cavern upper limit. +# type: int min: -31000 max: 31000 +# mgflat_cavern_limit = -256 + +# Y-distance over which caverns expand to full size. +# type: int min: 0 max: 32767 +# mgflat_cavern_taper = 256 + +# Defines full size of caverns, smaller values create larger caverns. +# type: float +# mgflat_cavern_threshold = 0.7 + +# Lower Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgflat_dungeon_ymin = -31000 + +# Upper Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgflat_dungeon_ymax = 31000 + +### Noises + +# Defines location and terrain of optional hills and lakes. +# type: noise_params_2d +# mgflat_np_terrain = { +# offset = 0, +# scale = 1, +# spread = (600, 600, 600), +# seed = 7244, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Variation of biome filler depth. +# type: noise_params_2d +# mgflat_np_filler_depth = { +# offset = 0, +# scale = 1.2, +# spread = (150, 150, 150), +# seed = 261, +# octaves = 3, +# persistence = 0.7, +# lacunarity = 2.0, +# flags = eased +# } + +# First of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgflat_np_cave1 = { +# offset = 0, +# scale = 12, +# spread = (61, 61, 61), +# seed = 52534, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# Second of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgflat_np_cave2 = { +# offset = 0, +# scale = 12, +# spread = (67, 67, 67), +# seed = 10325, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise defining giant caverns. +# type: noise_params_3d +# mgflat_np_cavern = { +# offset = 0, +# scale = 1, +# spread = (384, 128, 384), +# seed = 723, +# octaves = 5, +# persistence = 0.63, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise that determines number of dungeons per mapchunk. +# type: noise_params_3d +# mgflat_np_dungeons = { +# offset = 0.9, +# scale = 0.5, +# spread = (500, 500, 500), +# seed = 0, +# octaves = 2, +# persistence = 0.8, +# lacunarity = 2.0, +# flags = +# } + +## Mapgen Fractal + +# Map generation attributes specific to Mapgen Fractal. +# 'terrain' enables the generation of non-fractal terrain: +# ocean, islands and underground. +# type: flags possible values: terrain, noterrain +# mgfractal_spflags = terrain + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +# type: float +# mgfractal_cave_width = 0.09 + +# Y of upper limit of large caves. +# type: int min: -31000 max: 31000 +# mgfractal_large_cave_depth = -33 + +# Minimum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgfractal_small_cave_num_min = 0 + +# Maximum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgfractal_small_cave_num_max = 0 + +# Minimum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgfractal_large_cave_num_min = 0 + +# Maximum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgfractal_large_cave_num_max = 2 + +# Proportion of large caves that contain liquid. +# type: float min: 0 max: 1 +# mgfractal_large_cave_flooded = 0.5 + +# Lower Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgfractal_dungeon_ymin = -31000 + +# Upper Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgfractal_dungeon_ymax = 31000 + +# Selects one of 18 fractal types. +# 1 = 4D "Roundy" Mandelbrot set. +# 2 = 4D "Roundy" Julia set. +# 3 = 4D "Squarry" Mandelbrot set. +# 4 = 4D "Squarry" Julia set. +# 5 = 4D "Mandy Cousin" Mandelbrot set. +# 6 = 4D "Mandy Cousin" Julia set. +# 7 = 4D "Variation" Mandelbrot set. +# 8 = 4D "Variation" Julia set. +# 9 = 3D "Mandelbrot/Mandelbar" Mandelbrot set. +# 10 = 3D "Mandelbrot/Mandelbar" Julia set. +# 11 = 3D "Christmas Tree" Mandelbrot set. +# 12 = 3D "Christmas Tree" Julia set. +# 13 = 3D "Mandelbulb" Mandelbrot set. +# 14 = 3D "Mandelbulb" Julia set. +# 15 = 3D "Cosine Mandelbulb" Mandelbrot set. +# 16 = 3D "Cosine Mandelbulb" Julia set. +# 17 = 4D "Mandelbulb" Mandelbrot set. +# 18 = 4D "Mandelbulb" Julia set. +# type: int min: 1 max: 18 +# mgfractal_fractal = 1 + +# Iterations of the recursive function. +# 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 min: 1 max: 65535 +# mgfractal_iterations = 11 + +# (X,Y,Z) scale of fractal in nodes. +# Actual fractal size will be 2 to 3 times larger. +# These numbers can be made very large, the fractal does +# not have to fit inside the world. +# Increase these to 'zoom' into the detail of the fractal. +# Default is for a vertically-squashed shape suitable for +# an island, set all 3 numbers equal for the raw shape. +# type: v3f +# mgfractal_scale = (4096.0, 1024.0, 4096.0) + +# (X,Y,Z) offset of fractal from world center in units of 'scale'. +# Can be used to move a desired point to (0, 0) to create a +# suitable spawn point, or to allow 'zooming in' on a desired +# point by increasing 'scale'. +# The default is tuned for a suitable spawn point for Mandelbrot +# sets with default parameters, it may need altering in other +# situations. +# Range roughly -2 to 2. Multiply by 'scale' for offset in nodes. +# type: v3f +# mgfractal_offset = (1.79, 0.0, 0.0) + +# W coordinate of the generated 3D slice of a 4D fractal. +# Determines which 3D slice of the 4D shape is generated. +# Alters the shape of the fractal. +# Has no effect on 3D fractals. +# Range roughly -2 to 2. +# type: float +# mgfractal_slice_w = 0.0 + +# Julia set only. +# X component of hypercomplex constant. +# Alters the shape of the fractal. +# Range roughly -2 to 2. +# type: float +# mgfractal_julia_x = 0.33 + +# Julia set only. +# Y component of hypercomplex constant. +# Alters the shape of the fractal. +# Range roughly -2 to 2. +# type: float +# mgfractal_julia_y = 0.33 + +# Julia set only. +# Z component of hypercomplex constant. +# Alters the shape of the fractal. +# Range roughly -2 to 2. +# type: float +# mgfractal_julia_z = 0.33 + +# Julia set only. +# W component of hypercomplex constant. +# Alters the shape of the fractal. +# Has no effect on 3D fractals. +# Range roughly -2 to 2. +# type: float +# mgfractal_julia_w = 0.33 + +### Noises + +# Y-level of seabed. +# type: noise_params_2d +# mgfractal_np_seabed = { +# offset = -14, +# scale = 9, +# spread = (600, 600, 600), +# seed = 41900, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Variation of biome filler depth. +# type: noise_params_2d +# mgfractal_np_filler_depth = { +# offset = 0, +# scale = 1.2, +# spread = (150, 150, 150), +# seed = 261, +# octaves = 3, +# persistence = 0.7, +# lacunarity = 2.0, +# flags = eased +# } + +# First of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgfractal_np_cave1 = { +# offset = 0, +# scale = 12, +# spread = (61, 61, 61), +# seed = 52534, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# Second of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgfractal_np_cave2 = { +# offset = 0, +# scale = 12, +# spread = (67, 67, 67), +# seed = 10325, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# 3D noise that determines number of dungeons per mapchunk. +# type: noise_params_3d +# mgfractal_np_dungeons = { +# offset = 0.9, +# scale = 0.5, +# spread = (500, 500, 500), +# seed = 0, +# octaves = 2, +# persistence = 0.8, +# lacunarity = 2.0, +# flags = +# } + +## Mapgen Valleys + +# Map generation attributes specific to Mapgen Valleys. +# 'altitude_chill': Reduces heat with altitude. +# 'humid_rivers': Increases humidity around rivers. +# 'vary_river_depth': If enabled, low humidity and high heat causes rivers +# to become shallower and occasionally dry. +# 'altitude_dry': Reduces humidity with altitude. +# type: flags possible values: altitude_chill, humid_rivers, vary_river_depth, altitude_dry, noaltitude_chill, nohumid_rivers, novary_river_depth, noaltitude_dry +# mgvalleys_spflags = altitude_chill,humid_rivers,vary_river_depth,altitude_dry + +# 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 min: 0 max: 65535 +# mgvalleys_altitude_chill = 90 + +# Depth below which you'll find large caves. +# type: int min: -31000 max: 31000 +# mgvalleys_large_cave_depth = -33 + +# Minimum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgvalleys_small_cave_num_min = 0 + +# Maximum limit of random number of small caves per mapchunk. +# type: int min: 0 max: 256 +# mgvalleys_small_cave_num_max = 0 + +# Minimum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgvalleys_large_cave_num_min = 0 + +# Maximum limit of random number of large caves per mapchunk. +# type: int min: 0 max: 64 +# mgvalleys_large_cave_num_max = 2 + +# Proportion of large caves that contain liquid. +# type: float min: 0 max: 1 +# mgvalleys_large_cave_flooded = 0.5 + +# Depth below which you'll find giant caverns. +# type: int min: -31000 max: 31000 +# mgvalleys_cavern_limit = -256 + +# Y-distance over which caverns expand to full size. +# type: int min: 0 max: 32767 +# mgvalleys_cavern_taper = 192 + +# Defines full size of caverns, smaller values create larger caverns. +# type: float +# mgvalleys_cavern_threshold = 0.6 + +# How deep to make rivers. +# type: int min: 0 max: 65535 +# mgvalleys_river_depth = 4 + +# How wide to make rivers. +# type: int min: 0 max: 65535 +# mgvalleys_river_size = 5 + +# Controls width of tunnels, a smaller value creates wider tunnels. +# Value >= 10.0 completely disables generation of tunnels and avoids the +# intensive noise calculations. +# type: float +# mgvalleys_cave_width = 0.09 + +# Lower Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgvalleys_dungeon_ymin = -31000 + +# Upper Y limit of dungeons. +# type: int min: -31000 max: 31000 +# mgvalleys_dungeon_ymax = 63 + +### Noises + +# First of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgvalleys_np_cave1 = { +# offset = 0, +# scale = 12, +# spread = (61, 61, 61), +# seed = 52534, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# Second of two 3D noises that together define tunnels. +# type: noise_params_3d +# mgvalleys_np_cave2 = { +# offset = 0, +# scale = 12, +# spread = (67, 67, 67), +# seed = 10325, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = +# } + +# The depth of dirt or other biome filler node. +# type: noise_params_2d +# mgvalleys_np_filler_depth = { +# offset = 0, +# scale = 1.2, +# spread = (256, 256, 256), +# seed = 1605, +# octaves = 3, +# persistence = 0.5, +# lacunarity = 2.0, +# flags = eased +# } + +# 3D noise defining giant caverns. +# type: noise_params_3d +# mgvalleys_np_cavern = { +# offset = 0, +# scale = 1, +# spread = (768, 256, 768), +# seed = 59033, +# octaves = 6, +# persistence = 0.63, +# lacunarity = 2.0, +# flags = +# } + +# Defines large-scale river channel structure. +# type: noise_params_2d +# mgvalleys_np_rivers = { +# offset = 0, +# scale = 1, +# spread = (256, 256, 256), +# seed = -6050, +# octaves = 5, +# persistence = 0.6, +# lacunarity = 2.0, +# flags = eased +# } + +# Base terrain height. +# type: noise_params_2d +# mgvalleys_np_terrain_height = { +# offset = -10, +# scale = 50, +# spread = (1024, 1024, 1024), +# seed = 5202, +# octaves = 6, +# persistence = 0.4, +# lacunarity = 2.0, +# flags = eased +# } + +# Raises terrain to make valleys around the rivers. +# type: noise_params_2d +# mgvalleys_np_valley_depth = { +# offset = 5, +# scale = 4, +# spread = (512, 512, 512), +# seed = -1914, +# octaves = 1, +# persistence = 1.0, +# lacunarity = 2.0, +# flags = eased +# } + +# Slope and fill work together to modify the heights. +# type: noise_params_3d +# mgvalleys_np_inter_valley_fill = { +# offset = 0, +# scale = 1, +# spread = (256, 512, 256), +# seed = 1993, +# octaves = 6, +# persistence = 0.8, +# lacunarity = 2.0, +# flags = +# } + +# Amplifies the valleys. +# type: noise_params_2d +# mgvalleys_np_valley_profile = { +# offset = 0.6, +# scale = 0.5, +# spread = (512, 512, 512), +# seed = 777, +# octaves = 1, +# persistence = 1.0, +# lacunarity = 2.0, +# flags = eased +# } + +# Slope and fill work together to modify the heights. +# type: noise_params_2d +# mgvalleys_np_inter_valley_slope = { +# offset = 0.5, +# scale = 0.5, +# spread = (128, 128, 128), +# seed = 746, +# octaves = 1, +# persistence = 1.0, +# lacunarity = 2.0, +# flags = eased +# } + +# 3D noise that determines number of dungeons per mapchunk. +# type: noise_params_3d +# mgvalleys_np_dungeons = { +# offset = 0.9, +# scale = 0.5, +# spread = (500, 500, 500), +# seed = 0, +# octaves = 2, +# persistence = 0.8, +# lacunarity = 2.0, +# 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 min: 1 max: 10 +# chunksize = 5 + +# Dump the mapgen debug information. +# type: bool +# enable_mapgen_debug_info = false + +# Maximum number of blocks that can be queued for loading. +# type: int min: 1 max: 1000000 +# emergequeue_limit_total = 1024 + +# Maximum number of blocks to be queued that are to be loaded from file. +# This limit is enforced per player. +# type: int min: 1 max: 1000000 +# emergequeue_limit_diskonly = 128 + +# Maximum number of blocks to be queued that are to be generated. +# This limit is enforced per player. +# type: int min: 1 max: 1000000 +# emergequeue_limit_generate = 128 + +# Number of emerge threads to use. +# Value 0: +# - Automatic selection. The number of emerge threads will be +# - 'number of processors - 2', with a lower limit of 1. +# Any other value: +# - Specifies the number of emerge threads, with a lower limit of 1. +# WARNING: Increasing the number of emerge threads increases engine mapgen +# 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 min: 0 max: 32767 +# num_emerge_threads = 1 + +### cURL + +# 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 +# serverlist_file = favoriteservers.json + +## Gamepads + +# Enable joysticks. Requires a restart to take effect # type: bool # enable_joysticks = false # The identifier of the joystick to use -# type: int +# type: int min: 0 max: 255 # joystick_id = 0 # The type of joystick -# type: enum values: auto, generic, xbox +# type: enum values: auto, generic, xbox, dragonrise_gamecube # joystick_type = auto # The time in seconds it takes between repeated events @@ -129,10 +3068,102 @@ # 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 -# ingame view frustum around. -# type: float -# joystick_frustum_sensitivity = 170 +# 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 +# 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 + +# 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 @@ -166,6 +3197,16 @@ # 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 @@ -174,7 +3215,7 @@ # Key for moving fast in fast mode. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 # type: key -# keymap_special1 = KEY_KEY_E +# keymap_aux1 = KEY_KEY_E # Key for opening the chat window. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 @@ -481,2882 +3522,3 @@ # type: key # keymap_decrease_viewing_range_min = - -# -# Graphics -# - -## In-Game - -### Basic - -# Enable vertex buffer objects. -# This should greatly improve graphics performance. -# type: bool -# enable_vbo = true - -# 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. -# type: bool -# connected_glass = false - -# Enable smooth lighting with simple ambient occlusion. -# Disable for speed or for different looks. -# type: bool -# smooth_lighting = true - -# Clouds are a client side effect. -# type: bool -# enable_clouds = true - -# Use 3D cloud look instead of flat. -# 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 - -# Use mip mapping to scale textures. May slightly increase performance, -# especially when using a high resolution texture pack. -# Gamma correct downscaling is not supported. -# type: bool -# mip_map = false - -# Use anisotropic filtering when viewing at textures from an angle. -# type: bool -# anisotropic_filter = false - -# Use bilinear filtering when scaling textures. -# type: bool -# bilinear_filter = false - -# Use trilinear filtering when scaling textures. -# type: bool -# trilinear_filter = false - -# Filtered textures can blend RGB values with fully-transparent neighbors, -# which PNG optimizers usually discard, sometimes resulting in a dark or -# light edge to transparent textures. Apply this filter to clean that up -# at texture load time. -# type: bool -# texture_clean_transparent = false - -# When using bilinear/trilinear/anisotropic filters, low-resolution textures -# can be blurred, so automatically upscale them with nearest-neighbor -# interpolation to preserve crisp pixels. This sets the minimum texture size -# for the upscaled textures; higher values look sharper, but require more -# memory. Powers of 2 are recommended. Setting this higher than 1 may not -# have a visible effect unless bilinear/trilinear/anisotropic filtering is -# enabled. -# This is also used as the base node texture size for world-aligned -# texture autoscaling. -# type: int -# texture_min_size = 64 - -# Experimental option, might cause visible spaces between blocks -# when set to higher number than 0. -# 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 allow advanced visual effects and may increase performance on some video -# cards. -# This only works with the OpenGL video backend. -# 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 - -# Enables Hable's 'Uncharted 2' filmic tone mapping. -# Simulates the tone curve of photographic film and how this approximates the -# appearance of high dynamic range images. Mid-range contrast is slightly -# enhanced, highlights and shadows are gradually compressed. -# type: bool -# tone_mapping = false - -#### Bumpmapping - -# Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack. -# Requires shaders to be enabled. -# type: bool -# enable_bumpmapping = false - -#### Parallax Occlusion - -# Enables parallax occlusion mapping. -# Requires shaders to be enabled. -# type: bool -# enable_parallax_occlusion = false - -# 0 = parallax occlusion with slope information (faster). -# 1 = relief mapping (slower, more accurate). -# type: int min: 0 max: 1 -# parallax_occlusion_mode = 1 - -# Number of parallax occlusion iterations. -# type: int -# parallax_occlusion_iterations = 4 - -# Overall scale of parallax occlusion effect. -# type: float -# parallax_occlusion_scale = 0.08 - -# Overall bias of parallax occlusion effect, usually scale/2. -# type: float -# parallax_occlusion_bias = 0.04 - -#### Waving Nodes - -# Set to true to enable waving liquids (like water). -# Requires shaders to be enabled. -# type: bool -# enable_waving_water = false - -# The maximum height of the surface of waving liquids. -# 4.0 = Wave height is two nodes. -# 0.0 = Wave doesn't move at all. -# Default is 1.0 (1/2 node). -# Requires waving liquids to be enabled. -# type: float min: 0 max: 4 -# water_wave_height = 1.0 - -# Length of liquid waves. -# Requires waving liquids to be enabled. -# type: float min: 0.1 -# water_wave_length = 20.0 - -# How fast liquid waves will move. Higher = faster. -# If negative, liquid waves will move backwards. -# Requires waving liquids to be enabled. -# 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 - -# Set to true to enable waving plants. -# Requires shaders to be enabled. -# type: bool -# enable_waving_plants = false - -### Advanced - -# Arm inertia, gives a more realistic movement of -# the arm when the camera moves. -# type: bool -# arm_inertia = true - -# 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 game is paused. -# type: int min: 1 -# pause_fps_max = 20 - -# 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 - -# View distance in nodes. -# type: int min: 20 max: 4000 -# viewing_range = 100 - -# 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. -# type: int min: 1 -# screen_w = 1024 - -# Height component of the initial window size. -# type: int min: 1 -# screen_h = 600 - -# Save window size automatically when modified. -# type: bool -# autosave_screensize = true - -# Fullscreen mode. -# type: bool -# fullscreen = false - -# Bits per pixel (aka color depth) in fullscreen mode. -# type: int -# fullscreen_bpp = 24 - -# Vertical screen synchronization. -# type: bool -# vsync = false - -# Field of view in degrees. -# type: int min: 45 max: 160 -# fov = 72 - -# 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 - -# 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 - -# Path to texture directory. All textures are first searched from here. -# type: path -# texture_path = - -# The rendering back-end for Irrlicht. -# 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, and it’s the only driver with -# shader support currently. -# type: enum values: null, software, burningsvideo, direct3d8, direct3d9, 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 - -# Strength of 3D mode parallax. -# type: float -# 3d_paralax_strength = 0.025 - -# 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) - -# In-game chat console background alpha (opaqueness, between 0 and 255). -# type: int min: 0 max: 255 -# console_alpha = 200 - -# Formspec full-screen background opacity (between 0 and 255). -# type: int min: 0 max: 255 -# formspec_fullscreen_bg_opacity = 140 - -# Formspec full-screen background color (R,G,B). -# 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). -# type: string -# crosshair_color = (255,255,255) - -# Crosshair alpha (opaqueness, between 0 and 255). -# 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 hudbar 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). -# type: bool -# gui_scaling_filter = false - -# When gui_scaling_filter_txr2img is true, copy those images -# from hardware to software for scaling. When false, fall back -# to the old scaling method, for video drivers that don't -# properly support downloading textures back from hardware. -# type: bool -# gui_scaling_filter_txr2img = true - -# Delay showing tooltips, stated in milliseconds. -# type: int -# tooltip_show_delay = 400 - -# Append item name to tooltip. -# type: bool -# tooltip_append_itemname = false - -# Whether FreeType fonts are used, requires FreeType support to be compiled in. -# If disabled, bitmap and XML vectors fonts are used instead. -# type: bool -# freetype = true - -# 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 in point (pt). -# type: int min: 1 -# font_size = 16 - -# Path to the default font. -# If “freetype” setting is enabled: Must be a TrueType font. -# If “freetype” setting is disabled: Must be a bitmap or XML vectors 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_bolditalic = fonts/Arimo-BoldItalic.ttf - -# Font size of the monospace font in point (pt). -# type: int min: 1 -# mono_font_size = 15 - -# Path to the monospace font. -# If “freetype” setting is enabled: Must be a TrueType font. -# If “freetype” setting is disabled: Must be a bitmap or XML vectors 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_bolditalic = fonts/Cousine-BoldItalic.ttf - -# Font size of the fallback font in point (pt). -# type: int min: 1 -# fallback_font_size = 15 - -# Shadow offset (in pixels) of the fallback font. If 0, then shadow will not be drawn. -# type: int -# fallback_font_shadow = 1 - -# Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255. -# type: int min: 0 max: 255 -# fallback_font_shadow_alpha = 128 - -# Path of the fallback font. -# If “freetype” setting is enabled: Must be a TrueType font. -# If “freetype” setting is disabled: Must be a bitmap or XML vectors font. -# This font will be used for certain languages or if the default font is unavailable. -# type: filepath -# fallback_font_path = fonts/DroidSansFallbackFull.ttf - -# Font size of the recent chat text and chat prompt in point (pt). -# Value 0 will use the default font size. -# type: int -# 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, bmp, pcx, ppm, tga -# screenshot_format = png - -# 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 - -## Advanced - -# Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens. -# type: int min: 1 -# screen_dpi = 72 - -# 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 - -# -# Client -# - -## 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 fetch on http://127.0.0.1:30000/metrics -# type: string -# prometheus_listener_address = 127.0.0.1:30000 - -# 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.txt - -# 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. -# type: bool -# enable_register_confirmation = true - -## Advanced - -# 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 = 5000 - -# Whether to show the client debug info (has the same effect as hitting F5). -# type: bool -# show_debug = false - -# -# Server / Singleplayer -# - -# Name of the server, to be displayed when players join and in the serverlist. -# type: string -# server_name = Minetest server - -# Description of server, to be displayed when players join and in the serverlist. -# type: string -# server_description = mine here - -# Domain name of server, to be displayed in the serverlist. -# type: string -# server_address = game.minetest.net - -# Homepage of server, to be displayed in the serverlist. -# type: string -# server_url = https://minetest.net - -# Automatically report to the serverlist. -# type: bool -# server_announce = false - -# Announce to this serverlist. -# 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 - -## Network - -# Network port to listen (UDP). -# This value will be overridden when starting from the main menu. -# type: int -# port = 30000 - -# The network interface that the server listens on. -# type: string -# bind_address = - -# Enable to disallow old clients from connecting. -# Older clients are compatible in the sense that they will not crash when connecting -# to new servers, but they may not support all new features that you are expecting. -# type: bool -# strict_protocol_version_checking = false - -# Specifies URL from which client fetches media instead of using UDP. -# $filename should be accessible from $remote_media$filename via cURL -# (obviously, remote_media should end with a slash). -# Files that are not present will be fetched the usual way. -# type: string -# remote_media = - -# Enable/disable running an IPv6 server. -# Ignored if bind_address is set. -# Needs enable_ipv6 to be enabled. -# 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 - -## 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 new created maps. -# 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 = - -# New users need to input this password. -# type: string -# default_password = - -# The privileges that new users automatically get. -# See /privs in game for a full list on your server and mod configuration. -# type: string -# default_privs = interact, shout - -# Privileges that players with basic_privs can grant -# 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 - -# If enabled, actions are recorded for rollback. -# This option is only read when server starts. -# 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 - -# 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 - -# 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 = 4 - -# 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 = 3 - -# From how far blocks are sent to clients, stated in mapblocks (16 nodes). -# type: int -# max_block_send_distance = 10 - -# Maximum number of forceloaded mapblocks. -# type: int -# max_forceloaded_blocks = 16 - -# Interval of sending time of day to clients. -# type: int -# time_send_interval = 5 - -# Controls length of day/night cycle. -# Examples: -# 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged. -# type: int -# 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 - -# Kick players who sent more than X messages per 10 seconds. -# type: int -# chat_message_limit_trigger_kick = 50 - -### Physics - -# Horizontal and vertical acceleration on ground or when climbing, -# in nodes per second per second. -# type: float -# movement_acceleration_default = 3 - -# Horizontal acceleration in air when jumping or falling, -# in nodes per second per second. -# type: float -# movement_acceleration_air = 2 - -# Horizontal and vertical acceleration in fast mode, -# in nodes per second per second. -# type: float -# movement_acceleration_fast = 10 - -# Walking and flying speed, in nodes per second. -# type: float -# movement_speed_walk = 4 - -# Sneaking speed, in nodes per second. -# type: float -# movement_speed_crouch = 1.35 - -# Walking, flying and climbing speed in fast mode, in nodes per second. -# type: float -# movement_speed_fast = 20 - -# Vertical climbing speed, in nodes per second. -# type: float -# movement_speed_climb = 3 - -# Initial vertical speed when jumping, in nodes per second. -# type: float -# movement_speed_jump = 6.5 - -# Decrease this to increase liquid resistance to movement. -# type: float -# movement_liquid_fluidity = 1 - -# Maximum liquid resistance. Controls deceleration when entering liquid at -# high speed. -# type: float -# movement_liquid_fluidity_smooth = 0.5 - -# Controls sinking speed in liquid. -# type: float -# movement_liquid_sink = 10 - -# Acceleration of gravity, in nodes per second per second. -# type: float -# movement_gravity = 9.81 - -### Advanced - -# Handling for deprecated Lua API calls: -# - legacy: (try to) mimic old behaviour (default for release). -# - log: mimic and log backtrace of deprecated call (default for debug). -# - error: abort on usage of deprecated call (suggested for mod developers). -# type: enum values: legacy, log, error -# deprecated_lua_api_handling = legacy - -# 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 - -# 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 - -# 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 chatcommands 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 -# - -# 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: , ar, ca, cs, da, de, dv, el, en, eo, es, et, eu, fil, fr, hu, id, it, ja, ja_KS, jbo, kk, kn, lo, lt, ms, my, nb, nl, nn, pl, pt, pt_BR, ro, ru, sl, sr_Cyrl, sv, sw, th, tr, uk, vi -# 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 - -# Default timeout for cURL, stated in milliseconds. -# Only has an effect if compiled with cURL. -# type: int -# curl_timeout = 5000 - -# 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 in ms a file download (e.g. a mod download) may take. -# type: int -# curl_file_download_timeout = 300000 - -# Makes DirectX work with LuaJIT. Disable if it causes troubles. -# type: bool -# high_precision_fpu = true - -# Changes the main menu UI: -# - Full: Multiple singleplayer worlds, game choice, texture pack chooser, etc. -# - Simple: One singleplayer world, no game or texture pack choosers. May be -# necessary for smaller screens. -# type: enum values: full, simple -# main_menu_style = full - -# Replaces the default main menu with a custom one. -# 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 -# - -# 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: -# - The optional floatlands of v7 (disabled by default). -# type: enum values: v7, valleys, carpathian, v5, flat, fractal, singlenode, v6 -# mg_name = v7 - -# Water surface level of the world. -# type: int -# water_level = 1 - -# From how far blocks are generated for clients, stated in mapblocks (16 nodes). -# type: int -# max_block_generate_distance = 8 - -# Limit of map generation, in nodes, in all 6 directions from (0, 0, 0). -# Only mapchunks completely within the mapgen limit are generated. -# Value is stored per-world. -# type: int min: 0 max: 31000 -# mapgen_limit = 31000 - -# Global map generation attributes. -# In Mapgen v6 the 'decorations' flag controls all decorations except trees -# and junglegrass, in all other mapgens this flag controls all decorations. -# type: flags possible values: caves, dungeons, light, decorations, biomes, nocaves, nodungeons, nolight, nodecorations, nobiomes -# mg_flags = caves,dungeons,light,decorations,biomes - -## Biome API temperature and humidity noise parameters - -# Temperature variation for biomes. -# type: noise_params_2d -# mg_biome_np_heat = { -# offset = 50, -# scale = 50, -# spread = (1000, 1000, 1000), -# seed = 5349, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# Small-scale temperature variation for blending biomes on borders. -# type: noise_params_2d -# mg_biome_np_heat_blend = { -# offset = 0, -# scale = 1.5, -# spread = (8, 8, 8), -# seed = 13, -# octaves = 2, -# persistence = 1.0, -# lacunarity = 2.0, -# flags = eased -# } - -# Humidity variation for biomes. -# type: noise_params_2d -# mg_biome_np_humidity = { -# offset = 50, -# scale = 50, -# spread = (1000, 1000, 1000), -# seed = 842, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# Small-scale humidity variation for blending biomes on borders. -# type: noise_params_2d -# mg_biome_np_humidity_blend = { -# offset = 0, -# scale = 1.5, -# spread = (8, 8, 8), -# seed = 90003, -# octaves = 2, -# persistence = 1.0, -# lacunarity = 2.0, -# flags = eased -# } - -## Mapgen V5 - -# Map generation attributes specific to Mapgen v5. -# type: flags possible values: caverns, nocaverns -# mgv5_spflags = caverns - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -# type: float -# mgv5_cave_width = 0.09 - -# Y of upper limit of large caves. -# type: int -# mgv5_large_cave_depth = -256 - -# Minimum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgv5_small_cave_num_min = 0 - -# Maximum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgv5_small_cave_num_max = 0 - -# Minimum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgv5_large_cave_num_min = 0 - -# Maximum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgv5_large_cave_num_max = 2 - -# Proportion of large caves that contain liquid. -# type: float min: 0 max: 1 -# mgv5_large_cave_flooded = 0.5 - -# Y-level of cavern upper limit. -# type: int -# mgv5_cavern_limit = -256 - -# Y-distance over which caverns expand to full size. -# type: int -# mgv5_cavern_taper = 256 - -# Defines full size of caverns, smaller values create larger caverns. -# type: float -# mgv5_cavern_threshold = 0.7 - -# Lower Y limit of dungeons. -# type: int -# mgv5_dungeon_ymin = -31000 - -# Upper Y limit of dungeons. -# type: int -# mgv5_dungeon_ymax = 31000 - -### Noises - -# Variation of biome filler depth. -# type: noise_params_2d -# mgv5_np_filler_depth = { -# offset = 0, -# scale = 1, -# spread = (150, 150, 150), -# seed = 261, -# octaves = 4, -# persistence = 0.7, -# lacunarity = 2.0, -# flags = eased -# } - -# Variation of terrain vertical scale. -# When noise is < -0.55 terrain is near-flat. -# type: noise_params_2d -# mgv5_np_factor = { -# offset = 0, -# scale = 1, -# spread = (250, 250, 250), -# seed = 920381, -# octaves = 3, -# persistence = 0.45, -# lacunarity = 2.0, -# flags = eased -# } - -# Y-level of average terrain surface. -# type: noise_params_2d -# mgv5_np_height = { -# offset = 0, -# scale = 10, -# spread = (250, 250, 250), -# seed = 84174, -# octaves = 4, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# First of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgv5_np_cave1 = { -# offset = 0, -# scale = 12, -# spread = (61, 61, 61), -# seed = 52534, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# Second of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgv5_np_cave2 = { -# offset = 0, -# scale = 12, -# spread = (67, 67, 67), -# seed = 10325, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise defining giant caverns. -# type: noise_params_3d -# mgv5_np_cavern = { -# offset = 0, -# scale = 1, -# spread = (384, 128, 384), -# seed = 723, -# octaves = 5, -# persistence = 0.63, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise defining terrain. -# type: noise_params_3d -# mgv5_np_ground = { -# offset = 0, -# scale = 40, -# spread = (80, 80, 80), -# seed = 983240, -# octaves = 4, -# persistence = 0.55, -# lacunarity = 2.0, -# flags = eased -# } - -# 3D noise that determines number of dungeons per mapchunk. -# type: noise_params_3d -# mgv5_np_dungeons = { -# offset = 0.9, -# scale = 0.5, -# spread = (500, 500, 500), -# seed = 0, -# octaves = 2, -# persistence = 0.8, -# lacunarity = 2.0, -# flags = -# } - -## Mapgen V6 - -# Map generation attributes specific to Mapgen v6. -# The 'snowbiomes' flag enables the new 5 biome system. -# When the 'snowbiomes' flag is enabled jungles are automatically enabled and -# the 'jungles' flag is ignored. -# type: flags possible values: jungles, biomeblend, mudflow, snowbiomes, flat, trees, nojungles, nobiomeblend, nomudflow, nosnowbiomes, noflat, notrees -# mgv6_spflags = jungles,biomeblend,mudflow,snowbiomes,noflat,trees - -# Deserts occur when np_biome exceeds this value. -# When the 'snowbiomes' flag is enabled, this is ignored. -# type: float -# mgv6_freq_desert = 0.45 - -# Sandy beaches occur when np_beach exceeds this value. -# type: float -# mgv6_freq_beach = 0.15 - -# Lower Y limit of dungeons. -# type: int -# mgv6_dungeon_ymin = -31000 - -# Upper Y limit of dungeons. -# type: int -# mgv6_dungeon_ymax = 31000 - -### Noises - -# Y-level of lower terrain and seabed. -# type: noise_params_2d -# mgv6_np_terrain_base = { -# offset = -4, -# scale = 20, -# spread = (250, 250, 250), -# seed = 82341, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Y-level of higher terrain that creates cliffs. -# type: noise_params_2d -# mgv6_np_terrain_higher = { -# offset = 20, -# scale = 16, -# spread = (500, 500, 500), -# seed = 85039, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Varies steepness of cliffs. -# type: noise_params_2d -# mgv6_np_steepness = { -# offset = 0.85, -# scale = 0.5, -# spread = (125, 125, 125), -# seed = -932, -# octaves = 5, -# persistence = 0.7, -# lacunarity = 2.0, -# flags = eased -# } - -# Defines distribution of higher terrain. -# type: noise_params_2d -# mgv6_np_height_select = { -# offset = 0.5, -# scale = 1, -# spread = (250, 250, 250), -# seed = 4213, -# octaves = 5, -# persistence = 0.69, -# lacunarity = 2.0, -# flags = eased -# } - -# Varies depth of biome surface nodes. -# type: noise_params_2d -# mgv6_np_mud = { -# offset = 4, -# scale = 2, -# spread = (200, 200, 200), -# seed = 91013, -# octaves = 3, -# persistence = 0.55, -# lacunarity = 2.0, -# flags = eased -# } - -# Defines areas with sandy beaches. -# type: noise_params_2d -# mgv6_np_beach = { -# offset = 0, -# scale = 1, -# spread = (250, 250, 250), -# seed = 59420, -# octaves = 3, -# persistence = 0.50, -# lacunarity = 2.0, -# flags = eased -# } - -# Temperature variation for biomes. -# type: noise_params_2d -# mgv6_np_biome = { -# offset = 0, -# scale = 1, -# spread = (500, 500, 500), -# seed = 9130, -# octaves = 3, -# persistence = 0.50, -# lacunarity = 2.0, -# flags = eased -# } - -# Variation of number of caves. -# type: noise_params_2d -# mgv6_np_cave = { -# offset = 6, -# scale = 6, -# spread = (250, 250, 250), -# seed = 34329, -# octaves = 3, -# persistence = 0.50, -# lacunarity = 2.0, -# flags = eased -# } - -# Humidity variation for biomes. -# type: noise_params_2d -# mgv6_np_humidity = { -# offset = 0.5, -# scale = 0.5, -# spread = (500, 500, 500), -# seed = 72384, -# octaves = 3, -# persistence = 0.50, -# lacunarity = 2.0, -# flags = eased -# } - -# Defines tree areas and tree density. -# type: noise_params_2d -# mgv6_np_trees = { -# offset = 0, -# scale = 1, -# spread = (125, 125, 125), -# seed = 2, -# octaves = 4, -# persistence = 0.66, -# lacunarity = 2.0, -# flags = eased -# } - -# Defines areas where trees have apples. -# type: noise_params_2d -# mgv6_np_apple_trees = { -# offset = 0, -# scale = 1, -# spread = (100, 100, 100), -# seed = 342902, -# octaves = 3, -# persistence = 0.45, -# lacunarity = 2.0, -# flags = eased -# } - -## Mapgen V7 - -# Map generation attributes specific to Mapgen v7. -# 'ridges': Rivers. -# 'floatlands': Floating land masses in the atmosphere. -# 'caverns': Giant caves deep underground. -# type: flags possible values: mountains, ridges, floatlands, caverns, nomountains, noridges, nofloatlands, nocaverns -# mgv7_spflags = mountains,ridges,nofloatlands,caverns - -# Y of mountain density gradient zero level. Used to shift mountains vertically. -# type: int -# mgv7_mount_zero_level = 0 - -# Lower Y limit of floatlands. -# type: int -# mgv7_floatland_ymin = 1024 - -# Upper Y limit of floatlands. -# type: int -# 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 -# mgv7_floatland_taper = 256 - -# Exponent of the floatland tapering. Alters the tapering behaviour. -# Value = 1.0 creates a uniform, linear tapering. -# Values > 1.0 create a smooth tapering suitable for the default separated -# floatlands. -# Values < 1.0 (for example 0.25) create a more defined surface level with -# flatter lowlands, suitable for a solid floatland layer. -# type: float -# mgv7_float_taper_exp = 2.0 - -# Adjusts the density of the floatland layer. -# Increase value to increase density. Can be positive or negative. -# Value = 0.0: 50% of volume is floatland. -# Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test -# to be sure) creates a solid floatland layer. -# type: float -# mgv7_floatland_density = -0.6 - -# Surface level of optional water placed on a solid floatland layer. -# Water is disabled by default and will only be placed if this value is set -# to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the -# upper tapering). -# ***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***: -# When enabling water placement the floatlands must be configured and tested -# to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other -# 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 -# mgv7_floatland_ywater = -31000 - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -# type: float -# mgv7_cave_width = 0.09 - -# Y of upper limit of large caves. -# type: int -# mgv7_large_cave_depth = -33 - -# Minimum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgv7_small_cave_num_min = 0 - -# Maximum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgv7_small_cave_num_max = 0 - -# Minimum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgv7_large_cave_num_min = 0 - -# Maximum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgv7_large_cave_num_max = 2 - -# Proportion of large caves that contain liquid. -# type: float min: 0 max: 1 -# mgv7_large_cave_flooded = 0.5 - -# Y-level of cavern upper limit. -# type: int -# mgv7_cavern_limit = -256 - -# Y-distance over which caverns expand to full size. -# type: int -# mgv7_cavern_taper = 256 - -# Defines full size of caverns, smaller values create larger caverns. -# type: float -# mgv7_cavern_threshold = 0.7 - -# Lower Y limit of dungeons. -# type: int -# mgv7_dungeon_ymin = -31000 - -# Upper Y limit of dungeons. -# type: int -# mgv7_dungeon_ymax = 31000 - -### Noises - -# Y-level of higher terrain that creates cliffs. -# type: noise_params_2d -# mgv7_np_terrain_base = { -# offset = 4, -# scale = 70, -# spread = (600, 600, 600), -# seed = 82341, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Y-level of lower terrain and seabed. -# type: noise_params_2d -# mgv7_np_terrain_alt = { -# offset = 4, -# scale = 25, -# spread = (600, 600, 600), -# seed = 5934, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Varies roughness of terrain. -# Defines the 'persistence' value for terrain_base and terrain_alt noises. -# type: noise_params_2d -# mgv7_np_terrain_persist = { -# offset = 0.6, -# scale = 0.1, -# spread = (2000, 2000, 2000), -# seed = 539, -# octaves = 3, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Defines distribution of higher terrain and steepness of cliffs. -# type: noise_params_2d -# mgv7_np_height_select = { -# offset = -8, -# scale = 16, -# spread = (500, 500, 500), -# seed = 4213, -# octaves = 6, -# persistence = 0.7, -# lacunarity = 2.0, -# flags = eased -# } - -# Variation of biome filler depth. -# type: noise_params_2d -# mgv7_np_filler_depth = { -# offset = 0, -# scale = 1.2, -# spread = (150, 150, 150), -# seed = 261, -# octaves = 3, -# persistence = 0.7, -# lacunarity = 2.0, -# flags = eased -# } - -# Variation of maximum mountain height (in nodes). -# type: noise_params_2d -# mgv7_np_mount_height = { -# offset = 256, -# scale = 112, -# spread = (1000, 1000, 1000), -# seed = 72449, -# octaves = 3, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Defines large-scale river channel structure. -# type: noise_params_2d -# mgv7_np_ridge_uwater = { -# offset = 0, -# scale = 1, -# spread = (1000, 1000, 1000), -# seed = 85039, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# 3D noise defining mountain structure and height. -# Also defines structure of floatland mountain terrain. -# type: noise_params_3d -# mgv7_np_mountain = { -# offset = -0.6, -# scale = 1, -# spread = (250, 350, 250), -# seed = 5333, -# octaves = 5, -# persistence = 0.63, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise defining structure of river canyon walls. -# type: noise_params_3d -# mgv7_np_ridge = { -# offset = 0, -# scale = 1, -# spread = (100, 100, 100), -# seed = 6467, -# octaves = 4, -# persistence = 0.75, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise defining structure of floatlands. -# If altered from the default, the noise 'scale' (0.7 by default) may need -# to be adjusted, as floatland tapering functions best when this noise has -# a value range of approximately -2.0 to 2.0. -# type: noise_params_3d -# mgv7_np_floatland = { -# offset = 0, -# scale = 0.7, -# spread = (384, 96, 384), -# seed = 1009, -# octaves = 4, -# persistence = 0.75, -# lacunarity = 1.618, -# flags = -# } - -# 3D noise defining giant caverns. -# type: noise_params_3d -# mgv7_np_cavern = { -# offset = 0, -# scale = 1, -# spread = (384, 128, 384), -# seed = 723, -# octaves = 5, -# persistence = 0.63, -# lacunarity = 2.0, -# flags = -# } - -# First of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgv7_np_cave1 = { -# offset = 0, -# scale = 12, -# spread = (61, 61, 61), -# seed = 52534, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# Second of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgv7_np_cave2 = { -# offset = 0, -# scale = 12, -# spread = (67, 67, 67), -# seed = 10325, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise that determines number of dungeons per mapchunk. -# type: noise_params_3d -# mgv7_np_dungeons = { -# offset = 0.9, -# scale = 0.5, -# spread = (500, 500, 500), -# seed = 0, -# octaves = 2, -# persistence = 0.8, -# lacunarity = 2.0, -# flags = -# } - -## Mapgen Carpathian - -# Map generation attributes specific to Mapgen Carpathian. -# type: flags possible values: caverns, rivers, nocaverns, norivers -# mgcarpathian_spflags = caverns,norivers - -# Defines the base ground level. -# type: float -# mgcarpathian_base_level = 12.0 - -# Defines the width of the river channel. -# type: float -# mgcarpathian_river_width = 0.05 - -# Defines the depth of the river channel. -# type: float -# mgcarpathian_river_depth = 24.0 - -# Defines the width of the river valley. -# type: float -# mgcarpathian_valley_width = 0.25 - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -# type: float -# mgcarpathian_cave_width = 0.09 - -# Y of upper limit of large caves. -# type: int -# mgcarpathian_large_cave_depth = -33 - -# Minimum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgcarpathian_small_cave_num_min = 0 - -# Maximum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgcarpathian_small_cave_num_max = 0 - -# Minimum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgcarpathian_large_cave_num_min = 0 - -# Maximum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgcarpathian_large_cave_num_max = 2 - -# Proportion of large caves that contain liquid. -# type: float min: 0 max: 1 -# mgcarpathian_large_cave_flooded = 0.5 - -# Y-level of cavern upper limit. -# type: int -# mgcarpathian_cavern_limit = -256 - -# Y-distance over which caverns expand to full size. -# type: int -# mgcarpathian_cavern_taper = 256 - -# Defines full size of caverns, smaller values create larger caverns. -# type: float -# mgcarpathian_cavern_threshold = 0.7 - -# Lower Y limit of dungeons. -# type: int -# mgcarpathian_dungeon_ymin = -31000 - -# Upper Y limit of dungeons. -# type: int -# mgcarpathian_dungeon_ymax = 31000 - -### Noises - -# Variation of biome filler depth. -# type: noise_params_2d -# mgcarpathian_np_filler_depth = { -# offset = 0, -# scale = 1, -# spread = (128, 128, 128), -# seed = 261, -# octaves = 3, -# persistence = 0.7, -# lacunarity = 2.0, -# flags = eased -# } - -# First of 4 2D noises that together define hill/mountain range height. -# type: noise_params_2d -# mgcarpathian_np_height1 = { -# offset = 0, -# scale = 5, -# spread = (251, 251, 251), -# seed = 9613, -# octaves = 5, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# Second of 4 2D noises that together define hill/mountain range height. -# type: noise_params_2d -# mgcarpathian_np_height2 = { -# offset = 0, -# scale = 5, -# spread = (383, 383, 383), -# seed = 1949, -# octaves = 5, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# Third of 4 2D noises that together define hill/mountain range height. -# type: noise_params_2d -# mgcarpathian_np_height3 = { -# offset = 0, -# scale = 5, -# spread = (509, 509, 509), -# seed = 3211, -# octaves = 5, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# Fourth of 4 2D noises that together define hill/mountain range height. -# type: noise_params_2d -# mgcarpathian_np_height4 = { -# offset = 0, -# scale = 5, -# spread = (631, 631, 631), -# seed = 1583, -# octaves = 5, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# 2D noise that controls the size/occurrence of rolling hills. -# type: noise_params_2d -# mgcarpathian_np_hills_terrain = { -# offset = 1, -# scale = 1, -# spread = (1301, 1301, 1301), -# seed = 1692, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# 2D noise that controls the size/occurrence of ridged mountain ranges. -# type: noise_params_2d -# mgcarpathian_np_ridge_terrain = { -# offset = 1, -# scale = 1, -# spread = (1889, 1889, 1889), -# seed = 3568, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# 2D noise that controls the size/occurrence of step mountain ranges. -# type: noise_params_2d -# mgcarpathian_np_step_terrain = { -# offset = 1, -# scale = 1, -# spread = (1889, 1889, 1889), -# seed = 4157, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# 2D noise that controls the shape/size of rolling hills. -# type: noise_params_2d -# mgcarpathian_np_hills = { -# offset = 0, -# scale = 3, -# spread = (257, 257, 257), -# seed = 6604, -# octaves = 6, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# 2D noise that controls the shape/size of ridged mountains. -# type: noise_params_2d -# mgcarpathian_np_ridge_mnt = { -# offset = 0, -# scale = 12, -# spread = (743, 743, 743), -# seed = 5520, -# octaves = 6, -# persistence = 0.7, -# lacunarity = 2.0, -# flags = eased -# } - -# 2D noise that controls the shape/size of step mountains. -# type: noise_params_2d -# mgcarpathian_np_step_mnt = { -# offset = 0, -# scale = 8, -# spread = (509, 509, 509), -# seed = 2590, -# octaves = 6, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# 2D noise that locates the river valleys and channels. -# type: noise_params_2d -# mgcarpathian_np_rivers = { -# offset = 0, -# scale = 1, -# spread = (1000, 1000, 1000), -# seed = 85039, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# 3D noise for mountain overhangs, cliffs, etc. Usually small variations. -# type: noise_params_3d -# mgcarpathian_np_mnt_var = { -# offset = 0, -# scale = 1, -# spread = (499, 499, 499), -# seed = 2490, -# octaves = 5, -# persistence = 0.55, -# lacunarity = 2.0, -# flags = -# } - -# First of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgcarpathian_np_cave1 = { -# offset = 0, -# scale = 12, -# spread = (61, 61, 61), -# seed = 52534, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# Second of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgcarpathian_np_cave2 = { -# offset = 0, -# scale = 12, -# spread = (67, 67, 67), -# seed = 10325, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise defining giant caverns. -# type: noise_params_3d -# mgcarpathian_np_cavern = { -# offset = 0, -# scale = 1, -# spread = (384, 128, 384), -# seed = 723, -# octaves = 5, -# persistence = 0.63, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise that determines number of dungeons per mapchunk. -# type: noise_params_3d -# mgcarpathian_np_dungeons = { -# offset = 0.9, -# scale = 0.5, -# spread = (500, 500, 500), -# seed = 0, -# octaves = 2, -# persistence = 0.8, -# lacunarity = 2.0, -# flags = -# } - -## Mapgen Flat - -# Map generation attributes specific to Mapgen Flat. -# Occasional lakes and hills can be added to the flat world. -# type: flags possible values: lakes, hills, nolakes, nohills -# mgflat_spflags = nolakes,nohills - -# Y of flat ground. -# type: int -# mgflat_ground_level = 8 - -# Y of upper limit of large caves. -# type: int -# mgflat_large_cave_depth = -33 - -# Minimum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgflat_small_cave_num_min = 0 - -# Maximum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgflat_small_cave_num_max = 0 - -# Minimum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgflat_large_cave_num_min = 0 - -# Maximum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgflat_large_cave_num_max = 2 - -# Proportion of large caves that contain liquid. -# type: float min: 0 max: 1 -# mgflat_large_cave_flooded = 0.5 - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -# type: float -# mgflat_cave_width = 0.09 - -# Terrain noise threshold for lakes. -# Controls proportion of world area covered by lakes. -# Adjust towards 0.0 for a larger proportion. -# type: float -# mgflat_lake_threshold = -0.45 - -# Controls steepness/depth of lake depressions. -# type: float -# mgflat_lake_steepness = 48.0 - -# Terrain noise threshold for hills. -# Controls proportion of world area covered by hills. -# Adjust towards 0.0 for a larger proportion. -# type: float -# mgflat_hill_threshold = 0.45 - -# Controls steepness/height of hills. -# type: float -# mgflat_hill_steepness = 64.0 - -# Lower Y limit of dungeons. -# type: int -# mgflat_dungeon_ymin = -31000 - -# Upper Y limit of dungeons. -# type: int -# mgflat_dungeon_ymax = 31000 - -### Noises - -# Defines location and terrain of optional hills and lakes. -# type: noise_params_2d -# mgflat_np_terrain = { -# offset = 0, -# scale = 1, -# spread = (600, 600, 600), -# seed = 7244, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Variation of biome filler depth. -# type: noise_params_2d -# mgflat_np_filler_depth = { -# offset = 0, -# scale = 1.2, -# spread = (150, 150, 150), -# seed = 261, -# octaves = 3, -# persistence = 0.7, -# lacunarity = 2.0, -# flags = eased -# } - -# First of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgflat_np_cave1 = { -# offset = 0, -# scale = 12, -# spread = (61, 61, 61), -# seed = 52534, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# Second of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgflat_np_cave2 = { -# offset = 0, -# scale = 12, -# spread = (67, 67, 67), -# seed = 10325, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise that determines number of dungeons per mapchunk. -# type: noise_params_3d -# mgflat_np_dungeons = { -# offset = 0.9, -# scale = 0.5, -# spread = (500, 500, 500), -# seed = 0, -# octaves = 2, -# persistence = 0.8, -# lacunarity = 2.0, -# flags = -# } - -## Mapgen Fractal - -# Map generation attributes specific to Mapgen Fractal. -# 'terrain' enables the generation of non-fractal terrain: -# ocean, islands and underground. -# type: flags possible values: terrain, noterrain -# mgfractal_spflags = terrain - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -# type: float -# mgfractal_cave_width = 0.09 - -# Y of upper limit of large caves. -# type: int -# mgfractal_large_cave_depth = -33 - -# Minimum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgfractal_small_cave_num_min = 0 - -# Maximum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgfractal_small_cave_num_max = 0 - -# Minimum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgfractal_large_cave_num_min = 0 - -# Maximum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgfractal_large_cave_num_max = 2 - -# Proportion of large caves that contain liquid. -# type: float min: 0 max: 1 -# mgfractal_large_cave_flooded = 0.5 - -# Lower Y limit of dungeons. -# type: int -# mgfractal_dungeon_ymin = -31000 - -# Upper Y limit of dungeons. -# type: int -# mgfractal_dungeon_ymax = 31000 - -# Selects one of 18 fractal types. -# 1 = 4D "Roundy" Mandelbrot set. -# 2 = 4D "Roundy" Julia set. -# 3 = 4D "Squarry" Mandelbrot set. -# 4 = 4D "Squarry" Julia set. -# 5 = 4D "Mandy Cousin" Mandelbrot set. -# 6 = 4D "Mandy Cousin" Julia set. -# 7 = 4D "Variation" Mandelbrot set. -# 8 = 4D "Variation" Julia set. -# 9 = 3D "Mandelbrot/Mandelbar" Mandelbrot set. -# 10 = 3D "Mandelbrot/Mandelbar" Julia set. -# 11 = 3D "Christmas Tree" Mandelbrot set. -# 12 = 3D "Christmas Tree" Julia set. -# 13 = 3D "Mandelbulb" Mandelbrot set. -# 14 = 3D "Mandelbulb" Julia set. -# 15 = 3D "Cosine Mandelbulb" Mandelbrot set. -# 16 = 3D "Cosine Mandelbulb" Julia set. -# 17 = 4D "Mandelbulb" Mandelbrot set. -# 18 = 4D "Mandelbulb" Julia set. -# type: int min: 1 max: 18 -# mgfractal_fractal = 1 - -# Iterations of the recursive function. -# 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 -# mgfractal_iterations = 11 - -# (X,Y,Z) scale of fractal in nodes. -# Actual fractal size will be 2 to 3 times larger. -# These numbers can be made very large, the fractal does -# not have to fit inside the world. -# Increase these to 'zoom' into the detail of the fractal. -# Default is for a vertically-squashed shape suitable for -# an island, set all 3 numbers equal for the raw shape. -# type: v3f -# mgfractal_scale = (4096.0, 1024.0, 4096.0) - -# (X,Y,Z) offset of fractal from world center in units of 'scale'. -# Can be used to move a desired point to (0, 0) to create a -# suitable spawn point, or to allow 'zooming in' on a desired -# point by increasing 'scale'. -# The default is tuned for a suitable spawn point for Mandelbrot -# sets with default parameters, it may need altering in other -# situations. -# Range roughly -2 to 2. Multiply by 'scale' for offset in nodes. -# type: v3f -# mgfractal_offset = (1.79, 0.0, 0.0) - -# W coordinate of the generated 3D slice of a 4D fractal. -# Determines which 3D slice of the 4D shape is generated. -# Alters the shape of the fractal. -# Has no effect on 3D fractals. -# Range roughly -2 to 2. -# type: float -# mgfractal_slice_w = 0.0 - -# Julia set only. -# X component of hypercomplex constant. -# Alters the shape of the fractal. -# Range roughly -2 to 2. -# type: float -# mgfractal_julia_x = 0.33 - -# Julia set only. -# Y component of hypercomplex constant. -# Alters the shape of the fractal. -# Range roughly -2 to 2. -# type: float -# mgfractal_julia_y = 0.33 - -# Julia set only. -# Z component of hypercomplex constant. -# Alters the shape of the fractal. -# Range roughly -2 to 2. -# type: float -# mgfractal_julia_z = 0.33 - -# Julia set only. -# W component of hypercomplex constant. -# Alters the shape of the fractal. -# Has no effect on 3D fractals. -# Range roughly -2 to 2. -# type: float -# mgfractal_julia_w = 0.33 - -### Noises - -# Y-level of seabed. -# type: noise_params_2d -# mgfractal_np_seabed = { -# offset = -14, -# scale = 9, -# spread = (600, 600, 600), -# seed = 41900, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Variation of biome filler depth. -# type: noise_params_2d -# mgfractal_np_filler_depth = { -# offset = 0, -# scale = 1.2, -# spread = (150, 150, 150), -# seed = 261, -# octaves = 3, -# persistence = 0.7, -# lacunarity = 2.0, -# flags = eased -# } - -# First of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgfractal_np_cave1 = { -# offset = 0, -# scale = 12, -# spread = (61, 61, 61), -# seed = 52534, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# Second of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgfractal_np_cave2 = { -# offset = 0, -# scale = 12, -# spread = (67, 67, 67), -# seed = 10325, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# 3D noise that determines number of dungeons per mapchunk. -# type: noise_params_3d -# mgfractal_np_dungeons = { -# offset = 0.9, -# scale = 0.5, -# spread = (500, 500, 500), -# seed = 0, -# octaves = 2, -# persistence = 0.8, -# lacunarity = 2.0, -# flags = -# } - -## Mapgen Valleys - -# Map generation attributes specific to Mapgen Valleys. -# 'altitude_chill': Reduces heat with altitude. -# 'humid_rivers': Increases humidity around rivers. -# 'vary_river_depth': If enabled, low humidity and high heat causes rivers -# to become shallower and occasionally dry. -# 'altitude_dry': Reduces humidity with altitude. -# type: flags possible values: altitude_chill, humid_rivers, vary_river_depth, altitude_dry, noaltitude_chill, nohumid_rivers, novary_river_depth, noaltitude_dry -# mgvalleys_spflags = altitude_chill,humid_rivers,vary_river_depth,altitude_dry - -# 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 -# mgvalleys_altitude_chill = 90 - -# Depth below which you'll find large caves. -# type: int -# mgvalleys_large_cave_depth = -33 - -# Minimum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgvalleys_small_cave_num_min = 0 - -# Maximum limit of random number of small caves per mapchunk. -# type: int min: 0 max: 256 -# mgvalleys_small_cave_num_max = 0 - -# Minimum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgvalleys_large_cave_num_min = 0 - -# Maximum limit of random number of large caves per mapchunk. -# type: int min: 0 max: 64 -# mgvalleys_large_cave_num_max = 2 - -# Proportion of large caves that contain liquid. -# type: float min: 0 max: 1 -# mgvalleys_large_cave_flooded = 0.5 - -# Depth below which you'll find giant caverns. -# type: int -# mgvalleys_cavern_limit = -256 - -# Y-distance over which caverns expand to full size. -# type: int -# mgvalleys_cavern_taper = 192 - -# Defines full size of caverns, smaller values create larger caverns. -# type: float -# mgvalleys_cavern_threshold = 0.6 - -# How deep to make rivers. -# type: int -# mgvalleys_river_depth = 4 - -# How wide to make rivers. -# type: int -# mgvalleys_river_size = 5 - -# Controls width of tunnels, a smaller value creates wider tunnels. -# Value >= 10.0 completely disables generation of tunnels and avoids the -# intensive noise calculations. -# type: float -# mgvalleys_cave_width = 0.09 - -# Lower Y limit of dungeons. -# type: int -# mgvalleys_dungeon_ymin = -31000 - -# Upper Y limit of dungeons. -# type: int -# mgvalleys_dungeon_ymax = 63 - -### Noises - -# First of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgvalleys_np_cave1 = { -# offset = 0, -# scale = 12, -# spread = (61, 61, 61), -# seed = 52534, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# Second of two 3D noises that together define tunnels. -# type: noise_params_3d -# mgvalleys_np_cave2 = { -# offset = 0, -# scale = 12, -# spread = (67, 67, 67), -# seed = 10325, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = -# } - -# The depth of dirt or other biome filler node. -# type: noise_params_2d -# mgvalleys_np_filler_depth = { -# offset = 0, -# scale = 1.2, -# spread = (256, 256, 256), -# seed = 1605, -# octaves = 3, -# persistence = 0.5, -# lacunarity = 2.0, -# flags = eased -# } - -# 3D noise defining giant caverns. -# type: noise_params_3d -# mgvalleys_np_cavern = { -# offset = 0, -# scale = 1, -# spread = (768, 256, 768), -# seed = 59033, -# octaves = 6, -# persistence = 0.63, -# lacunarity = 2.0, -# flags = -# } - -# Defines large-scale river channel structure. -# type: noise_params_2d -# mgvalleys_np_rivers = { -# offset = 0, -# scale = 1, -# spread = (256, 256, 256), -# seed = -6050, -# octaves = 5, -# persistence = 0.6, -# lacunarity = 2.0, -# flags = eased -# } - -# Base terrain height. -# type: noise_params_2d -# mgvalleys_np_terrain_height = { -# offset = -10, -# scale = 50, -# spread = (1024, 1024, 1024), -# seed = 5202, -# octaves = 6, -# persistence = 0.4, -# lacunarity = 2.0, -# flags = eased -# } - -# Raises terrain to make valleys around the rivers. -# type: noise_params_2d -# mgvalleys_np_valley_depth = { -# offset = 5, -# scale = 4, -# spread = (512, 512, 512), -# seed = -1914, -# octaves = 1, -# persistence = 1.0, -# lacunarity = 2.0, -# flags = eased -# } - -# Slope and fill work together to modify the heights. -# type: noise_params_3d -# mgvalleys_np_inter_valley_fill = { -# offset = 0, -# scale = 1, -# spread = (256, 512, 256), -# seed = 1993, -# octaves = 6, -# persistence = 0.8, -# lacunarity = 2.0, -# flags = -# } - -# Amplifies the valleys. -# type: noise_params_2d -# mgvalleys_np_valley_profile = { -# offset = 0.6, -# scale = 0.5, -# spread = (512, 512, 512), -# seed = 777, -# octaves = 1, -# persistence = 1.0, -# lacunarity = 2.0, -# flags = eased -# } - -# Slope and fill work together to modify the heights. -# type: noise_params_2d -# mgvalleys_np_inter_valley_slope = { -# offset = 0.5, -# scale = 0.5, -# spread = (128, 128, 128), -# seed = 746, -# octaves = 1, -# persistence = 1.0, -# lacunarity = 2.0, -# flags = eased -# } - -# 3D noise that determines number of dungeons per mapchunk. -# type: noise_params_3d -# mgvalleys_np_dungeons = { -# offset = 0.9, -# scale = 0.5, -# spread = (500, 500, 500), -# seed = 0, -# octaves = 2, -# persistence = 0.8, -# lacunarity = 2.0, -# flags = -# } - -## Advanced - -# 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 -# chunksize = 5 - -# Dump the mapgen debug information. -# type: bool -# enable_mapgen_debug_info = false - -# Maximum number of blocks that can be queued for loading. -# type: int -# emergequeue_limit_total = 512 - -# Maximum number of blocks to be queued that are to be loaded from file. -# This limit is enforced per player. -# type: int -# emergequeue_limit_diskonly = 64 - -# Maximum number of blocks to be queued that are to be generated. -# This limit is enforced per player. -# type: int -# emergequeue_limit_generate = 64 - -# Number of emerge threads to use. -# Value 0: -# - Automatic selection. The number of emerge threads will be -# - 'number of processors - 2', with a lower limit of 1. -# Any other value: -# - Specifies the number of emerge threads, with a lower limit of 1. -# WARNING: Increasing the number of emerge threads increases engine mapgen -# 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 -# num_emerge_threads = 1 - -# -# Online Content Repository -# - -# The URL for the content repository -# type: string -# contentdb_url = https://content.minetest.net - -# 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 diff --git a/misc/AppImageBuilder.yml b/misc/AppImageBuilder.yml new file mode 100644 index 000000000..4fecb7ff5 --- /dev/null +++ b/misc/AppImageBuilder.yml @@ -0,0 +1,53 @@ +version: 1 + +AppDir: + path: ./AppDir + + app_info: + id: net.minetest.minetest + name: Minetest + icon: minetest + version: !ENV ${VERSION} + exec: usr/bin/minetest + exec_args: $@ + runtime: + env: + APPDIR_LIBRARY_PATH: $APPDIR/usr/lib/x86_64-linux-gnu + + apt: + arch: amd64 + sources: + - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal main universe + key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32' + - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates main universe + - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-backports main universe + - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-security main universe + + include: + - libc6 + - libcrypt1 + - libcurl3-gnutls + - libfreetype6 + - libgl1 + - libjpeg-turbo8 + - libjsoncpp1 + - libleveldb1d + - libluajit-5.1-2 + - libopenal1 + - libpng16-16 + - libsqlite3-0 + - libstdc++6 + - libvorbisfile3 + - libx11-6 + - libxi6 + - zlib1g + + files: + exclude: + - usr/share/man + - usr/share/doc + +AppImage: + update-information: None + sign-key: None + arch: x86_64 diff --git a/misc/Info.plist b/misc/Info.plist index 1498ee474..0491d2fc1 100644 --- a/misc/Info.plist +++ b/misc/Info.plist @@ -8,7 +8,13 @@ <string>minetest</string> <key>CFBundleIconFile</key> <string>minetest-icon.icns</string> + <key>CFBundleName</key> + <string>Minetest</string> + <key>CFBundleDisplayName</key> + <string>Minetest</string> <key>CFBundleIdentifier</key> <string>net.minetest.minetest</string> + <key>NSHighResolutionCapable</key> + <false/> </dict> </plist> diff --git a/misc/debpkg-control b/misc/debpkg-control deleted file mode 100644 index b228f4c79..000000000 --- a/misc/debpkg-control +++ /dev/null @@ -1,36 +0,0 @@ -Section: games -Priority: extra -Standards-Version: 3.6.2 -Package: minetest-staging -Version: 0.4.15-DATEPLACEHOLDER -Depends: libc6, libcurl3-gnutls, libfreetype6, libirrlicht1.8, LEVELDB_PLACEHOLDER, liblua5.1-0, libluajit-5.1-2, libopenal1, libstdc++6, libvorbisfile3, libx11-6, zlib1g -Maintainer: Loic Blot <loic.blot@unix-experience.fr> -Homepage: http://minetest.net/ -Vcs-Git: https://github.com/minetest/minetest.git -Vcs-Browser: https://github.com/minetest/minetest.git -Architecture: amd64 -Build-Depends: - cmake, - gettext, - libbz2-dev, - libcurl4-gnutls-dev, - libfreetype6-dev, - libglu1-mesa-dev, - libirrlicht-dev (>= 1.7.0), - libjpeg-dev, - libjsoncpp-dev, - libleveldb-dev, - libluajit-5.1-dev | liblua5.1-dev, - libogg-dev, - libopenal-dev, - libpng-dev, - libsqlite3-dev, - libvorbis-dev, - libx11-dev, - zlib1g-dev -Description: Multiplayer infinite-world block sandbox (server) - Minetest is a minecraft-inspired game written from scratch and licensed - under the LGPL (version 2.1 or later). It supports both survival and creative - modes along with multiplayer support, dynamic lighting, and an "infinite" map - generator. -Conflicts: minetestc55, minetest, minetest-server, minetest-data 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/minetest.exe.manifest b/misc/minetest.exe.manifest index 3c32b0f8b..dcad3fcde 100644 --- a/misc/minetest.exe.manifest +++ b/misc/minetest.exe.manifest @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity type="win32" name="minetest" version="0.0.0.0" /> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> @@ -10,6 +11,7 @@ <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> + <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage> </windowsSettings> </application> </assembly> diff --git a/misc/net.minetest.minetest.appdata.xml b/misc/net.minetest.minetest.appdata.xml index c177c3713..9524182cc 100644 --- a/misc/net.minetest.minetest.appdata.xml +++ b/misc/net.minetest.minetest.appdata.xml @@ -11,37 +11,55 @@ </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> <screenshot type="default"> - <image width="1920" height="1080">http://www.minetest.net/media/gallery/1.jpg</image> + <image>http://www.minetest.net/media/gallery/1.jpg</image> </screenshot> <screenshot> - <image width="1920" height="1080">http://www.minetest.net/media/gallery/3.jpg</image> + <image>http://www.minetest.net/media/gallery/3.jpg</image> </screenshot> <screenshot> - <image width="1920" height="1080">http://www.minetest.net/media/gallery/5.jpg</image> + <image>http://www.minetest.net/media/gallery/5.jpg</image> </screenshot> </screenshots> <keywords> @@ -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="2020-07-09" version="5.3.0"/> + <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 9bda5109d..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: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-27 20:41+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,43 @@ 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.2-dev\n" +"X-Generator: Weblate 4.12-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "امسح طابور الرسائل الصادرة" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "أمر فارغ." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "اخرج للقائمة الرئيسة" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "أمر غير صالح: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "قائمة اللاعبين المتصلين" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "اللاعبون المتصلون: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "طابور الرسائل الصادرة فارغ." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "هذا الأمر معطل من الخادم." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -28,10 +64,40 @@ msgstr "أعِد الإحياء" msgid "You died" msgstr "مِت" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "الأوامر المتوفرة:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "الأوامر المتاحة: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "الأوامر غير المتاحة: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[all | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "موافق" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<ليس متاحًا>" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "حدث خطأ في برنامج Lua النصي:" @@ -52,9 +118,30 @@ msgstr "أعد الإتصال" msgid "The server has requested a reconnect:" msgstr "يطلب الخادم إعادة الإتصال:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -69,8 +156,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "الخادم يدعم نسخ الميفاق ما بين $1 و $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "جرب إعادة تمكين قائمة الحوادم العامة وتحقق من إتصالك بالانترنت." +msgid "Visit website" +msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -80,17 +167,26 @@ msgstr "نحن ندعم نسخة الميفاق $1فقط." msgid "We support protocol versions between version $1 and $2." msgstr "نحن ندعم نسخ الميفاق ما بين $1 و $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "ألغِ" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "الإعتماديات:" @@ -163,17 +259,57 @@ msgstr "العالم:" msgid "enabled" msgstr "مُفعل" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" موجود مسبقًا. هل تريد الكتابة عليه؟" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "الاعتماديتان \"$1\" و $2 ستثبتان." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "ينزل $1..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "يحتاج $1 لكن لم يُعثر عليها." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 سيُثبت، واعتماديات $1 ستُتجاهل." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "كل الحزم" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "مثبت مسبقا" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "عُد للقائمة الرئيسة" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "اللعبة القاعدية :" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgstr "لا يمكن استخدام ContentDB عند بناء Minetest بدون cURL" #: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." @@ -184,7 +320,6 @@ msgid "Failed to download $1" msgstr "فشل تحميل $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "الألعاب" @@ -193,22 +328,48 @@ msgid "Install" msgstr "ثبت" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "ثبت $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "ثبت الإعتماديات المفقودة" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "التثبيت: نوع الملف غير مدعوم أو هو أرشيف تالف" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "التعديلات" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" -msgstr "" +msgstr "تعذر استيراد الحزم" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" msgstr "بدون نتائج" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "إبحث" +msgid "No updates" +msgstr "لا توجد تحديثات" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "لم يُعثر عليه" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "اكتب عليه" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "تحقق من صحة اللعبة القاعدية." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "في الطابور" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -223,8 +384,12 @@ msgid "Update" msgstr "حدِث" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "إعرض" +msgid "Update All [$1]" +msgstr "حدِّث الكل [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "اعرض مزيدًا من المعلومات عبر المتصفح" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -232,31 +397,31 @@ 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" -msgstr "" +msgstr "دمج المواطن البيئية" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" -msgstr "" +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" @@ -267,38 +432,29 @@ 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" -msgstr "" +msgstr "الزنزانات" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" msgstr "أرض مسطحة" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floating landmasses in the sky" msgstr "أرض عائمة في السماء" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 "" +msgstr "ولد تضاريس غير كسورية: محيطات وباطن الأرض" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" @@ -306,10 +462,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 @@ -338,11 +503,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" @@ -367,21 +532,21 @@ msgstr "أنهار بمستوى البحر" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Seed" -msgstr "" +msgstr "البذرة" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "تغيير سلس للمناطق البيئية" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" -msgstr "" +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" @@ -393,11 +558,11 @@ 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" @@ -411,10 +576,6 @@ msgstr "تمايز عمق النهر" 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 "إسم العالم" @@ -445,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 "أقبل" @@ -477,6 +670,16 @@ 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 "عطِّل" @@ -501,8 +704,9 @@ msgid "Offset" msgstr "المُعادل" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" -msgstr "" +#, fuzzy +msgid "Persistence" +msgstr "استمرار" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." @@ -520,6 +724,10 @@ msgstr "إستعِد الإفتراضي" msgid "Scale" msgstr "تكبير/تصغير" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "إبحث" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "إختر الدليل" @@ -528,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 "إعرض الأسماء التقنية" @@ -542,27 +750,28 @@ msgstr "يحب أن لا تزيد القيمة عن $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X" -msgstr "" +msgstr "X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X spread" -msgstr "" +msgstr "التوزع على محور X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y" -msgstr "" +msgstr "Y" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "Y spread" -msgstr "" +msgstr "التوزع على محور Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z" -msgstr "" +msgstr "Z" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z spread" -msgstr "" +msgstr "التوزع على محور Z" #. ~ "absvalue" is a noise parameter flag. #. It is short for "absolute value". @@ -570,7 +779,7 @@ 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 @@ -585,7 +794,7 @@ msgstr "إفتراضي" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "eased" -msgstr "" +msgstr "مخفف" #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" @@ -607,17 +816,9 @@ msgstr "تثبيت تعديل: لا يمكن ايجاد الاسم الحقيق msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "تثبيت تعديل: لا يمكن العصور على اسم مجلد مناسب لحزمة التعديلات $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$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" @@ -625,7 +826,7 @@ msgstr "فشل تثبيت $1 كحزمة إكساء" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a game as a $1" -msgstr "فشل تثبيت اللعبة كـ $1" +msgstr "فشل تثبيت اللعبة ك $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" @@ -633,6 +834,58 @@ msgstr "فشل تثبيت التعديل كـ $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a modpack as a $1" +msgstr "تعذر تثبيت حزمة التعديلات مثل $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "يحمل..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "قائمة الخوادم العمومية معطلة" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "جرب إعادة تمكين قائمة الحوادم العامة وتحقق من إتصالك بالانترنت." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "حول" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "المساهمون النشطون" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "محرك التصيير النشط:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "المطورون الرئيسيون" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "المساهمون السابقون" + +#: 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 @@ -665,7 +918,7 @@ msgstr "لايتوفر وصف للحزمة" #: builtin/mainmenu/tab_content.lua msgid "Rename" -msgstr "" +msgstr "أعد التسمية" #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" @@ -675,44 +928,20 @@ msgstr "أزل الحزمة" msgid "Use Texture Pack" msgstr "إستعمال حزمة الإكساء" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "المساهمون النشطون" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "المطورون الرئيسيون" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "إشادات" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "المساهمون السابقون" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "المطورون الرئيسيون السابقون" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "" +msgstr "أعلن عن الخادوم" #: builtin/mainmenu/tab_local.lua -msgid "Bind Address" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "اضبط" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua #, fuzzy +msgid "Bind Address" +msgstr "العنوان المطلوب" + +#: builtin/mainmenu/tab_local.lua msgid "Creative Mode" msgstr "النمط الإبداعي" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "مكن الضرر" @@ -728,10 +957,6 @@ msgstr "استضف خدوم" msgid "Install games from ContentDB" msgstr "ثبت العابا من ContentDB" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "الاسم\\كلمة المرور" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "جديد" @@ -744,10 +969,14 @@ msgstr "لم تنشئ او تحدد عالما!" msgid "Play Game" msgstr "إلعب" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "المنفذ" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "اختر التعديلات" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "حدد العالم:" @@ -761,51 +990,66 @@ msgid "Start Game" msgstr "ابدأ اللعبة" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "العنوان \\ المنفذ" +msgid "Address" +msgstr "عنوان" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "اتصل" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "امسح" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "النمط الإبداعي" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "الضرر ممكن" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "الضرر / قتال اللاعبين" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "حذف المفضلة" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "المفضلة" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "خوادم غير متوافقة" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "انضم للعبة" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "الاسم \\ كلمة المرور" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "خوادم عمومية" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "حدِّث" + +#: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "PvP enabled" -msgstr "قتال اللاعبين ممكن" +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 "" +msgstr "2x" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" @@ -813,11 +1057,11 @@ msgstr "سحب 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" @@ -825,11 +1069,7 @@ msgstr "كل الإعدادات" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" +msgstr "التنعييم:" #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" @@ -837,11 +1077,7 @@ msgstr "حفظ حجم الشاشة تلقائيا" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" +msgstr "مرشح خطي ثنائي" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" @@ -851,13 +1087,30 @@ msgstr "غيِر المفاتيح" msgid "Connected Glass" msgstr "زجاج متصل" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "ظلال ديناميكية" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "ظلال ديناميكية: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" +msgstr "اوراق بتفاصيل واضحة" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "عالي" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "ولِد خرائط عادية" +msgid "Medium" +msgstr "متوسط" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -867,10 +1120,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "بدون مرشح" @@ -885,10 +1134,9 @@ msgstr "إبراز العقد" #: builtin/mainmenu/tab_settings.lua msgid "Node Outlining" -msgstr "" +msgstr "اقتضاب العقد" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "None" msgstr "بدون" @@ -900,17 +1148,9 @@ msgstr "اوراق معتِمة" msgid "Opaque Water" msgstr "مياه معتمة" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "أعد تعيين عالم اللاعب المنفرد" +msgstr "جسيمات" #: builtin/mainmenu/tab_settings.lua msgid "Screen:" @@ -924,12 +1164,15 @@ msgstr "إعدادات" msgid "Shaders" msgstr "مُظللات" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "المظللات (تجريبية)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "مظللات (غير متوفر)" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Simple Leaves" msgstr "أوراق بسيطة" @@ -941,21 +1184,27 @@ msgstr "إضاءة سلسة" msgid "Texturing:" msgstr "الإكساء:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "لاستخدام المظللات يجب استخدام تعريف OpenGL." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "" +#, fuzzy +msgid "Touch threshold (px):" +msgstr "حساسية اللمس: (بكسل)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" -msgstr "" +msgstr "مرشح خطي ثلاثي" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "عالية جدا" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "منخفضة جدًا" #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" @@ -969,24 +1218,12 @@ msgstr "سوائل متموجة" msgid "Waving Plants" msgstr "نباتات متموجة" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "نعم" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "اضبط التعديلات" - -#: builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Main" -msgstr "الرئيسية" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "انتهت مهلة الاتصال." @@ -1015,15 +1252,14 @@ msgid "Connection error (timed out?)" msgstr "خطأ في الاتصال (انتهاء المهلة؟)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "لا يمكن إيجاد أو تحميل لعبة \"" +msgid "Could not find or load game: " +msgstr "تعذر العثور على اللعبة أو تحميلها " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." msgstr "مواصفات اللعبة غير صالحة." #: src/client/clientlauncher.cpp -#, fuzzy msgid "Main Menu" msgstr "القائمة الرئيسية" @@ -1041,102 +1277,123 @@ 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 "" - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" +msgstr "مسار العالم المدخل غير موجود: " #: src/client/game.cpp msgid "" "\n" "Check debug.txt for details." msgstr "" +"\n" +"راجع debug.txt لمزيد من التفاصيل." #: src/client/game.cpp msgid "- Address: " -msgstr "" - -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" +msgstr "- العنوان: " #: src/client/game.cpp msgid "- Mode: " -msgstr "" +msgstr "- النمط: " #: src/client/game.cpp msgid "- Port: " -msgstr "" +msgstr "- المنفذ: " #: src/client/game.cpp msgid "- Public: " -msgstr "" +msgstr "- عام: " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "" +msgstr "- قتال اللاعبين: " #: src/client/game.cpp msgid "- Server Name: " -msgstr "" +msgstr "- اسم الخادم: " + +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "حدث خطأ في التسلسل:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +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 "حدود الكتل مخفية" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "حدود كل الكتل ظاهرة" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "حدود الكتلة الحالية ظاهرة" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +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 +#, 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 "فُصل الاتصال عن العميل" #: 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 "فشل الاتصال لسبب مجهول" #: src/client/game.cpp msgid "Continue" -msgstr "" +msgstr "تابع" #: src/client/game.cpp #, c-format @@ -1146,32 +1403,51 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- 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 "تعذر تحليل العنوان:%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 msgid "Debug info, profiler graph, and wireframe hidden" @@ -1192,122 +1468,115 @@ msgid "" "- touch&drag, tap 2nd finger\n" " --> place single item to slot\n" msgstr "" +"اعدادات التحكم الافتراضية: \n" +"بدون قائمة مرئية: \n" +"- لمسة واحدة: زر تفعيل\n" +"- لمسة مزدوجة: ضع/استخدم\n" +"- تحريك إصبع: دوران\n" +"المخزن أو قائمة مرئية: \n" +"- لمسة مزدوجة (خارج القائمة): \n" +" --> اغلق القائمة\n" +"- لمس خانة أو تكديس: \n" +" --> حرك التكديس\n" +"- لمس وسحب, ولمس باصبع ثان: \n" +" --> وضع عنصر واحد في خانة\n" #: 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" -msgstr "" +msgstr "اخرج للقائمة" #: src/client/game.cpp msgid "Exit to OS" -msgstr "" +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 "" +msgstr "نمط السرعة مفعل (ملاحظة: لا تمتلك امتياز 'السرعة')" #: 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 "" +msgstr "نمط الطيران مفعل (ملاحظة: لا تمتلك امتياز 'الطيران')" #: 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:" -msgstr "" +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" -msgstr "" +msgstr "كب\\ثا" #: src/client/game.cpp msgid "Media..." -msgstr "" +msgstr "وسائط…" #: src/client/game.cpp msgid "MiB/s" -msgstr "" +msgstr "مب\\ثا" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "" +msgstr "الخريطة المصغرة معطلة من قبل لعبة أو تعديل" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +msgstr "متعدد اللاعبين" #: src/client/game.cpp msgid "Noclip mode disabled" -msgstr "" +msgstr "وضع العقبات مفعل" #: src/client/game.cpp msgid "Noclip mode enabled" -msgstr "" +msgstr "وضع القبات معطل" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" @@ -1315,15 +1584,15 @@ msgstr "" #: src/client/game.cpp msgid "Node definitions..." -msgstr "" +msgstr "تعريفات العقدة..." #: src/client/game.cpp msgid "Off" -msgstr "" +msgstr "معطّل" #: src/client/game.cpp msgid "On" -msgstr "" +msgstr "مفعل" #: src/client/game.cpp msgid "Pitch move mode disabled" @@ -1335,63 +1604,78 @@ msgstr "" #: src/client/game.cpp msgid "Profiler graph shown" -msgstr "" +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" -msgstr "" +msgstr "لاعب منفرد" #: src/client/game.cpp msgid "Sound Volume" -msgstr "" +msgstr "حجم الصوت" #: src/client/game.cpp msgid "Sound muted" -msgstr "" +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" +msgstr "الصوت غير مكتوم" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +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 "" #: 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" @@ -1399,60 +1683,56 @@ msgstr "" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "" +msgstr "التكبير معطل من قبل لعبة أو تعديل" #: src/client/game.cpp msgid "ok" -msgstr "" +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" -msgstr "" +msgstr "الواجهة مخفية" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "" +msgstr "الواجهة ظاهرة" #: src/client/gameui.cpp msgid "Profiler hidden" -msgstr "" +msgstr "محلل البيانات مخفي" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" +msgstr "محلل البيانات ظاهر ( صفحة %d من %d)" #: src/client/keycode.cpp msgid "Apps" -msgstr "" +msgstr "تطبيقات" #: src/client/keycode.cpp msgid "Backspace" -msgstr "" +msgstr "Backspace" #: src/client/keycode.cpp msgid "Caps Lock" -msgstr "" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" +msgstr "Caps Lock" #: src/client/keycode.cpp msgid "Control" -msgstr "" +msgstr "التحكم" #: src/client/keycode.cpp msgid "Down" -msgstr "" +msgstr "أسفل" #: src/client/keycode.cpp msgid "End" @@ -1464,284 +1744,347 @@ msgstr "" #: src/client/keycode.cpp msgid "Execute" -msgstr "" +msgstr "شغّل" #: src/client/keycode.cpp msgid "Help" -msgstr "" +msgstr "مساعدة" #: src/client/keycode.cpp msgid "Home" -msgstr "" +msgstr "الرئيسية" #: src/client/keycode.cpp +#, fuzzy msgid "IME Accept" -msgstr "" +msgstr "IME Accept" #: src/client/keycode.cpp +#, fuzzy msgid "IME Convert" -msgstr "" +msgstr "IME Convert" #: src/client/keycode.cpp +#, fuzzy msgid "IME Escape" -msgstr "" +msgstr "IME Escape" #: src/client/keycode.cpp +#, fuzzy msgid "IME Mode Change" -msgstr "" +msgstr "IME Mode Change" #: src/client/keycode.cpp +#, fuzzy msgid "IME Nonconvert" -msgstr "" +msgstr "IME Nonconvert" #: src/client/keycode.cpp +#, fuzzy msgid "Insert" -msgstr "" +msgstr "Insert" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Left" -msgstr "" +msgstr "يسار" #: src/client/keycode.cpp msgid "Left Button" -msgstr "" +msgstr "الزر الأيسر" #: src/client/keycode.cpp +#, fuzzy msgid "Left Control" -msgstr "" +msgstr "Left Control" #: src/client/keycode.cpp msgid "Left Menu" -msgstr "" +msgstr "القائمة اليسرى" #: src/client/keycode.cpp +#, fuzzy msgid "Left Shift" -msgstr "" +msgstr "Left Shift" #: src/client/keycode.cpp +#, fuzzy msgid "Left Windows" -msgstr "" +msgstr "Left Windows" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp +#, fuzzy msgid "Menu" -msgstr "" +msgstr "Menu" #: src/client/keycode.cpp +#, fuzzy msgid "Middle Button" -msgstr "" +msgstr "Middle Button" #: src/client/keycode.cpp +#, fuzzy msgid "Num Lock" -msgstr "" +msgstr "Num Lock" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad *" -msgstr "" +msgstr "Numpad *" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad +" -msgstr "" +msgstr "Numpad +" #: src/client/keycode.cpp msgid "Numpad -" msgstr "" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad ." -msgstr "" +msgstr "Numpad ." #: src/client/keycode.cpp +#, fuzzy msgid "Numpad /" -msgstr "" +msgstr "Numpad /" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 0" -msgstr "" +msgstr "Numpad 0" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 1" -msgstr "" +msgstr "Numpad 1" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 2" -msgstr "" +msgstr "Numpad 2" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 3" -msgstr "" +msgstr "Numpad 3" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 4" -msgstr "" +msgstr "Numpad 4" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 5" -msgstr "" +msgstr "Numpad 5" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 6" -msgstr "" +msgstr "Numpad 6" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 7" -msgstr "" +msgstr "Numpad 7" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 8" -msgstr "" +msgstr "Numpad 8" #: src/client/keycode.cpp +#, fuzzy msgid "Numpad 9" -msgstr "" +msgstr "Numpad 9" #: src/client/keycode.cpp +#, fuzzy msgid "OEM Clear" -msgstr "" +msgstr "OEM Clear" #: src/client/keycode.cpp +#, fuzzy msgid "Page down" -msgstr "" +msgstr "Page down" #: src/client/keycode.cpp +#, fuzzy msgid "Page up" -msgstr "" +msgstr "Page up" #: src/client/keycode.cpp +#, fuzzy msgid "Pause" -msgstr "" +msgstr "Pause" #: src/client/keycode.cpp +#, fuzzy msgid "Play" -msgstr "" +msgstr "Play" #. ~ "Print screen" key #: src/client/keycode.cpp +#, fuzzy msgid "Print" -msgstr "" +msgstr "Print" #: src/client/keycode.cpp +#, fuzzy msgid "Return" -msgstr "" +msgstr "Return" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +#, fuzzy msgid "Right" -msgstr "" +msgstr "Right" #: src/client/keycode.cpp msgid "Right Button" msgstr "" #: src/client/keycode.cpp +#, fuzzy msgid "Right Control" -msgstr "" +msgstr "Right Control" #: src/client/keycode.cpp +#, fuzzy msgid "Right Menu" -msgstr "" +msgstr "Right Menu" #: src/client/keycode.cpp +#, fuzzy msgid "Right Shift" -msgstr "" +msgstr "Right Shift" #: src/client/keycode.cpp +#, fuzzy msgid "Right Windows" -msgstr "" +msgstr "Right Windows" #: src/client/keycode.cpp +#, fuzzy msgid "Scroll Lock" -msgstr "" +msgstr "Scroll Lock" #. ~ Key name #: src/client/keycode.cpp +#, fuzzy msgid "Select" -msgstr "" +msgstr "Select" #: src/client/keycode.cpp +#, fuzzy msgid "Shift" -msgstr "" +msgstr "Shift" #: src/client/keycode.cpp +#, fuzzy msgid "Sleep" -msgstr "" +msgstr "Sleep" #: src/client/keycode.cpp +#, fuzzy msgid "Snapshot" -msgstr "" +msgstr "Snapshot" #: src/client/keycode.cpp msgid "Space" msgstr "" #: src/client/keycode.cpp +#, fuzzy msgid "Tab" -msgstr "" +msgstr "Tab" #: src/client/keycode.cpp +#, fuzzy msgid "Up" -msgstr "" +msgstr "Up" #: src/client/keycode.cpp +#, fuzzy msgid "X Button 1" -msgstr "" +msgstr "X Button 1" #: src/client/keycode.cpp +#, fuzzy msgid "X Button 2" -msgstr "" +msgstr "X Button 2" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" -msgstr "" +msgstr "كبِر" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "الخريطة المصغرة مخفية" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "الخريطة المصغرة في وضع الرادار، تكبير x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "الخريطة المصغرة في وضع الأسطح، تكبير x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "الخريطة المصغرة في وضع الاكساء" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "فشل فتح صفحة الويب" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "يفتح صفحة الويب" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" -msgstr "" +msgstr "تابع" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = التسلق نزولا" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" -msgstr "" +msgstr "المشي التلقائي" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" -msgstr "" +msgstr "القفز التلقائي" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" -msgstr "" +msgstr "للخلف" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "حدود الكتلة" #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" -msgstr "" +msgstr "غير الكاميرا" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" -msgstr "" +msgstr "دردشة" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" -msgstr "" +msgstr "الأوامر" #: src/gui/guiKeyChangeMenu.cpp msgid "Console" @@ -1749,46 +2092,46 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. range" -msgstr "" +msgstr "قلل المدى" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. volume" -msgstr "" +msgstr "قلل الحجم" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "" +msgstr "اضغط مرتين على \"اقفز\" لتفعيل الطيران" #: src/gui/guiKeyChangeMenu.cpp msgid "Drop" -msgstr "" +msgstr "اسقاط" #: src/gui/guiKeyChangeMenu.cpp msgid "Forward" -msgstr "" +msgstr "للأمام" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. range" -msgstr "" +msgstr "زد المدى" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" -msgstr "" +msgstr "زد الحجم" #: src/gui/guiKeyChangeMenu.cpp msgid "Inventory" -msgstr "" +msgstr "المخزن" #: src/gui/guiKeyChangeMenu.cpp msgid "Jump" -msgstr "" +msgstr "اقفز" #: src/gui/guiKeyChangeMenu.cpp msgid "Key already in use" -msgstr "" +msgstr "المفتاح مستخدم مسبقا" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1797,55 +2140,51 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" -msgstr "" +msgstr "اكتم" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" -msgstr "" +msgstr "العنصر التالي" #: src/gui/guiKeyChangeMenu.cpp msgid "Prev. item" -msgstr "" +msgstr "العنصر السابق" #: src/gui/guiKeyChangeMenu.cpp msgid "Range select" -msgstr "" +msgstr "حدد المدى" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Screenshot" -msgstr "" +msgstr "صوّر الشاشة" #: src/gui/guiKeyChangeMenu.cpp msgid "Sneak" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" +msgstr "تسلل" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" -msgstr "" +msgstr "بدّل عرض الواجهة" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle chat log" -msgstr "" +msgstr "بدّل عرض سجل المحادثة" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "" +msgstr "بدّل وضع السرعة" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fly" -msgstr "" +msgstr "بدّل حالة الطيران" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" -msgstr "" +msgstr "بدّل ظهور الضباب" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle minimap" -msgstr "" +msgstr "بدّل ظهور الخريطة المصغرة" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle noclip" @@ -1857,41 +2196,36 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" -msgstr "" +msgstr "اضغط على زر" #: src/gui/guiPasswordChange.cpp msgid "Change" -msgstr "" - -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" +msgstr "غيِّر" #: src/gui/guiPasswordChange.cpp msgid "New Password" -msgstr "" +msgstr "كلمة مرور جديدة" #: src/gui/guiPasswordChange.cpp msgid "Old Password" -msgstr "" +msgstr "كلمة المرور القديمة" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "كلمتا المرور غير متطابقتين!" #: src/gui/guiVolumeChange.cpp msgid "Exit" -msgstr "" +msgstr "أخرج" #: src/gui/guiVolumeChange.cpp msgid "Muted" -msgstr "" +msgstr "مكتوم" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "" +#, c-format +msgid "Sound Volume: %d%%" +msgstr "حجم الصوت: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1900,16 +2234,28 @@ 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" "If disabled, virtual joystick will center to first-touch's position." msgstr "" +"(أندرويد) ثبت موقع عصى التحكم.\n" +"اذا عُطل ستنتقل عصى التحكم لموقع اللمسة الأولى." #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1936,12 +2282,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -1972,11 +2312,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" +msgstr "سحب ثلاثية الأبعاد" #: src/settings_translation_file.cpp msgid "3D mode" -msgstr "" +msgstr "وضع الشاشة ثلاثية الأبعاد" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" @@ -2030,6 +2370,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2038,39 +2382,43 @@ msgstr "" #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "رسالة ستعرض عند انهيار الخادم." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" +msgstr "رسالة تعرض لكل العملاء عند اغلاق الخادم." #: src/settings_translation_file.cpp msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "تسارع الطيران" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "تسارع الجاذبية، عقدة/ثانية²." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "معدِلات الكتل النشطة" #: src/settings_translation_file.cpp msgid "Active block management interval" -msgstr "" +msgstr "مهلة إدارة الكتل النشطة" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "" +msgstr "مدى الكتل النشطة" #: src/settings_translation_file.cpp msgid "Active object send range" @@ -2082,6 +2430,10 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"عنوان الخادم\n" +"اتركه فارغًا لاستضافة لعبة محلية.\n" +"أدرك أن هذه القيمة ستُتجاوز إذا كان حقل العنوان في القائمة الرئيسية يحوي " +"عنوانًا." #: src/settings_translation_file.cpp msgid "Adds particles when digging a node." @@ -2093,6 +2445,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2104,10 +2460,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Advanced" -msgstr "" +#, fuzzy +msgid "Admin name" +msgstr "ضمّن اسم العنصر" #: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "متقدم" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Alters the light curve by applying 'gamma correction' to it.\n" "Higher values make middle and lower light levels brighter.\n" @@ -2115,9 +2477,14 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" +"يعدل منحنى الضوء عن طريق تطبيق \"تصحيح جاما\" عليه.\n" +"القيم الأعلى تجعل مستويات الإضاءة المتوسطة والدنيا أكثر بريقًا.\n" +"تترك القيمة \"1.0\" منحنى الضوء على حاله.\n" +"لها تأثير كبير فقط على ضوء النهار والضوء الصناعي ، ولها تأثير ضئيل للغاية " +"على ضوء الليل الطبيعي." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2126,11 +2493,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "عدد اارسائل المسموح بها لكل 10 ثوان." #: src/settings_translation_file.cpp msgid "Amplifies the valleys." -msgstr "" +msgstr "تضخيم الوديان." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" @@ -2138,15 +2505,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "" +msgstr "أعلن عن الخادم" #: src/settings_translation_file.cpp msgid "Announce to this serverlist." -msgstr "" +msgstr "أدرجه في هذه القائمة." #: src/settings_translation_file.cpp msgid "Append item name" -msgstr "" +msgstr "ضمّن اسم العنصر" #: src/settings_translation_file.cpp msgid "Append item name to tooltip." @@ -2168,7 +2535,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" -msgstr "" +msgstr "اطلب إعادة الاتصال بعد انقطاعه" #: src/settings_translation_file.cpp msgid "" @@ -2186,12 +2553,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Automatic forward key" +msgid "Audio" msgstr "" +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "زر المشي التلقائي" + #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." -msgstr "" +msgstr "قفز تلقائي فوق العوائق التي ارتفاعها كتلة واحدة." #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." @@ -2199,31 +2570,35 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Autosave screen size" -msgstr "" +msgstr "حفظ حجم الشاشة تلقائيًا" #: src/settings_translation_file.cpp msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "مفتاح Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "مفتاح Aux1 للتسلق / للنزول" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" #: src/settings_translation_file.cpp msgid "Base ground level" -msgstr "" +msgstr "مستوى الأرض الأساسي" #: src/settings_translation_file.cpp msgid "Base terrain height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" +msgstr "إرتفاع التضاريس الأساسي." #: src/settings_translation_file.cpp msgid "Basic privileges" -msgstr "" +msgstr "الإمتيازات الأساسية" #: src/settings_translation_file.cpp msgid "Beach noise" @@ -2235,55 +2610,56 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Bilinear filtering" -msgstr "" +msgstr "ترشيح خطي ثنائي" #: src/settings_translation_file.cpp 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 msgid "Biome noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Bold and italic font path" +msgid "Bobbing" msgstr "" +#: src/settings_translation_file.cpp +msgid "Bold and italic font path" +msgstr "مسار الخطين العريض والمائل" + #: src/settings_translation_file.cpp msgid "Bold and italic monospace font path" -msgstr "" +msgstr "مسار خطي monospace العريض والمائل" #: src/settings_translation_file.cpp msgid "Bold font path" -msgstr "" +msgstr "مسار الخط العريض" #: src/settings_translation_file.cpp msgid "Bold monospace font path" -msgstr "" +msgstr "مسار خط monospace العريض" #: src/settings_translation_file.cpp msgid "Build inside player" -msgstr "" +msgstr "ضع الكتلة في موقع اللاعب" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "مدمج" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "غير الكاميرا" #: src/settings_translation_file.cpp msgid "" @@ -2295,11 +2671,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Camera smoothing" -msgstr "" +msgstr "انسيابية حركة الكامير" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "" +msgstr "انسيابية حركة الكامير في الوضع السنيمائي" #: src/settings_translation_file.cpp msgid "Camera update toggle key" @@ -2319,7 +2695,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "عُرض المغارة" #: src/settings_translation_file.cpp msgid "Cave1 noise" @@ -2356,22 +2732,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "الأوامر" + #: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "" +msgstr "حجم خط المحادثة" #: src/settings_translation_file.cpp msgid "Chat key" -msgstr "" +msgstr "مفتاح المحادثة" #: src/settings_translation_file.cpp msgid "Chat log level" @@ -2379,11 +2754,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Chat message count limit" -msgstr "" +msgstr "حدُّ رسائل المحادثة" #: src/settings_translation_file.cpp msgid "Chat message format" -msgstr "" +msgstr "نسقُ رسائل المحادثة" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" @@ -2391,15 +2766,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "الطول الأقصى لرسائل المحادثة" #: src/settings_translation_file.cpp msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" +msgid "Chat weblinks" +msgstr "روابط المحادثة" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2407,23 +2782,31 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Cinematic mode" -msgstr "" +msgstr "الوضع السنيمائي" #: src/settings_translation_file.cpp msgid "Cinematic mode key" -msgstr "" +msgstr "مفتاح الوضع السنيمائي" #: src/settings_translation_file.cpp msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp -msgid "Client" +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." msgstr "" +"روابط ويب قابلة للنقر (زر الفأرة الأوسط أو زر الفأرة الأيسر+Ctrl) مفعلة في " +"المحادثة." + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "عميل" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "عميل وخادم" #: src/settings_translation_file.cpp msgid "Client modding" @@ -2438,16 +2821,20 @@ msgid "Client side node lookup range restriction" msgstr "" #: src/settings_translation_file.cpp -msgid "Climbing speed" +msgid "Client-side Modding" msgstr "" +#: src/settings_translation_file.cpp +msgid "Climbing speed" +msgstr "سرعة التسلق" + #: src/settings_translation_file.cpp msgid "Cloud radius" -msgstr "" +msgstr "تفاصيل السحاب" #: src/settings_translation_file.cpp msgid "Clouds" -msgstr "" +msgstr "سحاب" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." @@ -2455,11 +2842,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Clouds in menu" -msgstr "" +msgstr "سحب في القائمة" #: src/settings_translation_file.cpp msgid "Colored fog" -msgstr "" +msgstr "ضباب ملون" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "ظلال ملونة" #: src/settings_translation_file.cpp msgid "" @@ -2489,16 +2880,40 @@ msgid "Command key" msgstr "" #: src/settings_translation_file.cpp -msgid "Connect glass" +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 "" +"مستوى ضغط لحفظ الملف mapblocks في القرص.\n" +"-1 - المستوى الافتراضي\n" +"0 - ضغط ضعيف، سريع\n" +"9 - ضغط قوي، بطيء" + +#: src/settings_translation_file.cpp +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 "" +"مستوى ضغط لإرسال ملف mapblocks للعميل.\n" +"-1 - المستوى الافتراضي\n" +"0 - ضغط ضعيف، سريع\n" +"9 - ضغط قوي، بطيء" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "زجاج متصل" #: src/settings_translation_file.cpp msgid "Connect to external media server" -msgstr "" +msgstr "اتصل بخادم وسائط خارجي" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." -msgstr "" +msgstr "زجاج متصل اذا كانت العقدة تدعمه." #: src/settings_translation_file.cpp msgid "Console alpha" @@ -2512,10 +2927,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2532,7 +2955,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Controls" -msgstr "" +msgstr "التحكم" #: src/settings_translation_file.cpp msgid "" @@ -2540,9 +2963,14 @@ msgid "" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" +"يتحكم في طول دورة النهار والليل.\n" +"أمثلة:\n" +"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 @@ -2562,18 +2990,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Crash message" -msgstr "" +msgstr "رسالة الانهيار" #: src/settings_translation_file.cpp msgid "Creative" -msgstr "" +msgstr "إبداعي" #: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2581,7 +3011,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2590,7 +3022,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Damage" -msgstr "" +msgstr "ضرر" #: src/settings_translation_file.cpp msgid "Debug info toggle key" @@ -2605,12 +3037,12 @@ 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." -msgstr "" +msgid "Dec. volume key" +msgstr "مفتاح تقليل الحجم" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2618,59 +3050,62 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Default acceleration" -msgstr "" +msgstr "التسارع الافتراضي" #: src/settings_translation_file.cpp msgid "Default game" -msgstr "" +msgstr "اللعبة الافتراضية" #: 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 "" +"اللعبة الافتراضية عند إنشاء عالم جديد.\n" +"سيُتجاوز هذا الخيار عند إنشاء عالم جديد من القائمة." #: src/settings_translation_file.cpp msgid "Default password" -msgstr "" +msgstr "كلمة المرور الافتراضية" #: src/settings_translation_file.cpp msgid "Default privileges" -msgstr "" +msgstr "الامتيازات الافتراضية" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "نسقُ التقارير الافتراضي" #: src/settings_translation_file.cpp msgid "Default stack size" -msgstr "" +msgstr "حجم المكدس الافتراضي" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." -msgstr "" +msgstr "يحدد المناطق التي تتواجد بها أشجار التفاح." #: src/settings_translation_file.cpp msgid "Defines areas with sandy beaches." -msgstr "" +msgstr "يحدد المناطق التي توجد بها شواطئ رملية." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" +msgstr "يحدد توزع التضاريس العالية والمنحدرات." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain." -msgstr "" +msgstr "يحدد توزع التضاريس العالية." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." -msgstr "" +msgstr "يضبط حجم الكهوف ، كلما قلت القيمة زاد حجم الكهوف." #: src/settings_translation_file.cpp msgid "Defines large-scale river channel structure." @@ -2678,21 +3113,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Defines location and terrain of optional hills and lakes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" +msgstr "يحدد تضاريس التلال والبحيرات الاختيارية وموقعها." #: src/settings_translation_file.cpp msgid "Defines the base ground level." -msgstr "" +msgstr "يحدد مستوى الأرض الأساسي." #: src/settings_translation_file.cpp msgid "Defines the depth of the river channel." -msgstr "" +msgstr "يحدد عمق الأنهار." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." @@ -2708,7 +3137,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Defines tree areas and tree density." -msgstr "" +msgstr "يحدد مواقع الأشجار وكثافتها." #: src/settings_translation_file.cpp msgid "" @@ -2718,19 +3147,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" -msgstr "" +msgstr "تأخير إرسال الكتل بعد البناء" #: src/settings_translation_file.cpp msgid "Delay showing tooltips, stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "Deprecated Lua API handling" -msgstr "" +msgstr "معالجة API Lua القديمة" #: src/settings_translation_file.cpp msgid "Depth below which you'll find giant caverns." -msgstr "" +msgstr "بُعد الكهوف الكبيرة عن السطح." #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." @@ -2756,6 +3186,15 @@ msgstr "" 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 "" @@ -2768,6 +3207,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2812,18 +3261,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2840,22 +3306,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2904,14 +3364,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2920,18 +3372,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2940,6 +3380,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2948,12 +3398,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2965,7 +3409,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2984,18 +3432,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3014,17 +3450,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" #: src/settings_translation_file.cpp msgid "Field of view" -msgstr "" +msgstr "حقل الرؤية" #: src/settings_translation_file.cpp msgid "Field of view in degrees." -msgstr "" +msgstr "حقل الرؤية بالدرجات." #: src/settings_translation_file.cpp msgid "" @@ -3048,14 +3484,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: 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." @@ -3071,11 +3508,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Fixed virtual joystick" -msgstr "" +msgstr "عصا التحكم الافتراضية ثابتة" #: src/settings_translation_file.cpp msgid "Floatland density" -msgstr "" +msgstr "كثافة الأرض الطافية" #: src/settings_translation_file.cpp msgid "Floatland maximum Y" @@ -3103,7 +3540,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Fly key" -msgstr "" +msgstr "زر الطيران" #: src/settings_translation_file.cpp msgid "Flying" @@ -3111,27 +3548,32 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Fog" -msgstr "" +msgstr "الضباب" #: src/settings_translation_file.cpp msgid "Fog start" -msgstr "" +msgstr "بداية الضباب" #: src/settings_translation_file.cpp msgid "Fog toggle key" -msgstr "" +msgstr "مفتاح تبديل ظهور الضباب" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font" +msgstr "حجم الخط" #: src/settings_translation_file.cpp msgid "Font bold by default" -msgstr "" +msgstr "الخط عريض افتراضيًا" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "" +msgstr "الخط مائل افتراضيًا" #: src/settings_translation_file.cpp msgid "Font shadow" -msgstr "" +msgstr "ظل الخط" #: src/settings_translation_file.cpp msgid "Font shadow alpha" @@ -3139,18 +3581,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Font size" +msgstr "حجم الخط" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3159,6 +3601,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3218,10 +3671,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3246,10 +3695,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3267,7 +3712,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3278,7 +3732,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3297,6 +3751,14 @@ msgstr "" 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 "" @@ -3314,9 +3776,14 @@ 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 "" @@ -3324,8 +3791,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3347,7 +3814,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3358,10 +3826,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3395,154 +3859,160 @@ msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" +"التسارع الأفقي عند الصقوط والقفز،\n" +"وحدتها عقدة/ثانية²." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration in fast mode,\n" "in nodes per second per second." msgstr "" +"التسارع الأفقي والعمودي في نمط السرعة،\n" +"وحدتها عقدة/ثانية²." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration on ground or when climbing,\n" "in nodes per second per second." msgstr "" +"التسارع الأفقي والعمودي أثناء التسلق،\n" +"وحدتها عقدة/ثانية²." #: src/settings_translation_file.cpp msgid "Hotbar next key" -msgstr "" +msgstr "مفتاح العنصر التالي في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar previous key" -msgstr "" +msgstr "مفتاح العنصر السابق في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 1 key" -msgstr "" +msgstr "مفتاح الخانة 1 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 10 key" -msgstr "" +msgstr "مفتاح الخانة 10 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 11 key" -msgstr "" +msgstr "مفتاح الخانة 11 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 12 key" -msgstr "" +msgstr "مفتاح الخانة 21 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 13 key" -msgstr "" +msgstr "مفتاح الخانة 13 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 14 key" -msgstr "" +msgstr "مفتاح الخانة 14 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 15 key" -msgstr "" +msgstr "مفتاح الخانة 15 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 16 key" -msgstr "" +msgstr "مفتاح الخانة 16 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 17 key" -msgstr "" +msgstr "مفتاح الخانة 17 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 18 key" -msgstr "" +msgstr "مفتاح الخانة 18 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 19 key" -msgstr "" +msgstr "مفتاح الخانة 19 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 2 key" -msgstr "" +msgstr "مفتاح الخانة 2 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 20 key" -msgstr "" +msgstr "مفتاح الخانة 20 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 21 key" -msgstr "" +msgstr "مفتاح الخانة 21 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 22 key" -msgstr "" +msgstr "مفتاح الخانة 22 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 23 key" -msgstr "" +msgstr "مفتاح الخانة 23 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 24 key" -msgstr "" +msgstr "مفتاح الخانة 24 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 25 key" -msgstr "" +msgstr "مفتاح الخانة 25 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 26 key" -msgstr "" +msgstr "مفتاح الخانة 26 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 27 key" -msgstr "" +msgstr "مفتاح الخانة 27 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 28 key" -msgstr "" +msgstr "مفتاح الخانة 28 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 29 key" -msgstr "" +msgstr "مفتاح الخانة 29 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 3 key" -msgstr "" +msgstr "مفتاح الخانة 3 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 30 key" -msgstr "" +msgstr "مفتاح الخانة 30 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 31 key" -msgstr "" +msgstr "مفتاح الخانة 31 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 32 key" -msgstr "" +msgstr "مفتاح الخانة 32 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 4 key" -msgstr "" +msgstr "مفتاح الخانة 4 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 5 key" -msgstr "" +msgstr "مفتاح الخانة 5 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 6 key" -msgstr "" +msgstr "مفتاح الخانة 6 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 7 key" -msgstr "" +msgstr "مفتاح الخانة 7 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 8 key" -msgstr "" +msgstr "مفتاح الخانة 8 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "Hotbar slot 9 key" -msgstr "" +msgstr "مفتاح الخانة 9 في شريط الإجراءات" #: src/settings_translation_file.cpp msgid "How deep to make rivers." @@ -3554,13 +4024,24 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"سرعة موجات السوائل.كلما زادت القيمة زادت سرعتها.\n" +"إذا كانت سالبة ، فإن حركة الموجات ستكون لجهة المعاكسة .\n" +"لاستخدامها فعّل سوائل متموجة." #: 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 "" @@ -3575,28 +4056,33 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Humidity variation for biomes." -msgstr "" +msgstr "اختلاف الرطوبة في الحيوم." #: src/settings_translation_file.cpp +#, fuzzy msgid "IPv6" -msgstr "" +msgstr "IPv6" #: src/settings_translation_file.cpp msgid "IPv6 server" -msgstr "" +msgstr "خادم 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 "" +"إذا كان عدد الإطارات في الثانية (FPS) يتجاوز هذه القيمة\n" +"حدّه حتى لا تستهلك سرعة المعالج هباءً." #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" +"إذا تم تعطيله ، فسيتم استخدام مفتاح \"Aux1\" للطيران بسرعة إذا كانت أوضاع " +"الطيران والسرعة \n" +"مفعلة." #: src/settings_translation_file.cpp msgid "" @@ -3616,10 +4102,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" +"إذا فُعّل ، سيستخدم مفتاح \"Aux1\" بدلاً من مفتاح \"التسلل\" للتحرك للتسلق " +"والنزول." + +#: 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 "" @@ -3629,7 +4123,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" +msgstr "إذا فُعّل، سيعطل مكافحة الغش في وضع تعدد اللاعبين." #: src/settings_translation_file.cpp msgid "" @@ -3644,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 @@ -3661,6 +4157,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3677,10 +4179,6 @@ msgstr "" 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 "" @@ -3708,7 +4206,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3731,16 +4229,12 @@ msgstr "" 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 @@ -3791,6 +4285,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3870,6 +4368,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3969,6 +4474,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4343,9 +4855,13 @@ msgid "" msgstr "" #: 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 "اطرد اللاعبين الذين أرسلوا أكثر من X رسالة في 10 ثوانٍ." + #: src/settings_translation_file.cpp msgid "Lake steepness" msgstr "" @@ -4356,19 +4872,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Language" -msgstr "" +msgstr "اللغة" #: src/settings_translation_file.cpp msgid "Large cave depth" -msgstr "" +msgstr "عمق المغارات الكبيرة" #: src/settings_translation_file.cpp msgid "Large cave maximum number" -msgstr "" +msgstr "أقصى عدد للمغارات الكبيرة" #: src/settings_translation_file.cpp msgid "Large cave minimum number" -msgstr "" +msgstr "أقل عدد للمغارات الكبيرة" #: src/settings_translation_file.cpp msgid "Large cave proportion flooded" @@ -4380,7 +4896,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Leaves style" -msgstr "" +msgstr "مظهر الأوراق" #: src/settings_translation_file.cpp msgid "" @@ -4389,6 +4905,10 @@ msgid "" "- Simple: only outer faces, if defined special_tiles are used\n" "- Opaque: disable transparency" msgstr "" +"مظهر أوراق الشجر:\n" +"- مفصل: كل الوجوه مرئية\n" +"- بسيط: الوجوه الخارجية فقط ، إذا تم تحديد \"special_tiles\"\n" +"- معتم: يعطل الشفافية" #: src/settings_translation_file.cpp msgid "Left key" @@ -4398,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 @@ -4408,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 @@ -4428,7 +4951,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4455,6 +4979,11 @@ msgstr "" 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" @@ -4501,7 +5030,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "" +msgstr "حمّل محلل بيانات اللعبة" #: src/settings_translation_file.cpp msgid "" @@ -4526,21 +5055,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4602,6 +5131,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4707,7 +5240,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4755,6 +5292,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4809,17 +5353,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4868,12 +5416,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4884,6 +5444,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4950,16 +5514,16 @@ msgstr "" 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 "" @@ -4972,6 +5536,11 @@ msgstr "" 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 "" @@ -4984,14 +5553,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5013,18 +5574,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5034,11 +5587,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5047,38 +5595,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5101,17 +5623,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5140,13 +5658,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5157,6 +5679,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5191,10 +5717,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5202,9 +5724,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5294,10 +5816,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5367,6 +5885,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "الشاشة:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5394,6 +5917,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "صوّر الشاشة" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5406,10 +5934,6 @@ msgstr "" 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 "" @@ -5450,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" @@ -5477,10 +6012,19 @@ msgstr "" 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 "" @@ -5492,7 +6036,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5513,6 +6085,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5525,6 +6104,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5532,9 +6127,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5549,6 +6142,17 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "الخط عريض افتراضيًا" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5570,6 +6174,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5624,18 +6232,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5651,6 +6255,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5678,10 +6290,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5719,6 +6327,11 @@ msgstr "" 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 "" @@ -5761,6 +6374,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5775,6 +6395,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5830,18 +6454,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5859,6 +6483,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5867,9 +6497,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5906,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 @@ -5929,6 +6558,18 @@ msgstr "" 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 "" @@ -5999,15 +6640,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6101,7 +6757,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6171,6 +6827,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6192,18 +6852,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6238,13 +6896,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6328,23 +6995,145 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- النمط الإبداعي: " -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "تنزيل وتثبيت $1, يرجى الإنتظار..." +#~ msgid "- Damage: " +#~ msgstr "- التضرر: " + +#~ msgid "Address / Port" +#~ msgstr "العنوان \\ المنفذ" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "هل أنت متأكد من إعادة تعيين عالم اللاعب الوحيد؟" #~ msgid "Back" #~ msgstr "عُد" +#~ msgid "Basic" +#~ msgstr "أساسي" + +#~ msgid "Bump Mapping" +#~ msgstr "خريطة النتوءات" + +#~ msgid "Config mods" +#~ 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 "ولِد خرائط عادية" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "ثبت: الملف: \"$1\"" + +#~ msgid "Main" +#~ msgstr "الرئيسية" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "الخريطة المصغرة في وضع الرادار، تكبير x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "الخريطة المصغرة في وضع الرادار، تكبير x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "الخريطة المصغرة في وضع الأسطح، تكبير x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "الخريطة المصغرة في وضع الأسطح، تكبير x4" + +#~ msgid "Name / Password" +#~ msgstr "الاسم \\ كلمة المرور" + +#~ msgid "Name/Password" +#~ msgstr "الاسم\\كلمة المرور" + +#~ msgid "No" +#~ msgstr "لا" + #~ msgid "Ok" #~ msgstr "موافق" + +#~ msgid "PvP enabled" +#~ msgstr "قتال اللاعبين ممكن" + +#~ msgid "Reset singleplayer world" +#~ msgstr "أعد تعيين عالم اللاعب المنفرد" + +#~ msgid "Special" +#~ msgstr "خاص" + +#~ msgid "Start Singleplayer" +#~ msgstr "إلعب فرديا" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "لاستخدام المظللات يجب استخدام تعريف OpenGL." + +#~ msgid "View" +#~ 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 "مِت" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/be/minetest.po b/po/be/minetest.po index ed091587d..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: 2020-06-13 23:17+0200\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,10 +11,52 @@ 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 +#, fuzzy +msgid "Clear the out chat queue" +msgstr "Максімальны памер чаргі размовы" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "Загады размовы" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Выхад у меню" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "Лакальная каманда" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "Адзіночная гульня" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "Адзіночная гульня" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "Адрадзіцца" @@ -23,10 +65,41 @@ msgstr "Адрадзіцца" msgid "You died" msgstr "Вы загінулі" +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "Лакальная каманда" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "Лакальная каманда" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Адбылася памылка ў Lua-скрыпце:" @@ -47,9 +120,30 @@ msgstr "Перазлучыцца" msgid "The server has requested a reconnect:" msgstr "Сервер патрабуе перазлучыцца:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -64,10 +158,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Сервер падтрымлівае версіі пратакола паміж $1 і $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Паспрабуйце паўторна ўключыць спіс публічных сервераў і праверце злучэнне з " -"сецівам." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,17 +169,26 @@ msgstr "Мы падтрымліваем толькі $1 версію прата msgid "We support protocol versions between version $1 and $2." msgstr "Мы падтрымліваем версіі пратакола паміж $1 і $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Скасаваць" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Залежнасці:" @@ -160,14 +261,55 @@ msgstr "Свет:" msgid "enabled" msgstr "уключаны" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Загрузка…" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Усе пакункі" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Already installed" +msgstr "Клавіша ўжо выкарыстоўваецца" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Вярнуцца ў галоўнае меню" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "Гуляць (сервер)" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -182,7 +324,6 @@ msgid "Failed to download $1" msgstr "Не атрымалася спампаваць $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Гульні" @@ -191,7 +332,21 @@ msgid "Install" msgstr "Усталяваць" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "Усталяваць" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "Неабавязковыя залежнасці:" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "Усталёўка: непадтрымліваемы файл тыпу \"$1\" або сапсаваны архіў" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Мадыфікацыі" @@ -204,9 +359,26 @@ msgid "No results" msgstr "Вынікі адсутнічаюць" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Пошук" +#, fuzzy +msgid "No updates" +msgstr "Абнавіць" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Not found" +msgstr "Выключыць гук" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -221,7 +393,11 @@ msgid "Update" msgstr "Абнавіць" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -271,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 @@ -297,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 "" @@ -318,6 +488,15 @@ msgstr "Відэадрайвер" 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 "" @@ -422,12 +601,6 @@ msgstr "Глыбіня рэк" 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 "Назва свету" @@ -458,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 "Ухваліць" @@ -491,6 +698,16 @@ 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 "Адключаны" @@ -515,7 +732,8 @@ msgid "Offset" msgstr "Зрух" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Сталасць" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -534,6 +752,10 @@ msgstr "Аднавіць прадвызначанае" msgid "Scale" msgstr "Маштаб" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Пошук" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Абраць каталог" @@ -542,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 "Паказваць тэхнічныя назвы" @@ -624,14 +846,6 @@ msgstr "" "Усталёўка мадыфікацыі: не атрымалася знайсці прыдатны каталог для пакунка " "мадыфікацый \"$1\"" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Усталёўка: непадтрымліваемы файл тыпу \"$1\" або сапсаваны архіў" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Усталёўка: файл: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Не атрымалася знайсці прыдатную мадыфікацыю альбо пакунак мадыфікацый" @@ -652,6 +866,62 @@ msgstr "Не атрымалася ўсталяваць мадыфікацыю я msgid "Unable to install a modpack as a $1" msgstr "Не атрымалася ўсталяваць пакунак мадыфікацый як $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Загрузка…" + +#: builtin/mainmenu/serverlistmgr.lua +#, fuzzy +msgid "Public server list is disabled" +msgstr "Кліентскія мадыфікацыі выключаныя" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Паспрабуйце паўторна ўключыць спіс публічных сервераў і праверце злучэнне з " +"сецівам." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Актыўныя ўдзельнікі" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "Адлегласць адпраўлення актыўнага аб'екта" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Асноўныя распрацоўшчыкі" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Былыя ўдзельнікі" + +#: builtin/mainmenu/tab_about.lua +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 "Пошук у сеціве" @@ -692,26 +962,6 @@ msgstr "Выдаліць пакунак" msgid "Use Texture Pack" msgstr "Выкарыстоўваць пакунак тэкстур" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Актыўныя ўдзельнікі" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Асноўныя распрацоўшчыкі" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Падзякі" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Былыя ўдзельнікі" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Былыя асноўныя распрацоўшчыкі" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Анансаваць сервер" @@ -721,14 +971,10 @@ msgid "Bind Address" msgstr "Адрас прывязкі" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Наладзіць" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Творчы рэжым" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Уключыць пашкоджанні" @@ -744,10 +990,6 @@ msgstr "Сервер" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Імя/Пароль" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Новы" @@ -760,10 +1002,15 @@ msgstr "Няма створанага альбо абранага свету!" msgid "Play Game" msgstr "Гуляць" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Порт" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Абраць свет:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Абраць свет:" @@ -777,45 +1024,67 @@ msgid "Start Game" msgstr "Пачаць гульню" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Адрас / Порт" +#, fuzzy +msgid "Address" +msgstr "- Адрас: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Злучыцца" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Ачысціць" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Творчы рэжым" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Пашкоджанні ўключаныя" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "Пашкоджанні" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Прыбраць з упадабанага" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Упадабанае" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Далучыцца да гульні" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Імя / Пароль" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Пінг" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP уключаны" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Анансаваць сервер" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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" @@ -841,10 +1110,6 @@ msgstr "Усе налады" msgid "Antialiasing:" msgstr "Згладжванне:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Вы ўпэўненыя, што хочаце скінуць свет адзіночнай гульні?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Запамінаць памеры экрана" @@ -853,10 +1118,6 @@ msgstr "Запамінаць памеры экрана" msgid "Bilinear Filter" msgstr "Білінейны фільтр" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Тэкстураванне маскамі" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Змяніць клавішы" @@ -865,13 +1126,31 @@ msgstr "Змяніць клавішы" msgid "Connected Glass" msgstr "Суцэльнае шкло" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +#, fuzzy +msgid "Dynamic shadows" +msgstr "Цень шрыфту" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Цень шрыфту" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Аздобленае лісце" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Генерацыя мапы нармаляў" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -881,10 +1160,6 @@ msgstr "MIP-тэкстураванне" msgid "Mipmap + Aniso. Filter" msgstr "MIP-тэкстураванне + анізатропны фільтр" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Не" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Без фільтра" @@ -913,18 +1188,10 @@ msgstr "Непразрыстае лісце" msgid "Opaque Water" msgstr "Непразрыстая вада" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Паралаксная аклюзія" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Часціцы" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Скінуць свет адзіночнай гульні" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Экран:" @@ -937,6 +1204,11 @@ msgstr "Налады" msgid "Shaders" msgstr "Шэйдэры" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "Узровень лятучых астравоў" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Шэйдэры (недаступна)" @@ -953,22 +1225,27 @@ msgstr "Мяккае асвятленне" msgid "Texturing:" msgstr "Тэкстураванне:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Для ўключэння шэйдэраў неабходна выкарыстоўваць OpenGL." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Танальнае адлюстраванне" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "Сэнсарны парог: (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Трылінейны фільтр" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Дрыготкае лісце" @@ -981,23 +1258,12 @@ msgstr "Калыханне вадкасцяў" msgid "Waving Plants" msgstr "Дрыготкія расліны" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Так" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Налады мадыфікацый" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Галоўнае меню" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "Таймаут злучэння." @@ -1026,7 +1292,8 @@ msgid "Connection error (timed out?)" msgstr "Памылка злучэння (таймаут?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Немагчыма знайсці ці загрузіць гульню \"" #: src/client/clientlauncher.cpp @@ -1057,18 +1324,6 @@ msgstr "Не атрымалася адкрыць пададзены файл п msgid "Provided world path doesn't exist: " msgstr "Пададзены шлях не існуе: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1081,14 +1336,6 @@ msgstr "" msgid "- Address: " msgstr "- Адрас: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Творчы рэжым: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Пашкоджанні: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Рэжым: " @@ -1110,6 +1357,16 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "- Назва сервера: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Адбылася памылка:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Аўтаматычны рух наперад адключаны" @@ -1118,6 +1375,22 @@ msgstr "Аўтаматычны рух наперад адключаны" msgid "Automatic forward enabled" msgstr "Аўтаматычны рух наперад уключаны" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Абнаўленне камеры адключана" @@ -1126,6 +1399,10 @@ msgstr "Абнаўленне камеры адключана" msgid "Camera update enabled" msgstr "Абнаўленне камеры ўключана" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Змяніць пароль" @@ -1138,6 +1415,11 @@ msgstr "Кінематаграфічны рэжым адключаны" msgid "Cinematic mode enabled" msgstr "Кінематаграфічны рэжым уключаны" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Модынг кліента" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Кліентскія мадыфікацыі выключаныя" @@ -1146,25 +1428,29 @@ msgstr "Кліентскія мадыфікацыі выключаныя" msgid "Connecting to server..." msgstr "Злучэнне з серверам…" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Працягнуць" #: src/client/game.cpp -#, c-format +#, fuzzy, c-format msgid "" "Controls:\n" "- %s: move forwards\n" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1183,6 +1469,11 @@ msgstr "" "- Mouse wheel: абраць прадмет\n" "- %s: размова\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Стварэнне кліента…" @@ -1239,6 +1530,11 @@ msgstr "Абмежаванне бачнасці адключана" 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 "Выхад у меню" @@ -1312,32 +1608,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "Мінімапа на дадзены момант адключаная гульнёй альбо мадыфікацыяй" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Мінімапа схаваная" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Мінімапа ў рэжыме радару, павелічэнне х1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Мінімапа ў рэжыме радару, павелічэнне х2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Мінімапа ў рэжыме радару, павелічэнне х4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Мінімапа ў рэжыме паверхні, павелічэнне х1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Мінімапа ў рэжыме паверхні, павелічэнне х2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Мінімапа ў рэжыме паверхні, павелічэнне х4" +#, fuzzy +msgid "Multiplayer" +msgstr "Адзіночная гульня" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1411,6 +1684,21 @@ msgstr "" msgid "Sound unmuted" msgstr "Гук уключаны" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1480,10 +1768,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Ачысціць" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1731,35 +2015,41 @@ msgstr "Дадат. кнопка 2" msgid "Zoom" msgstr "Павялічыць" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Паролі не супадаюць!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Мінімапа схаваная" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Зарэгістравацца і далучыцца" +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Мінімапа ў рэжыме радару, павелічэнне х1" -#: 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." +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Мінімапа ў рэжыме паверхні, павелічэнне х1" + +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap in texture mode" +msgstr "Мінімальны памер тэкстуры" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Не атрымалася спампаваць $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" -"Вы хочаце першы раз увайсці на сервер з назвай «%s».\n" -"Калі вы працягнеце, то на серверы будзе створаны новы конт з вашамі данымі.\n" -"Калі ласка, ўвядзіце пароль яшчэ раз і націсніце «Зарэгістравацца і " -"далучыцца», каб пацвердзіць стварэнне конта альбо \"Скасаваць\", каб " -"адмовіцца." #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Працягнуць" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +#, fuzzy +msgid "\"Aux1\" = climb down" msgstr "«Адмысловая» = злазіць" #: src/gui/guiKeyChangeMenu.cpp @@ -1770,15 +2060,23 @@ msgstr "Аўтабег" msgid "Automatic jumping" msgstr "Аўтаскок" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Назад" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Змяніць камеру" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Размова" @@ -1831,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" @@ -1863,10 +2160,6 @@ msgstr "Здымак экрана" msgid "Sneak" msgstr "Красціся" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Адмысловая" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "HUD" @@ -1907,10 +2200,6 @@ msgstr "націсніце кнопку" msgid "Change" msgstr "Змяніць" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Пацвердзіць пароль" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Новы пароль" @@ -1919,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 "Выхад" @@ -1928,15 +2221,10 @@ msgid "Muted" msgstr "Сцішаны" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, 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 "Увод " - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -1944,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" @@ -1954,9 +2252,10 @@ msgstr "" "дотыку." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Выкарыстоўваць віртуальны джойсцік для актывацыі кнопкі \"aux\".\n" @@ -2001,14 +2300,6 @@ msgstr "" "Для вертыкальна сціснутай фігуры, што падыходзіць\n" "востраву, зрабіце ўсе 3 лікі роўнымі для неапрацаванай формы." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = паралаксная аклюзія са звесткамі аб нахіле (хутка).\n" -"1 = рэльефнае тэкстураванне (павольней, але якасней)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "2D-шум, што кіруе формай/памерам горных хрыбтоў." @@ -2110,6 +2401,10 @@ msgstr "" "- sidebyside: падзел экрана права/лева.\n" "- 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" @@ -2131,6 +2426,10 @@ msgstr "" msgid "ABM interval" msgstr "Інтэрвал захавання мапы" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Absolute limit of queued blocks to emerge" @@ -2182,6 +2481,10 @@ msgstr "" "Наладка DPI (кропак на цалю) на экране\n" "(не толькі X11/Android), напрыклад, для 4k-экранаў." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2192,6 +2495,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Дадаваць назвы прадметаў" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Пашыраныя" @@ -2206,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 @@ -2286,6 +2595,10 @@ msgstr "" "аптымізацыю.\n" "Прызначаецца ў блоках мапы (16 вузлоў)." +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Клавіша аўта-ўперад" @@ -2306,6 +2619,16 @@ msgstr "Аўтаматычна захоўваць памеры экрана" msgid "Autoscaling mode" msgstr "Рэжым аўтамаштабавання" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Клавіша скока" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "Адмысловая клавіша для караскання/спускання" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Клавіша назад" @@ -2318,10 +2641,6 @@ msgstr "Узровень зямлі" msgid "Base terrain height." msgstr "Вышыня асноўнай мясцовасці." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Базавыя" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Базавыя прывілеі" @@ -2343,21 +2662,22 @@ 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 msgid "Biome noise" msgstr "Шум біёму" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Біты на піксель (глыбіня колеру) у поўнаэкранным рэжыме." - #: src/settings_translation_file.cpp 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" @@ -2387,8 +2707,9 @@ msgid "Builtin" msgstr "Убудаваны" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Рэльефнае тэкстураванне" +#, fuzzy +msgid "Camera" +msgstr "Змяніць камеру" #: src/settings_translation_file.cpp #, fuzzy @@ -2467,20 +2788,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Змена інтэрфейсу галоўнага меню:\n" -"- full: выбар свету для адзіночнай альбо сеткавай гульні, асобны спіс " -"чужых сервераў.\n" -"- simple: адзін свет для адзіночнай гульні ў меню, дзе спіс чужых " -"сервераў; можа быць карысна для невелічкіх экранаў.\n" -"Прадвызначана: simple для Android, full для ўсіх астатніх." +#, fuzzy +msgid "Chat command time message threshold" +msgstr "Максімальная колькасць паведамленняў у размове для выключэння" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Загады размовы" #: src/settings_translation_file.cpp #, fuzzy @@ -2517,8 +2832,9 @@ msgid "Chat toggle key" msgstr "Клавіша пераключэння размовы" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Загады размовы" +#, fuzzy +msgid "Chat weblinks" +msgstr "Размова паказваецца" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2536,6 +2852,12 @@ msgstr "Клавіша кінематаграфічнага рэжыму" msgid "Clean transparent textures" msgstr "Чыстыя празрыстыя тэкстуры" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Кліент" @@ -2556,6 +2878,11 @@ msgstr "Модынг кліента" 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 "Хуткасць караскання" @@ -2580,6 +2907,11 @@ msgstr "Аблокі ў меню" msgid "Colored fog" msgstr "Каляровы туман" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "Каляровы туман" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2619,6 +2951,22 @@ msgstr "" msgid "Command key" msgstr "Клавіша загаду" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Суцэльнае шкло" @@ -2643,10 +2991,19 @@ msgstr "Колер кансолі" 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" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "URL ContentDB" @@ -2677,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." @@ -2708,7 +3067,10 @@ msgid "Crosshair alpha" msgstr "Празрыстасць перакрыжавання" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "Празрыстасць перакрыжавання (паміж 0 і 255)." #: src/settings_translation_file.cpp @@ -2716,8 +3078,10 @@ msgid "Crosshair color" msgstr "Колер перакрыжавання" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Колер перакрыжавання (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" #: src/settings_translation_file.cpp msgid "DPI" @@ -2740,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" @@ -2787,11 +3150,10 @@ msgstr "Прадвызначаная гульня" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Прадвызначаны таймаўт для cURL, зададзены ў мілісекундах.\n" -"Уплывае толькі пры кампіляцыі з cURL." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2822,14 +3184,6 @@ msgstr "Вызначае буйнамаштабную структуру рэч msgid "Defines location and terrain of optional hills and lakes." msgstr "Вызначае размяшчэнне і рэльеф дадатковых пагоркаў і азёр." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Вызначае крок дыскрэтызацыі тэкстуры.\n" -"Больш высокае значэнне прыводзіць да больш гладкіх мапаў нармаляў." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Вызначае базавы ўзровень зямлі." @@ -2909,6 +3263,16 @@ msgstr "" msgid "Desynchronize block animation" msgstr "Дэсінхранізаваць анімацыю блока" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Ітэрацыі" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "Клавіша ўправа" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Часціцы пры капанні" @@ -2921,6 +3285,16 @@ msgstr "Выключыць антычыт" msgid "Disallow empty passwords" msgstr "Забараніць пустыя паролі" +#: src/settings_translation_file.cpp +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 "Даменная назва сервера, што будзе паказвацца ў спісе сервераў." @@ -2967,18 +3341,36 @@ msgstr "" "Уключыць падтрымку Lua-модынгу на кліенце.\n" "Гэта падтрымка эксперыментальная і API можа змяніцца." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Уключаць акно кансолі" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +#, fuzzy +msgid "Enable creative mode for all players" 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 "Уключыць абарону мадыфікацый." @@ -2995,18 +3387,6 @@ msgstr "Дазволіць гульцам атрымоўваць пашкодж 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" @@ -3015,6 +3395,10 @@ msgstr "" "Уключыць мяккае асвятленне з простай навакольнай аклюзіяй.\n" "Адключыць для хуткасці ці другога выгляду." +#: 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" @@ -3076,17 +3460,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Уключае анімацыю прадметаў інвентару." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Уключае рэльефнае тэкстураванне. Мапы нармаляў мусяць быць пакункам тэкстур " -"ці створанымі аўтаматычна.\n" -"Патрабуюцца ўключаныя шэйдэры." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Уключае кэшаванне павернутых вонкі сетак." @@ -3095,22 +3468,6 @@ msgstr "Уключае кэшаванне павернутых вонкі сет msgid "Enables minimap." msgstr "Уключае мінімапу." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Уключае генерацыю мапаў нармаляў лётма (эфект Emboss).\n" -"Патрабуецца рэльефнае тэкстураванне." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Уключае паралакснае аклюзіўнае тэкстураванне.\n" -"Патрабуюцца ўключаныя шэйдэры." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3119,6 +3476,17 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "Профіль даліны" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Інтэрвал друкавання даных прафілявання рухавіка" @@ -3127,14 +3495,6 @@ msgstr "Інтэрвал друкавання даных прафіляванн msgid "Entity methods" msgstr "Метады сутнасці" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Эксперыментальны параметр, які можа прывесці да візуальных прагалаў\n" -"паміж блокамі пры значэнні большым за 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3146,8 +3506,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS у меню паўзы" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "FPS when unfocused or paused" +msgstr "Максімальны FPS, калі гульня прыпыненая." #: src/settings_translation_file.cpp msgid "FSAA" @@ -3166,18 +3531,6 @@ msgstr "Каэфіцыент калыхання пры падзенні" msgid "Fallback font path" msgstr "Рэзервовы шрыфт" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Цень рэзервовага шрыфту" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Празрыстасць цені рэзервовага шрыфту" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Памер рэзервовага шрыфту" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Клавіша шпаркасці" @@ -3195,8 +3548,9 @@ msgid "Fast movement" msgstr "Шпаркае перамяшчэнне" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "Шпаркае перамяшчэнне (з дапамогай клавішы выкарыстання).\n" @@ -3233,11 +3587,12 @@ msgid "Filmic tone mapping" msgstr "Кінематаграфічнае танальнае адлюстраванне" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Адфільтраваныя тэкстуры могуць змешваць значэнні RGB з цалкам празрыстымі " "суседнімі, якія PNG-аптымізатары звычайна адкідваюць, што часам прыводзіць " @@ -3245,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." @@ -3320,6 +3676,11 @@ msgstr "Пачатак туману" 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 "" @@ -3341,15 +3702,15 @@ msgid "Font size" msgstr "Памер шрыфту" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3358,6 +3719,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3422,10 +3794,6 @@ msgstr "Тып фрактала" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Частка бачнай адлегласці, на якой пачынае з'яўляцца туман" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Шрыфты FreeType" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3458,10 +3826,6 @@ msgstr "" msgid "Full screen" msgstr "На ўвесь экран" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Глыбіня колеру ў поўнаэкранным рэжыме (бітаў на піксель)" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Поўнаэкранны рэжым." @@ -3479,18 +3843,28 @@ msgid "GUI scaling filter txr2img" msgstr "txr2img-фільтр маштабавання графічнага інтэрфейсу" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Генерацыя мапы нармаляў" +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 "Глабальныя зваротныя выклікі" #: 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 junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Глабальныя параметры генерацыі мапы.\n" "У генератары мапы 6 параметр «decorations» кіруе ўсімі дэкарацыямі,\n" @@ -3515,6 +3889,16 @@ msgstr "Градыент крывой святла на мінімальным 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 "Гравітацыя" @@ -3532,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" @@ -3543,8 +3932,8 @@ msgstr "Клавіша пераключэння HUD" #, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Апрацоўка састарэлых выклікаў Lua API:\n" @@ -3577,7 +3966,9 @@ msgid "Heat noise" msgstr "Цеплавы шум" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "Вышыня акна падчас запуску." #: src/settings_translation_file.cpp @@ -3588,10 +3979,6 @@ msgstr "Шум вышыні" msgid "Height select noise" msgstr "Шум выбару вышыні" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Высокадакладны FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Крутасць пагоркаў" @@ -3792,14 +4179,23 @@ 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" "якія не выкарыстоўваюцца.\n" "На больш высокіх значэннях адбываецца плаўней, але патрабуецца больш памяці." +#: 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 "Наколькі шырокімі рабіць рэкі." @@ -3833,9 +4229,9 @@ msgstr "" "каб не марнаваць дарма магутнасць працэсара." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" "Калі выключана, то клавіша \"special\" выкарыстоўваецца для хуткага палёту, " @@ -3865,14 +4261,24 @@ msgstr "" "На серверы патрабуецца прывілей \"noclip\"." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3903,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 @@ -3925,6 +4334,12 @@ msgstr "" "Калі абмежаванне CSM для дыяпазону блокаў уключана, выклікі get_node " "абмяжоўваюцца на гэтую адлегласць ад гульца да блока." +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3945,10 +4360,6 @@ msgstr "Калі вызначана, гульцы заўсёды адраджа 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)." @@ -3978,7 +4389,8 @@ msgstr "" "Звычайна патрабуюцца толькі распрацоўшчыкам ядра" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Выконваць загады ў размове пры рэгістрацыі." #: src/settings_translation_file.cpp @@ -4005,16 +4417,13 @@ msgstr "" 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 @@ -4071,6 +4480,11 @@ msgstr "ID джойсціка" msgid "Joystick button repetition interval" msgstr "Інтэрвал паўтору кнопкі джойсціка" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "Тып джойсціка" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Адчувальнасць джойсціка" @@ -4171,6 +4585,17 @@ msgstr "" "Глядзіце http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавіша скока.\n" +"Глядзіце http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4313,6 +4738,17 @@ msgstr "" "Глядзіце http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавіша скока.\n" +"Глядзіце http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4849,6 +5285,10 @@ msgstr "" "Глядзіце http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4908,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 "" "Працягласць цыкла сервера і інтэрвал, па якім аб'екты, як правіла, " "абнаўляюцца па сетцы." @@ -4926,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" @@ -4946,7 +5394,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "Узровень дэталізацыі журнала debug.txt:\n" "- <nothing> (не вядзецца)\n" @@ -4987,6 +5436,11 @@ msgstr "Сярэдні ўздым крывой святла" 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" @@ -5071,10 +5525,6 @@ msgstr "Ніжні ліміт Y для падзямелляў." msgid "Main menu script" msgstr "Скрыпт галоўнага меню" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Стыль галоўнага меню" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5082,15 +5532,18 @@ msgstr "" "Зрабіць колер туману і неба залежным ад часу сутак (світанак, захад) і " "напрамку погляду." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"Прымушае DirectX працаваць з LuaJIT. Выключыце, калі гэта выклікае праблемы." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Робіць усе вадкасці непразрыстымі" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Каталог мапаў" @@ -5170,6 +5623,11 @@ msgstr "Ліміт генерацыі мапы" msgid "Map save interval" msgstr "Інтэрвал захавання мапы" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Інтэрвал абнаўлення вадкасці" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Ліміт блокаў мапы" @@ -5275,9 +5733,14 @@ msgid "Maximum FPS" msgstr "Максімальны FPS (кадраў за секунду)" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +#, fuzzy +msgid "Maximum FPS when the window is not focused, or when the game is paused." msgstr "Максімальны FPS, калі гульня прыпыненая." +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" msgstr "Максімальная колькасць прымусова загружаемых блокаў" @@ -5335,6 +5798,13 @@ msgstr "" "Максімальная колькасць блокаў у чарзе на загрузку з файла.\n" "Пакінце пустым для аўтаматычнага выбару неабходнага значэння." +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "Максімальная колькасць прымусова загружаемых блокаў мапы." @@ -5400,18 +5870,23 @@ msgstr "" "0 - выключыць чаргу, -1 - зрабіць неабмежаванай." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +#, fuzzy +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" "Максімальны час у мілісекундах, які можа заняць спампоўванне файла\n" "(напрыклад спампоўванне мадыфікацыі)." #: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "Максімальная колькасць карыстальнікаў" +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" #: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Меню" +msgid "Maximum users" +msgstr "Максімальная колькасць карыстальнікаў" #: src/settings_translation_file.cpp msgid "Mesh cache" @@ -5462,12 +5937,27 @@ msgstr "Мінімальны памер тэкстуры" 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 "Каналы мадыфікацый" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +#, fuzzy +msgid "Modifies the size of the HUD elements." msgstr "Змяняе памер элеметаў панэлі HUD." #: src/settings_translation_file.cpp @@ -5478,6 +5968,11 @@ msgstr "Шлях да монашырыннага шрыфту" msgid "Monospace font size" msgstr "Памер монашырыннага шрыфту" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "Памер монашырыннага шрыфту" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Шум вышыні гор" @@ -5556,10 +6051,6 @@ msgstr "Назва сервера, што будзе паказвацца пры msgid "Near plane" msgstr "Блізкая плоскасць адсячэння" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Сетка" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5568,6 +6059,11 @@ msgstr "" "Сеткавы порт для праслухоўвання (UDP).\n" "Гэтае значэнне можна перавызначыць у галоўным меню падчас запуску." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "Сетка" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "Новыя карыстальнікі мусяц ўвесці гэты пароль." @@ -5580,6 +6076,11 @@ msgstr "Рух скрозь сцены" 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 "Падсвятленне блокаў" @@ -5592,14 +6093,6 @@ msgstr "Інтэрвал абнаўлення блокаў" msgid "Noises" msgstr "Шумы" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Дыскрэтызацыя мапы нармаляў" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Моц мапы нармаляў" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Колькасць узнікаючых патокаў" @@ -5636,9 +6129,10 @@ msgstr "" "'On_generated. Для большасці карыстальнікаў найлепшым значэннем можа быць 1." #: 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Колькасць дадатковых блокаў, што могуць адначасова загружацца загадам /" @@ -5646,14 +6140,6 @@ msgstr "" "Гэта кампраміс паміж дадатковымі выдаткамі на транзакцыю sqlite\n" "і спажываннем памяці (4096 = 100 МБ, як правіла)." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Колькасць ітэрацый паралакснай аклюзіі." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Сеціўны рэпазіторый" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "Непразрыстыя вадкасці" @@ -5663,11 +6149,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5678,38 +6159,12 @@ msgstr "" "небудзь меню ўжо адкрыта." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Агульны зрух эфекту паралакснай аклюзіі. Звычайна маштаб/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Агульны маштаб эфекту паралакснай аклюзіі." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Паралаксная аклюзія" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Зрух паралакснай аклюзіі" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Ітэрацыі паралакснай аклюзіі" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Рэжым паралакснай аклюзіі" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Маштаб паралакснай аклюзіі" +msgid "Optional override for chat weblink color." +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5734,17 +6189,13 @@ msgstr "Шлях да каталога тэкстур. Усе тэкстуры #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5773,6 +6224,16 @@ msgstr "Клавіша нахілення руху" msgid "Pitch move mode" msgstr "Рэжым нахілення руху" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Клавіша палёту" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "Інтэрвал паўторнай пстрычкі правай кнопкі мышы" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5781,10 +6242,6 @@ msgstr "" "Гулец можа лётаць без ўплыву дзеяння сілы цяжару.\n" "Неабходны прывілей «noclip» на серверы." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Імя гульца" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Дыстанцыя перадачы даных гульца" @@ -5793,6 +6250,11 @@ msgstr "Дыстанцыя перадачы даных гульца" msgid "Player versus player" msgstr "Гулец супраць гульца" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Білінейная фільтрацыя" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5837,10 +6299,6 @@ msgstr "Прафіліроўшчык" msgid "Profiler toggle key" msgstr "Клавіша пераключэння прафіліроўшчыка" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Прафіляванне" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5848,9 +6306,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5955,10 +6413,6 @@ msgstr "Памер шуму падводных хрыбтоў" msgid "Right key" msgstr "Клавіша ўправа" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Інтэрвал паўторнай пстрычкі правай кнопкі мышы" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Глыбіня рэчышча" @@ -6033,6 +6487,11 @@ msgstr "" "пры маштабаванні ўніз за кошт размыцця некаторых крайніх пікселяў,\n" "калі выява маштабуецца не да цэлых памераў." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Экран:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Вышыня экрана" @@ -6062,6 +6521,11 @@ msgstr "" "Якасць здымкаў экрана. Выкарыстоўваецца толькі для фармату JPEG.\n" "1 азначае найгоршую якасць, а 100 — найлепшую. 0 - прадвызначаная якасць." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Здымак экрана" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "Шум марскога дна" @@ -6075,10 +6539,6 @@ msgstr "" 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" @@ -6139,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" @@ -6166,10 +6637,20 @@ msgstr "Порт сервера" 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 "Файл спіса сервераў" @@ -6183,11 +6664,43 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Значэнне \"true\" уключае калыханне лісця.\n" +"Патрабуюцца ўключаныя шэйдэры." + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6215,6 +6728,13 @@ msgstr "" "Значэнне \"true\" уключае калыханне раслін.\n" "Патрабуюцца ўключаныя шэйдэры." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Шлях да шэйдэраў" @@ -6231,6 +6751,24 @@ msgstr "" "прадукцыйнасць на некаторых відэакартах.\n" "Працуюць толькі з OpenGL." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "Якасць здымкаў экрана" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "Мінімальны памер тэкстуры" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6239,11 +6777,8 @@ msgid "" msgstr "Зрух цені шрыфту. Калі 0, то цень не будзе паказвацца." #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Зрух цені шрыфту. Калі 0, то цень не будзе паказвацца." +msgid "Shadow strength gamma" +msgstr "" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6257,6 +6792,19 @@ msgstr "Паказваць адладачную інфармацыю" msgid "Show entity selection boxes" msgstr "Паказваць вобласць вылучэння" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Прызначыць мову. Пакіньце пустым, каб выкарыстаць мову сістэмы.\n" +"Пасля змены мовы патрэбна перазапусціць гульню." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Паведамленне аб выключэнні" @@ -6289,6 +6837,10 @@ msgstr "" "павялічыць адсотак пераносу ў кэш, прадухіляючы капіяванне даных\n" "з галоўнага патоку гульні, тым самым памяншаючы дрыжанне." +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "Частка W" @@ -6347,18 +6899,15 @@ msgstr "Хуткасць хады ўпотай" msgid "Sneaking speed, in nodes per second." msgstr "Хуткасць крадкоў у вузлах за секунду." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Празрыстасць цені шрыфту" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Гук" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Адмысловая клавіша" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Адмысловая клавіша для караскання/спускання" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6380,6 +6929,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6411,10 +6968,6 @@ msgstr "Крок шуму распаўсюджвання гор" msgid "Strength of 3D mode parallax." msgstr "Моц паралакса." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Моц згенераваных мапаў нармаляў." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6452,6 +7005,11 @@ msgstr "Сінхронны SQLite" 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 "Альтэрнатыўны шум рэльефу" @@ -6500,6 +7058,13 @@ msgstr "Сталы шум рэльефу" msgid "Texture path" msgstr "Шлях да тэкстур" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6521,6 +7086,11 @@ msgstr "" msgid "The URL for the content repository" msgstr "URL рэпазіторыя" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "The dead zone of the joystick" +msgstr "Ідэнтыфікатар джойсціка для выкарыстання" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6588,13 +7158,14 @@ msgstr "" "Неабходна наладжваць разам з active_object_range." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" "Рухавік адмалёўкі для Irrlicht.\n" "Пасля змены гэтага параметра спатрэбіцца перазупуск.\n" @@ -6604,9 +7175,10 @@ msgstr "" "з падтрымкай шэйдэраў." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "Адчувальнасць восяў джойсціка пры азіранні." #: src/settings_translation_file.cpp @@ -6633,6 +7205,12 @@ msgstr "" "элементы.\n" "Значэнне 0 выключае гэтую функцыю." +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6642,10 +7220,10 @@ msgstr "" "джойсціка." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" "Час у секундах паміж паўторамі падзей пры ўтрыманні правай кнопкі мышы." @@ -6689,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 @@ -6716,6 +7295,19 @@ msgstr "Затрымка падказкі" 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 "Шум дрэў" @@ -6797,8 +7389,9 @@ msgid "Use bilinear filtering when scaling textures." msgstr "Выкарыстоўваць білінейную фільтрацыю пры маштабаванні тэкстур." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" @@ -6807,10 +7400,25 @@ msgstr "" "пакета тэкстур з высокай раздзяляльнай здольнасцю.\n" "Гама-карэкцыя пры памяншэнні маштабу не падтрымліваецца." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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" @@ -6908,7 +7516,8 @@ msgid "Viewing range" msgstr "Дыяпазон бачнасці" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +#, fuzzy +msgid "Virtual joystick triggers Aux1 button" msgstr "Дадатковая кнопка трыгераў віртуальнага джойсціка" #: src/settings_translation_file.cpp @@ -6990,6 +7599,11 @@ msgstr "Даўжыня водных хваляў" msgid "Waving plants" msgstr "Калыханне раслін" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Колер вобласці вылучэння" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7013,14 +7627,14 @@ msgstr "" "якія не падтрымліваюць перадачу тэкстур з апаратуры назад." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7037,14 +7651,10 @@ msgstr "" "сусветнага аўтамасштабавання тэкстур." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Выкарыстанне шрыфтоў FreeType. Падтрымка FreeType мусіць быць уключаная " -"падчас кампіляцыі." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7083,13 +7693,23 @@ msgid "" "pause menu." 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)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "Шырыня кампанента пачатковага памеру акна." #: src/settings_translation_file.cpp @@ -7187,29 +7807,301 @@ msgstr "Y-узровень нізкага рэльефу і марскога д 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" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "Таймаўт cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Ліміт адначасовых злучэнняў cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Таймаўт cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "- Творчы рэжым: " + +#~ msgid "- Damage: " +#~ msgstr "- Пашкоджанні: " #~ msgid "" -#~ "Map generation attributes specific to Mapgen v5.\n" -#~ "Flags that are not enabled are not modified from the default.\n" -#~ "Flags starting with 'no' are used to explicitly disable them." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Атрыбуты генерацыі мапы для генератара мапы 5.\n" -#~ "Нявызначаныя атрыбуты прадвызначана не змяняюцца.\n" -#~ "Атрыбуты, што пачынаюцца з 'no' выкарыстоўваюцца для іх выключэння." +#~ "0 = паралаксная аклюзія са звесткамі аб нахіле (хутка).\n" +#~ "1 = рэльефнае тэкстураванне (павольней, але якасней)." -#~ msgid "Toggle Cinematic" -#~ msgstr "Кінематаграфічнасць" +#~ msgid "Address / Port" +#~ msgstr "Адрас / Порт" + +#~ msgid "" +#~ "Adjust the gamma encoding for the light tables. Higher numbers are " +#~ "brighter.\n" +#~ "This setting is for the client only and is ignored by the server." +#~ msgstr "" +#~ "Наладка гама-кадавання для светлавых табліц. Высокія значэнні — больш " +#~ "ярчэйшыя.\n" +#~ "Гэты параметр прызначаны толькі для кліента і ігнаруецца серверам." + +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "Кіруе звужэннем астравоў горнага тыпу ніжэй сярэдняй кропкі." + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Вы ўпэўненыя, што хочаце скінуць свет адзіночнай гульні?" + +#~ msgid "Back" +#~ msgstr "Назад" + +#~ msgid "Basic" +#~ msgstr "Базавыя" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Біты на піксель (глыбіня колеру) у поўнаэкранным рэжыме." + +#~ msgid "Bump Mapping" +#~ msgstr "Тэкстураванне маскамі" + +#~ msgid "Bumpmapping" +#~ msgstr "Рэльефнае тэкстураванне" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Цэнтр сярэдняга ўздыму крывой святла." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Змена інтэрфейсу галоўнага меню:\n" +#~ "- full: выбар свету для адзіночнай альбо сеткавай гульні, асобны спіс " +#~ "чужых сервераў.\n" +#~ "- simple: адзін свет для адзіночнай гульні ў меню, дзе спіс чужых " +#~ "сервераў; можа быць карысна для невелічкіх экранаў.\n" +#~ "Прадвызначана: simple для Android, full для ўсіх астатніх." + +#~ msgid "Config mods" +#~ msgstr "Налады мадыфікацый" + +#~ 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." +#~ msgstr "" +#~ "Кіруе шчыльнасцю горнага рэльефу лятучых астравоў.\n" +#~ "Гэты зрух дадаецца да значэння 'np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Кіруе шырынёй тунэляў. Меншае значэнне стварае больш шырокія тунэлі." + +#~ msgid "Credits" +#~ msgstr "Падзякі" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Колер перакрыжавання (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Пашкоджанні ўключаныя" + +#~ msgid "Darkness sharpness" +#~ msgstr "Рэзкасць цемры" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Прадвызначаны таймаўт для cURL, зададзены ў мілісекундах.\n" +#~ "Уплывае толькі пры кампіляцыі з cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Вызначае вобласці гладкага рэльефу лятучых астравоў.\n" +#~ "Гладкая паверхня з'яўляецца, калі шум больш нуля." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Вызначае крок дыскрэтызацыі тэкстуры.\n" +#~ "Больш высокае значэнне прыводзіць да больш гладкіх мапаў нармаляў." + +#~ msgid "Del. Favorite" +#~ msgstr "Прыбраць з упадабанага" + +#~ msgid "" +#~ "Deprecated, define and locate cave liquids using biome definitions " +#~ "instead.\n" +#~ "Y of upper limit of lava in large caves." +#~ msgstr "" +#~ "Састарэлы. Вызначае і размяшчае пячорныя вадкасці з выкарыстаннем " +#~ "азначэнняў біёму.\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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Уключае рэльефнае тэкстураванне. Мапы нармаляў мусяць быць пакункам " +#~ "тэкстур ці створанымі аўтаматычна.\n" +#~ "Патрабуюцца ўключаныя шэйдэры." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Уключае кінематаграфічнае танальнае адлюстраванне" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Уключае генерацыю мапаў нармаляў лётма (эфект Emboss).\n" +#~ "Патрабуецца рэльефнае тэкстураванне." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Уключае паралакснае аклюзіўнае тэкстураванне.\n" +#~ "Патрабуюцца ўключаныя шэйдэры." + +#~ msgid "Enter " +#~ msgstr "Увод " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Эксперыментальны параметр, які можа прывесці да візуальных прагалаў\n" +#~ "паміж блокамі пры значэнні большым за 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS у меню паўзы" + +#~ msgid "Fallback font shadow" +#~ msgstr "Цень рэзервовага шрыфту" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Празрыстасць цені рэзервовага шрыфту" + +#~ msgid "Fallback font size" +#~ msgstr "Памер рэзервовага шрыфту" + +#~ msgid "Filtering" +#~ msgstr "Фільтрацыя" + +#~ msgid "Floatland base height noise" +#~ msgstr "Шум базавай вышыні лятучых астравоў" + +#~ msgid "Floatland mountain height" +#~ msgstr "Вышыня гор на лятучых астравоў" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Празрыстасць цені шрыфту (ад 0 да 255)." + +#~ msgid "FreeType fonts" +#~ msgstr "Шрыфты FreeType" + +#~ msgid "Full screen BPP" +#~ msgstr "Глыбіня колеру ў поўнаэкранным рэжыме (бітаў на піксель)" + +#~ msgid "Game" +#~ msgstr "Гульня" + +#~ msgid "Gamma" +#~ msgstr "Гама" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Генерацыя мапы нармаляў" + +#~ msgid "Generate normalmaps" +#~ msgstr "Генерацыя мапы нармаляў" + +#~ msgid "HUD scale factor" +#~ msgstr "Каэфіцыент маштабавання HUD" + +#~ msgid "High-precision FPU" +#~ msgstr "Высокадакладны FPU" + +#~ msgid "IPv6 support." +#~ msgstr "Падтрымка IPv6." + +#~ msgid "" +#~ "If enabled together with fly mode, makes move directions relative to the " +#~ "player's pitch." +#~ msgstr "" +#~ "Калі ўключана адначасова з рэжымам палёту, то вызначае напрамак руху " +#~ "адносна кроку гульца." + +#~ 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 "Глыбіня лавы" + +#~ msgid "Lightness sharpness" +#~ msgstr "Рэзкасць паваротлівасці" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Абмежаванне чэргаў на дыску" + +#~ msgid "Main" +#~ msgstr "Галоўнае меню" + +#~ msgid "Main menu style" +#~ msgstr "Стыль галоўнага меню" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "Прымушае DirectX працаваць з LuaJIT. Выключыце, калі гэта выклікае " +#~ "праблемы." #~ msgid "" #~ "Map generation attributes specific to Mapgen Carpathian.\n" @@ -7220,20 +8112,14 @@ msgstr "Таймаўт cURL" #~ "Нявызначаныя атрыбуты прадвызначана не змяняюцца.\n" #~ "Атрыбуты, што пачынаюцца з \"no\", выкарыстоўваюцца для іх выключэння." -#~ msgid "Content Store" -#~ msgstr "Крама дадаткаў" - -#~ msgid "Select Package File:" -#~ msgstr "Абраць файл пакунка:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Y верхняга ліміту лавы ў шырокіх пячорах." - -#~ msgid "Waving Water" -#~ msgstr "Хваляванне вады" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Выступ падзямелляў па-над рэльефам." +#~ msgid "" +#~ "Map generation attributes specific to Mapgen v5.\n" +#~ "Flags that are not enabled are not modified from the default.\n" +#~ "Flags starting with 'no' are used to explicitly disable them." +#~ msgstr "" +#~ "Атрыбуты генерацыі мапы для генератара мапы 5.\n" +#~ "Нявызначаныя атрыбуты прадвызначана не змяняюцца.\n" +#~ "Атрыбуты, што пачынаюцца з 'no' выкарыстоўваюцца для іх выключэння." #~ msgid "" #~ "Map generation attributes specific to Mapgen v7.\n" @@ -7246,29 +8132,128 @@ msgstr "Таймаўт cURL" #~ "Нявызначаныя параметры прадвызначана не змяняюцца.\n" #~ "Параметры, што пачынаюцца з \"no\", выкарыстоўваюцца для выключэння." +#~ msgid "Menus" +#~ msgstr "Меню" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Мінімапа ў рэжыме радару, павелічэнне х2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Мінімапа ў рэжыме радару, павелічэнне х4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Мінімапа ў рэжыме паверхні, павелічэнне х2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Мінімапа ў рэжыме паверхні, павелічэнне х4" + +#~ msgid "Name / Password" +#~ msgstr "Імя / Пароль" + +#~ msgid "Name/Password" +#~ msgstr "Імя/Пароль" + +#~ msgid "No" +#~ msgstr "Не" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Дыскрэтызацыя мапы нармаляў" + +#~ msgid "Normalmaps strength" +#~ msgstr "Моц мапы нармаляў" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Колькасць ітэрацый паралакснай аклюзіі." + +#~ msgid "Ok" +#~ msgstr "Добра" + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "Агульны зрух эфекту паралакснай аклюзіі. Звычайна маштаб/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Агульны маштаб эфекту паралакснай аклюзіі." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Паралаксная аклюзія" + +#~ msgid "Parallax occlusion" +#~ msgstr "Паралаксная аклюзія" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Зрух паралакснай аклюзіі" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Ітэрацыі паралакснай аклюзіі" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Рэжым паралакснай аклюзіі" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Маштаб паралакснай аклюзіі" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Інтэнсіўнасць паралакснай аклюзіі" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Шлях да TrueTypeFont ці растравага шрыфту." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Каталог для захоўвання здымкаў экрана." + +#~ msgid "Player name" +#~ msgstr "Імя гульца" + +#~ msgid "Profiling" +#~ msgstr "Прафіляванне" + #~ msgid "Projecting dungeons" #~ msgstr "Праектаванне падзямелляў" +#~ msgid "PvP enabled" +#~ msgstr "PvP уключаны" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Скінуць свет адзіночнай гульні" + +#~ msgid "Select Package File:" +#~ msgstr "Абраць файл пакунка:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Сервер / Адзіночная гульня" + +#~ msgid "Shadow limit" +#~ msgstr "Ліміт ценяў" + +#, fuzzy #~ msgid "" -#~ "If enabled together with fly mode, makes move directions relative to the " -#~ "player's pitch." -#~ msgstr "" -#~ "Калі ўключана адначасова з рэжымам палёту, то вызначае напрамак руху " -#~ "адносна кроку гульца." +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "Зрух цені шрыфту. Калі 0, то цень не будзе паказвацца." -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Y-узровень, да якога распаўсюджваюцца цені лятучых астравоў." +#~ msgid "Special" +#~ msgstr "Адмысловая" -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "Y-узровень сярэдняй кропкі і паверхні азёр лятучых астравоў." +#~ msgid "Special key" +#~ msgstr "Адмысловая клавіша" -#~ msgid "Waving water" -#~ msgstr "Хваляванне вады" +#~ msgid "Start Singleplayer" +#~ msgstr "Пачаць адзіночную гульню" -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Варыяцыя вышыні пагоркаў і глыбінь азёр на гладкай мясцовасці лятучых " -#~ "астравоў." +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Моц згенераваных мапаў нармаляў." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Моц сярэдняга ўздыму крывой святла." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Гэты шрыфт будзе выкарыстоўваецца для некаторых моў." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Для ўключэння шэйдэраў неабходна выкарыстоўваць OpenGL." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Кінематаграфічнасць" #~ msgid "" #~ "Typical maximum height, above and below midpoint, of floatland mountains." @@ -7276,104 +8261,60 @@ msgstr "Таймаўт cURL" #~ "Тыповая максімальная вышыня, вышэй і ніжэй сярэдняй кропкі гор лятучых " #~ "астравоў." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Гэты шрыфт будзе выкарыстоўваецца для некаторых моў." +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Варыяцыя вышыні пагоркаў і глыбінь азёр на гладкай мясцовасці лятучых " +#~ "астравоў." -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Моц сярэдняга ўздыму крывой святла." +#~ msgid "Waving Water" +#~ msgstr "Хваляванне вады" -#~ msgid "Shadow limit" -#~ msgstr "Ліміт ценяў" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Шлях да TrueTypeFont ці растравага шрыфту." - -#~ msgid "Lightness sharpness" -#~ msgstr "Рэзкасць паваротлівасці" - -#~ msgid "Lava depth" -#~ msgstr "Глыбіня лавы" - -#~ msgid "IPv6 support." -#~ msgstr "Падтрымка IPv6." - -#~ msgid "Gamma" -#~ msgstr "Гама" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Празрыстасць цені шрыфту (ад 0 да 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Вышыня гор на лятучых астравоў" - -#~ msgid "Floatland base height noise" -#~ msgstr "Шум базавай вышыні лятучых астравоў" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Уключае кінематаграфічнае танальнае адлюстраванне" - -#~ msgid "Enable VBO" -#~ msgstr "Уключыць VBO" +#~ msgid "Waving water" +#~ msgstr "Хваляванне вады" +#, fuzzy #~ msgid "" -#~ "Deprecated, define and locate cave liquids using biome definitions " -#~ "instead.\n" -#~ "Y of upper limit of lava in large caves." +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." #~ msgstr "" -#~ "Састарэлы. Вызначае і размяшчае пячорныя вадкасці з выкарыстаннем " -#~ "азначэнняў біёму.\n" -#~ "Y верхняй мяжы лавы ў вялікіх пячорах." +#~ "Выкарыстанне шрыфтоў FreeType. Падтрымка FreeType мусіць быць уключаная " +#~ "падчас кампіляцыі." +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Выступ падзямелляў па-над рэльефам." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Y верхняга ліміту лавы ў шырокіх пячорах." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "Y-узровень сярэдняй кропкі і паверхні азёр лятучых астравоў." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Y-узровень, да якога распаўсюджваюцца цені лятучых астравоў." + +#~ msgid "Yes" +#~ msgstr "Так" + +#, c-format #~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ "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 "" -#~ "Вызначае вобласці гладкага рэльефу лятучых астравоў.\n" -#~ "Гладкая паверхня з'яўляецца, калі шум больш нуля." +#~ "Вы хочаце першы раз увайсці на сервер з назвай «%s».\n" +#~ "Калі вы працягнеце, то на серверы будзе створаны новы конт з вашамі " +#~ "данымі.\n" +#~ "Калі ласка, ўвядзіце пароль яшчэ раз і націсніце «Зарэгістравацца і " +#~ "далучыцца», каб пацвердзіць стварэнне конта альбо \"Скасаваць\", каб " +#~ "адмовіцца." -#~ msgid "Darkness sharpness" -#~ msgstr "Рэзкасць цемры" +#, fuzzy +#~ msgid "You died." +#~ msgstr "Вы загінулі" -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Кіруе шырынёй тунэляў. Меншае значэнне стварае больш шырокія тунэлі." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Кіруе шчыльнасцю горнага рэльефу лятучых астравоў.\n" -#~ "Гэты зрух дадаецца да значэння 'np_mountain'." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Цэнтр сярэдняга ўздыму крывой святла." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "Кіруе звужэннем астравоў горнага тыпу ніжэй сярэдняй кропкі." - -#~ msgid "" -#~ "Adjust the gamma encoding for the light tables. Higher numbers are " -#~ "brighter.\n" -#~ "This setting is for the client only and is ignored by the server." -#~ msgstr "" -#~ "Наладка гама-кадавання для светлавых табліц. Высокія значэнні — больш " -#~ "ярчэйшыя.\n" -#~ "Гэты параметр прызначаны толькі для кліента і ігнаруецца серверам." - -#~ msgid "Path to save screenshots at." -#~ msgstr "Каталог для захоўвання здымкаў экрана." - -#~ msgid "Parallax occlusion strength" -#~ msgstr "Інтэнсіўнасць паралакснай аклюзіі" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Абмежаванне чэргаў на дыску" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Спампоўванне і ўсталёўка $1. Калі ласка, пачакайце…" - -#~ msgid "Back" -#~ msgstr "Назад" - -#~ msgid "Ok" -#~ msgstr "Добра" +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/bg/minetest.po b/po/bg/minetest.po new file mode 100644 index 000000000..ce95a8879 --- /dev/null +++ b/po/bg/minetest.po @@ -0,0 +1,6986 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \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" +"Language: bg\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" +"X-Generator: Weblate 4.12-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Изчистване на изходящата опашка на разговорите" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Празна команда." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Главно меню" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Недействителна команда: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Подадена команда: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Играчи на линия" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Играчи на линия: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Изходящата опашка на разговори е изпразнена." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Командата е забранена от сървъра." + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "Прераждане" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "You died" +msgstr "Умряхте" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Достъпни команди:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Достъпни команди: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Недостъпни команди: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[all | <команда>]" + +#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp +msgid "OK" +msgstr "Добре" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<няма достъпни>" + +#: builtin/fstk/ui.lua +msgid "An error occurred in a Lua script:" +msgstr "Грешка в скрипт на Lua:" + +#: builtin/fstk/ui.lua +msgid "An error occurred:" +msgstr "Възникна грешка:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Главно меню" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "Повторно свързване" + +#: builtin/fstk/ui.lua +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 "Изданието на протокола не съвпада. " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "Сървърът налага издание $1 на протокола. " + +#: builtin/mainmenu/common.lua +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 на протокола." + +#: builtin/mainmenu/common.lua +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_register.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp +#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp +msgid "Cancel" +msgstr "Отказ" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +msgstr "Зависимости:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Изключване всички" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable modpack" +msgstr "Изкл. на пакета" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "Включване всички" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable modpack" +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 "" +"Включването на модификацията „$1“ не е успешно, защото съдържа забранени " +"символи. Разрешени са само символите [a-z0-9_]." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Find More Mods" +msgstr "Още модификации" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Модификация:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No (optional) dependencies" +msgstr "Няма (незадължителни) зависимости" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "Играта няма описание." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No hard dependencies" +msgstr "Няма задължителни зависимости" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." +msgstr "Пакетът с модификации няма описание." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No optional dependencies" +msgstr "Няма незадължителни зависимости" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "Незадължителни зависимости:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Запазване" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Свят:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "включен" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "„$1“ вече съществува. Да бъде ли презаписан?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 и $2 зависимости ще бъдат инсталирани." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "$1 се изтеглят…" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 задължителни зависимости не могат да бъдат намерени." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 ще бъдат инсталирани, а $2 зависимости ще бъдат пропуснати." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "Всички пакети" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Вече инсталирано" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Back to Main Menu" +msgstr "Главно меню" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +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..." +msgstr "Изтегляне…" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Failed to download $1" +msgstr "Грешка при изтеглянето на $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Games" +msgstr "Игри" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install" +msgstr "Инсталиране" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "Инсталиране $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Инсталиране на липсващи зависимости" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Инсталиране: Неподдържан вид на файл или повреден архив" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Mods" +msgstr "Модификации" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No packages could be retrieved" +msgstr "Пакетите не могат да бъдат получени" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No results" +msgstr "Няма резултати" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No updates" +msgstr "Няма обновяване" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Не е намерено" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Презаписване" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Уверете се, че основната игра е правилна." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Изчакващи" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" +msgstr "Пакети с текстури" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Uninstall" +msgstr "Премахване" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update" +msgstr "Обновяване" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "Обновяване всички [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Вижте повече в браузъра" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "Свят с името „$1“ вече съществува" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Additional terrain" +msgstr "Допълнителен терен" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Altitude chill" +msgstr "Застудяване във височина" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Altitude dry" +msgstr "Засушаване във височина" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biome blending" +msgstr "Смесване на биоми" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biomes" +msgstr "Биоми" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caverns" +msgstr "Големи пещери" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caves" +msgstr "Пещери" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "Създаване" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "Декорации" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Development Test is meant for developers." +msgstr "Внимание: Тестът за разработка е предназначен за разработчици." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Dungeons" +msgstr "Тъмници" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "Равен терен" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "Плаващи земни маси в небето" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "Небесни острови (експериментално)" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "Създаване на нефрактален терен: Морета и подземен свят" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Hills" +msgstr "Хълмове" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Humid rivers" +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 +msgid "Lakes" +msgstr "Езера" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Low humidity and high heat causes shallow or dry rivers" +msgstr "Ниската влажност и горещините причиняват плитки или пресъхнали реки" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "Генератор на карти" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "Настройки на генератора" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mapgen-specific flags" +msgstr "Специфични за генератора настройки" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mountains" +msgstr "Планини" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mud flow" +msgstr "Кален поток" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Network of tunnels and caves" +msgstr "Мрежа от тунели и пещери" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No game selected" +msgstr "Няма избрана игра" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces heat with altitude" +msgstr "Намалява топлината във височина" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces humidity with altitude" +msgstr "Намалява влажността във височина" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Rivers" +msgstr "Реки" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Sea level rivers" +msgstr "Реки на морското ниво" + +#: builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" +msgstr "Семе" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Smooth transition between biomes" +msgstr "Плавен преход между биомите" + +#: builtin/mainmenu/dlg_create_world.lua +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 "Структури, появяващи се върху терена, обикновено дървета и растения" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert" +msgstr "Умерен климат, пустиня" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle" +msgstr "Умерен климат, пустиня, джунгла" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgstr "Умерен климат, пустиня, джунгла, тундра, тайга" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Terrain surface erosion" +msgstr "Ерозия на земната повърхност" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Trees and jungle grass" +msgstr "Трева в джунглата и дървета" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Vary river depth" +msgstr "Промяна в дълбочината на реките" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Very large caverns deep in the underground" +msgstr "Много големи пещери дълбоко под земята" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "Име на света" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no games installed." +msgstr "Няма инсталирани игри." + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "Сигурни ли сте, че искате да премахнете „$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 "Премахване" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: failed to delete \"$1\"" +msgstr "pkgmgr: грешка при премахване на „$1“" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: invalid path \"$1\"" +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 +#, 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 "Приемане" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "Преименуване на пакет модификации:" + +#: 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.conf, което ще " +"отмени всяко преименуване." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "(Настройката няма описание)" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "2D Noise" +msgstr "Двуизмерен шум" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +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 "Изключено" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "Редактиране" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "Включено" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Lacunarity" +msgstr "Лакунарност" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Octaves" +msgstr "Октави" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" +msgstr "Отместване" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Persistence" +msgstr "Устойчивост" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "Въведете цяло число." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "Въведете число." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "По подразбиране" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "Мащаб" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Търсене" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "Избор на папка" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "Избор на файл" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "Технически наименования" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "Стойността трябва да е най-малко $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "Стойността трябва да е най-много $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "Разпределение по X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "Разпределение по Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "Разпределение по Z" + +#. ~ "absvalue" is a noise parameter flag. +#. It is short for "absolute value". +#. It can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "absvalue" +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 "подразбирани" + +#. ~ "eased" is a noise parameter flag. +#. It is used to make the map smoother and +#. can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "eased" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 (Enabled)" +msgstr "$1 (включено)" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 mods" +msgstr "$1 модификации" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Failed to install $1 to $2" +msgstr "Грешка при инсталиране на $1 в $2" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find real mod name for: $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find suitable folder name for modpack $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to find a valid mod or modpack" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a $1 as a texture pack" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a game as a $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a mod as a $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a modpack as a $1" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Зареждане…" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Списъкът с обществени сървъри е изключен" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Включете списъка на обществени сървъри и проверете връзката с интернет." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Относно" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Активни сътрудници" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Активен визуализатор:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Основни разработчици" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "Предишни сътрудници" + +#: 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 +msgid "Browse online content" +msgstr "Преглед на съдържание онлайн" + +#: builtin/mainmenu/tab_content.lua +msgid "Content" +msgstr "Съдържание" + +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "Изкл. на пакет с текстури" + +#: builtin/mainmenu/tab_content.lua +msgid "Information:" +msgstr "Описание:" + +#: builtin/mainmenu/tab_content.lua +msgid "Installed Packages:" +msgstr "Инсталирани пакети:" + +#: builtin/mainmenu/tab_content.lua +msgid "No dependencies." +msgstr "Няма зависимости." + +#: builtin/mainmenu/tab_content.lua +msgid "No package description available" +msgstr "Пакетът е без описание" + +#: builtin/mainmenu/tab_content.lua +msgid "Rename" +msgstr "Преименуване" + +#: builtin/mainmenu/tab_content.lua +msgid "Uninstall Package" +msgstr "Премахване на пакет" + +#: builtin/mainmenu/tab_content.lua +msgid "Use Texture Pack" +msgstr "Вкл. на пакет с текстури" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Обявяване на сървъра" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Адрес за свързване" + +#: builtin/mainmenu/tab_local.lua +msgid "Creative Mode" +msgstr "Творчески режим" + +#: builtin/mainmenu/tab_local.lua +msgid "Enable Damage" +msgstr "Получаване на щети" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Създаване на игра" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Създаване на сървър" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +msgstr "Инсталиране на игри от ContentDB" + +#: 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 +msgid "Play Game" +msgstr "Започване на игра" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "Порт" + +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Модификации" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Избор на свят:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Порт на сървъра" + +#: builtin/mainmenu/tab_local.lua +msgid "Start Game" +msgstr "Създаване на игра" + +#: builtin/mainmenu/tab_online.lua +msgid "Address" +msgstr "Адрес" + +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Изчистване" + +#: builtin/mainmenu/tab_online.lua +msgid "Creative mode" +msgstr "Творчески режим" + +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Щети / PvP" + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Любими" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Несъвместими сървъри" + +#: builtin/mainmenu/tab_online.lua +msgid "Join Game" +msgstr "Включване към игра" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Обществени сървъри" + +#: builtin/mainmenu/tab_online.lua +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 "" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "Тримерни облаци" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "All Settings" +msgstr "Всички настройки" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "Сгласяне:" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave Screen Size" +msgstr "Авт. запазване на размера" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/client/game.cpp +msgid "Change Keys" +msgstr "Промяна на клавиши" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "Свързано стъкло" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Динамични сенки" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Динамични сенки: " + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "Луксозни листа" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "Силни" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Слаби" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Нормални" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Mipmap" +msgstr "Миникарта" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Mipmap + Aniso. Filter" +msgstr "Миникарта + анизо. филтър" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "Без филтър" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "No Mipmap" +msgstr "Без миникарта" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "Осветяване на възел" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "Ограждане на възел" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "Без" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "Непрозрачни листа" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "Непрозрачна вода" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "Отломки" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Екран:" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "Настройки" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "Земни маси в небето (експериментално)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "Обикновени листа" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "Гладко осветление" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "Текстуриране:" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Touch threshold (px):" +msgstr "Праг на докосване: (px)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Много силни" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Много слаби" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "Поклащащи се листа" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "Поклащащи се течности" + +#: builtin/mainmenu/tab_settings.lua +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 "Времето за свързване изтече." + +#: src/client/client.cpp +msgid "Done!" +msgstr "Готово!" + +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "Иницииране на възли" + +#: src/client/client.cpp +msgid "Initializing nodes..." +msgstr "Иницииране на възли…" + +#: src/client/client.cpp +msgid "Loading textures..." +msgstr "Зареждане на текстури…" + +#: src/client/client.cpp +msgid "Rebuilding shaders..." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "Грешка при свързване (изтекло време?)" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game: " +msgstr "Играта не може да бъде намерена или заредена: " + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "Главно меню" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "Няма избран свят, нито зададен адрес. Няма какво да бъде направено." + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "Името на играча е твърде дълго." + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Изберете име!" + +#: src/client/clientlauncher.cpp +msgid "Provided password file failed to open: " +msgstr "Файлът с пароли не се отваря: " + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "Зададеният път към света не съществува: " + +#: src/client/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" +"\n" +"Прегледайте debug.txt за повече информация." + +#: src/client/game.cpp +msgid "- Address: " +msgstr "- Адрес: " + +#: src/client/game.cpp +msgid "- Mode: " +msgstr "- Режим: " + +#: src/client/game.cpp +msgid "- Port: " +msgstr "- Порт: " + +#: src/client/game.cpp +msgid "- Public: " +msgstr "- Обществен: " + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/client/game.cpp +msgid "- Server Name: " +msgstr "- Име на сървър: " + +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Възникна грешка:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Достъпът е отказан. Причина: %s" + +#: src/client/game.cpp +msgid "Automatic forward disabled" +msgstr "Автоматичното движение напред е изключено" + +#: src/client/game.cpp +msgid "Automatic forward enabled" +msgstr "Автоматичното движение напред е включено" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Контурите на блоковете са скрити" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Контурите на всички блокове са видими" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Контурите на текущия блок са видими" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Контурите на близките блокове са видими" + +#: src/client/game.cpp +msgid "Camera update disabled" +msgstr "Опресняването на екрана при движение е изключено" + +#: src/client/game.cpp +msgid "Camera update enabled" +msgstr "Опресняването на екрана при движение е включено" + +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" +"Контурите на блоковете не могат да бъдат показани (заб.: липсва правото " +"„basic_debug“)" + +#: src/client/game.cpp +msgid "Change Password" +msgstr "Промяна на парола" + +#: src/client/game.cpp +msgid "Cinematic mode disabled" +msgstr "Кинематографичният режим е изключен" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "Кинематографичният режим е включен" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Клиентът е изключен" + +#: src/client/game.cpp +msgid "Client side scripting is disabled" +msgstr "Изпълняване на скриптове от страната на клиента е изключено" + +#: src/client/game.cpp +msgid "Connecting to server..." +msgstr "Свързване със сървър…" + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Грешка във връзката поради неизвестна причина" + +#: src/client/game.cpp +msgid "Continue" +msgstr "Продължаване" + +#: src/client/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- 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 "" + +#: src/client/game.cpp +msgid "Creating client..." +msgstr "Създаване на клиент…" + +#: src/client/game.cpp +msgid "Creating server..." +msgstr "Създаване на сървър…" + +#: src/client/game.cpp +msgid "Debug info and profiler graph hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info shown" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info, profiler graph, and wireframe hidden" +msgstr "" + +#: src/client/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/client/game.cpp +msgid "Disabled unlimited viewing range" +msgstr "Неограниченият обхват на видимост е изключен" + +#: src/client/game.cpp +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 "Изход към менюто" + +#: src/client/game.cpp +msgid "Exit to OS" +msgstr "Изход към ОС" + +#: src/client/game.cpp +msgid "Fast mode disabled" +msgstr "Режимът на бързо движение е изключен" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "Режимът на бързо движение е включен" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "Режимът на бързо движение е включен (заб.: липсва правото „fast“)" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "Режимът на летене е изключен" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "Режимът на летене е включен" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "Режимът на летене е включен (заб.: липсва правото „fly“)" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "Мъглата е изключена" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "Мъглата е включена" + +#: src/client/game.cpp +msgid "Game info:" +msgstr "Информация за играта:" + +#: src/client/game.cpp +msgid "Game paused" +msgstr "Играта е на пауза" + +#: src/client/game.cpp +msgid "Hosting server" +msgstr "Домакин на играта" + +#: src/client/game.cpp +msgid "Item definitions..." +msgstr "Дефиниции на предмети…" + +#: src/client/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Media..." +msgstr "Медия…" + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "Картата е спряна или от играта, или от модификация" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "Множество играчи" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "Режимът „без изрязване“ е изключен" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "Режимът „без изрязване“ е включен" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" +msgstr "Режимът „без изрязване“ е включен (заб.: липсва правото „noclip“)" + +#: src/client/game.cpp +msgid "Node definitions..." +msgstr "Дефиниции на възли…" + +#: src/client/game.cpp +msgid "Off" +msgstr "Изключено" + +#: src/client/game.cpp +msgid "On" +msgstr "Включено" + +#: src/client/game.cpp +msgid "Pitch move mode disabled" +msgstr "Режимът „промяна на височината“ е изключен" + +#: src/client/game.cpp +msgid "Pitch move mode enabled" +msgstr "Режимът „промяна на височината“ е включен" + +#: src/client/game.cpp +msgid "Profiler graph shown" +msgstr "Графиката на профилатора е показана" + +#: src/client/game.cpp +msgid "Remote server" +msgstr "Отдалечен сървър" + +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "Намиране на адрес…" + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "Изключване…" + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "Един играч" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "Сила на звука" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "Звукът е заглушен" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "Системата за звук е изключена" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "В това издание не се поддържа звукова система" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "Звукът е пуснат" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Сървърът вероятно използва друго издание на %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "Обхватът на видимостта е променен на %d" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +msgstr "Обхватът на видимостта е на своя максимум: %d" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at minimum: %d" +msgstr "Обхватът на видимостта е на своя минимум: %d" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "Силата на звука е променена на %d%%" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "Показани са телените рамки" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "Мащабирането е спряно или от играта, или от модификация" + +#: src/client/game.cpp +msgid "ok" +msgstr "добре" + +#: src/client/gameui.cpp +msgid "Chat hidden" +msgstr "Разговорите са скрити" + +#: src/client/gameui.cpp +msgid "Chat shown" +msgstr "Разговорите са видими" + +#: src/client/gameui.cpp +msgid "HUD hidden" +msgstr "HUD скрит" + +#: src/client/gameui.cpp +msgid "HUD shown" +msgstr "HUD видим" + +#: src/client/gameui.cpp +msgid "Profiler hidden" +msgstr "Профилаторът е скрит" + +#: src/client/gameui.cpp +#, c-format +msgid "Profiler shown (page %d of %d)" +msgstr "Профилаторът е видим (страница %d от %d)" + +#: src/client/keycode.cpp +msgid "Apps" +msgstr "Приложения" + +#: src/client/keycode.cpp +msgid "Backspace" +msgstr "Backspace" + +#: src/client/keycode.cpp +msgid "Caps Lock" +msgstr "Caps Lock" + +#: src/client/keycode.cpp +msgid "Control" +msgstr "Control" + +#: src/client/keycode.cpp +msgid "Down" +msgstr "Надолу" + +#: src/client/keycode.cpp +msgid "End" +msgstr "" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "Наляво" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "Ляв бутон" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "Ляв Control" + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "Ляв Menu" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "Ляв Shift" + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "Ляв Windows" + +#. ~ Key name, common on Windows keyboards +#: src/client/keycode.cpp +msgid "Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Middle Button" +msgstr "Среден бутон" + +#: src/client/keycode.cpp +msgid "Num Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad *" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad +" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad -" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad /" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 0" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 2" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 3" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 4" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 5" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 6" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 7" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 8" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 9" +msgstr "" + +#: src/client/keycode.cpp +msgid "OEM Clear" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page down" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page up" +msgstr "" + +#: src/client/keycode.cpp +msgid "Pause" +msgstr "" + +#: src/client/keycode.cpp +msgid "Play" +msgstr "" + +#. ~ "Print screen" key +#: src/client/keycode.cpp +msgid "Print" +msgstr "" + +#: src/client/keycode.cpp +msgid "Return" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" +msgstr "Дясно" + +#: src/client/keycode.cpp +msgid "Right Button" +msgstr "Десен бутон" + +#: src/client/keycode.cpp +msgid "Right Control" +msgstr "Десен Control" + +#: src/client/keycode.cpp +msgid "Right Menu" +msgstr "Десен Menu" + +#: src/client/keycode.cpp +msgid "Right Shift" +msgstr "Десен Shift" + +#: src/client/keycode.cpp +msgid "Right Windows" +msgstr "Десен Windows" + +#: src/client/keycode.cpp +msgid "Scroll Lock" +msgstr "Scroll Lock" + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" +msgstr "" + +#: src/client/keycode.cpp +msgid "Shift" +msgstr "Shift" + +#: src/client/keycode.cpp +msgid "Sleep" +msgstr "Sleep" + +#: src/client/keycode.cpp +msgid "Snapshot" +msgstr "Снимка на екрана" + +#: src/client/keycode.cpp +msgid "Space" +msgstr "Интервал" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "Табулатор" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "Нагоре" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 2" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Zoom" +msgstr "Мащабиране" + +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Картата е скрита" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Картата е в режим на радар, мащаб x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Картата е в режим на повърхност, мащаб x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Картата е в режим на текстура" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Грешка при отваряне на страница" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Отваряне на страница" + +#: src/gui/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "Напред" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "\"Aux1\" = climb down" +msgstr "„Aux1“ = слизане" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Autoforward" +msgstr "Автоматично напред" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Automatic jumping" +msgstr "Автоматично скачане" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "Назад" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Граници на блокове" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Change camera" +msgstr "Промяна на камера" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Chat" +msgstr "Разговори" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "Команда" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "Конзола" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "Намал. на обхвата" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Намал. на звука" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "Двоен „скок“ превключва летене" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "Пускане предмет" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "Напред" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "Увелич. на обхвата" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Увелич. на звука" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "Инвентар" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "Скок" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "Клавишът вече се ползва" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Местна команда" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Заглушаване" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "След. предмет" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Пред. предмет" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "Обхват видимост" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "Снимка на екрана" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "Промъкване" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle HUD" +msgstr "Превкл. HUD" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle chat log" +msgstr "Превкл. разговори" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "Превкл. бързина" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "Превкл. полет" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fog" +msgstr "Превкл. мъгла" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "Превкл. карта" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "Превкл. изрязване" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "Превкл. „pitchmove“" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "избор бутон" + +#: src/gui/guiPasswordChange.cpp +msgid "Change" +msgstr "Променяне" + +#: src/gui/guiPasswordChange.cpp +msgid "New Password" +msgstr "Нова парола" + +#: src/gui/guiPasswordChange.cpp +msgid "Old Password" +msgstr "Стара парола" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Паролите не съвпадат!" + +#: src/gui/guiVolumeChange.cpp +msgid "Exit" +msgstr "Изход" + +#: src/gui/guiVolumeChange.cpp +msgid "Muted" +msgstr "Без звук" + +#: src/gui/guiVolumeChange.cpp +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Сила на звука: %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 "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" +"If disabled, virtual joystick will center to first-touch's position." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"situations.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"Default is for a vertically-squashed shape suitable for\n" +"an island, set all 3 numbers equal for the raw shape." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of ridged mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of step mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of step mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that locates the river valleys and channels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"to be adjusted, as floatland tapering functions best when this noise has\n" +"a value range of approximately -2.0 to 2.0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise that determines number of dungeons per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- crossview: Cross-eyed 3d\n" +"- pageflip: quadbuffer based 3d.\n" +"Note that the interlaced mode requires shaders to be enabled." +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." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of queued blocks to emerge" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration of gravity, in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "Добавят се отломки при копане на възел." + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + +#: src/settings_translation_file.cpp +#, c-format +msgid "" +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" +"to be sure) creates a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Име на света" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"This only has significant effect on daylight and artificial\n" +"light, it has very little effect on natural night light." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Always fly fast" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amount of messages a player may send per 10 seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce to this serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name to tooltip." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to\n" +"clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible\n" +"rendering glitches (some blocks will not be rendered under water and in " +"caves,\n" +"as well as sometimes on land).\n" +"Setting this to a value greater than max_block_send_distance disables this\n" +"optimization.\n" +"Stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "Автоматично прескача препятствия от единични възли." + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "Автоматично докладване в списъка на сървърите." + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "Автоматично запазване на размера на екрана" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "Основни права" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "Адрес за свързване" + +#: src/settings_translation_file.cpp +msgid "Biome API noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Increasing can reduce artifacting on weaker GPUs.\n" +"0.1 = Default, 0.25 = Good value for weaker tablets." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Команда" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat weblinks" +msgstr "Разговорите са видими" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "Свързва стъкло, ако се поддържа от възела." + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "Прозрачност на конзолата" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "Цвят на конзолата" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "Височина на конзолата" + +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples:\n" +"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." +msgstr "" +"Управлява дължината на цикъла ден/нощ.\n" +"Пример:\n" +"72 = 20 мин, 360 = 4 мин, 1 = 24 часа, 0 = ден/нощ/каквото е остава без " +"промяна." + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls width of tunnels, a smaller value creates wider tunnels.\n" +"Value >= 10.0 completely disables generation of tunnels and avoids the\n" +"intensive noise calculations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Творчески" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "Подразбирани права" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "Формат на отчета по подразбиране" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain and steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the base ground level." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the depth of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river valley." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 "Отломки при копане" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +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 "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +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 " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server.\n" +"Ignored if bind_address is set.\n" +"Needs enable_ipv6 to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"appearance of high dynamic range images. Mid-range contrast is slightly\n" +"enhanced, highlights and shadows are gradually compressed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Exponent of the floatland tapering. Alters the tapering behaviour.\n" +"Value = 1.0 creates a uniform, linear tapering.\n" +"Values > 1.0 create a smooth tapering suitable for the default separated\n" +"floatlands.\n" +"Values < 1.0 (for example 0.25) create a more defined surface level with\n" +"flatter lowlands, suitable for a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +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" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "Сгласяне:" + +#: src/settings_translation_file.cpp +msgid "First of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font bold by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "HUD видим" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal acceleration in air when jumping or falling,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration in fast mode,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration on ground or when climbing,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"If negative, liquid waves will move backwards.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" +"Ако е включено заедно с режима на летене, играчът може да лети през плътни " +"възли.\n" +"Изисква правото „noclip“ от сървъра." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +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 "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"increases processing load.\n" +"At iterations = 20 this mapgen has a similar load to mapgen V7." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +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 "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "Голяма част от пещерите са наводнени" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of liquid waves.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen Carpathian." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'terrain' enables the generation of non-fractal terrain:\n" +"ocean, islands and underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"to become shallower and occasionally dry.\n" +"'altitude_dry': Reduces humidity with altitude." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen v5." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'floatlands': Floating land masses in the atmosphere.\n" +"'caverns': Giant caves deep underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum liquid resistance. Controls deceleration when entering liquid at\n" +"high speed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of recent chat messages to show" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"Current mapgens in a highly unstable state:\n" +"- The optional floatlands of v7 (disabled by default)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Near plane" +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 "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"processes, especially in singleplayer and/or when running Lua code in\n" +"'on_generated'. For many users the optimum setting may be '1'." +msgstr "" + +#: src/settings_translation_file.cpp +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 "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Optional override for chat weblink color." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + +#: 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 "" +"Играчът може да лети без да се влияе от гравитацията.\n" +"Изисква правото „fly“ от сървъра." + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "Правата, които играчите с „basic_privs“ могат да получат" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Proportion of large caves that contain liquid." +msgstr "Съотношението на големи пещери, съдържащи течности." + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "Отдалечен порт" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Restricts the access of certain client-side functions on servers.\n" +"Combine the byteflags below to restrict client-side features, or set to 0\n" +"for no restrictions:\n" +"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" +"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" +"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" +"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" +"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridged mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River valley width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hill size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hills spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Екран:" + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Снимка на екрана" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Selects one of 18 fractal types.\n" +"1 = 4D \"Roundy\" Mandelbrot set.\n" +"2 = 4D \"Roundy\" Julia set.\n" +"3 = 4D \"Squarry\" Mandelbrot set.\n" +"4 = 4D \"Squarry\" Julia set.\n" +"5 = 4D \"Mandy Cousin\" Mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" Julia set.\n" +"7 = 4D \"Variation\" Mandelbrot set.\n" +"8 = 4D \"Variation\" Julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" Mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" Julia set.\n" +"11 = 3D \"Christmas Tree\" Mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" Julia set.\n" +"13 = 3D \"Mandelbulb\" Mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" Julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" Mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" Julia set.\n" +"17 = 4D \"Mandelbulb\" Mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" Julia set." +msgstr "" + +#: src/settings_translation_file.cpp +#, 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 "" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "Адрес на сървър" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "Порт на сървъра" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving liquids (like water).\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow strength gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).\n" +"WARNING!: There is no benefit, and there are several dangers, in\n" +"increasing this value above 5.\n" +"Reducing this value increases cave and dungeon density.\n" +"Altering this value is for special usage, leaving it unchanged is\n" +"recommended." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Surface level of optional water placed on a solid floatland layer.\n" +"Water is disabled by default and will only be placed if this value is set\n" +"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" +"upper tapering).\n" +"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" +"When enabling water placement the floatlands must be configured and tested\n" +"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" +"required value depending on 'mgv7_np_floatland'), to avoid\n" +"server-intensive extreme water flow and to avoid vast flooding of the\n" +"world surface below." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The URL for the content repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other biome filler node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The length in pixels it takes for touch screen interaction to start." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"Default is 1.0 (1/2 node).\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: 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 "" +"Правата, които получават новите играчи.\n" +"В играта вижте „/privs“ за пълен списък от права за сървъра и модификациите." + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Third of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Time of day when a new world is started, in millihours (0-23999)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Virtual joystick triggers Aux1 button" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Volume of all sounds.\n" +"Requires the sound system to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"W coordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking and flying speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking, flying and climbing speed in fast mode, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"This is also used as the base node texture size for world-aligned\n" +"texture autoscaling." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." +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 "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "World start time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y of mountain density gradient zero level. Used to shift mountains " +"vertically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#~ msgid "- Creative Mode: " +#~ 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 "Умряхте." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/ca/minetest.po b/po/ca/minetest.po index 5ce219f7f..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: 2020-06-13 23:17+0200\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/" @@ -14,6 +14,47 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.9-dev\n" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "Comands de xat" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Eixir al menú" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "Comands de xat" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "Un jugador" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "Un jugador" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "Reaparèixer" @@ -23,10 +64,41 @@ msgstr "Reaparèixer" msgid "You died" msgstr "Has mort." +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "Comands de xat" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "Comands de xat" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua #, fuzzy msgid "An error occurred in a Lua script:" @@ -49,9 +121,30 @@ msgstr "Torneu a connectar" msgid "The server has requested a reconnect:" msgstr "El servidor ha sol·licitat una reconnexió:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Carregant ..." +#: 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. " @@ -67,10 +160,8 @@ msgstr "" "El servidor es compatible amb les versions de protocol entre $ 1 i $ 2 . " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Intenta tornar a habilitar la llista de servidors públics i comprovi la seva " -"connexió a Internet ." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -80,17 +171,26 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Dependències:" @@ -171,15 +271,56 @@ msgstr "Món:" msgid "enabled" msgstr "Activat" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Carregant ..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Already installed" +msgstr "La tecla s'està utilitzant" + #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy msgid "Back to Main Menu" msgstr "Menú principal" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "Ocultar Joc" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -195,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" @@ -204,7 +344,23 @@ msgid "Install" msgstr "Instal·lar" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "Instal·lar" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "Dependències opcionals:" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "" +"\n" +"Instal·lar mod: Format de arxiu \"$1\" no suportat o arxiu corrupte" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" @@ -217,9 +373,24 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Buscar" +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy @@ -236,7 +407,11 @@ msgid "Update" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -286,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 @@ -311,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 "" @@ -331,6 +499,15 @@ msgstr "" 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 "" @@ -433,13 +610,6 @@ msgstr "" 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" @@ -473,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" @@ -505,6 +707,16 @@ 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" @@ -529,7 +741,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -548,6 +760,10 @@ msgstr "Restablir per defecte" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Buscar" + #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "Select directory" @@ -558,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" @@ -644,18 +860,6 @@ msgstr "" "Instal·lar mod: Impossible de trobar el nom de la carpeta adequat per al " "paquet de mods $1" -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"\n" -"Instal·lar mod: Format de arxiu \"$1\" no suportat o arxiu corrupte" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: file: \"$1\"" -msgstr "Instal·lar mod: Arxiu: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua #, fuzzy msgid "Unable to find a valid mod or modpack" @@ -683,6 +887,60 @@ msgstr "Error al instal·lar $1 en $2" msgid "Unable to install a modpack as a $1" msgstr "Error al instal·lar $1 en $2" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Carregant ..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Intenta tornar a habilitar la llista de servidors públics i comprovi la seva " +"connexió a Internet ." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Col·laboradors Actius" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "Rang d'enviament de l'objecte actiu" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Desenvolupadors del nucli" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Selecciona el fitxer del mod:" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Antics Col·laboradors" + +#: builtin/mainmenu/tab_about.lua +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 "" @@ -730,26 +988,6 @@ msgstr "Desinstal·lar el mod seleccionat" msgid "Use Texture Pack" msgstr "Textures" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Col·laboradors Actius" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Desenvolupadors del nucli" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Crèdits" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Antics Col·laboradors" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Antics Desenvolupadors del nucli" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Anunciar servidor" @@ -759,14 +997,10 @@ msgid "Bind Address" msgstr "Adreça BIND" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Configurar" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Mode Creatiu" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Permetre Danys" @@ -784,10 +1018,6 @@ msgstr "Servidor" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nom/Contrasenya" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Nou" @@ -800,10 +1030,15 @@ msgstr "No s'ha creat ningun món o no s'ha seleccionat!" msgid "Play Game" msgstr "Jugar Joc" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Seleccionar un món:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Seleccionar un món:" @@ -818,46 +1053,68 @@ msgid "Start Game" msgstr "Ocultar Joc" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adreça / Port" +#, fuzzy +msgid "Address" +msgstr "Adreça BIND" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Connectar" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Netejar" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Mode creatiu" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Dany activat" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "Dany" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Esborra preferit" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Preferit" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Join Game" msgstr "Ocultar Joc" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nom / Contrasenya" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP activat" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Anunciar servidor" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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" @@ -884,10 +1141,6 @@ msgstr "Configuració" msgid "Antialiasing:" msgstr "Suavitzat (Antialiasing):" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Esteu segur que voleu reiniciar el seu món d'un sol jugador?" - #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Autosave Screen Size" @@ -897,10 +1150,6 @@ msgstr "Desar automàticament mesures de la pantalla" msgid "Bilinear Filter" msgstr "Filtre Bilineal" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Mapat de relleu" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Configurar Controls" @@ -909,14 +1158,29 @@ msgstr "Configurar Controls" msgid "Connected Glass" msgstr "Vidres connectats" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Fulles Boniques" #: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Generate Normal Maps" -msgstr "Generar Mapes Normals" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -926,10 +1190,6 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Aniso. Filtre" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "No" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Sense Filtre" @@ -958,19 +1218,10 @@ msgstr "Fulles opaques" msgid "Opaque Water" msgstr "Aigua opaca" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Oclusió de paral·laxi" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partícules" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Reset singleplayer world" -msgstr "Reiniciar el mon individual" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Pantalla:" @@ -983,6 +1234,10 @@ msgstr "Configuració" msgid "Shaders" msgstr "Ombres" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -999,23 +1254,27 @@ msgstr "Il·luminació suau" msgid "Texturing:" msgstr "Texturització:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Per habilitar les ombres el controlador OpenGL ha ser utilitzat." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "" #: builtin/mainmenu/tab_settings.lua #, fuzzy -msgid "Touchthreshold: (px)" +msgid "Touch threshold (px):" msgstr "Llindar tàctil (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Filtratge Trilineal" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Moviment de les Fulles" @@ -1029,23 +1288,12 @@ msgstr "Moviment de les Fulles" msgid "Waving Plants" msgstr "Moviment de Plantes" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Sí" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Configurar mods" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Principal" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Començar Un Jugador" - #: 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." @@ -1074,7 +1322,8 @@ msgid "Connection error (timed out?)" msgstr "Error de connexió (¿temps esgotat?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "No es pot trobar o carregar el joc \"" #: src/client/clientlauncher.cpp @@ -1105,18 +1354,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "La ruta del món especificat no existeix: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1130,16 +1367,6 @@ msgstr "" msgid "- Address: " msgstr "Adreça BIND" -#: src/client/game.cpp -#, fuzzy -msgid "- Creative Mode: " -msgstr "Mode Creatiu" - -#: src/client/game.cpp -#, fuzzy -msgid "- Damage: " -msgstr "Dany" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1163,6 +1390,16 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Ha ocorregut un error:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Automatic forward disabled" @@ -1173,6 +1410,22 @@ msgstr "Tecla Avançar" msgid "Automatic forward enabled" msgstr "Tecla Avançar" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Camera update disabled" @@ -1183,6 +1436,10 @@ msgstr "Tecla alternativa per a l'actualització de la càmera" 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 (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Canviar contrasenya" @@ -1197,6 +1454,11 @@ msgstr "Tecla mode cinematogràfic" msgid "Cinematic mode enabled" msgstr "Tecla mode cinematogràfic" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Client" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1205,6 +1467,10 @@ msgstr "" msgid "Connecting to server..." msgstr "Connectant al servidor ..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Continuar" @@ -1217,13 +1483,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1239,6 +1505,11 @@ msgstr "" "- Roda ratolí: triar objecte\n" "- T: xat\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Creant client ..." @@ -1296,6 +1567,11 @@ msgstr "" 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ú" @@ -1375,32 +1651,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +#, fuzzy +msgid "Multiplayer" +msgstr "Un jugador" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1478,6 +1731,21 @@ msgstr "" msgid "Sound unmuted" msgstr "Volum del so" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1549,10 +1817,6 @@ msgstr "Enrere" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Netejar" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1807,22 +2071,31 @@ msgstr "X Botó 2" msgid "Zoom" msgstr "Zoom" -#: 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" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Error al instal·lar $1 en $2" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1831,7 +2104,7 @@ msgstr "Continuar" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "\"Utilitzar\" = Descendir" #: src/gui/guiKeyChangeMenu.cpp @@ -1843,16 +2116,24 @@ msgstr "Avant" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Arrere" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Change camera" msgstr "Configurar controls" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Xat" @@ -1906,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 @@ -1941,10 +2220,6 @@ msgstr "" msgid "Sneak" msgstr "Discreció" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Toggle HUD" @@ -1990,10 +2265,6 @@ msgstr "Premsa una tecla" msgid "Change" msgstr "Canviar" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Confirma contrasenya" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Nova contrasenya" @@ -2002,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" @@ -2012,15 +2287,10 @@ msgid "Muted" msgstr "Utilitza la tecla" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +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). @@ -2028,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" @@ -2036,8 +2315,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -2071,14 +2350,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = oclusió de la paral.laxi amb informació d'inclinació (més ràpid).\n" -"1 = mapa de relleu (més lent, més precís)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2176,6 +2447,10 @@ msgstr "" "- sidebyside: split screen side by side.\n" "- 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" @@ -2198,6 +2473,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Absolute limit of queued blocks to emerge" @@ -2252,6 +2531,10 @@ msgstr "" "Ajustar la configuració de punts per polsada (dpi) a la teva pantalla (no " "X11/Sols Android) Ex. per a pantalles amb 4K." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2262,6 +2545,11 @@ msgid "" "to be sure) creates a solid floatland layer." 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" @@ -2276,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 @@ -2346,6 +2635,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Automatic forward key" @@ -2368,6 +2661,16 @@ msgstr "Desar automàticament mesures de la pantalla" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Tecla botar" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "Utilitzar la tecla \"utilitzar\" per escalar/descendir" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tecla de retrocés" @@ -2381,10 +2684,6 @@ msgstr "" 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" @@ -2407,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 @@ -2415,11 +2714,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bits per píxel (profunditat de color) en el mode de pantalla completa." +msgid "Block send optimize distance" +msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2447,8 +2746,9 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Mapat de relleu" +#, fuzzy +msgid "Camera" +msgstr "Configurar controls" #: src/settings_translation_file.cpp msgid "" @@ -2527,15 +2827,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Comands de xat" + #: src/settings_translation_file.cpp #, fuzzy msgid "Chat font size" @@ -2572,8 +2871,8 @@ msgid "Chat toggle key" msgstr "Tecla alternativa per al xat" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Comands de xat" +msgid "Chat weblinks" +msgstr "" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2591,6 +2890,12 @@ msgstr "Tecla mode cinematogràfic" msgid "Clean transparent textures" msgstr "Netejar textures transparents" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Client" @@ -2613,6 +2918,11 @@ msgstr "Client" 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" @@ -2637,6 +2947,11 @@ msgstr "Núvols en el menú" msgid "Colored fog" msgstr "Boira de color" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "Boira de color" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2671,6 +2986,22 @@ msgstr "" msgid "Command key" msgstr "Tecla comandament" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Connectar vidre" @@ -2697,10 +3028,18 @@ msgstr "Color de la consola" 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 "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2732,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 @@ -2764,7 +3105,9 @@ msgid "Crosshair alpha" msgstr "Punt de mira Alpha" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2772,8 +3115,10 @@ msgid "Crosshair color" msgstr "Color del punt de mira" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Color del punt de mira (R, G, B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" #: src/settings_translation_file.cpp msgid "DPI" @@ -2797,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 @@ -2843,11 +3188,10 @@ msgstr "Joc per defecte" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Temporització per defecte per a cURL, manifestat en mil·lisegons.\n" -"Només té un efecte si és compilat amb cURL." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2877,12 +3221,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2954,6 +3292,16 @@ msgstr "" msgid "Desynchronize block animation" 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" + #: src/settings_translation_file.cpp #, fuzzy msgid "Digging particles" @@ -2967,6 +3315,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -3012,18 +3370,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -3040,22 +3415,16 @@ msgstr "" 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." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -3104,14 +3473,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -3120,18 +3481,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3140,6 +3489,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -3148,12 +3507,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3165,7 +3518,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3184,18 +3541,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3215,7 +3560,7 @@ msgstr "Moviment ràpid" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "Moviment ràpid (via utilitzar clau).\n" @@ -3251,14 +3596,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: 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." @@ -3325,6 +3671,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3346,15 +3696,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3363,6 +3713,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3422,10 +3783,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3450,10 +3807,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3471,7 +3824,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3482,7 +3844,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3501,6 +3863,14 @@ msgstr "" 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 "" @@ -3520,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 @@ -3530,8 +3904,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3554,7 +3928,8 @@ msgid "Heat noise" msgstr "Soroll de cova #1" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3566,10 +3941,6 @@ msgstr "Windows dret" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3769,10 +4140,17 @@ 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 "" @@ -3805,8 +4183,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3828,11 +4205,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3856,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 @@ -3873,6 +4258,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3889,10 +4280,6 @@ msgstr "" 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 "" @@ -3921,7 +4308,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3944,16 +4331,12 @@ msgstr "" 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 @@ -4005,6 +4388,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "Interval de repetició del click dret" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Joystick frustum sensitivity" @@ -4094,6 +4481,17 @@ msgstr "" "http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per botar.\n" +"Veure http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4229,6 +4627,17 @@ msgstr "" "Veure http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla per botar.\n" +"Veure http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -4766,6 +5175,10 @@ msgstr "" "Veure http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4823,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 @@ -4833,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 @@ -4853,7 +5269,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4880,6 +5297,11 @@ msgstr "" 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" @@ -4953,22 +5375,21 @@ msgstr "Límit absolut de cues emergents" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Menú principal" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -5030,6 +5451,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -5144,7 +5569,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -5192,6 +5621,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -5246,17 +5682,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -5305,12 +5745,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5321,6 +5773,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5388,16 +5844,16 @@ msgstr "" 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 "" @@ -5410,6 +5866,11 @@ msgstr "" 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 "" @@ -5422,14 +5883,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5451,18 +5904,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5472,11 +5917,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5485,39 +5925,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Optional override for chat weblink color." msgstr "" -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Oclusió de paral·laxi" - #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5540,17 +5953,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5579,16 +5988,22 @@ msgstr "Tecla mode cinematogràfic" msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Tecla mode cinematogràfic" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "Interval de repetició del click dret" + #: 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 "" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5597,6 +6012,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Filtre bilineal" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5631,10 +6051,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5642,9 +6058,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5736,10 +6152,6 @@ msgstr "" msgid "Right key" msgstr "Tecla dreta" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Interval de repetició del click dret" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5810,6 +6222,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Pantalla:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5837,6 +6254,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Pantalla:" + #: src/settings_translation_file.cpp #, fuzzy msgid "Seabed noise" @@ -5850,10 +6272,6 @@ msgstr "" 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 "" @@ -5914,9 +6332,19 @@ 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 "" @@ -5941,10 +6369,19 @@ msgstr "" 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 "" @@ -5956,7 +6393,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5977,6 +6442,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Shader path" @@ -5990,6 +6462,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5997,9 +6485,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -6014,6 +6500,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -6035,6 +6531,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -6093,20 +6593,15 @@ msgstr "Velocitat d'escalada" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Radi del núvol" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Tecla sigil" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key for climbing/descending" -msgstr "Utilitzar la tecla \"utilitzar\" per escalar/descendir" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6122,6 +6617,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6149,10 +6652,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6190,6 +6689,11 @@ msgstr "" 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 "" @@ -6233,6 +6737,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6247,6 +6758,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6302,18 +6817,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6331,6 +6846,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6343,9 +6864,8 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" "El temps en segons que es pren entre la repetició de clicks drets quan " "s'està mantenint el botó dret del ratolí." @@ -6384,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 @@ -6408,6 +6928,19 @@ msgstr "" 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 "" @@ -6479,15 +7012,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6582,7 +7130,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6656,6 +7204,10 @@ msgstr "Onatge" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6677,18 +7229,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6723,13 +7273,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6817,31 +7376,39 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" - -#~ msgid "Toggle Cinematic" -#~ msgstr "Activar Cinematogràfic" +#, fuzzy +#~ msgid "- Creative Mode: " +#~ msgstr "Mode Creatiu" #, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Selecciona el fitxer del mod:" +#~ msgid "- Damage: " +#~ msgstr "Dany" -#~ msgid "Enable VBO" -#~ msgstr "Activar VBO" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Controla l'amplada dels túnels, un valor més petit crea túnels més amples." +#~ "0 = oclusió de la paral.laxi amb informació d'inclinació (més ràpid).\n" +#~ "1 = mapa de relleu (més lent, més precís)." + +#~ msgid "Address / Port" +#~ msgstr "Adreça / Port" #, fuzzy #~ msgid "" @@ -6853,12 +7420,145 @@ msgstr "" #~ "petits n'augmentaràn la brillantor.\n" #~ "Aquesta configuració només afecta al client, el servidor l'ignora." -#, fuzzy -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Descarregant $1, si us plau esperi ..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Esteu segur que voleu reiniciar el seu món d'un sol jugador?" #~ 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." + +#~ msgid "Bump Mapping" +#~ msgstr "Mapat de relleu" + +#~ msgid "Bumpmapping" +#~ msgstr "Mapat de relleu" + +#~ msgid "Config mods" +#~ msgstr "Configurar mods" + +#~ 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." + +#~ msgid "Credits" +#~ msgstr "Crèdits" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Color del punt de mira (R, G, B)." + +#~ msgid "Damage enabled" +#~ msgstr "Dany activat" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Temporització per defecte per a cURL, manifestat en mil·lisegons.\n" +#~ "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" + +#, fuzzy +#~ 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" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Menú principal" + +#~ msgid "Name / Password" +#~ msgstr "Nom / Contrasenya" + +#~ msgid "Name/Password" +#~ msgstr "Nom/Contrasenya" + +#~ msgid "No" +#~ msgstr "No" + #~ msgid "Ok" #~ msgstr "D'acord" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Oclusió de paral·laxi" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Oclusió de paral·laxi" + +#~ msgid "PvP enabled" +#~ msgstr "PvP activat" + +#, fuzzy +#~ msgid "Reset singleplayer world" +#~ msgstr "Reiniciar el mon individual" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Selecciona el fitxer del mod:" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "Tecla sigil" + +#~ msgid "Start Singleplayer" +#~ msgstr "Començar Un Jugador" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Per habilitar les ombres el controlador OpenGL ha ser utilitzat." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Activar Cinematogràfic" + +#~ msgid "Yes" +#~ msgstr "Sí" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Has mort." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/cs/minetest.po b/po/cs/minetest.po index f710ac43f..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: 2020-06-13 23:17+0200\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-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,43 @@ 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.2-dev\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Vyprázdnit frontu odchozího chatu" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Prázdný příkaz." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Odejít do hlavní nabídky" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Neplatný příkaz: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Zadaný příkaz: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Vypsat připojené hráče" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Připojení hráči: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Fronta odchozího chatu je nyní prázdná." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Server zakázal tento příkaz." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,9 +58,41 @@ msgstr "Oživit" msgid "You died" msgstr "Zemřel jsi" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Příkazy k dispozici:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Příkazy k dispozici: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Příkaz není k dispozici: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Získat nápovědu pro příkazy" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Použij \".help <příkaz>\" pro obdržení více informací, nebo \".help all\" " +"pro celý výpis." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <příkaz>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "Dobře" + +#: builtin/fstk/ui.lua +#, fuzzy +msgid "<none available>" +msgstr "Příkaz není k dispozici: " #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -44,11 +112,32 @@ msgstr "Znovu se připojit" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "Server vyžaduje znovupřipojení se:" +msgstr "Server vyžaduje opětovné připojení:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Nahrávám..." +#: 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. " @@ -63,10 +152,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Server podporuje verze protokolů mezi $1 a $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Zkuste znovu povolit seznam veřejných serverů a zkontrolujte své internetové " -"připojení." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +163,26 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Závislosti:" @@ -116,7 +212,7 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Najít více modů" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -159,29 +255,68 @@ msgstr "Svět:" msgid "enabled" msgstr "zapnuto" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" již existuje. Chcete jej přepsat?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Budou nainstalovány závislosti $1 a $2." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 od $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 se stahuje,\n" +"$2 čeká ve frontě" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 se stahuje..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 požadovaných závislostí nebylo nalezeno." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 závislostí bude nainstalováno a $2 bude vynecháno." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Všechny balíčky" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Již nainstalováno" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Zpět do hlavní nabídky" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Základní hra:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "" +"ContentDB není přístupná pokud byl Minetest kompilován bez použití cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Nahrávám..." +msgstr "Stahuji..." #: builtin/mainmenu/dlg_contentstore.lua 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" @@ -190,7 +325,20 @@ msgid "Install" msgstr "Instalovat" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Instalovat $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Instalovat chybějící závislosti" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "" +"Instalace rozšíření: poškozený archiv nebo nepodporovaný typ souboru \"$1\"" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mody" @@ -203,9 +351,24 @@ msgid "No results" msgstr "Žádné výsledky" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Hledat" +msgid "No updates" +msgstr "Žádné aktualizace" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Nenalezeno" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Přepsat" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Ověř prosím, zda je základní hra v pořádku." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Ve frontě" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -220,110 +383,106 @@ msgid "Update" msgstr "Aktualizovat" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Aktualizovat vše [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Zobrazit více informací v prohlížeči" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "Svět s názvem \"$1\" už existuje" +msgstr "Svět s názvem \"$1\" již existuje" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Další terén" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "Výškové ochlazení" +msgstr "Teplota (výšková)" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Výškové ochlazení" +msgstr "Vlhkost (výšková)" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Šum biomů" +msgstr "Prolínání biomů" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Šum biomů" +msgstr "Biomy" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Šum jeskynních dutin" +msgstr "Jeskyně (velké)" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Oktávy" +msgstr "Jeskyně (malé)" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Vytvořit" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Iterace" - -#: 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" +msgstr "Dekorace" #: builtin/mainmenu/dlg_create_world.lua #, 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" -msgstr "Šum hřbetů" +msgstr "Žaláře" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Plochý terén" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floating landmasses in the sky" -msgstr "Koncentrace hor na létajících ostrovech" +msgstr "Krajina vznášející se na nebi" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floatlands (experimental)" -msgstr "Výška létajících ostrovů" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Hra" +msgstr "Létající ostrovy (experimentální)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Generovat terén bez použití fraktálů: Oceány a podzemí" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Kopce" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Humid rivers" -msgstr "Ovladač grafiky" +msgstr "Vodnost řek" #: builtin/mainmenu/dlg_create_world.lua 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 "" +msgstr "Jezera" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgstr "Nízká vlhkost a vysoké teploty mají za následek mělké či vyschlé řeky" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -331,24 +490,23 @@ msgstr "Generátor mapy" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "Nastavení generátoru mapy" +msgstr "Nastavení pro Generátor mapy" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Mapgen údolí" +msgstr "Nastavení pro Generátor mapy" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "Hory" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Eroze" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Jeskynní systém" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -356,20 +514,19 @@ msgstr "Není vybrána žádná hra" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Snižuje teplotu a nadmořskou výšku" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Snižuje vlhkost s rostoucí nadmořskou výškou" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Velikost řeky" +msgstr "Řeky" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Řeky v úrovni mořské hladiny" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -378,51 +535,47 @@ msgstr "Seedové číslo" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Pozvolný přechod mezi biomy" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Povrchové struktury (nemá vliv na stromy a tropickou trávu vytvořené ve v6 a " +"později)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Povrchové struktury, především stromy a rostliny" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Mírné, Poušť" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Mírné, Poušť, Džungle" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Mírné, Poušť, Džungle, Tundra, Tajga" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "Povrchová eroze" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Stromy a tropická tráva" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Vary river depth" -msgstr "Hloubka řeky" +msgstr "Proměnná hloubka řek" #: 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 "Varování: \"Minimal development test\" je zamýšlen pouze pro vývojáře." +msgstr "Veliké jeskyně hluboko pod zemí" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -454,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" @@ -487,6 +673,16 @@ 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" @@ -511,7 +707,8 @@ msgid "Offset" msgstr "Odstup" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Urputnost" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -530,6 +727,10 @@ msgstr "Obnovit výchozí" msgid "Scale" msgstr "Přiblížení" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Hledat" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Vyberte adresář" @@ -538,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" @@ -619,15 +820,6 @@ msgstr "" "Instalace rozšíření: nenalezen vhodný adresář s příslušným názvem pro " "balíček $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"Instalace rozšíření: poškozený archiv nebo nepodporovaný typ souboru \"$1\"" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Instalace: soubor: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Platné rozšíření nebylo nalezeno" @@ -648,6 +840,61 @@ msgstr "Selhala instalace rozšíření $1" msgid "Unable to install a modpack as a $1" msgstr "Selhala instalace rozšíření $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Nahrávám..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Seznam veřejných serverů je vypnut" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Zkuste znovu povolit seznam veřejných serverů a zkontrolujte své internetové " +"připojení." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "O nás" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktivní přispěvatelé" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Aktivní renderer:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Hlavní vývojáři" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Otevřít uživatelský adresář" + +#: 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 "" +"Ve správci souborů otevře adresář obsahující uživatelské světy, hry,\n" +"mody a balíčky textur." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Bývalí přispěvatelé" + +#: builtin/mainmenu/tab_about.lua +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" @@ -688,26 +935,6 @@ msgstr "Odinstalovat balíček" msgid "Use Texture Pack" msgstr "Použít Rozšíření Textur" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktivní přispěvatelé" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Hlavní vývojáři" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Autoři" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Bývalí přispěvatelé" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Bývalí klíčoví vývojáři" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Uveřejnit server" @@ -717,14 +944,10 @@ msgid "Bind Address" msgstr "Poslouchat na Adrese" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Nastavit" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Kreativní mód" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Povolit zranění" @@ -738,11 +961,7 @@ msgstr "Založit server" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Jméno/Heslo" +msgstr "Instalovat hry z ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -756,10 +975,14 @@ msgstr "Žádný svět nebyl vytvořen ani vybrán!" msgid "Play Game" msgstr "Spustit hru" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Vybrat mody" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Vyberte svět:" @@ -773,45 +996,62 @@ msgid "Start Game" msgstr "Spustit hru" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adresa / Port" +msgid "Address" +msgstr "Adresa" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Připojit" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Vyčistit" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Kreativní mód" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Zranění povoleno" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Zranění / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Smazat oblíbené" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "Oblíbené" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Nekompatibilní server" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Připojit se ke hře" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Jméno / Heslo" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP (hráč proti hráči) povoleno" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Veřejné servery" + +#: builtin/mainmenu/tab_online.lua +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" @@ -837,10 +1077,6 @@ msgstr "Všechna Nastavení" msgid "Antialiasing:" msgstr "Antialiasing:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Jste si jisti, že chcete resetovat místní svět?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Pamatovat si velikost obrazovky" @@ -849,10 +1085,6 @@ msgstr "Pamatovat si velikost obrazovky" msgid "Bilinear Filter" msgstr "Bilineární filtr" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bump mapping" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Změnit klávesy" @@ -861,26 +1093,39 @@ msgstr "Změnit klávesy" msgid "Connected Glass" msgstr "Propojené sklo" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dynamické stíny" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Dynamické stíny: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Vícevrstevné listí" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Generovat Normální Mapy" +msgid "High" +msgstr "Vysoké" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Nízké" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Střední" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "Mipmapy zapnuté" +msgstr "Mipmapy" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap + Aniso. Filter" msgstr "Mipmapy + anizotropní filtr" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Ne" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Filtrování vypnuto" @@ -909,18 +1154,10 @@ msgstr "Neprůhledné listí" msgid "Opaque Water" msgstr "Neprůhledná voda" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax occlusion" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Částice" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Reset místního světa" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Obrazovka:" @@ -933,6 +1170,10 @@ msgstr "Nastavení" msgid "Shaders" msgstr "Shadery" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shader (experimentální)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Shadery (není dostupné)" @@ -949,22 +1190,28 @@ msgstr "Plynulé osvětlení" msgid "Texturing:" msgstr "Texturování:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Pro zapnutí shaderů musíte používat OpenGL ovladač." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp 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 msgid "Trilinear Filter" msgstr "Trilineární filtr" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Velmi vysoké" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Vylmi nízké" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Vlnění listů" @@ -977,23 +1224,12 @@ msgstr "Vlnění Kapalin" msgid "Waving Plants" msgstr "Vlnění rostlin" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ano" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Nastavení modů" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Hlavní nabídka" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Start místní hry" - #: 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í." @@ -1022,7 +1258,8 @@ msgid "Connection error (timed out?)" msgstr "Chyba spojení (vypršel čas?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Hru nebylo možné nahrát nebo najít \"" #: src/client/clientlauncher.cpp @@ -1054,18 +1291,6 @@ msgstr "Soubor s heslem nebylo možné otevřít: " msgid "Provided world path doesn't exist: " msgstr "Uvedená cesta ke světu neexistuje: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1078,14 +1303,6 @@ msgstr "" msgid "- Address: " msgstr "- Adresa: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Kreativní mód: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Zranění: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Mód: " @@ -1107,6 +1324,16 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "- Název serveru: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Nastala chyba:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Automatický posun vpřed zakázán" @@ -1115,6 +1342,23 @@ msgstr "Automatický posun vpřed zakázán" msgid "Automatic forward enabled" msgstr "Automatický posun vpřed povolen" +#: src/client/game.cpp +#, fuzzy +msgid "Block bounds hidden" +msgstr "Ohraničení bloku" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Aktualizace kamery (pohledu) zakázána" @@ -1123,6 +1367,10 @@ msgstr "Aktualizace kamery (pohledu) zakázána" msgid "Camera update enabled" msgstr "Aktualizace kamery (pohledu) povolena" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Změnit heslo" @@ -1135,6 +1383,11 @@ msgstr "Filmový režim zakázán" msgid "Cinematic mode enabled" msgstr "Filmový režim povolen" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Lokální mody" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Uživatelské skripty nejsou povoleny" @@ -1143,6 +1396,10 @@ msgstr "Uživatelské skripty nejsou povoleny" msgid "Connecting to server..." msgstr "Připojuji se k serveru..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Pokračovat" @@ -1155,13 +1412,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1171,15 +1428,20 @@ msgstr "" "- %s: pohyb doleva\n" "- %s: pohyb doprava\n" "- %s: skok/výstup\n" +"- %s: těžit/uhodit\n" +"- %s: umístit/použít\n" "- %s: plížení/sestup\n" -"- %s: zahození věci\n" +"- %s: zahození předmětu\n" "- %s: inventář\n" "- Myš: otáčení/rozhlížení\n" -"- Levé tl. myši: těžit/uhodit\n" -"- Pravé tl. myši: položit/použít\n" -"- Kolečko myši: výběr přihrádky\n" +"- Kolečko myši: výběr předmětu\n" "- %s: chat\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Vytvářím klienta..." @@ -1236,6 +1498,11 @@ msgstr "Neomezený pohled zakázán" 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" @@ -1309,32 +1576,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Minimapa je aktuálně zakázána" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Minimapa je skryta" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Minimapa v režimu radar, Přiblížení x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Minimapa v režimu radar, Přiblížení x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Minimapa v režimu radar, Přiblížení x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minimapa v režimu povrch, Přiblížení x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minimapa v režimu povrch, Přiblížení x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minimapa v režimu povrch, Přiblížení x4" +msgid "Multiplayer" +msgstr "Multiplayer" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1386,7 +1629,7 @@ msgstr "Vypínání..." #: src/client/game.cpp msgid "Singleplayer" -msgstr "Místní hra" +msgstr "Singleplayer" #: src/client/game.cpp msgid "Sound Volume" @@ -1398,16 +1641,31 @@ msgstr "Zvuk vypnut" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Zvukový systém je vypnutý" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Zvukový systém není v této verzi podporovaný" #: src/client/game.cpp msgid "Sound unmuted" msgstr "Zvuk zapnut" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1477,10 +1735,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Vyčistit" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1728,36 +1982,40 @@ msgstr "X Tlačítko 2" msgid "Zoom" msgstr "Přiblížení" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Hesla se neshodují!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimapa je skryta" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registrovat a Připojit se" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimapa v režimu Radar, Přiblížení x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimapa v režimu Povrch, Přiblížení x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimapa v režimu Textura" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Selhalo stažení $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" 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" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "„Speciální“ = sestoupit dolů" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = sestoupit" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1767,15 +2025,23 @@ msgstr "Automaticky vpřed" msgid "Automatic jumping" msgstr "Automaticky skákat" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Vzad" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Ohraničení bloku" + #: src/gui/guiKeyChangeMenu.cpp 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" @@ -1828,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" @@ -1861,10 +2125,6 @@ msgstr "Snímek obrazovky" msgid "Sneak" msgstr "Plížit se" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Speciální" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Zapnout/Vypnout ovládací prvky" @@ -1905,10 +2165,6 @@ msgstr "stiskni klávesu" 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" @@ -1917,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" @@ -1926,15 +2186,10 @@ msgid "Muted" msgstr "Ztlumeno" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +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). @@ -1942,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" @@ -1952,12 +2217,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Použít virtuální joystick pro stisknutí tlačítka 'aux'.\n" -"Pokud je povoleno, virtuální joystick automaticky stiskne tlačítko 'aux' " +"(Android) Použít virtuální joystick pro stisk tlačítka \"Aux1\".\n" +"Pokud je povoleno, virtuální joystick automaticky stiskne tlačítko \"Aux1\" " "pokud je mimo hlavní kruh." #: src/settings_translation_file.cpp @@ -1998,14 +2263,6 @@ msgstr "" "Výchozí je pro svisle stlačený tvar, vhodný například\n" "pro ostrov, nastavte všechna 3 čísla stejně pro ryzí tvar." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax occlusion s informacemi o sklonu (rychlejší).\n" -"1 = mapování reliéfu (pomalejší, ale přesnější)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "2D šum, který definuje tvar/velikost horských útvarů." @@ -2043,9 +2300,8 @@ msgid "3D mode" msgstr "Režim 3D zobrazení" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Síla parallax occlusion" +msgstr "Intezita Parallax ve 3D modu" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2066,6 +2322,11 @@ 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 šum definující strukturu létajících ostrovů.\n" +"Pokud je odlišný od výchozího, může být nutné upravit\n" +"\"měřítko\" šumu (výchozí 0.7), jelikož zužování (obrácené hory)\n" +"létajících ostrovů funguje nejlépe pokud je šum v rozmezí přibližně -2.0 až " +"2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2081,7 +2342,7 @@ msgstr "3D šum definující horské převisy, atp. Typicky malé odchylky." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "3D šum, který definuje počet žalářů na kusu mapy." +msgstr "3D šum definující počet žalářů na kusu mapy." #: src/settings_translation_file.cpp msgid "" @@ -2107,6 +2368,10 @@ msgstr "" "- pageflip: 3d se 4-násobným bufferem.\n" "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" @@ -2129,9 +2394,12 @@ msgid "ABM interval" msgstr "Interval Aktivní Blokové Modifikace (ABM)" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ABM time budget" +msgstr "ABM použitelný čas" + +#: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "Maximální počet emerge front" +msgstr "Maximální počet připravených bloků ve frontě" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2179,6 +2447,10 @@ msgstr "" "Upraví nastavení DPI pro vaši obrazovku (není pro X11/Android). Pro použití " "například s 4k obrazovkami." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2188,6 +2460,16 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Upravit hustotu roviny létajících ostrovů.\n" +"Zvýšením hodnoty se zvýší hustota. Hodnota může být kladná i záporná.\n" +"Hodnota = 0.0: 50% světa tvoří létajících ostrovy.\n" +"Hodnota = 2.0 (může být i vyšší v závislosti na “mgv7_np_floatland“,\n" +"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" @@ -2201,9 +2483,15 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" +"Změní křivku světla použitím \"gamma korekce\".\n" +"Vysoké hodnoty zesvětlí málo a středně osvětlené prostory.\n" +"Hodnota \"1.0\" nastaví výchozí křivku.\n" +"Tato úprava slouží především pro úpravu denního\n" +"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 @@ -2227,9 +2515,8 @@ msgid "Announce server" msgstr "Zveřejnit server" #: src/settings_translation_file.cpp -#, fuzzy msgid "Announce to this serverlist." -msgstr "Zveřejnit server" +msgstr "Oznámit tomuto seznamu serverů." #: src/settings_translation_file.cpp msgid "Append item name" @@ -2260,7 +2547,6 @@ msgid "Ask to reconnect after crash" msgstr "Zeptat se na znovupřipojení po havárii" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2274,29 +2560,30 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" -"V této vzdálenosti bude server agresivně optimalizovat, které bloky pošle " -"klientům.\n" -"Malé hodnoty mohou mírně zvýšit rychlost, mohou však také způsobit viditelné " -"nedostatky ve vykreslování.\n" -"(některé bloky, zvláště pod vodou, v jeskyních a občas i na zemi, nebudou " -"vykresleny)\n" -"Nastavení této hodnoty na více než max_block_send_distance zakáže " -"optimalizaci.\n" -"Jednotkou je mapblok (16 bloků)" +"V této vzdálenosti bude server razantně optimalizovat výběr bloků,\n" +"které pošle klientům.\n" +"Malé hodnoty mohou zlepšit výkon, však mohou také způsobit chyby\n" +"ve vykreslování (některé bloky, zvláště pod vodou, v jeskyních\n" +"a někdy i na zemi, nebudou vykresleny).\n" +"Nastavení této hodnoty vyšší než max_block_send_distance zakáže vypne\n" +"tuto optimalizaci.\n" +"Jednotkou je mapblok (16 bloků)." + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Automatic forward key" -msgstr "Vpřed" +msgstr "Automaticky vpřed klávesa" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." msgstr "Automaticky vyskočit na překážky vysoké 1 blok." #: src/settings_translation_file.cpp -#, fuzzy msgid "Automatically report to the serverlist." -msgstr "Automaticky hlásit seznamu serverů." +msgstr "Automaticky nahlásit do seznamu serverů." #: src/settings_translation_file.cpp msgid "Autosave screen size" @@ -2306,26 +2593,27 @@ msgstr "Ukládat velikost obr." msgid "Autoscaling mode" msgstr "Režim automatického přiblížení" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1 klávesa" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Aux1 klávesa pro výstup/sestup" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Vzad" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base ground level" -msgstr "Výška povrchu země" +msgstr "Základní úroveň povrchu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base terrain height." -msgstr "Základní výška terénu" +msgstr "Základní výška terénu." #: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Základní" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Basic privileges" msgstr "Základní práva" @@ -2346,40 +2634,37 @@ 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 msgid "Biome noise" msgstr "Šum biomů" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bitová hloubka (bity na pixel) v celoobrazovkovém režimu." - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "Optimalizace vzdálenosti vysílání bloku" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Bobbing" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bold and italic font path" -msgstr "Cesta k neproporcionálnímu písmu" +msgstr "Cesta k tučnému písmu s kurzívou" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold and italic monospace font path" -msgstr "Cesta k neproporcionálnímu písmu" +msgstr "Cesta k tučnému proporcionálnímu písmu s kurzívou" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold font path" -msgstr "Cesta k písmu" +msgstr "Cesta k tučnému písmu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold monospace font path" -msgstr "Cesta k neproporcionálnímu písmu" +msgstr "Cesta k proporcionálnímu písmu" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2390,8 +2675,9 @@ msgid "Builtin" msgstr "Zabudované" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bump mapování" +#, fuzzy +msgid "Camera" +msgstr "Změnit nastavení kamery" #: src/settings_translation_file.cpp msgid "" @@ -2415,7 +2701,7 @@ msgstr "Klávesa pro přepínání aktualizace pohledu" #: src/settings_translation_file.cpp msgid "Cave noise" -msgstr "Šum jeskyní" +msgstr "Šum v jeskynních" #: src/settings_translation_file.cpp msgid "Cave noise #1" @@ -2427,7 +2713,7 @@ msgstr "Šum v jeskynních 2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "Šířka jeskyně" +msgstr "Šířka jeskyní" #: src/settings_translation_file.cpp msgid "Cave1 noise" @@ -2454,53 +2740,49 @@ msgid "Cavern threshold" msgstr "Práh jeskynních dutin" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cavern upper limit" -msgstr "Limit jeskynních dutin" +msgstr "Horní hranice jeskynních dutin" #: 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 "" +"Střed posílené křivky světla.\n" +"0.0 odpovídá nejnižší úrovni, 1.0 odpovídá nejvyšší úrovni světla." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +msgid "Chat command time message threshold" +msgstr "Doba do zobrazení času pro příkaz v chatu" #: src/settings_translation_file.cpp #, fuzzy +msgid "Chat commands" +msgstr "Příkazy" + +#: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "Velikost písma" +msgstr "Velikost písma v chatu" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Klávesa chatu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Úroveň minimální důležitosti ladících informací" +msgstr "Úroveň důležitosti ladících informací" #: src/settings_translation_file.cpp msgid "Chat message count limit" msgstr "Omezení počtu zpráv v Chatu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message format" -msgstr "Zpráva o havárii" +msgstr "Formát zpráv v chatu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message kick threshold" -msgstr "Práh pouštního šumu" +msgstr "Doba do vyhození zprávy z chatu" #: src/settings_translation_file.cpp msgid "Chat message max length" @@ -2511,8 +2793,9 @@ msgid "Chat toggle key" msgstr "Klávesa zobrazení chatu" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Příkazy" +#, fuzzy +msgid "Chat weblinks" +msgstr "Chat zobrazen" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2530,6 +2813,12 @@ msgstr "Klávesa plynulého pohybu kamery" msgid "Clean transparent textures" msgstr "Vynulovat průhledné textury" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Klient" @@ -2543,14 +2832,18 @@ msgid "Client modding" msgstr "Lokální mody" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client side modding restrictions" -msgstr "Lokální mody" +msgstr "Omezení modování na straně klienta" #: src/settings_translation_file.cpp 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í" @@ -2575,6 +2868,10 @@ msgstr "Mraky v menu" msgid "Colored fog" msgstr "Barevná mlha" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Zbarvené stíny" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2585,6 +2882,13 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" +"Seznam nastavení ve formátu CSV sloužící k filtrování obsahu repozitáře.\n" +"\"nesvobodné\" slouží pro skrytí balíčků, které se podle definice Free " +"Software Foundation\n" +"neřadí do \"svobodného softwaru\".\n" +"Můžete také zadat hodnocení obsahu.\n" +"Tato nastavení jsou nezávislá na versi Minetestu,\n" +"kompletní seznam na: https://content.minetest.net/help/content_flags/" #: src/settings_translation_file.cpp msgid "" @@ -2607,6 +2911,22 @@ msgstr "" msgid "Command key" msgstr "CMD ⌘" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Propojené sklo" @@ -2632,13 +2952,20 @@ msgid "Console height" msgstr "Šírka konzole" #: src/settings_translation_file.cpp -msgid "ContentDB Flag Blacklist" +msgid "Content Repository" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ContentDB Flag Blacklist" +msgstr "ContentDB: Černá listina" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB Max. souběžných stahování" + +#: src/settings_translation_file.cpp msgid "ContentDB URL" -msgstr "Pokračovat" +msgstr "ContentDB-URL" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -2649,25 +2976,28 @@ msgid "" "Continuous forward movement, toggled by autoforward key.\n" "Press the autoforward key again or the backwards movement to disable." msgstr "" +"Nepřetržitý pohyb vpřed zapnutý klávesou Automaticky vpřed.\n" +"Stisk klávesy Automaticky vpřed nebo Dozadu, pohyb zruší." #: src/settings_translation_file.cpp msgid "Controls" msgstr "Ovládání" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Controls length of day/night cycle.\n" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" "Ovládání délky denního cyklu.\n" -"Příklad: 72 = 20 minut, 360 = 4 minutý, 1 = 24 hodin, 0 = zůstává pouze noc " -"nebo den." +"Příklad:\n" +"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 "Ovládá 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." @@ -2683,6 +3013,9 @@ msgid "" "Value >= 10.0 completely disables generation of tunnels and avoids the\n" "intensive noise calculations." msgstr "" +"Stanovuje šířku tunelů. Nižší hodnota vytváří širší tunely.\n" +"Hodnota >= 10.0 úplně vypne generování tunelů, čímž se zruší\n" +"náročné výpočty šumu." #: src/settings_translation_file.cpp msgid "Crash message" @@ -2697,16 +3030,25 @@ msgid "Crosshair alpha" msgstr "Průhlednost zaměřovače" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Průhlednost zaměřovače (mezi 0 a 255)." +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Průhlednost zaměřovače (0 až 255).\n" +"Také určuje barvu zaměřovače" #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Barva zaměřovače" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Barva zaměřovače (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Barva zaměřovače (R,G,B).\n" +"Také určuje barvu zaměřovače" #: src/settings_translation_file.cpp msgid "DPI" @@ -2721,21 +3063,20 @@ msgid "Debug info toggle key" msgstr "Klávesa pro zobrazení ladících informací" #: src/settings_translation_file.cpp -#, fuzzy msgid "Debug log file size threshold" -msgstr "Práh pouštního šumu" +msgstr "Práh velikosti souboru s ladícími informacemi" #: src/settings_translation_file.cpp 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 "" +msgid "Dec. volume key" +msgstr "Klávesa snížení hlasitosti" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2770,17 +3111,19 @@ msgid "Default report format" msgstr "Výchozí formát reportů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Výchozí hra" +msgstr "Výchozí velikost hromádky" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Výchozí časový limit požadavku pro cURL, v milisekundách.\n" -"Má vliv, pouze pokud byl program sestaven s cURL." +"Určit kvalitu filtrování stínů\n" +"Simuluje efekt měkkých stínů použitím PCF nebo Poissonova disku,\n" +"za využívá většího výkonu." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2791,14 +3134,12 @@ msgid "Defines areas with sandy beaches." msgstr "Určuje oblasti s písčitými plážemi." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "Určuje oblasti vyššího terénu (cliff-top) a ovlivňuje strmost útesů." +msgstr "Určuje rozmístění vyššího terénu a strmých útesů." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines distribution of higher terrain." -msgstr "Určuje oblasti spadající pod 'terrain_higher' (cliff-top terén)." +msgstr "Určuje rozmístění vyššího terénu." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." @@ -2815,36 +3156,24 @@ msgid "Defines location and terrain of optional hills and lakes." msgstr "Určuje pozici a terén možných hor a jezer." #: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Určuje vyhlazovací krok textur.\n" -"Vyšší hodnota znamená vyhlazenější normálové mapy." - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the base ground level." -msgstr "Určuje lesní oblasti a hustotu stromového porostu." +msgstr "Určuje základní úroveň povrchu." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the depth of the river channel." -msgstr "Určuje lesní oblasti a hustotu stromového porostu." +msgstr "Určuje hloubku říčního koryta." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "Určuje maximální posun hráče v blocích (0 = neomezený)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river channel." -msgstr "Určuje makroskopickou strukturu koryta řeky." +msgstr "Určuje šířku říčního koryta." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river valley." -msgstr "Určuje oblasti, kde stromy nesou plody." +msgstr "Určuje šířku údolí řeky." #: src/settings_translation_file.cpp msgid "Defines tree areas and tree density." @@ -2872,13 +3201,12 @@ msgid "Deprecated Lua API handling" msgstr "Zacházení se zastaralým Lua API" #: src/settings_translation_file.cpp -#, fuzzy msgid "Depth below which you'll find giant caverns." -msgstr "Hloubka pod kterou najdete velké jeskyně." +msgstr "Hloubka, pod kterou se nachází velké jeskynní dutiny." #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." -msgstr "Hloubka pod kterou najdete velké jeskyně." +msgstr "Hloubka, pod kterou se nachází velké jeskyně." #: src/settings_translation_file.cpp msgid "" @@ -2893,18 +3221,26 @@ msgid "Desert noise threshold" msgstr "Práh pouštního šumu" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Deserts occur when np_biome exceeds this value.\n" "When the 'snowbiomes' flag is enabled, this is ignored." msgstr "" "Pouště se objeví v místech, kde 'np_biome' přesahuje tuto hodnotu.\n" -"Pokud je zapnutý nový systém biomů, toto nastavení nemá vliv." +"Ignorováno, pokud je zapnuté nastavení \"snowbiomes\"." #: src/settings_translation_file.cpp 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í" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Částicové efekty při těžení" @@ -2917,6 +3253,16 @@ msgstr "Vypnout anticheat" msgid "Disallow empty passwords" msgstr "Zakázat prázdná hesla" +#: src/settings_translation_file.cpp +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ů." @@ -2934,28 +3280,28 @@ msgid "Drop item key" msgstr "Klávesa vyhození předmětu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Dump the mapgen debug information." -msgstr "Vypsat ladící informace mapgenu." +msgstr "Vypsat ladící informace z Generátoru mapy." #: src/settings_translation_file.cpp msgid "Dungeon maximum Y" -msgstr "" +msgstr "Horní hranice Y pro žaláře" #: src/settings_translation_file.cpp msgid "Dungeon minimum Y" -msgstr "" +msgstr "Dolní hranice Y pro žaláře" #: src/settings_translation_file.cpp -#, fuzzy msgid "Dungeon noise" -msgstr "Šum hřbetů" +msgstr "Šum žalářů" #: src/settings_translation_file.cpp msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" +"Zapnout podporu IPv6 (pro klienta i server).\n" +"Požadováno pro IPv6 připojení." #: src/settings_translation_file.cpp msgid "" @@ -2965,23 +3311,46 @@ msgstr "" "Zapnout podporu Lua modů na straně klienta.\n" "Tato funkce je experimentální a její API se může změnit." +#: 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 "" +"Zapnout filtrování Poissoným diskem.\n" +"Pokud je zapnuto, využívá Poissonův disk pro generování \"měkkých stínů\". V " +"opačném případě je využito filtrování PCF." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Zanout zbarvené stíny.\n" +"Po zapnutí vrhají průhledné předměty zbarvené stíny. Toto má velký vliv na " +"výkon." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Povolit konzolové okno" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Zapnout kreativní mód pro nové mapy." +msgid "Enable creative mode for all players" +msgstr "Zapnout kreativní mód pro všechny hráče" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable joysticks" msgstr "Zapnout joysticky" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Enable joysticks. Requires a restart to take effect" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod channels support." -msgstr "Zapnout zabezpečení módů" +msgstr "" #: src/settings_translation_file.cpp msgid "Enable mod security" @@ -2995,16 +3364,6 @@ msgstr "Povolit zraňování a umírání hráčů." 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 "" - -#: 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" @@ -3013,6 +3372,10 @@ msgstr "" "Zapne plynulé osvětlení s jednoduchou ambientní okluzí.\n" "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" @@ -3042,6 +3405,8 @@ msgid "" "Enable vertex buffer objects.\n" "This should greatly improve graphics performance." msgstr "" +"Zapnout objekty vyrovnávací paměti vertexů.\n" +"Toto by mělo výrazně zlepšit grafický výkon." #: src/settings_translation_file.cpp msgid "" @@ -3052,15 +3417,14 @@ msgstr "" "Např.: 0 pro žádné, 1.0 pro normální a 2.0 pro dvojité klepání." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Enable/disable running an IPv6 server.\n" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" -"Povolit/zakázat spouštění IPv6 serveru. IPv6 server může podle\n" -"systémového nastevení být omezen pouze na klienty s IPv6.\n" -"Nemá vliv, pokud je 'bind_address' nastaveno." +"Povolit/zakázat spuštění IPv6 serveru.\n" +"Ignorováno, pokud je 'bind_address' nastaveno.\n" +"Je třeba mít povoleno enable_ipv6." #: src/settings_translation_file.cpp msgid "" @@ -3069,22 +3433,15 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" +"Zapíná Hableho \"Uncharted 2\" filmové mapování odstínů.\n" +"Simuluje křivku odstínu fotografického filmu a tím přibližný vzhled\n" +"obrázků s vysokým dynamickým rozsahem (HDR). Kontrast středních\n" +"hodnot je lehce zvýšený, vysoké a nízké hodnoty jsou postupně komprimovány." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." msgstr "Povolí animaci věcí v inventáři." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Povolí bump mapping textur. Balík textur buď poskytne normálové mapy,\n" -"nebo musí být automaticky vytvořeny.\n" -"Nastavení vyžaduje zapnuté shadery." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Zapnout cachování geom. sítí otočených pomocí facedir." @@ -3093,22 +3450,6 @@ msgstr "Zapnout cachování geom. sítí otočených pomocí facedir." msgid "Enables minimap." msgstr "Zapne minimapu." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Zapne generování normálových map za běhu (efekt protlačení).\n" -"Nastavení vyžaduje zapnutý bump mapping." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Zapne parallax occlusion mapping.\n" -"Nastavení vyžaduje zapnuté shadery." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3116,6 +3457,20 @@ msgid "" "sound controls will be non-functional.\n" "Changing this setting requires a restart." msgstr "" +"Zapíná zvukový systém.\n" +"Vypnutí má za náledek úplné ztlumení všech zvuků\n" +"a zvukového ovládání ve hře.\n" +"Změna tohoto nastavení vyžaduje restart." + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" @@ -3125,14 +3480,6 @@ msgstr "Interval vypisování profilovacích dat enginu" msgid "Entity methods" msgstr "Metody entit" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Experimentální nastavení, může zapříčinit viditelné mezery mezi bloky,\n" -"je-li nastaveno na vyšší číslo než 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3142,10 +3489,20 @@ msgid "" "Values < 1.0 (for example 0.25) create a more defined surface level with\n" "flatter lowlands, suitable for a solid floatland layer." msgstr "" +"Exponent pro zužování létajících ostrovů. Mění míru zúžení.\n" +"Hodnota = 1.0 vytvoří rovnoměrné přímé zúžení.\n" +"Hodnoty > 1.0 vytvoří hladké zúžení vhodné pro výchozí oddělené\n" +"létající ostrovy.\n" +"Hodnoty < 1.0 (např. 0.25) vytvoří výraznější úroveň povrchu\n" +"s rovinatějšími nížinami, vhodné pro souvislou vrstvu létajících ostrovů." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS v menu pauzy" +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í" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3160,21 +3517,8 @@ msgid "Fall bobbing factor" msgstr "Součinitel houpání pohledu při pádu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font path" -msgstr "Záložní písmo" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Stín záložního písma" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Průhlednost stínu záložního písma" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Velikost záložního písma" +msgstr "Cesta k záložnímu písmu" #: src/settings_translation_file.cpp msgid "Fast key" @@ -3193,12 +3537,11 @@ msgid "Fast movement" msgstr "Turbo režim pohybu" #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Turbo režim pohybu (pomocí klávesy použít).\n" +"Turbo režim pohybu (pomocí klávesy \"Aux1\").\n" "Vyžaduje na serveru přidělené právo \"fast\"." #: src/settings_translation_file.cpp @@ -3210,17 +3553,15 @@ msgid "Field of view in degrees." msgstr "Úhel pohledu ve stupních." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "File in client/serverlist/ that contains your favorite servers displayed in " "the\n" "Multiplayer Tab." msgstr "" "Soubor v client/serverlist/, který obsahuje oblíbené servery zobrazené na " -"záložce 'Online hra'." +"záložce 'Multiplayer'." #: src/settings_translation_file.cpp -#, fuzzy msgid "Filler depth" msgstr "Hloubka výplně" @@ -3233,28 +3574,27 @@ msgid "Filmic tone mapping" msgstr "Filmový tone mapping" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Okraje filtrovaných textur se mohou mísit s průhlednými sousedními pixely,\n" -"které PNG optimizery obvykle zahazují. To může vyústit v tmavý nebo světlý\n" -"lem okolo hran. Zapnutí tohoto filtru problém řeší při načítání textur." - -#: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filtrování" +"které PNG optimizery obvykle zahazují. To může vyústit v tmavé nebo světlé\n" +"okraje hran. Zapnutí tohoto filtru problém řeší při načítání textur.\n" +"Toto nastavení je automaticky zapnuto, pokud je povoleno Mip-Mapování." #: src/settings_translation_file.cpp #, 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." -msgstr "První ze dvou 3D šumů, které dohromady definují tunely." +msgstr "První ze 4 2D šumů, které dohromady definují rozsah výšek kopců/hor." #: src/settings_translation_file.cpp -#, fuzzy msgid "First of two 3D noises that together define tunnels." msgstr "První ze dvou 3D šumů, které dohromady definují tunely." @@ -3264,42 +3604,35 @@ msgstr "Fixované seedové čislo" #: src/settings_translation_file.cpp msgid "Fixed virtual joystick" -msgstr "" +msgstr "Nepohyblivý virtuální joystick" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "Koncentrace hor na létajících ostrovech" +msgstr "Hustota létajících ostrovů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "Výška hor na létajících ostrovech" +msgstr "Létajících ostrovy: Max. Y" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "Výška hor na létajících ostrovech" +msgstr "Létajících ostrovy: Min. Y" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Základní šum létajících ostrovů" +msgstr "Šum létajících ostrovů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "Koncentrace hor na létajících ostrovech" +msgstr "Exponent zúžení létajících ostrovů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "Základní šum létajících ostrovů" +msgstr "Vzdálenost zužování létajících ostrovů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "Výška létajících ostrovů" +msgstr "Hladina vody na létajících ostrovech" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3314,7 +3647,6 @@ msgid "Fog" msgstr "Mlha" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fog start" msgstr "Začátek mlhy" @@ -3322,13 +3654,18 @@ msgstr "Začátek mlhy" 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 "" +msgstr "Tučné písmo jako výchozí" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "" +msgstr "Kurzíva jako výchozí" #: src/settings_translation_file.cpp msgid "Font shadow" @@ -3343,22 +3680,37 @@ msgid "Font size" msgstr "Velikost písma" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" +#, fuzzy +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Velikost výchozího písma v bodech (pt)." #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" +#, fuzzy +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Velikost proporcionálního písma v bodech (pt)." #: 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 "" +"Velikost písma posledního textu a výzvy v chatu v bodech (pt).\n" +"Výchozí velikost písma se nastaví hodnotou 0." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -3366,6 +3718,8 @@ msgid "" "placeholders:\n" "@name, @message, @timestamp (optional)" msgstr "" +"Formát hráčovy zprávy v chatu. Řetězec níže obsahuje platné zástupce:\n" +"@name, @message, @timestamp (optional)" #: src/settings_translation_file.cpp msgid "Format of screenshots." @@ -3373,50 +3727,45 @@ msgstr "Formát snímků obrazovky." #: src/settings_translation_file.cpp msgid "Formspec Default Background Color" -msgstr "" +msgstr "Konzole Výchozí barva pozadí" #: src/settings_translation_file.cpp msgid "Formspec Default Background Opacity" -msgstr "" +msgstr "Konzole Výchozí průhlednost pozadí" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Color" -msgstr "" +msgstr "Konzole Barva pozadí při zobrazení na celé obrazovce" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Opacity" -msgstr "" +msgstr "Konzole Průhlednost pozadí při zobrazení na celé obrazovce" #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec default background color (R,G,B)." -msgstr "Barva (R,G,B) pozadí herní chatovací konzole." +msgstr "Konzole Výchozí barva pozadí (R,G,B)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec default background opacity (between 0 and 255)." -msgstr "" -"Průhlednost pozadí herní chatovací konzole (neprůhlednost, mezi 0 a 255)." +msgstr "Konzole Výchozí průhlednost pozadí (0 až 255)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec full-screen background color (R,G,B)." -msgstr "Barva (R,G,B) pozadí herní chatovací konzole." +msgstr "Konzole Barva pozadí při zobrazení na celou obrazovku (R,G,B)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec full-screen background opacity (between 0 and 255)." msgstr "" -"Průhlednost pozadí herní chatovací konzole (neprůhlednost, mezi 0 a 255)." +"Konzole Průhlednost pozadí při zobrazení na celou obrazovku (0 až 255)." #: src/settings_translation_file.cpp msgid "Forward key" msgstr "Vpřed" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fourth of 4 2D noises that together define hill/mountain range height." -msgstr "První ze dvou 3D šumů, které dohromady definují tunely." +msgstr "" +"Čtvrtý ze čtyř 2D šumů, které dohromady definují rozsah výšek kopců/hor." #: src/settings_translation_file.cpp msgid "Fractal type" @@ -3426,25 +3775,20 @@ msgstr "Typ fraktálu" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Podíl viditelné vzdálenosti, na kterém začne být mlha vykreslována" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "FreeType fonts" -msgstr "Písma Freetype" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." msgstr "" -"Maximální vzdálenost, ve které jsou klientům generovány bloky, určená\n" -"v mapblocích (16 bloků)." +"Vzdálenost, ve které jsou klientům generovány bloky, určená v mapblocích (16 " +"bloků)." #: src/settings_translation_file.cpp msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." msgstr "" -"Maximální vzdálenost, ve které jsou klientům odeslány bloky, určená\n" -"v mapblocích (16 bloků)." +"Vzdálenost, ze které jsou klientům odesílány bloky, určená v mapblocích (16 " +"bloků)." #: src/settings_translation_file.cpp msgid "" @@ -3454,15 +3798,16 @@ 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 "" +"Vzdálenost, na kterou má klient inforamace o objektech,\n" +"určená v mapblocích (16 bloků).\n" +"Nastavení této hodnoty výše než active_block_range umožní serveru\n" +"udržet v paměti aktivní objekty až do této vzdálenosti ve směru hráčova\n" +"pohledu. (Toto může předejít náhlému mizení postav)" #: src/settings_translation_file.cpp msgid "Full screen" msgstr "Celá obrazovka" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Bitová hloubka v celoobrazovkovém režimu" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Celoobrazovkový režim." @@ -3480,8 +3825,17 @@ msgid "GUI scaling filter txr2img" msgstr "Filtrovat při škálování GUI (txr2img)" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Generovat normálové mapy" +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" @@ -3492,31 +3846,43 @@ msgstr "Globální callback funkce" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Globální parametry generování mapy.\n" -"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n" -"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n" -"všechny dekorace.\n" -"Neuvedené příznaky zůstávají ve výchozím stavu.\n" -"Příznaky začínající na 'no' slouží k zakázání možnosti." +"V Generátoru mapy v6 ovládá nastavení \"decorations\" všechny dekorace\n" +"kromě stromů a tropické trávy, ve všech ostatních verzích Generátoru mapy\n" +"ovládá toto nastavení všechny dekorace." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." msgstr "" +"Gradient křivky světla na nejvyšší úrovni světla.\n" +"Určuje kontrast nejvyšších světelných hodnot." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." msgstr "" +"Gradient křivky světla na nejnižší úrovni světla.\n" +"Určuje kontrast nejnižších světelných hodnot." #: src/settings_translation_file.cpp 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" @@ -3526,33 +3892,35 @@ msgid "Ground level" msgstr "Výška povrchu země" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ground noise" -msgstr "Výška povrchu země" +msgstr "Šum povrchu" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "HTTP režimy" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "HTTP mods" -msgstr "HTTP mody" - -#: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "Součinitel škálování HUD" +msgid "HUD scaling" +msgstr "Měřítko GUI" #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Klávesa pro přepnutí HUD (Head-Up Display)" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Zacházení s voláními zastaralého Lua API:\n" -"- legacy: pokusí se napodobit staré chování (výchozí pro release).\n" +"- none: Nezaznamenávat zastaralá volání\n" "- log: pokusí se napodobit staré chování a zaznamená backtrace volání\n" " (výchozí pro debug).\n" "- error: při volání zastaralé funkce skončit (doporučeno vývojářům modů)." @@ -3579,8 +3947,11 @@ msgid "Heat noise" msgstr "Tepelný šum" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Výšková část počáteční velikosti okna." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Výškový parametr počáteční velikosti okna. Ignorováno v režimu na celé " +"obrazovce." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3590,10 +3961,6 @@ msgstr "Výškový šum" msgid "Height select noise" msgstr "Šum vybírání výšky" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Výpočty ve FPU s vysokou přesností" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Strmost kopců" @@ -3603,24 +3970,20 @@ msgid "Hill threshold" msgstr "Práh kopců" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness1 noise" -msgstr "Tepelný šum" +msgstr "Šum kopcovitosti1" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness2 noise" -msgstr "Tepelný šum" +msgstr "Šum kopcovitosti2" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness3 noise" -msgstr "Tepelný šum" +msgstr "Šum kopcovitosti3" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness4 noise" -msgstr "Tepelný šum" +msgstr "Šum kopcovitosti4" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." @@ -3631,18 +3994,24 @@ msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" +"Horizontální zrychlení ve vzduchu při skoku nebo pádu,\n" +"určeno v blocích za sekundu za sekundu." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration in fast mode,\n" "in nodes per second per second." msgstr "" +"Horizontální a vertikální zrychlení v rychlém režimu,\n" +"určeno v blocích za sekundu za sekundu." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration on ground or when climbing,\n" "in nodes per second per second." msgstr "" +"Horizontální a vertikální zrychlení na zemi nebo při lezení,\n" +"určeno v blocích za sekundu za sekundu." #: src/settings_translation_file.cpp msgid "Hotbar next key" @@ -3653,169 +4022,136 @@ msgid "Hotbar previous key" msgstr "Klávesa pro předchozí věc v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 1 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 1 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 10 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 10 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 11 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 11 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 12 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 12 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 13 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 13 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 14 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 14 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 15 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 15 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 16 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 16 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 17 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 17 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 18 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 18 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 19 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 19 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 2 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 2 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 20 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 20 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 21 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 21 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 22 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 22 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 23 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 23 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 24 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 24 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 25 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 25 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 26 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 26 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 27 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 27 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 28 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 28 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 29 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 29 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 3 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 3 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 30 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 30 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 31 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 31 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 32 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 32 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 4 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 4 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 5 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 5 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 6 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 6 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 7 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 7 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 8 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 8 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 9 key" -msgstr "Klávesa pro následující věc v liště předmětů" +msgstr "Klávesa pro přihrádku 9 v liště předmětů" #: src/settings_translation_file.cpp -#, fuzzy msgid "How deep to make rivers." -msgstr "Jak hluboké dělat řeky" +msgstr "Jak hluboké dělat řeky." #: src/settings_translation_file.cpp msgid "" @@ -3823,10 +4159,15 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"Rychlost pohybu vln v kapalinách. Vyšší = rychlejší.\n" +"Záporné hodnoty vytvoří vlny jdoucí pozpátku.\n" +"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" @@ -3834,8 +4175,14 @@ 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 "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" +msgstr "Jak široké dělat řeky." #: src/settings_translation_file.cpp msgid "Humidity blend noise" @@ -3866,15 +4213,12 @@ msgstr "" "omezit ji vyčkáváním, aby se zbytečně neplýtvalo výkonem CPU." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"V zakázaném stavu způsobí, že klávesa \"použít\" je použita k aktivaci " -"turba\n" -"v režimu létání." +"Pokud je vypnuto, klávesa \"Aux1\" je , při zapnutém létání\n" +"a rychlém režimu, použita k rychlému létání." #: src/settings_translation_file.cpp msgid "" @@ -3900,14 +4244,22 @@ msgstr "" "K tomu je potřeba mít na serveru oprávnění \"noclip\"." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Když zapnuto, místo klávesy \"plížit se\" se ke slézání a potápění používá " -"klávese \"použít\"." +"Pokud je zapnuto, je klávesa \"Aux1\" využita pro sestup\n" +"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 "" @@ -3934,9 +4286,14 @@ msgid "" "If enabled, makes move directions relative to the player's pitch when flying " "or swimming." msgstr "" +"Pokud je zapnuto, je směr pohybu, při létání nebo plavání, závislý na úhlu " +"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 @@ -3955,6 +4312,16 @@ msgid "" "limited\n" "to this distance from the player to the node." msgstr "" +"Pokud je omezení CSM pro vzdálenost bloků povoleno, jsou volání get_node\n" +"omezena na tuto vzdálenost hráče od bloku." + +#: 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 "" +"Pokud je doba výkonu příkazu z chatu delší než zadaný čas v sekundách,\n" +"přidej informaci o čase do příkazu v chatu" #: src/settings_translation_file.cpp msgid "" @@ -3963,6 +4330,11 @@ msgid "" "deleting an older debug.txt.1 if it exists.\n" "debug.txt is only moved if this setting is positive." msgstr "" +"Pokud velikost souboru debug.txt po otevření přesáhne počet megabytů určený\n" +"tímto nastavením, bude soubor přesunut do debug.txt.1 (toto vymaže původní " +"debug.txt.1,\n" +"pokud existuje).\n" +"debug.txt je přesunut pouze pokud je toto nastavení platné." #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." @@ -3972,14 +4344,9 @@ msgstr "Jestliže je toto nastaveno, hráči se budou oživovat na uvedeném mí 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, mezi 0 a 255)." +msgstr "Průhlednost pozadí herní chatovací konzole (neprůhlednost, 0 až 255)." #: src/settings_translation_file.cpp msgid "In-game chat console background color (R,G,B)." @@ -3997,7 +4364,7 @@ msgstr "Klávesa zvýšení hlasitosti" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "" +msgstr "Počáteční vertikální rychlost skoku v blocích za sekundu." #: src/settings_translation_file.cpp msgid "" @@ -4008,7 +4375,8 @@ msgstr "" "Obvykle využíváno jen vývojáři jádra/builtin" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Instrumentovat chatovací přikazy při registraci." #: src/settings_translation_file.cpp @@ -4033,16 +4401,13 @@ msgstr "Instrumentovat funkci action u Loading Block Modifierů při registraci. 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 @@ -4062,14 +4427,12 @@ msgid "Invert vertical mouse movement." msgstr "Obrátit svislý pohyb myši." #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "Cesta k neproporcionálnímu písmu" +msgstr "Cesta k písmu s kurzívou" #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic monospace font path" -msgstr "Cesta k neproporcionálnímu písmu" +msgstr "Cesta k proporcionálnímu písmu s kurzívou" #: src/settings_translation_file.cpp msgid "Item entity TTL" @@ -4086,6 +4449,10 @@ msgid "" "increases processing load.\n" "At iterations = 20 this mapgen has a similar load to mapgen V7." msgstr "" +"Opakování rekurzivní funkce.\n" +"Zvýšení hodnoty vede ke zlepšení detailů, ale také zvyšuje nároky na výkon.\n" +"Při opakování = 20 má tento Generátor mapy podobné nároky jako\n" +"Generátor mapy v7." #: src/settings_translation_file.cpp msgid "Joystick ID" @@ -4095,17 +4462,20 @@ msgstr "ID joysticku" msgid "Joystick button repetition interval" msgstr "Interval opakování tlačítek joysticku" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "Mrtvá zóna joysticku" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Citlivost otáčení pohledu joystickem" #: src/settings_translation_file.cpp -#, fuzzy msgid "Joystick type" msgstr "Typ joysticku" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "W component of hypercomplex constant.\n" @@ -4113,44 +4483,47 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" -"Julia udává jen: W komponet hyperkomplexu konstantní určení tvaru Julie.\n" -"Nemá efekt na 3D fraktálech.\n" -"Rozsah zhruba -2 až 2." +"Pouze pro set Julia.\n" +"Komponenta W hyperkomplexní konstanty.\n" +"Mění tvar fraktálu.\n" +"Nemá žádný vliv na 3D fraktály.\n" +"Rozmezí přibližně -2 až 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "X component of hypercomplex constant.\n" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Julia udává jen: komponet X hyperkomplexu konstantího udávání tvaru julie.\n" -"Rozsah zhruba -2 až 2." +"Pouze pro set Julia.\n" +"Komponenta X hyperkomplexní konstanty.\n" +"Mění tvar fraktálu.\n" +"Rozmezí přibližně -2 až 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "Y component of hypercomplex constant.\n" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Julia udává jen: W komponet hyperkomplexu konstantní určení tvaru Julie.\n" -"Nemá efekt na 3D fraktálech.\n" -"Rozsah zhruba -2 až 2." +"Pouze pro set Julia.\n" +"Komponenta Y hyperkomplexní konstanty.\n" +"Mění tvar fraktálu.\n" +"Rozmezí přibližně -2 až 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "Z component of hypercomplex constant.\n" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Julia udává jen: W komponet hyperkomplexu konstantní určení tvaru Julie.\n" -"Nemá efekt na 3D fraktálech.\n" -"Rozsah zhruba -2 až 2." +"Pouze pro set Julia.\n" +"Komponenta Z hyperkomplexní konstanty.\n" +"Mění tvar fraktálu.\n" +"Rozmezí přibližně -2 až 2." #: src/settings_translation_file.cpp msgid "Julia w" @@ -4196,6 +4569,16 @@ msgstr "" "viz. http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klávesa pro těžení\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4222,6 +4605,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Klávesa pro zvýšení hlasitosti\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4229,6 +4615,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Klávesa pro skok.\n" +"viz. See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4236,16 +4625,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Klávesa pro rychlý pohyb v rychlém režimu.\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player backward.\n" "Will also disable autoforward, when active.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Klávesa pro odhození právě drženého předmětu.\n" +"Klávesa pro pohyb hráče zpět.\n" +"Také vypne automatický pohyb vpřed, pokud je zapnutý.\n" "viz. http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4255,6 +4647,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Klávesa pro pohyb hráče vpřed.\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4262,6 +4657,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Klávesa pro pohyb hráče doleva.\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4269,6 +4667,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Klávesa pro pohyb hráče doprava.\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4276,6 +4677,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Klávesa pro ztlumení hry.\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4283,6 +4687,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Klávesa pro otevření okna chatu za účelem zadání příkazů.\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4305,6 +4712,17 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"klávesy pro snížení hlasitosti.\n" +"viz. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -4823,16 +5241,20 @@ msgid "" msgstr "" #: 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 "Vyhodit hráče, který poslal více jak X zpráv během 10 sekund." + #: src/settings_translation_file.cpp msgid "Lake steepness" -msgstr "" +msgstr "Strmost jezer" #: src/settings_translation_file.cpp msgid "Lake threshold" -msgstr "" +msgstr "Strmost jezer" #: src/settings_translation_file.cpp msgid "Language" @@ -4840,19 +5262,19 @@ msgstr "Jazyk" #: src/settings_translation_file.cpp msgid "Large cave depth" -msgstr "Hloubka velké jeskyně" +msgstr "Hloubka velkých jeskyní" #: src/settings_translation_file.cpp msgid "Large cave maximum number" -msgstr "" +msgstr "Horní hranice velkých jeskyní" #: src/settings_translation_file.cpp msgid "Large cave minimum number" -msgstr "" +msgstr "Spodní hranice velkých jeskyní" #: src/settings_translation_file.cpp msgid "Large cave proportion flooded" -msgstr "" +msgstr "Poměr zatopení velkých jeskyní" #: src/settings_translation_file.cpp msgid "Large chat console key" @@ -4869,37 +5291,54 @@ msgid "" "- Simple: only outer faces, if defined special_tiles are used\n" "- Opaque: disable transparency" msgstr "" +"Styl listí:\n" +"- Vícevrstevné: všechny plochy jsou viditelné\n" +"- Jednoduché: pouze vnější plochy, pokud je definováno special_tiles, jsou " +"použity\n" +"- Neprůhledné: vypne průhlednost" #: src/settings_translation_file.cpp 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." #: src/settings_translation_file.cpp msgid "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." msgstr "" +"Délka vln v kapalinách.\n" +"Vyžaduje zapnuté vlnění kapalin." #: 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 "Frekvence vykonání cyklů Active Block Modifieru (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 "Frekvence vykonání cyklů ČasovačeBloku" #: 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 "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" @@ -4908,32 +5347,46 @@ 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" +"- none (zprávy budou vypsány bez patřičné úrovně)\n" +"- error (chyba)\n" +"- warning (varování)\n" +"- action (akce)\n" +"- info (informace)\n" +"- verbose (slovně)" #: src/settings_translation_file.cpp msgid "Light curve boost" -msgstr "" +msgstr "Posílení křivky světla" #: src/settings_translation_file.cpp msgid "Light curve boost center" -msgstr "" +msgstr "Posílení křivky světla Středy" #: src/settings_translation_file.cpp msgid "Light curve boost spread" -msgstr "" +msgstr "Posílení křivky světla Šíření" #: src/settings_translation_file.cpp msgid "Light curve gamma" -msgstr "" +msgstr "Křivka světla Gamma" #: src/settings_translation_file.cpp msgid "Light curve high gradient" -msgstr "" +msgstr "Křivka světla Vysoký gradient" #: src/settings_translation_file.cpp msgid "Light curve low gradient" -msgstr "" +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 "" @@ -4941,6 +5394,9 @@ msgid "" "Only mapchunks completely within the mapgen limit are generated.\n" "Value is stored per-world." msgstr "" +"Limit generování mapy v blocích, ve všech 6 směrech od (0,0,0).\n" +"Generují se pouze kusy nacházející se kompletně v zadaném limitu.\n" +"Tato hodnota je unikátní pro každý svět." #: src/settings_translation_file.cpp msgid "" @@ -4950,39 +5406,43 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"Omezuje počet paralelních HTTP požadavků. Má vliv na:\n" +"- Načítání multimédií, pokud server používá nastavení remote_media.\n" +"- Stahování seznamu serverů a oznámení na serveru.\n" +"- Stahování prováděná přes hlavní nabídku (např. Správce modů).\n" +"Má vliv pouze v případě kompilace přes cURL." #: src/settings_translation_file.cpp msgid "Liquid fluidity" -msgstr "" +msgstr "Tekutost kapalin" #: src/settings_translation_file.cpp msgid "Liquid fluidity smoothing" -msgstr "" +msgstr "Vyhlazení tekutosti kapalin" #: src/settings_translation_file.cpp msgid "Liquid loop max" -msgstr "" +msgstr "Horní hranice kapalinového cyklu" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" -msgstr "" +msgstr "Doba vymazání fronty kapalin" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid sinking" -msgstr "Rychlost sestupu" +msgstr "Rychlost stékání kapalin" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." -msgstr "" +msgstr "Frekvence aktualizace kapalin v sekundách." #: src/settings_translation_file.cpp msgid "Liquid update tick" -msgstr "" +msgstr "Jeden cyklus aktualizace kapalin" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "" +msgstr "Načíst profilování hry" #: src/settings_translation_file.cpp msgid "" @@ -4990,76 +5450,70 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" +"Načíst profilování hry pro sběr profilovacích dat.\n" +"Umožňuje použít příkaz /profiler pro přístup ke zkopilovanému profilu.\n" +"Užitečné pro vývojáře modů a provozovatele serverů." #: src/settings_translation_file.cpp msgid "Loading Block Modifiers" -msgstr "" +msgstr "Loading Block Modifiery" #: src/settings_translation_file.cpp msgid "Lower Y limit of dungeons." -msgstr "" +msgstr "Spodní hranice Y pro žaláře." #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "Maximální počet emerge front" +msgstr "Spodní hranice Y pro létající ostrovy." #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "Skript hlavní nabídky" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Skript hlavní nabídky" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" +"Barva mlhy a oblohy záleží na denní době (svítání/soumrak) a na směru " +"pohledu." #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" -msgstr "" +msgstr "Udělá všechny kapaliny neprůhledné" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Úroveň komprese mapy pro pevné úložiště" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Úroveň komprese mapy pro přenost internetem" #: src/settings_translation_file.cpp msgid "Map directory" -msgstr "" +msgstr "Směr mapy" #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "" +msgstr "Parametry generování mapy pro Generátor mapy - Carpathian." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." msgstr "" -"Globální parametry generování mapy.\n" -"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n" -"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n" -"všechny dekorace.\n" -"Neuvedené příznaky zůstávají ve výchozím stavu.\n" -"Příznaky začínající na 'no' slouží k zakázání možnosti." +"Parametry generování mapy pro Generátor mapy - Plocha.\n" +"Do plochého světa je možné přidat občasná jezera a kopce." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Fractal.\n" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" -"Globální parametry generování mapy.\n" -"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n" -"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n" -"všechny dekorace.\n" -"Neuvedené příznaky zůstávají ve výchozím stavu.\n" -"Příznaky začínající na 'no' slouží k zakázání možnosti." +"Parametry generování mapy pro Generátor mapy - Fraktál.\n" +"\"terén\" umožňuje generování \"nefraktálového\" terénu:\n" +"oceány, ostrovy a podzemí." #: src/settings_translation_file.cpp msgid "" @@ -5070,148 +5524,145 @@ msgid "" "to become shallower and occasionally dry.\n" "'altitude_dry': Reduces humidity with altitude." msgstr "" +"Parametry generování mapy pro Generátor mapy - Údolí.\n" +"„altitude_chill“: Snižuje teplotu s nadmořskou výškou.\n" +"„humid_rivers“: Zvyšuje vlhkost podél řek.\n" +"„vary_river_depth“: Pokud zapnuto, nízká vlhkost a vysoká teplota\n" +"budou mít za následek mělčí nebo místy úplně vyschlé řeky.\n" +"„altitude_dry“: Snižuje vlhkost s nadmořskou výškou." #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen v5." -msgstr "" +msgstr "Parametry generování mapy pro Generátor mapy v5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" "When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" "the 'jungles' flag is ignored." msgstr "" -"Globální parametry generování mapy.\n" -"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n" -"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n" -"všechny dekorace.\n" -"Neuvedené příznaky zůstávají ve výchozím stavu.\n" -"Příznaky začínající na 'no' slouží k zakázání možnosti." +"Parametry generování mapy pro Generátor mapy v6.\n" +"Nastavení \"snowbiomes\" umožňuje systém 5 biomů.\n" +"Pokud je nastavení \"snowbiomes\" zapnuto, džungle jsou automaticky\n" +"zapnuty a nastavení \"jungles\" je ignorováno." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Globální parametry generování mapy.\n" -"V mapgenu v6 ovládal příznak 'decorations' všechny dekorace kromě\n" -"stromů a tropické trávy. V ostatních mapgenech tento příznak řídí\n" -"všechny dekorace.\n" -"Neuvedené příznaky zůstávají ve výchozím stavu.\n" -"Příznaky začínající na 'no' slouží k zakázání možnosti." +"Parametry generování mapy v Generátoru mapy v7.\n" +"'hřebeny': Rivers.\n" +"'létající ostrovy': Ostrovy vznášející se v prostoru.\n" +"'jeskynní dutiny': Obrovské jeskyně hluboko v podzemí." #: src/settings_translation_file.cpp msgid "Map generation limit" -msgstr "" +msgstr "Limit generování mapy" #: src/settings_translation_file.cpp msgid "Map save interval" msgstr "Interval ukládání mapy" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Doba aktualizace mapy" + #: src/settings_translation_file.cpp msgid "Mapblock limit" -msgstr "" +msgstr "Limit mapbloků" #: src/settings_translation_file.cpp msgid "Mapblock mesh generation delay" -msgstr "" +msgstr "Prodleva generování sítě mapbloků" #: src/settings_translation_file.cpp msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "" +msgstr "Velikost cache paměti v MB Generátoru mapy pro Mapbloky" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" -msgstr "" +msgstr "Časový limit pro vymazání Mapbloku z paměti" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Carpathian" -msgstr "Mapgen plochy" +msgstr "Generátor mapy - Carpathian" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian specific flags" -msgstr "" +msgstr "Nastavení pro Generátor mapy - Carpathian" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat" -msgstr "Mapgen plochy" +msgstr "Generátor mapy - Plocha" #: src/settings_translation_file.cpp msgid "Mapgen Flat specific flags" -msgstr "" +msgstr "Nastavení Generátory mapy - Plocha" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal" -msgstr "Mapgen plochy" +msgstr "Generátor mapy - Fraktál" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Mapgen údolí" +msgstr "Nastavení pro Generátor mapy - Fraktál" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5" -msgstr "Mapgen v5" +msgstr "Generátor mapy V5" #: src/settings_translation_file.cpp msgid "Mapgen V5 specific flags" -msgstr "" +msgstr "Nastavení pro Generátor mapy v5" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6" -msgstr "Mapgen v6" +msgstr "Generátor mapy v6" #: src/settings_translation_file.cpp msgid "Mapgen V6 specific flags" -msgstr "" +msgstr "Nastavení pro Generátor mapy v6" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7" -msgstr "Mapgen v7" +msgstr "Generátor mapy v7" #: src/settings_translation_file.cpp msgid "Mapgen V7 specific flags" -msgstr "" +msgstr "Nastavení pro Generátor mapy v7" #: src/settings_translation_file.cpp msgid "Mapgen Valleys" msgstr "Mapgen údolí" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Valleys specific flags" -msgstr "Mapgen údolí" +msgstr "Nastavení pro Generátor mapy - Údolí" #: src/settings_translation_file.cpp msgid "Mapgen debug" -msgstr "Ladění generátoru mapy" +msgstr "Ladění Generátoru mapy" #: src/settings_translation_file.cpp msgid "Mapgen name" -msgstr "Jméno generátoru mapy" +msgstr "Jméno Generátoru mapy" #: src/settings_translation_file.cpp msgid "Max block generate distance" -msgstr "" +msgstr "Horní hranice vzdálenosti pro generování bloků" #: src/settings_translation_file.cpp msgid "Max block send distance" -msgstr "" +msgstr "Horní hranice vzdálenosti pro posílání bloků" #: src/settings_translation_file.cpp msgid "Max liquids processed per step." -msgstr "" +msgstr "Horní hranice počtu kapalin zpracovaných za jeden krok." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" @@ -5226,7 +5677,11 @@ msgid "Maximum FPS" msgstr "Maximální FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -5239,11 +5694,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" +msgstr "Horní hranice pro náhodný počet velkých jeskyní na kus mapy." #: src/settings_translation_file.cpp msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "" +msgstr "Horní hranice pro náhodný počet malých jeskyní na kus mapy." #: src/settings_translation_file.cpp msgid "" @@ -5274,6 +5729,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -5328,17 +5790,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Nabídky" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -5373,11 +5839,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "" +msgstr "Spodní hranice pro náhodný počet velkých jeskyní na kus mapy." #: src/settings_translation_file.cpp msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "" +msgstr "Spodní hranice pro náhodný počet malých jeskyní na kus mapy." #: src/settings_translation_file.cpp #, fuzzy @@ -5388,12 +5854,25 @@ msgstr "Minimální velikost textury k filtrování" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5404,6 +5883,11 @@ msgstr "Cesta k neproporcionálnímu písmu" msgid "Monospace font size" msgstr "Velikost neproporcionálního písma" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "Velikost neproporcionálního písma" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5471,16 +5955,17 @@ msgstr "" 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 "" @@ -5493,6 +5978,11 @@ msgstr "" 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ů" @@ -5505,14 +5995,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5534,18 +6016,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5555,11 +6029,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5568,39 +6037,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Optional override for chat weblink color." msgstr "" -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Parallax occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Náklon parallax occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Počet iterací parallax occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Režim parallax occlusion" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Škála parallax occlusion" - #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5623,17 +6065,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5654,24 +6092,29 @@ msgid "Physics" msgstr "Fyzika" #: src/settings_translation_file.cpp -#, fuzzy msgid "Pitch move key" -msgstr "Klávesa létání" +msgstr "létání" #: src/settings_translation_file.cpp msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Klávesa létání" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "Interval opakování pravého kliknutí" + #: 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 "Jméno hráče" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5681,6 +6124,11 @@ msgstr "" msgid "Player versus player" msgstr "Hráč proti hráči (PvP)" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Bilineární filtrování" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5715,10 +6163,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5726,14 +6170,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." -msgstr "" +msgstr "Poměr velkých jeskyní s kapalinami." #: src/settings_translation_file.cpp msgid "" @@ -5819,10 +6263,6 @@ msgstr "" msgid "Right key" msgstr "Klávesa doprava" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Interval opakování pravého kliknutí" - #: src/settings_translation_file.cpp #, fuzzy msgid "River channel depth" @@ -5898,6 +6338,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Obrazovka:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Výška obrazovky" @@ -5928,6 +6373,10 @@ msgstr "" "1 znamená nejhorší kvalita; 100 znamená nejlepší kvalita.\n" "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 "" @@ -5942,10 +6391,6 @@ msgstr "První ze dvou 3D šumů, které dohromady definují tunely." 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 "" @@ -6006,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" @@ -6033,10 +6489,20 @@ msgstr "Port serveru" 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ů" @@ -6048,9 +6514,40 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Zapne parallax occlusion mapping.\n" +"Nastavení vyžaduje zapnuté shadery." + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6078,6 +6575,13 @@ msgstr "" "Zapne parallax occlusion mapping.\n" "Nastavení vyžaduje zapnuté shadery." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Cesta k shaderům" @@ -6090,6 +6594,24 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "Kvalita snímků obrazovky" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "Minimální velikost textury k filtrování" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6098,11 +6620,8 @@ msgid "" msgstr "Odsazení stínu písma, pokud je nastaveno na 0, stín nebude vykreslen." #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Odsazení stínu písma, pokud je nastaveno na 0, stín nebude vykreslen." +msgid "Shadow strength gamma" +msgstr "" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6116,6 +6635,17 @@ msgstr "Zobrazit ladící informace" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "Tučné písmo jako výchozí" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Zpráva o vypnutí" @@ -6129,6 +6659,12 @@ msgid "" "Altering this value is for special usage, leaving it unchanged is\n" "recommended." msgstr "" +"Velikost kusů mapy vytovřených Generátorem mapy v mapblocích (16 bloků).\n" +"VAROVÁNÍ!: Hodnota vyšší než 5 nepřináší žádné zlepšení\n" +"a zvyšuje riziko problémů.\n" +"Snížení hodnoty zvýší husotou jeskyní a žalářů.\n" +"Změna hodnoty je pro zvláštní případy, jinak je doporučeno\n" +"nechat ji na výchozí hodnotě." #: src/settings_translation_file.cpp msgid "" @@ -6137,6 +6673,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -6147,11 +6687,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Small cave maximum number" -msgstr "" +msgstr "Horní hranice počtu malých jeskyní" #: src/settings_translation_file.cpp msgid "Small cave minimum number" -msgstr "" +msgstr "Spodní hranice počtu malých jeskyní" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." @@ -6192,20 +6732,15 @@ msgstr "Rychlost chůze" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Průhlednost stínu písma" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Zvuk" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Klávesa plížení" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key for climbing/descending" -msgstr "Klávesa pro výstup/sestup" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6221,6 +6756,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6249,10 +6792,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "Síla vygenerovaných normálových map." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Síla vygenerovaných normálových map." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6290,6 +6829,11 @@ msgstr "" 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 "" @@ -6333,6 +6877,13 @@ msgstr "" msgid "Texture path" msgstr "Cesta k texturám" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6347,6 +6898,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6402,18 +6957,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6431,6 +6986,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6439,9 +7000,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6479,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 @@ -6503,6 +7063,19 @@ msgstr "Zpoždění nápovědy" 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 "" @@ -6574,15 +7147,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6619,7 +7207,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Variation of number of caves." -msgstr "" +msgstr "Variace počtu jeskyní." #: src/settings_translation_file.cpp msgid "" @@ -6678,7 +7266,7 @@ msgid "Viewing range" msgstr "Vzdálenost dohledu" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6755,6 +7343,11 @@ msgstr "Délka vodních vln" msgid "Waving plants" msgstr "Vlnění rostlin" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Barva obrysu bloku" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6776,18 +7369,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6822,14 +7413,24 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "Výšková část počáteční velikosti okna." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -6878,13 +7479,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Y of upper limit of large caves." -msgstr "Maximální počet emerge front" +msgstr "Hodnota Y pro horní hranici velkých jeskyní." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." msgstr "" +"Vzdálenost Y, přes kterou se jeskynní dutiny rozšíří do plné velikosti." #: src/settings_translation_file.cpp msgid "" @@ -6900,7 +7501,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Y-level of cavern upper limit." -msgstr "" +msgstr "Úroveň Y horní hranice jeskynních dutin." #: src/settings_translation_file.cpp msgid "Y-level of higher terrain that creates cliffs." @@ -6914,73 +7515,38 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "cURL timeout" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL limit paralelních stahování" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL timeout" +#~ msgid "- Creative Mode: " +#~ msgstr "- Kreativní mód: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Plynulá kamera" - -#, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Vybrat soubor s modem:" - -#~ msgid "Waving Water" -#~ msgstr "Vlnění vody" - -#~ msgid "Waving water" -#~ msgstr "Vlnění vody" - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "Hloubka velké jeskyně" - -#~ msgid "IPv6 support." -#~ msgstr "" -#~ "Nastavuje reálnou délku dne.\n" -#~ "Např.: 72 = 20 minut, 360 = 4 minuty, 1 = 24 hodin, 0 = čas zůstává stále " -#~ "stejný." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Neprůhlednost stínu písma (od 0 do 255)." - -#~ msgid "Floatland base height noise" -#~ msgstr "Šum základní výšky létajících ostrovů" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Zapne filmový tone mapping" - -#~ msgid "Enable VBO" -#~ msgstr "Zapnout VBO" +#~ msgid "- Damage: " +#~ msgstr "- Zranění: " #~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Určuje oblasti létajících ostrovů s rovinný terénem.\n" -#~ "Terén bude rovný v místech, kde hodnota šumu bude větší než 0." +#~ "0 = parallax occlusion s informacemi o sklonu (rychlejší).\n" +#~ "1 = mapování reliéfu (pomalejší, ale přesnější)." -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "Ovládá šířku tunelů, menší hodnota vytváří širší tunely." - -#, fuzzy -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Stanovuje hustotu horského terénu na létajících ostrovech.\n" -#~ "Jedná se o posun přidaný k hodnotě šumu 'np_mountain'." +#~ msgid "Address / Port" +#~ msgstr "Adresa / Port" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -6991,11 +7557,323 @@ msgstr "cURL timeout" #~ "hodnoty.\n" #~ "Toto nastavení ovlivňuje pouze klienta a serverem není použito." -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Stahuji a instaluji $1, prosím čekejte..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Jste si jisti, že chcete resetovat místní svět?" #~ 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." + +#~ msgid "Bump Mapping" +#~ msgstr "Bump mapping" + +#~ msgid "Bumpmapping" +#~ msgstr "Bump mapování" + +#~ msgid "Config mods" +#~ msgstr "Nastavení modů" + +#~ 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" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Stanovuje hustotu horského terénu na létajících ostrovech.\n" +#~ "Jedná se o posun přidaný k hodnotě šumu 'np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "Ovládá šířku tunelů, menší hodnota vytváří širší tunely." + +#~ msgid "Credits" +#~ msgstr "Autoři" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Barva zaměřovače (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Zranění povoleno" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Výchozí časový limit požadavku pro cURL, v milisekundách.\n" +#~ "Má vliv, pouze pokud byl program sestaven s cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Určuje oblasti létajících ostrovů s rovinný terénem.\n" +#~ "Terén bude rovný v místech, kde hodnota šumu bude větší než 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Povolí bump mapping textur. Balík textur buď poskytne normálové mapy,\n" +#~ "nebo musí být automaticky vytvořeny.\n" +#~ "Nastavení vyžaduje zapnuté shadery." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Zapne filmový tone mapping" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Zapne generování normálových map za běhu (efekt protlačení).\n" +#~ "Nastavení vyžaduje zapnutý bump mapping." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "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." +#~ msgstr "" +#~ "Experimentální nastavení, může zapříčinit viditelné mezery mezi bloky,\n" +#~ "je-li nastaveno na vyšší číslo než 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS v menu pauzy" + +#~ msgid "Fallback font shadow" +#~ msgstr "Stín záložního písma" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Průhlednost stínu záložního písma" + +#~ 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ů" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Neprůhlednost stínu písma (od 0 do 255)." + +#~ msgid "FreeType fonts" +#~ msgstr "Písma Freetype" + +#~ msgid "Full screen BPP" +#~ msgstr "Bitová hloubka v celoobrazovkovém režimu" + +#~ msgid "Game" +#~ msgstr "Hra" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Generovat Normální Mapy" + +#~ 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í" + +#~ msgid "IPv6 support." +#~ msgstr "" +#~ "Nastavuje reálnou délku dne.\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ě" + +#~ msgid "Main" +#~ msgstr "Hlavní nabídka" + +#, fuzzy +#~ 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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minimapa v režimu radar, Přiblížení x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minimapa v režimu povrch, Přiblížení x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minimapa v režimu povrch, Přiblížení x4" + +#~ msgid "Name / Password" +#~ msgstr "Jméno / Heslo" + +#~ msgid "Name/Password" +#~ msgstr "Jméno/Heslo" + +#~ msgid "No" +#~ msgstr "Ne" + #~ msgid "Ok" #~ msgstr "OK" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax occlusion" + +#~ msgid "Parallax occlusion" +#~ msgstr "Parallax occlusion" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Náklon parallax occlusion" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Počet iterací parallax occlusion" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Režim parallax occlusion" + +#, fuzzy +#~ 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" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Reset místního světa" + +#, fuzzy +#~ 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 " +#~ "not be drawn." +#~ msgstr "" +#~ "Odsazení stínu písma, pokud je nastaveno na 0, stín nebude vykreslen." + +#~ msgid "Special" +#~ msgstr "Speciální" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "Klávesa plížení" + +#~ msgid "Start Singleplayer" +#~ msgstr "Start místní hry" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Síla vygenerovaných normálových map." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Pro zapnutí shaderů musíte používat OpenGL ovladač." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Plynulá kamera" + +#~ msgid "Waving Water" +#~ msgstr "Vlnění vody" + +#~ msgid "Waving water" +#~ msgstr "Vlnění vody" + +#~ 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." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/da/minetest.po b/po/da/minetest.po index 931e3dbbf..645c052c2 100644 --- a/po/da/minetest.po +++ b/po/da/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Danish (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-03-31 10:14+0000\n" -"Last-Translator: sfan5 <sfan5@live.de>\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/" "da/>\n" "Language: da\n" @@ -12,7 +12,46 @@ 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.0-dev\n" +"X-Generator: Weblate 4.11-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "Snakkekommandoer" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Afslut til menu" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Ugyldig kommando: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "Enlig spiller" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Online-spillere: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +61,39 @@ msgstr "Genopstå" msgid "You died" msgstr "Du døde" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Tilgængelige kommandoer:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Tilgængelige kommandoer: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua #, fuzzy msgid "An error occurred in a Lua script:" @@ -47,9 +115,30 @@ msgstr "Forbind igen" msgid "The server has requested a reconnect:" msgstr "Serveren har anmodet om at forbinde igen:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Indlæser..." +#: 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. " @@ -64,10 +153,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Serveren understøtter protokol versioner mellem $1 og $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Prøv at slå den offentlige serverliste fra og til, og tjek din internet " -"forbindelse." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,17 +164,26 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Afhængigheder:" @@ -124,9 +220,8 @@ msgid "Mod:" msgstr "Mod:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No (optional) dependencies" -msgstr "Valgfrie afhængigheder:" +msgstr "Ingen (valgfrie) afhængigheder" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." @@ -164,14 +259,55 @@ msgstr "Verden:" msgid "enabled" msgstr "aktiveret" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Indlæser..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Alle pakker" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Already installed" +msgstr "Tast allerede i brug" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Tilbage til hovedmenuen" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "Vær vært for spil" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -186,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" @@ -195,7 +330,23 @@ msgid "Install" msgstr "Installer" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "Installer" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "Valgfrie afhængigheder:" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "" +"Installer mod: Filtypen \"$1\" er enten ikke understøttet, ellers er arkivet " +"korrupt" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" @@ -208,9 +359,25 @@ msgid "No results" msgstr "Der er ingen resultater at vise" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Søg" +#, fuzzy +msgid "No updates" +msgstr "Opdater" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -225,7 +392,11 @@ msgid "Update" msgstr "Opdater" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -276,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 @@ -301,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 "" @@ -322,6 +486,15 @@ msgstr "Luftfugtighedsstøj" 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 "" @@ -425,11 +598,6 @@ msgstr "Floddybde" 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" @@ -462,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" @@ -495,6 +696,16 @@ 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" @@ -520,7 +731,8 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Persistens" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -539,6 +751,10 @@ msgstr "Gendan standard" msgid "Scale" msgstr "Skala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Søg" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Vælg mappe" @@ -547,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" @@ -627,16 +843,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" "Installer mod: Kunne ikke finde passende mappe navn for samling af mods $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"Installer mod: Filtypen \"$1\" er enten ikke understøttet, ellers er arkivet " -"korrupt" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Installer mod: Fil: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Kan ikke finde en korrekt mod eller samling af mods" @@ -657,6 +863,60 @@ msgstr "Kan ikke installere $1 som et mod" msgid "Unable to install a modpack as a $1" msgstr "Kan ikke installere $1 som en samling af mods" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Indlæser..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Prøv at slå den offentlige serverliste fra og til, og tjek din internet " +"forbindelse." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktive bidragere" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "Aktivt objektafsendelsesinterval" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Primære udviklere" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Vælg mappe" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Tidligere bidragere" + +#: builtin/mainmenu/tab_about.lua +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" @@ -697,26 +957,6 @@ msgstr "Afinstaller den valgte pakke" msgid "Use Texture Pack" msgstr "Anvend teksturpakker" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktive bidragere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Primære udviklere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Skabt af" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Tidligere bidragere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Tidligere primære udviklere" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Meddelelsesserver" @@ -726,14 +966,10 @@ msgid "Bind Address" msgstr "Bind adresse" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigurér" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Kreativ tilstand" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Aktivér skade" @@ -749,10 +985,6 @@ msgstr "Host Server" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Navn/kodeord" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Ny" @@ -765,10 +997,15 @@ msgstr "Ingen verden oprettet eller valgt!" msgid "Play Game" msgstr "Start spil" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Vælg verden:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Vælg verden:" @@ -783,46 +1020,68 @@ msgid "Start Game" msgstr "Vær vært for spil" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adresse/port" +#, fuzzy +msgid "Address" +msgstr "Adresse" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Forbind" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Ryd" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Kreativ tilstand" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Skade aktiveret" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "Skade" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Slet favorit" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Favorit" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Join Game" msgstr "Vær vært for spil" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Navn/adgangskode" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Spiller mod spiller aktiveret" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Meddelelsesserver" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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" @@ -849,10 +1108,6 @@ msgstr "Indstillinger" msgid "Antialiasing:" msgstr "Udjævning:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Er du sikker på, at du vil nulstille din enkelt spiller-verden?" - #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Autosave Screen Size" @@ -862,11 +1117,6 @@ msgstr "Autogem skærmstørrelse" msgid "Bilinear Filter" msgstr "Bi-lineær filtréring" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Bump Mapping" -msgstr "Bump Mapping" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Skift tastatur-bindinger" @@ -875,14 +1125,31 @@ msgstr "Skift tastatur-bindinger" msgid "Connected Glass" msgstr "Forbundet glas" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +#, fuzzy +msgid "Dynamic shadows" +msgstr "Fontskygge" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Fontskygge" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Smukke blade" #: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Generate Normal Maps" -msgstr "Opret normalkort" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua #, fuzzy @@ -893,10 +1160,6 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Aniso-filter" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nej" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Intet filter" @@ -925,18 +1188,10 @@ msgstr "Uuigennemsigtige blade" msgid "Opaque Water" msgstr "Uigennemsigtigt vand" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax-okklusion" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partikler" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Nulstil spillerverden" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Skærm:" @@ -949,6 +1204,11 @@ msgstr "Indstillinger" msgid "Shaders" msgstr "Dybdeskabere" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "Svævelandsniveau" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -965,23 +1225,27 @@ msgstr "Glat belysning" msgid "Texturing:" msgstr "Teksturering:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "For at aktivere dybdeskabere skal OpenGL-driveren bruges." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" 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 msgid "Trilinear Filter" msgstr "Tri-lineær filtréring" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Bølgende blade" @@ -995,23 +1259,12 @@ msgstr "Bølgende blade" msgid "Waving Plants" msgstr "Bølgende planter" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ja" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Konfigurér mods" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Hovedmenu" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Enlig spiller" - #: 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)." @@ -1040,8 +1293,8 @@ msgid "Connection error (timed out?)" msgstr "Forbindelses fejl (udløbelse af tidsfrist?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Kunne ikke finde eller indlæse spil \"" +msgid "Could not find or load game: " +msgstr "Kunne ikke finde eller indlæse spillet: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1072,18 +1325,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "Angivne sti til verdenen findes ikke: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1096,14 +1337,6 @@ msgstr "" msgid "- Address: " msgstr "- Adresse: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Kreativ tilstand: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Skade: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Tilstand: " @@ -1125,6 +1358,16 @@ msgstr "- Spiller mod spiller (PvP): " msgid "- Server Name: " msgstr "- Servernavn: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Der skete en fejl:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Automatic forward disabled" @@ -1135,6 +1378,22 @@ msgstr "Fremadtast" msgid "Automatic forward enabled" msgstr "Fremadtast" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Camera update disabled" @@ -1145,6 +1404,10 @@ msgstr "Tast til ændring af kameraopdatering" msgid "Camera update enabled" msgstr "Tast til ændring af kameraopdatering" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Skift kodeord" @@ -1159,6 +1422,11 @@ msgstr "Tast for filmisk tilstand" msgid "Cinematic mode enabled" msgstr "Tast for filmisk tilstand" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Klient modding" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1167,25 +1435,29 @@ msgstr "" msgid "Connecting to server..." msgstr "Forbinder til server..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Fortsæt" #: src/client/game.cpp -#, c-format +#, fuzzy, c-format msgid "" "Controls:\n" "- %s: move forwards\n" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1204,6 +1476,11 @@ msgstr "" "- Musehjul: vælge genstand\n" "- %s: snakke (chat)\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Opretter klient ..." @@ -1261,6 +1538,11 @@ msgstr "" 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" @@ -1342,32 +1624,8 @@ msgstr "" #: src/client/game.cpp #, fuzzy -msgid "Minimap hidden" -msgstr "Minikorttast" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +msgstr "Enlig spiller" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1444,6 +1702,21 @@ msgstr "" msgid "Sound unmuted" msgstr "Lydniveau" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, fuzzy, c-format msgid "Viewing range changed to %d" @@ -1515,10 +1788,6 @@ msgstr "Tilbage" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Ryd" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1766,22 +2035,32 @@ msgstr "X knap 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Kodeordene er ikke ens!" +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap hidden" +msgstr "Minikorttast" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Kunne ikke hente $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1790,7 +2069,7 @@ msgstr "Fortsæt" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "\"Brug\" = klatre ned" #: src/gui/guiKeyChangeMenu.cpp @@ -1802,16 +2081,24 @@ msgstr "Fremad" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Baglæns" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Change camera" msgstr "Skift bindinger" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Snak" @@ -1866,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" @@ -1899,10 +2184,6 @@ msgstr "Skærmbillede" msgid "Sneak" msgstr "Snige" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Toggle HUD" @@ -1948,10 +2229,6 @@ msgstr "Tryk på en tast" 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" @@ -1960,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" @@ -1970,14 +2251,9 @@ msgid "Muted" msgstr "Lydløs" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Lydstyrke: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr " " +#, fuzzy, c-format +msgid "Sound Volume: %d%%" +msgstr "Lydstyrke: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1986,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" @@ -1994,8 +2280,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -2027,14 +2313,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax-okklusion med kurveinformation (hurtigere).\n" -"1 = relief-oversættelse (langsommere, mere præcis)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2136,6 +2414,10 @@ msgstr "" "- sidebyside: opdel skærm side om side.\n" "- 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" @@ -2157,6 +2439,10 @@ msgstr "Besked, som skal vises til alle klienter, når serveren lukker ned." msgid "ABM interval" msgstr "Interval for kortlagring" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Absolute limit of queued blocks to emerge" @@ -2209,6 +2495,10 @@ msgstr "" "Justér DPI-konfigurationen til din skærm (ikke-X11 / kun Android) f.eks. til " "4k-skærme." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2219,6 +2509,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Verdens navn" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Avanceret" @@ -2233,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 @@ -2303,6 +2599,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Automatic forward key" @@ -2325,6 +2625,16 @@ msgstr "Autogem skærmstørrelse" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Hop-tast" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "Tast brugt til at klatre op/ned" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tilbage-tast" @@ -2339,10 +2649,6 @@ msgstr "Jordoverfladen" 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" @@ -2366,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 @@ -2375,11 +2681,11 @@ msgid "Biome noise" msgstr "Biom støj" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bit per billedpunkt (a.k.a. farvedybde) i fuldskærmtilstand." +msgid "Block send optimize distance" +msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2409,8 +2715,8 @@ msgstr "Indbygget" #: src/settings_translation_file.cpp #, fuzzy -msgid "Bumpmapping" -msgstr "Bumpmapping" +msgid "Camera" +msgstr "Skift bindinger" #: src/settings_translation_file.cpp msgid "" @@ -2490,14 +2796,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +#, fuzzy +msgid "Chat command time message threshold" +msgstr "Ørkenstøjtærskel" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Snakkekommandoer" #: src/settings_translation_file.cpp #, fuzzy @@ -2536,8 +2842,8 @@ msgid "Chat toggle key" msgstr "Tast for snak (chat)" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Snakkekommandoer" +msgid "Chat weblinks" +msgstr "" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2555,6 +2861,12 @@ msgstr "Tast for filmisk tilstand" msgid "Clean transparent textures" msgstr "Rene gennemsigtige teksturer" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Klient" @@ -2577,6 +2889,11 @@ msgstr "Klient modding" 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" @@ -2601,6 +2918,11 @@ msgstr "Skyer i menu" msgid "Colored fog" msgstr "Farvet tåge" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "Farvet tåge" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2635,6 +2957,22 @@ msgstr "" msgid "Command key" msgstr "Kommandotast" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Forbind glas" @@ -2659,10 +2997,18 @@ msgstr "Konsolfarve" 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 "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2694,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 @@ -2725,7 +3073,10 @@ msgid "Crosshair alpha" msgstr "Crosshair alpha" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "Crosshair alpha (uigennemsigtighed, mellem 0 og 255)." #: src/settings_translation_file.cpp @@ -2733,8 +3084,10 @@ msgid "Crosshair color" msgstr "Crosshair-farve" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Crosshair-farve (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" #: src/settings_translation_file.cpp msgid "DPI" @@ -2757,15 +3110,15 @@ msgstr "Ørkenstøjtærskel" 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" @@ -2803,11 +3156,10 @@ msgstr "Standard spil" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Standardtidsudløb for cURL, angivet i millisekunder.\n" -"Har kun effekt hvis kompileret med cURL." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2839,14 +3191,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Definerer sampling-trin for tekstur.\n" -"En højere værdi resulterer i en mere rullende normale kort." - #: src/settings_translation_file.cpp #, fuzzy msgid "Defines the base ground level." @@ -2924,6 +3268,16 @@ msgstr "" msgid "Desynchronize block animation" 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" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Gravepartikler" @@ -2936,6 +3290,16 @@ msgstr "Deaktiver antisnyd" msgid "Disallow empty passwords" msgstr "Tillad ikke tomme adgangskoder" +#: src/settings_translation_file.cpp +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." @@ -2983,12 +3347,26 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Aktivér konsolvindue" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +#, fuzzy +msgid "Enable creative mode for all players" msgstr "Aktivér kreativ tilstand for nyoprettede kort." #: src/settings_translation_file.cpp @@ -2996,6 +3374,10 @@ msgstr "Aktivér kreativ tilstand for nyoprettede kort." 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." @@ -3013,16 +3395,6 @@ msgstr "Aktiver at spillere kan skades og dø." 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" @@ -3031,6 +3403,10 @@ msgstr "" "Aktiver blød lyssætning med simpel ambient okklusion.\n" "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" @@ -3092,18 +3468,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Aktiverer animation af lagerelementer." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Aktiverer bumpmapping for teksturer. Normalmaps skal være angivet af " -"teksturpakken\n" -"eller skal være automatisk oprettet.\n" -"Kræver at dybdeskabere er aktiveret." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Aktiverer mellemlagring af facedir-roterede mesher." @@ -3112,22 +3476,6 @@ msgstr "Aktiverer mellemlagring af facedir-roterede mesher." msgid "Enables minimap." msgstr "Aktiverer minikort." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Aktiverer løbende normalmap-oprettelse (Emboss-effekt).\n" -"Kræver bumpmapping for at være aktiveret." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Aktiverer parallax-okklusionoversættelse.\n" -"Kræver at dybdeskabere er aktiveret." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3136,6 +3484,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Udskrivningsinterval for motorprofileringsdata" @@ -3144,14 +3502,6 @@ msgstr "Udskrivningsinterval for motorprofileringsdata" msgid "Entity methods" msgstr "Entitetmetoder" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Eksperimentelt tilvalg, kan medføre synlige mellemrum mellem blokke\n" -"når angivet til et højere nummer end 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3163,8 +3513,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS i pausemenu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3184,18 +3538,6 @@ msgstr "Fall bobbing faktor" msgid "Fallback font path" msgstr "Reserveskrifttype" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Skygge for reserveskrifttypen" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Skyggealfa for reserveskrifttypen" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Størrelse for reserveskrifttypen" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Hurtigtast" @@ -3215,7 +3557,7 @@ msgstr "Hurtig bevægelse" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "Hurtig bevægelse (via tast).\n" @@ -3257,9 +3599,9 @@ msgstr "Filmisk toneoversættelse" #, fuzzy msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Filtrerede teksturer kan blande RGB-værdier med fuldt gennemsigtige naboer,\n" "som PNG-optimeringsprogrammer normalt fjerner, undertiden resulterende i " @@ -3269,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 @@ -3344,6 +3687,11 @@ msgstr "Tågebegyndelse" 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 "" @@ -3365,15 +3713,15 @@ msgid "Font size" msgstr "Skriftstørrelse" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3382,6 +3730,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3450,11 +3809,6 @@ msgstr "Fraktaltype" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "FreeType fonts" -msgstr "Freetype-skrifttyper" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3483,10 +3837,6 @@ msgstr "" msgid "Full screen" msgstr "Fuld skærm" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Fuldskærm BPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Fuldskærmstilstand." @@ -3504,8 +3854,17 @@ msgid "GUI scaling filter txr2img" msgstr "GUI-skaleringsfilter txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Opret normalkort" +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" @@ -3516,7 +3875,7 @@ msgstr "Globale tilbagekald" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Globale kortoprettelsesattributter.\n" "I Mapgen v6 kontrollerer flaget »decorations« alle dekorationer undtagen " @@ -3542,6 +3901,16 @@ msgstr "" 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" @@ -3562,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" @@ -3573,8 +3947,8 @@ msgstr "Tast for HUD" #, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Håndtering for forældede lua api-kald:\n" @@ -3607,7 +3981,9 @@ msgid "Heat noise" msgstr "Varmestøj" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "Højdekomponent for den oprindelige vinduestørrelse." #: src/settings_translation_file.cpp @@ -3619,10 +3995,6 @@ msgstr "Højdestøj" msgid "Height select noise" msgstr "Højde Vælg støj" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Højpræcisions FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Bakkestejlhed" @@ -3822,13 +4194,21 @@ 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." @@ -3865,8 +4245,7 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" "Hvis deaktiveret bruges »brug«-tasten til at flyve hurtig hvis både flyvning " @@ -3894,13 +4273,19 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" "Hvis aktiveret bruges »brug«-tasten i stedet for »snig«-tasten til at klatre " "ned og aftagende." +#: 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" @@ -3929,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." @@ -3950,6 +4338,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3967,10 +4361,6 @@ msgstr "" 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 "" @@ -4004,7 +4394,8 @@ msgstr "" "Er normalt kun krævet af kerne/indbygningsbidragydere" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Udstyr chatkommandoer ved registrering." #: src/settings_translation_file.cpp @@ -4030,17 +4421,14 @@ msgstr "" 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 @@ -4093,6 +4481,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "Joystick-knaps gentagelsesinterval" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Joystick frustum-sensitivitet" @@ -4196,6 +4588,17 @@ msgstr "" "Se http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast for hop.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4341,6 +4744,17 @@ msgstr "" "Se http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast for hop.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -4916,6 +5330,10 @@ msgstr "" "Se http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4978,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." @@ -4994,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" @@ -5015,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" @@ -5050,6 +5474,11 @@ msgstr "" 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" @@ -5131,11 +5560,6 @@ msgstr "Absolut begrænsning af fremkomstkøer" msgid "Main menu script" msgstr "Hovedmenuskript" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Hovedmenuskript" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5144,12 +5568,15 @@ msgstr "" "sete retning." #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" -"Får DirectX til at fungere med LuaJIT. Deaktiver hvis det giver problemer." #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -5233,6 +5660,11 @@ msgstr "Kortoprettelsesbegrænsning" msgid "Map save interval" msgstr "Interval for kortlagring" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Væskeopdateringsudløsning" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Kortblokbegrænsning" @@ -5353,7 +5785,11 @@ msgid "Maximum FPS" msgstr "Maksimal FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -5401,6 +5837,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -5455,17 +5898,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp 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 "" @@ -5516,12 +5963,25 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5532,6 +5992,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5600,16 +6064,17 @@ msgstr "" 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 "" @@ -5622,6 +6087,11 @@ msgstr "" 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 "" @@ -5634,14 +6104,6 @@ msgstr "" msgid "Noises" msgstr "Lyde" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5663,18 +6125,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5684,11 +6138,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5697,39 +6146,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Optional override for chat weblink color." msgstr "" -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Parallax-okklusion" - #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5752,17 +6174,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5792,16 +6210,22 @@ msgstr "Flyvetast" msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Flyvetast" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "Joystick-knaps gentagelsesinterval" + #: 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 "Spillerens navn" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5810,6 +6234,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Bilineær filtrering" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5844,10 +6273,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5855,9 +6280,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5950,10 +6375,6 @@ msgstr "" msgid "Right key" msgstr "Højretast" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp #, fuzzy msgid "River channel depth" @@ -6029,6 +6450,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Skærm:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Skærmhøjde" @@ -6056,6 +6482,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Skærmbillede" + #: src/settings_translation_file.cpp #, fuzzy msgid "Seabed noise" @@ -6071,10 +6502,6 @@ msgstr "Første af 2 3D-støj, der sammen definerer tunneler." 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 "" @@ -6135,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" @@ -6162,10 +6600,19 @@ msgstr "Serverport" 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 "" @@ -6177,9 +6624,40 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Sat til true (sand) aktiverer bølgende blade.\n" +"Kræver at dybdeskabere er aktiveret." + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6207,6 +6685,13 @@ msgstr "" "Angivet til true (sand) aktiverer bølgende planter.\n" "Kræver at dybdeskabere er aktiveret." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Shader path" @@ -6224,6 +6709,23 @@ msgstr "" "nogle videokort.\n" "De fungerer kun med OpenGL-videomotoren." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "Skærmbilledkvalitet" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6233,12 +6735,8 @@ msgstr "" "Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet." #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" -"Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet." #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6252,6 +6750,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Nedlukningsbesked" @@ -6273,6 +6781,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -6328,20 +6840,15 @@ msgstr "Ganghastighed" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Alfa for skrifttypeskygge" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Lyd" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Snigetast" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key for climbing/descending" -msgstr "Tast brugt til at klatre op/ned" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6357,6 +6864,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6385,10 +6900,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6426,6 +6937,11 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Indstillinger" + #: src/settings_translation_file.cpp #, fuzzy msgid "Terrain alternative noise" @@ -6472,6 +6988,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6486,6 +7009,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6542,18 +7069,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6571,6 +7098,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6579,9 +7112,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6619,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 @@ -6643,6 +7175,19 @@ msgstr "" 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 "" @@ -6714,15 +7259,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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" @@ -6819,7 +7379,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6896,6 +7456,10 @@ msgstr "Bølgende vand" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6917,18 +7481,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6963,14 +7525,24 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "Højdekomponent for den oprindelige vinduestørrelse." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7055,54 +7627,38 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "cURL-tidsudløb" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL-tidsudløb" +#~ msgid "- Creative Mode: " +#~ msgstr "- Kreativ tilstand: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Aktiver filmisk" +#~ msgid "- Damage: " +#~ msgstr "- Skade: " -#~ msgid "Select Package File:" -#~ msgstr "Vælg pakke fil:" - -#, fuzzy -#~ msgid "Shadow limit" -#~ msgstr "Skygge grænse" - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "Dybde for stor hule" - -#~ msgid "IPv6 support." -#~ msgstr "Understøttelse af IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Alfa for skrifttypeskygge (uigennemsigtighed, mellem 0 og 255)." - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Aktiverer filmisk toneoversættelse" - -#~ msgid "Enable VBO" -#~ msgstr "Aktiver VBO" - -#, fuzzy -#~ msgid "Darkness sharpness" -#~ msgstr "Søstejlhed" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Styrer bredden af tunneller. En lavere værdi giver bredere tunneller." +#~ "0 = parallax-okklusion med kurveinformation (hurtigere).\n" +#~ "1 = relief-oversættelse (langsommere, mere præcis)." + +#~ msgid "Address / Port" +#~ msgstr "Adresse/port" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7112,14 +7668,266 @@ msgstr "cURL-tidsudløb" #~ "Justér gammakodningen for lystabellerne. Et større tal betyder lysere.\n" #~ "Denne indstilling gælder kun for klienten og ignoreres af serveren." -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Begrænsning af fremkomsten af forespørgsler på disk" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Henter og installerer $1, vent venligst..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Er du sikker på, at du vil nulstille din enkelt spiller-verden?" #~ 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." + +#, fuzzy +#~ msgid "Bump Mapping" +#~ msgstr "Bump Mapping" + +#, fuzzy +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmapping" + +#~ msgid "Config mods" +#~ msgstr "Konfigurér mods" + +#~ 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." + +#~ msgid "Credits" +#~ msgstr "Skabt af" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Crosshair-farve (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Skade aktiveret" + +#, fuzzy +#~ msgid "Darkness sharpness" +#~ msgstr "Søstejlhed" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Standardtidsudløb for cURL, angivet i millisekunder.\n" +#~ "Har kun effekt hvis kompileret med cURL." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ 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..." + +#~ msgid "Enable VBO" +#~ msgstr "Aktiver VBO" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Aktiverer bumpmapping for teksturer. Normalmaps skal være angivet af " +#~ "teksturpakken\n" +#~ "eller skal være automatisk oprettet.\n" +#~ "Kræver at dybdeskabere er aktiveret." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Aktiverer filmisk toneoversættelse" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Aktiverer løbende normalmap-oprettelse (Emboss-effekt).\n" +#~ "Kræver bumpmapping for at være aktiveret." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ 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." +#~ msgstr "" +#~ "Eksperimentelt tilvalg, kan medføre synlige mellemrum mellem blokke\n" +#~ "når angivet til et højere nummer end 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS i pausemenu" + +#~ msgid "Fallback font shadow" +#~ msgstr "Skygge for reserveskrifttypen" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Skyggealfa for reserveskrifttypen" + +#~ 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)." + +#, fuzzy +#~ msgid "FreeType fonts" +#~ msgstr "Freetype-skrifttyper" + +#~ msgid "Full screen BPP" +#~ msgstr "Fuldskærm BPP" + +#~ msgid "Game" +#~ msgstr "Spil" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#, fuzzy +#~ msgid "Generate Normal Maps" +#~ msgstr "Opret normalkort" + +#~ 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" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Begrænsning af fremkomsten af forespørgsler på disk" + +#~ msgid "Main" +#~ msgstr "Hovedmenu" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Hovedmenuskript" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "Får DirectX til at fungere med LuaJIT. Deaktiver hvis det giver problemer." + +#~ msgid "Menus" +#~ msgstr "Menuer" + +#~ msgid "Name / Password" +#~ msgstr "Navn/adgangskode" + +#~ msgid "Name/Password" +#~ msgstr "Navn/kodeord" + +#~ msgid "No" +#~ msgstr "Nej" + #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax-okklusion" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Parallax-okklusion" + +#~ msgid "Player name" +#~ msgstr "Spillerens navn" + +#~ msgid "PvP enabled" +#~ msgstr "Spiller mod spiller aktiveret" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Nulstil spillerverden" + +#~ msgid "Select Package File:" +#~ msgstr "Vælg pakke fil:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Server/alene" + +#, fuzzy +#~ msgid "Shadow limit" +#~ msgstr "Skygge grænse" + +#, fuzzy +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet." + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "Snigetast" + +#~ msgid "Start Singleplayer" +#~ msgstr "Enlig spiller" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "For at aktivere dybdeskabere skal OpenGL-driveren bruges." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Aktiver filmisk" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Du døde" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/de/minetest.po b/po/de/minetest.po index be63088d2..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: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-15 22:41+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,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.1\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Die ausgehende Chatwarteschlange leeren" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Leerer Befehl." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Zum Hauptmenü verlassen" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Ungültiger Befehl: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Befehl erteilt: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Online spielende Spieler auflisten" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Online-Spieler: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Die ausgehende Chatwarteschlange ist nun leer." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Dieser Befehl ist vom Server deaktiviert." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +58,41 @@ msgstr "Wiederbeleben" msgid "You died" msgstr "Sie sind gestorben" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Verfügbare Befehle:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Verfügbare Befehle: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Befehl nicht verfügbar: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Hilfe für Befehle erhalten" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"„.help <Befehl>“ benutzen, um mehr Informationen zu erhalten, oder „.help " +"all“ benutzen, um alles aufzulisten." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <Befehl>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "OK" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<keine verfügbar>" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "In einem Lua-Skript ist ein Fehler aufgetreten:" @@ -46,9 +113,33 @@ msgstr "Erneut verbinden" msgid "The server has requested a reconnect:" msgstr "Der Server hat um eine Wiederverbindung gebeten:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Lädt …" +#: 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. " @@ -56,17 +147,15 @@ msgstr "Protokollversion stimmt nicht überein. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "Server erfordert Protokollversion $1. " +msgstr "Der Server erfordert Protokollversion $1. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " -msgstr "Server unterstützt Protokollversionen zwischen $1 und $2. " +msgstr "Der Server unterstützt die Protokollversionen von $1 bis $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "" -"Versuchen Sie, die öffentliche Serverliste neu zu laden und prüfen Sie Ihre " -"Internetverbindung." +msgid "Visit website" +msgstr "Webseite besuchen" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +165,26 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Abhängigkeiten:" @@ -111,8 +209,8 @@ msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"Fehler beim Aktivieren der Mod „$1“, da sie unerlaubte Zeichen enthält. Nur " -"die folgenden Zeichen sind erlaubt: [a-z0-9_]." +"Die Mod „$1“ konnte nicht aktiviert werden, da sie unzulässige Zeichen " +"enthält. Nur die folgenden Zeichen sind erlaubt: [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" @@ -132,7 +230,7 @@ msgstr "Keine Spielbeschreibung verfügbar." #: builtin/mainmenu/dlg_config_world.lua msgid "No hard dependencies" -msgstr "Keine harten Abhängigkeiten" +msgstr "Keine notwendigen Abhängigkeiten" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." @@ -153,23 +251,64 @@ msgstr "Speichern" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" -msgstr "Welt:" +msgstr "Weltname:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" msgstr "Aktiviert" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "„$1“ existiert bereits. Wollen Sie es überschreiben?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 und $2 Abhängigkeiten werden installiert." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 von $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 laden herunter,\n" +"$2 warten" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 laden herunter…" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 benötigte Abhängigkeiten konnten nicht gefunden werden." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 wird installiert und $2 Abhängigkeiten werden übersprungen." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Alle Pakete" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Bereits installiert" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Zurück zum Hauptmenü" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Basis-Spiel:" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "ContentDB ist nicht verfügbar, wenn Minetest ohne cURL kompiliert wurde" +msgstr "" +"ContentDB ist nicht verfügbar, wenn Minetest ohne cURL kompiliert wurde" #: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." @@ -180,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" @@ -189,22 +327,48 @@ msgid "Install" msgstr "Installieren" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "$1 installieren" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Fehlende Abhängigkeiten installieren" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Installation: Nicht unterstützter Dateityp oder kaputtes Archiv" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" -msgstr "Es konnten keine Pakete empfangen werden" +msgstr "Es konnten keine Pakete abgerufen werden" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" msgstr "Keine Treffer" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Suchen" +msgid "No updates" +msgstr "Keine Updates" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Nicht gefunden" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Überschreiben" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Bitte prüfen Sie, ob das Basis-Spiel korrekt ist." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Eingereiht" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -216,11 +380,15 @@ msgstr "Deinstallieren" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "Aktualisieren" +msgstr "Update" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Ansehen" +msgid "Update All [$1]" +msgstr "Alle aktualisieren [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Mehr Informationen im Webbrowser anschauen" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -263,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" @@ -286,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" @@ -306,6 +466,14 @@ msgstr "Feuchte Flüsse" 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" @@ -313,7 +481,7 @@ msgstr "Seen" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" msgstr "" -"Niedrige Luftfeuchtigkeit und hohe Hitze erzeugen seichte oder " +"Niedrige Luftfeuchtigkeit und große Wärme erzeugen seichte oder " "ausgetrocknete Flüsse" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp @@ -334,7 +502,7 @@ msgstr "Berge" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "Schlammfließen" +msgstr "Erosion" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" @@ -346,11 +514,11 @@ msgstr "Kein Spiel ausgewählt" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "Reduziert Hitze mit der Höhe" +msgstr "Reduziert die Wärme mit der Höhe" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "Reduziert Luftfeuchte mit der Höhe" +msgstr "Reduziert Luftfeuchtigkeit mit der Höhe" #: builtin/mainmenu/dlg_create_world.lua msgid "Rivers" @@ -358,12 +526,12 @@ msgstr "Flüsse" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "Flüsse am Meeresspiegel" +msgstr "Flüsse auf Meeresspiegelhöhe" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Seed" -msgstr "Seed" +msgstr "Startwert (Seed)" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" @@ -374,13 +542,13 @@ msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" -"Gebäude, die auf dem Gelände auftauchen (keine Wirkung auf von v6 erzeugte " -"Bäume u. Dschungelgras)" +"Strukturen, die auf dem Gelände auftauchen (keine Wirkung auf von v6 " +"erzeugte Bäume u. Dschungelgras)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" msgstr "" -"Gebäude, die auf dem Gelände auftauchen, üblicherweise Bäume und Pflanzen" +"Strukturen, die auf dem Gelände auftauchen, üblicherweise Bäume und Pflanzen" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" @@ -410,10 +578,6 @@ msgstr "Flusstiefe variieren" 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" @@ -424,17 +588,17 @@ msgstr "Es sind keine Spiele installiert." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "Sind Sie sich sicher, dass Sie „$1“ löschen wollen?" +msgstr "Sind Sie sicher, dass „$1“ gelöscht werden soll?" #: builtin/mainmenu/dlg_delete_content.lua #: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua #: src/client/keycode.cpp msgid "Delete" -msgstr "Entfernen" +msgstr "Löschen" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: failed to delete \"$1\"" -msgstr "pkgmgr: Fehler beim Löschen von „$1“" +msgstr "pkgmgr: Fehler beim Entfernen von „$1“" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: invalid path \"$1\"" @@ -442,7 +606,37 @@ msgstr "pkgmgr: Ungültiger Pfad „$1“" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "Welt „$1“ löschen?" +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" @@ -477,12 +671,20 @@ 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" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "Ändern" +msgstr "Bearbeiten" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" @@ -501,7 +703,7 @@ msgid "Offset" msgstr "Versatz" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Persistenz" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -520,6 +722,10 @@ msgstr "Zurücksetzen" msgid "Scale" msgstr "Skalierung" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Suchen" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Verzeichnis auswählen" @@ -528,9 +734,9 @@ 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 "Technische Namen zeigen" +msgstr "Techn. Bezeichnung zeigen" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must be at least $1." @@ -601,50 +807,95 @@ msgstr "Fehler bei der Installation von $1 nach $2" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "Mod installieren: Echter Modname für $1 konnte nicht gefunden werden" +msgstr "Modinstallation: Richtiger Modname für $1 konnte nicht gefunden werden" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -"Mod installieren: Geeigneter Verzeichnisname für Modpack $1 konnte nicht " +"Modinstallation: Geeigneter Verzeichnisname für Modpack $1 konnte nicht " "gefunden werden" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"Installation: Nicht unterstützter Dateityp „$1“ oder fehlerhaftes Archiv" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Installation: Datei: „$1“" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Keine gültige Mod oder Modpack gefunden" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a $1 as a texture pack" -msgstr "Fehler bei der Installation von $1 als Texturenpaket" +msgstr "Fehler bei der Texturenpaket-Installation von $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a game as a $1" -msgstr "Fehler bei der Installation eines Spiels als $1" +msgstr "Fehler bei der Spiel-Installation von $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" -msgstr "Fehler bei der Installation einer Mod als $1" +msgstr "Fehler bei der Mod-Installation von $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a modpack as a $1" -msgstr "Fehler bei der Installation eines Modpacks als $1" +msgstr "Fehler bei der Modpack-Installation von $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Lädt …" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Öffentliche Serverliste ist deaktiviert" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Versuchen Sie die öffentliche Serverliste neu zu laden und prüfen Sie Ihre " +"Internetverbindung." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Über" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktive Mitwirkende" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Aktiver Renderer:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Hauptentwickler" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Benutzerdatenverzeichnis öffnen" + +#: 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 "" +"Öffnet das Verzeichnis, welches die Welten, Spiele, Mods und\n" +"Texturenpakete des Benutzers enthält, im Datei-Manager." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Frühere Mitwirkende" + +#: builtin/mainmenu/tab_about.lua +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 "Online-Inhalte durchsuchen" +msgstr "Onlineinhalte durchsuchen" #: builtin/mainmenu/tab_content.lua msgid "Content" -msgstr "Inhalte" +msgstr "Inhalt" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" @@ -678,43 +929,19 @@ msgstr "Paket deinstallieren" msgid "Use Texture Pack" msgstr "Texturenpaket benutzen" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktive Mitwirkende" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Hauptentwickler" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Mitwirkende" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Frühere Mitwirkende" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Ehemalige Hauptentwickler" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "Server ankündigen" +msgstr "Server veröffentlichen" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" msgstr "Bind-Adresse" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigurieren" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Kreativmodus" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Schaden einschalten" @@ -728,11 +955,7 @@ msgstr "Server hosten" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "Spiele von ContentDB installieren" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Name/Passwort" +msgstr "Spiele aus ContentDB installieren" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -746,10 +969,14 @@ msgstr "Keine Welt angegeben oder ausgewählt!" msgid "Play Game" msgstr "Spiel starten" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Mods auswählen" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Welt wählen:" @@ -763,45 +990,61 @@ msgid "Start Game" msgstr "Spiel starten" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adresse / Port" +msgid "Address" +msgstr "Adresse" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Verbinden" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Clear" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Kreativmodus" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Schaden aktiviert" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Schaden / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Favorit löschen" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favoriten" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favorit" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Inkompatible Server" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Spiel beitreten" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Name / Passwort" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "Login" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Latenz" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Spielerkampf aktiviert" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Öffentliche Server" + +#: builtin/mainmenu/tab_online.lua +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" @@ -827,37 +1070,45 @@ msgstr "Alle Einstellungen" msgid "Antialiasing:" msgstr "Kantenglättung:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Sind Sie sicher, dass Sie die Einzelspielerwelt löschen wollen?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" -msgstr "Monitorgröße automatisch merken" +msgstr "Fenstergröße merken" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bilinearer Filter" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bumpmapping" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" -msgstr "Tasten ändern" +msgstr "Tastenbelegung" #: builtin/mainmenu/tab_settings.lua msgid "Connected Glass" msgstr "Verbundenes Glas" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dynamische Schatten" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "Dynamische Schatten:" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Schöne Blätter" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Normalmaps generieren" +msgid "High" +msgstr "Hoch" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Niedrig" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Mittel" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -867,21 +1118,17 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap u. Aniso. Filter" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nein" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Kein Filter" #: builtin/mainmenu/tab_settings.lua msgid "No Mipmap" -msgstr "Keine Mipmap" +msgstr "Kein Mipmapping" #: builtin/mainmenu/tab_settings.lua msgid "Node Highlighting" -msgstr "Blöcke leuchten" +msgstr "Blöcke aufhellen" #: builtin/mainmenu/tab_settings.lua msgid "Node Outlining" @@ -889,7 +1136,7 @@ msgstr "Blöcke umranden" #: builtin/mainmenu/tab_settings.lua msgid "None" -msgstr "Keines" +msgstr "Keine" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" @@ -899,18 +1146,10 @@ msgstr "Undurchs. Blätter" msgid "Opaque Water" msgstr "Undurchs. Wasser" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax-Occlusion" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partikel" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Einzelspielerwelt zurücksetzen" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Monitor:" @@ -923,6 +1162,10 @@ msgstr "Einstellungen" msgid "Shaders" msgstr "Shader" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shader (experimentell)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Shader (nicht verfügbar)" @@ -939,22 +1182,26 @@ msgstr "Weiches Licht" msgid "Texturing:" msgstr "Texturierung:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Um Shader zu benutzen, muss der OpenGL-Treiber benutzt werden." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" -msgstr "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 "Very High" +msgstr "Sehr hoch" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Sehr niedrig" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Wehende Blätter" @@ -967,25 +1214,13 @@ msgstr "Flüssigkeitswellen" msgid "Waving Plants" msgstr "Wehende Pflanzen" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ja" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Mods konfigurieren" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Hauptmenü" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Einzelspieler starten" - #: 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!" @@ -993,7 +1228,7 @@ msgstr "Fertig!" #: src/client/client.cpp msgid "Initializing nodes" -msgstr "Initialisiere Blöcke" +msgstr "Blöcke initialisieren" #: src/client/client.cpp msgid "Initializing nodes..." @@ -1005,19 +1240,19 @@ msgstr "Lade Texturen …" #: src/client/client.cpp msgid "Rebuilding shaders..." -msgstr "Shader wiederherstellen …" +msgstr "Shader erneuern …" #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" msgstr "Verbindungsfehler (Zeitüberschreitung?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Spiel konnte nicht gefunden oder geladen werden: \"" +msgid "Could not find or load game: " +msgstr "Spiel konnte nicht gefunden oder geladen werden: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." -msgstr "Ungültige Spielspezif." +msgstr "Ungültige Spielspezifikationen" #: src/client/clientlauncher.cpp msgid "Main Menu" @@ -1029,7 +1264,7 @@ msgstr "Keine Welt ausgewählt und keine Adresse angegeben. Nichts zu tun." #: src/client/clientlauncher.cpp msgid "Player name too long." -msgstr "Spielername zu lang." +msgstr "Der Spielername ist zu lang." #: src/client/clientlauncher.cpp msgid "Please choose a name!" @@ -1037,44 +1272,24 @@ msgstr "Bitte wählen Sie einen Namen!" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " -msgstr "Fehler beim öffnen der ausgewählten Passwort-Datei: " +msgstr "Fehler beim Öffnen der angegebenen Passwortdatei: " #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Angegebener Weltpfad existiert nicht: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" "Check debug.txt for details." msgstr "" "\n" -"Siehe debug.txt für Details." +"Für mehr Details siehe debug.txt." #: src/client/game.cpp msgid "- Address: " msgstr "- Adresse: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Kreativmodus: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Schaden: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Modus: " @@ -1096,6 +1311,15 @@ msgstr "- Spielerkampf: " msgid "- Server Name: " msgstr "- Servername: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Ein Serialisierungsfehler ist aufgetreten:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Zugriff verweigert. Grund: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Vorwärtsautomatik deaktiviert" @@ -1104,6 +1328,22 @@ msgstr "Vorwärtsautomatik deaktiviert" msgid "Automatic forward enabled" msgstr "Vorwärtsautomatik aktiviert" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Blockgrenzen verborgen" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Blockgrenzen für alle Blöcke angezeigt" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Blockgrenzen für aktuellen Block angezeigt" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Blockgrenzen für Blöcke in Nähe angezeigt" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Kameraaktualisierung deaktiviert" @@ -1112,6 +1352,11 @@ msgstr "Kameraaktualisierung deaktiviert" msgid "Camera update enabled" msgstr "Kameraaktualisierung aktiviert" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" +"Blockgrenzen können nicht gezeigt werden (von Mod oder Spiel deaktiviert)" + #: src/client/game.cpp msgid "Change Password" msgstr "Passwort ändern" @@ -1124,13 +1369,21 @@ msgstr "Filmmodus deaktiviert" msgid "Cinematic mode enabled" msgstr "Filmmodus aktiviert" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Client getrennt" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Clientseitige Skripte sind deaktiviert" #: src/client/game.cpp msgid "Connecting to server..." -msgstr "Verbinde mit Server …" +msgstr "Mit Server verbinden …" + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Verbindung aus unbekanntem Grund fehlgeschlagen" #: src/client/game.cpp msgid "Continue" @@ -1144,13 +1397,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1160,15 +1413,20 @@ msgstr "" "- %s: Nach links\n" "- %s: Nach rechts\n" "- %s: Springen/klettern\n" +"- %s: Graben/Schlagen\n" +"- %s: Bauen/Benutzen\n" "- %s: Kriechen/runter\n" "- %s: Gegenstand wegwerfen\n" "- %s: Inventar\n" "- Maus: Drehen/Umschauen\n" -"- Maus links: Graben/Schlagen\n" -"- Maus rechts: Bauen/Benutzen\n" "- Mausrad: Gegenstand wählen\n" "- %s: Chat\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Adresse konnte nicht aufgelöst werden: %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "Client erstellen …" @@ -1187,7 +1445,7 @@ msgstr "Debug-Infos angezeigt" #: src/client/game.cpp msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "Debug-Infos, Profiler-Graph und Drahtmodell verborgen" +msgstr "Debug-Infos, Profiler und Drahtgitter deaktiviert" #: src/client/game.cpp msgid "" @@ -1225,6 +1483,11 @@ msgstr "Unbegrenzte Sichtweite deaktiviert" 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ü" @@ -1243,7 +1506,7 @@ msgstr "Schnellmodus aktiviert" #: src/client/game.cpp msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "Schnellmodus aktiviert (Achtung: Kein „fast“-Privileg)" +msgstr "Schnellmodus aktiviert (Hinweis: Kein „fast“-Privileg)" #: src/client/game.cpp msgid "Fly mode disabled" @@ -1255,7 +1518,7 @@ msgstr "Flugmodus aktiviert" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "Flugmodus aktiviert (Achtung: Kein „fly“-Privileg)" +msgstr "Flugmodus aktiviert (Hinweis: Kein „fly“-Privileg)" #: src/client/game.cpp msgid "Fog disabled" @@ -1279,7 +1542,7 @@ msgstr "Gehosteter Server" #: src/client/game.cpp msgid "Item definitions..." -msgstr "Gegenstands-Definitionen …" +msgstr "Gegenstandsdefinitionen …" #: src/client/game.cpp msgid "KiB/s" @@ -1298,32 +1561,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Übersichtskarte momentan von Spiel oder Mod deaktiviert" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Übersichtskarte verborgen" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Übersichtskarte im Radarmodus, Zoom ×1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Übersichtskarte im Radarmodus, Zoom ×2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Übersichtskarte im Radarmodus, Zoom ×4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Übersichtskarte im Bodenmodus, Zoom ×1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Übersichtskarte im Bodenmodus, Zoom ×2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Übersichtskarte im Bodenmodus, Zoom ×4" +msgid "Multiplayer" +msgstr "Mehrspieler" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1335,7 +1574,7 @@ msgstr "Geistmodus aktiviert" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "Geistmodus aktiviert (Achtung: Kein „noclip“-Privileg)" +msgstr "Geistmodus aktiviert (Hinweis: Kein „noclip“-Privileg)" #: src/client/game.cpp msgid "Node definitions..." @@ -1367,7 +1606,7 @@ msgstr "Entfernter Server" #: src/client/game.cpp msgid "Resolving address..." -msgstr "Löse Adresse auf …" +msgstr "Adressauflösung …" #: src/client/game.cpp msgid "Shutting down..." @@ -1383,7 +1622,7 @@ msgstr "Tonlautstärke" #: src/client/game.cpp msgid "Sound muted" -msgstr "Ton verstummt" +msgstr "Ton stummgeschaltet" #: src/client/game.cpp msgid "Sound system is disabled" @@ -1395,7 +1634,23 @@ msgstr "Tonsystem ist in diesem Build nicht unterstützt" #: src/client/game.cpp msgid "Sound unmuted" -msgstr "Ton nicht mehr verstummt" +msgstr "Ton nicht mehr stumm" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Auf dem Server läuft möglicherweise eine andere Version von %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" +"Verbindung konnte nicht zu %s aufgebaut werden, weil IPv6 deaktiviert ist" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Konnte nicht auf %s lauschen, weil IPv6 deaktiviert ist" #: src/client/game.cpp #, c-format @@ -1419,7 +1674,7 @@ msgstr "Lautstärke auf %d%% gesetzt" #: src/client/game.cpp msgid "Wireframe shown" -msgstr "Drahtmodell angezeigt" +msgstr "Drahtmodell aktiv" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" @@ -1466,10 +1721,6 @@ msgstr "Rücktaste" msgid "Caps Lock" msgstr "Feststellt." -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Clear" - #: src/client/keycode.cpp msgid "Control" msgstr "Strg" @@ -1717,38 +1968,39 @@ msgstr "X-Knopf 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Passwörter stimmen nicht überein!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Übersichtskarte verborgen" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registrieren und beitreten" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Übersichtskarte im Radarmodus, Zoom ×%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Übersichtskarte im Bodenmodus, Zoom ×%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Übersichtskarte im Texturmodus" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Fehler beim Öffnen der Webseite" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Öffne Webseite" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Fortsetzen" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "„Spezial“ = runter" +msgid "\"Aux1\" = climb down" +msgstr "„Aux1“ = runter" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1758,15 +2010,23 @@ msgstr "Autovorwärts" msgid "Automatic jumping" msgstr "Auto-Springen" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Rückwärts" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Blockgrenzen" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Kamerawechsel" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Chat" @@ -1819,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" @@ -1852,10 +2110,6 @@ msgstr "Bildschirmfoto" msgid "Sneak" msgstr "Schleichen" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Spezial" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "HUD an/aus" @@ -1896,10 +2150,6 @@ msgstr "Taste drücken" 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" @@ -1908,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" @@ -1917,14 +2171,9 @@ msgid "Muted" msgstr "Stumm" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Tonlautstärke: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Eingabe " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Tonlautstärke: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1933,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" @@ -1944,13 +2204,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Den virtuellen Joystick benutzen, um die „Aux“-Taste zu " +"(Android) Den virtuellen Joystick benutzen, um die „Aux1“-Taste zu " "betätigen.\n" -"Falls aktiviert, wird der virtuelle Joystick außerdem die „Aux“-Taste " +"Falls aktiviert, wird der virtuelle Joystick außerdem die „Aux1“-Taste " "drücken, wenn er sich außerhalb des Hauptkreises befindet." #: src/settings_translation_file.cpp @@ -1995,14 +2255,6 @@ msgstr "" "welche geeignet für eine Insel ist; setzen Sie alle 3 Zahlen\n" "gleich für die Reinform." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = Parallax-Mapping mit Stufeninformation (schneller).\n" -"1 = Relief-Mapping (langsamer, genauer)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "2-D-Rauschen, welches die Form/Größe von gezahnten Bergen steuert." @@ -2043,7 +2295,7 @@ msgstr "3-Dimensionaler-Modus" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" -msgstr "3D-Modus-Parallaxstärke" +msgstr "3-D-Modus-Parallaxstärke" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2065,7 +2317,7 @@ msgid "" "to be adjusted, as floatland tapering functions best when this noise has\n" "a value range of approximately -2.0 to 2.0." msgstr "" -"3D-Rauschen, das die Form von Schwebeländern definiert.\n" +"3-D-Rauschen, das die Form von Schwebeländern definiert.\n" "Falls vom Standardwert verschieden, müsste der Rauschwert „Skalierung“\n" "(standardmäßig 0.7) evtl. angepasst werden, da die Schwebeland-\n" "zuspitzung am Besten funktioniert, wenn dieses Rauschen\n" @@ -2116,6 +2368,10 @@ msgstr "" "Beachten Sie, dass der „interlaced“-Modus erfordert, dass Shader aktiviert " "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" @@ -2142,6 +2398,10 @@ msgstr "" msgid "ABM interval" msgstr "ABM-Intervall" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "ABM-Zeitbudget" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "Absolute Grenze der zu erzeugenden Kartenblöcke in Warteschlange" @@ -2190,6 +2450,12 @@ msgid "" "screens." msgstr "DPI des Bildschirms (nicht für X11/Android) z.B. für 4K-Bildschirme." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Die erfasste Anzeigendichte anpassen, benutzt für die Skalierung von UI-" +"Elementen." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2206,6 +2472,10 @@ msgstr "" "immer testen, um sicher zu sein) erzeugt eine durchgehende\n" "Schwebelandebene." +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "Admin-Name" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Erweitert" @@ -2227,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 @@ -2308,6 +2578,10 @@ msgstr "" "wird diese Optimierung deaktiviert.\n" "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" @@ -2328,6 +2602,14 @@ msgstr "Monitorgröße merken" msgid "Autoscaling mode" msgstr "Autoskalierungsmodus" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1-Taste" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Aux1-Taste zum Klettern/Sinken" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Rückwärtstaste" @@ -2340,10 +2622,6 @@ msgstr "Basisbodenhöhe" 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" @@ -2365,21 +2643,21 @@ 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" msgstr "Biomrauschen" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bits pro Pixel (Farbtiefe) im Vollbildmodus." - #: src/settings_translation_file.cpp 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" @@ -2405,8 +2683,8 @@ msgid "Builtin" msgstr "Builtin" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bumpmapping" +msgid "Camera" +msgstr "Kamera" #: src/settings_translation_file.cpp msgid "" @@ -2487,20 +2765,12 @@ msgstr "" "Wobei 0.0 die minimale Lichtstufe und 1.0 die höchste Lichtstufe ist." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Ändert die Hauptmenü-UI:\n" -"- Full: Mehrere Einzelspielerwelten, Spiel- und Texturenpaketauswahl, " -"usw.\n" -"- Simple: Eine Einzelspielerwelt, keine Spiel- oder Texturenpaketauswahl. " -"Könnte\n" -"für kleinere Bildschirme nötig sein." +msgid "Chat command time message threshold" +msgstr "Chatbefehlzeitnachrichtenschwellwert" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Chatbefehle" #: src/settings_translation_file.cpp msgid "Chat font size" @@ -2535,8 +2805,8 @@ msgid "Chat toggle key" msgstr "Taste zum Umschalten des Chatprotokolls" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Chatbefehle" +msgid "Chat weblinks" +msgstr "Chatweblinks" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2554,6 +2824,14 @@ msgstr "Filmmodustaste" msgid "Clean transparent textures" msgstr "Transparente Texturen säubern" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Anklickbare Weblinks (Mittelklick oder Strg+Linksklick) werden in der " +"Chatkonsolenausgabe aktiviert." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Client" @@ -2574,6 +2852,10 @@ msgstr "Client-Modding-Einschränkungen" 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" @@ -2598,6 +2880,10 @@ msgstr "Wolken im Menü" msgid "Colored fog" msgstr "Gefärbter Nebel" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Gefärbte Schatten" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2641,6 +2927,31 @@ msgstr "" msgid "Command key" msgstr "Befehlstaste" +#: src/settings_translation_file.cpp +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 "" +"Zu verwendendes Kompressionsniveau, wenn Kartenblöcke auf den Datenträger " +"gespeichert werden.\n" +"-1 - Standard-Kompressionsniveau benutzen\n" +"0 - geringste Kompression, am schnellsten\n" +"9 - beste Kompression, am langsamsten" + +#: src/settings_translation_file.cpp +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 "" +"Kompressionsniveau für Kartenblöcke, die zu Clients gesendet werden.\n" +"-1 - Standard-Kompressionsniveau benutzen\n" +"0 - keine Kompression, am schnellsten\n" +"9 - beste Kompression, am langsamsten" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Verbundenes Glas" @@ -2665,10 +2976,18 @@ msgstr "Konsolenfarbe" 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" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB Max. gleichzeitige Downloads" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "ContentDB-URL" @@ -2702,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." @@ -2736,16 +3060,24 @@ msgid "Crosshair alpha" msgstr "Fadenkreuzundurchsichtigkeit" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Fadenkreuzundurchsichtigkeit (Wert zwischen 0 und 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Fadenkreuz-Alpha (Undurchsichtigkeit, zwischen 0 und 255).\n" +"Gilt auch für das Objektfadenkreuz." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Fadenkreuzfarbe" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Fadenkreuzfarbe (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Fadenkreuzfarbe (R,G,B).\n" +"Gilt auch für das Objektfadenkreuz" #: src/settings_translation_file.cpp msgid "DPI" @@ -2768,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" @@ -2815,11 +3146,14 @@ msgstr "Standardstapelgröße" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Standardzeitlimit für cURL, in Millisekunden.\n" -"Hat nur eine Wirkung, wenn mit cURL kompiliert wurde." +"Definiert die Schattenfilterqualität.\n" +"Dies simuliert den weichen Schatteneffekt, indem eine PCF- oder Poisson-" +"Scheibe angewendet wird,\n" +"aber dies verbraucht auch mehr Ressourcen." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2852,14 +3186,6 @@ msgstr "Definiert große Flusskanalformationen." msgid "Defines location and terrain of optional hills and lakes." msgstr "Definiert Ort und Gelände der optionalen Hügel und Seen." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Definiert die Sampling-Schrittgröße der Textur.\n" -"Ein höherer Wert resultiert in weichere Normal-Maps." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Definiert die Basisgeländehöhe." @@ -2940,6 +3266,14 @@ msgstr "" 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" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Grabepartikel" @@ -2952,6 +3286,20 @@ msgstr "Anti-Cheat deaktivieren" msgid "Disallow empty passwords" msgstr "Leere Passwörter verbieten" +#: src/settings_translation_file.cpp +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." @@ -3000,18 +3348,41 @@ msgstr "" "Lua-Modding-Unterstützung auf dem Client aktivieren.\n" "Diese Unterstützung ist experimentell und die API kann sich ändern." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Aktiviert eine Poisson-Scheibenfilterung.\n" +"Falls aktiv, werden Poisson-Scheiben verwendet, um „weiche Schatten“ zu " +"erzeugen. Ansonsten wird die PCF-Filterung benutzt." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Aktiviert gefärbte Schatten. \n" +"Falls aktiv, werden transluzente Blöcke gefärbte Schatten werfen. Dies ist " +"rechenintensiv." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Konsolenfenster aktivieren" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Kreativmodus für neu erstellte Karten aktivieren." +msgid "Enable creative mode for all players" +msgstr "Kreativmodus für alle Spieler aktivieren" #: src/settings_translation_file.cpp 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." @@ -3028,19 +3399,6 @@ msgstr "Spielerschaden und -tod aktivieren." 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" @@ -3049,6 +3407,10 @@ msgstr "" "Weiches Licht mit einfacher Ambient-Occlusion aktivieren.\n" "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" @@ -3091,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." @@ -3113,7 +3474,7 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" -"Aktiviert filmisches Tone-Mapping wie in Hables „Uncharted 2“.\n" +"Aktiviert filmische Dynamikkompression wie in Hables „Uncharted 2“.\n" "Simuliert die Tonkurve von fotografischem Film und wie dies das Aussehen\n" "von „High Dynamic Range“-Bildern annähert. Mittlerer Kontrast wird leicht\n" "verstärkt, aufleuchtende Bereiche und Schatten werden graduell komprimiert." @@ -3122,19 +3483,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Aktiviert die Animation von Inventargegenständen." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Aktiviert das Bump-Mapping für Texturen. Normal-Maps müssen im " -"Texturenpaket\n" -"vorhanden sein oder müssen automatisch erzeugt werden.\n" -"Shader müssen aktiviert werden, bevor diese Einstellung aktiviert werden " -"kann." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -3145,22 +3493,6 @@ msgstr "" msgid "Enables minimap." msgstr "Aktiviert die Übersichtskarte." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Aktiviert die spontane Normalmap-Erzeugung (Prägungseffekt).\n" -"Für diese Einstellung muss außerdem Bump-Mapping aktiviert sein." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Aktiviert Parralax-Occlusion-Mapping.\n" -"Hierfür müssen Shader aktiviert sein." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3173,6 +3505,20 @@ msgstr "" "die Tonsteuerung im Spiel wird funktionslos sein.\n" "Die Änderung dieser Einstellung benötigt einen Neustart." +#: 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 "" +"Aktiviert Kompromisse, die die CPU-Last verringern oder die Rendering-" +"Leistung erhöhen\n" +"auf Kosten kleinerer visueller Fehler, die die Spielbarkeit nicht " +"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" @@ -3181,14 +3527,6 @@ msgstr "Engine-Profiling-Datenausgabeintervall" msgid "Entity methods" msgstr "Entity-Methoden" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Experimentelle Einstellung, könnte sichtbare Leerräume zwischen\n" -"Blöcken verursachen, wenn auf einen Wert größer 0 gesetzt." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3207,8 +3545,14 @@ msgstr "" "geeignet." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "Bildwiederholrate im Pausenmenü" +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 " +"ist" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3220,24 +3564,12 @@ 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" msgstr "Ersatzschriftpfad" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Ersatzschriftschatten" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Undurchsichtigkeit des Ersatzschriftschattens" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Ersatzschriftgröße" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Schnelltaste" @@ -3256,10 +3588,10 @@ msgstr "Schnell bewegen" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Schnelle Bewegung (mit der „Spezial“-Taste).\n" +"Schnelle Bewegung (mit der „Aux1“-Taste).\n" "Dazu wird das „fast“-Privileg auf dem Server benötigt." #: src/settings_translation_file.cpp @@ -3289,24 +3621,25 @@ msgstr "Fülltiefenrauschen" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" -msgstr "Filmisches Tone-Mapping" +msgstr "Filmische Dynamikkompression" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" -"Gefilterte Texturen können RGB-Werte mit 100% transparenten Nachbarn,\n" +"Gefilterte Texturen können RGB-Werte mit voll transparenten Nachbarn,\n" "die PNG-Optimierer üblicherweise verwerfen, mischen. Manchmal\n" "resultiert dies in einer dunklen oder hellen Kante bei transparenten\n" -"Texturen. Aktivieren Sie diesen Filter, um dies beim Laden der\n" -"Texturen aufzuräumen." +"Texturen. Aktivieren Sie einen Filter, um dies beim Laden der\n" +"Texturen aufzuräumen. Dies wird automatisch aktiviert, falls Mipmapping " +"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." @@ -3374,6 +3707,10 @@ msgstr "Nebelbeginn" 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" @@ -3395,16 +3732,17 @@ msgid "Font size" msgstr "Schriftgröße" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "Schriftgröße der Standardschrift in Punkt (pt)." +msgid "Font size divisible by" +msgstr "Schriftgröße teilbar durch" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Schriftgröße der Ersatzschrift in Punkt (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Schriftgröße der Standardschrift, wobei 1 Einheit = 1 Pixel bei 96 DPI" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "Schriftgröße der Festbreitenschrift in Punkt (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" +"Schriftgröße der Festbreitenschrift, wobei 1 Einheit = 1 Pixel bei 96 DPI" #: src/settings_translation_file.cpp msgid "" @@ -3415,6 +3753,26 @@ msgstr "" "der Chateingabe in Punkt (pt).\n" "Der Wert 0 wird die Standardschriftgröße benutzen." +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"Bei Schriften im Pixelstil, die sich nicht gut skalieren lassen, stellt dies " +"sicher,\n" +"dass die mit dieser Schrift verwendeten Schriftgrößen immer durch diesen " +"Wert\n" +"in Pixeln teilbar ist. Zum Beispiel: Eine Pixelschrift mit einer Höhe von 16 " +"Pixeln\n" +"sollte auf 16 gesetzt werden, so dass sie immer nur die Größe 16, 32, 48 " +"usw. hat,\n" +"damit eine Mod, die eine Größe von 25 anfordert, 32 erhält." + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3485,10 +3843,6 @@ msgstr "" "Anteil der sichtbaren Entfernung, in welcher begonnen wird, den Nebel zu " "rendern" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "FreeType-Schriften" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3526,10 +3880,6 @@ msgstr "" msgid "Full screen" msgstr "Vollbild" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Vollbildfarbtiefe" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Vollbildmodus." @@ -3547,8 +3897,16 @@ msgid "GUI scaling filter txr2img" msgstr "GUI-Skalierungsfilter txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Normalmaps generieren" +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" @@ -3558,7 +3916,7 @@ msgstr "Globale Rückruffunktionen" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Globale Kartengenerierungsattribute.\n" "Im Kartengenerator v6 wird das „decorations“-Flag alle Dekorationen außer\n" @@ -3585,6 +3943,14 @@ msgstr "" 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" @@ -3602,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" @@ -3612,17 +3982,17 @@ msgstr "Taste zum Umschalten des HUD" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Handhabung für veraltete Lua-API-Aufrufe:\n" -"- legacy: Versuchen, altes Verhalten zu imitieren (Standard für Release).\n" -"- log: Imitieren, und den Backtrace des veralteten Funktionsaufrufs " +"- none: Veraltete Aufrufe nicht protokollieren.\n" +"- log: Imitieren und den Backtrace des veralteten Funktionsaufrufs " "protokollieren\n" -" (Standard für Debug).\n" +" (Standard).\n" "- error: Bei Verwendung eines veralteten Funktionsaufrufs abbrechen\n" -" (empfohlen für Mod- Entwickler)." +" (empfohlen für Mod-Entwickler)." #: src/settings_translation_file.cpp msgid "" @@ -3648,8 +4018,10 @@ msgid "Heat noise" msgstr "Hitzenrauschen" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Höhenkomponente der anfänglichen Fenstergröße." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Höhenkomponente der anfänglichen Fenstergröße. Im Vollbildmodus ignoriert." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3659,10 +4031,6 @@ msgstr "Höhenrauschen" msgid "Height select noise" msgstr "Höhenauswahlrauschen" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Hochpräzisions-FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Hügelsteilheilt" @@ -3867,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." @@ -3909,11 +4287,10 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Falls deaktiviert, wird die „Spezial“-Taste benutzt, um schnell zu fliegen,\n" +"Falls deaktiviert, wird die „Aux1“-Taste benutzt, um schnell zu fliegen,\n" "wenn sowohl Flug- als auch Schnellmodus aktiviert sind." #: src/settings_translation_file.cpp @@ -3943,13 +4320,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Falls aktiviert, wird die „Spezial“-Taste statt der „Schleichen“-Taste zum\n" +"Falls aktiviert, wird die „Aux1“-Taste statt der „Schleichen“-Taste zum\n" "Herunterklettern und Sinken benutzt." +#: 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" @@ -3982,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 "" @@ -4007,6 +4395,15 @@ msgstr "" "Falls die CSM-Einschränkung für Blockreichweite aktiviert ist, werden\n" "get_node-Aufrufe auf diese Distanz vom Spieler zum Block begrenzt sein." +#: 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 "" +"Falls die Ausführung eines Chatbefehls länger als diese angegebene Zeit in\n" +"Sekunden braucht, wird die Zeitinformation an die Chatbefehlsnachricht " +"angehängt" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -4030,10 +4427,6 @@ msgstr "" 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 "" @@ -4068,7 +4461,7 @@ msgstr "" "Dies wird normalerweise nur von Haupt-/builtin-Entwicklern benötigt" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "Chatbefehle bei ihrer Registrierung instrumentieren." #: src/settings_translation_file.cpp @@ -4097,18 +4490,16 @@ msgstr "" 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" @@ -4163,6 +4554,10 @@ msgstr "Joystick-ID" msgid "Joystick button repetition interval" msgstr "Joystick-Button-Wiederholungsrate" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Joystick-Totbereich" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Joystick-Pyramidenstumpf-Empfindlichkeit" @@ -4265,6 +4660,16 @@ msgstr "" "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste zum Graben.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4407,6 +4812,16 @@ msgstr "" "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Taste zum Bauen.\n" +"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4942,6 +5357,10 @@ msgstr "" "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -5005,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 "" @@ -5020,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 "" @@ -5040,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" @@ -5076,6 +5501,10 @@ msgstr "Lichtkurve: Hoher Gradient" 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" @@ -5160,10 +5589,6 @@ msgstr "Y-Untergrenze von Schwebeländern." msgid "Main menu script" msgstr "Hauptmenü-Skript" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Hauptmenü-Stil" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5171,16 +5596,18 @@ msgstr "" "Nebel- und Himmelsfarben von der Tageszeit (Sonnenaufgang/Sonnenuntergang) " "und Blickrichtung abhängig machen." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"DirectX mit LuaJIT zusammenarbeiten lassen. Deaktivieren Sie dies, falls es " -"Probleme verursacht." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Macht alle Flüssigkeiten undurchsichtig" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Kartenkompressionsstufe für Festspeicher" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Kartenkompressionsstufe für Netzwerkverkehr" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Kartenverzeichnis" @@ -5261,6 +5688,10 @@ msgstr "Kartenerzeugungsgrenze" msgid "Map save interval" msgstr "Speicherintervall der Karte" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Kartenschatten-Aktualisierungsframes" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Kartenblock-Grenze" @@ -5366,8 +5797,14 @@ msgid "Maximum FPS" msgstr "Maximale Bildwiederholrate" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Maximale Bildwiederholrate, während das Spiel pausiert ist." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"Maximale Bildwiederholrate, während das Fenster nicht fokussiert oder das " +"Spiel pausiert ist." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Maximale Distanz zum Rendern von Schatten." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5425,6 +5862,16 @@ msgstr "" "einer Datei eingereiht werden.\n" "Diese Grenze wird für jeden Spieler einzeln erzwungen." +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Maximale Anzahl an gleichzeitigen Downloads. Weitere werden in einer " +"Warteschlange eingereiht.\n" +"Dies sollte niedriger als das curl_parallel_limit sein." + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "Maximale Anzahl der zwangsgeladenen Kartenblöcke." @@ -5495,19 +5942,25 @@ msgstr "" "zu begrenzen." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Maximale Zeit in ms, die das Herunterladen einer Datei (z.B. einer Mod) " -"dauern darf." +"Maximale Zeit in Millisekunden, die das Herunterladen einer Datei (z.B. " +"einer Mod) dauern darf." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Maximale Zeit in Millisekunden, die eine interaktive Anfrage (z.B. " +"Serverlistenanfrage) brauchen darf." #: src/settings_translation_file.cpp 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" @@ -5559,13 +6012,25 @@ msgstr "Minimale Texturengröße" 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" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "Modifiziert die Größe der HUD-Leistenelemente." +msgid "Modifies the size of the HUD elements." +msgstr "Modifiziert die Größe der HUD-Elemente." #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5575,6 +6040,10 @@ msgstr "Pfad der Festbreitenschrift" msgid "Monospace font size" msgstr "Größe der Festbreitenschrift" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Festbreitenschriftgröße teilbar durch" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Berghöhenrauschen" @@ -5608,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" @@ -5654,10 +6123,6 @@ msgstr "" 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" @@ -5666,6 +6131,10 @@ msgstr "" "Netzwerkport (UDP), auf dem gelauscht werden soll.\n" "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." @@ -5678,6 +6147,10 @@ msgstr "Geistmodus" 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" @@ -5690,14 +6163,6 @@ msgstr "NodeTimer-Intervall" msgid "Noises" msgstr "Rauschen" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Normalmaps-Sampling" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Normalmap-Stärke" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Anzahl der Erzeugerthreads" @@ -5731,21 +6196,13 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Anzahl der zusätzlichen Kartenblöcke, welche mit /clearobjects gleichzeitig\n" "geladen werden können. Dies ist ein Kompromiss zwischen SQLite-\n" "Transaktions-Overhead und Speicherverbrauch (Faustregel: 4096=100MB)." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Anzahl der Parallax-Occlusion-Iterationen." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Online-Inhaltespeicher" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "Undurchsichtige Flüssigkeiten" @@ -5757,13 +6214,6 @@ msgstr "" "Undurchsichtigkeit (Alpha) des Schattens hinter der Standardschrift, " "zwischen 0 und 255." -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" -"Undurchsichtigkeit (Alpha) des Schattens hinter der Ersatzschrift, zwischen " -"0 und 255." - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5774,48 +6224,16 @@ msgstr "" "Wird nicht pausieren, wenn ein Formspec geöffnet ist." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" -"Startwert des Parallax-Occlusion-Effektes, üblicherweise Skalierung geteilt " -"durch 2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Gesamtskalierung des Parallax-Occlusion-Effektes." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Parallax-Occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Parallax-Occlusion-Startwert" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Parallax-Occlusion-Iterationen" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Parallax-Occlusion-Modus" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Parallax-Occlusion-Skalierung" +msgid "Optional override for chat weblink color." +msgstr "Optionaler manueller Wert für die Farbe von Chat-Weblinks." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" -"Pfad der Ersatzschrift.\n" -"Falls die „freetype“-Einstellung aktiviert ist: Muss eine TrueType-Schrift " -"sein.\n" -"Falls die „freetype“-Einstellung deaktiviert ist: Muss eine Bitmap- oder XML-" -"Vektor-Schrift sein.\n" +"Pfad der Ersatzschrift. Muss eine TrueType-Schrift sein.\n" "Diese Schrift wird für bestimmte Sprachen benutzt, oder, wenn die " "Standardschrift nicht verfügbar ist." @@ -5843,31 +6261,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" -"Pfad der Standardschrift.\n" -"Falls die „freetype“-Einstellung aktiviert ist: Muss eine TrueType-Schrift " -"sein.\n" -"Falls die „freetype“-Einstellung deaktiviert ist: Muss eine Bitmap- oder XML-" -"Vektor-Schrift sein.\n" +"Pfad der Standardschrift. Muss eine TrueType-Schrift sein.\n" "Die Ersatzschrift wird benutzt, falls diese Schrift nicht geladen werden " "kann." #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" -"Pfad der Festbreitenschrift.\n" -"Falls die „freetype“-Einstellung aktiviert ist: Muss eine TrueType-Schrift " -"sein.\n" -"Falls die „freetype“-Einstellung deaktiviert ist: Muss eine Bitmap- oder XML-" -"Vektor-Schrift sein.\n" +"Pfad der Festbreitenschrift. Muss eine TrueType-Schrift sein.\n" "Diese Schrift wird z.B. für die Konsole und die Profiler-Anzeige benutzt." #: src/settings_translation_file.cpp @@ -5894,6 +6300,14 @@ msgstr "Nick-Bewegungstaste" msgid "Pitch move mode" msgstr "Nick-Bewegungsmodus" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Bautaste" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Bauen-Wiederholungsrate" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5902,10 +6316,6 @@ msgstr "" "Der Spieler kann unabhängig von der Schwerkraft fliegen.\n" "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" @@ -5914,6 +6324,10 @@ msgstr "Spieler-Übertragungsdistanz" msgid "Player versus player" msgstr "Spielerkampf" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Poissonfilter" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5958,10 +6372,6 @@ msgstr "Profiler" 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" @@ -5969,9 +6379,9 @@ msgstr "Prometheus-Lauschadresse" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" "Prometheus-Lauschadresse.\n" "Falls Minetest mit der ENABLE_PROMETEUS-Option kompiliert wurde,\n" @@ -6081,10 +6491,6 @@ msgstr "Rauschen für Größe gezahnter Berge" msgid "Right key" msgstr "Rechtstaste" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Rechtsklick-Wiederholungsrate" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Flusskanaltiefe" @@ -6127,7 +6533,7 @@ msgstr "Runde Übersichtskarte" #: src/settings_translation_file.cpp msgid "Safe digging and placing" -msgstr "Sicheres graben und bauen" +msgstr "Sicheres Graben und Bauen" #: src/settings_translation_file.cpp msgid "Sandy beaches occur when np_beach exceeds this value." @@ -6160,6 +6566,10 @@ msgstr "" "Kantenpixel verschwommen werden, wenn sie mit nicht-\n" "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" @@ -6190,6 +6600,10 @@ msgstr "" "1 steht für die schlechteste Qualität, 100 für die beste Qualität.\n" "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" @@ -6204,10 +6618,6 @@ msgstr "" 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" @@ -6267,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" @@ -6294,10 +6712,18 @@ msgstr "Serverport" 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" @@ -6311,10 +6737,51 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" +"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." + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"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: 15.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Setzt die Neigung vom Sonnen-/Mondorbit in Grad.\n" +"0 = keine Neigung / vertikaler Orbit.\n" +"Minimalwert: 0.0; Maximalwert: 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Auf „wahr“ setzen, um Shadow-Mapping zu aktivieren.\n" +"Dafür müssen Shader aktiviert sein." #: src/settings_translation_file.cpp msgid "" @@ -6340,6 +6807,16 @@ msgstr "" "Auf „wahr“ setzen, um wehende Pflanzen zu aktivieren.\n" "Dafür müssen Shader aktiviert sein." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Setzt die Schattentexturqualität auf 32 Bits.\n" +"Falls aktiviert, werden 16-Bit-Texturen benutzt.\n" +"Dies kann zu viel mehr Artefakten im Schatten führen." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Shader-Pfad" @@ -6356,6 +6833,22 @@ msgstr "" "einigen Grafikkarten erhöhen.\n" "Das funktioniert nur mit dem OpenGL-Grafik-Backend." +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "Schattenfilterqualität" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Maximale Schattenrenderdistanz von Schattenkarten in Blöcken" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "Schattenkartentextur in 32 Bits" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Schattenkartentexturengröße" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6365,12 +6858,8 @@ msgstr "" "der Schatten nicht gezeichnet." #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"Versatz des Schattens hinter der Ersatzschrift (in Pixeln). Falls 0, wird " -"der Schatten nicht gezeichnet." +msgid "Shadow strength gamma" +msgstr "Schattenstärkengammawert" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6384,6 +6873,18 @@ msgstr "Debug-Info zeigen" msgid "Show entity selection boxes" msgstr "Entity-Auswahlboxen zeigen" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Entityauswahlboxen zeigen\n" +"Nach Änderung ist ein Neustart erforderlich." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Standardmäßig Hintergründe für Namensschilder anzeigen" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Herunterfahrnachricht" @@ -6417,6 +6918,10 @@ msgstr "" "die vom Hauptthread kopiert werden, reduziert und somit das Stottern " "reduziert." +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Himmelskörperorbitneigung" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "w-Ausschnitt" @@ -6475,18 +6980,14 @@ msgstr "Schleichgeschwindigkeit" msgid "Sneaking speed, in nodes per second." msgstr "Schleichgeschwindigkeit, in Blöcken pro Sekunde." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Weicher-Schatten-Radius" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Ton" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Spezialtaste" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Spezialtaste zum Klettern/Sinken" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6512,6 +7013,19 @@ msgstr "" "bestimmte\n" "(oder alle) Gegenstände setzen kann." +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Eine vollständige Aktualisierung der Schattenkarte über der angegebenen\n" +"Anzahl Frames ausbreiten. Höhere Werte können dazu führen, dass\n" +"Schatten langsamer reagieren,\n" +"niedrigere Werte sind rechenintensiver.\n" +"Minimalwert: 1; Maximalwert: 16" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6540,11 +7054,7 @@ msgstr "Stufenbergsausbreitungsrauschen" #: src/settings_translation_file.cpp msgid "Strength of 3D mode parallax." -msgstr "Stärke von 3D-Modus-Parallax." - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Stärke der generierten Normalmaps." +msgstr "Stärke von 3-D-Modus-Parallax." #: src/settings_translation_file.cpp msgid "" @@ -6598,6 +7108,10 @@ msgstr "Synchrones SQLite" 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" @@ -6646,6 +7160,16 @@ msgstr "Geländepersistenzrauschen" msgid "Texture path" msgstr "Texturenpfad" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Texturengröße zum Rendern der Schattenkarte.\n" +"Dies muss eine Zweierpotenz sein.\n" +"Größere Werte erzeugen bessere Schatten, aber dies ist auch rechenintensiver." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6669,6 +7193,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "Die URL für den Inhaltespeicher" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "Der Totbereich des Joysticks" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6744,26 +7272,26 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Das Renderer-Backend für Irrlicht.\n" +"Das Renderer-Backend.\n" "Ein Neustart ist erforderlich, wenn dies geändert wird.\n" "Anmerkung: Auf Android belassen Sie dies bei OGLES1, wenn Sie sich unsicher " "sind.\n" -"Die App könnte sonst unfähig sein, zu starten.\n" -"Auf anderen Plattformen wird OpelGL empfohlen, dies ist momentan der " -"einzige\n" -"Treiber mit Shader-Unterstützung." +"Die App könnte sonst nicht mehr starten.\n" +"Auf anderen Plattformen wird OpenGL empfohlen.\n" +"Shader werden unter OpenGL (nur Desktop) und OGLES2 (experimentell) " +"unterstützt." #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "Die Empfindlichkeit der Joystick-Achsen, um den\n" "Pyramidenstumpf der Spielansicht herumzubewegen." @@ -6793,6 +7321,14 @@ msgstr "" "Verwerfen alter Warteschlangeneinträge zu reduzieren. Der Wert 0 deaktiviert " "diese Funktion." +#: 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 "" +"Das erlaubte Zeitbudget für ABM-Ausführung jeden Schritt\n" +"(als Bruchteil des ABM-Intervalls)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6803,13 +7339,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"Die Zeit in Sekunden, in dem Rechtsklicks wiederholt werden, wenn die " -"rechte\n" -"Maustaste gedrückt gehalten wird." +"Die Zeit in Sekunden, in dem die Blockplatzierung wiederholt wird, wenn\n" +"die Bautaste gedrückt gehalten wird." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6856,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 "" @@ -6884,6 +7419,18 @@ msgstr "Tooltip-Verzögerung" 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" @@ -6967,7 +7514,7 @@ msgstr "Bilineare Filterung bei der Skalierung von Texturen benutzen." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" @@ -6976,10 +7523,34 @@ msgstr "" "wird.\n" "Eine gammakorrigierte Herunterskalierung wird nicht unterstützt." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Multi-Sample-Antialiasing (MSAA) benutzen, um Blockecken zu glätten.\n" +"Dieser Algorithmus glättet das 3-D-Sichtfeld während das Bild scharf " +"bleibt,\n" +"beeinträchtigt jedoch nicht die Textureninnenflächen\n" +"(was sich insbesondere bei transparenten Texturen bemerkbar macht).\n" +"Sichtbare Lücken erscheinen zwischen Blöcken, wenn Shader ausgeschaltet " +"sind.\n" +"Wenn der Wert auf 0 steht, ist MSAA deaktiviert.\n" +"Ein Neustart ist erforderlich, nachdem diese Option geändert worden ist." + #: src/settings_translation_file.cpp 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" @@ -7035,8 +7606,8 @@ msgid "" "Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" "Variiert die Rauheit des Geländes.\n" -"Definiert den „persistence“-Wert für „terrain_base“- und " -"„terrain_alt“-Rauschen." +"Definiert den „persistence“-Wert für „terrain_base“- und „terrain_alt“-" +"Rauschen." #: src/settings_translation_file.cpp msgid "Varies steepness of cliffs." @@ -7079,8 +7650,8 @@ msgid "Viewing range" msgstr "Sichtweite" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Virtueller Joystick löst Aux-Taste aus" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Virtueller Joystick löst Aux1-Taste aus" #: src/settings_translation_file.cpp msgid "Volume" @@ -7158,6 +7729,10 @@ msgstr "Flüssigkeitswellen: Wellenlänge" msgid "Waving plants" msgstr "Wehende Pflanzen" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Weblinkfarbe" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7189,9 +7764,8 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7201,23 +7775,18 @@ msgstr "" "die\n" "minimale Texturengröße für die vergrößerten Texturen; höhere Werte führen\n" "zu einem schärferen Aussehen, aber erfordern mehr Speicher. Zweierpotenzen\n" -"werden empfohlen. Ein Wert größer als 1 könnte keinen sichtbaren Effekt\n" -"hervorbringen, es sei denn, der bilineare, trilineare oder anisotropische " -"Filter\n" -"ist aktiviert.\n" +"werden empfohlen. Diese Einstellung trifft NUR dann in Kraft, falls\n" +"der bilineare/trilineare/anisotrope Filter aktiviert ist.\n" "Dies wird außerdem verwendet als die Basisblocktexturengröße für\n" "welt-ausgerichtete automatische Texturenskalierung." #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Ob FreeType-Schriften benutzt werden. Dafür muss FreeType-Unterstüzung " -"einkompiliert worden sein.\n" -"Falls deaktiviert, werden stattdessen Bitmap- und XML-Vektor-Schriften " -"benutzt." +"Ob Namensschildhintergründe standardmäßig angezeigt werden sollen.\n" +"Mods können immer noch einen Hintergrund setzen." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7264,6 +7833,19 @@ msgstr "" "Im Spiel können die Töne mit der Stummtaste oder mit Hilfe des\n" "Pausemenüs stummgeschaltet werden." +#: 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)." @@ -7272,8 +7854,9 @@ msgstr "" "Drücken von F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Breiten-Komponente der anfänglichen Fenstergröße." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Breiten-Komponente der anfänglichen Fenstergröße. Im Vollbildmodus ignoriert." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7377,106 +7960,129 @@ msgstr "Y-Höhe von niedrigerem Gelände und dem Meeresgrund." 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" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "cURL-Interaktiv-Zeitüberschreitung" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL-Parallel-Begrenzung" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL-Zeitüberschreitung" +#~ msgid "- Creative Mode: " +#~ msgstr "- Kreativmodus: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Filmmodus umschalten" - -#~ msgid "Select Package File:" -#~ msgstr "Paket-Datei auswählen:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Y-Wert der Obergrenze von Lava in großen Höhlen." - -#~ msgid "Waving Water" -#~ msgstr "Wasserwellen" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Ob Verliese manchmal aus dem Gelände herausragen." - -#~ msgid "Projecting dungeons" -#~ msgstr "Herausragende Verliese" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Y-Höhe, bis zu der sich die Schatten der Schwebeländer ausbreiten." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "" -#~ "Y-Höhe vom Mittelpunkt der Schwebeländer sowie\n" -#~ "des Wasserspiegels von Seen." - -#~ msgid "Waving water" -#~ msgstr "Wasserwellen" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variierung der Hügelhöhe und Seetiefe in den ruhig verlaufenden\n" -#~ "Regionen der Schwebeländer." +#~ msgid "- Damage: " +#~ msgstr "- Schaden: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Typische Maximalhöhe, über und unter dem Mittelpunkt von Gebirgen in den\n" -#~ "Schwebeländern." +#~ "0 = Parallax-Mapping mit Stufeninformation (schneller).\n" +#~ "1 = Relief-Mapping (langsamer, genauer)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Diese Schrift wird von bestimmten Sprachen benutzt." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Stärke der Lichtkurven-Mittenverstärkung." - -#~ msgid "Shadow limit" -#~ msgstr "Schattenbegrenzung" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Pfad zu einer TrueType- oder Bitmap-Schrift." - -#~ msgid "Lightness sharpness" -#~ msgstr "Helligkeitsschärfe" - -#~ msgid "Lava depth" -#~ msgstr "Lavatiefe" - -#~ msgid "IPv6 support." -#~ msgstr "IPv6-Unterstützung." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "" -#~ "Undurchsichtigkeit des Schattens der Schrift (Wert zwischen 0 und 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Schwebelandberghöhe" - -#~ msgid "Floatland base height noise" -#~ msgstr "Schwebeland-Basishöhenrauschen" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Aktiviert filmisches Tone-Mapping" - -#~ msgid "Enable VBO" -#~ msgstr "VBO aktivieren" +#~ msgid "Address / Port" +#~ msgstr "Adresse / Port" #~ msgid "" -#~ "Deprecated, define and locate cave liquids using biome definitions " -#~ "instead.\n" -#~ "Y of upper limit of lava in large caves." +#~ "Adjust the gamma encoding for the light tables. Higher numbers are " +#~ "brighter.\n" +#~ "This setting is for the client only and is ignored by the server." #~ msgstr "" -#~ "Misbilligte Einstellung. Definieren/Finden Sie statdessen " -#~ "Höhlenflüssigkeiten in Biomdefinitionen.\n" -#~ "Y der Obergrenze von Lava in großen Höhlen." +#~ "Ändert die Gammakodierung der Lichttabellen. Kleinere Werte sind heller.\n" +#~ "Diese Einstellung ist rein clientseitig und wird vom Server ignoriert." + +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Verändert, wie Schwebeländer des Bergtyps sich über und unter dem " +#~ "Mittelpunkt zuspitzen." + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Sind Sie sicher, dass Sie die Einzelspielerwelt löschen wollen?" + +#~ 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." + +#~ msgid "Bump Mapping" +#~ msgstr "Bumpmapping" + +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmapping" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Mitte der Lichtkurven-Mittenverstärkung." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Ändert die Hauptmenü-UI:\n" +#~ "- Full: Mehrere Einzelspielerwelten, Spiel- und Texturenpaketauswahl, " +#~ "usw.\n" +#~ "- Simple: Eine Einzelspielerwelt, keine Spiel- oder " +#~ "Texturenpaketauswahl. Könnte\n" +#~ "für kleinere Bildschirme nötig sein." + +#~ msgid "Config mods" +#~ msgstr "Mods konfigurieren" + +#~ 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." +#~ msgstr "" +#~ "Legt die Dichte von Gebirgen in den Schwebeländern fest.\n" +#~ "Dies ist ein Versatz, der zum Rauschwert „mgv7_np_mountain“ addiert wird." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Legt die Breite von Tunneln fest; ein kleinerer Wert erzeugt breitere " +#~ "Tunnel." + +#~ msgid "Credits" +#~ msgstr "Mitwirkende" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Fadenkreuzfarbe (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Schaden aktiviert" + +#~ msgid "Darkness sharpness" +#~ msgstr "Dunkelheits-Steilheit" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Standardzeitlimit für cURL, in Millisekunden.\n" +#~ "Hat nur eine Wirkung, wenn mit cURL kompiliert wurde." #~ msgid "" #~ "Defines areas of floatland smooth terrain.\n" @@ -7487,51 +8093,381 @@ msgstr "cURL-Zeitüberschreitung" #~ "Schwebeländer treten auf, wenn der\n" #~ "Rauschwert > 0 ist." -#~ msgid "Darkness sharpness" -#~ msgstr "Dunkelheits-Steilheit" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." #~ msgstr "" -#~ "Legt die Breite von Tunneln fest; ein kleinerer Wert erzeugt breitere " -#~ "Tunnel." +#~ "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 "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ "Deprecated, define and locate cave liquids using biome definitions " +#~ "instead.\n" +#~ "Y of upper limit of lava in large caves." #~ msgstr "" -#~ "Legt die Dichte von Gebirgen in den Schwebeländern fest.\n" -#~ "Dies ist ein Versatz, der zum Rauschwert „mgv7_np_mountain“ addiert wird." +#~ "Misbilligte Einstellung. Definieren/Finden Sie statdessen " +#~ "Höhlenflüssigkeiten in Biomdefinitionen.\n" +#~ "Y der Obergrenze von Lava in großen Höhlen." -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Mitte der Lichtkurven-Mittenverstärkung." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgid "Download a game, such as Minetest Game, from minetest.net" #~ msgstr "" -#~ "Verändert, wie Schwebeländer des Bergtyps sich über und unter dem " -#~ "Mittelpunkt zuspitzen." +#~ "Laden Sie sich ein Spiel (wie Minetest Game) von minetest.net herunter" -#~ msgid "" -#~ "Adjust the gamma encoding for the light tables. Higher numbers are " -#~ "brighter.\n" -#~ "This setting is for the client only and is ignored by the server." -#~ msgstr "" -#~ "Ändert die Gammakodierung der Lichttabellen. Kleinere Werte sind heller.\n" -#~ "Diese Einstellung ist rein clientseitig und wird vom Server ignoriert." - -#~ msgid "Path to save screenshots at." -#~ msgstr "Pfad, in dem Bildschirmfotos abgespeichert werden." - -#~ msgid "Parallax occlusion strength" -#~ msgstr "Parallax-Occlusion-Stärke" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Erzeugungswarteschlangengrenze auf Festspeicher" +#~ 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 "Back" -#~ msgstr "Rücktaste" +#~ 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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Aktiviert das Bump-Mapping für Texturen. Normal-Maps müssen im " +#~ "Texturenpaket\n" +#~ "vorhanden sein oder müssen automatisch erzeugt werden.\n" +#~ "Shader müssen aktiviert werden, bevor diese Einstellung aktiviert werden " +#~ "kann." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Aktiviert filmisches Tone-Mapping" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Aktiviert die spontane Normalmap-Erzeugung (Prägungseffekt).\n" +#~ "Für diese Einstellung muss außerdem Bump-Mapping aktiviert sein." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "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." +#~ msgstr "" +#~ "Experimentelle Einstellung, könnte sichtbare Leerräume zwischen\n" +#~ "Blöcken verursachen, wenn auf einen Wert größer 0 gesetzt." + +#~ msgid "FPS in pause menu" +#~ msgstr "Bildwiederholrate im Pausenmenü" + +#~ msgid "Fallback font shadow" +#~ msgstr "Ersatzschriftschatten" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Undurchsichtigkeit des Ersatzschriftschattens" + +#~ msgid "Fallback font size" +#~ msgstr "Ersatzschriftgröße" + +#~ msgid "Filtering" +#~ msgstr "Filter" + +#~ msgid "Floatland base height noise" +#~ msgstr "Schwebeland-Basishöhenrauschen" + +#~ msgid "Floatland mountain height" +#~ msgstr "Schwebelandberghöhe" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "" +#~ "Undurchsichtigkeit des Schattens der Schrift (Wert zwischen 0 und 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Schriftgröße der Ersatzschrift in Punkt (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "FreeType-Schriften" + +#~ msgid "Full screen BPP" +#~ msgstr "Vollbildfarbtiefe" + +#~ msgid "Game" +#~ msgstr "Spiel" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Normalmaps generieren" + +#~ 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" + +#~ msgid "Lightness sharpness" +#~ msgstr "Helligkeitsschärfe" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Erzeugungswarteschlangengrenze auf Festspeicher" + +#~ msgid "Main" +#~ msgstr "Hauptmenü" + +#~ msgid "Main menu style" +#~ msgstr "Hauptmenü-Stil" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Übersichtskarte im Radarmodus, Zoom ×4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Übersichtskarte im Bodenmodus, Zoom ×2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Übersichtskarte im Bodenmodus, Zoom ×4" + +#~ msgid "Name / Password" +#~ msgstr "Name / Passwort" + +#~ msgid "Name/Password" +#~ msgstr "Name/Passwort" + +#~ msgid "No" +#~ msgstr "Nein" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Normalmaps-Sampling" + +#~ msgid "Normalmaps strength" +#~ msgstr "Normalmap-Stärke" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Anzahl der Parallax-Occlusion-Iterationen." #~ msgid "Ok" #~ msgstr "OK" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Undurchsichtigkeit (Alpha) des Schattens hinter der Ersatzschrift, " +#~ "zwischen 0 und 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "" +#~ "Startwert des Parallax-Occlusion-Effektes, üblicherweise Skalierung " +#~ "geteilt durch 2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Gesamtskalierung des Parallax-Occlusion-Effektes." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax-Occlusion" + +#~ msgid "Parallax occlusion" +#~ msgstr "Parallax-Occlusion" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Parallax-Occlusion-Startwert" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Parallax-Occlusion-Iterationen" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Parallax-Occlusion-Modus" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Parallax-Occlusion-Skalierung" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Parallax-Occlusion-Stärke" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Pfad zu einer TrueType- oder Bitmap-Schrift." + +#~ 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" + +#~ msgid "PvP enabled" +#~ msgstr "Spielerkampf aktiviert" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Einzelspielerwelt zurücksetzen" + +#~ 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 " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "Setzt die Schattenupdatezeit.\n" +#~ "Ein niedrigerer Wert bedeutet, dass Schatten und die Karte schneller " +#~ "aktualisiert werden, aber dies verbraucht mehr Ressourcen.\n" +#~ "Minimalwert: 0.001 Sekunden. Maximalwert: 0.2 Sekunden.\n" +#~ "(Beachten Sie die englische Notation mit Punkt als Dezimaltrennzeichen.)" + +#~ msgid "Shadow limit" +#~ msgstr "Schattenbegrenzung" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Versatz des Schattens hinter der Ersatzschrift (in Pixeln). Falls 0, wird " +#~ "der Schatten nicht gezeichnet." + +#~ msgid "Special" +#~ msgstr "Spezial" + +#~ msgid "Special key" +#~ msgstr "Spezialtaste" + +#~ msgid "Start Singleplayer" +#~ msgstr "Einzelspieler starten" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Stärke der generierten Normalmaps." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Stärke der Lichtkurven-Mittenverstärkung." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Diese Schrift wird von bestimmten Sprachen benutzt." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Um Shader zu aktivieren, muss der OpenGL-Treiber genutzt werden." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Filmmodus umschalten" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Typische Maximalhöhe, über und unter dem Mittelpunkt von Gebirgen in den\n" +#~ "Schwebeländern." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variierung der Hügelhöhe und Seetiefe in den ruhig verlaufenden\n" +#~ "Regionen der Schwebeländer." + +#~ msgid "View" +#~ msgstr "Ansehen" + +#~ msgid "Waving Water" +#~ msgstr "Wasserwellen" + +#~ msgid "Waving water" +#~ msgstr "Wasserwellen" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Ob FreeType-Schriften benutzt werden. Dafür muss FreeType-Unterstüzung " +#~ "einkompiliert worden sein.\n" +#~ "Falls deaktiviert, werden stattdessen Bitmap- und XML-Vektor-Schriften " +#~ "benutzt." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Ob Verliese manchmal aus dem Gelände herausragen." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Y-Wert der Obergrenze von Lava in großen Höhlen." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "" +#~ "Y-Höhe vom Mittelpunkt der Schwebeländer sowie\n" +#~ "des Wasserspiegels von Seen." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Y-Höhe, bis zu der sich die Schatten der Schwebeländer ausbreiten." + +#~ 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." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/dv/minetest.po b/po/dv/minetest.po index c5d325108..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: 2020-06-13 23:17+0200\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/" @@ -14,6 +14,43 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.10-dev\n" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "މެއިން މެނޫ" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "އަލުން ސްޕައުންވޭ" @@ -22,10 +59,39 @@ msgstr "އަލުން ސްޕައުންވޭ" msgid "You died" msgstr "މަރުވީ" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua #, fuzzy msgid "An error occurred in a Lua script:" @@ -48,9 +114,30 @@ msgstr "aa gulhumeh" msgid "The server has requested a reconnect:" msgstr "ސަާވަރ އިން ރިކަނެކްޓަކަށް އެދެފި:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -65,8 +152,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "$1 އާއި 2$ ދެމެދުގެ ޕްރޮޓޮކޯލް ވާޝަންތައް ސާވަރ ސަިޕޯޓް ކުރޭ. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "ޕަބްލިކް ސާވަރ ލިސްޓު އަލުން ޖައްސަވާ.އަދި އިންޓަނެޓް ކަނެކްޝަން ޗެކްކުރައްވާ." +msgid "Visit website" +msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +163,26 @@ msgstr "އަޅުގަނޑުމެން ހަމައެކަނި ސަޕޯޓްކުރަނީ msgid "We support protocol versions between version $1 and $2." msgstr "އަޅުގަނޑުމެން 1$ އާއި 2$ އާއި ދެމެދުގެ ޕޮރޮޓޮކޯލް ވާޝަންތައް ސަޕޯޓް ކުރަން." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "ކެންސަލް" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "ބަރޯސާވާ(ޑިޕެންޑެންސީޒް):" @@ -161,14 +257,54 @@ msgstr "ދުނިޔެ:" msgid "enabled" msgstr "ޖައްސާފަ" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "ލޯޑްވަނީ..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "އެނބުރި މެއިން މެނޫއަށް" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "ގޭމް ހޮސްޓްކުރޭ" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -183,7 +319,6 @@ msgid "Failed to download $1" msgstr "$1 ނޭޅުނު" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "ގޭމްތައް" @@ -192,7 +327,20 @@ msgid "Install" msgstr "އަޅާ" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "އަޅާ" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "ލާޒިމުނޫން ޑިޕެންޑެންސީތައް:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "މޮޑްތައް" @@ -205,9 +353,24 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "ހޯދާ" +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -222,7 +385,11 @@ msgid "Update" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -268,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" @@ -291,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 "" @@ -311,6 +470,15 @@ msgstr "" 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 "" @@ -411,11 +579,6 @@ msgstr "" 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 "ދުނިޔޭގެ ނަން" @@ -446,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 "ގަބޫލުކުރޭ" @@ -477,6 +671,16 @@ 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 "އޮފްކޮށްފަ" @@ -501,7 +705,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -520,6 +724,10 @@ msgstr "ޑިފޯލްޓައަށް ރައްދުކުރޭ" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "ހޯދާ" + #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "Select directory" @@ -530,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 "ޓެކްނިކަލް ނަންތައް ދައްކާ" @@ -610,15 +818,6 @@ msgstr "" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: file: \"$1\"" -msgstr "މޮޑް އަޚާ: ފައިލް:\"1$\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" @@ -643,6 +842,57 @@ msgstr "$1 $2އަށް ނޭޅުނު" msgid "Unable to install a modpack as a $1" msgstr "$1 $2އަށް ނޭޅުނު" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "ލޯޑްވަނީ..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "ޕަބްލިކް ސާވަރ ލިސްޓު އަލުން ޖައްސަވާ.އަދި އިންޓަނެޓް ކަނެކްޝަން ޗެކްކުރައްވާ." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "" @@ -687,26 +937,6 @@ msgstr "އިހްތިޔާރުކުރެވިފައިވާ މޮޑް ޑިލީޓްކުރ msgid "Use Texture Pack" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "ސާވަރ އިއުލާންކުރޭ" @@ -716,14 +946,10 @@ msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "ބަދަލުގެނޭ" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "ކްރިއޭޓިވް މޯޑް" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "ގެއްލުން ޖައްސާ" @@ -739,10 +965,6 @@ msgstr "ސާވަރއެއް ހޮސްޓްކުރޭ" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "ޕާސްވޯޑް / ނަން" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "އައު" @@ -755,10 +977,15 @@ msgstr "އެއްވެސް ދުނިޔެއެއް އުފެދިފައެއް ނުވަ msgid "Play Game" msgstr "ގޭމް ކުޅޭ" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "ޕޯޓް" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "ދުނިޔެ އިހްތިޔާރު ކުރޭ:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "ދުނިޔެ އިހްތިޔާރު ކުރޭ:" @@ -773,46 +1000,67 @@ msgid "Start Game" msgstr "ގޭމް ހޮސްޓްކުރޭ" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" +#, fuzzy +msgid "Address" msgstr "އެޑްރެސް / ޕޯޓް" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "ކަނެކްޓްކުރޭ" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "ކްރިއޭޓިވް މޯޑް" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "އަނިޔާވުން ޖައްސާފައި" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "އެންމެ ގަޔާނުވޭ" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "އެންމެ ގަޔާވޭ" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Join Game" msgstr "ގޭމް ހޮސްޓްކުރޭ" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "ޕާސްވޯޑް / ނަން" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "ޕީ.ވީ.ޕީ ޖައްސާ" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "ސާވަރ އިއުލާންކުރޭ" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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" @@ -838,10 +1086,6 @@ msgstr "" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -850,10 +1094,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "" @@ -862,12 +1102,28 @@ msgstr "" msgid "Connected Glass" msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -878,10 +1134,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "ނޫން" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" @@ -910,18 +1162,10 @@ msgstr "" msgid "Opaque Water" msgstr "" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "ސްކްރީން:" @@ -934,6 +1178,10 @@ msgstr "" msgid "Shaders" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -950,22 +1198,26 @@ msgstr "" msgid "Texturing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" - #: 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 "" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "" @@ -978,23 +1230,11 @@ msgstr "" msgid "Waving Plants" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "" @@ -1023,7 +1263,7 @@ msgid "Connection error (timed out?)" msgstr "" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +msgid "Could not find or load game: " msgstr "" #: src/client/clientlauncher.cpp @@ -1054,18 +1294,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1076,14 +1304,6 @@ msgstr "" msgid "- Address: " msgstr "" -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1105,6 +1325,16 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "މޮޑެއްފަދަ ލުއޭ ސްކްރިޕްޓެއްގައި މައްސަލައެއް ދިމާވެއްޖެ:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "" @@ -1114,6 +1344,22 @@ msgstr "" msgid "Automatic forward enabled" msgstr "އަނިޔާވުން ޖައްސާފައި" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1123,6 +1369,10 @@ msgstr "" msgid "Camera update enabled" msgstr "އަނިޔާވުން ޖައްސާފައި" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "" @@ -1136,6 +1386,10 @@ msgstr "" msgid "Cinematic mode enabled" msgstr "އަނިޔާވުން ޖައްސާފައި" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1144,6 +1398,10 @@ msgstr "" msgid "Connecting to server..." msgstr "" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "" @@ -1156,17 +1414,22 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "" @@ -1223,6 +1486,11 @@ msgstr "" 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 "މެއިން މެނޫ" @@ -1300,31 +1568,7 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" +msgid "Multiplayer" msgstr "" #: src/client/game.cpp @@ -1400,6 +1644,21 @@ msgstr "" msgid "Sound unmuted" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1469,10 +1728,6 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "" @@ -1720,22 +1975,31 @@ msgstr "" msgid "Zoom" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "$1 ނޭޅުނު" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1743,7 +2007,7 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1754,16 +2018,24 @@ msgstr "" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Change camera" msgstr "ފިތްތައް ބަދަލުކުރޭ" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "" @@ -1816,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" @@ -1847,10 +2119,6 @@ msgstr "" msgid "Sneak" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1891,10 +2159,6 @@ msgstr "" msgid "Change" msgstr "" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "" @@ -1903,6 +2167,10 @@ msgstr "" msgid "Old Password" msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "" @@ -1912,13 +2180,8 @@ msgid "Muted" msgstr "" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " +#, c-format +msgid "Sound Volume: %d%%" msgstr "" #. ~ DO NOT TRANSLATE THIS LITERALLY! @@ -1928,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" @@ -1936,8 +2208,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1964,12 +2236,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2058,6 +2324,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2076,6 +2346,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2124,6 +2398,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2134,6 +2412,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "ދުނިޔޭގެ ނަން" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2148,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 @@ -2217,6 +2500,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2237,6 +2524,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2249,10 +2544,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2274,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 @@ -2282,11 +2573,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2314,8 +2605,9 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "ފިތްތައް ބަދަލުކުރޭ" #: src/settings_translation_file.cpp msgid "" @@ -2388,13 +2680,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" msgstr "" #: src/settings_translation_file.cpp @@ -2430,7 +2720,7 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp @@ -2449,6 +2739,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2469,6 +2765,10 @@ msgstr "" 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 "" @@ -2493,6 +2793,10 @@ msgstr "މެނޫގައި ވިލާތައް" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2520,6 +2824,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2544,10 +2864,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2575,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 @@ -2606,7 +2936,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2614,7 +2946,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2638,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 @@ -2683,8 +3017,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2715,12 +3050,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2791,6 +3120,15 @@ msgstr "" 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 "" @@ -2803,6 +3141,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2847,18 +3195,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2875,22 +3240,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2939,14 +3298,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2955,18 +3306,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2975,6 +3314,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2983,12 +3332,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3000,8 +3343,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "ޕޯސް މެނޫގައި އެފް.ޕީ.އެސް" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3019,18 +3366,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3049,7 +3384,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3083,13 +3418,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3156,6 +3491,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3177,15 +3516,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3194,6 +3533,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3253,10 +3603,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3281,10 +3627,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3302,7 +3644,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3313,7 +3664,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3332,6 +3683,14 @@ msgstr "" 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 "" @@ -3349,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 @@ -3359,8 +3722,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3382,7 +3745,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3393,10 +3757,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3592,10 +3952,17 @@ 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 "" @@ -3628,8 +3995,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3651,11 +4017,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3679,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 @@ -3696,6 +4070,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3712,10 +4092,6 @@ msgstr "" 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 "" @@ -3743,7 +4119,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3766,16 +4142,12 @@ msgstr "" 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 @@ -3826,6 +4198,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3905,6 +4281,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4004,6 +4387,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4377,6 +4767,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4433,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 @@ -4443,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 @@ -4463,7 +4860,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4490,6 +4888,10 @@ msgstr "" 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" @@ -4561,22 +4963,21 @@ msgstr "" msgid "Main menu script" msgstr "މެއިން މެނޫ ސްކްރިޕްޓް" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "މެއިން މެނޫ ސްކްރިޕްޓް" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4638,6 +5039,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4749,7 +5154,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4797,6 +5206,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4851,17 +5267,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4910,12 +5330,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4926,6 +5358,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4995,16 +5431,16 @@ msgstr "" 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 "" @@ -5017,6 +5453,10 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5029,14 +5469,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5058,18 +5490,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5079,11 +5503,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5092,38 +5511,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5146,17 +5539,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5185,13 +5574,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5202,6 +5595,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5236,10 +5633,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5247,9 +5640,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5339,10 +5732,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5412,6 +5801,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "ސްކްރީން:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5439,6 +5833,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "ސްކްރީން:" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5451,10 +5850,6 @@ msgstr "" 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 "" @@ -5495,9 +5890,19 @@ 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 "" @@ -5522,10 +5927,19 @@ msgstr "" 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 "" @@ -5537,7 +5951,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5558,6 +6000,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5570,6 +6019,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5577,9 +6042,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5594,6 +6057,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5615,6 +6088,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5669,18 +6146,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5696,6 +6169,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5723,10 +6204,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5764,6 +6241,10 @@ msgstr "" 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 "" @@ -5806,6 +6287,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5820,6 +6308,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5875,18 +6367,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5904,6 +6396,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5912,9 +6410,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5951,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 @@ -5974,6 +6471,18 @@ msgstr "" 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 "" @@ -6044,15 +6553,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6146,7 +6670,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6216,6 +6740,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6237,18 +6765,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6283,13 +6809,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6374,24 +6909,78 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -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 "މެއިން މެނޫ ސްކްރިޕްޓް" + +#~ msgid "Name / Password" +#~ msgstr "ޕާސްވޯޑް / ނަން" + +#~ msgid "No" +#~ msgstr "ނޫން" + +#~ msgid "Ok" +#~ msgstr "emme rangalhu" + +#~ msgid "PvP enabled" +#~ msgstr "ޕީ.ވީ.ޕީ ޖައްސާ" #, fuzzy #~ msgid "Select Package File:" #~ msgstr "މޮޑްގެ ފައިލް އިހްތިޔާރުކުރޭ:" -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "$1 ޑައުންލޯޑޮކޮށް އިންސްޓޯލްކުރަނީ، މަޑުކުރައްވާ..." +#, fuzzy +#~ msgid "You died." +#~ msgstr "މަރުވީ" -#~ msgid "Ok" -#~ msgstr "emme rangalhu" +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/el/minetest.po b/po/el/minetest.po index 1992676a4..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: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-03-31 20:29+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,19 +12,87 @@ 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.0-dev\n" +"X-Generator: Weblate 4.12-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Διαγραφή της ουράς συνομιλίας" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Κενή εντολή." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Έξοδος στο κεντρικό μενού" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Άκυρη εντολή: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Λίστα συνδεδεμένων παικτών" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Συνδεδεμένοι παίκτες: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Η ουρά συνομιλίας είναι τώρα κενή." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +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" msgstr "Πέθανες" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Διαθέσιμες εντολές:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Διαθέσιμες εντολές: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Η εντολή δεν είναι διαθέσιμη: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[all | <εντολή>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "Εντάξει" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<κανένα διαθέσιμο>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -46,9 +114,30 @@ msgstr "Επανασύνδεση" msgid "The server has requested a reconnect:" msgstr "Ο διακομιστής ζήτησε επανασύνδεση:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -63,10 +152,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Ο διακομιστής υποστηρίζει εκδόσεις πρωτοκόλλων μεταξύ $1 και $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Δοκιμάστε να ενεργοποιήσετε ξανά τη δημόσια λίστα διακομιστών και ελέγξτε τη " -"σύνδεσή σας στο διαδίκτυο." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +163,26 @@ msgstr "Υποστηρίζουμε μόνο το πρωτόκολλο έκδοσ msgid "We support protocol versions between version $1 and $2." msgstr "Υποστηρίζουμε τις εκδόσεις πρωτοκόλλων μεταξύ της έκδοσης $1 και $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Άκυρο" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Εξαρτήσεις:" @@ -96,7 +192,7 @@ msgstr "Απενεργοποίηση όλων" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "" +msgstr "Απενεργοποίηση πακέτου τροποποιήσεων" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -104,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" @@ -130,112 +228,181 @@ 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 msgid "Save" -msgstr "" +msgstr "Αποθήκευση" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" -msgstr "" +msgstr "Κόσμος:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" +msgstr "ενεργοποιήθηκε" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "Το \"$1\" ήδη υπάρχει. Θέλετε να το αντικαταστήσετε;" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Οι εξαρτήσεις $1 και $2 θα εγκατασταθούν." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "Λήψη ..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "Δεν ήταν δυνατή η εύρεση των απαιτούμενων εξαρτήσεων $1." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "Θα εγκατασταθεί το $1 και οι εξαρτήσεις $2 θα παραβλεφθούν." #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" -msgstr "" +msgstr "Όλα τα Πακέτα" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Ήδη εγκαταστημένο" #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" -msgstr "" +msgstr "Πίσω στο Κύριο Μενού" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +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 -#, fuzzy msgid "Downloading..." -msgstr "Φόρτωση..." +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 "" +msgstr "Παιχνίδια" #: builtin/mainmenu/dlg_contentstore.lua msgid "Install" -msgstr "" +msgstr "Εγκατάσταση" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "Εγκατάσταση $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Εγκατάσταση των εξαρτήσεων που λείπουν" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +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" -msgstr "" +msgstr "Χωρίς αποτελέσματα" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "" +msgid "No updates" +msgstr "Δεν υπάρχουν ενημερώσεις" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Δε βρέθηκε" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Αντικατάσταση" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Ελέγξτε ότι το βασικό παιχνίδι είναι σωστό." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Σε αναμονή" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" -msgstr "" +msgstr "Πακέτα υφής" #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" -msgstr "" +msgstr "Απεγκατάσταση" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "" +msgstr "Αναβάθμιση" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Ενημέρωση Όλων [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +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" @@ -247,120 +414,122 @@ 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" -msgstr "" +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" -msgstr "" +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 msgid "Lakes" -msgstr "" +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" -msgstr "" +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" -msgstr "" +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" -msgstr "" +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 msgid "Seed" -msgstr "" +msgstr "Σπόρος" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" @@ -371,114 +540,154 @@ 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" -msgstr "" +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 #: src/client/keycode.cpp msgid "Delete" -msgstr "" +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 msgid "Accept" -msgstr "" +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 "" +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 "" +msgstr "Απενεργοποιημένο" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "" +msgstr "Επεξεργασία" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" -msgstr "" +msgstr "Ενεργοποιημένο" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Lacunarity" @@ -486,75 +695,79 @@ 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 "Persistance" +msgid "Persistence" 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" +msgstr "Αναζήτηση" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" -msgstr "" +msgstr "Επιλογή φακέλου" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select file" -msgstr "" +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" -msgstr "" +msgstr "X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X spread" -msgstr "" +msgstr "Χ εξάπλωση" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y" -msgstr "" +msgstr "Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y spread" -msgstr "" +msgstr "Υ εξάπλωση" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z" -msgstr "" +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". @@ -562,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 @@ -577,219 +790,262 @@ 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 "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$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 "Δεν είναι δυνατή η εγκατάσταση πακέτου τροποποίησης ως $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Φόρτωση..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Η λίστα δημόσιων διακομιστών είναι απενεργοποιημένη" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Δοκιμάστε να ενεργοποιήσετε ξανά τη δημόσια λίστα διακομιστών και ελέγξτε τη " +"σύνδεσή σας στο διαδίκτυο." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Σχετικά" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Ενεργοί Συντελεστές" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Βασικοί Προγραμματιστές" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "Προηγούμενοι Συντελεστές" + +#: 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 msgid "Browse online content" -msgstr "" +msgstr "Περιήγηση διαδικτυακού περιεχομένου" #: builtin/mainmenu/tab_content.lua msgid "Content" -msgstr "" +msgstr "Περιεχόμενο" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" -msgstr "" +msgstr "Απενεργοποίηση πακέτου υφής" #: builtin/mainmenu/tab_content.lua msgid "Information:" -msgstr "" +msgstr "Πληροφορίες:" #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" -msgstr "" +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" -msgstr "" +msgstr "Μετονομασία" #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" -msgstr "" +msgstr "Απεγκατάσταση πακέτου" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -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 "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "" +msgstr "Λειτουργία Δημιουργίας" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: 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 "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" +msgstr "Εγκατάσταση παιχνιδιών από το ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" -msgstr "" +msgstr "Νέο" #: builtin/mainmenu/tab_local.lua msgid "No world created or selected!" -msgstr "" +msgstr "Κανένας κόσμος δεν δημιουργήθηκε ούτε επιλέχθηκε!" #: builtin/mainmenu/tab_local.lua msgid "Play Game" -msgstr "" +msgstr "Εκκίνηση Παιχνιδιού" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "Θήρα" #: builtin/mainmenu/tab_local.lua -msgid "Port" -msgstr "" +msgid "Select Mods" +msgstr "Επιλογή Τροποποιήσεων" #: builtin/mainmenu/tab_local.lua msgid "Select World:" -msgstr "" +msgstr "Επιλογή Κόσμου:" #: builtin/mainmenu/tab_local.lua msgid "Server Port" -msgstr "" +msgstr "Θήρα Διακομιστή" #: builtin/mainmenu/tab_local.lua msgid "Start Game" -msgstr "" +msgstr "Εκκίνηση Παιχνιδιού" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "" +msgid "Address" +msgstr "Διεύθυνση" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Εκκαθάριση" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" -msgstr "" +msgstr "Λειτουργία Δημιουργίας" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Μάχες μεταξύ παιχτών" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Αγαπημένα" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Μη συμβατοί διακομιστές" #: builtin/mainmenu/tab_online.lua msgid "Join Game" +msgstr "Συμμετοχή στο Παιχνίδι" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Δημόσιοι Διακομιστές" + +#: builtin/mainmenu/tab_online.lua +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 @@ -798,55 +1054,64 @@ msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "" +msgstr "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 "Όλες οι ρυθμίσεις" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" -msgstr "" +msgstr "Αυτόματη αποθήκευση Μεγέθους Οθόνης" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" +msgstr "Διγραμμικό Φίλτρο" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" -msgstr "" +msgstr "Αλλαγή πλήκτρων" #: builtin/mainmenu/tab_settings.lua msgid "Connected Glass" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Fancy Leaves" -msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Δυναμικές σκιές" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "" +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Δυναμικές σκιές: " + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "Φανταχτερά Φύλλα" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "Υψηλό" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Χαμηλό" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Μεσαίο" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -856,13 +1121,9 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" -msgstr "" +msgstr "Χωρίς Φίλτρο" #: builtin/mainmenu/tab_settings.lua msgid "No Mipmap" @@ -870,209 +1131,182 @@ 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" -msgstr "" +msgstr "Κανένα" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" -msgstr "" +msgstr "Αδιαφανή Φύλλα" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" +msgstr "Αδιαφανές Νερό" #: builtin/mainmenu/tab_settings.lua msgid "Particles" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" +msgstr "Σωματίδια" #: builtin/mainmenu/tab_settings.lua msgid "Screen:" -msgstr "" +msgstr "Οθόνη:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "" +msgstr "Ρυθμίσεις" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" 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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -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 +#, fuzzy +msgid "Very High" +msgstr "Εξαιρετικά Υψηλό" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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!" -msgstr "" +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 "" +msgid "Could not find or load game: " +msgstr "Δεν ήταν δυνατή η εύρεση ή η φόρτωση του παιχνιδιού: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." -msgstr "" +msgstr "Μη έγκυρη προδιαγραφή παιχνιδιού." #: src/client/clientlauncher.cpp msgid "Main Menu" -msgstr "" +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!" -msgstr "" +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 "" - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" +msgstr "Το αρχείο του Κόσμου δεν υπάρχει: " #: src/client/game.cpp msgid "" "\n" "Check debug.txt for details." msgstr "" +"\n" +"Ελέγξτε το debug.txt για λεπτομέρειες." #: src/client/game.cpp msgid "- Address: " -msgstr "" - -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" +msgstr "- Διεύθυνση: " #: src/client/game.cpp msgid "- Mode: " -msgstr "" +msgstr "- Λειτουργία: " #: src/client/game.cpp msgid "- Port: " -msgstr "" +msgstr "- Θήρα: " #: src/client/game.cpp msgid "- Public: " -msgstr "" +msgstr "- Δημόσιο: " #. ~ PvP = Player versus Player #: src/client/game.cpp @@ -1081,47 +1315,88 @@ msgstr "" #: src/client/game.cpp msgid "- Server Name: " -msgstr "" +msgstr "- Όνομα Διακομιστή: " + +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Παρουσιάστηκε σφάλμα:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +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 "Αποκλεισμός ορίων κρυφά" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Τα όρια μπλοκ εμφανίζονται για όλα τα μπλοκ" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Εμφανίζονται όρια αποκλεισμού για το τρέχον μπλοκ" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Εμφανίζονται όρια αποκλεισμού για κοντινά μπλοκ" #: src/client/game.cpp msgid "Camera update disabled" -msgstr "" +msgstr "Η ενημέρωση κάμερας απενεργοποιήθηκε" #: src/client/game.cpp msgid "Camera update enabled" +msgstr "Η ενημέρωση κάμερας ενεργοποιήθηκε" + +#: src/client/game.cpp +#, 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 "Ο πελάτης αποσυνδέθηκε" #: 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 "Η σύνδεση απέτυχε για άγνωστο λόγο" #: src/client/game.cpp msgid "Continue" -msgstr "" +msgstr "Συνέχεια" #: src/client/game.cpp #, c-format @@ -1131,36 +1406,57 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- 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 "Δεν ήταν δυνατή η επίλυση της διεύθυνσης: %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 "" @@ -1177,70 +1473,89 @@ 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" -msgstr "" +msgstr "Έξοδος στο Μενού" #: src/client/game.cpp msgid "Exit to OS" -msgstr "" +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:" -msgstr "" +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" @@ -1259,32 +1574,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +msgstr "Πολλοί παίκτες" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1324,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" @@ -1340,19 +1631,19 @@ msgstr "" #: src/client/game.cpp msgid "Sound Volume" -msgstr "" +msgstr "Ένταση Ήχου" #: src/client/game.cpp msgid "Sound muted" -msgstr "" +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" @@ -1360,23 +1651,40 @@ msgstr "" #: src/client/game.cpp #, c-format -msgid "Viewing range changed to %d" +msgid "The server is probably running a different version of %s." +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 "Το εύρος προβολής άλλαξε σε %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" @@ -1384,7 +1692,7 @@ msgstr "" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "" +msgstr "Το ζουμ είναι απενεργοποιημένο από το παιχνίδι ή την τροποποίηση" #: src/client/game.cpp msgid "ok" @@ -1392,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" @@ -1417,7 +1725,7 @@ msgstr "" #: src/client/keycode.cpp msgid "Apps" -msgstr "" +msgstr "Εφαρμογές" #: src/client/keycode.cpp msgid "Backspace" @@ -1427,21 +1735,17 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "" #: src/client/keycode.cpp msgid "Down" -msgstr "" +msgstr "Κάτω" #: src/client/keycode.cpp msgid "End" -msgstr "" +msgstr "Τέλος" #: src/client/keycode.cpp msgid "Erase EOF" @@ -1453,11 +1757,11 @@ msgstr "" #: src/client/keycode.cpp msgid "Help" -msgstr "" +msgstr "Βοήθεια" #: src/client/keycode.cpp msgid "Home" -msgstr "" +msgstr "Σπίτι" #: src/client/keycode.cpp msgid "IME Accept" @@ -1481,11 +1785,11 @@ msgstr "" #: src/client/keycode.cpp msgid "Insert" -msgstr "" +msgstr "Εισαγωγή" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Left" -msgstr "" +msgstr "Αριστερά" #: src/client/keycode.cpp msgid "Left Button" @@ -1510,7 +1814,7 @@ msgstr "" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp msgid "Menu" -msgstr "" +msgstr "Μενού" #: src/client/keycode.cpp msgid "Middle Button" @@ -1522,63 +1826,63 @@ msgstr "" #: src/client/keycode.cpp msgid "Numpad *" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο *" #: src/client/keycode.cpp msgid "Numpad +" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο +" #: src/client/keycode.cpp msgid "Numpad -" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο -" #: src/client/keycode.cpp msgid "Numpad ." -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο ." #: src/client/keycode.cpp msgid "Numpad /" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο /" #: src/client/keycode.cpp msgid "Numpad 0" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 0" #: src/client/keycode.cpp msgid "Numpad 1" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 1" #: src/client/keycode.cpp msgid "Numpad 2" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 2" #: src/client/keycode.cpp msgid "Numpad 3" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 3" #: src/client/keycode.cpp msgid "Numpad 4" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 4" #: src/client/keycode.cpp msgid "Numpad 5" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 5" #: src/client/keycode.cpp msgid "Numpad 6" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 6" #: src/client/keycode.cpp msgid "Numpad 7" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 7" #: src/client/keycode.cpp msgid "Numpad 8" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 8" #: src/client/keycode.cpp msgid "Numpad 9" -msgstr "" +msgstr "Αριθμητικό Πληκτρολόγιο 9" #: src/client/keycode.cpp msgid "OEM Clear" @@ -1594,24 +1898,24 @@ msgstr "" #: src/client/keycode.cpp msgid "Pause" -msgstr "" +msgstr "Παύση" #: src/client/keycode.cpp msgid "Play" -msgstr "" +msgstr "Αναπαραγωγή" #. ~ "Print screen" key #: src/client/keycode.cpp msgid "Print" -msgstr "" +msgstr "Εκτύπωση" #: src/client/keycode.cpp msgid "Return" -msgstr "" +msgstr "Επιστροφή" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Right" -msgstr "" +msgstr "Δεξιά" #: src/client/keycode.cpp msgid "Right Button" @@ -1640,7 +1944,7 @@ msgstr "" #. ~ Key name #: src/client/keycode.cpp msgid "Select" -msgstr "" +msgstr "Επιλογή" #: src/client/keycode.cpp msgid "Shift" @@ -1648,7 +1952,7 @@ msgstr "" #: src/client/keycode.cpp msgid "Sleep" -msgstr "" +msgstr "Ύπνος" #: src/client/keycode.cpp msgid "Snapshot" @@ -1664,7 +1968,7 @@ msgstr "" #: src/client/keycode.cpp msgid "Up" -msgstr "" +msgstr "Πάνω" #: src/client/keycode.cpp msgid "X Button 1" @@ -1676,24 +1980,32 @@ msgstr "" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" +msgstr "Μεγέθυνση" + +#: src/client/minimap.cpp +msgid "Minimap hidden" 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 +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1701,7 +2013,7 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1712,21 +2024,29 @@ msgstr "" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" -msgstr "" +msgstr "Εντολή" #: src/gui/guiKeyChangeMenu.cpp msgid "Console" @@ -1770,10 +2090,10 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Key already in use" -msgstr "" +msgstr "Το πλήκτρο ήδη χρησιμοποιείται" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1782,11 +2102,11 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" -msgstr "" +msgstr "Σίγαση" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" -msgstr "" +msgstr "Επόμενο αντικείμενο" #: src/gui/guiKeyChangeMenu.cpp msgid "Prev. item" @@ -1798,16 +2118,12 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Screenshot" -msgstr "" +msgstr "Στιγμιότυπο οθόνης" #: src/gui/guiKeyChangeMenu.cpp msgid "Sneak" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1846,37 +2162,32 @@ msgstr "" #: src/gui/guiPasswordChange.cpp msgid "Change" -msgstr "" - -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" +msgstr "Αλλαγή" #: src/gui/guiPasswordChange.cpp msgid "New Password" -msgstr "" +msgstr "Νέος Κωδικός" #: src/gui/guiPasswordChange.cpp msgid "Old Password" +msgstr "Παλιός Κωδικός" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" msgstr "" #: src/gui/guiVolumeChange.cpp msgid "Exit" -msgstr "" +msgstr "Έξοδος" #: src/gui/guiVolumeChange.cpp msgid "Muted" -msgstr "" +msgstr "Σε σίγαση" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "" +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Sound Volume: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1885,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" @@ -1893,8 +2214,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1921,12 +2242,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -1957,7 +2272,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" +msgstr "3D σύννεφα" #: src/settings_translation_file.cpp msgid "3D mode" @@ -2015,6 +2330,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2033,6 +2352,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2078,6 +2401,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2088,9 +2415,14 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Όνομα κόσμου" + #: src/settings_translation_file.cpp msgid "Advanced" -msgstr "" +msgstr "Για προχωρημένους" #: src/settings_translation_file.cpp msgid "" @@ -2102,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 @@ -2170,6 +2502,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2190,6 +2526,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2202,10 +2546,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2227,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 @@ -2235,11 +2575,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2267,7 +2607,7 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" +msgid "Camera" msgstr "" #: src/settings_translation_file.cpp @@ -2341,15 +2681,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Εντολές Συνομιλίας" + #: src/settings_translation_file.cpp msgid "Chat font size" msgstr "" @@ -2383,7 +2721,7 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp @@ -2402,6 +2740,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2422,6 +2766,10 @@ msgstr "" 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 "" @@ -2432,7 +2780,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Clouds" -msgstr "" +msgstr "Σύννεφα" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." @@ -2446,6 +2794,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2473,6 +2825,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2497,10 +2865,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2527,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 @@ -2558,7 +2936,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2566,7 +2946,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2590,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 @@ -2633,8 +3015,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2665,12 +3048,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2741,6 +3118,15 @@ msgstr "" 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 "" @@ -2753,6 +3139,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2797,18 +3193,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2825,22 +3238,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2889,14 +3296,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2905,18 +3304,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2925,6 +3312,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2933,12 +3330,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2950,7 +3341,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2969,18 +3364,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -2999,7 +3382,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3033,13 +3416,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3096,7 +3479,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Fog" -msgstr "" +msgstr "Ομίχλη" #: src/settings_translation_file.cpp msgid "Fog start" @@ -3106,6 +3489,11 @@ msgstr "" 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 "" @@ -3124,18 +3512,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Font size" +msgstr "Μέγεθος γραμματοσειράς" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3144,6 +3532,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3203,10 +3602,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3229,11 +3624,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Full screen" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" +msgstr "Πλήρης οθόνη" #: src/settings_translation_file.cpp msgid "Fullscreen mode." @@ -3252,7 +3643,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3263,7 +3663,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3283,9 +3683,17 @@ msgid "Graphics" msgstr "" #: src/settings_translation_file.cpp -msgid "Gravity" +msgid "Graphics Effects" msgstr "" +#: src/settings_translation_file.cpp +msgid "Graphics and Audio" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gravity" +msgstr "Βαρύτητα" + #: src/settings_translation_file.cpp msgid "Ground level" msgstr "" @@ -3299,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 @@ -3309,8 +3721,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3332,7 +3744,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3343,10 +3756,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3542,10 +3951,17 @@ 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 "" @@ -3578,8 +3994,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3601,11 +4016,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3629,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 @@ -3646,6 +4069,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3662,10 +4091,6 @@ msgstr "" 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 "" @@ -3693,7 +4118,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3716,16 +4141,12 @@ msgstr "" 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 @@ -3776,6 +4197,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3855,6 +4280,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3954,6 +4386,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4327,6 +4766,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4341,7 +4784,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Language" -msgstr "" +msgstr "Γλώσσα" #: src/settings_translation_file.cpp msgid "Large cave depth" @@ -4383,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 @@ -4393,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 @@ -4413,7 +4859,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4440,6 +4887,11 @@ msgstr "" 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" @@ -4511,21 +4963,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4587,6 +5039,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4692,7 +5148,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4740,6 +5200,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4794,17 +5261,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4853,12 +5324,25 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4869,6 +5353,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4909,7 +5397,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Mute sound" -msgstr "" +msgstr "Σίγαση ήχου" #: src/settings_translation_file.cpp msgid "" @@ -4935,16 +5423,17 @@ msgstr "" 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 "" @@ -4957,6 +5446,11 @@ msgstr "" 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 "" @@ -4969,14 +5463,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -4998,18 +5484,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5019,11 +5497,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5032,38 +5505,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5086,17 +5533,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5125,13 +5568,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5142,6 +5589,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5176,10 +5627,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5187,9 +5634,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5279,10 +5726,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5352,6 +5795,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Οθόνη:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5379,6 +5827,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Στιγμιότυπο οθόνης" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5391,10 +5844,6 @@ msgstr "" 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 "" @@ -5435,37 +5884,57 @@ 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" -msgstr "" +msgstr "URL διακομιστή" #: src/settings_translation_file.cpp msgid "Server address" -msgstr "" +msgstr "Διεύθυνση διακομιστή" #: src/settings_translation_file.cpp msgid "Server description" -msgstr "" +msgstr "Περιγραφή διακομιστή" #: src/settings_translation_file.cpp msgid "Server name" -msgstr "" +msgstr "Όνομα διακομιστή" #: src/settings_translation_file.cpp msgid "Server port" -msgstr "" +msgstr "Θύρα διακομιστή" #: src/settings_translation_file.cpp 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 "" @@ -5477,7 +5946,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5498,6 +5995,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5510,6 +6014,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5517,9 +6037,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5534,6 +6052,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5555,6 +6083,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5609,17 +6141,13 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" +msgstr "Ήχος" #: src/settings_translation_file.cpp msgid "" @@ -5636,6 +6164,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5663,10 +6199,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5704,6 +6236,11 @@ msgstr "" 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 "" @@ -5746,6 +6283,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5760,6 +6304,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5815,18 +6363,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5844,6 +6392,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5852,9 +6406,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5891,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 @@ -5914,6 +6467,19 @@ msgstr "" 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 "" @@ -5984,15 +6550,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6086,12 +6667,12 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp msgid "Volume" -msgstr "" +msgstr "Ένταση" #: src/settings_translation_file.cpp msgid "" @@ -6156,6 +6737,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6177,18 +6762,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6223,13 +6806,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6313,17 +6905,61 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "cURL parallel limit" +msgid "cURL interactive timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +msgid "cURL parallel limit" +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\"" + +#~ msgid "Name / Password" +#~ msgstr "Όνομα / Κωδικός" #~ msgid "Ok" #~ msgstr "Οκ" + +#~ msgid "Player name" +#~ msgstr "Όνομα παίκτη" + +#~ msgid "Special key" +#~ msgstr "Ειδικό πλήκτρο" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Πέθανες" + +#~ msgid "needs_fallback_font" +#~ msgstr "needs_fallback_font" diff --git a/po/eo/minetest.po b/po/eo/minetest.po index 752538f5e..73de3a5f1 100644 --- a/po/eo/minetest.po +++ b/po/eo/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Esperanto (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-07-06 21:41+0000\n" -"Last-Translator: Tirifto <tirifto@posteo.cz>\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/" "minetest/eo/>\n" "Language: eo\n" @@ -12,7 +12,44 @@ 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.9-dev\n" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Clear the out chat queue" +msgstr "Maksimumo da atendantaj elaj mesaĝoj" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Malplena komando." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Eliri al ĉefmenuo" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Nevalida komando: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Donita komando: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Listigi enretajn ludantojn" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Enretaj ludantoj: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Ĉi tiun komandon malŝaltis servilo." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +59,40 @@ msgstr "Renaskiĝi" msgid "You died" msgstr "Vi mortis" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Uzeblaj komandoj:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Uzeblaj komandoj: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Komando ne uzeblas: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Trovu helpon pri komandoj" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <komando>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "Bone" +#: builtin/fstk/ui.lua +#, fuzzy +msgid "<none available>" +msgstr "Komando ne uzeblas: " + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Eraris Lua-skripto:" @@ -46,9 +113,30 @@ msgstr "Rekonekti" msgid "The server has requested a reconnect:" msgstr "La servilo petis rekonekton:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Enlegante…" +#: 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. " @@ -63,9 +151,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "La servilo subtenas protokolajn versiojn inter $1 kaj $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Provu reŝalti la publikan liston de serviloj kaj kontroli vian retkonekton." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -75,17 +162,26 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Dependas de:" @@ -135,7 +231,7 @@ msgstr "Sen dependaĵoj" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." -msgstr "Neniu priskrib ode modifaĵaro estas donita." +msgstr "Neniu priskribo de modifaĵaro estas donita." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" @@ -158,29 +254,67 @@ msgstr "Mondo:" msgid "enabled" msgstr "ŝaltita" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "«$ 1» jam ekzistas. Ĉu superskribi ĝin?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Dependaĵoj $1 kaj $2 estos instalitaj." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 de $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"elŝutante $1,\n" +"atendante $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "Elŝutante $1…" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 nepraj dependaĵoj ne estis troveblaj." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$ 1 estos instalita, ignorante $2 dependaĵojn." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Ĉiuj pakaĵoj" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Jam instalita" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" -msgstr "Reeniri al ĉefmenuo" +msgstr "Reen al ĉefmenuo" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Baza Ludo:" #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgstr "ContentDB ne estas disponebla per Minetest kodotradukita sen cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Enlegante…" +msgstr "Elŝutante…" #: builtin/mainmenu/dlg_contentstore.lua 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" @@ -189,7 +323,19 @@ msgid "Install" msgstr "Instali" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Instali $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Instali mankantajn dependaĵojn" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "Instalo: Nesubtenata dosierspeco «$1» aŭ rompita arĥivo" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Modifaĵoj" @@ -202,9 +348,24 @@ msgid "No results" msgstr "Neniuj rezultoj" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Serĉi" +msgid "No updates" +msgstr "Neniuj ĝisdatigoj" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Ne trovita" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Superskribi" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Bonvolu kontroli, ke la baza ludo estas ĝusta." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Atendata" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -219,8 +380,12 @@ msgid "Update" msgstr "Ĝisdatigi" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Vido" +msgid "Update All [$1]" +msgstr "Ĝisdatigi Ĉiujn [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Vidi pli da informoj per TTT-legilo" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -235,9 +400,8 @@ msgid "Altitude chill" msgstr "Alteca malvarmiĝo" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Alteca malvarmiĝo" +msgstr "Alteca sekeco" #: builtin/mainmenu/dlg_create_world.lua msgid "Biome blending" @@ -264,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" @@ -287,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" @@ -307,6 +464,15 @@ msgstr "Malsekaj riveroj" 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" @@ -334,7 +500,7 @@ msgstr "Montoj" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Fluo de koto" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" @@ -394,9 +560,8 @@ msgid "Temperate, Desert, Jungle, Tundra, Taiga" msgstr "Milda, Dezerto, Ĝangalo, Tundro, Tajgo" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Terrain surface erosion" -msgstr "Bruo de terena bazo" +msgstr "Terensurfaca forfrotiĝo" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" @@ -410,10 +575,6 @@ msgstr "Variigi profundecon de riveroj" 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" @@ -444,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" @@ -477,6 +671,16 @@ 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" @@ -501,7 +705,8 @@ msgid "Offset" msgstr "Deŝovo" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Persisteco" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -520,6 +725,10 @@ msgstr "Restarigi pravaloron" msgid "Scale" msgstr "Skalo" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Serĉi" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Elekti dosierujon" @@ -528,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" @@ -608,14 +817,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" "Instali modifaĵon: Ne povas trovi ĝustan dosierujan nomon por modifaĵaro $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Instalo: Nesubtenata dosierspeco «$1» aŭ rompita arĥivo" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Instali: dosiero: «$1»" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Ne povas trovi validan modifaĵon aŭ modifaĵaron" @@ -636,6 +837,60 @@ msgstr "Malsukcesis instali modifaĵon kiel $1" msgid "Unable to install a modpack as a $1" msgstr "Malsukcesis instali modifaĵaron kiel $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Enlegante…" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Listo de publikaj serviloj estas malŝaltita" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Provu reŝalti la publikan liston de serviloj kaj kontroli vian retkonekton." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Pri" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktivaj kontribuantoj" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Aktiva bildigilo:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Kernprogramistoj" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Malfermi dosierujon de datenoj de uzanto" + +#: 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 "" +"Malfermi per dosieradministrilo la dosierujon, kiu enhavas la mondojn,\n" +"ludojn, modifaĵojn, kaj teksturojn provizitajn de la uzanto." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Eksaj kontribuistoj" + +#: builtin/mainmenu/tab_about.lua +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" @@ -676,26 +931,6 @@ msgstr "Malinstali pakaĵon" msgid "Use Texture Pack" msgstr "Uzi teksturaron" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktivaj kontribuantoj" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Kernprogramistoj" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Kontribuantaro" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Eksaj kontribuistoj" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Eksaj kernprogramistoj" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Enlistigi servilon" @@ -705,14 +940,10 @@ msgid "Bind Address" msgstr "Asocii adreso" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Agordi" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Krea reĝimo" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Ŝalti difektadon" @@ -726,11 +957,7 @@ msgstr "Gastigi servilon" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nomo/Pasvorto" +msgstr "Instali ludojn de ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -744,10 +971,14 @@ msgstr "Neniu mondo estas kreita aŭ elektita!" msgid "Play Game" msgstr "Ludi" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Pordo" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Elektu Modifaĵojn" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Elektu mondon:" @@ -761,45 +992,64 @@ msgid "Start Game" msgstr "Ekigi ludon" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adreso / Pordo" +msgid "Address" +msgstr "Adreso" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Konekti" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Vakigo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Krea reĝimo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Difektado estas ŝaltita" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "Difekto" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Forigi ŝataton" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Ŝati" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Neakordaj serviloj" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Aliĝi al ludo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nomo / Pasvorto" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Retprokrasto" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Dueloj ŝaltitas" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Publikaj serviloj" + +#: builtin/mainmenu/tab_online.lua +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" @@ -825,10 +1075,6 @@ msgstr "Ĉiuj agordoj" msgid "Antialiasing:" msgstr "Glatigo:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Ĉu vi certas, ke vi volas rekomenci vian mondon por unu ludanto?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Memori grandecon de ekrano" @@ -837,10 +1083,6 @@ msgstr "Memori grandecon de ekrano" msgid "Bilinear Filter" msgstr "Dulineara filtrilo" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Tubera mapado" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Ŝanĝi klavojn" @@ -849,13 +1091,30 @@ msgstr "Ŝanĝi klavojn" msgid "Connected Glass" msgstr "Ligata vitro" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dinamikaj ombroj" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Dinamikaj ombroj: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Ŝikaj folioj" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Estigi Normalmapojn" +msgid "High" +msgstr "Alta" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Malalta" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Mezalta" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -865,10 +1124,6 @@ msgstr "Etmapo" msgid "Mipmap + Aniso. Filter" msgstr "Etmapo + Neizotropa filtrilo" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Ne" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Neniu filtrilo" @@ -897,18 +1152,10 @@ msgstr "Netravideblaj folioj" msgid "Opaque Water" msgstr "Netravidebla akvo" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Paralaksa ombrigo" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partikloj" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Rekomenci mondon por unu ludanto" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Ekrano:" @@ -921,6 +1168,10 @@ msgstr "Agordoj" msgid "Shaders" msgstr "Ombrigiloj" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Ombrigiloj (eksperimentaj)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Ombrigiloj (nehaveblaj)" @@ -937,22 +1188,28 @@ msgstr "Glata lumado" msgid "Texturing:" msgstr "Teksturado:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Por uzi ombrigilojn, OpenGL-pelilo estas necesa." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp 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 msgid "Trilinear Filter" msgstr "Trilineara filtrilo" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Altega" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Malaltega" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Ondantaj foliaĵoj" @@ -965,23 +1222,12 @@ msgstr "Ondantaj fluaĵoj" msgid "Waving Plants" msgstr "Ondantaj plantoj" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Jes" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Agordi modifaĵojn" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Ĉefmenuo" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Komenci ludon por unu" - #: 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." @@ -1010,7 +1256,8 @@ msgid "Connection error (timed out?)" msgstr "Konekta eraro (ĉu eltempiĝo?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Ne povis trovi aŭ enlegi ludon \"" #: src/client/clientlauncher.cpp @@ -1041,18 +1288,6 @@ msgstr "Malsukcesis malfermi donitan pasvortan dosieron: " msgid "Provided world path doesn't exist: " msgstr "Donita monda dosierindiko ne ekzistas: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1065,14 +1300,6 @@ msgstr "" msgid "- Address: " msgstr "– Adreso: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "– Krea reĝimo: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "– Difekto: " - #: src/client/game.cpp msgid "- Mode: " msgstr "– Reĝimo: " @@ -1094,6 +1321,16 @@ msgstr "– LkL: " msgid "- Server Name: " msgstr "– Nomo de servilo: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Eraro okazis:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Memaga pluigo malŝaltita" @@ -1102,6 +1339,22 @@ msgstr "Memaga pluigo malŝaltita" msgid "Automatic forward enabled" msgstr "Memaga pluigo ŝaltita" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Ĝisdatigo de vidpunkto malŝaltita" @@ -1110,6 +1363,10 @@ msgstr "Ĝisdatigo de vidpunkto malŝaltita" msgid "Camera update enabled" msgstr "Ĝisdatigo de vidpunkto ŝaltita" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Ŝanĝi pasvorton" @@ -1122,6 +1379,11 @@ msgstr "Glita vidpunkto malŝaltita" msgid "Cinematic mode enabled" msgstr "Glita vidpunkto ŝaltita" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Klienta modifado" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Klient-flanka skriptado malŝaltita" @@ -1130,6 +1392,10 @@ msgstr "Klient-flanka skriptado malŝaltita" msgid "Connecting to server..." msgstr "Konektante al servilo…" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Daŭrigi" @@ -1142,13 +1408,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1158,15 +1424,20 @@ msgstr "" "– %s: moviĝi maldekstren\n" "– %s: moviĝi dekstren\n" "– %s: salti/supreniri\n" +"- %s: fosi/bati\n" +"- %s: meti/uzi\n" "– %s: kaŝiri/malsupreniri\n" "– %s: demeti portaĵojn\n" "– %s: portaĵujo\n" "– Muso: turniĝi/rigardi\n" -"– Musklavo maldekstra: fosi/bati\n" -"– Musklavo dekstra: meti/uzi\n" "– Musrado: elekti portaĵon\n" "– %s: babili\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Kreante klienton…" @@ -1223,6 +1494,11 @@ msgstr "Malŝaltis senliman vidodistancon" 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" @@ -1296,32 +1572,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Mapeto nuntempe malŝaltita de ludo aŭ modifaĵo" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Mapeto kaŝita" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Mapeto en radara reĝimo, zomo ×1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Mapeto en radara reĝimo, zomo ×2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Mapeto en radara reĝimo, zomo ×4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Mapeto en supraĵa reĝimo, zomo ×1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Mapeto en supraĵa reĝimo, zomo ×2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Mapeto en supraĵa reĝimo, zomo ×4" +msgid "Multiplayer" +msgstr "Ludo por pluraj ludantoj" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1395,6 +1647,21 @@ msgstr "Sonsistemo ne estas subtenata de ĉi tiu muntaĵo" msgid "Sound unmuted" msgstr "Malsilentigite" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1464,10 +1731,6 @@ msgstr "Reenklavo" msgid "Caps Lock" msgstr "Majuskla baskulo" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Vakigo" - #: src/client/keycode.cpp msgid "Control" msgstr "Stiro" @@ -1715,34 +1978,40 @@ msgstr "X-Butono 2" msgid "Zoom" msgstr "Zomo" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Pasvortoj ne kongruas!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Mapeto kaŝita" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registriĝi kaj aliĝi" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Mapeto en radara reĝimo, zomo ×%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Mapeto en supraĵa reĝimo, zomo ×%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Mapeto en tekstura reĝimo" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Malsukcesis elŝuti $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" 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" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +#, fuzzy +msgid "\"Aux1\" = climb down" msgstr "«Speciala» = malsupreniri" #: src/gui/guiKeyChangeMenu.cpp @@ -1753,15 +2022,23 @@ msgstr "Memirado" msgid "Automatic jumping" msgstr "Memaga saltado" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Malantaŭen" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Ŝanĝi vidpunkton" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Babilo" @@ -1814,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" @@ -1846,10 +2122,6 @@ msgstr "Ekrankopio" msgid "Sneak" msgstr "Kaŝiri" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Speciala" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Baskuligi travidan fasadon" @@ -1890,10 +2162,6 @@ msgstr "premi klavon" 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" @@ -1902,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" @@ -1911,15 +2183,10 @@ msgid "Muted" msgstr "Silentigita" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +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). @@ -1927,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" @@ -1936,9 +2213,10 @@ msgstr "" "Se malŝaltita, virtuala stirstango centriĝos je la unua tuŝo." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Uzi virtualan stirstangon por agigi la butonon «aux».\n" @@ -1984,14 +2262,6 @@ msgstr "" "La normo estas vertikale ŝrumpita formo taŭga por insulo;\n" "egaligu ĉiujn tri nombrojn por akiri la krudan formon." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = paralaksa ombrigo kun klinaj informoj (pli rapida).\n" -"1 = reliefa mapado (pli preciza)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "2d-a bruo, kiu regas la formon/grandon de krestaj montoj." @@ -2051,6 +2321,10 @@ 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-bruo difinanta la strukturon de fluginsuloj.\n" +"Ŝanĝite de la implicita valoro, la bruo «scale» (implicite 0.7) eble\n" +"bezonos alĝustigon, ĉar maldikigaj funkcioj de fluginsuloj funkcias\n" +"plej bone kiam la bruo havas valoron inter -2.0 kaj 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2094,6 +2368,10 @@ msgstr "" "– pageflip: kvarbufra 3d-o.\n" "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" @@ -2115,9 +2393,12 @@ msgid "ABM interval" msgstr "Intertempo de ABM (aktiva modifilo de monderoj)" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ABM time budget" +msgstr "Tempobuĝeto de ABM (aktiva modifilo de monderoj)" + +#: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "Maksimumo de mondestigaj vicoj" +msgstr "Absoluta maksimumo de atendantaj estigotaj monderoj" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2165,6 +2446,10 @@ msgstr "" "Ĝustigi punktojn cole al via ekrano (ekster X11/Android), ekzemple por " "kvarmilaj ekranoj." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2174,6 +2459,16 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Alĝustigas densecon de la fluginsula tavolo.\n" +"Plialtigu la valoron por pliigi densecon. Eblas plusa aŭ minusa.\n" +"Valoro = 0.0: 50% de volumeno estas fluginsuloj.\n" +"Valoro = 2.0 (povas esti pli alta, depende de «mgv7_np_floatland»; ĉiam\n" +"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" @@ -2194,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 @@ -2272,6 +2568,10 @@ msgstr "" "plibonigon.\n" "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" @@ -2292,6 +2592,16 @@ msgstr "Memori grandecon de ekrano" msgid "Autoscaling mode" msgstr "Reĝimo de memaga skalado" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Salta klavo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "Speciala klavo por supreniri/malsupreniri" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Malantaŭen" @@ -2304,10 +2614,6 @@ msgstr "Baza ternivelo" 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" @@ -2329,21 +2635,22 @@ 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 msgid "Biome noise" msgstr "Klimata bruo" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bitoj bildere (aŭ kolornombro) en tutekrana reĝimo." - #: src/settings_translation_file.cpp 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" @@ -2369,8 +2676,9 @@ msgid "Builtin" msgstr "Primitivaĵo" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Mapado de elstaraĵoj" +#, fuzzy +msgid "Camera" +msgstr "Ŝanĝi vidpunkton" #: src/settings_translation_file.cpp msgid "" @@ -2450,20 +2758,14 @@ msgstr "" "Kie 0.0 estas minimuma lumnivelo, 1.0 estas maksimuma numnivelo." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Ŝanĝoj al fasado de la ĉefmenuo:\n" -"- full (plena): Pluraj mondoj por unu ludanto, elektilo de ludo, " -"teksturaro, ktp.\n" -"- simple (simpla): Unu mondo por unu ludanto, neniuj elektiloj de ludo aŭ " -"teksturaro.\n" -"Povus esti bezona por malgrandaj ekranoj." +#, fuzzy +msgid "Chat command time message threshold" +msgstr "Sojlo de babilaj mesaĝoj antaŭ forpelo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Babilaj komandoj" #: src/settings_translation_file.cpp msgid "Chat font size" @@ -2474,9 +2776,8 @@ msgid "Chat key" msgstr "Babila klavo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Erarserĉa protokola nivelo" +msgstr "Babileja protokola nivelo" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2499,8 +2800,9 @@ msgid "Chat toggle key" msgstr "Babila baskula klavo" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Babilaj komandoj" +#, fuzzy +msgid "Chat weblinks" +msgstr "Babilo montrita" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2518,6 +2820,12 @@ msgstr "Klavo de glita vidpunkto" msgid "Clean transparent textures" msgstr "Puraj travideblaj teksturoj" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Kliento" @@ -2538,6 +2846,11 @@ msgstr "Limigoj de klient-flanka modifado" 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" @@ -2562,6 +2875,10 @@ msgstr "Nuboj en ĉefmenuo" msgid "Colored fog" msgstr "Kolora nebulo" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Koloraj ombroj" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2603,6 +2920,38 @@ msgstr "" msgid "Command key" msgstr "Komanda klavo" +#: 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 "" +"Nivelo de desigo per ZLib uzota por densigi mondopecojn dum konservado sur " +"disko.\n" +"-1 - la implicita nivelo de densigo per Zlib\n" +"0 - neniu densigo, plej rapida\n" +"9 - plej bona densigo, plej malrapida\n" +"(niveloj 1-3 uzas la \"rapidan\" metodon de Zlib; 4-9 uzas la ordinaran " +"metodon)" + +#: 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 "" +"Nivelo de desigo per ZLib uzota por densigi mondopecojn dum sendado al " +"kliento.\n" +"-1 - la implicita nivelo de densigo per Zlib\n" +"0 - neniu densigo, plej rapida\n" +"9 - plej bona densigo, plej malrapida\n" +"(niveloj 1-3 uzas la \"rapidan\" metodon de Zlib; 4-9 uzas la ordinaran " +"metodon)" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Kunfandi vitron" @@ -2627,10 +2976,19 @@ msgstr "Koloro de konzolo" 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" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Maksimuma nombro de samtempaj elŝutoj de ContentDB" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "URL de la datena deponejo" @@ -2662,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." @@ -2696,16 +3056,25 @@ msgid "Crosshair alpha" msgstr "Travidebleco de celilo" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Travidebleco de celilo (maltravidebleco, inter 0 kaj 255)." +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Travidebleco de celilo (maltravidebleco, inter 0 kaj 255).\n" +"Ankaŭ determinas la koloron de la celilo de objekto" #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Koloro de celilo" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Koloro de celilo (R,V,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Koloro de celilo (Ruĝo, Verdo, Bluo).\n" +"Ankaŭ determinas la koloron de la celilo de objekto" #: src/settings_translation_file.cpp msgid "DPI" @@ -2728,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" @@ -2768,17 +3137,15 @@ msgid "Default report format" msgstr "Implicita raporta formo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Norma ludo" +msgstr "Implicita grandeco de la kolumno" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Implicita tempolimo por cURL, milisekunde.\n" -"Nur efektiviĝas programtradukite kun cURL." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2810,14 +3177,6 @@ msgstr "Difinas vastan sturkturon de akvovojo." msgid "Defines location and terrain of optional hills and lakes." msgstr "Difinas lokon kaj terenon de malnepraj montetoj kaj lagoj." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Difinas glatigan paŝon de teksturoj.\n" -"Pli alta valoro signifas pli glatajn normalmapojn." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Difinas la bazan ternivelon." @@ -2897,6 +3256,15 @@ msgstr "" 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" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Fosaj partikloj" @@ -2909,6 +3277,16 @@ msgstr "Malŝalti senartifikigon" msgid "Disallow empty passwords" msgstr "Malpermesi malplenajn pasvortojn" +#: src/settings_translation_file.cpp +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." @@ -2957,18 +3335,35 @@ msgstr "" "Ŝalti klient-flankajn Lua-modifojn.\n" "Tiu ĉi funkcio estas prova kaj la API eble ŝanĝontas." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Ŝalti konzolan fenestron" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Ŝalti krean reĝimon por novaj mapoj." +msgid "Enable creative mode for all players" +msgstr "Ŝalti krean reĝimon por ĉiuj ludantoj" #: src/settings_translation_file.cpp 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." @@ -2985,18 +3380,6 @@ msgstr "Ŝalti difektadon kaj mortadon de ludantoj." 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" @@ -3005,6 +3388,10 @@ msgstr "" "Ŝalti glatan lumadon kun simpla media ombrado.\n" "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" @@ -3014,7 +3401,7 @@ msgid "" "expecting." msgstr "" "Ŝalti por malpermesi konekton de malnovaj klientoj.\n" -"Malnovaj klientoj estas kongruaj tiel, ke ili ne fiaskas konektante al novaj " +"Malnovaj klientoj estas akordaj tiel, ke ili ne fiaskas konektante al novaj " "serviloj,\n" "sed eble ili ne subtenos ĉiujn atendatajn funkciojn." @@ -3071,18 +3458,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Ŝaltas movbildojn en portaĵujo." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Ŝaltas mapadon de elstaraĵoj por teksturoj. Normalmapoj devas veni kun la " -"teksturaro,\n" -"aŭ estiĝi memage.\n" -"Bezonas ŝaltitajn ombrigilojn." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Ŝaltas kaŝmemoradon de maŝoj turnitaj per «facedir»." @@ -3091,22 +3466,6 @@ msgstr "Ŝaltas kaŝmemoradon de maŝoj turnitaj per «facedir»." msgid "Enables minimap." msgstr "Ŝaltas mapeton." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Ŝaltas dumludan estigadon de normalmapoj (Reliefiga efekto).\n" -"Bezonas ŝaltitan mapadon de elstaraĵoj." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Ŝaltas mapadon de paralaksa ombrigo.\n" -"Bezonas ŝaltitajn ombrigilojn." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3119,6 +3478,17 @@ msgstr "" "ne funkcios.\n" "Ŝanĝo de ĉi tiu agordo postulos restartigon." +#: 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 "" + +#: 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" @@ -3127,14 +3497,6 @@ msgstr "Intervalo inter presoj de profilaj datenoj de la motoro" msgid "Entity methods" msgstr "Metodoj de estoj" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Prova elekteblo; povas estigi videblajn spacojn inter monderoj\n" -"je nombro super 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3144,10 +3506,21 @@ 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 "" +"Eksponento de maldikigo de fluginsuloj. Ŝanĝas la konduton\n" +"de maldikigo.\n" +"Valoro = 1.0 kreas unuforman, linearan maldikigon.\n" +"Valoroj > 1.0 kreas glatan maldikigon taŭgan por la implicitaj apartaj\n" +"fluginsuloj.\n" +"Valoroj < 1.0 (ekzemple 0.25) kreas pli difinitan ternivelon kun\n" +"pli plataj malaltejoj, taŭgaj por solida tavolo de fluginsulaĵo." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "Kadroj sekunde en paŭza menuo" +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" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3165,18 +3538,6 @@ msgstr "Koeficiento de balancado dum falo" msgid "Fallback font path" msgstr "Dosierindiko al reenpaŝa tiparo" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Ombro de reenpaŝa tiparo" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Travidebleco de ombro de la reenpaŝa tiparo" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Grando de reenpaŝa tiparo" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Rapida klavo" @@ -3194,8 +3555,9 @@ msgid "Fast movement" msgstr "Rapida moviĝo" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "Rapida moviĝo (per la klavo «speciala»).\n" @@ -3232,11 +3594,12 @@ msgid "Filmic tone mapping" msgstr "Filmeca mapado de tono" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Filtritaj teksturoj povas intermiksi RVB valorojn kun plene travideblaj\n" "apud-bilderoj, kiujn PNG bonigiloj kutime forigas, farante helan aŭ\n" @@ -3245,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." @@ -3266,39 +3630,32 @@ msgid "Fixed virtual joystick" msgstr "Fiksita virtuala stirstango" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "Denseco de fluginsulaj montoj" +msgstr "Denseco de fluginsuloj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "Maksimuma Y de forgeskelo" +msgstr "Maksimuma Y de fluginsuloj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "Minimuma Y de forgeskeloj" +msgstr "Minimuma Y de fluginsuloj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Baza bruo de fluginsuloj" +msgstr "Bruo de fluginsuloj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "Eksponento de fluginsulaj montoj" +msgstr "Eksponento de maldikigo de fluginsuloj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "Baza bruo de fluginsuloj" +msgstr "Distanco de maldikigo de fluginsuloj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "Alteco de fluginsuloj" +msgstr "Akvonivelo de fluginsuloj" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3320,6 +3677,11 @@ msgstr "Komenco de nebulo" 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" @@ -3341,15 +3703,17 @@ msgid "Font size" msgstr "Tipara grandeco" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "Grando de la implicita tiparo, punkte (pt)." #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Grandeco de la reenpaŝa tiparo, punkte (pt)." - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +#, fuzzy +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "Grandeco de la egallarĝa tiparo, punkte (pt)." #: src/settings_translation_file.cpp @@ -3357,6 +3721,19 @@ msgid "" "Font size of the recent chat text and chat prompt in point (pt).\n" "Value 0 will use the default font size." msgstr "" +"Grandeco de tiparo de freŝa babila teksto kaj babilujo en punktoj (pt).\n" +"Valoro 0 uzos la implicitan grandecon de tiparo." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -3420,10 +3797,6 @@ msgstr "Speco de fraktalo" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Ono de la videbla distanco, ekde kiu nebulo bildiĝas" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Tiparoj «FreeType»" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3456,10 +3829,6 @@ msgstr "" msgid "Full screen" msgstr "Tutekrane" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Kolornombro tutekrane" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Tutekrana reĝimo." @@ -3477,19 +3846,33 @@ msgid "GUI scaling filter txr2img" msgstr "Skala filtrilo de grafika interfaco txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Estigi normalmapojn" +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" #: 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 junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" +"Ĉieaj atributoj de mondestigo.\n" +"En mondestigo v6, la parametro «decorations» regas ĉiujn ornamojn\n" +"krom arboj kaj ĝangala herbo; en ĉiuj ailaj mondestigiloj, ĉi tiu parametro\n" +"regas ĉiujn ornamojn." #: src/settings_translation_file.cpp msgid "" @@ -3511,6 +3894,16 @@ msgstr "" 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" @@ -3528,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" @@ -3538,15 +3936,14 @@ msgstr "Baskula klavo por travida fasado" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Traktado de evitindaj Lua-API-vokoj:\n" -"- hereda: (provi) imiti la malnovan konduton (norma por eldono).\n" -"- protokola: imiti kaj protokoli respuron de evitindaj vokoj (norma por " -"erarserĉado).\n" -"- erara: ĉesigi je evitinda voko (proponata al evoluigistoj de modifaĵoj)." +"- none: ne prokoli evitindajn vokojn\n" +"- log: imiti kaj protokoli respuron de evitindaj vokoj (implicita).\n" +"- error: ĉesigi je evitinda voko (proponata al evoluigistoj de modifaĵoj)." #: src/settings_translation_file.cpp msgid "" @@ -3570,7 +3967,9 @@ msgid "Heat noise" msgstr "Varmeca bruo" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "Alteco de la fenestro je ĝia komenca grando." #: src/settings_translation_file.cpp @@ -3581,10 +3980,6 @@ msgstr "Alteca bruo" msgid "Height select noise" msgstr "Bruo de elekto de alto" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Preciza glitkoma datentraktilo (FPU)" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Kruteco de montetoj" @@ -3618,7 +4013,7 @@ msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" -"Horizontala akcelo en aero dum saltado aŭ falado,\n" +"Horizontala akcelo en aero dum saltado aŭ falado, \n" "en monderoj sekunde sekunde." #: src/settings_translation_file.cpp @@ -3788,13 +4183,22 @@ 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." @@ -3824,13 +4228,13 @@ msgid "" "If FPS would go higher than this, limit it by sleeping\n" "to not waste CPU power for no benefit." msgstr "" -"Se filmeroj sekunde superas ĉi tion, limigu ilin per dormo,\n" -"por ne malŝpari vane potencon de datentraktilo." +"Se la nombro de kadroj superas ĉi tion, limigu ilin per dormo,\n" +"por ne malŝpari vane potencon de procesoro." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" "Malŝaltite, postulas uzon de la «speciala» klavo se ambaŭ la fluga kaj\n" @@ -3859,13 +4263,23 @@ msgstr "" "Por tio necesas la rajto «noclip» servile." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3895,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 @@ -3917,6 +4334,12 @@ msgstr "" "vokoj\n" "al get_node limiĝas al ĉi tiu distanco inter la ludanto kaj la mondero." +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3937,10 +4360,6 @@ msgstr "Ŝaltite, ludantoj ĉiam renaskiĝos je la donita loko." 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 "" @@ -3971,7 +4390,8 @@ msgstr "" "Ĉi tion normale bezonas nur evoluigistoj de kerno/primitivoj" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Ekzameni babilajn komandojn je registriĝo." #: src/settings_translation_file.cpp @@ -3992,21 +4412,19 @@ msgstr "" msgid "" "Instrument the action function of Loading Block Modifiers on registration." msgstr "" +"Ekzameni la agan funkcion de Ŝargaj Modifiloj de Monderoj je registriĝo." #: src/settings_translation_file.cpp 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 @@ -4035,7 +4453,7 @@ msgstr "Dosierindiko al kursiva egallarĝa tiparo" #: src/settings_translation_file.cpp msgid "Item entity TTL" -msgstr "" +msgstr "Daŭro de lasita portaĵo" #: src/settings_translation_file.cpp msgid "Iterations" @@ -4062,6 +4480,11 @@ msgstr "Identigilo de stirstango" msgid "Joystick button repetition interval" msgstr "Ripeta periodo de stirstangaj klavoj" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "Nerespondema zono de stirstango" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Sentemo de stirstanga vidamplekso" @@ -4164,6 +4587,16 @@ msgstr "" "Vidu http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klavo por fosi.\n" +"Vidu http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4306,6 +4739,16 @@ msgstr "" "Vidu http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klavo por meti.\n" +"Vidu http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4840,6 +5283,10 @@ msgstr "" "Vidu http://irrlicht.sourceforge.net/docu/namespaceirr." "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." @@ -4897,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" @@ -4915,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" @@ -4935,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" @@ -4968,7 +5424,12 @@ msgstr "Alta transiro de luma kurbo" #: src/settings_translation_file.cpp msgid "Light curve low gradient" -msgstr "" +msgstr "Malalta transiro de luma kurbo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Glata lumado" #: src/settings_translation_file.cpp msgid "" @@ -5038,25 +5499,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Loading Block Modifiers" -msgstr "Enlegante Modifilojn de Monderoj" +msgstr "Ŝargaj Modifiloj de Monderoj" #: src/settings_translation_file.cpp msgid "Lower Y limit of dungeons." msgstr "Suba Y-limo de forgeskeloj." #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "Suba Y-limo de forgeskeloj." +msgstr "Suba Y-limo de fluginsuloj." #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "Ĉefmenua skripto" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Stilo de ĉefmenuo" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5064,15 +5520,18 @@ msgstr "" "Dependigi kolorojn de nebulo kaj ĉielo de tagtempo (sunleviĝo/sunsubiro)\n" "kaj direkto de rigardo." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"Funkciigas programaron «DirectX» kun «LuaJIT». Malŝaltu okaze de problemoj." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Igas fluaĵojn netravideblaj" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Nivelo de densigo de mondopecoj por konservado sur disko" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Nivelo de densigo de mondopecoj por sendado tra reto" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Dosierujo kun mapoj" @@ -5132,15 +5591,16 @@ msgstr "" "kaj la flago «jungles» estas malatentata." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Mapestigilaj ecoj speciale por Mapestigilo v7.\n" -"«ridges» ŝaltas la riverojn." +"Mapestigaj ecoj speciale por Mapestigilo v7.\n" +"«ridges»: Riveroj.\n" +"«floatlands»: Flugantaj teramasoj en la atmosfero.\n" +"«caverns»: Grandaj kavernegoj profunde sub tero." #: src/settings_translation_file.cpp msgid "Map generation limit" @@ -5150,17 +5610,22 @@ msgstr "Limo de mondestigo" msgid "Map save interval" msgstr "Intervaloj inter konservoj de mondo" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Longeco de fluaĵa agociklo" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Mondopeca limo" #: src/settings_translation_file.cpp msgid "Mapblock mesh generation delay" -msgstr "" +msgstr "Prokrasto de estigo de maŝoj de mondopecoj" #: src/settings_translation_file.cpp msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "" +msgstr "Grando (en megabitokoj) de la kaŝmemoro de la estiganto de mondopecoj" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" @@ -5252,11 +5717,17 @@ msgstr "Maksimumaj paketoj iteracie" #: src/settings_translation_file.cpp msgid "Maximum FPS" -msgstr "Maksimumaj KS" +msgstr "Maksimuma nombro de kadroj en sekundo" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Maksimumaj KS paŭze." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"Maksimuma nombro de kadroj en sekundo, kiam la fokuso mankas al la fenestro, " +"aŭ dum paŭzo de la ludo." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5299,22 +5770,30 @@ msgid "Maximum number of blocks that can be queued for loading." msgstr "Maksimuma nombro da mondopecoj atendantaj legon." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "This limit is enforced per player." msgstr "" "Maksimumo nombro de mondopecoj atendantaj estigon.\n" -"Vakigu por memaga elekto de ĝusta kvanto." +"Ĉi tiu limo estas devigata al ĉiu ludanto aparte." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" "Maksimuma nombro de atendantaj mondopecoj legotaj de loka dosiero.\n" -"Agordi vake por memaga elekto de ĝusta nombro." +"Ĉi tiu limo estas devigata al ĉiu ludanto aparte." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Maksimuma nombro de samtempaj elŝutoj. Elŝutoj superantaj ĉi tiun limon " +"estos atendataj.\n" +"Tiu nombro devas esti malpli granda ol curl_parallel_limit." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." @@ -5380,17 +5859,22 @@ msgstr "" "0 malŝaltas envicigon, kaj -1 senlimigas ĝin." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +#, fuzzy +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" "Maksimuma tempo (en milisekundoj) por elŝuto de dosiero (ekz. modifaĵo)." #: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "Maksimuma nombro da uzantoj" +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" #: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Menuoj" +msgid "Maximum users" +msgstr "Maksimuma nombro da uzantoj" #: src/settings_translation_file.cpp msgid "Mesh cache" @@ -5410,7 +5894,7 @@ msgstr "Metodo emfazi elektitan objekton." #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "Minimuma nivelo de protokolado skribota al la babilujo." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5440,12 +5924,27 @@ msgstr "Minimuma grandeco de teksturoj" 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" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +#, fuzzy +msgid "Modifies the size of the HUD elements." msgstr "Ŝanĝas la grandecon de eroj de la travida fasado." #: src/settings_translation_file.cpp @@ -5456,6 +5955,11 @@ msgstr "Dosierindiko al egallarĝa tiparo" msgid "Monospace font size" msgstr "Grandeco de egalspaca tiparo" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "Grandeco de egalspaca tiparo" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Bruo de monta alteco" @@ -5529,13 +6033,8 @@ msgid "" msgstr "Nomo de la servilo, montrota al ludantoj kaj en la listo de serviloj." #: src/settings_translation_file.cpp -#, fuzzy msgid "Near plane" -msgstr "Proksime tonda ebeno" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Reto" +msgstr "Proksima ebeno" #: src/settings_translation_file.cpp msgid "" @@ -5545,6 +6044,11 @@ msgstr "" "Ricevigota pordo (UDP).\n" "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." @@ -5557,6 +6061,11 @@ msgstr "Trapasado" 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" @@ -5569,20 +6078,11 @@ msgstr "Intervalo de NodeTimer" msgid "Noises" msgstr "Bruoj" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Normalmapa specimenado" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Normalmapa potenco" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Nombro da mondestigaj fadenoj" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Number of emerge threads to use.\n" "Value 0:\n" @@ -5596,9 +6096,6 @@ msgid "" "'on_generated'. For many users the optimum setting may be '1'." msgstr "" "Nombro de uzotaj fadenoj enlegontaj.\n" -"AVERTO: Nun ekzistas pluraj eraroj, kiuj povus estigi kolapson kiam\n" -"«num_emerge_threads» pli grandas ol 1. Ĝis ĉi tiu averto foriĝos, ni\n" -"forte rekomendas ke ĉi tiu valoro restu je la norma «1».\n" "Valoro 0:\n" "- Memaga elekto. La nombro de fadenoj enlegontaj estos\n" "- 'nombro de datentraktiloj - 2', kun suba limo de 1.\n" @@ -5613,23 +6110,16 @@ msgstr "" "uzantoj, la optimuma agordo eble estos «1»." #: 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Nombro da aldonaj mondopecoj legontaj de «/clearobjects» je unu fojo.\n" "Ĉi tio decidas preferon inter superŝarĝaj negocoj de «sqlite»\n" "kaj uzon de memoro (4096=100MB, proksimume)." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Nombro da iteracioj de paralaksa ombrigo." - -#: 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" @@ -5640,12 +6130,6 @@ msgid "" msgstr "" "Netravidebleco (alfa) de la ombro post la implicita tiparo, inter 0 kaj 255." -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" -"Netravidebleco (alfa) de la ombro post la reenpaŝa tiparo, inter 0 kaj 255." - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5657,38 +6141,13 @@ msgstr "" "fenestro estas malfermita." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Entuta ekarto de la efiko de paralaksa ombrigo, kutime skalo/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Entuta vasteco de paralaksa ombrigo." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Paralaksa ombrigo" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Ekarto de paralaksa okludo" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Iteracioj de paralaksa ombrigo" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Reĝimo de paralaksa ombrigo" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Skalo de paralaksa ombrigo" +msgid "Optional override for chat weblink color." +msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5704,6 +6163,8 @@ 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 "" +"Dosierindiko por konservotaj ekrankopioj. Povas esti absoluta\n" +"aŭ relativa. La dosierujo estos kreita, se ĝi ne jam ekzistas." #: src/settings_translation_file.cpp msgid "" @@ -5718,10 +6179,9 @@ msgid "Path to texture directory. All textures are first searched from here." msgstr "Dosierindiko al teksturoj. Ĉiuj teksturoj estas unue serĉataj tie." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" "Dosierindiko al la implicita tiparo.\n" @@ -5731,10 +6191,9 @@ msgstr "" "La reenpaŝa tiparo uziĝos se la tiparo ne povas enlegiĝi." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" "Dosierindiko al la egallarĝa tiparo.\n" @@ -5749,12 +6208,11 @@ msgstr "Paŭzigi je perdita fokuso de la fenestro" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" -msgstr "" +msgstr "Limo de atendataj monderoj ŝargotaj el disko por unu ludanto" #: src/settings_translation_file.cpp -#, fuzzy msgid "Per-player limit of queued blocks to generate" -msgstr "Limo de viceroj estigotaj" +msgstr "Limo de viceroj estigotaj por unu ludanto" #: src/settings_translation_file.cpp msgid "Physics" @@ -5768,6 +6226,14 @@ msgstr "Celilsekva klavo" msgid "Pitch move mode" msgstr "Celilsekva reĝimo" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Klavo por meti" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Intertempo inter ripetaj metoj" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5776,10 +6242,6 @@ msgstr "" "Ludanto povas flugi sed efiko de pezforto.\n" "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" @@ -5788,6 +6250,10 @@ msgstr "Distanco por transsendo de ludantoj" msgid "Player versus player" msgstr "Ludanto kontraŭ ludanto" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Poisson-filtrado" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5830,21 +6296,22 @@ msgstr "Profililo" 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 "" +msgstr "Aŭskulta adreso de Prometheus" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"Aŭskulta adreso de Prometheus.\n" +"Se Minetest estas tradukita kun la elekteblo ENABLE_PROMETHEUS ŝaltita,\n" +"ŝaltiĝos aŭskultado de mezuriloj por Prometheus ĉe tiu adreso.\n" +"Mezuriloj disponeblos ĉe http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." @@ -5947,10 +6414,6 @@ msgstr "Bruo de grandeco de krestaj montoj" msgid "Right key" msgstr "Dekstren-klavo" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Periodo inter ripetoj de dekstra klako" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Profundeco de rivera akvovojo" @@ -6025,6 +6488,11 @@ msgstr "" "malskalante, kontraŭ malklarigo de kelkaj limaj bilderoj, malskalante\n" "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" @@ -6055,6 +6523,11 @@ msgstr "" "1 estas plej malaltkvalita; 100 estas plej altkvalita.\n" "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" @@ -6068,10 +6541,6 @@ msgstr "" 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" @@ -6131,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" @@ -6158,10 +6638,20 @@ msgstr "Pordo de servilo" 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" @@ -6175,10 +6665,42 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Ŝaltu por ebligi ondantajn foliojn.\n" +"Bezonas ombrigilojn." + #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving leaves.\n" @@ -6203,6 +6725,13 @@ msgstr "" "Verigo ŝaltas ondantajn kreskaĵojn.\n" "Bezonas ŝalton de ombrigiloj." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Indiko al ombrigiloj" @@ -6218,6 +6747,24 @@ msgstr "" "kelkaj vidkartoj.\n" "Ĉi tio funkcias nur kun la bildiga internaĵo de «OpenGL»." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "Ekrankopia kvalito" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "Minimuma grandeco de teksturoj" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6226,11 +6773,9 @@ 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 offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"Deŝovo de tipara ombro (en bilderoj); se ĝi estas 0, la ombro ne desegniĝos." +#, fuzzy +msgid "Shadow strength gamma" +msgstr "Forto de ombro" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6244,6 +6789,19 @@ msgstr "Montri erarserĉajn informojn" msgid "Show entity selection boxes" msgstr "Montri elektujojn de estoj" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Montri elektujojn de estoj\n" +"Rerulo necesas post la ŝanĝo." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "Implicite montri fonojn de nometikedoj" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Ferma mesaĝo" @@ -6274,6 +6832,10 @@ msgstr "" "plialtigos la elcenton de kaŝmemoraj trafoj, kaj malpliigos la datenojn\n" "kopiatajn de la ĉefa fadeno, malhelpante skuadon." +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "Tranĉo w" @@ -6292,7 +6854,7 @@ msgstr "Minimuma nombro de etaj kavernoj" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." -msgstr "" +msgstr "Malgranda variado de malsekeco por kontinuigi klimatojn ĉe limoj." #: src/settings_translation_file.cpp msgid "Small-scale temperature variation for blending biomes on borders." @@ -6330,18 +6892,14 @@ msgstr "Rapido de kaŝiro" msgid "Sneaking speed, in nodes per second." msgstr "Rapido de kaŝirado, en monderoj sekunde." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Radiuso de mola ombro" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Sono" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Speciala klavo" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Speciala klavo por supreniri/malsupreniri" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6360,6 +6918,17 @@ msgid "" "Note that mods or games may explicitly set a stack for certain (or all) " "items." msgstr "" +"Specifas la implicitajn kolumnograndojn de monderoj, portaĵoj kaj iloj.\n" +"Notu, ke modifaĵoj aŭ ludoj povas eksplicite agordi kolumnograndojn por iuj " +"(aŭ ĉiuj) portaĵoj." + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -6388,13 +6957,8 @@ msgid "Step mountain spread noise" msgstr "Bruo de disvastiĝo de terasaj montoj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." -msgstr "Potenco de paralakso." - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Forteco de estigitaj normalmapoj." +msgstr "Potenco de paralakso en tridimensia reĝimo." #: src/settings_translation_file.cpp msgid "" @@ -6427,6 +6991,18 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"Surfaca nivelo de ebla akvo sur solida fluginsula tavolo.\n" +"Tia akvo estas malŝaltita implicite kaj ĉeestos nur se ĉi tiu valoro estas\n" +"pli granda ol 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (la komenco de " +"la\n" +"supra maldikiĝo).\n" +"***AVERTO, EBLA DANĜERO AL MONDOJ KAJ SERVILA RENDIMENTO***:\n" +"Se vi ebligas akvon sur fluginsuloj, la fluginsuloj devas esti solidaj " +"tavoloj.\n" +"Por tio, la agordo 'mgv7_floatland_density' devas esti '2.0' (aŭ alia\n" +"postulata valoro depende de 'mgv7_np_floatland'). Tio evitos\n" +"servil-intensan ekstreman akvofluon kaj vastan inundadon de la\n" +"suba mondsurfaco." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6436,6 +7012,11 @@ msgstr "Akorda SQLite" 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" @@ -6484,6 +7065,13 @@ msgstr "Bruo de persisteco de tereno" msgid "Texture path" msgstr "Indiko al teksturoj" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6504,6 +7092,11 @@ msgstr "" msgid "The URL for the content repository" msgstr "URL al la deponejo de enhavo" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "The dead zone of the joystick" +msgstr "La nerespondema zono de la stirstango" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6567,28 +7160,37 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" +"La volumena radiuso, mezurita en mondopecoj (16 monderoj),\n" +"de monderoj ĉirkaŭ ĉiu ludanto submetataj al la trajtoj de aktivaj " +"monderoj. \n" +"En aktivaj monderoj, objektoj enlegiĝas kaj aktivaj modifiloj de monderoj " +"(ABM) ruliĝas.\n" +"Ĉi tio ankaŭ estas la minimuma vidodistanco, en kiu teniĝas aktivaj objektoj " +"(estuloj).\n" +"Ĉi tio devas esti agordita kune kun active_object_send_range_blocks." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"La bildiga internaĵo por Irrlicht.\n" -"Rerulo necesas post ĉi tiu ŝanĝo.\n" +"La bildiga internaĵo.\n" +"Relanĉo necesas post ĉi tiu ŝanĝo.\n" "Rimarko: Sur Androido, restu ĉe OGLES1, se vi ne certas! Aplikaĵo alie " "povus\n" -"malsukcesi ruliĝon. Sur aliaj sistemoj, OpenGL estas rekomendata, kaj " -"nuntempe\n" -"estas la sola pelilo subtenanta ombrigilojn." +"malsukcesi ruliĝon. Sur aliaj sistemoj, OpenGL estas rekomendata.\n" +"Ombrigiloj estas subtenataj de OpenGL (nur sur tablaj komputiloj) kaj OGLES2 " +"(eksperimente)" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "Sentemo de la stirstangaj aksoj por movadi la\n" "enludan vidamplekson." @@ -6615,6 +7217,14 @@ msgstr "" "la datentraktan kapablon, ĝis oni provos ĝin malgrandigi per forĵeto de\n" "malnovaj viceroj. Nula valoro malŝaltas la funkcion." +#: 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 "" +"Tempobuĝeto por rulado de ABM (aktiva modifilo de monderoj) dum ĉiu paŝo\n" +"(kiel frakcio de la intertempo de ABM)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6625,11 +7235,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"Tempo (en sekundoj) inter ripetaj klakoj dum premo de la dekstra musbutono." +"Tempo (en sekundoj) inter ripetaj metoj de monderoj dum premado de\n" +"la butono por meti." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6670,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 @@ -6697,6 +7308,19 @@ msgstr "Prokrasto de ŝpruchelpilo" 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" @@ -6752,9 +7376,8 @@ msgid "Upper Y limit of dungeons." msgstr "Supra Y-limo de forgeskeloj." #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "Supra Y-limo de forgeskeloj." +msgstr "Supra Y-limo de fluginsuloj." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6773,8 +7396,9 @@ msgid "Use bilinear filtering when scaling textures." msgstr "Uzi dulinearan filtradon skalante teksturojn." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" @@ -6782,10 +7406,33 @@ msgstr "" "precipe dum uzo de teksturaro je alta distingumo.\n" "Gamae ĝusta malgrandigado ne estas subtenata." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Uzi multspecimenan glatigon (MSAA) por glatigi randojn de monderoj.\n" +"Tiu algoritmo glatigas la tridimensian vidon, ne malklarigante la bildon.\n" +"Tamen, ĝi ne ŝanĝas la internon de teksturoj\n" +"(kio estas speciale rimarkebla pri travideblaj teksturoj).\n" +"Videblaj spacoj aperas inter monderoj, se ombrigiloj estas malŝaltitaj.\n" +"Se la valoro de ĉi tiu elekteblo estas 0, multspecimena glatigo estas " +"malŝaltita.\n" +"Vi devas relanĉi post ŝanĝo de ĉi tiu elekteblo." + #: src/settings_translation_file.cpp 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" @@ -6812,7 +7459,7 @@ msgstr "Deklivo de valoj" #: src/settings_translation_file.cpp msgid "Variation of biome filler depth." -msgstr "" +msgstr "Vario de profundoj de surfacoj de klimato." #: src/settings_translation_file.cpp msgid "Variation of maximum mountain height (in nodes)." @@ -6884,7 +7531,8 @@ msgid "Viewing range" msgstr "Vidodistanco" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +#, fuzzy +msgid "Virtual joystick triggers Aux1 button" msgstr "Virtuala stirstango premas specialan klavon" #: src/settings_translation_file.cpp @@ -6962,6 +7610,11 @@ msgstr "Longo de ondoj de ondantaj fluaĵoj" msgid "Waving plants" msgstr "Ondantaj plantoj" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Koloro de elektujo" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6985,14 +7638,14 @@ msgstr "" "bone elŝutadon de teksturoj de la aparataro." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7007,13 +7660,13 @@ msgstr "" "grandigado de monde laŭigitaj teksturoj." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Ĉu tiparoj de FreeType uziĝas; postulas entradukitan subtenon de FreeType.\n" -"Malŝaltite, ĉi tio anstataŭe uzigas tiparojn bitbildajn kaj XML-vektorajn." +"Ĉu implicite montri fonojn de nometikedoj.\n" +"Modifaĵoj malgraŭ tio povas agordi fonojn." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7055,6 +7708,15 @@ msgstr "" "Enlude, vi povas ŝalti la staton de silentigo per la silentiga klavo,\n" "aŭ per la paŭza menuo." +#: 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)." @@ -7062,8 +7724,9 @@ msgstr "" "Ĉu montri erarserĉajn informojn de la kliento (efikas samkiel premo de F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Larĝeco de la fenestro je ĝia komenca grando." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Larĝo de la fenestro je ĝia komenca grando. Ignorata en plenekrana reĝimo." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7108,7 +7771,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" -msgstr "Reĝimo de monde laŭigitaj tekstruoj" +msgstr "Reĝimo de monde laŭigitaj teksturoj" #: src/settings_translation_file.cpp msgid "Y of flat ground." @@ -7137,6 +7800,10 @@ msgid "" "For a solid floatland layer, this controls the height of hills/mountains.\n" "Must be less than or equal to half the distance between the Y limits." msgstr "" +"Y-distanco, ekde kiu fluginsuloj maldikiĝas de plena denso al nenio.\n" +"Maldikiĝo komenciĝas ĉe ĉi tiu distanco de la Y-limo.\n" +"Sur solida fluginsula tavolo, tio regas la altojn de montetoj/montoj.\n" +"Devas esti ne pli ol duono de la distanco inter la Y-limoj." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." @@ -7158,117 +7825,37 @@ msgstr "Y-nivelo de malsupra tereno kaj marfundo." 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" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "Interaga tempolimo de cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Samtempa limo de cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL tempolimo" +#~ msgid "- Creative Mode: " +#~ msgstr "– Krea reĝimo: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Baskuligi glitan vidpunkton" - -#~ msgid "Select Package File:" -#~ msgstr "Elekti pakaĵan dosieron:" - -#, fuzzy -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Y de supera limo de grandaj kvazaŭ-hazardaj kavernoj." - -#~ msgid "Waving Water" -#~ msgstr "Ondanta akvo" - -#~ msgid "Projecting dungeons" -#~ msgstr "Planante forgeskelojn" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Y-nivelo kien etendiĝas ombroj de fluginsuloj." - -#~ msgid "Waving water" -#~ msgstr "Ondanta akvo" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variaĵo de alteco de montetoj kaj profundeco de lagoj sur glata tereno de " -#~ "fluginsuloj." +#~ msgid "- Damage: " +#~ msgstr "– Difekto: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Ordinara plejalto, super kaj sub la mezpunkto, de fluginsulaj montoj." +#~ "0 = paralaksa ombrigo kun klinaj informoj (pli rapida).\n" +#~ "1 = reliefa mapado (pli preciza)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Tiu ĉi tiparo uziĝos por iuj lingvoj." - -#~ msgid "Shadow limit" -#~ msgstr "Limo por ombroj" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Dosierindiko al tiparo «TrueType» aŭ bitbildo." - -#~ msgid "Lightness sharpness" -#~ msgstr "Akreco de heleco" - -#~ msgid "Lava depth" -#~ msgstr "Lafo-profundeco" - -#~ msgid "IPv6 support." -#~ msgstr "Subteno de IPv6." - -#~ msgid "Gamma" -#~ msgstr "Helĝustigo" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Maltravidebleco de tipara ombro (inter 0 kaj 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Alteco de fluginsulaj montoj" - -#~ msgid "Floatland base height noise" -#~ msgstr "Bruo de baza alteco de fluginsuloj" - -#~ msgid "Enable VBO" -#~ msgstr "Ŝalti VBO(Vertex Buffer Object)" - -#~ msgid "" -#~ "Deprecated, define and locate cave liquids using biome definitions " -#~ "instead.\n" -#~ "Y of upper limit of lava in large caves." -#~ msgstr "" -#~ "Evitinda, difini kaj trovi kavernajn fluaĵojn anstataŭe per klimataj " -#~ "difinoj\n" -#~ "Y de supra limo de lafo en grandaj kavernoj." - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Difinas zonojn de glata tereno sur fluginsuloj.\n" -#~ "Glataj fluginsuloj okazas kiam bruo superas nulon." - -#~ msgid "Darkness sharpness" -#~ msgstr "Akreco de mallumo" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Regas larĝecon de tuneloj; pli malgranda valoro kreas pri larĝajn " -#~ "tunelojn." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Regas densecon de montecaj fluginsuloj.\n" -#~ "Temas pri deŝovo de la brua valoro «np_mountain»." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Ŝanĝas kiel montecaj fluginsuloj maldikiĝas super kaj sub la mezpunkto." +#~ msgid "Address / Port" +#~ msgstr "Adreso / Pordo" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7279,20 +7866,432 @@ msgstr "cURL tempolimo" #~ "helaj.\n" #~ "Ĉi tiu agordo estas klientflanka, kaj serviloj ĝin malatentos." -#~ msgid "Path to save screenshots at." -#~ msgstr "Dosierindiko por konservi ekrankopiojn." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Ŝanĝas kiel montecaj fluginsuloj maldikiĝas super kaj sub la mezpunkto." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Potenco de paralaksa ombrigo" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Limo de viceroj enlegotaj de disko" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Elŝutante kaj instalante $1, bonvolu atendi…" +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Ĉu vi certas, ke vi volas rekomenci vian mondon por unu ludanto?" #~ 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." + +#~ msgid "Bump Mapping" +#~ msgstr "Tubera mapado" + +#~ msgid "Bumpmapping" +#~ msgstr "Mapado de elstaraĵoj" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Ŝanĝoj al fasado de la ĉefmenuo:\n" +#~ "- full (plena): Pluraj mondoj por unu ludanto, elektilo de ludo, " +#~ "teksturaro, ktp.\n" +#~ "- simple (simpla): Unu mondo por unu ludanto, neniuj elektiloj de ludo " +#~ "aŭ teksturaro.\n" +#~ "Povus esti bezona por malgrandaj ekranoj." + +#~ msgid "Config mods" +#~ msgstr "Agordi modifaĵojn" + +#~ 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." +#~ msgstr "" +#~ "Regas densecon de montecaj fluginsuloj.\n" +#~ "Temas pri deŝovo de la brua valoro «np_mountain»." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Regas larĝecon de tuneloj; pli malgranda valoro kreas pri larĝajn " +#~ "tunelojn." + +#~ msgid "Credits" +#~ msgstr "Kontribuantaro" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Koloro de celilo (R,V,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Difektado estas ŝaltita" + +#~ msgid "Darkness sharpness" +#~ msgstr "Akreco de mallumo" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Implicita tempolimo por cURL, milisekunde.\n" +#~ "Nur efektiviĝas programtradukite kun cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Difinas zonojn de glata tereno sur fluginsuloj.\n" +#~ "Glataj fluginsuloj okazas kiam bruo superas nulon." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "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" +#~ "Y of upper limit of lava in large caves." +#~ msgstr "" +#~ "Evitinda, difini kaj trovi kavernajn fluaĵojn anstataŭe per klimataj " +#~ "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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Ŝaltas mapadon de elstaraĵoj por teksturoj. Normalmapoj devas veni kun la " +#~ "teksturaro,\n" +#~ "aŭ estiĝi memage.\n" +#~ "Bezonas ŝaltitajn ombrigilojn." + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Ŝaltas dumludan estigadon de normalmapoj (Reliefiga efekto).\n" +#~ "Bezonas ŝaltitan mapadon de elstaraĵoj." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Ŝ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." +#~ msgstr "" +#~ "Prova elekteblo; povas estigi videblajn spacojn inter monderoj\n" +#~ "je nombro super 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "Kadroj sekunde en paŭza menuo" + +#~ msgid "Fallback font shadow" +#~ msgstr "Ombro de reenpaŝa tiparo" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Travidebleco de ombro de la reenpaŝa tiparo" + +#~ 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" + +#~ msgid "Floatland mountain height" +#~ msgstr "Alteco de fluginsulaj montoj" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Maltravidebleco de tipara ombro (inter 0 kaj 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Grandeco de la reenpaŝa tiparo, punkte (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Tiparoj «FreeType»" + +#~ msgid "Full screen BPP" +#~ msgstr "Kolornombro tutekrane" + +#~ msgid "Game" +#~ msgstr "Ludo" + +#~ msgid "Gamma" +#~ msgstr "Helĝustigo" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Estigi Normalmapojn" + +#~ 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" + +#~ msgid "Lightness sharpness" +#~ msgstr "Akreco de heleco" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Limo de viceroj enlegotaj de disko" + +#~ msgid "Main" +#~ msgstr "Ĉefmenuo" + +#~ msgid "Main menu style" +#~ msgstr "Stilo de ĉefmenuo" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Mapeto en radara reĝimo, zomo ×4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Mapeto en supraĵa reĝimo, zomo ×2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Mapeto en supraĵa reĝimo, zomo ×4" + +#~ msgid "Name / Password" +#~ msgstr "Nomo / Pasvorto" + +#~ msgid "Name/Password" +#~ msgstr "Nomo/Pasvorto" + +#~ msgid "No" +#~ msgstr "Ne" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Normalmapa specimenado" + +#~ msgid "Normalmaps strength" +#~ msgstr "Normalmapa potenco" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Nombro da iteracioj de paralaksa ombrigo." + #~ msgid "Ok" #~ msgstr "Bone" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Netravidebleco (alfa) de la ombro post la reenpaŝa tiparo, inter 0 kaj " +#~ "255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "Entuta ekarto de la efiko de paralaksa ombrigo, kutime skalo/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Entuta vasteco de paralaksa ombrigo." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Paralaksa ombrigo" + +#~ msgid "Parallax occlusion" +#~ msgstr "Paralaksa ombrigo" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Ekarto de paralaksa okludo" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Iteracioj de paralaksa ombrigo" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Reĝimo de paralaksa ombrigo" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Skalo de paralaksa ombrigo" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Potenco de paralaksa ombrigo" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Dosierindiko al tiparo «TrueType» aŭ bitbildo." + +#~ 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" + +#~ msgid "PvP enabled" +#~ msgstr "Dueloj ŝaltitas" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Rekomenci mondon por unu ludanto" + +#~ msgid "Select Package File:" +#~ msgstr "Elekti pakaĵan dosieron:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Servilo / Ludo por unu" + +#~ msgid "Shadow limit" +#~ msgstr "Limo por ombroj" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Deŝovo de tipara ombro (en bilderoj); se ĝi estas 0, la ombro ne " +#~ "desegniĝos." + +#~ msgid "Special" +#~ msgstr "Speciala" + +#~ msgid "Special key" +#~ msgstr "Speciala klavo" + +#~ msgid "Start Singleplayer" +#~ msgstr "Komenci ludon por unu" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Forteco de estigitaj normalmapoj." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Tiu ĉi tiparo uziĝos por iuj lingvoj." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Por uzi ombrigilojn, OpenGL-pelilo estas necesa." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Baskuligi glitan vidpunkton" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Ordinara plejalto, super kaj sub la mezpunkto, de fluginsulaj montoj." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variaĵo de alteco de montetoj kaj profundeco de lagoj sur glata tereno de " +#~ "fluginsuloj." + +#~ msgid "View" +#~ msgstr "Vido" + +#~ msgid "Waving Water" +#~ msgstr "Ondanta akvo" + +#~ msgid "Waving water" +#~ msgstr "Ondanta akvo" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Ĉu tiparoj de FreeType uziĝas; postulas entradukitan subtenon de " +#~ "FreeType.\n" +#~ "Malŝaltite, ĉi tio anstataŭe uzigas tiparojn bitbildajn kaj XML-vektorajn." + +#, fuzzy +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Y de supera limo de grandaj kvazaŭ-hazardaj kavernoj." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Y-nivelo kien etendiĝas ombroj de fluginsuloj." + +#~ 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." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/es/minetest.po b/po/es/minetest.po index f0a5e38dd..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: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-07-06 21:41+0000\n" -"Last-Translator: Agustin Calderon <agustin25901@gmail.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,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.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Vaciar la cola de chat de salida" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Comando vacío." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Salir al menú principal" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Comando inválido: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Comando emitido: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Listar jugadores conectados" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Jugadores conectados: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "La cola de salida del chat está ahora vacía." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Este comando está deshabilitado por el servidor." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +58,42 @@ msgstr "Reaparecer" msgid "You died" msgstr "Has muerto" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Comandos disponibles:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Comandos disponibles: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Comando no disponible: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Obtener ayuda para los comandos" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Usa '.help <cmd>' para obtener más información, o '.help all' para mostrar " +"todo." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "Aceptar" +#: builtin/fstk/ui.lua +#, fuzzy +msgid "<none available>" +msgstr "Comando no disponible: " + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Ha ocurrido un error en un script de Lua:" @@ -46,9 +114,30 @@ msgstr "Reconectar" msgid "The server has requested a reconnect:" msgstr "El servidor ha solicitado una reconexión:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Cargando..." +#: 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. " @@ -63,10 +152,8 @@ 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 "Try reenabling public serverlist and check your internet connection." -msgstr "" -"Intente rehabilitar la lista de servidores públicos y verifique su conexión " -"a Internet." +msgid "Visit website" +msgstr "Visitar el sitio web" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +163,27 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Dependencias:" @@ -159,14 +256,54 @@ msgstr "Mundo:" msgid "enabled" msgstr "activado" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" ya existe. Quieres remplazarlo?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Las dependencias $1 y $2 serán instaladas." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 por $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 descargando,\n" +"$2 en espera" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 descargando..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 dependencias requeridas no se encuentren." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 serán instalados, y $2 dependencias serán ignoradas." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Todos los paquetes" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Ya está instalado" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Volver al menú principal" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Juego Base:" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -181,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" @@ -190,7 +326,18 @@ msgid "Install" msgstr "Instalar" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Instalar $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Instalar dependencias faltantes" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Instalar: Formato de archivo no soportado o archivo corrupto" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" @@ -203,9 +350,24 @@ msgid "No results" msgstr "Sin resultados" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Buscar" +msgid "No updates" +msgstr "No hay actualizaciones" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "No encontrado" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Sobreescribir" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Por favor verifica que el juego base está bien." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "En cola" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -220,8 +382,12 @@ msgid "Update" msgstr "Actualizar" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Ver" +msgid "Update All [$1]" +msgstr "Actualizar Todo [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Ver más información en un navegador web" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -264,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" @@ -287,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" @@ -307,6 +467,14 @@ msgstr "Ríos húmedos" 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" @@ -410,11 +578,6 @@ msgstr "Variar la profundidad del río" 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" @@ -445,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" @@ -478,6 +673,14 @@ 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" @@ -502,12 +705,13 @@ msgid "Offset" msgstr "Compensado" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" 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." @@ -521,6 +725,10 @@ msgstr "Restablecer por defecto" msgid "Scale" msgstr "Escala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Buscar" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Seleccionar carpeta" @@ -529,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" @@ -610,14 +818,6 @@ msgstr "" "Instalar mod: Imposible encontrar un nombre de carpeta adecuado para el " "paquete de mod $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Instalar: Formato de archivo \"$1\" no soportado o archivo corrupto" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Instalar: Archivo: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Imposible encontrar un mod o paquete de mod" @@ -638,6 +838,61 @@ msgstr "Fallo al instalar un mod como $1" msgid "Unable to install a modpack as a $1" msgstr "Fallo al instalar un paquete de mod como $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Cargando..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "La lista de servidores públicos está desactivada" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Intente rehabilitar la lista de servidores públicos y verifique su conexión " +"a Internet." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Acerca de" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Colaboradores activos" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Renderizador activo:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Desarrolladores principales" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Abrir Directorio de 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 el directorio que contiene los mundos, juegos, mods, y paquetes de\n" +"textura, del usuario, en un gestor / explorador de archivos." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Antiguos colaboradores" + +#: builtin/mainmenu/tab_about.lua +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" @@ -678,26 +933,6 @@ msgstr "Desinstalar el paquete" msgid "Use Texture Pack" msgstr "Usar el paqu. de texturas" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Colaboradores activos" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Desarrolladores principales" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Créditos" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Antiguos colaboradores" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Antiguos desarrolladores principales" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Anunciar servidor" @@ -707,33 +942,25 @@ msgid "Bind Address" msgstr "Asociar dirección" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Configurar" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Modo creativo" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Permitir daños" #: builtin/mainmenu/tab_local.lua msgid "Host Game" -msgstr "Juego anfitrión" +msgstr "Hospedar juego" #: builtin/mainmenu/tab_local.lua msgid "Host Server" -msgstr "Servidor anfitrión" +msgstr "Hospedar servidor" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" msgstr "Instalar juegos desde ContentDB" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nombre / contraseña" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Nuevo" @@ -746,10 +973,14 @@ msgstr "¡No se ha dado un nombre al mundo o no se ha seleccionado uno!" msgid "Play Game" msgstr "Jugar juego" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Puerto" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Selecciona Mods" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Selecciona un mundo:" @@ -763,45 +994,62 @@ msgid "Start Game" msgstr "Empezar juego" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Dirección / puerto" +msgid "Address" +msgstr "Dirección" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Conectar" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Limpiar" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Modo creativo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Daño activado" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Daño / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Borrar Fav." +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favoritos" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favorito" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Servidores Incompatibles" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Unirse al juego" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nombre / contraseña" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP activado" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Servidores Públicos" + +#: builtin/mainmenu/tab_online.lua +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" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -827,10 +1075,6 @@ msgstr "Todos los ajustes" msgid "Antialiasing:" msgstr "Suavizado:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "¿Estás seguro de querer reiniciar el mundo de un jugador?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Auto-guardar tamaño de pantalla" @@ -839,10 +1083,6 @@ msgstr "Auto-guardar tamaño de pantalla" msgid "Bilinear Filter" msgstr "Filtrado bilineal" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Mapeado de relieve" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Configurar teclas" @@ -851,13 +1091,29 @@ msgstr "Configurar teclas" msgid "Connected Glass" msgstr "Vidrio conectado" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Sombras dinámicas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "Sombras dinámicas:" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Hojas elegantes" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Generar mapas normales" +msgid "High" +msgstr "Alto" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Bajo" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Medio" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -867,10 +1123,6 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Filtro aniso." -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "No" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Sin filtrado" @@ -889,7 +1141,7 @@ msgstr "Marcar nodos" #: builtin/mainmenu/tab_settings.lua msgid "None" -msgstr "Ninguno" +msgstr "Nada" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" @@ -899,30 +1151,26 @@ msgstr "Hojas opacas" msgid "Opaque Water" msgstr "Agua opaca" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Oclusión de paralaje" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partículas" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Reiniciar mundo de un jugador" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Pantalla:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "Configuración" +msgstr "Ajustes" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" msgstr "Sombreadores" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Sombreadores (experimental)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Sombreadores (no disponible)" @@ -939,22 +1187,27 @@ msgstr "Iluminación suave" msgid "Texturing:" msgstr "Texturizado:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Para habilitar los sombreadores debe utilizar el controlador OpenGL." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp 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 +#, fuzzy +msgid "Very High" +msgstr "Ultra Alto" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Muy bajo" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Movimiento de hojas" @@ -967,23 +1220,12 @@ msgstr "Movimiento de líquidos" msgid "Waving Plants" msgstr "Movimiento de plantas" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Sí" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Configurar mods" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Principal" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Comenzar un jugador" - #: 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." @@ -1012,8 +1254,8 @@ msgid "Connection error (timed out?)" msgstr "Error de conexión (¿tiempo agotado?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "No se puede encontrar o cargar el juego \"" +msgid "Could not find or load game: " +msgstr "No se puede encontrar o cargar el juego: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1045,18 +1287,6 @@ msgstr "Fallo para abrir el archivo con la contraseña proveída: " msgid "Provided world path doesn't exist: " msgstr "La ruta del mundo especificada no existe: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1069,14 +1299,6 @@ msgstr "" msgid "- Address: " msgstr "- Dirección: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Modo creativo: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Daño: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Modo: " @@ -1098,6 +1320,16 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "- Nombre del servidor: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Ha ocurrido un error:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Acceso denegado. Razón: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Avance automático desactivado" @@ -1106,6 +1338,23 @@ msgstr "Avance automático desactivado" msgid "Automatic forward enabled" msgstr "Avance automático activado" +#: src/client/game.cpp +#, fuzzy +msgid "Block bounds hidden" +msgstr "Límites de bloque" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Límites de bloque mostrados para todos los bloques" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Actualización de la cámara desactivada" @@ -1114,9 +1363,13 @@ msgstr "Actualización de la cámara desactivada" msgid "Camera update enabled" msgstr "Actualización de la cámara activada" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" -msgstr "Cambiar contraseña" +msgstr "Cambiar Contraseña" #: src/client/game.cpp msgid "Cinematic mode disabled" @@ -1126,6 +1379,10 @@ msgstr "Modo cinematográfico desactivado" msgid "Cinematic mode enabled" msgstr "Modo cinematográfico activado" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "El cliente se desconectó" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "El Scripting en el lado del cliente está desactivado" @@ -1134,6 +1391,10 @@ msgstr "El Scripting en el lado del cliente está desactivado" msgid "Connecting to server..." msgstr "Conectando al servidor..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "La conexión falló por razones desconocidas" + #: src/client/game.cpp msgid "Continue" msgstr "Continuar" @@ -1146,13 +1407,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1162,15 +1423,20 @@ msgstr "" "- %s: moverse a la izquierda\n" "- %s: moverse a la derecha\n" "- %s: saltar/escalar\n" -"- %s: agacharse/bajar\n" +"- %s: excavar/golpear\n" +"- %s: colocar/usar\n" +"- %s: a hurtadillas/bajar\n" "- %s: soltar objeto\n" "- %s: inventario\n" "- Ratón: girar/mirar\n" -"- Ratón izq.: cavar/golpear\n" -"- Ratón der.: colocar/usar\n" "- Rueda del ratón: elegir objeto\n" "- %s: chat\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "No se pudo resolver la dirección : %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "Creando cliente..." @@ -1227,6 +1493,11 @@ msgstr "Rango de visión ilimitada desactivado" 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ú" @@ -1289,7 +1560,7 @@ msgstr "KiB/s" #: src/client/game.cpp msgid "Media..." -msgstr "Media..." +msgstr "Multimedia..." #: src/client/game.cpp msgid "MiB/s" @@ -1300,32 +1571,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "El minimapa se encuentra actualmente desactivado por el juego o un mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Minimapa oculto" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Minimapa en modo radar, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Minimapa en modo radar, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Minimapa en modo radar, Zoom x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minimapa en modo superficie, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minimapa en modo superficie, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minimapa en modo superficie, Zoom x4" +msgid "Multiplayer" +msgstr "Multijugador" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1337,7 +1584,7 @@ msgstr "Modo 'Noclip' activado" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "Modo \"noclip\" activado (nota: sin privilegio 'noclip')" +msgstr "Modo 'Noclip' activado (nota: sin privilegio 'noclip')" #: src/client/game.cpp msgid "Node definitions..." @@ -1399,6 +1646,21 @@ msgstr "El sistema de sonido no está soportado en esta \"build\"" msgid "Sound unmuted" msgstr "Sonido no silenciado" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +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 "No se puede conectar a %s porque IPv6 esta" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1421,7 +1683,7 @@ msgstr "Volumen cambiado a %d%%" #: src/client/game.cpp msgid "Wireframe shown" -msgstr "Wireframe mostrado" +msgstr "Lineas 3D mostradas" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" @@ -1429,7 +1691,7 @@ msgstr "El zoom está actualmente desactivado por el juego o un mod" #: src/client/game.cpp msgid "ok" -msgstr "aceptar" +msgstr "Aceptar" #: src/client/gameui.cpp msgid "Chat hidden" @@ -1437,7 +1699,7 @@ msgstr "Chat oculto" #: src/client/gameui.cpp msgid "Chat shown" -msgstr "Chat mostrado" +msgstr "Chat visible" #: src/client/gameui.cpp msgid "HUD hidden" @@ -1468,10 +1730,6 @@ msgstr "Tecla de borrado" msgid "Caps Lock" msgstr "Bloq. Mayús" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Limpiar" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1510,7 +1768,7 @@ msgstr "Convertir IME" #: src/client/keycode.cpp msgid "IME Escape" -msgstr "Escapada de IME" +msgstr "Escape IME" #: src/client/keycode.cpp msgid "IME Mode Change" @@ -1719,36 +1977,40 @@ msgstr "X Botón 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "¡Las contraseñas no coinciden!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimapa oculto" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registrarse y unirse" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimapa en modo radar, Zoom x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimapa en modo superficie, Zoom x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimapa en modo textura" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Fallo al abrir la página web" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Abriendo página web" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Continuar" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Especial\" = Descender" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = bajar" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1758,15 +2020,23 @@ msgstr "Auto-avance" msgid "Automatic jumping" msgstr "Salto automático" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Atrás" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Límites de bloque" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Cambiar cámara" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Chat" @@ -1819,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" @@ -1852,10 +2120,6 @@ msgstr "Captura de pantalla" msgid "Sneak" msgstr "Caminar" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Especial" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Alternar el HUD" @@ -1896,10 +2160,6 @@ msgstr "pulsa una tecla" 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" @@ -1908,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" @@ -1917,14 +2181,9 @@ msgid "Muted" msgstr "Silenciado" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Volumen del sonido: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Ingresar " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Volumen del sonido: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1933,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" @@ -1943,9 +2212,10 @@ msgstr "" "al tocar." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Usar palanca virtual para activar el botón \"aux\".\n" @@ -1953,7 +2223,6 @@ msgstr "" "del círculo principal." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" "Can be used to move a desired point to (0, 0) to create a\n" @@ -1966,14 +2235,17 @@ msgid "" msgstr "" "Desvío (X,Y,Z) del fractal desde el centro del mundo en unidades de " "'escala'.\n" -"Puede ser utilizado para mover el punto deseado (0, 0) para crear un\n" +"Puede ser utilizado para mover el punto deseado al inicio de coordenadas (0, " +"0) para crear un\n" "punto de aparición mejor, o permitir 'ampliar' en un punto deseado si\n" "se incrementa la 'escala'.\n" -"El valor por defecto está ajustado para un punto de aparición adecuado para\n" -"los conjuntos Madelbrot con parámetros por defecto, podría ser necesario\n" -"modificarlo para otras situaciones.\n" -"El rango de está comprendido entre -2 y 2. Multiplicar por 'escala' para el\n" -"desvío en nodos." +"El valor por defecto está ajustado para un punto de aparición adecuado " +"para \n" +"los conjuntos Madelbrot\n" +"Con parámetros por defecto, podría ser necesariomodificarlo para otras \n" +"situaciones.\n" +"El rango de está comprendido entre -2 y 2. Multiplicar por la 'escala' para " +"el desvío en nodos." #: src/settings_translation_file.cpp msgid "" @@ -1991,15 +2263,7 @@ msgstr "" "limitado en tamaño por el mundo.\n" "Incrementa estos valores para 'ampliar' el detalle del fractal.\n" "El valor por defecto es para ajustar verticalmente la forma para\n" -"una isla, establece los 3 números igual para la forma pura." - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = oclusión de paralaje con información de inclinación (más rápido).\n" -"1 = mapa de relieve (más lento, más preciso)." +"una isla, establece los 3 números iguales para la forma inicial." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." @@ -2014,28 +2278,22 @@ msgid "2D noise that controls the shape/size of step mountains." msgstr "Ruido 2D para controlar la forma/tamaño de las montañas inclinadas." #: src/settings_translation_file.cpp -#, fuzzy msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" -"Ruido 2D que controla los rangos de tamaño/aparición de las montañas " -"escarpadas." +msgstr "Ruido 2D que controla el tamaño/aparición de cordilleras montañosas." #: src/settings_translation_file.cpp -#, fuzzy msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "Ruido 2D para controlar el tamaño/aparición de las colinas." +msgstr "Ruido 2D que controla el tamaño/aparición de las colinas ondulantes." #: src/settings_translation_file.cpp -#, fuzzy msgid "2D noise that controls the size/occurrence of step mountain ranges." msgstr "" -"Ruido 2D para controlar las rangos de tamaño/aparición de las montañas " +"Ruido 2D que controla el tamaño/aparición de los intervalos de montañas " "inclinadas." #: src/settings_translation_file.cpp -#, fuzzy msgid "2D noise that locates the river valleys and channels." -msgstr "Ruido 2D para controlar la forma/tamaño de las colinas." +msgstr "Ruido 2D para ubicar los ríos, valles y canales." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2046,9 +2304,8 @@ msgid "3D mode" msgstr "Modo 3D" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Oclusión de paralaje" +msgstr "Fuerza de paralaje en modo 3D" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2069,6 +2326,12 @@ 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 "" +"Ruido 3D que define las estructuras flotantes.\n" +"Si se altera la escala de ruido por defecto (0,7), puede ser necesario " +"ajustarla, \n" +"los valores de ruido que definen la estrechez de islas flotantes funcionan " +"mejor \n" +"cuando están en un rango de aproximadamente -2.0 a 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2113,6 +2376,10 @@ msgstr "" "- Rotación de página (pageflip): 3D basado en buffer cuádruple.\n" "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" @@ -2137,9 +2404,12 @@ msgid "ABM interval" msgstr "Intervalo ABM" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ABM time budget" +msgstr "Límite de tiempo para MBA" + +#: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "Limite absoluto de colas emergentes" +msgstr "Límite absoluto de bloques en proceso" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2187,6 +2457,13 @@ msgstr "" "Ajustar la configuración de puntos por pulgada a tu pantalla (no X11/Android " "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 msgid "" @@ -2196,6 +2473,17 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Ajusta la densidad de la isla flotante.\n" +"Incrementar el valor para incrementar la densidad. Este puede ser negativo o " +"positivo\n" +"Valor = 0.0: 50% del volumen está flotando \n" +"Valor = 2.0 (puede ser mayor dependiendo de 'mgv7_np_floatland',\n" +"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" @@ -2218,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 @@ -2298,6 +2587,10 @@ msgstr "" "optimización.\n" "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" @@ -2308,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" @@ -2318,6 +2611,14 @@ msgstr "Autoguardar el tamaño de la pantalla" msgid "Autoscaling mode" msgstr "Modo de autoescalado" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Tecla Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Tecla Aux1 para subir/bajar" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tecla retroceso" @@ -2330,10 +2631,6 @@ msgstr "Nivel del suelo" 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" @@ -2355,23 +2652,22 @@ 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 msgid "Biome noise" msgstr "Ruido de bioma" -#: src/settings_translation_file.cpp -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 " -"pantalla completa." - #: src/settings_translation_file.cpp 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" @@ -2397,11 +2693,11 @@ msgid "Builtin" msgstr "Incorporado" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Mapeado de relieve" +#, fuzzy +msgid "Camera" +msgstr "Cambiar cámara" #: 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" @@ -2409,9 +2705,10 @@ msgid "" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" "Distancia de la cámara 'cerca del plano delimitador' en nodos, entre 0 y " -"0,5.\n" -"La mayoría de los usuarios no necesitarán cambiar esto.\n" -"El aumento puede reducir los artefactos en GPU más débiles.\n" +"0,25.\n" +"Solo funciona en plataformas GLES. La mayoría de los usuarios no necesitarán " +"cambiar esto.\n" +"Aumentarlo puede reducir el artifacting en GPU más débiles.\n" "0.1 = Predeterminado, 0,25 = Buen valor para comprimidos más débiles." #: src/settings_translation_file.cpp @@ -2479,33 +2776,26 @@ msgstr "" "Cuando 0.0 es el nivel mínimo de luz, 1.0 es el nivel de luz máximo." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Cambia la UI del menú principal:\n" -"-\tCompleto:\tMúltiples mundos, elección de juegos y texturas, etc.\n" -"-\tSimple:\tUn solo mundo, sin elección de juegos o texturas.\n" -"Puede ser necesario en pantallas pequeñas.\n" -"-\tAutomático:\tSimple en Android, completo en otras plataformas." +#, fuzzy +msgid "Chat command time message threshold" +msgstr "Umbral de expulsión por mensajes" #: src/settings_translation_file.cpp #, fuzzy +msgid "Chat commands" +msgstr "Comandos de Chat" + +#: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "Tamaño de la fuente" +msgstr "Tamaño de la fuente del chat" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Tecla del Chat" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Nivel de registro de depuración" +msgstr "Nivel de registro del chat" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2528,8 +2818,9 @@ msgid "Chat toggle key" msgstr "Tecla alternativa para el chat" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Comandos de Chat" +#, fuzzy +msgid "Chat weblinks" +msgstr "Chat visible" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2547,6 +2838,12 @@ msgstr "Tecla modo cinematográfico" msgid "Clean transparent textures" msgstr "Limpiar texturas transparentes" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Cliente" @@ -2567,6 +2864,11 @@ msgstr "Restricciones para modear del lado del cliente" 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" @@ -2591,6 +2893,10 @@ msgstr "Nubes en el menú" msgid "Colored fog" msgstr "Niebla colorida" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Sombras coloridas" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2601,12 +2907,12 @@ 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 banderas a ocultar en el repositorio de contenido. La lista usa la " +"Lista de 'marcas' a ocultar en el repositorio de contenido. La lista usa la " "coma como separador.\n" "Se puede usar la etiqueta \"nonfree\" para ocultar paquetes que no tienen " -"licencia libre (tal como define la Funcación de software libre (FSF).\n" -"También puedes especificar proporciones de contenido.\n" -"Estas banderas son independientes de la versión de Minetest.\n" +"licencia libre (tal como define la Fundación de software libre (FSF)).\n" +"También puedes especificar clasificaciones de contenido.\n" +"Estas 'marcas' son independientes de la versión de Minetest.\n" "Si quieres ver una lista completa visita https://content.minetest.net/help/" "content_flags/" @@ -2615,8 +2921,9 @@ 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 son permitidos de acceder a APIs de " -"HTTP, las cuales les permiten subir y descargar archivos al/desde internet." +"Lista (separada por comas) de mods a los que se les permite acceder a APIs " +"de HTTP, las cuales \n" +"les permiten subir y descargar archivos al/desde internet." #: src/settings_translation_file.cpp msgid "" @@ -2631,6 +2938,32 @@ msgstr "" 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" msgstr "Conectar vidrio" @@ -2641,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" @@ -2655,9 +2988,18 @@ msgstr "Color de la consola" 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 banderas de ContentDB" +msgstr "Lista negra de Contenido de la Base de Datos" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Descargas máximas simultáneas para ContentDB" #: src/settings_translation_file.cpp msgid "ContentDB URL" @@ -2686,12 +3028,15 @@ msgid "" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" "Controla la duración del ciclo día/noche.\n" -"Ejemplos: 72 = 20min, 360 = 4min, 1 = 24hora, 0 = día/noche/lo que sea se " -"queda inalterado." +"Ejemplos: \n" +"72 = 20min, 360 = 4min, 1 = 24hs, 0 = día/noche/lo que sea se queda " +"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." @@ -2726,16 +3071,25 @@ msgid "Crosshair alpha" msgstr "Opacidad del punto de mira" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Alfa del punto de mira (opacidad, entre 0 y 255)." +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Alfa del punto de mira (opacidad, entre 0 y 255).\n" +"También controla el color del objeto punto de mira" #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Color de la cruz" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Color de la cruz (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Color del punto de mira (R,G,B).\n" +"También controla el color del objeto punto de mira" #: src/settings_translation_file.cpp msgid "DPI" @@ -2758,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" @@ -2798,17 +3152,18 @@ msgid "Default report format" msgstr "Formato de Reporte por defecto" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Juego por defecto" +msgstr "Tamaño por defecto del stack (Montón)" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Tiempo de espera predeterminado para cURL, en milisegundos.\n" -"Sólo tiene efecto si está compilado con cURL." +"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." @@ -2826,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." @@ -2840,14 +3195,6 @@ msgstr "Define la estructura del canal fluvial a gran escala." msgid "Defines location and terrain of optional hills and lakes." msgstr "Define la localización y terreno de colinas y lagos opcionales." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Define el intervalo de muestreo de las texturas.\n" -"Un valor más alto causa mapas de relieve más suaves." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Define el nivel base del terreno." @@ -2909,8 +3256,8 @@ msgid "" "Description of server, to be displayed when players join and in the " "serverlist." msgstr "" -"Descripción del servidor, que se muestra cuando los jugadores se unen, y en\n" -"la lista de servidores." +"Descripción del servidor, que se muestra en la lista de servidores y cuando " +"los jugadores se unen." #: src/settings_translation_file.cpp msgid "Desert noise threshold" @@ -2928,6 +3275,15 @@ msgstr "" 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" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Partículas de excavación" @@ -2940,6 +3296,16 @@ msgstr "Desactivar Anticheat" msgid "Disallow empty passwords" 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 msgid "Domain name of server, to be displayed in the serverlist." msgstr "" @@ -2989,18 +3355,42 @@ msgstr "" "Habilitar el soporte de mods de Lua en el cliente.\n" "El soporte es experimental y la API puede cambiar." +#: src/settings_translation_file.cpp +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." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Habilitar las sombras a color.\n" +"Si el valor es verdadero los nodos traslúcidos proyectarán sombras a color. " +"Esta opción usa muchos recursos." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Habilitar la ventana de la consola" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Habilitar el modo creativo para los nuevos mapas creados." +msgid "Enable creative mode for all players" +msgstr "Activar el modo creativo para todos los jugadores" #: 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 "Activar soporte para los canales de mods." @@ -3017,18 +3407,6 @@ msgstr "Habilitar daños y muerte de jugadores." 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" @@ -3037,6 +3415,10 @@ msgstr "" "Habilita iluminación suave con oclusión ambiental simple.\n" "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" @@ -3088,7 +3470,6 @@ msgstr "" "Necesita habilitar enable_ipv6 para ser activado." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Enables Hable's 'Uncharted 2' filmic tone mapping.\n" "Simulates the tone curve of photographic film and how this approximates the\n" @@ -3106,18 +3487,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Habilita la animación de objetos en el inventario." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Habilita mapeado de relieves para las texturas. El mapeado de normales " -"necesita ser\n" -"suministrados por el paquete de texturas, o será generado automaticamente.\n" -"Requiere habilitar sombreadores." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Habilitar cacheado de mallas giradas." @@ -3126,23 +3495,6 @@ msgstr "Habilitar cacheado de mallas giradas." msgid "Enables minimap." msgstr "Activar mini-mapa." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Habilita la generación de mapas de normales (efecto realzado) en el " -"momento.\n" -"Requiere habilitar mapeado de relieve." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Habilita mapeado de oclusión de paralaje.\n" -"Requiere habilitar sombreadores." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3155,6 +3507,21 @@ msgstr "" "los controles de sonido el juego no serán funcionales.\n" "Cambiar esta configuración requiere un reinicio." +#: 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 "" +"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" msgstr "Intervalo de impresión de datos del perfil del motor" @@ -3163,14 +3530,6 @@ msgstr "Intervalo de impresión de datos del perfil del motor" msgid "Entity methods" msgstr "Métodos de entidad" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Opción experimental, puede causar espacios visibles entre los\n" -"bloques si se le da un valor mayor a 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3180,10 +3539,23 @@ 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 "" +"Exponente de la estrechez de tierra flotante. Altera el comportamiento de la " +"estrechez.\n" +"Valor = 1.0 crea una estrechez uniforme y lineal.\n" +"Valores > 1.0 crea una estrechez suave apropiada para las tierras flotantes " +"separadas\n" +"por defecto.\n" +"Valores < 1.0 (0.25, por ejemplo) crea un nivel de superficie más definida " +"con \n" +"tierras bajas más planas, apropiada para una capa de tierra flotante sólida." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS (cuadros/s) en el menú de pausa" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS cuando está en segundo plano o pausado" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3201,18 +3573,6 @@ msgstr "Factor de balanceo en caída" msgid "Fallback font path" msgstr "Ruta de la fuente alternativa" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Sombra de la fuente de reserva" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Alfa de la sombra de la fuente de reserva" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Tamaño de la fuente de reserva" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Tecla rápida" @@ -3231,10 +3591,10 @@ msgstr "Movimiento rápido" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Movimiento rápido (por medio de tecla de \"Uso\").\n" +"Movimiento rápido (por medio de tecla de \"Aux1\").\n" "Requiere privilegio \"fast\" (rápido) en el servidor." #: src/settings_translation_file.cpp @@ -3251,8 +3611,9 @@ msgid "" "the\n" "Multiplayer Tab." msgstr "" -"Fichero en client/serverlist/ que contiene sus servidores favoritos que se " -"mostrarán en la página de Multijugador." +"Archivo en client/serverlist/ que contiene sus servidores favoritos " +"mostrados en la \n" +"página de Multijugador." #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3269,19 +3630,22 @@ msgstr "Mapa de tonos fílmico" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 los valores RGB de los vecinos\n" -"completamete tranparentes, los cuales los optimizadores de ficheros\n" -"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." +"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 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." @@ -3300,39 +3664,32 @@ msgid "Fixed virtual joystick" msgstr "Joystick virtual fijo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "Densidad de las montañas en tierras flotantes" +msgstr "Densidad de las tierras flotantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "Mazmorras, máx. Y" +msgstr "Máximo valor de Y de las tierras flotantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "Mazmorras, mín. Y" +msgstr "Mínimo valor de Y de las tierras flotantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Ruido base para tierra flotante" +msgstr "Ruido de la tierra flotante" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "Exponente de las montañas en tierras flotantes" +msgstr "Exponente de la cónica de las tierras flotantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "Ruido base para tierra flotante" +msgstr "Distancia de cónico de la tierra flotante" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "Nivel de tierra flotante" +msgstr "Nivel de agua de la tierra flotante" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3354,6 +3711,11 @@ msgstr "Inicio de Niebla" 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" @@ -3375,22 +3737,44 @@ msgid "Font size" msgstr "Tamaño de la fuente" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "Tamaño de la fuente por defecto en punto (pt)." +msgid "Font size divisible by" +msgstr "Tamaño de fuente divisible por" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Tamaño de la fuente de reserva en punto (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Tamaño de la fuente por defecto donde 1 unidad = 1 pixel a 96 DPI" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "Tamaño de la fuente del monoespacio en punto (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Tamaño de la fuente monoespaciada donde 1 unidad = 1 pixel a 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 "" +"El tamaño de la fuente del texto del chat reciente y el indicador del chat " +"en punto (pt).\n" +"El valor 0 utilizará el tamaño de fuente predeterminado." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"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 "" @@ -3456,10 +3840,6 @@ msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" "Fracción de la distancia visible en la que la niebla se empieza a renderizar" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Fuentes FreeType" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3472,11 +3852,10 @@ msgstr "" msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." msgstr "" -"Desde cuán lejos se envían bloques a los clientes, especificado en\n" -"bloques de mapa (mapblocks, 16 nodos)." +"Desde cuán lejos se envían bloques a los clientes, especificado en bloques " +"de mapa (mapblocks, 16 nodos)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "From how far clients know about objects, stated in mapblocks (16 nodes).\n" "\n" @@ -3488,17 +3867,13 @@ msgstr "" "\n" "Establecer esto a más de 'active_block_range' tambien causará que\n" "el servidor mantenga objetos activos hasta ésta distancia en la dirección\n" -"que el jugador está mirando. (Ésto puede evitar que los\n" -"enemigos desaparezcan)" +"que el jugador está mirando. (Ésto puede evitar que los enemigos " +"desaparezcan)" #: src/settings_translation_file.cpp msgid "Full screen" msgstr "Pantalla completa" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Profundidad de color en pantalla completa" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Modo de pantalla completa." @@ -3516,29 +3891,33 @@ msgid "GUI scaling filter txr2img" msgstr "Filtro de escala de IGU \"txr2img\"" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Generar mapas normales" +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 junglegrass, in all other mapgens this flag controls all decorations." +"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 y la hierba de la " -"jungla, en todos los otros generadores de mapas esta opción controla todas " -"las decoraciones.\n" -"Las opciones que no son incluidas en el texto con la cadena de opciones no " -"serán modificadas y mantendrán su valor por defecto.\n" -"Las opciones que comienzan con el prefijo \"no\" son utilizadas para " -"inhabilitar esas opciones." +"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." #: src/settings_translation_file.cpp msgid "" @@ -3560,6 +3939,16 @@ msgstr "" 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" @@ -3577,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" @@ -3587,20 +3981,18 @@ msgstr "Tecla de cambio del HUD" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Manejo de llamadas a la API de Lua en desuso:\n" -"- legacy: (intentar) imitar el comportamiento antiguo (por defecto para la " -"liberación).\n" +"- none: no registrar llamadas en desuso.\n" "- log: imitar y registrar la pista de seguimiento de la llamada en desuso " "(predeterminado para la depuración).\n" "- error: abortar el uso de la llamada en desuso (sugerido para " "desarrolladores de mods)." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Have the profiler instrument itself:\n" "* Instrument an empty function.\n" @@ -3612,7 +4004,7 @@ msgstr "" "* Instrumente una función vacía.\n" "Esto estima la sobrecarga, que la instrumentación está agregando (+1 llamada " "de función).\n" -"* Instrumente el muestreador que se utiliza para actualizar las estadísticas." +"* Instrumente el sampler que se utiliza para actualizar las estadísticas." #: src/settings_translation_file.cpp msgid "Heat blend noise" @@ -3623,8 +4015,11 @@ msgid "Heat noise" msgstr "Calor del ruido" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Componente de altura del tamaño inicial de la ventana." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +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" @@ -3634,10 +4029,6 @@ msgstr "Altura del ruido" msgid "Height select noise" msgstr "Altura del ruido seleccionado" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Alta-precisión FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Pendiente de la colina" @@ -3842,14 +4233,23 @@ 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 " "utilizados.\n" "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." @@ -3884,16 +4284,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Si está desactivado, la tecla \"especial\" se utiliza para volar rápido si " -"tanto el modo de vuelo como el modo rápido están\n" -"habilitados." +"Si está desactivado, la tecla \"Aux1\" se utiliza para volar rápido si el " +"modo\n" +"de vuelo y el modo rápido están habilitados." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled the server will perform map block occlusion culling based on\n" "on the eye position of the player. This can reduce the number of blocks\n" @@ -3902,11 +4300,11 @@ msgid "" "so that the utility of noclip mode is reduced." msgstr "" "Si está habilitado, el servidor realizará la selección de la oclusión del " -"bloque del mapa basado en\n" +"bloque del mapa basado\n" "en la posición del ojo del jugador. Esto puede reducir el número de bloques\n" -"enviados al cliente en un 50-80%. El cliente ya no recibirá la mayoría de " -"las invisibles\n" -"para que la utilidad del modo nocturno se reduzca." +"enviados al cliente en un 50-80%. El cliente ya no recibirá lo mas " +"invisible\n" +"por lo que la utilidad del modo \"NoClip\" se reduce." #: src/settings_translation_file.cpp msgid "" @@ -3920,14 +4318,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"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" @@ -3948,10 +4355,9 @@ 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 -#, fuzzy msgid "" "If enabled, makes move directions relative to the player's pitch when flying " "or swimming." @@ -3960,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." @@ -3985,6 +4394,14 @@ msgstr "" "get_node están limitadas\n" "a esta distancia del jugador al nodo." +#: 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 "" +"Si la ejecución de un comando toma más tiempo del especificado en\n" +"segundos, agrega la información del tiempo al mensaje del comando" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -4006,10 +4423,6 @@ msgstr "Si se activa, los jugadores siempre reaparecerán en la posición dada." 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 "" @@ -4026,9 +4439,8 @@ msgstr "" "Altura de la consola de chat en el juego, entre 0.1 (10%) y 1.0 (100%)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Inc. volume key" -msgstr "Tecla de la consola" +msgstr "Tecla para subir volumen" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." @@ -4043,7 +4455,8 @@ msgstr "" "Esto solo suele ser necesario para los colaboradores principales o integrados" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Instrumento de comandos del chat en el registro." #: src/settings_translation_file.cpp @@ -4072,17 +4485,14 @@ msgstr "" 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 @@ -4102,9 +4512,8 @@ msgid "Invert vertical mouse movement." msgstr "Invertir movimiento vertical del ratón." #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "Ruta de fuentes" +msgstr "Ruta de fuente cursiva" #: src/settings_translation_file.cpp msgid "Italic monospace font path" @@ -4138,6 +4547,11 @@ msgstr "ID de Joystick" msgid "Joystick button repetition interval" msgstr "Intervalo de repetición del botón del Joystick" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "Zona muerta del joystick" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Sensibilidad del Joystick" @@ -4240,6 +4654,16 @@ msgstr "" "Ver http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para cavar.\n" +"Véase http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4291,7 +4715,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player backward.\n" "Will also disable autoforward, when active.\n" @@ -4299,6 +4722,8 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Tecla para desplazar el jugador hacia atrás.\n" +"Cuando esté activa, También desactivará el desplazamiento automático hacia " +"adelante.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4383,288 +4808,274 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para colocar.\n" +"Véase http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 11 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 12th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 12 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 13th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 13 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 14th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el decimocuarto elemento en la barra de acceso " +"directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 15th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el decimoquinto elemento en la barra de acceso " +"directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 16th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 16 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 17th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 17 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 18th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 18 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 19th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 19 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 20th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 20 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 21st hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 21 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 22nd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 22 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 23rd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 23 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 24th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 24 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 25th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 25 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 26th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 26 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 27th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 27 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 28th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 28 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 29th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 29 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 30th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 30 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 31st hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 31 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 32nd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el elemento 32 en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the eighth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el octavo elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the fifth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el quinto elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the first hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el primer elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the fourth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el cuarto elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4679,13 +5090,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the ninth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el noveno elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4700,57 +5110,52 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the second hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el segundo elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the seventh hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el septimo elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the sixth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el sexto elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the tenth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el decimo elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the third hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para seleccionar el siguiente elemento en la barra de acceso directo.\n" +"Tecla para seleccionar el tercer elemento en la barra de acceso directo.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4789,13 +5194,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling autoforward.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para mover el jugador hacia delante.\n" +"Tecla activar/desactivar el avance automatico.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4850,13 +5254,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling pitch move mode.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para silenciar el juego.\n" +"Tecla activar/desactivar el modo de inclinacion.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4866,15 +5269,18 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Tecla para activar/desactivar la actualización de la cámara. Solo usada para " +"desarrollo\n" +"Ver http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of chat.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para desplazar el jugador hacia la izquierda.\n" +"Tecla para activar/desactivar el chat.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4884,19 +5290,18 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para activar/desactivar la visualización de información de depuración." -"\n" +"Tecla para activar/desactivar la visualización de información de " +"depuración.\n" "Ver http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of fog.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para desplazar el jugador hacia la izquierda.\n" +"Tecla para activar/desactivar visualización de niebla.\n" "Véase http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4916,6 +5321,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Tecla para activar/desactivar la consola de chat larga.\n" +"Ver http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4947,9 +5355,14 @@ msgstr "" "Ver http://irrlicht.sourceforge.net/docu/namespaceirr." "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." #: src/settings_translation_file.cpp msgid "Lake steepness" @@ -4965,24 +5378,23 @@ msgstr "Idioma" #: src/settings_translation_file.cpp msgid "Large cave depth" -msgstr "" +msgstr "Profundidad de la cueva grande" #: src/settings_translation_file.cpp msgid "Large cave maximum number" -msgstr "" +msgstr "Numero máximo de cuevas grandes" #: src/settings_translation_file.cpp msgid "Large cave minimum number" -msgstr "" +msgstr "Numero mínimo de cuevas grandes" #: src/settings_translation_file.cpp msgid "Large cave proportion flooded" -msgstr "" +msgstr "Proporción de cuevas grandes inundadas" #: src/settings_translation_file.cpp -#, fuzzy msgid "Large chat console key" -msgstr "Tecla de la consola" +msgstr "Tecla de la consola del chat grande" #: src/settings_translation_file.cpp msgid "Leaves style" @@ -5005,31 +5417,45 @@ 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" +"red." #: src/settings_translation_file.cpp msgid "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." msgstr "" +"Longitud de las ondas líquidas.\n" +"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" -msgstr "" +#, 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" -msgstr "" +#, 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" @@ -5038,8 +5464,17 @@ 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" +"- ninguno (mensajes sin nivel)\n" +"- error\n" +"- advertencia\n" +"- acción\n" +"- información\n" +"- detallado" #: src/settings_translation_file.cpp msgid "Light curve boost" @@ -5047,23 +5482,28 @@ msgstr "Aumento medio del centro de la curva de luz" #: src/settings_translation_file.cpp msgid "Light curve boost center" -msgstr "" +msgstr "Centro de impulso de 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 de la curva de luz" #: src/settings_translation_file.cpp msgid "Light curve high gradient" -msgstr "" +msgstr "Curva de luz de alto gradiente" #: src/settings_translation_file.cpp msgid "Light curve low gradient" -msgstr "" +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 "" @@ -5071,6 +5511,11 @@ msgid "" "Only mapchunks completely within the mapgen limit are generated.\n" "Value is stored per-world." msgstr "" +"Límite de la generación de mapa, en nodos, en todas las 6 direcciones desde " +"(0, 0, 0).\n" +"Solo se generan fragmentos de mapa completamente dentro del límite de " +"generación de mapas.\n" +"Los valores se guardan por mundo." #: src/settings_translation_file.cpp msgid "" @@ -5080,39 +5525,43 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"Limita el número de solicitudes HTTP paralelas. Afecta:\n" +"- Recuperación de medios si el servidor utiliza remote_media setting.\n" +"- Descarga de la lista de servidores y anuncio del servidor.\n" +"- Descargas realizadas por el menú principal (por ejemplo, gestor de mods).\n" +"Sólo tiene un efecto si se compila con cURL." #: src/settings_translation_file.cpp msgid "Liquid fluidity" -msgstr "" +msgstr "Fluidez líquida" #: src/settings_translation_file.cpp msgid "Liquid fluidity smoothing" -msgstr "" +msgstr "Suavizado de la fluidez líquida" #: src/settings_translation_file.cpp msgid "Liquid loop max" -msgstr "" +msgstr "Bucle de máximo líquido" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" -msgstr "" +msgstr "Tiempo de purga de colas de líquidos" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid sinking" -msgstr "Velocidad de descenso" +msgstr "Hundimiento del líquido" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." -msgstr "" +msgstr "Intervalo de actualización del líquido en segundos." #: src/settings_translation_file.cpp msgid "Liquid update tick" -msgstr "" +msgstr "Tick de actualización de los líquidos" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "" +msgstr "Cargar el generador de perfiles del juego" #: src/settings_translation_file.cpp msgid "" @@ -5120,15 +5569,18 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" +"Cargue el generador de perfiles de juego para recopilar datos de generación " +"de perfiles de juegos.\n" +"Proporciona un comando /profiler para tener acceso al perfil compilado.\n" +"Útil para desarrolladores de mods y operadores de servidores." #: src/settings_translation_file.cpp -#, fuzzy msgid "Loading Block Modifiers" -msgstr "Intervalo de modificador de bloques activos" +msgstr "Carga de modificadores de bloque" #: src/settings_translation_file.cpp msgid "Lower Y limit of dungeons." -msgstr "" +msgstr "Límite inferior en Y de mazmorras." #: src/settings_translation_file.cpp msgid "Lower Y limit of floatlands." @@ -5138,63 +5590,50 @@ msgstr "Límite inferior Y de las tierras flotantes." msgid "Main menu script" msgstr "Script del menú principal" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Estilo del menú principal" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" +"Hace que la niebla y los colores del cielo dependan de la hora del día " +"(amanecer / atardecer) y la dirección de vista." #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" -msgstr "" +msgstr "Vuelve opacos a todos los líquidos" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Nivel de comprensión del mapa para almacenamiento de disco" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Nivel de comprensión del mapa para transferencias por la red" #: 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 "" +msgstr "Atributos de generación de mapas específicos de Mapgen Carpathian." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." msgstr "" -"Atributos del generador de mapas globales.\n" -"En el generador de mapas V6 la opción (o marcador) \"decorations\" controla " -"todos los elementos decorativos excepto los árboles y la hierba de la " -"jungla, en todos los otros generadores de mapas esta opción controla todas " -"las decoraciones.\n" -"Las opciones que no son incluidas en el texto con la cadena de opciones no " -"serán modificadas y mantendrán su valor por defecto.\n" -"Las opciones que comienzan con el prefijo \"no\" son utilizadas para " -"inhabilitar esas opciones." +"Atributos de generación de mapa específicos para generador de mapas planos.\n" +"Ocasionalmente pueden agregarse lagos y colinas al mundo plano." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Fractal.\n" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" -"Atributos del generador de mapas globales.\n" -"En el generador de mapas V6 la opción (o marcador) \"decorations\" controla " -"todos los elementos decorativos excepto los árboles y la hierba de la " -"jungla, en todos los otros generadores de mapas esta opción controla todas " -"las decoraciones.\n" -"Las opciones que no son incluidas en el texto con la cadena de opciones no " -"serán modificadas y mantendrán su valor por defecto.\n" -"Las opciones que comienzan con el prefijo \"no\" son utilizadas para " -"inhabilitar esas opciones." +"Atributos de generación de mapas específicos de Mapgen Fractal.\n" +"'terreno' permite la generación de terrenos no fractales:\n" +"océanos, islas y subterráneo." #: src/settings_translation_file.cpp msgid "" @@ -5205,70 +5644,72 @@ msgid "" "to become shallower and occasionally dry.\n" "'altitude_dry': Reduces humidity with altitude." msgstr "" +"Atributos de generación de mapas específicos del generador de mapas " +"Valleys.\n" +"'altitude_chill': Reduce el calor con la altitud.\n" +"'humid_rivers': Aumenta la humedad alrededor de ríos.\n" +"'vary_river_depth': Si está activo, la baja humedad y alto calor causan que\n" +"los ríos sean poco profundos y ocasionalmente secos.\n" +"'altitude_dry': Reduce la humedad con la altitud." #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen v5." -msgstr "" +msgstr "Atributos de generación de mapas específicos al generador de mapas v5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" "When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" "the 'jungles' flag is ignored." msgstr "" -"Atributos del generador de mapas globales.\n" -"En el generador de mapas V6 la opción (o marcador) \"decorations\" controla " -"todos los elementos decorativos excepto los árboles y la hierba de la " -"jungla, en todos los otros generadores de mapas esta opción controla todas " -"las decoraciones.\n" -"Las opciones que no son incluidas en el texto con la cadena de opciones no " -"serán modificadas y mantendrán su valor por defecto.\n" -"Las opciones que comienzan con el prefijo \"no\" son utilizadas para " -"inhabilitar esas opciones." +"Atributos específicos para la generación de Mapgen v6.\n" +"La opción 'snowbiomes' activa el nuevo sistema de generación de 5 biomas.\n" +"Cuando la opción 'snowbiomes' está activada, las junglas se activan " +"automáticamente y\n" +"la opción 'jungles' es ignorada." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Atributos del generador de mapas globales.\n" -"En el generador de mapas V6 la opción (o marcador) \"decorations\" controla " -"todos los elementos decorativos excepto los árboles y la hierba de la " -"jungla, en todos los otros generadores de mapas esta opción controla todas " -"las decoraciones.\n" -"Las opciones que no son incluidas en el texto con la cadena de opciones no " -"serán modificadas y mantendrán su valor por defecto.\n" -"Las opciones que comienzan con el prefijo \"no\" son utilizadas para " -"inhabilitar esas opciones." +"Atributos específicos para la generación de Mapgen v7.\n" +"'ridges': Rios.\n" +"'floatlands': Masas de tierra flotantes en la atmósfera.\n" +"'caverns': Cavernas gigantes subterráneo profundo." #: src/settings_translation_file.cpp msgid "Map generation limit" -msgstr "" +msgstr "Límite de generación de mapa" #: src/settings_translation_file.cpp msgid "Map save interval" -msgstr "" +msgstr "Intervalo de guardado de mapa" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Tiempo de actualización de mapa" #: src/settings_translation_file.cpp msgid "Mapblock limit" -msgstr "" +msgstr "Limite del Mapblock" #: src/settings_translation_file.cpp msgid "Mapblock mesh generation delay" -msgstr "" +msgstr "Retraso de generación de la malla del Mapblock" #: src/settings_translation_file.cpp msgid "Mapblock mesh generator's MapBlock cache size in MB" msgstr "" +"Tamaño de cache en MB del Mapblock del generador de la malla del Mapblock" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" -msgstr "" +msgstr "Expirado de descarga de Mapblock" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian" @@ -5284,54 +5725,48 @@ msgid "Mapgen Flat" msgstr "Generador de mapas plano" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat specific flags" -msgstr "Banderas planas de Mapgen" +msgstr "Banderas de generador de mapas plano" #: src/settings_translation_file.cpp msgid "Mapgen Fractal" msgstr "Generador de mapas fractal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Banderas planas de Mapgen" +msgstr "Banderas de generador de mapas fractal" #: src/settings_translation_file.cpp msgid "Mapgen V5" msgstr "Generador de mapas V5" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5 specific flags" -msgstr "Banderas planas de Mapgen" +msgstr "Banderas de generador de mapas V5" #: src/settings_translation_file.cpp msgid "Mapgen V6" msgstr "Generador de mapas V6" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6 specific flags" -msgstr "Banderas planas de Mapgen" +msgstr "Banderas de generador de mapas V6" #: src/settings_translation_file.cpp msgid "Mapgen V7" msgstr "Generador de mapas v7" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7 specific flags" -msgstr "Banderas planas de Mapgen" +msgstr "Banderas de generador de mapas V7" #: src/settings_translation_file.cpp msgid "Mapgen Valleys" -msgstr "Valles de Mapgen" +msgstr "Generador de mapas Valleys" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Valleys specific flags" -msgstr "Banderas planas de Mapgen" +msgstr "Banderas de generador de mapas Valleys" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -5350,47 +5785,54 @@ 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" -msgstr "" +msgstr "Bloques extra máximos de clearobjects" #: src/settings_translation_file.cpp msgid "Max. packets per iteration" -msgstr "" +msgstr "Máximos paquetes por iteración" #: src/settings_translation_file.cpp msgid "Maximum FPS" -msgstr "FPS máximos" +msgstr "FPS máximo" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "FPS máximos cuando el juego está pausado." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "FPS máximo cuando el juego está pausado." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Distancia máxima para renderizar las sombras." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" -msgstr "" +msgstr "Máximos bloques cargados a la fuerza" #: src/settings_translation_file.cpp msgid "Maximum hotbar width" -msgstr "" +msgstr "Anchura máxima de la barra de acceso rápido" #: src/settings_translation_file.cpp msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" +msgstr "Límite máximo de grandes cuevas aleatorias por chunk." #: src/settings_translation_file.cpp msgid "Maximum limit of random number of small caves per mapchunk." msgstr "" +"Límite máximo de número aleatorio de cavernas pequeñas por pedazo de mapa." #: src/settings_translation_file.cpp msgid "" "Maximum liquid resistance. Controls deceleration when entering liquid at\n" "high speed." msgstr "" +"Resistencia de líquidos máxima. Controla la deceleración al entrar en un " +"líquido a:\n" +"alta velocidad." #: src/settings_translation_file.cpp msgid "" @@ -5405,28 +5847,47 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." msgstr "" +"Número máximo de bloques que pueden ser añadidos a la cola para cargarse." #: 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 para ser añadidos a la cola para ser generados.\n" +"Este límite se cumple por jugador." #: 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 para ser añadidos a a cola para cargarse desde un " +"archivo.\n" +"Este límite se cumple por jugador." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Número máximo de descargas simultáneas. Las descargas que sobrepasen este " +"límite se añadirán a la cola.\n" +"Esto debería ser menor que 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 forzosamente." #: 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 mapa para el cliente para ser mantenidos en la " +"memoria.\n" +"Establecer a -1 para cantidad ilimitada." #: src/settings_translation_file.cpp msgid "" @@ -5434,59 +5895,76 @@ 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 paso de envío. Si tiene una conexión\n" +"lenta, intente reducirlo, pero no lo reduzca a un número menor al doble del\n" +"número de cliente objetivo." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum number of players that can be connected simultaneously." -msgstr "Cantidad de bloques que flotan simultáneamente por cliente." +msgstr "Número máximo de jugadores que se pueden conectar simultáneamente." #: src/settings_translation_file.cpp msgid "Maximum number of recent chat messages to show" -msgstr "" +msgstr "Número máximo de mensajes del chat recientes a mostrar" #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." -msgstr "" +msgstr "Número máximo de objetos almacenados estáticamente en un bloque." #: src/settings_translation_file.cpp msgid "Maximum objects per block" -msgstr "" +msgstr "Objetos 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 de la ventana actual a ser usada para la barra de acceso " +"rápido.\n" +"Útil si hay algo para ser mostrado a la derecha o a la izquierda de la barra " +"de acceso rápido." #: src/settings_translation_file.cpp msgid "Maximum simultaneous block sends per client" -msgstr "" +msgstr "Envíos de bloque simultáneos máximos por cliente" #: src/settings_translation_file.cpp msgid "Maximum size of the out chat queue" -msgstr "" +msgstr "Tamaño máximo de la cola de salida del 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 de la cola del chat externo.\n" +"0 para desactivar el añadido a la cola y -1 para hacer el tamaño de la cola " +"ilimitado." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" +"Tiempo máximo que puede tardar la descarga de archivo (p.ej. una descarga de " +"mod) en milisegundos." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Tiempo máximo que puede tardar la solicitud interactiva (p.ej. una búsqueda " +"de lista de servidores) en milisegundos." #: src/settings_translation_file.cpp 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 "" +msgstr "Caché de mallas poligonales" #: src/settings_translation_file.cpp msgid "Message of the day" @@ -5502,7 +5980,7 @@ msgstr "Método utilizado para resaltar el objeto seleccionado." #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "Nivel mínimo de logging a ser escrito al chat." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5519,40 +5997,58 @@ 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." -msgstr "" +msgstr "Límite mínimo del número aleatorio de cavernas pequeñas por mapchunk." #: src/settings_translation_file.cpp msgid "Minimum texture size" -msgstr "" +msgstr "Tamaño mínimo de textura" #: src/settings_translation_file.cpp #, fuzzy 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 hudbar elements." -msgstr "" +msgid "Modifies the size of the HUD elements." +msgstr "Modifica el tamaño de los elementos del HUD." #: src/settings_translation_file.cpp msgid "Monospace font path" -msgstr "" +msgstr "Ruta de fuente monoespaciada" #: src/settings_translation_file.cpp msgid "Monospace font size" -msgstr "" +msgstr "Tamaño de fuente monoespaciada" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +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" @@ -5560,29 +6056,31 @@ 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" -msgstr "" +msgstr "Nivel cero de montañas" #: src/settings_translation_file.cpp msgid "Mouse sensitivity" -msgstr "" +msgstr "Sensibilidad del ratón" #: src/settings_translation_file.cpp msgid "Mouse sensitivity multiplier." -msgstr "" +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" @@ -5599,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 "" @@ -5606,29 +6108,38 @@ msgid "" "When running a server, clients connecting with this name are admins.\n" "When starting from the main menu, this is overridden." msgstr "" +"Nombre del jugador.\n" +"Cuando se ejecuta un servidor, los clientes que se conecten con este nombre " +"son administradores.\n" +"Al comenzar desde el menú principal, esto se anula." #: src/settings_translation_file.cpp 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 "" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Red" +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 "" +"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." -msgstr "" +msgstr "Los usuarios nuevos deben ingresar esta contraseña." #: src/settings_translation_file.cpp msgid "Noclip" @@ -5638,25 +6149,22 @@ msgstr "" 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 "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" +msgstr "Ruidos" #: src/settings_translation_file.cpp msgid "Number of emerge threads" @@ -5677,33 +6185,26 @@ 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" +"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 "Number of parallax occlusion iterations." -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" -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 "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback 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 "" @@ -5711,92 +6212,76 @@ 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 "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion" -msgstr "Oclusión de paralaje" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion bias" -msgstr "Oclusión de paralaje" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion iterations" -msgstr "Oclusión de paralaje" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion mode" -msgstr "Oclusión de paralaje" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Oclusión de paralaje" +msgid "Optional override for chat weblink color." +msgstr "Anulación opcional del color de un enlace web en el chat." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" +"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.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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" @@ -5812,15 +6297,22 @@ msgstr "Tecla vuelo" msgid "Pitch move mode" msgstr "Modo de movimiento de inclinación activado" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Tecla Colocar" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +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" @@ -5830,43 +6322,52 @@ msgstr "Distancia de transferencia del jugador" msgid "Player versus player" msgstr "Jugador contra jugador" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Filtrado bilineal" + #: 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 "" +"Puerto de conectarse (UDP).\n" +"Nota que el campo de puerto en el menú principal anula 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 "" +"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." -msgstr "" +msgstr "Evitar que mods hagan cosas inseguras como ejecutar 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 "" +"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" -msgstr "" +msgstr "Perfilador" #: src/settings_translation_file.cpp msgid "Profiler toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" +msgstr "Tecla para alternar perfiles" #: src/settings_translation_file.cpp msgid "Prometheus listener address" @@ -5875,14 +6376,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" 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 "" @@ -5890,14 +6391,17 @@ 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" -msgstr "" +msgstr "Entrada aleatoria" #: src/settings_translation_file.cpp msgid "Range select key" @@ -5905,30 +6409,31 @@ 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 -#, fuzzy msgid "Regular font path" -msgstr "Ruta de fuentes" +msgstr "Ruta de fuente regular" #: src/settings_translation_file.cpp msgid "Remote media" -msgstr "" +msgstr "Medios remotos" #: src/settings_translation_file.cpp msgid "Remote port" -msgstr "" +msgstr "Puerto 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 "" +"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." -msgstr "" +msgstr "Sustituye el menú principal por defecto con uno personalizado." #: src/settings_translation_file.cpp #, fuzzy @@ -5948,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" @@ -5959,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" @@ -5969,10 +6491,6 @@ msgstr "" msgid "Right key" msgstr "Tecla derecha" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp #, fuzzy msgid "River channel depth" @@ -5992,12 +6510,11 @@ msgstr "Ruido de río" #: src/settings_translation_file.cpp msgid "River size" -msgstr "" +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" @@ -6013,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" @@ -6021,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" @@ -6043,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" @@ -6070,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 @@ -6150,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" @@ -6177,10 +6719,20 @@ msgstr "Puerto del servidor" 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" @@ -6190,10 +6742,57 @@ 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 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: 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 "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"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 +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Establecer en verdero para habilitar el mapeo de sombras.\n" +"Requiere que los sombreadores estén habilitados." #: src/settings_translation_file.cpp #, fuzzy @@ -6222,6 +6821,13 @@ msgstr "" "Habilita mapeado de oclusión de paralaje.\n" "Requiere habilitar sombreadores." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Ruta de sombreador" @@ -6233,6 +6839,27 @@ 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 +msgid "Shadow filter quality" +msgstr "Calidad de captura de pantalla" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" #: src/settings_translation_file.cpp #, fuzzy @@ -6243,23 +6870,32 @@ msgstr "Compensado de sombra de fuente, si es 0 no se dibujará la sombra." #: src/settings_translation_file.cpp #, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Compensado de sombra de fuente, si es 0 no se dibujará la sombra." +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" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "Fuente en negrita por defecto" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -6281,6 +6917,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -6314,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" @@ -6334,20 +6978,17 @@ 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 +msgid "Soft shadow radius" +msgstr "Alfa de sombra de la fuente" #: src/settings_translation_file.cpp msgid "Sound" msgstr "Sonido" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Tecla especial" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6357,11 +6998,24 @@ 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 "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -6372,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" @@ -6390,10 +7044,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "La fuerza del paralaje del modo 3D." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Fuerza de los mapas normales generados." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6429,20 +7079,24 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Temperature variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain alternative noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain base noise" -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 "Ruido alternativo de terreno" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Ruido base del terreno" + +#: src/settings_translation_file.cpp msgid "Terrain height" -msgstr "Altura base del terreno" +msgstr "Altura del terreno" #: src/settings_translation_file.cpp msgid "Terrain higher noise" @@ -6450,7 +7104,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Terrain noise" -msgstr "" +msgstr "Ruido del terreno" #: src/settings_translation_file.cpp msgid "" @@ -6458,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 "" @@ -6465,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" @@ -6474,6 +7134,13 @@ msgstr "" msgid "Texture path" msgstr "Ruta de la textura" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6486,7 +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 "La zona muerta del joystick" #: src/settings_translation_file.cpp msgid "" @@ -6496,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 "" @@ -6543,18 +7214,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6572,6 +7243,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6580,14 +7257,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"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 "" @@ -6617,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 @@ -6633,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" @@ -6645,9 +7323,22 @@ msgid "Touch screen threshold" msgstr "Límite de ruido de playa" #: src/settings_translation_file.cpp -msgid "Trees noise" +#, 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 "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" @@ -6658,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" @@ -6665,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" @@ -6698,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." @@ -6710,17 +7404,41 @@ 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 "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"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 @@ -6728,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" @@ -6753,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." @@ -6782,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" @@ -6798,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" @@ -6817,7 +7536,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6844,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" @@ -6856,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." @@ -6894,6 +7613,10 @@ msgstr "Oleaje en el agua" msgid "Waving plants" msgstr "Movimiento de plantas" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6915,18 +7638,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6961,14 +7682,24 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "Componente de altura del tamaño inicial de la ventana." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -6980,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 "" @@ -7037,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." @@ -7045,87 +7779,44 @@ 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" -msgstr "" +msgstr "Tiempo de espera de descarga por cURL" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "Tiempo de espera de cURL" #: src/settings_translation_file.cpp msgid "cURL parallel limit" -msgstr "" +msgstr "Límite de cURL en paralelo" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Tiempo de espera de cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "- Modo creativo: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Activar cinemático" - -#~ msgid "Select Package File:" -#~ msgstr "Seleccionar el archivo del paquete:" - -#~ msgid "Waving Water" -#~ msgstr "Oleaje" - -#~ msgid "Waving water" -#~ msgstr "Oleaje en el agua" - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "Características de la Lava" - -#~ msgid "IPv6 support." -#~ msgstr "soporte IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Alfa de sombra de fuentes (opacidad, entre 0 y 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Altura de las montañas en tierras flotantes" - -#~ msgid "Floatland base height noise" -#~ msgstr "Ruido de altura base para tierra flotante" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Habilita el mapeado de tonos fílmico" - -#~ msgid "Enable VBO" -#~ msgstr "Activar VBO" +#~ msgid "- Damage: " +#~ msgstr "- Daño: " #~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Define áreas de terreno liso flotante.\n" -#~ "Las zonas flotantes lisas se producen cuando el ruido > 0." +#~ "0 = oclusión de paralaje con información de inclinación (más rápido).\n" +#~ "1 = mapa de relieve (más lento, más preciso)." -#, fuzzy -#~ msgid "Darkness sharpness" -#~ msgstr "Agudeza de la obscuridad" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Controla el ancho de los túneles, un valor menor crea túneles más anchos." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Controla la densidad del terreno montañoso flotante.\n" -#~ "Se agrega un desplazamiento al valor de ruido 'mgv7_np_mountain'." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Modifica cómo las tierras flotantes del tipo montaña aparecen arriba y " -#~ "abajo del punto medio." +#~ msgid "Address / Port" +#~ msgstr "Dirección / puerto" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7136,14 +7827,368 @@ msgstr "Tiempo de espera de cURL" #~ "mayores son mas brillantes.\n" #~ "Este ajuste es solo para cliente y es ignorado por el servidor." -#~ msgid "Path to save screenshots at." -#~ msgstr "Ruta para guardar las capturas de pantalla." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Modifica cómo las tierras flotantes del tipo montaña aparecen arriba y " +#~ "abajo del punto medio." -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Descargando e instalando $1, por favor espere..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "¿Estás seguro de querer reiniciar el mundo de un jugador?" #~ 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 " +#~ "pantalla completa." + +#~ msgid "Bump Mapping" +#~ msgstr "Mapeado de relieve" + +#~ msgid "Bumpmapping" +#~ msgstr "Mapeado de relieve" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Cambia la UI del menú principal:\n" +#~ "- Completo: Múltiples mundos, elección de juegos y texturas, etc.\n" +#~ "- Simple: Un solo mundo, sin elección de juegos o texturas.\n" +#~ "Puede ser necesario en pantallas pequeñas." + +#~ msgid "Config mods" +#~ msgstr "Configurar mods" + +#~ 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." +#~ msgstr "" +#~ "Controla la densidad del terreno montañoso flotante.\n" +#~ "Se agrega un desplazamiento al valor de ruido 'mgv7_np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Controla el ancho de los túneles, un valor menor crea túneles más anchos." + +#~ msgid "Credits" +#~ msgstr "Créditos" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Color de la cruz (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Daño activado" + +#, fuzzy +#~ msgid "Darkness sharpness" +#~ msgstr "Agudeza de la obscuridad" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Tiempo de espera predeterminado para cURL, en milisegundos.\n" +#~ "Sólo tiene efecto si está compilado con cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Define áreas de terreno liso flotante.\n" +#~ "Las zonas flotantes lisas se producen cuando el ruido > 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Habilita mapeado de relieves para las texturas. El mapeado de normales " +#~ "necesita ser\n" +#~ "suministrados por el paquete de texturas, o será generado " +#~ "automaticamente.\n" +#~ "Requiere habilitar sombreadores." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Habilita el mapeado de tonos fílmico" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Habilita la generación de mapas de normales (efecto realzado) en el " +#~ "momento.\n" +#~ "Requiere habilitar mapeado de relieve." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "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." +#~ msgstr "" +#~ "Opción experimental, puede causar espacios visibles entre los\n" +#~ "bloques si se le da un valor mayor a 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS (cuadros/s) en el menú de pausa" + +#~ msgid "Fallback font shadow" +#~ msgstr "Sombra de la fuente de reserva" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Alfa de la sombra de la fuente de reserva" + +#~ 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" + +#~ msgid "Floatland mountain height" +#~ msgstr "Altura de las montañas en tierras flotantes" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Alfa de sombra de fuentes (opacidad, entre 0 y 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Tamaño de la fuente de reserva en punto (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Fuentes FreeType" + +#~ msgid "Full screen BPP" +#~ msgstr "Profundidad de color en pantalla completa" + +#~ msgid "Game" +#~ msgstr "Juego" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Generar mapas normales" + +#~ 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" + +#~ msgid "Main" +#~ msgstr "Principal" + +#~ msgid "Main menu style" +#~ msgstr "Estilo del menú principal" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ 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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minimapa en modo radar, Zoom x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minimapa en modo superficie, Zoom x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minimapa en modo superficie, Zoom x4" + +#~ msgid "Name / Password" +#~ msgstr "Nombre / contraseña" + +#~ msgid "Name/Password" +#~ msgstr "Nombre / contraseña" + +#~ msgid "No" +#~ msgstr "No" + #~ msgid "Ok" #~ msgstr "Aceptar" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Oclusión de paralaje" + +#, fuzzy +#~ msgid "Parallax occlusion" +#~ msgstr "Oclusión de paralaje" + +#, fuzzy +#~ msgid "Parallax occlusion bias" +#~ msgstr "Oclusión de paralaje" + +#, fuzzy +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Oclusión de paralaje" + +#, fuzzy +#~ msgid "Parallax occlusion mode" +#~ msgstr "Oclusión de paralaje" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Oclusión de paralaje" + +#~ 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" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Reiniciar mundo de un jugador" + +#~ 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 " +#~ "not be drawn." +#~ msgstr "Compensado de sombra de fuente, si es 0 no se dibujará la sombra." + +#~ msgid "Special" +#~ msgstr "Especial" + +#~ msgid "Special key" +#~ msgstr "Tecla especial" + +#~ msgid "Start Singleplayer" +#~ msgstr "Comenzar un jugador" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Fuerza de los mapas normales generados." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "" +#~ "Para habilitar los sombreadores debe utilizar el controlador OpenGL." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Activar cinemático" + +#~ msgid "View" +#~ msgstr "Ver" + +#~ msgid "Waving Water" +#~ msgstr "Oleaje" + +#~ msgid "Waving water" +#~ msgstr "Oleaje en el agua" + +#~ 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." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/et/minetest.po b/po/et/minetest.po index 67b8210b3..150005f02 100644 --- a/po/et/minetest.po +++ b/po/et/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Estonian (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-05-03 19:14+0000\n" -"Last-Translator: Janar Leas <janar.leas@gmail.com>\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/" "minetest/et/>\n" "Language: et\n" @@ -12,7 +12,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.1-dev\n" +"X-Generator: Weblate 4.7.1-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Tühi käsk." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Välju menüüsse" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Väär käsk: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Anti käsklus: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Võrgus mängijate loend" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Mängijaid võrgus: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Võõrustaja piiras selle käsu kasutuse." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,9 +58,39 @@ msgstr "Ärka ellu" msgid "You died" msgstr "Said surma" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Võimalikud käsud:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Võimalikud käsud: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Käsk pole saadaval: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Leia abi käskude kohta" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "'.help <käsk>' jagab rohkem teadmisi, ning '.help all' loetleb kõik." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <käsk>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "Valmis" + +#: builtin/fstk/ui.lua +#, fuzzy +msgid "<none available>" +msgstr "Käsk pole saadaval: " #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -40,15 +106,36 @@ msgstr "Peamenüü" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "Taasta ühendus" +msgstr "Taasühenda" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" msgstr "Server taotles taasühendumist:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Laadimine..." +#: 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. " @@ -63,10 +150,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Server toetab protokolli versioone $1 kuni $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Proovi lubada uuesti avalike serverite loend ja kontrolli oma Interneti " -"ühendust." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +161,26 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Sõltuvused:" @@ -111,12 +205,12 @@ msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"Tõrge MOD-i \"$1\" lubamisel, kuna sisaldab keelatud sümboleid. Lubatud on " +"MOD-i \"$1\" kasutamine nurjus, kuna sisaldab keelatud sümboleid. Lubatud on " "ainult [a-z0-9_] märgid." #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Leia rohkem MODe" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -159,29 +253,67 @@ msgstr "Maailm:" msgid "enabled" msgstr "Sisse lülitatud" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" on juba olemas. Kas sa tahad seda üle kirjutada?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Paigaldatakse sõltuvused $1 ja $2." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 $2 poolt" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 allalaadimisel,\n" +"$2 ootel" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 allalaadimine..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 vajaliku sõltuvust polnud leida." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "Installitakse $1 ja $2 sõltuvus jäetakse vahele." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Kõik pakid" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Juba installeeritud" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Tagasi peamenüüsse" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Põhi Mäng:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB ei ole olemas kui Minetest on kompileeritud ilma cURL'ita" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Laadimine..." +msgstr "Allalaadimine..." #: builtin/mainmenu/dlg_contentstore.lua 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" @@ -190,7 +322,19 @@ msgid "Install" msgstr "Paigalda" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Paigalda $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Paigalda puuduvad sõltuvused" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "Paigaldus: Toetamata failitüüp \"$1\" või katkine arhiiv" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "MOD-id" @@ -203,9 +347,24 @@ msgid "No results" msgstr "Tulemused puuduvad" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Otsi" +msgid "No updates" +msgstr "Värskendusi pole" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Ei leitud" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Ümber kirjuta" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Palun tee kindlaks et põhi mäng on õige." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Ootel" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -220,8 +379,12 @@ msgid "Update" msgstr "Uuenda" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Uuenda kõiki [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Vaata rohkem infot veebibrauseris" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -229,121 +392,117 @@ msgstr "Maailm nimega \"$1\" on juba olemas" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Täiendav maastik" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "" +msgstr "Külmetus kõrgus" #: builtin/mainmenu/dlg_create_world.lua msgid "Altitude dry" -msgstr "" +msgstr "Põua kõrgus" #: builtin/mainmenu/dlg_create_world.lua msgid "Biome blending" -msgstr "" +msgstr "Loodusvööndi hajumine" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" -msgstr "" +msgstr "Loodusvööndid" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Koobaste läve" +msgstr "Koopasaalid" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Oktaavid" +msgstr "Koopad" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Loo" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Teave:" - -#: 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" +msgstr "Ilmestused" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Development Test is meant for developers." +msgstr "Hoiatus: \"Arendustest\" on mõeldud arendajatele." + +#: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "Dungeon noise" +msgstr "Keldrid" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Lame maastik" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "" +msgstr "Taevas hõljuvad saared" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Mäng" +msgstr "Lendsaared (katseline)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Mitte-fraktaalse maastiku tekitamine: mered ja süvapinnas" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Künkad" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" -msgstr "" +msgstr "Rõsked jõed" #: builtin/mainmenu/dlg_create_world.lua 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 "" +msgstr "Järved" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgstr "Madal niiskus ja suur kuum põhjustavad madala või kuiva jõesängi" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" msgstr "Kaardi generaator" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen flags" -msgstr "Põlvkonna kaardid" +msgstr "Kaartiloome lipud" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Põlvkonna kaardid" +msgstr "Kaartiloome-põhised lipud" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "Mäed" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Muda voog" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Käikude ja koobaste võrgustik" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -351,72 +510,68 @@ msgstr "Mäng valimata" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Ilma jahenemine kõrgemal" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Ilma kuivenemine kõrgemal" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Parem Windowsi nupp" +msgstr "Jõed" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Jõed merekõrgusel" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Seed" -msgstr "Seed" +msgstr "Külv" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Sujuv loodusvööndi vaheldumine" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Rajatised ilmuvad maastikul (v6 tekitatud puudele ja tihniku rohule mõju ei " +"avaldu)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Struktuurid ilmuvad maastikul, enamasti puud ja teised taimed" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Rohtla, Lagendik" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Rohtla, Lagendik, Tihnik" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Rohtla, Lagendik, Tihnik, Tundra, Laas" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "Maapinna kulumine" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Puud ja tihniku rohi" #: builtin/mainmenu/dlg_create_world.lua msgid "Vary river depth" -msgstr "" +msgstr "Muutlik jõe sügavus" #: 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 "Hoiatus: minimaalne arendustest on mõeldud arendajatele." +msgstr "Väga suured koopasaalid maapõue sügavuses" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -448,13 +603,46 @@ 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" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Nimetad ümber MOD-i paki:" +msgstr "Taasnimeta MOD-i pakk:" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "" @@ -470,7 +658,7 @@ msgstr "(Kirjeldus seadistusele puudub)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "2D Noise" -msgstr "2-mõõtmeline müra" +msgstr "kahemõõtmeline müra" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" @@ -481,6 +669,16 @@ 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" @@ -494,18 +692,19 @@ msgstr "Lubatud" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Lacunarity" -msgstr "Lakunaarsus" +msgstr "Pinna auklikus" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Octaves" -msgstr "Oktaavid" +msgstr "Oktavid" #: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Offset" msgstr "Nihe" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Püsivus" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -524,6 +723,10 @@ msgstr "Taasta vaikeväärtus" msgid "Scale" msgstr "Ulatus" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Otsi" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Vali kataloog" @@ -532,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" @@ -550,7 +753,7 @@ msgstr "X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X spread" -msgstr "X levitus" +msgstr "X levi" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y" @@ -558,7 +761,7 @@ msgstr "Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y spread" -msgstr "Y levitus" +msgstr "Y levi" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z" @@ -566,7 +769,7 @@ msgstr "Z" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z spread" -msgstr "Z levitus" +msgstr "Z levi" #. ~ "absvalue" is a noise parameter flag. #. It is short for "absolute value". @@ -574,14 +777,14 @@ msgstr "Z levitus" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "absvalue" -msgstr "absoluutväärtus" +msgstr "täisväärtus" #. ~ "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 "vaikesätted" +msgstr "algne" #. ~ "eased" is a noise parameter flag. #. It is used to make the map smoother and @@ -612,14 +815,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" "Paigalda mod: Sobiva katalooginime leidmine ebaõnnestus mod-komplektile $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Paigaldus: Toetamata failitüüp \"$1\" või katkine arhiiv" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Paigaldus: fail: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Ei leitud sobivat mod-i ega mod-komplekti" @@ -640,6 +835,60 @@ msgstr "Mod nimega $1 paigaldamine nurjus" msgid "Unable to install a modpack as a $1" msgstr "Mod-komplekt nimega $1 paigaldamine nurjus" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Laadimine..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Avalike serverite loend on keelatud" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Proovi lubada uuesti avalike serverite loend ja kontrolli oma Interneti " +"ühendust." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Teavet" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Tegevad panustajad" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Põhi arendajad" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Avalik Kasutaja Andmete Kaust" + +#: 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 "" +"Kasutaja poolsete maailmate, mängude, mod-de ning tekstuuri pakide\n" +"kausta avamine faili-halduris." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Eelnevad panustajad" + +#: builtin/mainmenu/tab_about.lua +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" @@ -680,61 +929,33 @@ msgstr "Eemalda pakett" msgid "Use Texture Pack" msgstr "Vali tekstuurikomplekt" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Co-arendaja" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Põhiline arendaja" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Tänuavaldused" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Early arendajad" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Eelmised põhilised arendajad" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "Kuuluta serverist" +msgstr "Võõrustamise kuulutamine" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" -msgstr "Aadress" +msgstr "Seo aadress" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigureeri" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "Kujunduslik mängumood" +msgstr "Looja" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" -msgstr "Lülita valu sisse" +msgstr "Ellujääja" #: builtin/mainmenu/tab_local.lua msgid "Host Game" -msgstr "Majuta mäng" +msgstr "Võõrusta" #: builtin/mainmenu/tab_local.lua msgid "Host Server" -msgstr "Majuta server" +msgstr "Majuta külastajatele" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nimi/Parool" +msgstr "Lisa mänge sisuvaramust" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -742,68 +963,89 @@ msgstr "Uus" #: builtin/mainmenu/tab_local.lua msgid "No world created or selected!" -msgstr "Ühtegi maailma pole loodud ega valitud!" +msgstr "Pole valitud ega loodud ühtegi maailma!" #: builtin/mainmenu/tab_local.lua msgid "Play Game" msgstr "Mängi" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Vali mod" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Vali maailm:" #: builtin/mainmenu/tab_local.lua msgid "Server Port" -msgstr "Serveri port" +msgstr "Võõrustaja kanal" #: builtin/mainmenu/tab_local.lua msgid "Start Game" -msgstr "Alusta mäng" +msgstr "Alusta mängu" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Aadress / Port" +msgid "Address" +msgstr "Aadress" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Liitu" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Tühjenda" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" -msgstr "Loov režiim" +msgstr "Looja" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Kahjustamine lubatud" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Vigastused mängijatelt" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Eemalda lemmik" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Lemmikud" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Lisa lemmikuks" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Ühildumatud Võõrustajad" #: builtin/mainmenu/tab_online.lua msgid "Join Game" -msgstr "Liitu mänguga" +msgstr "Ühine" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nimi / Salasõna" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" -msgstr "Ping" +msgstr "Viivitus" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP lubatud" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Avalikud võõrustajad" + +#: builtin/mainmenu/tab_online.lua +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" @@ -811,7 +1053,7 @@ msgstr "2x" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "3D pilved" +msgstr "Ruumilised pilved" #: builtin/mainmenu/tab_settings.lua msgid "4x" @@ -827,24 +1069,16 @@ msgstr "Kõik sätted" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "Antialiasing:" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Olete kindel, et lähtestate oma üksikmängija maailma?" +msgstr "Silu servad:" #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" -msgstr "Salvesta ekraani suurus" +msgstr "Mäleta ekraani suurust" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Bi-lineaarne filtreerimine" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Muhkkaardistamine" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Vaheta klahve" @@ -853,26 +1087,39 @@ msgstr "Vaheta klahve" msgid "Connected Glass" msgstr "Ühendatud klaas" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Elavad varjud" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Elavad varjud: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Uhked lehed" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Loo normaalkaardistusi" +msgid "High" +msgstr "Kõrge" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Madal" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Keskmine" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "Mipmap" +msgstr "KaugVaatEsemeKaart" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Ei" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Filtrita" @@ -883,11 +1130,11 @@ msgstr "Mipmapita" #: builtin/mainmenu/tab_settings.lua msgid "Node Highlighting" -msgstr "Blokkide esiletõstmine" +msgstr "Valitud klotsi ilme" #: builtin/mainmenu/tab_settings.lua msgid "Node Outlining" -msgstr "Blokkide kontuur" +msgstr "Klotsi servad" #: builtin/mainmenu/tab_settings.lua msgid "None" @@ -901,18 +1148,10 @@ msgstr "Läbipaistmatud lehed" msgid "Opaque Water" msgstr "Läbipaistmatu vesi" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Osakesed" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Lähtesta üksikmängija maailm" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Ekraan:" @@ -925,6 +1164,10 @@ msgstr "Sätted" msgid "Shaders" msgstr "Varjutajad" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shaderid (katselised)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Varjutajad (pole saadaval)" @@ -941,22 +1184,28 @@ msgstr "Sujuv valgustus" msgid "Texturing:" msgstr "Tekstureerimine:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Aktiveerimiseks varjud, nad vajavad OpenGL draiver." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp 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 msgid "Trilinear Filter" msgstr "Tri-lineaar filtreerimine" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Ülikõrge" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Vägamadal" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Lehvivad lehed" @@ -969,23 +1218,12 @@ msgstr "Lainetavad vedelikud" msgid "Waving Plants" msgstr "Lehvivad taimed" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Jah" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Seadista mod-e" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Peamine" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Alusta üksikmängu" - #: 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." @@ -995,11 +1233,11 @@ msgstr "Valmis!" #: src/client/client.cpp msgid "Initializing nodes" -msgstr "Blokkide häälestamine" +msgstr "Klotsidega täitmine" #: src/client/client.cpp msgid "Initializing nodes..." -msgstr "Blokkide häälestamine..." +msgstr "Klotsidega täitmine..." #: src/client/client.cpp msgid "Loading textures..." @@ -1014,7 +1252,8 @@ msgid "Connection error (timed out?)" msgstr "Ühenduse viga (Aeg otsas?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Ei leia ega suuda jätkata mängu \"" #: src/client/clientlauncher.cpp @@ -1045,18 +1284,6 @@ msgstr "Salasõnafaili avamine ebaõnnestus: " msgid "Provided world path doesn't exist: " msgstr "Maailma failiteed pole olemas: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1069,14 +1296,6 @@ msgstr "" msgid "- Address: " msgstr "- Aadress: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Kujunduslik mängumood: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Valu: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Režiim: " @@ -1092,12 +1311,22 @@ msgstr "- Avalik: " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "- PvP: " +msgstr "- Üksteise vastu: " #: src/client/game.cpp msgid "- Server Name: " msgstr "- Serveri nimi: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Ilmnes viga:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Automaatne edastus keelatud" @@ -1106,6 +1335,23 @@ msgstr "Automaatne edastus keelatud" msgid "Automatic forward enabled" msgstr "Automaatne edastus lubatud" +#: src/client/game.cpp +#, fuzzy +msgid "Block bounds hidden" +msgstr "Klotsi piirid" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Kaamera värskendamine on keelatud" @@ -1114,6 +1360,10 @@ msgstr "Kaamera värskendamine on keelatud" msgid "Camera update enabled" msgstr "Kaamera värskendamine on lubatud" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Vaheta parooli" @@ -1126,6 +1376,10 @@ msgstr "Filmirežiim on keelatud" msgid "Cinematic mode enabled" msgstr "Filmirežiim on lubatud" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Kliendipoolne skriptimine on keelatud" @@ -1134,6 +1388,10 @@ msgstr "Kliendipoolne skriptimine on keelatud" msgid "Connecting to server..." msgstr "Serveriga ühenduse loomine..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Jätka" @@ -1146,13 +1404,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1162,15 +1420,20 @@ msgstr "" "- %s: liigu vasakule\n" "- %s: liigu paremale\n" "- %s: hüppa/roni\n" +"- %s: kaeva/viruta\n" +"- %s: paigalda/kasuta\n" "- %s: hiili/mine alla\n" "- %s: viska ese\n" "- %s: seljakott\n" "- Hiir: keera/vaata\n" -"- Hiire vasakklõps: kaeva/viruta\n" -"- Hiire paremklõps: paigalda/kasuta\n" "- Hiireratas: vali ese\n" "- %s: vestlus\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Kliendi loomine..." @@ -1227,6 +1490,11 @@ msgstr "Piiramatu vaatamisulatus keelatud" 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" @@ -1285,7 +1553,7 @@ msgstr "Esemete määratlused..." #: src/client/game.cpp msgid "KiB/s" -msgstr "" +msgstr "KiB/s" #: src/client/game.cpp msgid "Media..." @@ -1293,39 +1561,15 @@ msgstr "Meedia..." #: src/client/game.cpp msgid "MiB/s" -msgstr "" +msgstr "MiB/s" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" msgstr "Pisikaardi keelab hetkel mäng või MOD" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Pisikaart peidetud" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Radarkaart, Suurendus ×1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Radarkaart, Suurendus ×2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Radarkaart, Suurendus ×4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Pinnakaart, Suurendus ×1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Pinnakaart, Suurendus ×2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Pinnakaart, Suurendus ×4" +msgid "Multiplayer" +msgstr "Hulgimängija" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1341,15 +1585,15 @@ msgstr "Haakumatus lubatud (pole 'haakumatus' volitust)" #: src/client/game.cpp msgid "Node definitions..." -msgstr "" +msgstr "Klotsi määratlused..." #: src/client/game.cpp msgid "Off" -msgstr "" +msgstr "Väljas" #: src/client/game.cpp msgid "On" -msgstr "" +msgstr "Sees" #: src/client/game.cpp msgid "Pitch move mode disabled" @@ -1361,19 +1605,19 @@ msgstr "" #: src/client/game.cpp msgid "Profiler graph shown" -msgstr "" +msgstr "Koormushinnangu kuvamine" #: src/client/game.cpp msgid "Remote server" -msgstr "" +msgstr "Kaug võõrustaja" #: src/client/game.cpp msgid "Resolving address..." -msgstr "" +msgstr "Aadressi lahendamine..." #: src/client/game.cpp msgid "Shutting down..." -msgstr "" +msgstr "Sulgemine..." #: src/client/game.cpp msgid "Singleplayer" @@ -1389,11 +1633,11 @@ msgstr "Heli vaigistatud" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Heli süsteem on keelatud" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "See kooste ei toeta heli süsteemi" #: src/client/game.cpp msgid "Sound unmuted" @@ -1401,35 +1645,50 @@ msgstr "Heli taastatud" #: src/client/game.cpp #, c-format -msgid "Viewing range changed to %d" +msgid "The server is probably running a different version of %s." msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "Vaate kaugus on nüüd: %d" + #: src/client/game.cpp #, c-format msgid "Viewing range is at maximum: %d" -msgstr "" +msgstr "Vaate kaugus on suurim võimalik: %d" #: src/client/game.cpp #, c-format msgid "Viewing range is at minimum: %d" -msgstr "" +msgstr "Vaate kaugus on vähim võimalik: %d" #: src/client/game.cpp #, c-format msgid "Volume changed to %d%%" -msgstr "" +msgstr "Helitugevus muutus %d%%" #: src/client/game.cpp msgid "Wireframe shown" -msgstr "" +msgstr "Raamvõrgustiku paljastus" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "" +msgstr "Suumimine on praegu mängu või modi tõttu keelatud" #: src/client/game.cpp msgid "ok" -msgstr "" +msgstr "sobib" #: src/client/gameui.cpp msgid "Chat hidden" @@ -1437,41 +1696,36 @@ msgstr "Vestlus peidetud" #: src/client/gameui.cpp msgid "Chat shown" -msgstr "" +msgstr "Vestluse näitamine" #: src/client/gameui.cpp msgid "HUD hidden" -msgstr "" +msgstr "Liidese peitmine" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "" +msgstr "Liidese näitamine" #: src/client/gameui.cpp msgid "Profiler hidden" -msgstr "" +msgstr "Koormushindaja peitmine" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" +msgstr "Koormushinnang (%d leht %d-st)" #: src/client/keycode.cpp msgid "Apps" msgstr "Aplikatsioonid" #: src/client/keycode.cpp -#, fuzzy msgid "Backspace" -msgstr "Tagasi" +msgstr "Tagasinihe" #: src/client/keycode.cpp msgid "Caps Lock" -msgstr "" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Tühjenda" +msgstr "Suurtähelukk" #: src/client/keycode.cpp msgid "Control" @@ -1502,29 +1756,24 @@ msgid "Home" msgstr "Kodu" #: src/client/keycode.cpp -#, fuzzy msgid "IME Accept" -msgstr "Nõustu" +msgstr "Sisendviisiga nõustumine" #: src/client/keycode.cpp -#, fuzzy msgid "IME Convert" -msgstr "Konverteeri" +msgstr "Sisendviisi teisendamine" #: src/client/keycode.cpp -#, fuzzy msgid "IME Escape" -msgstr "Põgene" +msgstr "Sisendviisi paoklahv" #: src/client/keycode.cpp -#, fuzzy msgid "IME Mode Change" -msgstr "Moodi vahetamine" +msgstr "Sisendviisi laadi vahetus" #: src/client/keycode.cpp -#, fuzzy msgid "IME Nonconvert" -msgstr "Konverteerimatta" +msgstr "Sisendviisi mitte-teisendada" #: src/client/keycode.cpp msgid "Insert" @@ -1633,11 +1882,11 @@ msgstr "OEM Tühi" #: src/client/keycode.cpp msgid "Page down" -msgstr "" +msgstr "Lehekülg alla" #: src/client/keycode.cpp msgid "Page up" -msgstr "" +msgstr "Lehekülg üles" #: src/client/keycode.cpp msgid "Pause" @@ -1725,22 +1974,31 @@ msgstr "X Nupp 2" msgid "Zoom" msgstr "Suumi" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Paroolid ei ole samad!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Pisikaart peidetud" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Radarkaart, Suurendus ×%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Pinnakaart, Suurendus ×%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Pisikaart tekstuur-laadis" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "$1 allalaadimine nurjus" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1748,27 +2006,34 @@ msgid "Proceed" msgstr "Jätka" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Eriline\" = roni alla" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = roni alla" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Autoforward" -msgstr "Automaatedasiliikumine" +msgstr "Iseastuja" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" -msgstr "" +msgstr "Automaatne hüppamine" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Tagasi" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Klotsi piirid" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Muuda kaamerat" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Jututuba" @@ -1782,11 +2047,11 @@ msgstr "Konsool" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. range" -msgstr "" +msgstr "Vähenda ulatust" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. volume" -msgstr "" +msgstr "Vähenda valjust" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" @@ -1802,7 +2067,7 @@ msgstr "Edasi" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. range" -msgstr "" +msgstr "Suurenda ulatust" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" @@ -1821,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" @@ -1832,7 +2095,7 @@ msgstr "Kohalik käsk" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" -msgstr "" +msgstr "Vaigista" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" @@ -1840,7 +2103,7 @@ msgstr "Järgmine üksus" #: src/gui/guiKeyChangeMenu.cpp msgid "Prev. item" -msgstr "" +msgstr "Eelmine asi" #: src/gui/guiKeyChangeMenu.cpp msgid "Range select" @@ -1854,10 +2117,6 @@ msgstr "Kuvatõmmis" msgid "Sneak" msgstr "Hiilimine" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Lülita HUD sisse/välja" @@ -1898,10 +2157,6 @@ msgstr "Vajuta nuppu" msgid "Change" msgstr "Muuda" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Kinnita parooli" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Uus parool" @@ -1910,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" @@ -1919,15 +2178,10 @@ msgid "Muted" msgstr "Vaigistatud" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +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 "" - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -1935,18 +2189,32 @@ msgstr "" 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" "If disabled, virtual joystick will center to first-touch's position." msgstr "" +"(Android) Parendab virtuaalse juhtkangi asukohta.\n" +"Kui keelatud, siis juhtkangi kese asub esmapuute kohal." #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Virtuaal-juhtkangi kasutamine \"Aux1\" nupu päästmiseks.\n" +"Kui lubatud, juhtkang päästab ka \"Aux1\" nupu kui läheb väljapoole pearingi." #: src/settings_translation_file.cpp msgid "" @@ -1971,39 +2239,33 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" +msgstr "Kahemõõtmeline müra mis määrab seljandike kuju/suuruse." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgstr "Kahemõõtmeline müra mis määrab vooremaa kuju/suuruse." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgstr "Kahemõõtmeline müra mis määrab astmikkõrgustike kuju/suuruse." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" +msgstr "Kahemõõtmeline müra mis määrab seljandike ala suuruse/ilmingu." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +msgstr "Kahemõõtmeline müra mis määrab vooremaa ala suuruse/ilmingu." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" +msgstr "Kahemõõtmeline müra mis määrab astmikkõrgendike ala suuruse/ilmingu." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgstr "Kahemõõtmeline müra mis paigutab jõeorud ja kanalid." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2011,7 +2273,7 @@ msgstr "3D pilved" #: src/settings_translation_file.cpp msgid "3D mode" -msgstr "" +msgstr "3D-režiim" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" @@ -2019,7 +2281,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "" +msgstr "Üüratuid koopasaale määratlev kolmemõõtmeline müra." #: src/settings_translation_file.cpp msgid "" @@ -2037,19 +2299,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." -msgstr "" +msgstr "Kanjonjõe järsakkaldaid määratlev kolmemõõtmeline müra." #: src/settings_translation_file.cpp msgid "3D noise defining terrain." -msgstr "" +msgstr "Maastiku määratlev kolmemõõtmeline müra." #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." msgstr "" +"Kolmemõõtmeline müra kaljudele, eenditele, jms. Tavaliselt väikesed erisused." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" +msgstr "Kolmemõõtmeline müra, mis määratleb kambristike sageduse kaardijaos." #: src/settings_translation_file.cpp msgid "" @@ -2065,6 +2328,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2073,27 +2340,31 @@ msgstr "" #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "Teade kõigile külalistele, kui võõrustaja kooleb." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" +msgstr "Teade kõigile külalistele, kui server kinni läheb." #: src/settings_translation_file.cpp msgid "ABM interval" -msgstr "" +msgstr "ABM sagedus" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "ABM-i ajakava" #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "" +msgstr "Kõrgeim piirang ilmumist ootavatele klotsiedele" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "Kiirendus õhus" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "Raskuskiirendus, (klotsi sekundis) sekundi kohta." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" @@ -2120,7 +2391,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Adds particles when digging a node." -msgstr "" +msgstr "Lendlevad osakesed klotsi kaevandamisel." #: src/settings_translation_file.cpp msgid "" @@ -2128,6 +2399,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2138,6 +2413,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Maailma nimi" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Arenenud sätted" @@ -2152,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 @@ -2220,13 +2500,17 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Automaatse edasiliikumise klahv" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." -msgstr "" +msgstr "Iseseisvalt hüppab üle ühe klotsi kordse tõkke." #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." @@ -2240,6 +2524,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1 võti" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tagasi liikumise klahv" @@ -2252,10 +2544,6 @@ msgstr "Baas maapinna tase" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2277,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 @@ -2285,11 +2573,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2317,8 +2605,9 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Muhkkaardistamine" +#, fuzzy +msgid "Camera" +msgstr "Muuda kaamerat" #: src/settings_translation_file.cpp msgid "" @@ -2391,14 +2680,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +msgid "Chat command time message threshold" +msgstr "Vestluskäskluse ajalise sõnumi lävi" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Käsklused" #: src/settings_translation_file.cpp msgid "Chat font size" @@ -2409,9 +2697,8 @@ msgid "Chat key" msgstr "Vestlusklahv" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Vestluse lülitusklahv" +msgstr "Vestlus päeviku täpsus" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2422,9 +2709,8 @@ msgid "Chat message format" msgstr "Vestluse sõnumi formaat" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message kick threshold" -msgstr "Vestlussõnumi kick läve" +msgstr "Vestlus sõnumi väljaviskamis lävi" #: src/settings_translation_file.cpp msgid "Chat message max length" @@ -2435,8 +2721,9 @@ msgid "Chat toggle key" msgstr "Vestluse lülitusklahv" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Käsklused" +#, fuzzy +msgid "Chat weblinks" +msgstr "Vestluse näitamine" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2454,6 +2741,12 @@ msgstr "Filmirežiimi klahv" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2474,6 +2767,10 @@ msgstr "" 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 "" @@ -2498,6 +2795,10 @@ msgstr "Pilved menüüs" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2525,6 +2826,22 @@ msgstr "" msgid "Command key" msgstr "Käsuklahv" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Ühenda klaasi" @@ -2535,7 +2852,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." -msgstr "" +msgstr "Ühendab klaasi, kui klots võimaldab." #: src/settings_translation_file.cpp msgid "Console alpha" @@ -2549,13 +2866,21 @@ msgstr "Konsooli värv" 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 "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" -msgstr "ContentDB URL" +msgstr "ContentDB aadress" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -2579,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 @@ -2610,7 +2937,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2618,7 +2947,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2626,9 +2957,8 @@ msgid "DPI" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Damage" -msgstr "Damage" +msgstr "Vigastused" #: src/settings_translation_file.cpp msgid "Debug info toggle key" @@ -2643,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 @@ -2681,14 +3011,14 @@ msgid "Default report format" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Vaikemäng" +msgstr "Vaike lasu hulk" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2719,12 +3049,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2783,18 +3107,29 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Desert noise threshold" -msgstr "" +msgstr "Müra künnis lagendikule" #: 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 "" +"Lagendikud ilmuvad kui np_biome ületab selle väärtuse.\n" +"Seda eiratakse, kui lipp 'lumistud' on lubatud." #: src/settings_translation_file.cpp 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" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Kaevamisel tekkivad osakesed" @@ -2807,6 +3142,16 @@ msgstr "Lülita sohituvastus välja" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2836,9 +3181,8 @@ msgid "Dungeon minimum Y" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Dungeon noise" -msgstr "Dungeon noise" +msgstr "Müra keldritele" #: src/settings_translation_file.cpp msgid "" @@ -2852,18 +3196,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2880,22 +3241,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2944,14 +3299,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2960,18 +3307,6 @@ msgstr "" msgid "Enables minimap." msgstr "Lubab minikaarti." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2980,6 +3315,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2988,12 +3333,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3005,7 +3344,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3024,18 +3367,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3054,7 +3385,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3088,15 +3419,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Filtering" -msgstr "Anisotroopne Filtreerimine" +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." @@ -3127,9 +3458,8 @@ msgid "Floatland minimum Y" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Põlvkonna kaardid" +msgstr "Müra lendsaartele" #: src/settings_translation_file.cpp msgid "Floatland taper exponent" @@ -3163,6 +3493,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3184,15 +3518,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3201,6 +3535,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3245,9 +3590,8 @@ msgid "Formspec full-screen background opacity (between 0 and 255)." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Forward key" -msgstr "Edasi" +msgstr "Edasi klahv" #: src/settings_translation_file.cpp msgid "Fourth of 4 2D noises that together define hill/mountain range height." @@ -3261,10 +3605,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3289,10 +3629,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3310,7 +3646,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3318,11 +3663,15 @@ msgid "Global callbacks" msgstr "" #: 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 junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" +"Üldised maailma loome omadused.\n" +"Maailma loome v6 puhul lipp 'ilmestused' ei avalda mõju puudele ja \n" +"tihniku rohule, kõigi teistega mõjutab see lipp kõiki ilmestusi." #: src/settings_translation_file.cpp msgid "" @@ -3340,28 +3689,39 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ground level" -msgstr "Põlvkonna kaardid" +msgstr "Pinna tase" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ground noise" -msgstr "Põlvkonna kaardid" +msgstr "Müra pinnasele" #: src/settings_translation_file.cpp 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 "" @@ -3369,8 +3729,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3392,31 +3752,25 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Height noise" -msgstr "Parem Windowsi nupp" +msgstr "Müra kõrgusele" #: src/settings_translation_file.cpp msgid "Height select noise" msgstr "" #: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Hill steepness" -msgstr "Põlvkonna kaardid" +msgstr "Küngaste järskus" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hill threshold" -msgstr "Põlvkonna kaardid" +msgstr "Küngaste lävi" #: src/settings_translation_file.cpp msgid "Hilliness1 noise" @@ -3605,10 +3959,17 @@ 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 "" @@ -3641,8 +4002,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3664,11 +4024,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3692,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 @@ -3709,6 +4077,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3725,11 +4099,6 @@ msgstr "" msgid "Ignore world errors" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "In-Game" -msgstr "Mäng" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -3743,9 +4112,8 @@ msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Inc. volume key" -msgstr "Konsool" +msgstr "Heli valjemaks" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." @@ -3758,7 +4126,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3781,16 +4149,12 @@ msgstr "" 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 @@ -3798,9 +4162,8 @@ msgid "Inventory items animations" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Inventory key" -msgstr "Seljakott" +msgstr "Varustuse klahv" #: src/settings_translation_file.cpp msgid "Invert mouse" @@ -3842,6 +4205,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3900,9 +4267,8 @@ msgid "Julia z" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Jump key" -msgstr "Hüppamine" +msgstr "Hüppa" #: src/settings_translation_file.cpp msgid "Jumping speed" @@ -3922,6 +4288,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4021,6 +4394,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4394,19 +4774,21 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Lake steepness" -msgstr "Põlvkonna kaardid" +msgstr "Sügavus järvedele" #: src/settings_translation_file.cpp -#, fuzzy msgid "Lake threshold" -msgstr "Põlvkonna kaardid" +msgstr "Järvede lävi" #: src/settings_translation_file.cpp msgid "Language" @@ -4429,9 +4811,8 @@ msgid "Large cave proportion flooded" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Large chat console key" -msgstr "Konsool" +msgstr "Suure vestlus-viiba klahv" #: src/settings_translation_file.cpp msgid "Leaves style" @@ -4446,15 +4827,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Left key" -msgstr "Vasak Menüü" +msgstr "Vasak klahv" #: src/settings_translation_file.cpp 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 @@ -4464,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 @@ -4484,7 +4867,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4511,6 +4895,11 @@ msgstr "" 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" @@ -4579,14 +4968,8 @@ msgid "Lower Y limit of floatlands." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Main menu script" -msgstr "Menüü" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Menüü" +msgstr "Peamenüü skript" #: src/settings_translation_file.cpp msgid "" @@ -4594,11 +4977,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4643,6 +5030,11 @@ msgid "" "When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" "the 'jungles' flag is ignored." msgstr "" +"Maailma-loome v6 spetsiifilised omadused. \n" +"Lipp 'lumistud' võimaldab uudse 5-e loodusvööndi süsteemi.\n" +"Kui lipp 'lumistud' on lubatud, siis võimaldatakse ka tihnikud ning " +"eiratakse \n" +"lippu 'tihnikud'." #: src/settings_translation_file.cpp msgid "" @@ -4660,6 +5052,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4677,84 +5073,68 @@ msgid "Mapblock unload timeout" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Carpathian" -msgstr "Põlvkonna kaardid" +msgstr "Maailmaloome: Mäestik" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Carpathian specific flags" -msgstr "Põlvkonna kaardid" +msgstr "Mäestiku spetsiifilised omadused" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat" -msgstr "Põlvkonna kaardid" +msgstr "Maailmaloome: Lamemaa" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat specific flags" -msgstr "Põlvkonna kaardid" +msgstr "Lamemaa spetsiifilised omadused" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal" -msgstr "Põlvkonna kaardid" +msgstr "Maailmaloome: Fraktaalne" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Põlvkonna kaardid" +msgstr "Fraktaalse maailma spetsiifilised lipud" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5" -msgstr "Põlvkonna kaardid" +msgstr "Maailmaloome: V5" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5 specific flags" -msgstr "Põlvkonna kaardid" +msgstr "V5 spetsiifilised lipud" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6" -msgstr "Põlvkonna kaardid" +msgstr "Maailmaloome: V6" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6 specific flags" -msgstr "Põlvkonna kaardid" +msgstr "V6 spetsiifilised lipud" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7" -msgstr "Põlvkonna kaardid" +msgstr "Maailmaloome: V7" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7 specific flags" -msgstr "Põlvkonna kaardid" +msgstr "V7 spetsiifilised lipud" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Valleys" -msgstr "Põlvkonna kaardid" +msgstr "Maailmaloome: Vooremaa" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Valleys specific flags" -msgstr "Põlvkonna kaardid" +msgstr "Vooremaa spetsiifilised lipud" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen debug" -msgstr "Põlvkonna kaardid" +msgstr "Maailmaloome: veaproov" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen name" -msgstr "Põlvkonna kaardid" +msgstr "Maailma tekitus-valemi nimi" #: src/settings_translation_file.cpp msgid "Max block generate distance" @@ -4781,7 +5161,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4829,6 +5213,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4883,18 +5274,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Menus" -msgstr "Menüü" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4940,16 +5334,27 @@ msgid "Minimum texture size" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mipmapping" -msgstr "Väga hea kvaliteet" +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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4960,6 +5365,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4995,9 +5404,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mute key" -msgstr "Vajuta nuppu" +msgstr "Vaigista" #: src/settings_translation_file.cpp msgid "Mute sound" @@ -5027,16 +5435,16 @@ msgstr "" 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 "" @@ -5049,6 +5457,11 @@ msgstr "" 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 "" @@ -5061,14 +5474,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5090,18 +5495,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5111,11 +5508,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5124,38 +5516,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5178,17 +5544,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5209,24 +5571,27 @@ msgid "Physics" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Pitch move key" -msgstr "Kujunduslik mängumood" +msgstr "Kõrvale astumise klahv" #: src/settings_translation_file.cpp msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Asetamis klahv" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + #: 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 "" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5235,6 +5600,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Poissoni filtreerimine" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5269,10 +5638,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5280,9 +5645,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5305,18 +5670,16 @@ msgid "Random input" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Range select key" -msgstr "Kauguse valik" +msgstr "Valiku ulatuse klahv" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "Vali" +msgstr "Tavafondi asukoht" #: src/settings_translation_file.cpp msgid "Remote media" @@ -5337,9 +5700,8 @@ msgid "Replaces the default main menu with a custom one." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Report path" -msgstr "Vali" +msgstr "Aruande asukoht" #: src/settings_translation_file.cpp msgid "" @@ -5372,13 +5734,8 @@ msgid "Ridged mountain size noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Right key" -msgstr "Parem Menüü" - -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" +msgstr "Parem klahv" #: src/settings_translation_file.cpp msgid "River channel depth" @@ -5393,9 +5750,8 @@ msgid "River depth" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "River noise" -msgstr "Parem Windowsi nupp" +msgstr "Jõe müra" #: src/settings_translation_file.cpp msgid "River size" @@ -5450,6 +5806,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Ekraan:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5463,14 +5824,12 @@ msgid "Screenshot folder" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot format" -msgstr "Mängupilt" +msgstr "Kuvapildi vorming" #: src/settings_translation_file.cpp -#, fuzzy msgid "Screenshot quality" -msgstr "Mängupilt" +msgstr "Kuvapildi tase" #: src/settings_translation_file.cpp msgid "" @@ -5479,6 +5838,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Kuvatõmmis" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5491,10 +5855,6 @@ msgstr "" 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 "" @@ -5536,8 +5896,18 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Server / Singleplayer" -msgstr "Üksikmäng" +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" @@ -5565,13 +5935,21 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Server/Env Performance" +msgstr "Võõrustaja kanal" + +#: src/settings_translation_file.cpp msgid "Serverlist URL" -msgstr "Avatud serverite nimekiri:" +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 "Avatud serverite nimekiri:" +msgstr "Võõrustaja-loendi fail" #: src/settings_translation_file.cpp msgid "" @@ -5580,7 +5958,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5602,9 +6008,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Shader path" -msgstr "Varjutajad" +msgstr "Varjutaja asukoht" #: src/settings_translation_file.cpp msgid "" @@ -5614,6 +6026,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "Varju filtreerimis aste" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5621,9 +6049,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5638,6 +6064,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5659,6 +6095,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5684,9 +6124,8 @@ msgid "Small-scale temperature variation for blending biomes on borders." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Smooth lighting" -msgstr "Ilus valgustus" +msgstr "Hajus valgus" #: src/settings_translation_file.cpp msgid "" @@ -5703,30 +6142,23 @@ msgid "Smooths rotation of camera. 0 to disable." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sneak key" -msgstr "Hiilimine" +msgstr "Hiilimis klahv" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sneaking speed" -msgstr "Hiilimine" +msgstr "Hiilimis kiirus" #: src/settings_translation_file.cpp msgid "Sneaking speed, in nodes per second." msgstr "" #: src/settings_translation_file.cpp -msgid "Sound" +msgid "Soft shadow radius" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Hiilimine" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" +msgid "Sound" msgstr "" #: src/settings_translation_file.cpp @@ -5744,6 +6176,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5771,10 +6211,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5812,6 +6248,11 @@ msgstr "" 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 "" @@ -5851,9 +6292,15 @@ msgid "Terrain persistence noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Texture path" -msgstr "Vali graafika:" +msgstr "Tapeedi kaust" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -5869,6 +6316,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5924,18 +6375,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5953,6 +6404,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5961,9 +6418,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6000,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 @@ -6020,18 +6476,29 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touch screen threshold" -msgstr "Põlvkonna kaardid" +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 "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Trilinear filtering" -msgstr "Tri-Linear Filtreerimine" +msgstr "kolmik-lineaar filtreerimine" #: src/settings_translation_file.cpp msgid "" @@ -6095,15 +6562,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6178,7 +6660,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "View distance in nodes." -msgstr "" +msgstr "Vaate kaugus klotsides." #: src/settings_translation_file.cpp msgid "View range decrease key" @@ -6197,13 +6679,12 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume" -msgstr "Hääle volüüm" +msgstr "Valjus" #: src/settings_translation_file.cpp msgid "" @@ -6238,39 +6719,38 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Water surface level of the world." -msgstr "" +msgstr "Merepinna kõrgus maailmas." #: src/settings_translation_file.cpp msgid "Waving Nodes" -msgstr "" +msgstr "Lainetavad klotsid" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving leaves" -msgstr "Uhked puud" +msgstr "Lehvivad lehed" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" msgstr "Lainetavad vedelikud" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "Uhked puud" +msgstr "Vedeliku laine kõrgus" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" -msgstr "Uhked puud" +msgstr "Vedeliku laine kiirus" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" -msgstr "Uhked puud" +msgstr "Vedeliku laine pikkus" #: src/settings_translation_file.cpp msgid "Waving plants" +msgstr "Õõtsuvad taimed" + +#: src/settings_translation_file.cpp +msgid "Weblink color" msgstr "" #: src/settings_translation_file.cpp @@ -6294,18 +6774,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6320,7 +6798,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." -msgstr "" +msgstr "Kas mängjail on võimalus teineteist tappa." #: src/settings_translation_file.cpp msgid "" @@ -6330,7 +6808,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Whether to fog out the end of the visible area." -msgstr "" +msgstr "Kas nähtava ala lõpp udutada." #: src/settings_translation_file.cpp msgid "" @@ -6340,13 +6818,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6367,9 +6854,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "World start time" -msgstr "Maailma nimi" +msgstr "Aeg alustatavas maailmas" #: src/settings_translation_file.cpp msgid "" @@ -6431,41 +6917,180 @@ msgstr "" 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" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "cURL-i interaktiivne aegumine" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- Kujunduslik mängumood: " -#, fuzzy -#~ msgid "Toggle Cinematic" -#~ msgstr "Lülita kiirus sisse" +#~ msgid "- Damage: " +#~ msgstr "- Valu: " -#, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Vali modifikatsiooni fail:" +#~ msgid "Address / Port" +#~ msgstr "Aadress / kanal" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Kindlasti lähtestad oma üksikmängija maailma algseks?" + +#~ msgid "Back" +#~ msgstr "Tagasi" + +#~ msgid "Bump Mapping" +#~ msgstr "Konarlik tapeet" + +#~ msgid "Bumpmapping" +#~ msgstr "Muhkkaardistamine" + +#~ msgid "Config mods" +#~ msgstr "Seadista mod-e" + +#~ msgid "Configure" +#~ msgstr "Kohanda" + +#~ msgid "Connect" +#~ msgstr "Ühine" + +#~ msgid "Credits" +#~ msgstr "Tegijad" + +#~ msgid "Damage enabled" +#~ msgstr "Ellujääja" + +#~ 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…" + +#~ msgid "Enable VBO" +#~ msgstr "Luba VBO" #, fuzzy #~ msgid "Enables filmic tone mapping" #~ msgstr "Lubab filmic tone mapping" -#~ msgid "Enable VBO" -#~ msgstr "Luba VBO" +#~ msgid "Enter " +#~ msgstr "Sisesta " -#~ msgid "Darkness sharpness" -#~ msgstr "Pimeduse teravus" +#~ msgid "Filtering" +#~ msgstr "Filtreerimine" -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Palun oota $1 allalaadimist ja paigaldamist…" +#~ msgid "Game" +#~ msgstr "Mäng" -#~ msgid "Back" -#~ msgstr "Tagasi" +#~ 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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Radarkaart, Suurendus ×4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Pinnakaart, Suurendus ×2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Pinnakaart, Suurendus ×4" + +#~ msgid "Name / Password" +#~ msgstr "Nimi / salasõna" + +#~ msgid "Name/Password" +#~ msgstr "Nimi/Salasõna" + +#~ msgid "No" +#~ msgstr "Ei" #~ msgid "Ok" #~ msgstr "Olgu." + +#~ msgid "PvP enabled" +#~ msgstr "Vaenulikus lubatud" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Lähtesta üksikmängija maailm" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Vali modifikatsiooni fail:" + +#~ msgid "Special key" +#~ msgstr "Eri klahv" + +#~ msgid "Start Singleplayer" +#~ msgstr "Alusta üksikmängu" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Aktiveerimiseks varjud, nad vajavad OpenGL draiver." + +#, fuzzy +#~ msgid "Toggle Cinematic" +#~ msgstr "Lülita kiirus sisse" + +#~ msgid "View" +#~ msgstr "Vaade" + +#~ 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." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/eu/minetest.po b/po/eu/minetest.po index 17c4325df..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: 2020-06-13 23:17+0200\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-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,7 +17,44 @@ 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.12.1\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Garbitu txat-ilara" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Agindu hutsa." + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Itzuli menu nagusira" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Komando baliogabea: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Igorritako komandoa: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Online jokalariak zerrendatu" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Online jokalariak: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Irteerako txat-ilara hutsik dago orain." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Komando hau serbitzariaren bidez desgaituta dago." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -27,9 +64,40 @@ msgstr "Birsortu" msgid "You died" msgstr "Hil zara" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Komando erabilgarriak:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Komando erabilgarriak: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Komandoa ez dago eskuragarri: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[guztia | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "Ados" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<bat ere ez dago eskuragarri>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -51,9 +119,30 @@ msgstr "Birkonektatu" msgid "The server has requested a reconnect:" msgstr "Zerbitzariak birkonexioa eskatu du:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Kargatzen..." +#: 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. " @@ -68,10 +157,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Zerbitzariak $1 eta $2 arteko protokolo bertsioak onartzen ditu. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Saia zaitez zerbitzari publikoen zerrenda birgaitzen eta egiazta ezazu zure " -"internet konexioa." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -81,17 +168,26 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Mendekotasunak:" @@ -121,7 +217,7 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Mod gehiago aurkitu" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -164,29 +260,68 @@ msgstr "Mundua:" msgid "enabled" msgstr "gaituta" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" existitzen da. Gainidatzi egin nahi al duzu?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 et $2 mendekotasunak instalatuko dira." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 bider $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 deskargatzen,\n" +"$2 ilaran" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 deskargatzen..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1-ek behar dituen mendekotasunak ezin dira aurkitu." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" +"$1 instalatua izango da, eta $2-ren mendekotasunak baztertu egingo dira." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Pakete guztiak" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Instalaturik jada" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Itzuli menu nagusira" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Oinarri jokoa:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB ez dago erabilgarri Minetest cURL gabe konpilatzean" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Kargatzen..." +msgstr "Deskargatzen..." #: builtin/mainmenu/dlg_contentstore.lua 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" @@ -195,7 +330,18 @@ msgid "Install" msgstr "Instalatu" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "$1 Instalatu" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Falta diren mendekotasunak instalatu" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Instalazioa: Fitxategi ez bateragarria edo fitxategi hautsia" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mod-ak" @@ -208,13 +354,28 @@ msgid "No results" msgstr "Emaitzarik ez" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Bilatu" +msgid "No updates" +msgstr "Eguneraketarik ez" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Ez da aurkitu" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Gainidatzi" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Mesedez, egiaztatu oinarri jokoa zuzena dela." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Ilaran" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" -msgstr "" +msgstr "testura paketeak" #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" @@ -225,8 +386,12 @@ msgid "Update" msgstr "Eguneratu" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Guztia eguneratu [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Ikusi informazio gehiago web nabigatzailean" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -234,93 +399,95 @@ msgstr "Badago \"$1\" izeneko mundu bat" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Lurrazal gehigarria" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "" +msgstr "Garaierako hotza" #: builtin/mainmenu/dlg_create_world.lua msgid "Altitude dry" -msgstr "" +msgstr "Garaierako lehortasuna" #: builtin/mainmenu/dlg_create_world.lua msgid "Biome blending" -msgstr "" +msgstr "Bioma nahasketa" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" -msgstr "" +msgstr "Biomak" #: builtin/mainmenu/dlg_create_world.lua msgid "Caverns" -msgstr "" +msgstr "Leizeak" #: builtin/mainmenu/dlg_create_world.lua msgid "Caves" -msgstr "" +msgstr "Leizeak" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Sortu" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Informazioa:" +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" -msgstr "" +msgstr "Leotzak" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +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" -msgstr "" +msgstr "Lurrazal ez fraktalak sortu: Ozeanoak eta lurpekoak" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Mendiak" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" -msgstr "" +msgstr "Erreka hezeak" #: builtin/mainmenu/dlg_create_world.lua 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 "" +msgstr "Lakuak" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" msgstr "" +"Hezetasun baxuak eta bero handiak sakonera gutxikoak edo lehorrak diren " +"ibaiak sortzen dituzte" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -328,23 +495,23 @@ msgstr "Mapa sortzailea" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "" +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" @@ -352,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 @@ -373,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" @@ -448,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" @@ -481,6 +677,16 @@ 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" @@ -498,14 +704,15 @@ 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 -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Iraunkortasuna" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -524,6 +731,10 @@ msgstr "Berrezarri lehenespena" msgid "Scale" msgstr "Eskala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Bilatu" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Hautatu direktorioa" @@ -532,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" @@ -612,16 +823,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" "Mod instalakuntza: ezinezkoa $1 mod-entzako karpeta izen egokia aurkitzea" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"Instalakuntza: \"$1\" sustengu gabeko fitxategi formatua edo hondatutako " -"fitxategia" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Instalakuntza: fitxategia: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Ezinezkoa baliozko mod edo mod pakete bat aurkitzea" @@ -642,6 +843,60 @@ msgstr "Ezinezkoa mod bat $1 moduan instalatzea" msgid "Unable to install a modpack as a $1" msgstr "Ezinezkoa mod pakete bat $1 moduan instalatzea" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Kargatzen..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Zerbitzari publikoen zerrenda desgaituta dago" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Saia zaitez zerbitzari publikoen zerrenda birgaitzen eta egiazta ezazu zure " +"internet konexioa." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Buruz" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Laguntzaile aktiboak" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Renderizatzaile aktiboa:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Garatzaile nagusiak" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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" +msgstr "Lehenagoko laguntzaileak" + +#: builtin/mainmenu/tab_about.lua +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" @@ -664,7 +919,7 @@ msgstr "Instalaturiko paketeak:" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." -msgstr "Menpekotasunik gabe." +msgstr "Mendekotasunik gabe." #: builtin/mainmenu/tab_content.lua msgid "No package description available" @@ -682,26 +937,6 @@ msgstr "Paketea desinstalatu" msgid "Use Texture Pack" msgstr "Testura paketea erabili" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Laguntzaile aktiboak" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Garatzaile nagusiak" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Kredituak" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Lehenagoko laguntzaileak" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Lehenagoko garatzaile nagusiak" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Zerbitzaria iragarri" @@ -711,14 +946,10 @@ msgid "Bind Address" msgstr "Helbidea lotu" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfiguratu" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Sormen modua" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Kalteak baimendu" @@ -732,164 +963,190 @@ msgstr "Zerbitzari ostalaria" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" +msgstr "Instalatu ContentDB-ko jolasak" #: builtin/mainmenu/tab_local.lua msgid "New" -msgstr "" +msgstr "Berria" #: builtin/mainmenu/tab_local.lua msgid "No world created or selected!" -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 "Portua" #: builtin/mainmenu/tab_local.lua -msgid "Port" -msgstr "" +msgid "Select Mods" +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 "" +msgstr "Hasi partida" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "" +msgid "Address" +msgstr "Helbidea" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Garbi" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" -msgstr "" +msgstr "Sormen modua" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Mina / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Gogokoak" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Zerbitzari bateraezinak" #: builtin/mainmenu/tab_online.lua msgid "Join Game" +msgstr "Elkartu partidara" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" -msgstr "" +msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Zerbitzaria iragarri" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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" -msgstr "" +msgstr "Ezarpen guztiak" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -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 "Itzal dinamikoak" #: builtin/mainmenu/tab_settings.lua +#, 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 "Generate Normal Maps" -msgstr "" +msgid "High" +msgstr "Altua" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Baxua" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Erdi" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "" +msgstr "Mipmap" #: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Mipmap + Aniso. Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -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" @@ -897,167 +1154,145 @@ msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" -msgstr "" +msgstr "Hosto opakoak" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" +msgstr "Ur opakoa" #: builtin/mainmenu/tab_settings.lua msgid "Particles" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" +msgstr "Partikulak" #: builtin/mainmenu/tab_settings.lua msgid "Screen:" -msgstr "" +msgstr "Pantaila:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "" +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 "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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -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 +#, fuzzy +msgid "Very High" +msgstr "Ultra Altua" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "" +msgid "Could not find or load game: " +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 "" - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" +msgstr "Zehaztutako munduaren ibilbidea ez da existitzen: " #: src/client/game.cpp msgid "" @@ -1067,36 +1302,38 @@ msgstr "" #: src/client/game.cpp msgid "- Address: " -msgstr "" - -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -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 +msgid "A serialization error occurred:" +msgstr "Errore bat gertatu da:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Sarbidea ukatuta. Arrazoia: %s" #: src/client/game.cpp msgid "Automatic forward disabled" @@ -1107,24 +1344,48 @@ msgid "Automatic forward enabled" msgstr "" #: src/client/game.cpp -msgid "Camera update disabled" +msgid "Block bounds hidden" msgstr "" +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update disabled" +msgstr "Kameraren eguneraketa desaktibatuta dago" + #: src/client/game.cpp msgid "Camera update enabled" +msgstr "Kameraren eguneraketa gaituta dago" + +#: src/client/game.cpp +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 "Bezero deskonektatua" #: src/client/game.cpp msgid "Client side scripting is disabled" @@ -1132,11 +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 "Konexioak huts egin du arrazoi ezezagun batengatik" #: src/client/game.cpp msgid "Continue" -msgstr "" +msgstr "Jarraitu" #: src/client/game.cpp #, c-format @@ -1146,24 +1411,29 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Ezin izan da helbidea ebatzi: %s" + #: src/client/game.cpp msgid "Creating client..." -msgstr "" +msgstr "Bezeroa sortzen..." #: src/client/game.cpp msgid "Creating server..." -msgstr "" +msgstr "Zerbitzaria sortzen..." #: src/client/game.cpp msgid "Debug info and profiler graph hidden" @@ -1171,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" @@ -1201,21 +1471,26 @@ msgstr "Desgaitu mugagabeko ikusmen barrutia" 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)" @@ -1235,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" @@ -1255,7 +1530,7 @@ msgstr "" #: src/client/game.cpp msgid "Item definitions..." -msgstr "" +msgstr "Itemen definizioak..." #: src/client/game.cpp msgid "KiB/s" @@ -1274,31 +1549,7 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" +msgid "Multiplayer" msgstr "" #: src/client/game.cpp @@ -1315,7 +1566,7 @@ msgstr "" #: src/client/game.cpp msgid "Node definitions..." -msgstr "" +msgstr "Nodoen definizioak..." #: src/client/game.cpp msgid "Off" @@ -1339,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..." @@ -1347,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" @@ -1373,6 +1624,21 @@ msgstr "" msgid "Sound unmuted" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +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 "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 "Ezin da %s-n entzun IPv6 desaktibatuta dagoelako" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1391,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" @@ -1403,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" @@ -1442,10 +1708,6 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1456,7 +1718,7 @@ msgstr "Behera" #: src/client/keycode.cpp msgid "End" -msgstr "" +msgstr "Amaiera" #: src/client/keycode.cpp msgid "Erase EOF" @@ -1472,7 +1734,7 @@ msgstr "Laguntza" #: src/client/keycode.cpp msgid "Home" -msgstr "" +msgstr "Hasiera" #: src/client/keycode.cpp msgid "IME Accept" @@ -1525,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" @@ -1613,7 +1875,7 @@ msgstr "" #: src/client/keycode.cpp msgid "Play" -msgstr "" +msgstr "Jolastu" #. ~ "Print screen" key #: src/client/keycode.cpp @@ -1622,7 +1884,7 @@ msgstr "Inprimatu" #: src/client/keycode.cpp msgid "Return" -msgstr "" +msgstr "Itzuli" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Right" @@ -1671,7 +1933,7 @@ msgstr "Pantaila-argazkia" #: src/client/keycode.cpp msgid "Space" -msgstr "" +msgstr "Espazioa" #: src/client/keycode.cpp msgid "Tab" @@ -1691,32 +1953,41 @@ msgstr "2. X botoia" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" +msgstr "Zoom" + +#: src/client/minimap.cpp +msgid "Minimap hidden" 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 +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" msgstr "" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Huts egin du $1 deskargatzean" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Web orria irekitzen" + #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Jarraitu" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1725,17 +1996,25 @@ msgstr "Aurrera automatikoki" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" +msgstr "Jauzi automatikoa" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Atzera" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Aldatu kamera" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Txata" @@ -1785,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 @@ -1819,10 +2098,6 @@ msgstr "Pantaila-argazkia" msgid "Sneak" msgstr "isilean mugitu" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Berezia" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1861,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" @@ -1875,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 "" @@ -1884,13 +2159,8 @@ msgid "Muted" msgstr "" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " +#, c-format +msgid "Sound Volume: %d%%" msgstr "" #. ~ DO NOT TRANSLATE THIS LITERALLY! @@ -1900,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" @@ -1908,8 +2188,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1936,12 +2216,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2030,6 +2304,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2048,6 +2326,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2093,6 +2375,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2103,6 +2389,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Munduaren izena" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2117,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 @@ -2185,6 +2476,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2205,6 +2500,15 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Jauzi tekla" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Atzera tekla" @@ -2217,10 +2521,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2242,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 @@ -2250,11 +2550,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2282,8 +2582,9 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "Aldatu kamera" #: src/settings_translation_file.cpp msgid "" @@ -2356,15 +2657,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Agindua" + #: src/settings_translation_file.cpp msgid "Chat font size" msgstr "" @@ -2398,7 +2698,7 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp @@ -2417,6 +2717,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2437,6 +2743,10 @@ msgstr "" 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 "" @@ -2461,6 +2771,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2488,6 +2802,22 @@ msgstr "" msgid "Command key" msgstr "Agindua tekla" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2512,10 +2842,19 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2542,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 @@ -2566,14 +2907,16 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Creative" -msgstr "" +msgstr "Sormena" #: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2581,7 +2924,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2590,7 +2935,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Damage" -msgstr "" +msgstr "Kaltea" #: src/settings_translation_file.cpp msgid "Debug info toggle key" @@ -2605,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 @@ -2648,8 +2993,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2680,12 +3026,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2758,6 +3098,16 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Apaingarriak" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "Eskuinera tekla" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "" @@ -2770,6 +3120,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2814,18 +3174,36 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" +#, fuzzy +msgid "Enable creative mode for all players" +msgstr "Gaitu sormen modua mapa sortu berrietan." #: 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 "" @@ -2836,28 +3214,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." -msgstr "" +msgstr "Ahalbidetu jokalariek kaltea jasotzea eta hiltzea." #: 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 "" - -#: 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." 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" @@ -2910,14 +3282,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2926,18 +3290,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2946,6 +3298,17 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "Profilaria" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2954,12 +3317,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2971,7 +3328,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2990,18 +3351,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Azkar tekla" @@ -3020,7 +3369,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3054,14 +3403,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: 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." @@ -3128,6 +3478,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3149,15 +3503,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3166,6 +3520,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3225,10 +3590,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3259,10 +3620,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3280,7 +3637,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3291,7 +3657,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3310,6 +3676,14 @@ msgstr "" 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 "" @@ -3327,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 @@ -3337,8 +3715,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3360,7 +3738,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3371,10 +3750,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3570,10 +3945,17 @@ 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 "" @@ -3606,8 +3988,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3629,11 +4010,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3657,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 @@ -3674,6 +4063,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3690,10 +4085,6 @@ msgstr "" 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 "" @@ -3721,7 +4112,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3744,16 +4135,12 @@ msgstr "" 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 @@ -3804,6 +4191,11 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "Joystick mota" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3886,6 +4278,17 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Ikusmen barrutia txikitzeko tekla.\n" +"Ikusi http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3991,6 +4394,17 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Ikusmen barrutia txikitzeko tekla.\n" +"Ikusi http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4376,6 +4790,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4432,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 @@ -4442,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 @@ -4462,7 +4883,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4489,6 +4911,11 @@ msgstr "" 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" @@ -4563,21 +4990,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4639,6 +5066,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4744,7 +5175,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4792,6 +5227,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4846,17 +5288,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4905,12 +5351,25 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4921,6 +5380,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4987,16 +5450,16 @@ msgstr "" 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 "" @@ -5009,6 +5472,11 @@ msgstr "" 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 "" @@ -5021,14 +5489,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5050,18 +5510,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5071,11 +5523,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5084,38 +5531,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5138,17 +5559,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5177,13 +5594,18 @@ msgid "Pitch move mode" msgstr "" #: 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." +#, fuzzy +msgid "Place key" +msgstr "Hegaz egin tekla" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +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 @@ -5194,6 +5616,10 @@ msgstr "Jokalariaren transferentzia distantzia" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5228,10 +5654,6 @@ msgstr "Profilaria" 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 "" @@ -5239,9 +5661,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5331,10 +5753,6 @@ msgstr "" msgid "Right key" msgstr "Eskuinera tekla" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5404,6 +5822,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Pantaila:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5431,6 +5854,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Pantaila-argazkia" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5443,10 +5871,6 @@ msgstr "" 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 "" @@ -5487,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" @@ -5514,10 +5949,19 @@ msgstr "" 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 "" @@ -5529,7 +5973,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5550,6 +6022,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5562,6 +6041,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5569,9 +6064,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5586,6 +6079,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5607,6 +6110,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5662,15 +6169,11 @@ msgid "Sneaking speed, in nodes per second." msgstr "" #: src/settings_translation_file.cpp -msgid "Sound" +msgid "Soft shadow radius" msgstr "" #: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Berezia tekla" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" +msgid "Sound" msgstr "" #: src/settings_translation_file.cpp @@ -5688,6 +6191,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5715,10 +6226,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5756,6 +6263,11 @@ msgstr "" 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 "" @@ -5798,6 +6310,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5810,7 +6329,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "The URL for the content repository" -msgstr "" +msgstr "Eduki biltegiaren URL helbidea" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "The dead zone of the joystick" +msgstr "Joystick mota" #: src/settings_translation_file.cpp msgid "" @@ -5869,18 +6393,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5898,6 +6422,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5906,9 +6436,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5945,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 @@ -5971,6 +6500,18 @@ msgstr "" 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 "" @@ -6041,15 +6582,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6143,7 +6699,7 @@ msgid "Viewing range" msgstr "Ikusmen barrutia" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6213,6 +6769,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6234,18 +6794,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6262,7 +6820,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." -msgstr "" +msgstr "Jokalariak elkarren artean hil daitezkeen ala ez." #: src/settings_translation_file.cpp msgid "" @@ -6282,13 +6840,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6372,23 +6939,70 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "cURL-en denbora muga" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL-en denbora muga" +#~ msgid "- Creative Mode: " +#~ msgstr "- Sormen modua: " -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "$1 deskargatu eta instalatzen, itxaron mesedez..." +#~ msgid "- Damage: " +#~ msgstr "- Kaltea: " #~ msgid "Back" #~ msgstr "Atzera" +#~ 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\"" + #~ msgid "Ok" #~ msgstr "Ados" + +#~ msgid "Special" +#~ msgstr "Berezia" + +#~ msgid "Special key" +#~ msgstr "Berezia tekla" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Hil zara" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/fi/minetest.po b/po/fi/minetest.po new file mode 100644 index 000000000..489b66b52 --- /dev/null +++ b/po/fi/minetest.po @@ -0,0 +1,6950 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \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" +"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" +"X-Generator: Weblate 4.13.1-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Tyhjennä keskustelujono" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Tyhjä komento." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Poistu päävalikkoon" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Virheellinen komento: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Annettu komento: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Listaa verkkopelaajat" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Verkkopelaajat: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Keskustelujono on nyt tyhjä." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Palvelin on poistanut komennon käytöstä." + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "Synny uudelleen" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "You died" +msgstr "Kuolit" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Käytettävissä olevat komennot:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Käytettävissä olevat komennot: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Komento ei ole käytettävissä: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Ohjeita komentojen käyttöön" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Käytä '.help <cmd>' saadaksesi lisätietoja komennosta, tai '.help all' " +"listataksesi kaiken." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[kaikki | <komento>]" + +#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp +msgid "OK" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<ei saatavilla>" + +#: builtin/fstk/ui.lua +msgid "An error occurred in a Lua script:" +msgstr "Lua-skriptissä tapahtui virhe:" + +#: builtin/fstk/ui.lua +msgid "An error occurred:" +msgstr "Tapahtui virhe:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Päävalikko" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "Yhdistä uudelleen" + +#: builtin/fstk/ui.lua +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. " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "Palvelin vaatii protokollaversion $1. " + +#: builtin/mainmenu/common.lua +msgid "Server supports protocol versions between $1 and $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." +msgstr "Tuemme vain protokollaversiota $1." + +#: builtin/mainmenu/common.lua +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_register.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp +#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp +msgid "Cancel" +msgstr "Peruuta" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +msgstr "Riippuvuudet:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Poista kaikki käytöstä" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable modpack" +msgstr "Poista modipaketti käytöstä" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "Ota kaikki käyttöön" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable modpack" +msgstr "Ota modipaketti käyttöön" + +#: 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 "" +"Modin \"$1\" käyttöönotto epäonnistui, koska se sisälsi sallimattomia " +"merkkejä. Vain merkit [a-z0-9_] ovat sallittuja." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Find More Mods" +msgstr "Löydä lisää modeja" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Modi:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No (optional) dependencies" +msgstr "Ei (valinnaisia) riippuvuuksia" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "Pelin kuvausta ei ole annettu." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No hard dependencies" +msgstr "Ei kovia riippuvuuksia" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." +msgstr "Modipaketin kuvausta ei annettu." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No optional dependencies" +msgstr "Ei valinnaisia riippuvuuksia" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "Valinnaiset riippuvuudet:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Tallenna" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Maailma:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "käytössä" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" on jo olemassa. Haluatko korvata sen?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Riippuvuudet $1 ja $2 asennetaan." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 lataa,\n" +"$2 jonossa" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 latautuu..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 tarvittavaa riippuvuutta ei löytynyt." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 asennetaan, ja $2 riippuvuutta sivuutetaan." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "Kaikki paketit" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Asennettu jo" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Back to Main Menu" +msgstr "Palaa päävalikkoon" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Peruspeli:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB ei ole saatavilla, jos Minetest on koottu ilman cURLia" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Downloading..." +msgstr "Ladataan..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Failed to download $1" +msgstr "Epäonnistui ladata $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Games" +msgstr "Pelit" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install" +msgstr "Asentaa" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "Asenna $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Asenna puuttuvat riippuvuudet" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Lataus: Tukematon tiedostotyyppi tai rikkinäinen arkisto" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Mods" +msgstr "Modit" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No packages could be retrieved" +msgstr "Paketteja ei löydetty" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No results" +msgstr "Ei tuloksia" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No updates" +msgstr "Ei päivityksiä" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Ei löytynyt" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Ylikirjoita" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Jonotettu" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" +msgstr "Tekstuuripaketit" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Uninstall" +msgstr "Poista" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update" +msgstr "Päivitä" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "Päivitä kaikki [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Katso lisätietoja verkkoselaimessa" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "Maailma nimellä \"$1\" on jo olemassa" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Additional terrain" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Altitude chill" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Altitude dry" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biome blending" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biomes" +msgstr "Biomit" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caverns" +msgstr "Luolat" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caves" +msgstr "Luolat" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "Luo" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "Koristeet" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Development Test is meant for developers." +msgstr "Varoitus: Development Test on tarkoitettu kehittäjille." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Dungeons" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "Tasainen maasto" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "Taivaalla leijuvat maamassat" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Hills" +msgstr "Mäet" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Humid rivers" +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" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Low humidity and high heat causes shallow or dry rivers" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "Mapgen-valitsimet" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mapgen-specific flags" +msgstr "Mapgen-spesifit valitsimet" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mountains" +msgstr "Vuoret" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mud flow" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Network of tunnels and caves" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No game selected" +msgstr "Ei peliä valittu" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces heat with altitude" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces humidity with altitude" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Rivers" +msgstr "Joet" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Sea level rivers" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" +msgstr "Siemen" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Smooth transition between biomes" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "" +"Structures appearing on the terrain (no effect on trees and jungle grass " +"created by v6)" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Structures appearing on the terrain, typically trees and plants" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Terrain surface erosion" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Trees and jungle grass" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Vary river depth" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Very large caverns deep in the underground" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "Maailman nimi" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no games installed." +msgstr "Sinulla ei ole pelejä asennettuna." + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "Oletko varma että haluat poistaa \"$1\":n?" + +#: builtin/mainmenu/dlg_delete_content.lua +#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua +#: src/client/keycode.cpp +msgid "Delete" +msgstr "Poista" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: failed to delete \"$1\"" +msgstr "pkgmgr: kohteen \"$1\" poistaminen epäonnistui" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: invalid path \"$1\"" +msgstr "pkgmgr: virheellinen polku \"$1\"" + +#: builtin/mainmenu/dlg_delete_world.lua +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" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "Nimeä modipaketti uudelleen:" + +#: 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 "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "2D Noise" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +msgstr "< Palaa asetussivulle" + +#: builtin/mainmenu/dlg_settings_advanced.lua +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ä" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "Muokkaa" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "Otettu käyttöön" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Lacunarity" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Octaves" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Persistence" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "Anna kelvollinen kokonaisuluku." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "Anna kelvollinen numero." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "Palauta oletus" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Etsi" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "Valitse hakemisto" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "Valitse tiedosto" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "Näytä tekniset nimet" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "Arvon tulee olla vähintään $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "Arvo ei saa olla suurempi kuin $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "Z" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "" + +#. ~ "absvalue" is a noise parameter flag. +#. It is short for "absolute value". +#. It can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "absvalue" +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 "" + +#. ~ "eased" is a noise parameter flag. +#. It is used to make the map smoother and +#. can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "eased" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 (Enabled)" +msgstr "$1 (Käytössä)" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 mods" +msgstr "$1 modia" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Failed to install $1 to $2" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find real mod name for: $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find suitable folder name for modpack $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to find a valid mod or modpack" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a $1 as a texture pack" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a game as a $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a mod as a $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a modpack as a $1" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Ladataan..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Julkinen palvelinlista on pois käytöstä" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Kokeile ottaa julkinen palvelinlista uudelleen käyttöön ja tarkista " +"internetyhteytesi." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Tietoja" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Avaa käyttäjätietohakemisto" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 +msgid "Browse online content" +msgstr "Selaa sisältöä verkossa" + +#: builtin/mainmenu/tab_content.lua +msgid "Content" +msgstr "Sisältö" + +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "Poista tekstuuripaketti käytöstä" + +#: builtin/mainmenu/tab_content.lua +msgid "Information:" +msgstr "Tietoja:" + +#: builtin/mainmenu/tab_content.lua +msgid "Installed Packages:" +msgstr "Asennetut paketit:" + +#: builtin/mainmenu/tab_content.lua +msgid "No dependencies." +msgstr "Ei riippuvuuksia." + +#: builtin/mainmenu/tab_content.lua +msgid "No package description available" +msgstr "Ei paketin kuvausta saatavilla" + +#: builtin/mainmenu/tab_content.lua +msgid "Rename" +msgstr "Nimeä uudelleen" + +#: builtin/mainmenu/tab_content.lua +msgid "Uninstall Package" +msgstr "Poista paketti" + +#: builtin/mainmenu/tab_content.lua +msgid "Use Texture Pack" +msgstr "Käytä tekstuuripakettia" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "Ilmoita palvelin" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "Sido osoite" + +#: builtin/mainmenu/tab_local.lua +msgid "Creative Mode" +msgstr "Luova tila" + +#: builtin/mainmenu/tab_local.lua +msgid "Enable Damage" +msgstr "Ota vahinko käyttöön" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Isännöi peli" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Isännöi palvelin" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +msgstr "Asenna pelejä ContentDB:stä" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Uusi" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Maailmaa ei ole luotu tai valittu!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Pelaa peliä" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "Portti" + +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Valitse modit" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Valitse maailma:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Palvelimen portti" + +#: builtin/mainmenu/tab_local.lua +msgid "Start Game" +msgstr "Aloita peli" + +#: builtin/mainmenu/tab_online.lua +msgid "Address" +msgstr "Osoite" + +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Tyhjennä" + +#: builtin/mainmenu/tab_online.lua +msgid "Creative mode" +msgstr "Luova tila" + +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Vahinko / PvP" + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Suosikit" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Palvelimet eivät ole yhteensopivat" + +#: builtin/mainmenu/tab_online.lua +msgid "Join Game" +msgstr "Liity peliin" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "Viive" + +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Julkiset palvelimet" + +#: builtin/mainmenu/tab_online.lua +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" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "3D-pilvet" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "4x" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "8x" + +#: builtin/mainmenu/tab_settings.lua +msgid "All Settings" +msgstr "Kaikki asetukset" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "Reunanpehmennys:" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave Screen Size" +msgstr "Tallenna näytön koko automaattisesti" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "Bilineaarinen suodatus" + +#: builtin/mainmenu/tab_settings.lua src/client/game.cpp +msgid "Change Keys" +msgstr "Näppäinasetukset" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dynaamiset varjot" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Dynaamiset varjot: " + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "Hienot lehdet" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "Ei suodatinta" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "Läpinäkymätön vesi" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "Partikkelit" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Näyttö:" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "Asetukset" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "Varjostimet" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Varjostimet (kokeellinen)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "Varjostimet (ei käytettävissä)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "Tasainen valaistus" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "Teksturointi:" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touch threshold (px):" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +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." + +#: src/client/client.cpp +msgid "Done!" +msgstr "Valmis!" + +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes..." +msgstr "" + +#: src/client/client.cpp +msgid "Loading textures..." +msgstr "Ladataan tekstuureja..." + +#: src/client/client.cpp +msgid "Rebuilding shaders..." +msgstr "Rakennetaan uudelleen varjostimia..." + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "Päävalikko" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "Pelaajan nimi on liian pitkä." + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Valitse nimi!" + +#: src/client/clientlauncher.cpp +msgid "Provided password file failed to open: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "" + +#: src/client/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" + +#: src/client/game.cpp +msgid "- Address: " +msgstr "- Osoite: " + +#: src/client/game.cpp +msgid "- Mode: " +msgstr "- Tila: " + +#: src/client/game.cpp +msgid "- Port: " +msgstr "- Portti: " + +#: src/client/game.cpp +msgid "- Public: " +msgstr "- Julkinen: " + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +msgid "- PvP: " +msgstr "- PvP: " + +#: src/client/game.cpp +msgid "- Server Name: " +msgstr "- Palvelimen nimi: " + +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Tapahtui virhe:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + +#: src/client/game.cpp +msgid "Automatic forward disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Automatic forward enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + +#: src/client/game.cpp +msgid "Change Password" +msgstr "Vaihda salasana" + +#: src/client/game.cpp +msgid "Cinematic mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + +#: src/client/game.cpp +msgid "Client side scripting is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Connecting to server..." +msgstr "Yhdistetään palvelimeen..." + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + +#: src/client/game.cpp +msgid "Continue" +msgstr "Jatka" + +#: src/client/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + +#: src/client/game.cpp +msgid "Creating client..." +msgstr "Luodaan asiakasta..." + +#: src/client/game.cpp +msgid "Creating server..." +msgstr "Luodaan palvelinta..." + +#: src/client/game.cpp +msgid "Debug info and profiler graph hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info shown" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info, profiler graph, and wireframe hidden" +msgstr "" + +#: src/client/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/client/game.cpp +msgid "Disabled unlimited viewing range" +msgstr "" + +#: src/client/game.cpp +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" + +#: src/client/game.cpp +msgid "Exit to OS" +msgstr "Poistu käyttöjärjestelmään" + +#: src/client/game.cpp +msgid "Fast mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "Lentotila pois käytöstä" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "Lentotila käytössä" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "Sumu pois käytöstä" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "Sumu käytössä" + +#: src/client/game.cpp +msgid "Game info:" +msgstr "Pelin tiedot:" + +#: src/client/game.cpp +msgid "Game paused" +msgstr "Peli keskeytetty" + +#: src/client/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/client/game.cpp +msgid "Item definitions..." +msgstr "" + +#: src/client/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Media..." +msgstr "" + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Node definitions..." +msgstr "" + +#: src/client/game.cpp +msgid "Off" +msgstr "Pois" + +#: src/client/game.cpp +msgid "On" +msgstr "Päällä" + +#: src/client/game.cpp +msgid "Pitch move mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Pitch move mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Profiler graph shown" +msgstr "" + +#: src/client/game.cpp +msgid "Remote server" +msgstr "Etäpalvelin" + +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "Selvitetään osoitetta..." + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "Sammutetaan..." + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "Yksinpeli" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "Äänenvoimakkuus" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "Ääni mykistetty" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "Ääni palautettu" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at minimum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "ok" +msgstr "" + +#: src/client/gameui.cpp +msgid "Chat hidden" +msgstr "Keskustelu piilotettu" + +#: src/client/gameui.cpp +msgid "Chat shown" +msgstr "" + +#: src/client/gameui.cpp +msgid "HUD hidden" +msgstr "" + +#: src/client/gameui.cpp +msgid "HUD shown" +msgstr "" + +#: src/client/gameui.cpp +msgid "Profiler hidden" +msgstr "" + +#: src/client/gameui.cpp +#, c-format +msgid "Profiler shown (page %d of %d)" +msgstr "" + +#: src/client/keycode.cpp +msgid "Apps" +msgstr "" + +#: src/client/keycode.cpp +msgid "Backspace" +msgstr "" + +#: src/client/keycode.cpp +msgid "Caps Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Down" +msgstr "" + +#: src/client/keycode.cpp +msgid "End" +msgstr "" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "" + +#. ~ Key name, common on Windows keyboards +#: src/client/keycode.cpp +msgid "Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Middle Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Num Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad *" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad +" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad -" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad /" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 0" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 2" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 3" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 4" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 5" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 6" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 7" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 8" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 9" +msgstr "" + +#: src/client/keycode.cpp +msgid "OEM Clear" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page down" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page up" +msgstr "" + +#: src/client/keycode.cpp +msgid "Pause" +msgstr "" + +#: src/client/keycode.cpp +msgid "Play" +msgstr "" + +#. ~ "Print screen" key +#: src/client/keycode.cpp +msgid "Print" +msgstr "" + +#: src/client/keycode.cpp +msgid "Return" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Windows" +msgstr "" + +#: src/client/keycode.cpp +msgid "Scroll Lock" +msgstr "" + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" +msgstr "" + +#: src/client/keycode.cpp +msgid "Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Sleep" +msgstr "" + +#: src/client/keycode.cpp +msgid "Snapshot" +msgstr "" + +#: src/client/keycode.cpp +msgid "Space" +msgstr "" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 2" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Zoom" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Verkkosivun avaaminen epäonnistui" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "" + +#: src/gui/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "\"Aux1\" = climb down" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Autoforward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Automatic jumping" +msgstr "Hypi automaattisesti" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "Taakse" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Change camera" +msgstr "Vaihda kameraa" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Chat" +msgstr "Keskustelu" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "Komento" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "Konsoli" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "Eteen" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "Inventaario" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "Hyppää" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "Paikallinen komento" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "Kuvakaappaus" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "Hiivi" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle HUD" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle chat log" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fog" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Change" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "New Password" +msgstr "Uusi salasana" + +#: src/gui/guiPasswordChange.cpp +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" + +#: src/gui/guiVolumeChange.cpp +msgid "Muted" +msgstr "Mykistetty" + +#: src/gui/guiVolumeChange.cpp +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Äänenvoimakkuus: %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 "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" +"If disabled, virtual joystick will center to first-touch's position." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"situations.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"Default is for a vertically-squashed shape suitable for\n" +"an island, set all 3 numbers equal for the raw shape." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of ridged mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of step mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of step mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that locates the river valleys and channels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "3D-pilvet" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "3D-tila" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"to be adjusted, as floatland tapering functions best when this noise has\n" +"a value range of approximately -2.0 to 2.0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise that determines number of dungeons per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- crossview: Cross-eyed 3d\n" +"- pageflip: quadbuffer based 3d.\n" +"Note that the interlaced mode requires shaders to be enabled." +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." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of queued blocks to emerge" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration of gravity, in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + +#: src/settings_translation_file.cpp +#, c-format +msgid "" +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" +"to be sure) creates a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Maailman nimi" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "Lisäasetukset" + +#: src/settings_translation_file.cpp +msgid "" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"This only has significant effect on daylight and artificial\n" +"light, it has very little effect on natural night light." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Always fly fast" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amount of messages a player may send per 10 seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce to this serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name to tooltip." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to\n" +"clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible\n" +"rendering glitches (some blocks will not be rendered under water and in " +"caves,\n" +"as well as sometimes on land).\n" +"Setting this to a value greater than max_block_send_distance disables this\n" +"optimization.\n" +"Stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "Tallenna näytön koko automaattisesti" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome API noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Increasing can reduce artifacting on weaker GPUs.\n" +"0.1 = Default, 0.25 = Good value for weaker tablets." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Chat-komennnot" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat weblinks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "Asiakas" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "Asiakas ja palvelin" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "Pilvet" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples:\n" +"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls width of tunnels, a smaller value creates wider tunnels.\n" +"Value >= 10.0 completely disables generation of tunnels and avoids the\n" +"intensive noise calculations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain and steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the base ground level." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the depth of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river valley." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Käytä konsoli-ikkunaa" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +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 "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +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 " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server.\n" +"Ignored if bind_address is set.\n" +"Needs enable_ipv6 to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"appearance of high dynamic range images. Mid-range contrast is slightly\n" +"enhanced, highlights and shadows are gradually compressed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Exponent of the floatland tapering. Alters the tapering behaviour.\n" +"Value = 1.0 creates a uniform, linear tapering.\n" +"Values > 1.0 create a smooth tapering suitable for the default separated\n" +"floatlands.\n" +"Values < 1.0 (for example 0.25) create a more defined surface level with\n" +"flatter lowlands, suitable for a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via the \"Aux1\" key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +#, 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." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font bold by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "Koko näyttö" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "Koko näytön tila." + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "HTTP-modit" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "Palvelimen sivusto, näytetään palvelinlistauksessa." + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal acceleration in air when jumping or falling,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration in fast mode,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration on ground or when climbing,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"If negative, liquid waves will move backwards.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "IPv6" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "IPv6-palvelin" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +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 "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"increases processing load.\n" +"At iterations = 20 this mapgen has a similar load to mapgen V7." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +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 "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "Kieli" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of liquid waves.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen Carpathian." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'terrain' enables the generation of non-fractal terrain:\n" +"ocean, islands and underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"to become shallower and occasionally dry.\n" +"'altitude_dry': Reduces humidity with altitude." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen v5." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'floatlands': Floating land masses in the atmosphere.\n" +"'caverns': Giant caves deep underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "FPS enintään" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum liquid resistance. Controls deceleration when entering liquid at\n" +"high speed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of recent chat messages to show" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "Käyttäjiä enintään" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "Hiiren herkkyys" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "Mykistä ääni" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"Current mapgens in a highly unstable state:\n" +"- The optional floatlands of v7 (disabled by default)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Near plane" +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 "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." + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"processes, especially in singleplayer and/or when running Lua code in\n" +"'on_generated'. For many users the optimum setting may be '1'." +msgstr "" + +#: src/settings_translation_file.cpp +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 "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Optional override for chat weblink color." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "Fysiikka" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + +#: 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 transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "Pelaaja vastaan pelaaja" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Proportion of large caves that contain liquid." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Restricts the access of certain client-side functions on servers.\n" +"Combine the byteflags below to restrict client-side features, or set to 0\n" +"for no restrictions:\n" +"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" +"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" +"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" +"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" +"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridged mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River valley width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hill size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hills spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +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" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "Näytön leveys" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "Kuvakaappausten kansio" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "Kuvakaappausten muoto" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "Kuvakaappausten laatu" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Kuvakaappaus" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of two 3D noises that together define tunnels." +msgstr "" + +#: 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" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Selects one of 18 fractal types.\n" +"1 = 4D \"Roundy\" Mandelbrot set.\n" +"2 = 4D \"Roundy\" Julia set.\n" +"3 = 4D \"Squarry\" Mandelbrot set.\n" +"4 = 4D \"Squarry\" Julia set.\n" +"5 = 4D \"Mandy Cousin\" Mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" Julia set.\n" +"7 = 4D \"Variation\" Mandelbrot set.\n" +"8 = 4D \"Variation\" Julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" Mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" Julia set.\n" +"11 = 3D \"Christmas Tree\" Mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" Julia set.\n" +"13 = 3D \"Mandelbulb\" Mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" Julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" Mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" Julia set.\n" +"17 = 4D \"Mandelbulb\" Mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" Julia set." +msgstr "" + +#: src/settings_translation_file.cpp +#, 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" +msgstr "Palvelimen URL" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "Palvelimen osoite" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "Palvelimen kuvaus" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "Palvelimen nimi" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "Palvelimen portti" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving liquids (like water).\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow strength gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).\n" +"WARNING!: There is no benefit, and there are several dangers, in\n" +"increasing this value above 5.\n" +"Reducing this value increases cave and dungeon density.\n" +"Altering this value is for special usage, leaving it unchanged is\n" +"recommended." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "Hiiviskelyn nopeus" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "Ääni" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Surface level of optional water placed on a solid floatland layer.\n" +"Water is disabled by default and will only be placed if this value is set\n" +"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" +"upper tapering).\n" +"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" +"When enabling water placement the floatlands must be configured and tested\n" +"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" +"required value depending on 'mgv7_np_floatland'), to avoid\n" +"server-intensive extreme water flow and to avoid vast flooding of the\n" +"world surface below." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "Synkroninen SQLite" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The URL for the content repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other biome filler node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The length in pixels it takes for touch screen interaction to start." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"Default is 1.0 (1/2 node).\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Third of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Time of day when a new world is started, in millihours (0-23999)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "Luotetut modit" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "Videoajuri" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Virtual joystick triggers Aux1 button" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Volume of all sounds.\n" +"Requires the sound system to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"W coordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking and flying speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "Kävelyn nopeus" + +#: src/settings_translation_file.cpp +msgid "Walking, flying and climbing speed in fast mode, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"This is also used as the base node texture size for world-aligned\n" +"texture autoscaling." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." +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 "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "World start time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y of mountain density gradient zero level. Used to shift mountains " +"vertically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#~ msgid "- Creative Mode: " +#~ msgstr "- Luova tila: " + +#~ 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." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/fil/minetest.po b/po/fil/minetest.po index c78b043ed..85444da23 100644 --- a/po/fil/minetest.po +++ b/po/fil/minetest.po @@ -1,10 +1,15 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# msgid "" msgstr "" -"Project-Id-Version: Filipino (Minetest)\n" +"Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-01-11 18:26+0000\n" -"Last-Translator: rubenwardy <rubenwardy@gmail.com>\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" @@ -13,546 +18,768 @@ msgstr "" "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 3.10.1\n" +"X-Generator: Weblate 4.13.1-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Linisin ang pila ng out chat" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Bakanteng utos." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Umalis sa main menu" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Invalid na utos: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Inisyu na utos: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Ilista ang mga naka-online na player" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Mga naka-online na player: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Bakante na ang pila ng out chat." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +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 "Namatay ka" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Mga magagamit na utos:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Mga magagamit na utos: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Di magagamit ang utos: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[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 "<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 src/client/game.cpp -msgid "Loading..." +#: builtin/mainmenu/common.lua +#, 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 "Later" +msgstr "" + +#: builtin/mainmenu/common.lua +msgid "Never" msgstr "" #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " -msgstr "" +msgstr "Di tumugmang bersyon ng protocol. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "" +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 "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." -msgstr "" +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 builtin/mainmenu/dlg_create_world.lua +#: 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/tab_content.lua +#: 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 "bukas" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +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 "Ii-install ang mga kailangan na $1 at $2." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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 "$1 dina-download..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "Di makita ang $1 (na) kailangan." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +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 "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 "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 "I-install ang $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "I-install ang mga nawawalang kailangan" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +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 -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "" +msgid "No updates" +msgstr "Walang mga update" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Di nakita" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "I-overwrite" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Siguraduhing tama ang basehang laro." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +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 "View" -msgstr "" +msgid "Update All [$1]" +msgstr "I-update Lahat [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +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 "Persistance" -msgstr "" +msgid "Persistence" +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 "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". @@ -560,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 @@ -575,551 +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 "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$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 "Bigong ma-install ang modpack bilang $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Nilo-load..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +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 "Patungkol" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Mga Aktibong Nag-aambag" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Aktibong renderer:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Mga Core Developer" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "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 "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -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 "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "" +msgstr "Creative Mode" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: 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 -msgid "Name/Password" -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 "" +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 "Port" #: builtin/mainmenu/tab_local.lua -msgid "Port" -msgstr "" +msgid "Select Mods" +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 / Port" -msgstr "" +msgid "Address" +msgstr "Address" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Linisin" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" -msgstr "" +msgstr "Creative mode" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Pinsala/PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Mga Paborito" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +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 builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" -msgstr "" +msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Mga Pampublikong Server" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -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 "Dynamic na mga anino" + +#: builtin/mainmenu/tab_settings.lua +#, 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 "Generate Normal Maps" -msgstr "" +msgid "High" +msgstr "Mataas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Mababa" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Katamtaman" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "" +msgstr "Mipmap" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap + Aniso. Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -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 "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" +msgstr "Opaque na Tubig" #: builtin/mainmenu/tab_settings.lua msgid "Particles" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -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 "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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -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 +#, fuzzy +msgid "Very High" +msgstr "Napakataas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "" +msgid "Could not find or load game: " +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 "" - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" +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 "" - -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -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 "May naganap na serialization error:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +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 "Nakatago ang mga block bound" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Ipinapakita ang mga block bound para sa lahat ng mga block" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Ipinapakita ang block bound para sa kasalukuyang block" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +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 "Nakabukas ang pag-update sa kamera" + +#: src/client/game.cpp +#, 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 "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 "Bigong makakonekta dahil sa di matukoy na dahilan" #: src/client/game.cpp msgid "Continue" -msgstr "" +msgstr "Magpatuloy" #: src/client/game.cpp #, c-format @@ -1129,36 +1415,55 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- 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 "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 "" @@ -1175,706 +1480,717 @@ 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 "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +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 "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 "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 "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 "" - -#: src/client/keycode.cpp -msgid "Clear" -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/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Nakatago ang minimap" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimap sa radar mode, Zoom x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimap sa surface mode, Zoom x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimap sa texture mode" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Bigong mabuksan ang webpage" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Binubuksan ang webpage" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" -msgstr "" +msgstr "Tumuloy" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "" +msgid "\"Aux1\" = climb down" +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 "Aux1" #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" -msgstr "" +msgstr "Pabalik" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +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 "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -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 -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "" +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Volume ng Tunog: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1883,18 +2199,34 @@ msgstr "" 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 "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) 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 "" @@ -1907,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 "" @@ -1918,62 +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 "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -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 "" @@ -1982,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 "" @@ -2012,52 +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 "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 "" @@ -2065,16 +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 @@ -2085,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 "" @@ -2098,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 "" @@ -2167,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 "Audio" +msgstr "" #: src/settings_translation_file.cpp msgid "Automatic forward key" -msgstr "" +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 "Aux1 key" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +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 "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -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 -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "Palitan ang kamera" #: src/settings_translation_file.cpp msgid "" @@ -2275,174 +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 "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +msgid "Chat command time message threshold" +msgstr "Threshold sa mensahe sa oras ng utos sa chat" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +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 "Chatcommands" -msgstr "" +msgid "Chat weblinks" +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 "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 "Makukulay na anino" #: src/settings_translation_file.cpp msgid "" @@ -2471,6 +2929,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2495,10 +2969,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2525,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 @@ -2556,7 +3040,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2564,7 +3050,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2588,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 @@ -2631,8 +3119,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2663,12 +3152,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2739,6 +3222,15 @@ msgstr "" 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 "" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "" @@ -2751,6 +3243,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2795,18 +3297,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2823,22 +3342,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2887,14 +3400,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2903,18 +3408,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2923,6 +3416,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2931,12 +3434,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2948,7 +3445,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2967,18 +3468,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -2997,7 +3486,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3031,14 +3520,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: 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." @@ -3104,6 +3594,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3125,15 +3619,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3142,6 +3636,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3201,10 +3706,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3229,10 +3730,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3250,7 +3747,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3261,7 +3767,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3280,6 +3786,14 @@ msgstr "" 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 "" @@ -3297,9 +3811,14 @@ 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 "" @@ -3307,8 +3826,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3330,7 +3849,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3341,10 +3861,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3540,10 +4056,17 @@ 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 "" @@ -3576,8 +4099,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3599,11 +4121,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3627,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 @@ -3644,6 +4174,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3660,10 +4196,6 @@ msgstr "" 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 "" @@ -3691,7 +4223,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3714,16 +4246,12 @@ msgstr "" 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 @@ -3774,6 +4302,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3853,6 +4385,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3952,6 +4491,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4325,6 +4871,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4381,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 @@ -4391,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 @@ -4411,7 +4964,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4438,6 +4992,11 @@ msgstr "" 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" @@ -4509,21 +5068,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4585,6 +5144,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4690,7 +5253,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4738,6 +5305,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4792,17 +5366,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4851,12 +5429,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4867,6 +5457,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4933,16 +5527,16 @@ msgstr "" 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 "" @@ -4955,6 +5549,11 @@ msgstr "" 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 "" @@ -4967,14 +5566,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -4996,18 +5587,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5017,11 +5600,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5030,38 +5608,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5084,17 +5636,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5123,13 +5671,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5140,6 +5692,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5174,10 +5730,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5185,9 +5737,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5277,10 +5829,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5350,6 +5898,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Screen:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5377,6 +5930,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Mag-screenshot" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5389,10 +5947,6 @@ msgstr "" 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 "" @@ -5433,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" @@ -5460,10 +6025,19 @@ msgstr "" 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 "" @@ -5475,7 +6049,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5496,6 +6098,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5508,6 +6117,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5515,9 +6140,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5532,6 +6155,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5553,6 +6186,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5607,18 +6244,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5634,6 +6267,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5661,10 +6302,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5702,6 +6339,11 @@ msgstr "" 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 "" @@ -5744,6 +6386,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5758,6 +6407,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5813,18 +6466,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5842,6 +6495,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5850,9 +6509,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5889,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 @@ -5912,6 +6570,18 @@ msgstr "" 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 "" @@ -5982,15 +6652,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6084,7 +6769,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6154,6 +6839,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6175,18 +6864,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6221,13 +6908,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6311,14 +7007,58 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -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 34fcda843..815a0a4c2 100644 --- a/po/fr/minetest.po +++ b/po/fr/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: French (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-07-06 21:41+0000\n" -"Last-Translator: Estébastien Robespi <estebastien@mailbox.org>\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" "Language: fr\n" @@ -12,7 +12,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.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Effacer la file de sortie de message du tchat" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Commande vide." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Quitter vers le menu principal" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Commande invalide : " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Commande émise : " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Liste des joueurs en ligne" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Joueurs en ligne : " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "La file de sortie de message du tchat est maintenant vide." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Cette commande est désactivée par le serveur." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +58,41 @@ msgstr "Réapparaître" msgid "You died" msgstr "Vous êtes mort" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Commandes disponibles :" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Commandes disponibles : " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Commande non disponible : " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Obtenir de l'aide pour les commandes" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Utiliser « .help <cmd> » pour obtenir plus d'informations, ou « .help all » " +"pour tout lister." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "OK" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "< aucun disponible >" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Une erreur est survenue dans un script Lua :" @@ -44,11 +111,35 @@ msgstr "Se reconnecter" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "Le serveur souhaite rétablir une connexion :" +msgstr "Le serveur souhaite rétablir une connexion :" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Chargement..." +#: 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. " @@ -63,10 +154,8 @@ 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 "Try reenabling public serverlist and check your internet connection." -msgstr "" -"Essayez de rechargez la liste des serveurs publics et vérifiez votre " -"connexion Internet." +msgid "Visit website" +msgstr "Visiter le site web" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,19 +165,28 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" -msgstr "Dépend de :" +msgstr "Dépend de :" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable all" @@ -111,9 +209,9 @@ msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"Échec du chargement du mod « $1 » car il contient des caractères non " +"Échec du chargement du mod « $1 » car il contient des caractères non " "autorisés.\n" -"Seuls les caractères alphanumériques [a-z0-9_] sont autorisés." +"Seuls les caractères alphanumériques [a–z0–9_] sont autorisés." #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" @@ -121,7 +219,7 @@ msgstr "Rechercher des mods" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" -msgstr "Mod :" +msgstr "Mod :" #: builtin/mainmenu/dlg_config_world.lua msgid "No (optional) dependencies" @@ -141,47 +239,86 @@ msgstr "Aucune description fournie pour le pack de mods." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" -msgstr "Pas de dépendances facultatives" +msgstr "Pas de dépendances optionnelles" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" -msgstr "Dépendances optionnelles :" +msgstr "Dépendances optionnelles :" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp msgid "Save" -msgstr "Enregistrer" +msgstr "Sauvegarder" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" -msgstr "Sélectionner un monde :" +msgstr "Monde :" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" msgstr "activé" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "« $1 » existe déjà. Voulez-vous l'écraser ?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Les dépendances $1 et $2 vont être installées." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 par $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 en téléchargement,\n" +"$2 mis en attente" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "Téléchargement de $1…" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "Les dépendances nécessaires à $1 n'ont pas pu être trouvées." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 sera installé, et les dépendances de $2 seront ignorées." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Tous les paquets" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Déjà installé" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Retour au menu principal" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Jeu de base :" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "ContentDB n'est pas disponible quand Minetest est compilé sans cURL" #: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." -msgstr "Chargement..." +msgstr "Téléchargement…" #: builtin/mainmenu/dlg_contentstore.lua 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" @@ -190,7 +327,18 @@ msgid "Install" msgstr "Installer" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Installer $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Installer les dépendances manquantes" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Installation : type de fichier non supporté ou archive endommagée" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" @@ -203,9 +351,24 @@ msgid "No results" msgstr "Aucun résultat" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Rechercher" +msgid "No updates" +msgstr "Aucune mise à jour" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Non trouvé" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Écraser" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Veuillez vérifier que le jeu de base est correct." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "En file d'attente" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -217,15 +380,19 @@ msgstr "Désinstaller" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "Mise à jour" +msgstr "Mettre à jour" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Affichage" +msgid "Update All [$1]" +msgstr "Tout mettre à jour [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Voir plus d'informations dans un navigateur web" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "Le monde \"$1\" existe déjà" +msgstr "Le monde « $1 » existe déjà" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" @@ -237,7 +404,7 @@ msgstr "Refroidissement en altitude" #: builtin/mainmenu/dlg_create_world.lua msgid "Altitude dry" -msgstr "Faible humidité d'altitude" +msgstr "Faible humidité en altitude" #: builtin/mainmenu/dlg_create_world.lua msgid "Biome blending" @@ -264,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échargez un jeu comme Minetest Game depuis minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Téléchargez-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" @@ -281,19 +444,15 @@ msgstr "Terrain plat" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "Îles volantes" +msgstr "Masses de terrains flottants dans le ciel" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "Îles volantes (expérimental)" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Jeu" +msgstr "Terrains flottants (expérimental)" #: 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 sous-sol" +msgstr "Générer un terrain non fractal : océans et souterrains" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" @@ -307,13 +466,22 @@ msgstr "Rivières irrigantes" 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" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "L'air sec et chaud réduit le niveau d'eau ou assèche les rivières" +msgstr "" +"Humidité basse et chaleur élevée rendent les rivières peu profondes ou sèches" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -325,7 +493,7 @@ msgstr "Drapeaux de génération de terrain" #: builtin/mainmenu/dlg_create_world.lua msgid "Mapgen-specific flags" -msgstr "Drapeaux indicateurs du générateur de carte" +msgstr "Drapeaux spécifiques au générateur de terrain" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" @@ -337,7 +505,7 @@ msgstr "Coulée de boue" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "Réseau souterrain" +msgstr "Réseau de tunnels et de grottes" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -345,11 +513,11 @@ msgstr "Aucun jeu sélectionné" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "Réduire la température avec l'altitude" +msgstr "Réduit la chaleur avec l'altitude" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "Réduire l'humidité avec l'altitude" +msgstr "Réduit l'humidité avec l'altitude" #: builtin/mainmenu/dlg_create_world.lua msgid "Rivers" @@ -357,7 +525,7 @@ msgstr "Rivières" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "Rivière au niveau de mer" +msgstr "Rivières au niveau de la mer" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -373,8 +541,8 @@ msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" -"Structures apparaissantes sur le sol (sans effets sur la création d'arbre et " -"de jungle par v6)" +"Structures apparaissant sur le sol (sans effet sur la création d'arbres et " +"d'herbes de la jungle par v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" @@ -388,11 +556,11 @@ msgstr "Tempéré, désertique" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "Tempéré, désertique, tropical" +msgstr "Tempéré, désertique, jungle" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "Tempéré, désertique, tropical, de toundra, de taïga" +msgstr "Tempéré, désertique, jungle, toundra, taïga" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" @@ -400,7 +568,7 @@ msgstr "Érosion du sol" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "Arbres et végétation de jungle" +msgstr "Arbres et herbes de la jungle" #: builtin/mainmenu/dlg_create_world.lua msgid "Vary river depth" @@ -408,11 +576,7 @@ msgstr "Varier la profondeur fluviale" #: builtin/mainmenu/dlg_create_world.lua msgid "Very large caverns deep in the underground" -msgstr "Très grande cavernes profondes" - -#: 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." +msgstr "Très grandes cavernes profondes souterraines" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -424,7 +588,7 @@ msgstr "Vous n'avez pas de jeu installé." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "Êtes-vous sûr de vouloir supprimer \"$1\" ?" +msgstr "Êtes-vous sûr de vouloir supprimer « $1 » ?" #: builtin/mainmenu/dlg_delete_content.lua #: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua @@ -434,15 +598,45 @@ msgstr "Supprimer" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: failed to delete \"$1\"" -msgstr "Le gestionnaire de mods n'a pas pu supprimer \"$1\"" +msgstr "Gestionnaire de mods : échec de la suppression de « $1 »" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: invalid path \"$1\"" -msgstr "Gestionnaire de mods : chemin de mod invalide \"$1\"" +msgstr "Gestionnaire de mods : chemin invalide de « $1 »" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "Supprimer le monde \"$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" @@ -450,19 +644,19 @@ msgstr "Accepter" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Renommer le pack de mods :" +msgstr "Renommer le pack 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 "" -"Ce pack de mods a un nom explicitement donné dans son fichier modpack.conf ; " -"il écrasera tout renommage effectué ici." +"Ce pack de mods a un nom explicitement donné dans son fichier modpack.conf " +"qui remplacera tout renommage effectué ici." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" -msgstr "(Aucune description donnée de l'option)" +msgstr "(Aucune description du paramètre donnée)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "2D Noise" @@ -477,6 +671,14 @@ 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é" @@ -498,11 +700,11 @@ msgstr "Octaves" #: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Offset" -msgstr "Décallage" +msgstr "Décalage" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" -msgstr "Persistence" +msgid "Persistence" +msgstr "Persistance" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." @@ -518,27 +720,31 @@ msgstr "Réinitialiser" #: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Scale" -msgstr "Echelle" +msgstr "Échelle" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Rechercher" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" -msgstr "Choisissez un répertoire" +msgstr "Choisir un répertoire" #: builtin/mainmenu/dlg_settings_advanced.lua 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" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must be at least $1." -msgstr "La valeur doit être supérieure à $1." +msgstr "La valeur doit être au moins $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must not be larger than $1." -msgstr "La valeur doit être inférieure à $1." +msgstr "La valeur ne doit pas être supérieure à $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X" @@ -577,7 +783,7 @@ msgstr "Valeur absolue" #. for noise settings in main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "defaults" -msgstr "par défaut" +msgstr "Paramètres par défaut" #. ~ "eased" is a noise parameter flag. #. It is used to make the map smoother and @@ -585,7 +791,7 @@ msgstr "par défaut" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "eased" -msgstr "lissé" +msgstr "Lissé" #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" @@ -601,24 +807,13 @@ msgstr "Échec de l'installation de $1 vers $2" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "" -"Installation d'un mod : impossible de trouver le vrai nom du mod pour : $1" +msgstr "Installer mod : impossible de trouver le nom réel du mod pour : $1" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -"Installation un mod : impossible de trouver un nom de dossier valide pour le " -"pack de mods $1" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"Installation d'un mod : type de fichier non supporté \"$1\" ou archive " -"endommagée" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Installation : fichier : \"$1\"" +"Installer mod : impossible de trouver un nom de dossier valide pour le pack " +"de mods $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" @@ -626,11 +821,11 @@ msgstr "Impossible de trouver un mod ou un pack de mods valide" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a $1 as a texture pack" -msgstr "Échec de l'installation de $1 comme pack de textures" +msgstr "Impossible d'installer un $1 comme un pack de textures" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a game as a $1" -msgstr "Échec de l'installation du jeu comme un $1" +msgstr "Impossible d'installer un jeu comme un $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" @@ -640,6 +835,61 @@ msgstr "Impossible d'installer un mod comme un $1" msgid "Unable to install a modpack as a $1" msgstr "Impossible d'installer un pack de mods comme un $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Chargement…" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "La liste des serveurs publics est désactivée" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Essayer de réactiver la liste des serveurs et vérifier votre connexion " +"Internet." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "À propos" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Contributeurs actifs" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Moteur de rendu actif :" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Développeurs principaux" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Répertoire de données utilisateur" + +#: 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 "" +"Ouvre le répertoire qui contient les mondes, les jeux, les mods et les packs " +"de textures\n" +"fournis par l'utilisateur dans un gestionnaire de fichiers/explorateur." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Anciens contributeurs" + +#: builtin/mainmenu/tab_about.lua +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" @@ -654,11 +904,11 @@ msgstr "Désactiver le pack de textures" #: builtin/mainmenu/tab_content.lua msgid "Information:" -msgstr "Informations :" +msgstr "Informations :" #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" -msgstr "Paquets installés :" +msgstr "Paquets installés :" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." @@ -680,26 +930,6 @@ msgstr "Désinstaller le paquet" msgid "Use Texture Pack" msgstr "Utiliser un pack de texture" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Contributeurs actifs" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Développeurs principaux" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Crédits" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Anciens contributeurs" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Anciens développeurs principaux" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Annoncer le serveur" @@ -709,14 +939,10 @@ msgid "Bind Address" msgstr "Adresse à assigner" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Configurer" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Mode créatif" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Activer les dégâts" @@ -726,35 +952,35 @@ msgstr "Héberger une partie" #: builtin/mainmenu/tab_local.lua msgid "Host Server" -msgstr "Héberger un serveur" +msgstr "Héberger le serveur" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" msgstr "Installer à partir de ContentDB" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nom / Mot de passe" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Nouveau" #: builtin/mainmenu/tab_local.lua msgid "No world created or selected!" -msgstr "Aucun monde créé ou sélectionné !" +msgstr "Aucun monde créé ou sélectionné !" #: builtin/mainmenu/tab_local.lua msgid "Play Game" msgstr "Jouer" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Sélectionner les mods" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" -msgstr "Sélectionner un monde :" +msgstr "Sélectionner un monde :" #: builtin/mainmenu/tab_local.lua msgid "Server Port" @@ -765,49 +991,65 @@ msgid "Start Game" msgstr "Démarrer" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adresse / Port :" +msgid "Address" +msgstr "Adresse" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Rejoindre" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Effacer" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Mode créatif" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Dégâts activés" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Dégâts / JcJ" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Supprimer favori :" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favoris" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favori" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Serveurs incompatibles" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Rejoindre une partie" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nom / Mot de passe" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "Connexion" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "JcJ activé" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Serveurs publics" + +#: builtin/mainmenu/tab_online.lua +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 "2x" +msgstr "2×" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" @@ -815,11 +1057,11 @@ msgstr "Nuages en 3D" #: builtin/mainmenu/tab_settings.lua msgid "4x" -msgstr "4x" +msgstr "4×" #: builtin/mainmenu/tab_settings.lua msgid "8x" -msgstr "8x" +msgstr "8×" #: builtin/mainmenu/tab_settings.lua msgid "All Settings" @@ -827,24 +1069,16 @@ msgstr "Tous les paramètres" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "Anti-crénelage :" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Êtes-vous sûr de vouloir réinitialiser votre monde ?" +msgstr "Anticrénelage :" #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" -msgstr "Sauvegarder automatiquement la taille d'écran" +msgstr "Sauv. autom. de la taille d'écran" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "Filtrage bilinéaire" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Placage de relief" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Changer les touches" @@ -853,26 +1087,38 @@ msgstr "Changer les touches" msgid "Connected Glass" msgstr "Verre unifié" -#: builtin/mainmenu/tab_settings.lua -msgid "Fancy Leaves" -msgstr "Arbres détaillés" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Ombres dynamiques" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Génération de Normal Maps" +msgid "Dynamic shadows:" +msgstr "Ombres dynamiques :" + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "Feuilles détaillées" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "Élevées" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Basses" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Moyennes" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "MIP mapping" +msgstr "MIP map" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap + Aniso. Filter" msgstr "MIP map + anisotropie" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Non" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Aucun filtre" @@ -895,43 +1141,39 @@ msgstr "Aucun" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" -msgstr "Arbres minimaux" +msgstr "Feuilles opaques" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" msgstr "Eau opaque" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Occlusion parallaxe" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Activer les particules" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Réinitialiser le monde" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" -msgstr "Écran :" +msgstr "Écran :" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "Réglages" +msgstr "Paramètres" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" msgstr "Shaders" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shaders (expérimental)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Shaders (indisponible)" #: builtin/mainmenu/tab_settings.lua msgid "Simple Leaves" -msgstr "Arbres simples" +msgstr "Feuilles simples" #: builtin/mainmenu/tab_settings.lua msgid "Smooth Lighting" @@ -939,25 +1181,28 @@ msgstr "Lumière douce" #: builtin/mainmenu/tab_settings.lua msgid "Texturing:" -msgstr "Texturisation :" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" -"Pour activer les textures nuancées, le pilote OpenGL doit être utilisé." +msgstr "Texturisation :" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" -msgstr "mappage tonal" +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 "Very High" +msgstr "Très élevées" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Très basses" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Feuilles ondulantes" @@ -970,29 +1215,17 @@ msgstr "Liquides ondulants" msgid "Waving Plants" msgstr "Plantes ondulantes" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Oui" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Configurer les mods" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Principal" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Démarrer une partie solo" - #: 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." #: src/client/client.cpp msgid "Done!" -msgstr "Terminé !" +msgstr "Terminé !" #: src/client/client.cpp msgid "Initializing nodes" @@ -1000,27 +1233,27 @@ msgstr "Initialisation des blocs" #: src/client/client.cpp msgid "Initializing nodes..." -msgstr "Initialisation des blocs..." +msgstr "Initialisation des blocs…" #: src/client/client.cpp msgid "Loading textures..." -msgstr "Chargement des textures..." +msgstr "Chargement des textures…" #: src/client/client.cpp msgid "Rebuilding shaders..." -msgstr "Reconstruction des textures nuancées..." +msgstr "Reconstruction des shaders…" #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "Erreur de connexion (perte de connexion ?)" +msgstr "Erreur de connexion (perte de connexion ?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Impossible de trouver ou charger le jeu \"" +msgid "Could not find or load game: " +msgstr "Impossible de trouver ou charger le jeu : " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." -msgstr "gamespec invalide." +msgstr "Jeu spécifié invalide." #: src/client/clientlauncher.cpp msgid "Main Menu" @@ -1036,27 +1269,15 @@ msgstr "Nom du joueur trop long." #: src/client/clientlauncher.cpp msgid "Please choose a name!" -msgstr "Veuillez choisir un nom !" +msgstr "Veuillez choisir un nom !" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " -msgstr "Le fichier de mot de passe fourni n'a pas pu être ouvert : " +msgstr "Le fichier de mot de passe fourni n'a pas pu être ouvert : " #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " -msgstr "Le chemin du monde spécifié n'existe pas : " - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" +msgstr "Le chemin du monde spécifié n'existe pas : " #: src/client/game.cpp msgid "" @@ -1064,40 +1285,41 @@ msgid "" "Check debug.txt for details." msgstr "" "\n" -"Voir debug.txt pour plus d'informations." +"Voir « debug.txt » pour plus d'informations." #: src/client/game.cpp msgid "- Address: " -msgstr "- Adresse : " - -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Mode créatif : " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Dégâts : " +msgstr "– Adresse : " #: src/client/game.cpp msgid "- Mode: " -msgstr "- Mode : " +msgstr "– Mode : " #: src/client/game.cpp msgid "- Port: " -msgstr "- Port : " +msgstr "– Port : " #: src/client/game.cpp msgid "- Public: " -msgstr "- Public : " +msgstr "– Public : " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "- JcJ : " +msgstr "– JcJ : " #: src/client/game.cpp msgid "- Server Name: " -msgstr "- Nom du serveur : " +msgstr "– Nom du serveur : " + +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Une erreur de sérialisation est survenue :" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Accès refusé. Raison : %s" #: src/client/game.cpp msgid "Automatic forward disabled" @@ -1107,6 +1329,22 @@ msgstr "Marche automatique désactivée" msgid "Automatic forward enabled" msgstr "Marche automatique activée" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Limites des blocs cachées" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Limites des blocs affichées pour tous les blocs" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Limites des blocs affichées pour le bloc actuel" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Limites des blocs affichées pour les blocs voisins" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Mise à jour de la caméra désactivée" @@ -1115,9 +1353,14 @@ msgstr "Mise à jour de la caméra désactivée" msgid "Camera update enabled" msgstr "Mise à jour de la caméra activée" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" +"Impossible d'afficher les limites des blocs (désactivé par un jeu ou un mod)" + #: src/client/game.cpp msgid "Change Password" -msgstr "Changer votre mot de passe" +msgstr "Changer le mot de passe" #: src/client/game.cpp msgid "Cinematic mode disabled" @@ -1127,13 +1370,21 @@ msgstr "Mode cinématique désactivé" msgid "Cinematic mode enabled" msgstr "Mode cinématique activé" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Client déconnecté" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Les scripts côté client sont désactivés" #: src/client/game.cpp msgid "Connecting to server..." -msgstr "Connexion au serveur..." +msgstr "Connexion au serveur…" + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "La connexion a échoué pour une raison inconnue" #: src/client/game.cpp msgid "Continue" @@ -1147,50 +1398,55 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" -"Contrôles:\n" -"- %s : avancer\n" -"- %s : reculer\n" -"- %s : à gauche\n" -"- %s : à droite\n" -"- %s : sauter/grimper\n" -"- %s : marcher lentement/descendre\n" -"- %s : lâcher l'objet en main\n" -"- %s : inventaire\n" -"- Souris : tourner/regarder\n" -"- Souris gauche : creuser/attaquer\n" -"- Souris droite : placer/utiliser\n" -"- Molette souris : sélectionner objet\n" -"- %s : discuter\n" +"Contrôles :\n" +"– %s : avancer\n" +"– %s : reculer\n" +"– %s : à gauche\n" +"– %s : à droite\n" +"– %s : sauter/grimper\n" +"– %s : creuser/actionner\n" +"– %s : placer/utiliser\n" +"– %s : marcher lentement/descendre\n" +"– %s : lâcher un objet\n" +"– %s : inventaire\n" +"– Souris : tourner/regarder\n" +"– Molette souris : sélectionner un objet\n" +"– %s : tchat\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Impossible de résoudre l'adresse : %s" #: src/client/game.cpp msgid "Creating client..." -msgstr "Création du client..." +msgstr "Création du client…" #: src/client/game.cpp msgid "Creating server..." -msgstr "Création du serveur..." +msgstr "Création du serveur…" #: src/client/game.cpp msgid "Debug info and profiler graph hidden" -msgstr "Informations de debogage et graphique de profil cachés" +msgstr "Informations de débogage et graphique du profileur cachés" #: src/client/game.cpp msgid "Debug info shown" -msgstr "Infos de débogage affichées" +msgstr "Informations de débogage affichées" #: src/client/game.cpp msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "Informations de debogage, graphique de profil et fils de fer cachés" +msgstr "Informations de débogage, graphique du profileur et fils de fer cachés" #: src/client/game.cpp msgid "" @@ -1207,15 +1463,15 @@ msgid "" "- touch&drag, tap 2nd finger\n" " --> place single item to slot\n" msgstr "" -"Touches par défaut :\n" -"Sans menu visible :\n" -"- un seul appui : touche d'activation\n" -"- double-appui : placement / utilisation\n" -"- Glissement du doigt : regarder autour\n" -"Menu / Inventaire visible :\n" -"- double-appui (en dehors) : fermeture\n" -"- objet(s) dans l'inventaire : déplacement\n" -"- appui, glissement et appui : pose d'un seul item par emplacement\n" +"Touches par défaut :\n" +"Sans menu visible :\n" +"– un seul appui : touche d'activation\n" +"– double-appui : placement / utilisation\n" +"– Glissement du doigt : regarder autour\n" +"Menu / Inventaire visible :\n" +"– double-appui (en dehors) : fermeture\n" +"– objets dans l'inventaire : déplacement\n" +"– appui, glissement et appui : pose d'un seul objet par emplacement\n" #: src/client/game.cpp msgid "Disabled unlimited viewing range" @@ -1225,9 +1481,14 @@ msgstr "La limite de vue a été activée" 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" +msgstr "Menu principal" #: src/client/game.cpp msgid "Exit to OS" @@ -1235,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" @@ -1255,7 +1516,7 @@ msgstr "Mode vol activé" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "Mode vol activé (note: pas de privilège 'fly')" +msgstr "Mode vol activé (note : pas de privilège « fly »)" #: src/client/game.cpp msgid "Fog disabled" @@ -1267,7 +1528,7 @@ msgstr "Brouillard activé" #: src/client/game.cpp msgid "Game info:" -msgstr "Infos de jeu :" +msgstr "Infos de jeu :" #: src/client/game.cpp msgid "Game paused" @@ -1275,11 +1536,11 @@ msgstr "Jeu en pause" #: src/client/game.cpp msgid "Hosting server" -msgstr "Héberger un serveur" +msgstr "Serveur hôte" #: src/client/game.cpp msgid "Item definitions..." -msgstr "Définitions des items..." +msgstr "Définitions des objets…" #: src/client/game.cpp msgid "KiB/s" @@ -1287,7 +1548,7 @@ msgstr "Kio/s" #: src/client/game.cpp msgid "Media..." -msgstr "Média..." +msgstr "Média…" #: src/client/game.cpp msgid "MiB/s" @@ -1295,35 +1556,11 @@ msgstr "Mio/s" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "La minimap est actuellement désactivée par un jeu ou un mod" +msgstr "Mini-carte actuellement désactivée par un jeu ou un mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Mini-carte cachée" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Mini-carte en mode radar, zoom x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Mini-carte en mode radar, zoom x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Mini-carte en mode radar, zoom x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Mini-carte en mode surface, zoom x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Mini-carte en mode surface, zoom x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Mini-carte en mode surface, zoom x4" +msgid "Multiplayer" +msgstr "Multijoueur" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1335,11 +1572,11 @@ msgstr "Collisions désactivées" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "Collisions activées (note: pas de privilège 'noclip')" +msgstr "Collisions activées (note : pas de privilège « noclip »)" #: src/client/game.cpp msgid "Node definitions..." -msgstr "Définitions des blocs..." +msgstr "Définitions des blocs…" #: src/client/game.cpp msgid "Off" @@ -1351,15 +1588,15 @@ 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" -msgstr "Graphique de profil affiché" +msgstr "Graphique du profileur affiché" #: src/client/game.cpp msgid "Remote server" @@ -1367,11 +1604,11 @@ msgstr "Serveur distant" #: src/client/game.cpp msgid "Resolving address..." -msgstr "Résolution de l'adresse..." +msgstr "Résolution de l'adresse…" #: src/client/game.cpp msgid "Shutting down..." -msgstr "Fermeture du jeu..." +msgstr "Fermeture du jeu…" #: src/client/game.cpp msgid "Singleplayer" @@ -1387,7 +1624,7 @@ msgstr "Son coupé" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "L'audio système est désactivé" +msgstr "Le système audio est désactivé" #: src/client/game.cpp msgid "Sound system is not supported on this build" @@ -1397,10 +1634,25 @@ msgstr "Cette compilation ne gère pas l'audio du système" msgid "Sound unmuted" msgstr "Son rétabli" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Le serveur utilise probablement une version différente de %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Impossible de se connecter à %s car IPv6 est désactivé" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Impossible d’écouter sur %s car IPv6 est désactivé" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" -msgstr "Distance de vue réglée sur %d%1" +msgstr "Distance de vue réglée sur %d" #: src/client/game.cpp #, c-format @@ -1415,7 +1667,7 @@ msgstr "Distance de vue minimale : %d" #: src/client/game.cpp #, c-format msgid "Volume changed to %d%%" -msgstr "Volume réglé sur %d%%" +msgstr "Volume réglé sur %d %%" #: src/client/game.cpp msgid "Wireframe shown" @@ -1423,7 +1675,7 @@ msgstr "Fils de fer affichés" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "Le zoom est actuellement désactivé par un jeu ou un mod" +msgstr "Zoom actuellement désactivé par un jeu ou un mod" #: src/client/game.cpp msgid "ok" @@ -1466,10 +1718,6 @@ msgstr "Retour" msgid "Caps Lock" msgstr "Verr. Maj" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Vider" - #: src/client/keycode.cpp msgid "Control" msgstr "Contrôle" @@ -1528,7 +1776,7 @@ msgstr "Gauche" #: src/client/keycode.cpp msgid "Left Button" -msgstr "Bouton gauche" +msgstr "Clic gauche" #: src/client/keycode.cpp msgid "Left Control" @@ -1553,7 +1801,7 @@ msgstr "Menu" #: src/client/keycode.cpp msgid "Middle Button" -msgstr "Bouton du milieu" +msgstr "Clic central" #: src/client/keycode.cpp msgid "Num Lock" @@ -1654,7 +1902,7 @@ msgstr "Droite" #: src/client/keycode.cpp msgid "Right Button" -msgstr "Bouton droit" +msgstr "Clic droit" #: src/client/keycode.cpp msgid "Right Control" @@ -1715,58 +1963,67 @@ msgstr "Bouton X 2" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" -msgstr "Zoomer" +msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Les mots de passe ne correspondent pas !" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Mini-carte cachée" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "S'enregistrer et rejoindre" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 cliquez sur " -"« Annuler »." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Mini-carte en mode radar, zoom ×%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Mini-carte en mode surface, zoom ×%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Mini-carte en mode texture" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Échec de l'ouverture de la page Web" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Ouverture de la page web" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Procéder" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Spécial\" = descendre" +msgid "\"Aux1\" = climb down" +msgstr "« Aux1 » = descendre" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" -msgstr "Avancer automatiquement" +msgstr "Avancer autom." #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" msgstr "Sauts automatiques" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Reculer" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Limites des blocs" + #: src/gui/guiKeyChangeMenu.cpp 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" @@ -1780,15 +2037,15 @@ msgstr "Console" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. range" -msgstr "Plage de visualisation" +msgstr "Réd. la distance" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. volume" -msgstr "Réduire le volume" +msgstr "Réd. le volume" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "Double-appui sur « saut » pour voler" +msgstr "Double-appui sur « saut » pour voler" #: src/gui/guiKeyChangeMenu.cpp msgid "Drop" @@ -1800,11 +2057,11 @@ msgstr "Avancer" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. range" -msgstr "Augmenter la distance" +msgstr "Augm. la distance" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" -msgstr "Augmenter le volume" +msgstr "Augm. le volume" #: src/gui/guiKeyChangeMenu.cpp msgid "Inventory" @@ -1819,8 +2076,8 @@ 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)" -msgstr "Raccourcis" +msgid "Keybindings." +msgstr "Raccourcis clavier" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1850,17 +2107,13 @@ msgstr "Capture d'écran" msgid "Sneak" msgstr "Marcher lentement" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Spécial" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" -msgstr "Afficher/retirer l'interface" +msgstr "Interface" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle chat log" -msgstr "Afficher/retirer le canal de discussion" +msgstr "Afficher le tchat" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" @@ -1872,11 +2125,11 @@ msgstr "Voler" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" -msgstr "Afficher/retirer le brouillard" +msgstr "Brouillard" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle minimap" -msgstr "Afficher/retirer la mini-carte" +msgstr "Mini-carte" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle noclip" @@ -1884,20 +2137,16 @@ msgstr "Mode sans collision" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle pitchmove" -msgstr "Activer/désactiver vol vertical" +msgstr "Mouvement de tang." #: src/gui/guiKeyChangeMenu.cpp msgid "press key" -msgstr "appuyez sur une touche" +msgstr "Appuyer sur une touche" #: src/gui/guiPasswordChange.cpp 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" @@ -1906,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" @@ -1915,14 +2168,9 @@ msgid "Muted" msgstr "Muet" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Volume du son : " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Entrer " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Volume du son : %d %%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1931,23 +2179,34 @@ 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" "If disabled, virtual joystick will center to first-touch's position." msgstr "" -"(Android) Fixe la position du joystick virtuel.\n" -"Si désactivé, le joystick virtuel sera centré sur la position du doigt " +"(Android) Fixe la position de la manette virtuel.\n" +"Si désactivé, la manette virtuelle sera centrée sur la position du doigt " "principal." #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Utiliser le joystick vrituel pour déclencher le bouton « aux ».\n" -"Si activé, le joystick virtuel va également appuyer sur le bouton « aux » " +"(Android) Utiliser la manette virtuelle pour déclencher le bouton « Aux1 ».\n" +"Si activé, la manette virtuelle va également appuyer sur le bouton « Aux1 » " "lorsqu'en dehors du cercle principal." #: src/settings_translation_file.cpp @@ -1961,17 +2220,16 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" -"(X ; Y ; Z) de décalage fractal à partir du centre du monde en \n" -"unités « échelle ». Peut être utilisé pour déplacer un point\n" -"désiré en (0 ; 0) pour créer un point d'apparition convenable,\n" -"ou pour « zoomer » sur un point désiré en augmentant\n" -"« l'échelle ».\n" -"La valeur par défaut est réglée pour créer une zone\n" -"d'apparition convenable pour les ensembles de Mandelbrot\n" -"avec les paramètres par défaut, elle peut nécessité une \n" -"modification dans d'autres situations.\n" -"Interval environ de -2 à 2. Multiplier par « échelle » convertir\n" -"le décalage en nœuds." +"(X,Y,Z) de décalage du fractal à partir du centre du monde en unités " +"« échelle ».\n" +"Peut être utilisé pour déplacer un point désiré à (0, 0) pour créer une zone " +"d'apparition convenable, ou pour autoriser à « zoomer » sur un point désiré " +"en augmentant l'« échelle ».\n" +"La valeur par défaut est adaptée pour créer une zone d'apparition convenable " +"pour les ensembles de Mandelbrot crées avec des paramètres par défaut. Elle " +"peut nécessiter une modification dans d'autres situations.\n" +"La gamme est d'environ -2 à 2. Multiplier par « échelle » pour le décalage " +"en nœuds." #: src/settings_translation_file.cpp msgid "" @@ -1983,26 +2241,17 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" -"(Échelle (X,Y,Z) de fractales, en nœuds.\n" -"La taille des fractales sera 2 à 3 fais plus grande en réalité.\n" -"Ces nombres peuvent être très grands, les fractales de devant\n" -"pas être impérativement contenues dans le monde.\n" -"Augmentez-les pour « zoomer » dans les détails de la fractale.\n" -"Le réglage par défaut correspond à un forme écrasée verticalement, " -"appropriée pour\n" -"un île, rendez les 3 nombres égaux pour la forme de base." - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = occlusion parallaxe avec des informations de pente (plus rapide).\n" -"1 = cartographie en relief (plus lent, plus précis)." +"Échelle (X,Y,Z) de la fractale en nœuds.\n" +"La taille réelle de la fractale sera 2 à 3 fois plus grande.\n" +"Ces nombres peuvent être très grands, la fractale n'a pas à être contenue " +"dans le monde. Les augmenter pour « zoomer » dans les détails de la " +"fractale.\n" +"Le valeur par défaut est pour une forme verticalement écrasée convenant pour " +"une île, définir les 3 nombres égaux pour la forme brute." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "Bruit 2D controllant la forme et taille des montagnes crantées." +msgstr "Bruit 2D contrôlant la forme et taille des montagnes crantées." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." @@ -2026,7 +2275,7 @@ msgstr "Bruit 2D contrôlant la taille et la fréquence des plateaux montagneux. #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "Bruit 2D qui localise les vallées fluviales et les canaux" +msgstr "Bruit 2D qui localise les vallées et les chenaux des rivières." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2038,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." @@ -2050,7 +2299,7 @@ msgid "" "Also defines structure of floatland mountain terrain." msgstr "" "Bruit 3D définissant la structure et la hauteur des montagnes.\n" -"Définit également la structure des montagnes flottantes." +"Définit également la structure de terrain flottant type montagne." #: src/settings_translation_file.cpp msgid "" @@ -2059,11 +2308,11 @@ 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 "" -"Bruit 3D pour la structures des îles volantes.\n" -"Si la valeur par défaut est changée, le bruit « d'échelle » (0,7 par défaut)" -"\n" -"doit peut-être être ajustée, parce que l'effilage des îles volantes\n" -"fonctionne le mieux quand ce bruit est environ entre -2 et 2." +"Bruit 3D pour la structures des terrains flottants.\n" +"Si la valeur par défaut est changée, le bruit « d'échelle » (0,7 par défaut) " +"peut demander à être ajustée, comme l'effilage des terrains flottants " +"fonctionne mieux quand le bruit à une valeur approximativement comprise " +"entre -2,0 et 2,0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2080,7 +2329,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "Bruit 3D qui détermine le nombre de donjons par mapchunk." +msgstr "Bruit 3D qui détermine le nombre de donjons par tranche de carte." #: src/settings_translation_file.cpp msgid "" @@ -2097,14 +2346,18 @@ msgid "" msgstr "" "Support 3D.\n" "Actuellement supporté :\n" -"- aucun : pas de sortie 3D.\n" -"- anaglyphe : couleur 3D bleu turquoise/violet.\n" -"- entrelacé : polarisation basée sur des lignes avec support de l'écran.\n" -"- horizontal : partage haut/bas de l'écran.\n" -"- vertical : séparation côte à côte de l'écran.\n" -"- vue mixte : 3D binoculaire.\n" -"- pageflip : 3D basé sur quadbuffer.\n" -"Notez que le mode entrelacé nécessite que les shaders soient activés." +"– aucun : pas de sortie 3D.\n" +"– anaglyphe : couleur 3D bleu turquoise/violet.\n" +"– entrelacé : polarisation basée sur des lignes avec support de l'écran.\n" +"– horizontal : partage haut/bas de l'écran.\n" +"– vertical : séparation côte à côte de l'écran.\n" +"– vue mixte : 3D binoculaire.\n" +"– « pageflip » : 3D basé sur « quadbuffer ».\n" +"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 "" @@ -2117,17 +2370,19 @@ 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 s'interrompt." +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" -msgstr "Intervalle des ABM" +msgstr "Intervalle « ABM »" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "Budget de temps « ABM »" #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" @@ -2151,7 +2406,7 @@ msgstr "intervalle de gestion des blocs actifs" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "Portée des mapblocks actifs" +msgstr "Portée des blocs actifs" #: src/settings_translation_file.cpp msgid "Active object send range" @@ -2165,8 +2420,8 @@ msgid "" msgstr "" "Adresse où se connecter.\n" "Laisser vide pour démarrer un serveur local.\n" -"Notez que le champ de l'adresse dans le menu principal passe outre ce " -"réglage." +"Noter que le champ de l'adresse dans le menu principal passe outre ce " +"paramètre." #: src/settings_translation_file.cpp msgid "Adds particles when digging a node." @@ -2177,8 +2432,14 @@ msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" -"Ajuster la résolution de votre écran (non-X11 / Android seulement) ex. pour " -"les écrans 4k." +"Ajuste la configuration des PPP à votre écran (non X11 / Android seulement), " +"par exemple pour les écrans 4k." + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Ajuste la densité d'affichage détectée, utilisée pour la mise à l'échelle " +"des éléments de l'interface utilisateur." #: src/settings_translation_file.cpp #, c-format @@ -2189,12 +2450,16 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" -"Règle la densité de la couche de massifs volants.\n" -"La densité augmente avec cette valeur. Peut être positive ou négative.\n" -"Valeur égale à 0,0 implique 50 % du volume est du massif volant.\n" -"Valeur égale à 2,0 implique une couche de massifs volants solide\n" -"(peut dépendre de « mgv7_np_floatland », toujours vérifier pour\n" -"être sûr)." +"Règle la densité de la couche de terrain flottant.\n" +"Augmenter la valeur pour augmenter la densité. Peut être positive ou " +"négative.\n" +"Valeur = 0,0 : 50 % du volume est terrain flottant.\n" +"Valeur = 2,0 (peut être plus élevée selon « mgv7_np_floatland », toujours " +"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" @@ -2208,20 +2473,20 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" -"Il modifie la courbe de lumière en lui appliquant une \"correction gamma\".\n" +"Il modifie la courbe de lumière en lui appliquant une « correction gamma ».\n" "Des valeurs plus élevées rendent les niveaux de lumière moyens et inférieurs " "plus lumineux.\n" -"La valeur \"1.0\" laisse la courbe de lumière intacte.\n" -"Cela n'a d'effet significatif que sur la lumière du jour et les\n" -"la lumière, et elle a très peu d'effet sur la lumière naturelle de la nuit." +"La valeur « 1,0 » laisse la courbe de lumière intacte.\n" +"Cela n'a un effet significatif que sur la lumière du jour et la lumière " +"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" -msgstr "Occlusion gamma ambiente" +msgstr "Occlusion gamma ambiante" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." @@ -2241,7 +2506,7 @@ msgstr "Annoncer le serveur" #: src/settings_translation_file.cpp msgid "Announce to this serverlist." -msgstr "Annoncer le serveur publiquement." +msgstr "Annoncer à cette liste de serveurs." #: src/settings_translation_file.cpp msgid "Append item name" @@ -2249,7 +2514,7 @@ msgstr "Ajouter un nom d'objet" #: src/settings_translation_file.cpp msgid "Append item name to tooltip." -msgstr "Ajouter un nom d'objet à l'info-bulle." +msgstr "Ajouter un nom d'objet à l'infobulle." #: src/settings_translation_file.cpp msgid "Apple trees noise" @@ -2264,8 +2529,8 @@ msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" -"Inertie du bras, donne un mouvement plus réaliste\n" -"du bras lors des mouvements de caméra." +"Inertie du bras, donne un mouvement plus réaliste du bras lors des " +"mouvements de caméra." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" @@ -2285,21 +2550,23 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" -"À cette distance, le serveur va aggressivement optimiser quels blocs seront " -"envoyés aux\n" -"clients.\n" -"Des petites valeurs peuvent augmenter fortement la performance du serveur, " -"mais peut\n" -"provoquer l'apparition de problèmes de rendu visibles. (Certains blocs ne " -"seront pas affichés\n" -"sous l'eau ou dans les cavernes, ou parfois sur terre.)\n" -"Rendre cette valeur supérieure à max_block_send_distance désactive cette\n" +"À cette distance, le serveur va agressivement optimiser quels blocs seront " +"envoyés aux clients.\n" +"Des valeurs faibles peuvent augmenter fortement la performance du serveur, " +"mais peut provoquer l'apparition de problèmes de rendu visibles (certains " +"blocs ne seront pas affichés sous l'eau ou dans les cavernes, ou parfois sur " +"terre).\n" +"Une valeur supérieure à « max_block_send_distance » désactive cette " "optimisation.\n" -"Définie en mapblocks (16 nœuds)." +"É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 de marche automatique" +msgstr "Touche marche automatique" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." @@ -2307,19 +2574,27 @@ msgstr "Saute automatiquement sur les obstacles d'un bloc de haut." #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." -msgstr "Déclarer automatiquement le serveur à la liste des serveurs publics." +msgstr "Déclarer automatiquement le serveur à la liste des serveurs." #: src/settings_translation_file.cpp msgid "Autosave screen size" -msgstr "Sauver auto. la taile d'écran" +msgstr "Sauvegarde automatique de la taille d'écran" #: src/settings_translation_file.cpp msgid "Autoscaling mode" msgstr "Mode d'agrandissement automatique" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Touche Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Touche Aux1 pour monter/descendre" + #: src/settings_translation_file.cpp msgid "Backward key" -msgstr "Reculer" +msgstr "Touche reculer" #: src/settings_translation_file.cpp msgid "Base ground level" @@ -2329,21 +2604,17 @@ msgstr "Niveau du sol de base" 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 par défaut" +msgstr "Privilèges de base" #: src/settings_translation_file.cpp msgid "Beach noise" -msgstr "Bruit pour les plages" +msgstr "Bruit des plages" #: src/settings_translation_file.cpp msgid "Beach noise threshold" -msgstr "Seuil de bruit pour les plages" +msgstr "Seuil de bruit des plages" #: src/settings_translation_file.cpp msgid "Bilinear filtering" @@ -2354,36 +2625,36 @@ 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" msgstr "Bruit des biomes" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bits par pixel (profondeur de couleur) en mode plein-écran." - #: src/settings_translation_file.cpp 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" #: src/settings_translation_file.cpp msgid "Bold and italic monospace font path" -msgstr "Chemin de la police Monospace" +msgstr "Chemin de la police monospace en gras et en italique" #: src/settings_translation_file.cpp msgid "Bold font path" -msgstr "Chemin de police audacieux" +msgstr "Chemin de la police en gras" #: src/settings_translation_file.cpp msgid "Bold monospace font path" -msgstr "Chemin de police monospace audacieux" +msgstr "Chemin de la police monospace en gras" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2394,8 +2665,8 @@ msgid "Builtin" msgstr "Intégré" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bump mapping" +msgid "Camera" +msgstr "Caméra" #: src/settings_translation_file.cpp msgid "" @@ -2404,11 +2675,12 @@ msgid "" "Increasing can reduce artifacting on weaker GPUs.\n" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" -"Caméra « près de la coupure de distance » dans les nœuds, entre 0 et 0,25.\n" -"Fonctionne uniquement sur plateformes GLES.\n" -"La plupart des utilisateurs n’auront pas besoin de changer cela.\n" -"L’augmentation peut réduire les anomalies sur des petites cartes graphique.\n" -"0,1 par défaut, 0,25 bonne valeur pour des composants faibles." +"Distance de la caméra « près du plan de coupure » dans les nœuds, entre 0 et " +"0,25\n" +"Ne fonctionne que sur les plateformes GLES. La plupart des utilisateurs " +"n’auront pas besoin de changer cela.\n" +"L’augmentation peut réduire les artefacts sur des GPUs plus faibles.\n" +"0,1 = Défaut, 0,25 = Bonne valeur pour les tablettes plus faibles." #: src/settings_translation_file.cpp msgid "Camera smoothing" @@ -2420,47 +2692,47 @@ msgstr "Lissage du mouvement de la caméra en mode cinématique" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "Touche de mise à jour de la caméra" +msgstr "Touche mise à jour de la caméra" #: src/settings_translation_file.cpp msgid "Cave noise" -msgstr "Bruit des caves" +msgstr "Bruit de grottes" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "Bruit de cave nº 1" +msgstr "Bruit de grottes nº 1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "Bruit de grotte nº 2" +msgstr "Bruit de grottes nº 2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "Largeur de la grotte" +msgstr "Largeur des grottes" #: src/settings_translation_file.cpp msgid "Cave1 noise" -msgstr "Bruit des cave nº 1" +msgstr "Bruit de grottes nº 1" #: src/settings_translation_file.cpp msgid "Cave2 noise" -msgstr "Bruit des caves nº 2" +msgstr "Bruit de grottes nº 2" #: src/settings_translation_file.cpp msgid "Cavern limit" -msgstr "Limites des cavernes" +msgstr "Limite des cavernes" #: src/settings_translation_file.cpp msgid "Cavern noise" -msgstr "Bruit des caves" +msgstr "Bruit de cavernes" #: src/settings_translation_file.cpp msgid "Cavern taper" -msgstr "Caillou de caverne" +msgstr "Conicité des cavernes" #: src/settings_translation_file.cpp msgid "Cavern threshold" -msgstr "Limite des cavernes" +msgstr "Seuil des cavernes" #: src/settings_translation_file.cpp msgid "Cavern upper limit" @@ -2471,46 +2743,37 @@ msgid "" "Center of light curve boost range.\n" "Where 0.0 is minimum light level, 1.0 is maximum light level." msgstr "" -"Gamme de poussée de courbe de centre de lumière.\n" -"Lorsque 0,0 est le niveau de lumière minimum, et 1,0 est le niveau de " -"lumière maximum." +"Centre de la plage d'amplification de la courbe de lumière.\n" +"Où 0,0 est le niveau de lumière minimale, et 1,0 est le niveau de lumière " +"maximale." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Change l’interface du menu principal :\n" -"- Complet : Mondes solo, choix du jeu, sélecteur du pack de textures, " -"etc.\n" -"- Simple : un monde solo, pas de sélecteurs de jeu ou de pack de textures. " -"Peut être\n" -"nécessaire pour les plus petits écrans.\n" -"- Auto : Simple sur Android, complet pour le reste." +msgid "Chat command time message threshold" +msgstr "Seuil de message du temps de commande du tchat" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Commandes de tchat" #: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "Taille de police du chat" +msgstr "Taille de la police du tchat" #: src/settings_translation_file.cpp msgid "Chat key" -msgstr "Tchatter" +msgstr "Touche tchat" #: src/settings_translation_file.cpp msgid "Chat log level" -msgstr "Verbosité logicielle" +msgstr "Niveau du journal du tchat" #: src/settings_translation_file.cpp msgid "Chat message count limit" -msgstr "Limite du nombre de message de discussion" +msgstr "Limite du nombre de messages de tchat" #: src/settings_translation_file.cpp msgid "Chat message format" -msgstr "Format du message de chat" +msgstr "Format de message du tchat" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" @@ -2518,19 +2781,19 @@ msgstr "Seuil de messages de discussion avant déconnexion forcée" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "Longueur maximum d'un message de chat" +msgstr "Longueur maximale d'un message de tchat" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "Afficher le chat" +msgstr "Touche afficher le tchat" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Commandes de tchat" +msgid "Chat weblinks" +msgstr "Liens web de tchat" #: src/settings_translation_file.cpp msgid "Chunk size" -msgstr "Taille des chunks" +msgstr "Taille des tranches" #: src/settings_translation_file.cpp msgid "Cinematic mode" @@ -2538,12 +2801,20 @@ msgstr "Mode cinématique" #: src/settings_translation_file.cpp msgid "Cinematic mode key" -msgstr "Mode cinématique" +msgstr "Touche mode cinématique" #: src/settings_translation_file.cpp msgid "Clean transparent textures" msgstr "Textures transparentes filtrées" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Liens web cliquables (molette de la souris ou ctrl+clic gauche) activés dans " +"la sortie de la console de tchat." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Client" @@ -2564,6 +2835,10 @@ msgstr "Restrictions du modding côté client" 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" @@ -2586,7 +2861,11 @@ msgstr "Nuages dans le menu" #: src/settings_translation_file.cpp msgid "Colored fog" -msgstr "Brume colorée" +msgstr "Brouillard coloré" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Ombres colorées" #: src/settings_translation_file.cpp msgid "" @@ -2599,12 +2878,11 @@ msgid "" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" "Liste des drapeaux à cacher du dépôt des contenus.\n" -"\"nonfree\" peut être utilisé pour cacher les paquets non libres,\n" -"comme défini par la Free Software Foundation.\n" +"« nonfree » peut être utilisé pour cacher les paquets non libres, comme " +"défini par la Free Software Foundation.\n" "Vous pouvez aussi spécifier des classifications de contenu.\n" -"Ces drapeaux sont indépendants des versions de Minetest,\n" -"consultez la liste complète à l'adresse https://content.minetest.net/help/" -"content_flags/" +"Ces drapeaux sont indépendants des versions de Minetest, consulter la liste " +"complète à l'adresse https://content.minetest.net/help/content_flags/." #: src/settings_translation_file.cpp msgid "" @@ -2622,13 +2900,38 @@ msgid "" "functions even when mod security is on (via request_insecure_environment())." msgstr "" "Liste séparée par des virgules des mods de confiance qui sont autorisés à " -"accéder aux fonctions non\n" -"sécurisées même lorsque l'option de sécurisation des mods est activée (via " -"request_insecure_environment())." +"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() »)." #: src/settings_translation_file.cpp msgid "Command key" -msgstr "Commande" +msgstr "Touche commande" + +#: src/settings_translation_file.cpp +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 "" +"Niveau de compression à utiliser lors de la sauvegarde des blocs de carte " +"sur le disque.\n" +"-1 - utilise le niveau de compression par défaut\n" +"0 - compression minimale, le plus rapide\n" +"9 - meilleure compression, le plus lent" + +#: src/settings_translation_file.cpp +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 "" +"Niveau de compression à utiliser lors de l'envoi des blocs de carte au " +"client.\n" +"-1 - utilise le niveau de compression par défaut\n" +"0 - compression minimale, le plus rapide\n" +"9 - meilleure compression, le plus lent" #: src/settings_translation_file.cpp msgid "Connect glass" @@ -2644,20 +2947,28 @@ msgstr "Unifier le verre si le bloc le permet." #: src/settings_translation_file.cpp msgid "Console alpha" -msgstr "Opacité du fond de la console de jeu" +msgstr "Opacité de la console" #: src/settings_translation_file.cpp msgid "Console color" -msgstr "Couleur de la console de jeu" +msgstr "Couleur de la console" #: src/settings_translation_file.cpp 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" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Maximum de téléchargement en parallèle pour ContentDB" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "Adresse de la ContentDB" @@ -2672,12 +2983,12 @@ msgid "" "Press the autoforward key again or the backwards movement to disable." msgstr "" "Mouvement continu en avant, activé par la touche d'avance automatique.\n" -"Appuyez à nouveau sur la touche d'avance automatique ou de recul pour le " +"Appuyer à nouveau sur la touche d'avance automatique ou de recul pour le " "désactiver." #: src/settings_translation_file.cpp msgid "Controls" -msgstr "Touches de contrôle" +msgstr "Contrôles" #: src/settings_translation_file.cpp msgid "" @@ -2686,13 +2997,17 @@ msgid "" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" "Contrôle la durée complet du cycle jour/nuit.\n" -"Exemples :\n" +"Exemples :\n" "72 = 20 minutes, 360 = 4 minutes, 1 = 24 heures, 0 = jour/nuit/n'importe " "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." @@ -2709,8 +3024,8 @@ msgid "" "intensive noise calculations." msgstr "" "Contrôle la largeur des tunnels, une valeur plus faible crée des tunnels " -"plus large.\n" -"Valeur >= 10,0 désactive complètement la génération de tunnel et évite le " +"plus larges.\n" +"Valeur >= 10,0 désactive complètement la génération de tunnels et évite le " "calcul intensif de bruit." #: src/settings_translation_file.cpp @@ -2726,20 +3041,28 @@ msgid "Crosshair alpha" msgstr "Opacité du réticule" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Opacité du réticule (entre 0 et 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Opacité du réticule (entre 0 et 255).\n" +"Ceci s'applique également au réticule de l'objet." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Couleur du réticule" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Couleur du réticule (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"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." #: src/settings_translation_file.cpp msgid "DPI" -msgstr "DPI" +msgstr "PPP" #: src/settings_translation_file.cpp msgid "Damage" @@ -2747,23 +3070,23 @@ msgstr "Dégâts" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "Infos de débogage" +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 de détails des infos de débogage" +msgstr "Niveau du journal de débogage" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "Débogage" #: src/settings_translation_file.cpp msgid "Dec. volume key" -msgstr "Touche pour diminuer le volume" - -#: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "Diminuez ceci pour augmenter la résistance liquide au mouvement." +msgstr "Touche réduire le volume" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2803,11 +3126,13 @@ msgstr "Taille d’empilement par défaut" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Délais d'interruption de cURL par défaut, établi en millisecondes.\n" -"Seulement appliqué si Minetest est compilé avec cURL." +"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." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2838,15 +3163,7 @@ msgstr "Définit la structure des canaux fluviaux à grande échelle." #: src/settings_translation_file.cpp msgid "Defines location and terrain of optional hills and lakes." msgstr "" -"Définit l'emplacement et le terrain des collines facultatives et des lacs." - -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Niveau de lissage des normal maps.\n" -"Une valeur plus grande lisse davantage les normal maps." +"Définit l'emplacement et le terrain des collines et des lacs optionnels." #: src/settings_translation_file.cpp msgid "Defines the base ground level." @@ -2859,7 +3176,7 @@ msgstr "Définit la profondeur du court de la rivière." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" -"Détermine la distance maximale de transfert du joueur en mapblocks (0 = " +"Détermine la distance maximale de transfert du joueur en blocs (0 = " "illimité)." #: src/settings_translation_file.cpp @@ -2879,8 +3196,7 @@ msgid "" "Delay between mesh updates on the client in ms. Increasing this will slow\n" "down the rate of mesh updates, thus reducing jitter on slower clients." msgstr "" -"Délai entre les mises à jour du maillage sur le client en ms. Augmenter " -"ceci\n" +"Délai entre les mises à jour du maillage sur le client en ms. Augmenter ceci " "ralentit le taux de mise à jour et réduit donc les tremblements sur les " "client lents." @@ -2890,7 +3206,7 @@ msgstr "Retard dans les blocs envoyés après la construction" #: src/settings_translation_file.cpp msgid "Delay showing tooltips, stated in milliseconds." -msgstr "Latence d'apparition des infobulles, établie en millisecondes." +msgstr "Délai d'apparition des infobulles, établi en millisecondes." #: src/settings_translation_file.cpp msgid "Deprecated Lua API handling" @@ -2902,30 +3218,40 @@ msgstr "Profondeur en-dessous de laquelle se trouvent les grandes cavernes." #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." -msgstr "Profondeur en-dessous duquel se trouvent de grandes caves." +msgstr "Profondeur en-dessous duquel se trouvent de grandes grottes." #: src/settings_translation_file.cpp msgid "" "Description of server, to be displayed when players join and in the " "serverlist." -msgstr "Description du serveur affichée sur la liste des serveurs." +msgstr "" +"Description du serveur affichée lorsque les joueurs se connectent et sur la " +"liste des serveurs." #: src/settings_translation_file.cpp msgid "Desert noise threshold" -msgstr "Limite de bruit pour le désert" +msgstr "Seuil de bruit des déserts" #: 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 "" -"Des déserts apparaissent lorsque np_biome dépasse cette valeur.\n" -"Quand le flag 'snowbiomes' est activé, (avec le nouveau système de biomes), " -"ce paramètre est ignoré." +"Des déserts apparaissent lorsque « np_biome » dépasse cette valeur.\n" +"Quand le drapeau « snowbiomes » est activé (avec le nouveau système de " +"biomes), ce paramètre est ignoré." #: src/settings_translation_file.cpp msgid "Desynchronize block animation" -msgstr "Désynchroniser les textures animées par mapblock" +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" #: src/settings_translation_file.cpp msgid "Digging particles" @@ -2939,25 +3265,39 @@ msgstr "Désactiver l'anti-triche" msgid "Disallow empty passwords" msgstr "Refuser les mots de passe vides" +#: src/settings_translation_file.cpp +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 publics." +msgstr "Nom de domaine du serveur affichée sur la liste des serveurs." #: src/settings_translation_file.cpp msgid "Double tap jump for fly" -msgstr "Double-appui sur « saut » pour voler" +msgstr "Double-appui sur « saut » pour voler" #: src/settings_translation_file.cpp msgid "Double-tapping the jump key toggles fly mode." -msgstr "Double-appui sur « saut » pour voler." +msgstr "Double-appui sur la touche « saut » pour voler." #: src/settings_translation_file.cpp msgid "Drop item key" -msgstr "Lâcher" +msgstr "Touche lâcher un objet" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug information." -msgstr "Afficher les infos de débogage de la génération de terrain." +msgstr "Afficher les informations de débogage de la génération de terrain." #: src/settings_translation_file.cpp msgid "Dungeon maximum Y" @@ -2969,7 +3309,7 @@ msgstr "Minimum Y des donjons" #: src/settings_translation_file.cpp msgid "Dungeon noise" -msgstr "Bruit de donjon" +msgstr "Bruit de donjons" #: src/settings_translation_file.cpp msgid "" @@ -2987,21 +3327,44 @@ msgstr "" "Active le support des mods Lua sur le client.\n" "Ce support est expérimental et l'API peut changer." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Active le filtrage par disque de Poisson.\n" +"Si activé, utilise le disque de Poisson pour créer des « ombres douces ». " +"Sinon, utilise le filtrage PCF." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Active les ombres colorées.\n" +"Sur les nœuds vraiment transparents, projette des ombres colorées. Ceci est " +"coûteux." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Activer la console" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Activer le mode créatif pour les cartes nouvellement créées." +msgid "Enable creative mode for all players" +msgstr "Activer le mode créatif pour tous les joueurs." #: src/settings_translation_file.cpp msgid "Enable joysticks" -msgstr "Activer les 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 la sécurisation des mods." +msgstr "Activer le support des canaux de mods." #: src/settings_translation_file.cpp msgid "Enable mod security" @@ -3016,26 +3379,17 @@ msgid "Enable random user input (only used for testing)." 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 lorsque vous vous connectez à 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 "" @@ -3047,9 +3401,8 @@ msgid "" msgstr "" "Activer pour empêcher les anciens clients de se connecter.\n" "Les anciens clients sont compatibles dans le sens où ils ne s'interrompent " -"pas lors de la connexion\n" -"aux serveurs récents, mais ils peuvent ne pas supporter certaines " -"fonctionnalités." +"pas lors de la connexion aux serveurs récents, mais ils peuvent ne pas " +"supporter certaines fonctionnalités." #: src/settings_translation_file.cpp msgid "" @@ -3060,15 +3413,15 @@ msgid "" msgstr "" "Activer l'usage d'un serveur de média distant (si pourvu par le serveur).\n" "Les serveurs de média distants offrent un moyen significativement plus " -"rapide de télécharger\n" -"des données média (ex.: textures) lors de la connexion au serveur." +"rapide de télécharger des données média (ex. : textures) lors de la " +"connexion au serveur." #: src/settings_translation_file.cpp msgid "" "Enable vertex buffer objects.\n" "This should greatly improve graphics performance." msgstr "" -"Active les vertex buffer objects.\n" +"Active les « vertex buffer objects ».\n" "Cela devrait grandement augmenter les performances graphiques." #: src/settings_translation_file.cpp @@ -3076,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 "" @@ -3086,8 +3440,8 @@ msgid "" "Needs enable_ipv6 to be enabled." msgstr "" "Active/désactive l'usage d'un serveur IPv6.\n" -"Ignoré si bind_address est activé.\n" -"A besoin de enable_ipv6 pour être activé." +"Ignoré si « bind_address » est activé.\n" +"A besoin de « enable_ipv6 » pour être activé." #: src/settings_translation_file.cpp msgid "" @@ -3096,53 +3450,24 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" -"Permet à Hable 'Uncharted 2' de cartographier les tonalités du film.\n" -"Simule la courbe des tons du film photographique, ce qui se rapproche de la\n" +"Active le mappage de tons filmique « Uncharted 2 » de Hable.\n" +"Simule la courbe des tons du film photographique, ce qui se rapproche de la " "l'apparition d'images à plage dynamique élevée. Le contraste de milieu de " -"gamme est légèrement\n" -"améliorées, les reflets et les ombres sont progressivement compressés." +"gamme est légèrement améliorées, les reflets et les ombres sont " +"progressivement compressés." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." msgstr "Active la rotation des items d'inventaire." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Active le bumpmapping pour les textures.\n" -"Les normalmaps peuvent être fournies par un pack de textures pour un " -"meilleur effet de relief,\n" -"ou bien celui-ci est auto-généré.\n" -"Nécessite les shaders pour être activé." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." -msgstr "Active la mise en cache des meshnodes." +msgstr "Active la mise en cache des maillages orientés." #: src/settings_translation_file.cpp msgid "Enables minimap." msgstr "Active la mini-carte." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Active la génération à la volée des normalmaps.\n" -"Nécessite le bumpmapping pour être activé." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Active l'occlusion parallaxe.\n" -"Nécessite les shaders pour être activé." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3151,27 +3476,31 @@ msgid "" "Changing this setting requires a restart." msgstr "" "Active le système audio.\n" -"S'il est désactivé, cela désactive complètement tous les sons partout et le " -"jeu\n" -"les commandes audio ne fonctionneront pas.\n" +"Si désactivé, cela désactive complètement tous les sons partout et les " +"commandes audio dans le jeu ne fonctionneront pas.\n" "La modification de ce paramètre nécessite un redémarrage." +#: src/settings_translation_file.cpp +msgid "" +"Enables tradeoffs that reduce CPU load or increase rendering performance\n" +"at the expense of minor visual glitches that do not impact game playability." +msgstr "" +"Active les compromis qui réduisent la charge du CPU ou augmentent les " +"performances de rendu au détriment de problèmes visuels mineurs qui n'ont " +"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 profil" +msgstr "Intervalle d'impression des données du moteur de profilage" #: src/settings_translation_file.cpp msgid "Entity methods" msgstr "Systèmes d'entité" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Option expérimentale, peut causer un espace vide visible entre les blocs\n" -"quand paramétré avec un nombre supérieur à 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3181,16 +3510,22 @@ 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 "" -"Exposant contrôlant la forme du bas des massifs volants.\n" -"Une valeur égale à 1 donne une forme conique.\n" -"Une valeur supérieure à 1 donne une longue base éfilée (concave),\n" -"plus pour des îles volantes comme celles par défaut.\n" -"Une valeur inférieure à 1 (disons 0,25) donne une surface bien\n" -"définie en bas, plus pour une couche solide de massif volant." +"Exposant de l'effilement des terrains flottants. Modifie le comportement de " +"l'effilement.\n" +"Une valeur égale à 1 créée un effilement uniforme et linéaire.\n" +"Une valeur supérieure à 1 créée un effilement lisse adaptée pour les " +"terrains flottants séparés par défaut.\n" +"Une valeur inférieure à 1 (par exemple 0,25) créée une surface plus définie " +"avec des terrains bas plus plats, adaptée pour une couche solide de terrain " +"flottant." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS maximum sur le menu pause" +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" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3202,27 +3537,15 @@ 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" -msgstr "Chemin de police alternative" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Ombre de la police alternative" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Opacité de l'ombre de la police alternative" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Taille de la police alternative" +msgstr "Chemin de la police alternative" #: src/settings_translation_file.cpp msgid "Fast key" -msgstr "Mode rapide" +msgstr "Touche mode rapide" #: src/settings_translation_file.cpp msgid "Fast mode acceleration" @@ -3238,11 +3561,11 @@ msgstr "Mouvement rapide" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Mouvement rapide (via la touche « utiliser »).\n" -"Nécessite le privilège « rapide» sur le serveur." +"Mouvement rapide (via la touche « Aux1 »).\n" +"Nécessite le privilège « fast » sur le serveur." #: src/settings_translation_file.cpp msgid "Field of view" @@ -3258,9 +3581,8 @@ msgid "" "the\n" "Multiplayer Tab." msgstr "" -"Fichier localisé dans client/serverlist/ contenant vos serveurs favoris " -"affichés dans\n" -"l'onglet multijoueur." +"Fichier dans « client/serverlist/ » contenant vos serveurs favoris affichés " +"dans l'onglet « Rejoindre une partie »." #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3272,30 +3594,31 @@ msgstr "Bruit de profondeur de remplissage" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" -msgstr "Cartographie des tonalités filmiques" +msgstr "Mappage de tons filmique" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" -"Les textures filtrées peuvent mélanger des valeurs RGB avec des zones 100 % " +"Les textures filtrées peuvent mélanger des valeurs RVB avec des zones " +"complètement transparentes, que les optimiseurs PNG ignorent généralement, " +"aboutissant souvent à des bords foncés ou clairs sur les textures " "transparentes.\n" -"aboutissant parfois à des bords foncés ou clairs sur les textures " -"transparentes.\n" -"Appliquer ce filtre pour nettoyer cela au chargement de la texture." +"Appliquer ce filtre pour nettoyer cela au chargement de la texture. Ceci est " +"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." msgstr "" -"Le premier des 4 bruits 2D qui définissent la hauteur des collines et " -"montagnes." +"Le premier des 4 bruits 2D qui définissent ensemble la hauteur des collines " +"et des montagnes." #: src/settings_translation_file.cpp msgid "First of two 3D noises that together define tunnels." @@ -3307,39 +3630,39 @@ msgstr "Graine de génération de terrain déterminée" #: src/settings_translation_file.cpp msgid "Fixed virtual joystick" -msgstr "Fixer le joystick virtuel" +msgstr "Fixer la manette virtuelle" #: src/settings_translation_file.cpp msgid "Floatland density" -msgstr "Densité des massifs volants" +msgstr "Densité des terrains flottants" #: src/settings_translation_file.cpp msgid "Floatland maximum Y" -msgstr "Maximum Y de massifs volants" +msgstr "Maximum Y des terrains flottants" #: src/settings_translation_file.cpp msgid "Floatland minimum Y" -msgstr "Minimum Y des massifs volants" +msgstr "Minimum Y des terrains flottants" #: src/settings_translation_file.cpp msgid "Floatland noise" -msgstr "Bruit des massifs volants" +msgstr "Bruit des terrains flottants" #: src/settings_translation_file.cpp msgid "Floatland taper exponent" -msgstr "Paramètre de forme des massifs volants" +msgstr "Exposant de l'effilement des terrains flottants" #: src/settings_translation_file.cpp msgid "Floatland tapering distance" -msgstr "Hauteur des bases des massifs volants" +msgstr "Hauteur de la base des terrains flottants" #: src/settings_translation_file.cpp msgid "Floatland water level" -msgstr "Niveau d'eau des massifs volants" +msgstr "Niveau d'eau des terrains flottants" #: src/settings_translation_file.cpp msgid "Fly key" -msgstr "Voler" +msgstr "Touche voler" #: src/settings_translation_file.cpp msgid "Flying" @@ -3347,7 +3670,7 @@ msgstr "Voler" #: src/settings_translation_file.cpp msgid "Fog" -msgstr "Brume" +msgstr "Brouillard" #: src/settings_translation_file.cpp msgid "Fog start" @@ -3355,15 +3678,19 @@ msgstr "Début du brouillard" #: src/settings_translation_file.cpp msgid "Fog toggle key" -msgstr "Brume" +msgstr "Touche brouillard" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "Police" #: src/settings_translation_file.cpp msgid "Font bold by default" -msgstr "La police est en gras par défaut" +msgstr "Police en gras par défaut" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "La police est en gras par défaut" +msgstr "Police en italique par défaut" #: src/settings_translation_file.cpp msgid "Font shadow" @@ -3378,24 +3705,42 @@ msgid "Font size" msgstr "Taille de la police" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "La taille de police par défaut en point (pt)." +msgid "Font size divisible by" +msgstr "Taille de la police divisible par" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Taille de police secondaire au point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Taille de la police par défaut où 1 unité = 1 pixel à 96 PPP" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "Taille de la police monospace en point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Taille de la police monospace où 1 unité = 1 pixel à 96 PPP" #: 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 "" -"Taille de police (en pt) des messages récents et du curseur.\n" -"Une valeur nulle correspond à la taille par défaut." +"Taille de la police des messages récents de tchat et de l'invité de tchat en " +"point (pt).\n" +"La valeur 0 utilise la taille de police par défaut." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"Pour les polices de style pixel qui ne s'adaptent pas bien, cela garantit " +"que les tailles de police utilisées avec cette police seront toujours " +"divisibles par cette valeur, en pixels. Par exemple une police de style " +"pixel de 16 pixels de haut doit avoir cette valeur définie sur 16, alors " +"elle ne sera jamais que de taille 16, 32, 48, etc., donc un mod demandant " +"une taille de 25 obtiendra 32." #: src/settings_translation_file.cpp msgid "" @@ -3403,8 +3748,8 @@ msgid "" "placeholders:\n" "@name, @message, @timestamp (optional)" msgstr "" -"Format des messages de chat des joueurs. Substituts valides :\n" -"@name, @message, @timestamp (facultatif)" +"Format des messages de tchat des joueurs. Substituts valides :\n" +"@name, @message, @timestamp (optionnel)" #: src/settings_translation_file.cpp msgid "Format of screenshots." @@ -3412,45 +3757,46 @@ msgstr "Format de captures d'écran." #: src/settings_translation_file.cpp msgid "Formspec Default Background Color" -msgstr "Couleur d'arrière plan par défaut des formspec" +msgstr "Couleur de l'arrière-plan par défaut des formspec" #: src/settings_translation_file.cpp msgid "Formspec Default Background Opacity" -msgstr "Opacité par défaut des formspec" +msgstr "Opacité de l'arrière-plan par défaut des formspec" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Color" -msgstr "Couleur d'arrière plan des formspec plein écran" +msgstr "Couleur de l'arrière-plan en plein écran des formspec" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Opacity" -msgstr "Opacité de l'arrière plan des formspec en plein écran" +msgstr "Opacité de l'arrière-plan en plein écran des formspec" #: src/settings_translation_file.cpp msgid "Formspec default background color (R,G,B)." -msgstr "Couleur de fond de la console du jeu (R,G,B)." +msgstr "Couleur de l'arrière-plan par défaut des formspec (R,V,B)." #: src/settings_translation_file.cpp msgid "Formspec default background opacity (between 0 and 255)." -msgstr "Opacité de fond de la console du jeu (entre 0 et 255)." +msgstr "Opacité de l'arrière-plan par défaut des formspec (entre 0 et 255)." #: src/settings_translation_file.cpp msgid "Formspec full-screen background color (R,G,B)." -msgstr "Couleur de fond de la console du jeu (R,G,B)." +msgstr "Couleur de l'arrière-plan en plein écran des formspec (R,V,B)." #: src/settings_translation_file.cpp msgid "Formspec full-screen background opacity (between 0 and 255)." -msgstr "Opacité de fond de la console du jeu (entre 0 et 255)." +msgstr "" +"Opacité de l'arrière-plan en plein écran des formspec (entre 0 et 255)." #: src/settings_translation_file.cpp msgid "Forward key" -msgstr "Avancer" +msgstr "Touche avancer" #: src/settings_translation_file.cpp msgid "Fourth of 4 2D noises that together define hill/mountain range height." msgstr "" -"Le quatrième des 4 bruits 2D qui définissent la hauteur des collines et " -"montagnes." +"Le quatrième des 4 bruits 2D qui définissent ensemble la hauteur des " +"collines et des montagnes." #: src/settings_translation_file.cpp msgid "Fractal type" @@ -3459,25 +3805,22 @@ 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é" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Polices Freetype" +"Fraction de la distance de vue à partir de laquelle le brouillard commence à " +"être rendu." #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." msgstr "" -"Distance maximale de génération des mapblocks (16^3 blocs) depuis la " -"position du client." +"Distance maximale de génération des blocs depuis la position du client, " +"établie en blocs de carte (16^3 blocs)." #: src/settings_translation_file.cpp msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." msgstr "" -"Distance maximale d'envoi des mapblocks aux clients, établie en mapblocks " +"Distance maximale d'envoi des blocs aux clients, établie en blocs de carte " "(16^3 blocs)." #: src/settings_translation_file.cpp @@ -3489,24 +3832,22 @@ msgid "" "player is looking. (This can avoid mobs suddenly disappearing from view)" msgstr "" "Distance maximale à laquelle les clients ont connaissance des objets, " -"indiquée en mapblocks (16 nœuds).\n" +"établie en blocs de carte (16 nœuds).\n" "\n" -"Si vous définissez une valeur supérieure à active_block_range, le serveur\n" -"va maintenir les objets actifs jusqu’à cette distance dans la direction où\n" -"un joueur regarde. (Cela peut éviter que des mobs disparaissent soudainement " -"de la vue.)" +"Définir cela plus grand que « active_block_range », ainsi le serveur va " +"maintenir les objets actifs jusqu’à cette distance dans la direction où un " +"joueur regarde (cela peut éviter que des mobs disparaissent soudainement de " +"la vue)." #: src/settings_translation_file.cpp msgid "Full screen" msgstr "Plein écran" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Bits par pixel en mode plein écran" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." -msgstr "Mode plein écran." +msgstr "" +"Mode plein écran.\n" +"Un redémarrage est nécessaire après la modification de cette option." #: src/settings_translation_file.cpp msgid "GUI scaling" @@ -3518,11 +3859,19 @@ msgstr "Filtrage des images du GUI" #: src/settings_translation_file.cpp msgid "GUI scaling filter txr2img" -msgstr "Filtrage txr2img du GUI" +msgstr "Filtrage de mise à l'échelle txr2img du GUI" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Normal mapping" +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" @@ -3532,33 +3881,40 @@ msgstr "Rappels globaux" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Attributs de génération de terrain globaux.\n" -"Dans le générateur de terrain v6, le signal « décorations » contrôle toutes " -"les décorations sauf les arbres\n" -"et l’herbe de la jungle, dans tous les autres générateurs de terrain, ce " -"signal contrôle toutes les décorations." +"Dans le générateur de terrain v6, le drapeau « décorations » contrôle toutes " +"les décorations sauf les arbres et les herbes de la jungle, dans tous les " +"autres générateurs de terrain, ce drapeau contrôle toutes les décorations." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." msgstr "" -"Gradient de la courbe de lumière au niveau de lumière maximum. \n" -"Contrôle le contraste de la lumière aux niveaux d'éclairage les plus élevés." +"Gradient de la courbe de lumière au niveau de lumière maximale.\n" +"Contrôle le contraste aux niveaux d'éclairage les plus élevés." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." msgstr "" -"Gradient de la courbe de lumière au niveau de lumière maximum. \n" -"Contrôle le contraste de la lumière aux niveaux d'éclairage les plus bas." +"Gradient de la courbe de lumière au niveau de lumière minimale.\n" +"Contrôle le contraste aux niveaux d'éclairage les plus bas." #: src/settings_translation_file.cpp msgid "Graphics" -msgstr "Options graphiques" +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" @@ -3570,32 +3926,35 @@ msgstr "Niveau du sol" #: src/settings_translation_file.cpp msgid "Ground noise" -msgstr "Bruit pour la boue" +msgstr "Bruit au sol" #: src/settings_translation_file.cpp msgid "HTTP mods" msgstr "Mods HTTP" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "Facteur mise à l'échelle du HUD" +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" -msgstr "HUD" +msgstr "Touche HUD" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"Traitement des appels d'API Lua obsolètes :\n" -"- legacy : imite l'ancien comportement (par défaut en mode release).\n" -"- log : imite et enregistre les appels obsolètes (par défaut en mode debug)." -"\n" -"- error : interruption à l'usage d'un appel obsolète (recommandé pour les " +"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).\n" +"– erreur : s'interrompt lors d'un appel obsolète (recommandé pour les " "développeurs de mods)." #: src/settings_translation_file.cpp @@ -3606,11 +3965,11 @@ msgid "" "call).\n" "* Instrument the sampler being used to update the statistics." msgstr "" -"Auto-instrumentaliser le profileur:\n" -"* Instrumentalise une fonction vide.\n" -"La surcharge sera évaluée. (l'auto-instrumentalisation ajoute 1 appel de " +"Auto-instrumentaliser le profileur :\n" +"* Instrumentalise une fonction vide.\n" +"La surcharge est évaluée (l'auto-instrumentalisation ajoute 1 appel de " "fonction à chaque fois).\n" -"* Instrumentalise l’échantillonneur utilisé pour mettre à jour les " +"* Instrumentalise l’échantillonneur utilisé pour mettre à jour les " "statistiques." #: src/settings_translation_file.cpp @@ -3622,8 +3981,11 @@ msgid "Heat noise" msgstr "Bruit de chaleur" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Résolution verticale de la fenêtre de jeu." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Composant de hauteur de la taille initiale de la fenêtre. Ignoré en mode " +"plein écran." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3633,10 +3995,6 @@ msgstr "Bruit de hauteur" msgid "Height select noise" msgstr "Bruit de sélection de hauteur" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "FPU de haute précision" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Pente des collines" @@ -3647,19 +4005,19 @@ msgstr "Seuil des collines" #: src/settings_translation_file.cpp msgid "Hilliness1 noise" -msgstr "Bruit de collines1" +msgstr "Bruit de collines nº 1" #: src/settings_translation_file.cpp msgid "Hilliness2 noise" -msgstr "Bruit de colline2" +msgstr "Bruit de collines nº 2" #: src/settings_translation_file.cpp msgid "Hilliness3 noise" -msgstr "Bruit de colline3" +msgstr "Bruit de collines nº 3" #: src/settings_translation_file.cpp msgid "Hilliness4 noise" -msgstr "Bruit de collines4" +msgstr "Bruit de collines nº 4" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." @@ -3670,24 +4028,24 @@ msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" -"Accélération horizontale dans l'air en sautant ou en tombant,\n" -"en nœuds par seconde par seconde." +"Accélération horizontale dans l'air en sautant ou en tombant, en nœuds par " +"seconde par seconde." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration in fast mode,\n" "in nodes per second per second." msgstr "" -"Accélération horizontale et verticale en mode rapide,\n" -"en nœuds par seconde par seconde." +"Accélération horizontale et verticale en mode rapide, en nœuds par seconde " +"par seconde." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration on ground or when climbing,\n" "in nodes per second per second." msgstr "" -"Accélération horizontale et verticale au sol ou en montée,\n" -"en blocs par seconde." +"Accélération horizontale et verticale au sol ou en montée, en nœuds par " +"seconde." #: src/settings_translation_file.cpp msgid "Hotbar next key" @@ -3699,131 +4057,131 @@ msgstr "Touche précédent sur la barre d'actions" #: src/settings_translation_file.cpp msgid "Hotbar slot 1 key" -msgstr "Touche de l'emplacement 1 de la barre d'action" +msgstr "Touche emplacement 1 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 10 key" -msgstr "Touche de l'emplacement 10 de la barre d'action" +msgstr "Touche emplacement 10 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 11 key" -msgstr "Touche de l'emplacement 11 de la barre d'action" +msgstr "Touche emplacement 11 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 12 key" -msgstr "Touche de l'emplacement 12 de la barre d'action" +msgstr "Touche emplacement 12 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 13 key" -msgstr "Touche de l'emplacement 13 de la barre d'action" +msgstr "Touche emplacement 13 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 14 key" -msgstr "Touche de l'emplacement 14 de la barre d'action" +msgstr "Touche emplacement 14 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 15 key" -msgstr "Touche de l'emplacement 15 de la barre d'action" +msgstr "Touche emplacement 15 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 16 key" -msgstr "Touche de l'emplacement 16 de la barre d'action" +msgstr "Touche emplacement 16 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 17 key" -msgstr "Touche de l'emplacement 17 de la barre d'action" +msgstr "Touche emplacement 17 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 18 key" -msgstr "Touche de l'emplacement 18 de la barre d'action" +msgstr "Touche emplacement 18 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 19 key" -msgstr "Touche de l'emplacement 19 de la barre d'action" +msgstr "Touche emplacement 19 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 2 key" -msgstr "Touche de l'emplacement 2 de la barre d'action" +msgstr "Touche emplacement 2 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 20 key" -msgstr "Touche de l'emplacement 20 de la barre d'action" +msgstr "Touche emplacement 20 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 21 key" -msgstr "Touche de l'emplacement 21 de la barre d'action" +msgstr "Touche emplacement 21 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 22 key" -msgstr "Touche de l'emplacement 22 de la barre d'action" +msgstr "Touche emplacement 22 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 23 key" -msgstr "Touche de l'emplacement 23 de la barre d'action" +msgstr "Touche emplacement 23 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 24 key" -msgstr "Touche de l'emplacement 24 de la barre d'action" +msgstr "Touche emplacement 24 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 25 key" -msgstr "Touche de l'emplacement 25 de la barre d'action" +msgstr "Touche emplacement 25 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 26 key" -msgstr "Touche de l'emplacement 26 de la barre d'action" +msgstr "Touche emplacement 26 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 27 key" -msgstr "Touche de l'emplacement 27 de la barre d'action" +msgstr "Touche emplacement 27 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 28 key" -msgstr "Touche de l'emplacement 28 de la barre d'action" +msgstr "Touche emplacement 28 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 29 key" -msgstr "Touche de l'emplacement 29 de la barre d'action" +msgstr "Touche emplacement 29 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 3 key" -msgstr "Touche de l'emplacement 3 de la barre d'action" +msgstr "Touche emplacement 3 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 30 key" -msgstr "Touche de l'emplacement 30 de la barre d'action" +msgstr "Touche emplacement 30 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 31 key" -msgstr "Touche de l'emplacement 31 de la barre d'action" +msgstr "Touche emplacement 31 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 32 key" -msgstr "Touche de l'emplacement 32 de la barre d'action" +msgstr "Touche emplacement 32 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 4 key" -msgstr "Touche de l'emplacement 4 de la barre d'action" +msgstr "Touche emplacement 4 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 5 key" -msgstr "Touche de l'emplacement 5 de la barre d'action" +msgstr "Touche emplacement 5 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 6 key" -msgstr "Touche de l'emplacement 6 de la barre d'action" +msgstr "Touche emplacement 6 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 7 key" -msgstr "Touche de l'emplacement 7 de la barre d'action" +msgstr "Touche emplacement 7 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 8 key" -msgstr "Touche de l'emplacement 8 de la barre d'action" +msgstr "Touche emplacement 8 de la barre d'action" #: src/settings_translation_file.cpp msgid "Hotbar slot 9 key" -msgstr "Touche de l'emplacement 9 de la barre d'action" +msgstr "Touche emplacement 9 de la barre d'action" #: src/settings_translation_file.cpp msgid "How deep to make rivers." @@ -3835,19 +4193,28 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" -"La vitesse des vagues augmente avec cette valeur.\n" -"Une valeur négative inverse leur mouvement.\n" -"Nécessite que l'ondulation des liquides soit active." +"Vitesse à laquelle les ondes de liquides se déplacent. Plus élevé = plus " +"rapide.\n" +"Si elle est négative, les ondes de liquides se déplaceront en arrière.\n" +"Nécessite les liquides ondulants pour être activé." #: 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 "" -"Délais maximum jusqu'où le serveur va attendre avant de purger les mapblocks " -"inactifs.\n" -"Une valeur plus grande est plus confortable, mais utilise davantage de " -"mémoire." +"Combien de temps le serveur attendra avant de décharger les blocs de carte " +"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." @@ -3855,15 +4222,15 @@ msgstr "Quelle largeur doivent avoir les rivières." #: src/settings_translation_file.cpp msgid "Humidity blend noise" -msgstr "Bruit de fusion d'humidité" +msgstr "Bruit de mélange de l'humidité" #: src/settings_translation_file.cpp msgid "Humidity noise" -msgstr "Bruit d'humidité" +msgstr "Bruit de l'humidité" #: src/settings_translation_file.cpp msgid "Humidity variation for biomes." -msgstr "Variation d'humidité pour les biomes." +msgstr "Variation de l'humidité pour les biomes." #: src/settings_translation_file.cpp msgid "IPv6" @@ -3878,18 +4245,17 @@ msgid "" "If FPS would go higher than this, limit it by sleeping\n" "to not waste CPU power for no benefit." msgstr "" -"Si le nombre d'images par seconde (FPS) veut aller au-delà de cette valeur, " -"il est limité\n" -"pour ne pas gaspiller inutilement les ressources du processeur." +"Si les FPS (nombre d'images par seconde) sont supérieurs à cette valeur, " +"limitez-les en les mettant en sommeil pour ne pas gaspiller la puissance du " +"CPU sans aucun bénéfice." #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Si désactivé, la touche \"special\" est utilisée si le vole et le mode " -"rapide sont tous les deux activés." +"Si désactivé, la touche « Aux1 » est utilisée pour voler vite si les modes " +"vol et rapide sont activés." #: src/settings_translation_file.cpp msgid "" @@ -3899,11 +4265,11 @@ msgid "" "invisible\n" "so that the utility of noclip mode is reduced." msgstr "" -"Si activé, le serveur n'enverra pas les blocs qui ne sont pas visibles par\n" -"le client en fonction de sa position. Cela peut réduire de 50% à 80%\n" -"le nombre de blocs envoyés. Le client ne pourra plus voir ces blocs à moins\n" -"de se déplacer, ce qui réduit l'efficacité des tricheries du style \"noclip" -"\"." +"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 des blocs invisibles, de sorte que " +"l'utilité du mode sans collision est réduite." #: src/settings_translation_file.cpp msgid "" @@ -3912,16 +4278,27 @@ msgid "" "This requires the \"noclip\" privilege on the server." msgstr "" "Si activé avec le mode vol, le joueur sera capable de traverser les blocs " -"solides en volant." +"solides en volant.\n" +"Nécessite le privilège « noclip » sur le serveur." #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Si activé, la touche \"special\" est utilisée à la place de la touche " -"\"s’accroupir\" pour monter ou descendre." +"Si activé, la touche « Aux1 » est utilisée à la place de la touche « Marcher " +"lentement » pour monter ou descendre." + +#: 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 "" @@ -3942,21 +4319,23 @@ msgid "" msgstr "" "Si activé, les données invalides du monde ne causeront pas l'interruption du " "serveur.\n" -"Activer seulement si vous sachez ce que vous faites." +"Activer cette option seulement si vous savez ce que vous faites." #: src/settings_translation_file.cpp 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 "" @@ -3965,7 +4344,7 @@ msgid "" "This is helpful when working with nodeboxes in small areas." msgstr "" "Si activé, vous pourrez placer des blocs à la position où vous êtes.\n" -"C'est utile quand vous travaillez avec des modèles nodebox dans des zones " +"C'est utile pour travailler avec des modèles « nodebox » dans des zones " "exiguës." #: src/settings_translation_file.cpp @@ -3974,9 +4353,17 @@ msgid "" "limited\n" "to this distance from the player to the node." msgstr "" -"Si les restrictions CSM pour la distance des nodes sont activée, les appels " -"à get_node sont limités\n" -"à la distance entre le joueur et le node." +"Si la restriction « CSM » pour la distance des blocs est activée, les appels " +"« get_node » sont limités à la distance entre le joueur et le bloc." + +#: 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 "" +"Si l'exécution d'une commande de tchat prend plus de temps que cette durée " +"spécifiée en secondes, ajoute les informations de temps au message de la " +"commande de tchat." #: src/settings_translation_file.cpp msgid "" @@ -3985,11 +4372,10 @@ msgid "" "deleting an older debug.txt.1 if it exists.\n" "debug.txt is only moved if this setting is positive." msgstr "" -"Si la taille du fichier debug.txt dépasse le nombre de mégaoctets spécifié " -"dans\n" -"ce paramètre une fois ouvert, le fisher est déplacé vers debug.txt.1 et\n" -"supprimera un ancien debug.txt.1 s'il existe.\n" -"debug.txt n'est déplacé que si ce paramètre est positif." +"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.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." @@ -3999,29 +4385,28 @@ msgstr "Détermine les coordonnées où les joueurs vont toujours réapparaître 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 fond de la console du jeu (entre 0 et 255)." +msgstr "" +"Opacité de l'arrière-plan de la console de tchat dans le jeu (entre 0 et " +"255)." #: src/settings_translation_file.cpp msgid "In-game chat console background color (R,G,B)." -msgstr "Couleur de fond de la console du jeu (R,G,B)." +msgstr "Couleur de l'arrière-plan de la console de tchat dans le jeu (R,V,B)." #: src/settings_translation_file.cpp msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." -msgstr "Hauteur de la console de tchat du jeu, entre 0.1 (10%) et 1.0 (100%)." +msgstr "" +"Hauteur de la console de tchat dans le jeu, entre 0,1 (10 %) et 1,0 (100 %)." #: src/settings_translation_file.cpp msgid "Inc. volume key" -msgstr "Touche d'augmentation de volume" +msgstr "Touche augmenter le volume" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "Vitesse verticale initiale lors du saut, en blocs par seconde." +msgstr "Vitesse verticale initiale lors du saut, en nœuds par seconde." #: src/settings_translation_file.cpp msgid "" @@ -4030,11 +4415,11 @@ 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 chatcommands on registration." -msgstr "Instrument d'enregistrement des commandes de chat." +msgid "Instrument chat commands on registration." +msgstr "Instrument d'enregistrement des commandes de tchat." #: src/settings_translation_file.cpp msgid "" @@ -4062,19 +4447,15 @@ msgstr "" 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, établie " -"en secondes." +"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" @@ -4082,7 +4463,7 @@ msgstr "Animation des items d'inventaire" #: src/settings_translation_file.cpp msgid "Inventory key" -msgstr "Touche d'inventaire" +msgstr "Touche inventaire" #: src/settings_translation_file.cpp msgid "Invert mouse" @@ -4094,15 +4475,15 @@ msgstr "Inverser les mouvements verticaux de la souris." #: src/settings_translation_file.cpp msgid "Italic font path" -msgstr "Chemin de la police Italique" +msgstr "Chemin de la police italique" #: src/settings_translation_file.cpp msgid "Italic monospace font path" -msgstr "Chemin de la police Italique Monospace" +msgstr "Chemin de la police monospace en italique" #: src/settings_translation_file.cpp msgid "Item entity TTL" -msgstr "Durée de vie des items abandonnés" +msgstr "Temps de vie des entités objets" #: src/settings_translation_file.cpp msgid "Iterations" @@ -4116,8 +4497,8 @@ msgid "" "At iterations = 20 this mapgen has a similar load to mapgen V7." msgstr "" "Itérations de la fonction récursive.\n" -"L'augmenter augmente la quantité de détails, mais également\n" -"la charge du processeur.\n" +"L'augmenter, augmente la quantité de détails, mais également la charge du " +"processeur.\n" "Quand itérations = 20 cette méthode de génération est aussi gourmande en " "ressources que la méthode v7." @@ -4127,15 +4508,19 @@ msgstr "ID de manette" #: src/settings_translation_file.cpp msgid "Joystick button repetition interval" -msgstr "Intervalle de répétition du bouton du Joystick" +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." #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" -msgstr "Sensibilité tronconique du joystick" +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 "" @@ -4147,9 +4532,9 @@ msgid "" msgstr "" "Réglage Julia uniquement.\n" "La composante W de la constante hypercomplexe.\n" -"Transforme la forme de la fractale.\n" +"Modifie la forme de la fractale.\n" "N'a aucun effet sur les fractales 3D.\n" -"Portée environ -2 à 2." +"Gamme d'environ -2 à 2." #: src/settings_translation_file.cpp msgid "" @@ -4205,7 +4590,7 @@ msgstr "Julia z" #: src/settings_translation_file.cpp msgid "Jump key" -msgstr "Sauter" +msgstr "Touche sauter" #: src/settings_translation_file.cpp msgid "Jumping speed" @@ -4217,7 +4602,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour diminuer le champ de vision.\n" +"Touche pour réduire la distance d'affichage.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4227,7 +4612,17 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour diminuer le volume.\n" +"Touche pour réduire le volume.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour creuser.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4237,7 +4632,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour jeter l'objet sélectionné.\n" +"Touche pour lâcher l'objet sélectionné.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4247,7 +4642,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour accroitre le champ de vision.\n" +"Touche pour augmenter la distance d'affichage.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4288,8 +4683,8 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour faire reculer le joueur.\n" -"Désactive également l’avance auto., lorsqu’elle est active.\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" @@ -4299,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" @@ -4309,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" @@ -4319,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" @@ -4339,7 +4734,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour ouvrir la fenêtre du chat pour entrer des commandes.\n" +"Touche pour ouvrir la fenêtre de tchat pour entrer des commandes.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4349,7 +4744,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour ouvrir la fenêtre du tchat pour entrer des commandes locales.\n" +"Touche pour ouvrir la fenêtre de tchat pour entrer des commandes locales.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4359,7 +4754,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour ouvrir la fenêtre de chat.\n" +"Touche pour ouvrir la fenêtre de tchat.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4373,13 +4768,23 @@ msgstr "" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Touche pour placer.\n" +"Voir http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour sélectionner le prochain item dans la barre d'action.\n" +"Touche pour sélectionner la 11ᵉ case de la barre d'action.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4519,7 +4924,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour sélectionner la 30ᵉ case de la barre d'action.\n" +"Touche pour sélectionner la 25ᵉ case de la barre d'action.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4639,7 +5044,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour sélectionner le prochain item dans la barre d'action.\n" +"Touche pour sélectionner l'objet suivant dans la barre d'action.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4659,7 +5064,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour sélectionner l'item précédent dans la barre d'action.\n" +"Touche pour sélectionner l'objet précédent dans la barre d'action.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4709,7 +5114,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour sélectionner le prochain item dans la barre d'action.\n" +"Touche pour sélectionner la troisième case de la barre d'action.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4721,9 +5126,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour se faufiler.\n" -"Egalement utilisée pour descendre et plonger dans l'eau si aux1_descends est " -"désactivé.\n" +"Touche pour se déplacer lentement.\n" +"Également utilisée pour descendre et plonger dans l'eau si « aux1_descends » " +"est désactivé.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4733,7 +5138,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour changer de vue entre la 1ère et 3ème personne.\n" +"Touche pour changer de vue entre la première et troisième personne.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4753,7 +5158,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche d’exécution automatique.\n" +"Touche d'avance automatique.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4803,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" @@ -4813,7 +5218,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toucher 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" @@ -4834,7 +5239,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour afficher/cacher la zone de chat.\n" +"Touche pour afficher/cacher la zone de tchat.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4854,7 +5259,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour afficher/cacher la brume.\n" +"Touche pour afficher/cacher le brouillard.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4864,7 +5269,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour afficher/masquer le HUD ( Affichage tête haute).\n" +"Touche pour afficher/masquer le HUD (affichage tête haute).\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4884,8 +5289,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour afficher/cacher la zone de profilage. Utilisé pour le " -"développement.\n" +"Touche pour afficher/cacher le profileur. Utilisé pour le développement.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4905,10 +5309,14 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Touche pour zoomer (lorsque c'est possible).\n" +"Touche pour zoomer si possible.\n" "Voir http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4928,15 +5336,15 @@ msgstr "Langue" #: src/settings_translation_file.cpp msgid "Large cave depth" -msgstr "Profondeur des grandes caves" +msgstr "Profondeur de grandes grottes" #: src/settings_translation_file.cpp msgid "Large cave maximum number" -msgstr "Grand nombre de grottes maximum" +msgstr "Nombre maximal de grandes grottes" #: src/settings_translation_file.cpp msgid "Large cave minimum number" -msgstr "Nombre minimum de grandes grottes" +msgstr "Nombre minimal de grandes grottes" #: src/settings_translation_file.cpp msgid "Large cave proportion flooded" @@ -4944,11 +5352,11 @@ msgstr "Proportion de grandes grottes inondées" #: src/settings_translation_file.cpp msgid "Large chat console key" -msgstr "Touche de grande console de tchat" +msgstr "Touche grande console de tchat" #: src/settings_translation_file.cpp msgid "Leaves style" -msgstr "Apparence des feuilles d'arbres" +msgstr "Apparence des feuilles" #: src/settings_translation_file.cpp msgid "" @@ -4957,11 +5365,11 @@ msgid "" "- Simple: only outer faces, if defined special_tiles are used\n" "- Opaque: disable transparency" msgstr "" -"Apparence des feuilles d’arbres :\n" -"— Détaillée : toutes les faces sont visibles\n" -"— Simple : seulement les faces externes, si des « special_tiles » sont " +"Apparence des feuilles d’arbres :\n" +"– Détaillée : toutes les faces sont visibles\n" +"– Simple : seulement les faces externes, si des « special_tiles » sont " "définies\n" -"— Opaque : désactive la transparence" +"– Opaque : désactive la transparence" #: src/settings_translation_file.cpp msgid "Left key" @@ -4971,30 +5379,36 @@ msgstr "Touche gauche" msgid "" "Length of a server tick and the interval at which objects are generally " "updated over\n" -"network." +"network, stated in seconds." msgstr "" -"Temps d'intervalle entre la mise à jour des objets sur le\n" -"réseau." +"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 "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." msgstr "" -"Longueur des vagues.\n" -"Nécessite que l'ondulation des liquides soit active." +"Longueur des ondes de liquides.\n" +"Nécessite les liquides ondulants pour être activé." #: src/settings_translation_file.cpp -msgid "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "Durée entre les cycles d’exécution du Modificateur de bloc actif (ABM)" +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 »), " +"é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 "Temps 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 "" @@ -5005,32 +5419,34 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" -"Niveau de détails des infos de débogage écrits dans debug.txt :\n" -"- <rien> (pas d'infos)\n" -"- aucun (messages sans niveau)\n" -"- erreur\n" -"- avertissement\n" -"- action\n" -"- info\n" -"- prolixe" +"Niveau de journalisation à écrire dans « debug.txt » :\n" +"– < rien > (pas de journalisation)\n" +"– aucun (messages sans niveau)\n" +"– erreur\n" +"– avertissement\n" +"– action\n" +"– info\n" +"– prolixe\n" +"– traçage" #: src/settings_translation_file.cpp msgid "Light curve boost" -msgstr "Boost de courbe de lumière" +msgstr "Amplification de la courbe de lumière" #: src/settings_translation_file.cpp msgid "Light curve boost center" -msgstr "Centre de boost de courbe de lumière" +msgstr "Centre d'amplification de la courbe de lumière" #: src/settings_translation_file.cpp msgid "Light curve boost spread" -msgstr "Étalement du boost de la courbe de lumière" +msgstr "Étalement de l'amplification de la courbe de lumière" #: src/settings_translation_file.cpp msgid "Light curve gamma" -msgstr "Courbe de lumière gamma" +msgstr "Gamma de la courbe de lumière" #: src/settings_translation_file.cpp msgid "Light curve high gradient" @@ -5040,15 +5456,20 @@ msgstr "Fort gradient de la courbe de lumière" 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" "Value is stored per-world." msgstr "" -"Limite du génération de carte, en nœuds, dans les 6 directions à partir de " +"Limite du générateur de terrain, en nœuds, dans les 6 directions à partir de " "(0,0,0).\n" -"Seules les tranches totalement comprises dans cette limite sont générées.\n" +"Seules les tranches de la carte totalement comprises dans cette limite sont " +"générées.\n" "Valeur différente pour chaque monde." #: src/settings_translation_file.cpp @@ -5059,10 +5480,10 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" -"Nombre limite de requête HTTP en parallèle. Affecte :\n" -"- L'obtention de média si le serveur utilise l'option remote_media.\n" -"- Le téléchargement de la liste des serveurs et l'annonce du serveur.\n" -"- Les téléchargements effectués par le menu (ex.: gestionnaire de mods).\n" +"Nombre limite de requête HTTP en parallèle. Affecte :\n" +"– L'obtention de média si le serveur utilise le paramètre « remote_media ».\n" +"– Le téléchargement de la liste des serveurs et l'annonce du serveur.\n" +"– Les téléchargements effectués par le menu (ex. : gestionnaire de mods).\n" "Prend seulement effet si Minetest est compilé avec cURL." #: src/settings_translation_file.cpp @@ -5087,15 +5508,15 @@ msgstr "Écoulement du liquide" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." -msgstr "Intervalle de mise-à-jour des liquides en secondes." +msgstr "Intervalle de mise à jour des liquides en secondes." #: src/settings_translation_file.cpp msgid "Liquid update tick" -msgstr "Intervalle de mise-à-jour des liquides" +msgstr "Intervalle de mise à jour des liquides" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "Charger le profil de jeu" +msgstr "Charger le profileur du jeu" #: src/settings_translation_file.cpp msgid "" @@ -5103,8 +5524,8 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" -"Charge le profil du jeu pour collecter des données de profil du jeu.\n" -"Fournit une commande /profiler pour accéder au profil compilé.\n" +"Charge le profileur du jeu pour collecter des données de profilage du jeu.\n" +"Fournit une commande « /profiler » pour accéder au profil compilé.\n" "Utile pour les développeurs de mod et les opérateurs de serveurs." #: src/settings_translation_file.cpp @@ -5117,32 +5538,30 @@ msgstr "Limite basse Y des donjons." #: src/settings_translation_file.cpp msgid "Lower Y limit of floatlands." -msgstr "Borne inférieure Y des massifs volants." +msgstr "Limite basse Y des terrains flottants." #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "Script du menu principal" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Style du menu principal" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" -"Rendre la couleur de la brume et du ciel différents selon l'heure du jour " +"Rendre la couleur du brouillard et du ciel différents selon l'heure du jour " "(aube/crépuscule) et la direction du regard." #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"Rendre DirectX compatible avec LuaJIT. Désactiver si cela cause des " -"problèmes." +msgid "Makes all liquids opaque" +msgstr "Rend toutes les liquides opaques." #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" -msgstr "Rendre toutes les liquides opaques" +msgid "Map Compression Level for Disk Storage" +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 de la carte pour le transfert réseau" #: src/settings_translation_file.cpp msgid "Map directory" @@ -5150,15 +5569,16 @@ msgstr "Répertoire de la carte du monde" #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "Attributs spécifiques au Mapgen Carpathian." +msgstr "Attributs spécifiques au générateur de terrain carpatien." #: 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 "" -"Attributs de terrain spécifiques au générateur de monde plat.\n" -"Des lacs et des collines occasionnels peuvent être ajoutés au monde plat." +"Attributs spécifiques au générateur de terrain plat.\n" +"Des lacs et des collines peuvent être occasionnellement ajoutés au monde " +"plat." #: src/settings_translation_file.cpp msgid "" @@ -5166,9 +5586,9 @@ msgid "" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" -"Attributs de terrain spécifiques au générateur de monde fractal.\n" -"'terrain' active la création de terrain non fractal,\n" -"c-à-d un océan, des îles et du souterrain." +"Attributs spécifiques au générateur de terrain fractal.\n" +"« terrain » active la création de terrains non fractals : océans, îles et " +"souterrains." #: src/settings_translation_file.cpp msgid "" @@ -5179,17 +5599,16 @@ msgid "" "to become shallower and occasionally dry.\n" "'altitude_dry': Reduces humidity with altitude." msgstr "" -"Attributs de génération du monde spécifiques au générateur Valleys.\n" -"‹altitude_chill› : Réduit la chaleur avec l’altitude.\n" -"‹humid_rivers› : Augmente l’humidité autour des rivières.\n" -"‹vary_river_depth› : Si activé, une humidité basse et une forte chaleur " -"rendent\n" -"les rivières moins profondes et parfois asséchées.\n" -"‹altitude_dry› : Réduit l’humidité avec l’altitude." +"Attributs spécifiques au générateur de terrain vallées.\n" +"« altitude_chill » : réduit la chaleur avec l’altitude.\n" +"« humid_rivers » : augmente l’humidité autour des rivières.\n" +"« vary_river_dept » : si activé, une humidité basse et une chaleur élevée " +"rendent les rivières moins profondes et parfois sèches.\n" +"« altitude_dry » : réduit l’humidité avec l’altitude." #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen v5." -msgstr "Attributs spécifiques au Mapgen v5." +msgstr "Attributs spécifiques au générateur de terrain v5." #: src/settings_translation_file.cpp msgid "" @@ -5198,10 +5617,10 @@ msgid "" "When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" "the 'jungles' flag is ignored." msgstr "" -"Attributs de génération du monde spécifiques au générateur v6.\n" -"Le paramètre ‹snowbiomes› active le nouveau système à 5 biomes.\n" -"Sous ce nouveau système, la création de jungles est automatique\n" -"et le paramètre ‹jungles› est ignoré." +"Attributs spécifiques au générateur de terrain v6.\n" +"Le drapeau « snowbiomes » active le nouveau système à 5 biomes.\n" +"Lorsque le drapeau « snowbiomes » est activé, les jungles sont " +"automatiquement activées et le drapeau « jungles » est ignoré." #: src/settings_translation_file.cpp msgid "" @@ -5210,42 +5629,47 @@ msgid "" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Attributs spécifiques au Mapgen v7.\n" -"- 'ridges', « crêtes » pour des rivières.\n" -"- 'floatlands', « massifs volant » massifs de terres atmosphèrique.\n" -"- 'caverns', « cavernes » pour des grottes immenses et profondes." +"Attributs spécifiques au générateur de terrain v7.\n" +"« montagnes » : montagnes.\n" +"« crêtes » : rivières.\n" +"« terrains flottants » : vaste terrain flottant dans l'atmosphère.\n" +"« cavernes » : cavernes immenses souterraines profondes." #: src/settings_translation_file.cpp msgid "Map generation limit" -msgstr "Limites de génération du terrain" +msgstr "Limite de génération du terrain" #: src/settings_translation_file.cpp msgid "Map save interval" msgstr "Intervalle de sauvegarde de la carte" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Images de mise à jour des ombres de la carte" + #: src/settings_translation_file.cpp msgid "Mapblock limit" -msgstr "Limite des mapblocks" +msgstr "Limite des blocs de carte" #: src/settings_translation_file.cpp msgid "Mapblock mesh generation delay" -msgstr "Délai de génération des maillages de MapBlocks" +msgstr "Délai de génération des maillages de blocs de carte" #: src/settings_translation_file.cpp msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "Taille du cache du générateur de maillage pour les MapBloc en Mio" +msgstr "Taille du cache de blocs de carte en Mo du générateur de maillage" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" -msgstr "Délais d'interruption du déchargement des mapblocks" +msgstr "Délai d'interruption du déchargement de blocs de carte" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian" -msgstr "Générateur de terrain Carpatien" +msgstr "Générateur de terrain carpatien" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian specific flags" -msgstr "Signaux spécifiques au générateur de terrain Carpatien" +msgstr "Drapeaux spécifiques au générateur de terrain carpatien" #: src/settings_translation_file.cpp msgid "Mapgen Flat" @@ -5253,31 +5677,31 @@ msgstr "Générateur de terrain plat" #: src/settings_translation_file.cpp msgid "Mapgen Flat specific flags" -msgstr "Signaux spécifiques au générateur de terrain plat" +msgstr "Drapeaux spécifiques au générateur de terrain plat" #: src/settings_translation_file.cpp msgid "Mapgen Fractal" -msgstr "Générateur de terrain Fractal" +msgstr "Générateur de terrain fractal" #: src/settings_translation_file.cpp msgid "Mapgen Fractal specific flags" -msgstr "Drapeaux spécifiques au générateur Fractal" +msgstr "Drapeaux spécifiques au générateur de terrain fractal" #: src/settings_translation_file.cpp msgid "Mapgen V5" -msgstr "Générateur de terrain V5" +msgstr "Générateur de terrain v5" #: src/settings_translation_file.cpp msgid "Mapgen V5 specific flags" -msgstr "Drapeaux spécifiques au générateur v5" +msgstr "Drapeaux spécifiques au générateur de terrain v5" #: src/settings_translation_file.cpp msgid "Mapgen V6" -msgstr "Générateur de terrain V6" +msgstr "Générateur de terrain v6" #: src/settings_translation_file.cpp msgid "Mapgen V6 specific flags" -msgstr "Drapeaux spécifiques au générateur V6" +msgstr "Drapeaux spécifiques au générateur de terrain v6" #: src/settings_translation_file.cpp msgid "Mapgen V7" @@ -5285,31 +5709,31 @@ msgstr "Générateur de terrain v7" #: src/settings_translation_file.cpp msgid "Mapgen V7 specific flags" -msgstr "Drapeaux spécifiques au générateur V7" +msgstr "Drapeaux spécifiques au générateur de terrain v7" #: src/settings_translation_file.cpp msgid "Mapgen Valleys" -msgstr "Générateur de terrain Vallées" +msgstr "Générateur de terrain vallées" #: src/settings_translation_file.cpp msgid "Mapgen Valleys specific flags" -msgstr "Signaux spécifiques au générateur de terrain Valleys" +msgstr "Drapeaux spécifiques au générateur de terrain vallées" #: src/settings_translation_file.cpp msgid "Mapgen debug" -msgstr "Débogage de la génération du terrain" +msgstr "Débogage de la génération de terrain" #: src/settings_translation_file.cpp msgid "Mapgen name" -msgstr "Nom du générateur de carte" +msgstr "Nom du générateur de terrain" #: src/settings_translation_file.cpp msgid "Max block generate distance" -msgstr "Distance maximale de génération des mapblocks" +msgstr "Distance maximale de génération de blocs" #: src/settings_translation_file.cpp msgid "Max block send distance" -msgstr "Distance maximale d'envoi des mapblocks" +msgstr "Distance maximale d'envoi de blocs" #: src/settings_translation_file.cpp msgid "Max liquids processed per step." @@ -5317,23 +5741,29 @@ msgstr "Maximum de liquides traités par étape de serveur." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" -msgstr "Maximum d'extra-mapblocks par clearobjects" +msgstr "Blocs supplémentaires maximum de « clearobjects »" #: src/settings_translation_file.cpp msgid "Max. packets per iteration" -msgstr "Paquets maximum par itération" +msgstr "Paquets maximaux par itération" #: src/settings_translation_file.cpp msgid "Maximum FPS" msgstr "FPS maximum" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "FPS maximum quand le jeu est en pause." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"FPS maximum lorsque la fenêtre n'est pas sélectionnée, ou lorsque le jeu est " +"en pause." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Distance maximale pour le rendu des ombres." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" -msgstr "Mapblocks maximum chargés de force" +msgstr "Blocs maximum chargés de force" #: src/settings_translation_file.cpp msgid "Maximum hotbar width" @@ -5342,11 +5772,12 @@ msgstr "Largeur maximale de la barre d'inventaire" #: src/settings_translation_file.cpp msgid "Maximum limit of random number of large caves per mapchunk." msgstr "" -"Limite maximale pour le nombre aléatoire de grandes grottes par mapchunk." +"Limite maximale du nombre aléatoire de grandes grottes par tranche de carte." #: src/settings_translation_file.cpp msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "Limite maximale du nombre aléatoire de petites grottes par mapchunk." +msgstr "" +"Limite maximale du nombre aléatoire de petites grottes par tranche de carte." #: src/settings_translation_file.cpp msgid "" @@ -5354,8 +5785,7 @@ msgid "" "high speed." msgstr "" "Résistance maximale aux liquides. Contrôle la décélération lorsqu'un joueur " -"entre dans un liquide à\n" -"haute vitesse." +"entre dans un liquide à haute vitesse." #: src/settings_translation_file.cpp msgid "" @@ -5363,41 +5793,54 @@ 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 compte total maximum est calculé dynamiquement :\n" -"max_total = ceil((nbre clients + max_users) * per_client / 4)" +"Le nombre maximal de blocs envoyés simultanément par client.\n" +"Le compte total maximal est calculé dynamiquement :\n" +"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." -msgstr "Nombre maximum de mapblocks qui peuvent être listés pour chargement." +msgstr "" +"Nombre maximal de blocs qui peuvent être mis en file d'attente pour " +"chargement." #: 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 "" -"Nombre maximum de mapblocks à lister qui doivent être générés.\n" -"Laisser ce champ vide pour un montant approprié défini automatiquement." +"Nombre maximal de blocs à mettre en file d'attente qui doivent être " +"générés.\n" +"Cette limite est appliquée par joueur." #: 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 "" -"Nombre maximum de mapblocks à lister qui doivent être générés depuis un " -"fichier.\n" -"Laisser ce champ vide pour un montant approprié défini automatiquement." +"Nombre maximal de blocs à mettre en file d'attente qui doivent être chargés " +"depuis un fichier.\n" +"Cette limite est appliquée par joueur." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Nombre maximal de téléchargements simultanés. Les téléchargements dépassant " +"cette limite seront mis en file d'attente.\n" +"Ce nombre doit être inférieur à la limite de « curl_parallel_limit »." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." -msgstr "Nombre maximum de mapblocks chargés de force." +msgstr "Nombre maximal de blocs de carte chargés de force." #: 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 "" -"Nombre maximum de mapblocks gardés dans la mémoire du client.\n" +"Nombre maximal de blocs de carte pour le client à garder en mémoire.\n" "Définir à -1 pour un montant illimité." #: src/settings_translation_file.cpp @@ -5406,11 +5849,9 @@ msgid "" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" -"Nombre maximum de paquets envoyés par étape d'envoi. Si vous avez une " -"connexion lente,\n" -"essayez de réduire cette valeur, mais réduisez pas cette valeur en-dessous " -"du double du nombre\n" -"de clients maximum sur le serveur." +"Nombre maximal de paquets envoyés par étape d'envoi. Si vous avez une " +"connexion lente, essayer de réduire cette valeur, mais ne pas réduire cette " +"valeur en-dessous du double du nombre de clients maximum sur le serveur." #: src/settings_translation_file.cpp msgid "Maximum number of players that can be connected simultaneously." @@ -5418,11 +5859,12 @@ 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 maximum 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." -msgstr "Nombre maximum d'objets sauvegardés dans un mapblock (16^3 blocs)." +msgstr "" +"Nombre maximal d'objets sauvegardés dans un bloc de carte (16^3 blocs)." #: src/settings_translation_file.cpp msgid "Maximum objects per block" @@ -5442,33 +5884,40 @@ msgstr "Nombre maximal de blocs simultanés envoyés par client" #: src/settings_translation_file.cpp msgid "Maximum size of the out chat queue" -msgstr "Taille maximum de la file de sortie de message du chat" +msgstr "Taille maximale de la file de sortie de message du tchat" #: 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 "" -"Taille maximale de la file d’attente sortante de la discussion.\n" -"0 pour désactiver la file d’attente et -1 pour rendre la taille infinie." +"Taille maximale de la file de sortie de message du tchat.\n" +"0 pour désactiver la file de sortie et -1 pour rendre la taille de la file " +"de sortie illimitée." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Délais maximaux de téléchargement d'un fichier (ex.: un mod), établi en " -"millisecondes." +"Durée maximale qu'un téléchargement de fichier (ex. : un téléchargement de " +"mod) peut prendre, établie en millisecondes." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Durée maximale qu'une requête interactive (ex. : récupération de la liste de " +"serveurs) peut prendre, établie en millisecondes." #: src/settings_translation_file.cpp msgid "Maximum users" -msgstr "Joueurs maximum" - -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Menus" +msgstr "Joueurs maximums" #: src/settings_translation_file.cpp msgid "Mesh cache" -msgstr "Mise en cache des meshes" +msgstr "Mise en cache des maillages" #: src/settings_translation_file.cpp msgid "Message of the day" @@ -5484,7 +5933,7 @@ msgstr "Méthodes utilisées pour l'éclairage des objets." #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "Verbosité minimale du log dans le chat." +msgstr "Niveau minimal de journalisation à écrire dans le tchat." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5492,43 +5941,61 @@ msgstr "Mini-carte" #: src/settings_translation_file.cpp msgid "Minimap key" -msgstr "Mini-carte" +msgstr "Touche mini-carte" #: src/settings_translation_file.cpp msgid "Minimap scan height" -msgstr "Hauteur de scannage de la mini-carte" +msgstr "Hauteur de balayage de la mini-carte" #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "Minimum pour le nombre de grandes grottes par mapchunk tiré au hasard." +msgstr "" +"Limite minimale du nombre aléatoire de grandes grottes par tranche de carte." #: src/settings_translation_file.cpp msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "Minimum pour le nombre de petites grottes par mapchunk tiré au hasard." +msgstr "" +"Limite minimale du nombre aléatoire de petites grottes par tranche de carte." #: src/settings_translation_file.cpp msgid "Minimum texture size" -msgstr "Taille minimum des textures" +msgstr "Taille minimale des textures" #: src/settings_translation_file.cpp 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" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "Modifie la taille des éléments de la barre d'action principale." +msgid "Modifies the size of the HUD elements." +msgstr "Modifie la taille des éléments de l'interface." #: src/settings_translation_file.cpp msgid "Monospace font path" -msgstr "Chemin de la police Monospace" +msgstr "Chemin de la police monospace" #: src/settings_translation_file.cpp msgid "Monospace font size" -msgstr "Taille de la police Monospace" +msgstr "Taille de la police monospace" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Taille de la police monospace divisible par" #: src/settings_translation_file.cpp msgid "Mountain height noise" @@ -5536,7 +6003,7 @@ msgstr "Bruit de hauteur des montagnes" #: src/settings_translation_file.cpp msgid "Mountain noise" -msgstr "Bruit pour les montagnes" +msgstr "Bruit des montagnes" #: src/settings_translation_file.cpp msgid "Mountain variation noise" @@ -5556,19 +6023,20 @@ msgstr "Facteur de sensibilité de la souris." #: src/settings_translation_file.cpp msgid "Mud noise" -msgstr "Bruit pour la boue" +msgstr "Bruit de boue" #: 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 "" -"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" -msgstr "Touche pour rendre le jeu muet" +msgstr "Touche muet" #: src/settings_translation_file.cpp msgid "Mute sound" @@ -5583,9 +6051,9 @@ msgid "" msgstr "" "Nom du générateur de terrain qui sera utilisé à la création d’un nouveau " "monde.\n" -"Cela sera perdu à la création d'un monde depuis le menu principal.\n" -"Les générateurs actuellement très instables sont :\n" -"- Les massifs volants du générateur v7 (option inactive par défaut)." +"La création d'un monde depuis le menu principal le remplacera.\n" +"Les générateurs de terrain actuellement très instables sont :\n" +"– Les terrains flottants optionnels du générateur v7 (désactivé par défaut)." #: src/settings_translation_file.cpp msgid "" @@ -5594,24 +6062,21 @@ msgid "" "When starting from the main menu, this is overridden." msgstr "" "Nom du joueur.\n" -"Lors qu'un serveur est lancé, les clients se connectant avec ce nom sont " -"administrateurs." +"Lorsqu'un serveur est lancé, les clients se connectant avec ce nom sont " +"administrateurs.\n" +"Lors du démarrage à partir du menu principal, celui-ci est remplacé." #: src/settings_translation_file.cpp msgid "" "Name of the server, to be displayed when players join and in the serverlist." msgstr "" -"Nom du serveur, affiché sur liste des serveurs publics et lorsque les " -"joueurs se connectent." +"Nom du serveur affiché lorsque les joueurs se connectent et sur la liste des " +"serveurs." #: src/settings_translation_file.cpp 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" @@ -5620,6 +6085,10 @@ msgstr "" "Port du réseau à écouter (UDP).\n" "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." @@ -5630,7 +6099,11 @@ msgstr "Sans collision" #: src/settings_translation_file.cpp msgid "Noclip key" -msgstr "Mode sans collision" +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" @@ -5638,20 +6111,12 @@ msgstr "Surbrillance des blocs" #: src/settings_translation_file.cpp msgid "NodeTimer interval" -msgstr "Intervalle de temps d'un nœud" +msgstr "Intervalle « NodeTimer »" #: src/settings_translation_file.cpp msgid "Noises" msgstr "Bruits" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Échantillonnage de normalmaps" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Force des normalmaps" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Nombre de tâches en cours" @@ -5669,37 +6134,31 @@ 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 "" -"Nombre de threads « emerge » à utiliser.\n" -"Valeur nulle :\n" -"— Sélection automatique. Le nombre de threads sera le\n" -"« nombre de processeurs moins 2 », avec un minimum de 1.\n" +"Nombre de processus « emerge » à utiliser.\n" +"Valeur 0 :\n" +"– Sélection automatique. Le nombre de processus sera le\n" +"– « nombre de processeurs - 2 », avec un minimum de 1.\n" "Toute autre valeur :\n" -"— Spécifie le nombre de threads, avec un minimum de 1.\n" -"ATTENTION : augmenter le nombre de threads accélère bien la création\n" -"de terrain, mais cela peut nuire à la performance du jeu en interférant\n" -"avec d’autres processus, en particulier en mode solo ou lors de \n" -"l’exécution du code Lua en mode « on_generated ».\n" -"Pour beaucoup, le réglage optimal peut être « 1 »." +"– Spécifie le nombre de processus, avec un minimum de 1.\n" +"ATTENTION : augmenter le nombre de processus « emerge » accélère bien la\n" +"création de terrain, mais cela peut nuire à la performance du jeu en " +"interférant\n" +"avec d’autres processus, en particulier en mode solo et/ou lors de " +"l’exécution de\n" +"code Lua en mode « on_generated ». Pour beaucoup, le réglage optimal peut " +"être « 1 »." #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" -"Nombre d'extra-mapblocks qui peuvent être chargés par /clearobjects dans " -"l'immédiat.\n" -"C'est un compromis entre un transfert SQLite plafonné et la consommation " -"mémoire\n" -"(4096 = 100 Mo, comme règle fondamentale)." - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Nombre d'itérations sur l'occlusion parallaxe." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Dépôt de contenu en ligne" +"Nombre de blocs supplémentaires qui peuvent être chargés par « /" +"clearobjects » à la fois.\n" +"C'est un compromis entre la surcharge de transaction SQLite et la " +"consommation mémoire\n" +"(4096 = 100 Mo, comme règle générale)." #: src/settings_translation_file.cpp msgid "Opaque liquids" @@ -5711,70 +6170,35 @@ msgid "" msgstr "" "Opacité (alpha) de l'ombre derrière la police par défaut, entre 0 et 255." -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" -"Opacité (alpha) de l'ombre derrière la police secondaire, entre 0 et 255." - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " "formspec is\n" "open." msgstr "" -"Ouvrir le mesure pause lorsque le focus sur la fenêtre est perdu. Ne met pas " -"en pause si un formspec est ouvert." +"Ouvre le menu pause lorsque la sélection de la fenêtre est perdue. Ne met " +"pas en pause si un formspec est ouvert." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Bias général de l'occlusion parallaxe, habituellement échelle/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Echelle générale de l'effet de l'occlusion parallaxe." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Occlusion parallaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Bias de l'occlusion parallaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Nombre d'itérations sur l'occlusion parallaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Mode occlusion parallaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Echelle de l'occlusion parallaxe" +msgid "Optional override for chat weblink color." +msgstr "Remplacement optionnel pour la couleur du lien web du tchat." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" -"Chemin de la police de repli.\n" -"Si le paramètre \"freetype\" est activé : doit être une police TrueType.\n" -"Si le paramètre \"freetype\" est désactivé : doit être une police de " -"vecteurs bitmap ou XML.\n" +"Chemin de la police alternative. Doit être une police TrueType.\n" "Cette police sera utilisée pour certaines langues ou si la police par défaut " -"n’est pas disponible." +"est indisponible." #: 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 "" -"Chemin d'accès pour les captures d'écran (absolu ou relatif).\n" +"Chemin pour enregistrer les captures d'écran (absolu ou relatif).\n" "La création du dossier sera faite si besoin." #: src/settings_translation_file.cpp @@ -5793,34 +6217,24 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" -"Chemin vers la police par défaut.\n" -"Si le paramètre \"freetype\" est activé : doit être une police TrueType.\n" -"Si le paramètre \"freetype\" est désactivé : doit être une police de " -"vecteurs bitmap ou XML.\n" -"La police de rentrée sera utilisée si la police ne peut pas être chargée." +"Chemin de la police par défaut. Doit être une police TrueType.\n" +"La police alternative sera utilisée si la police ne peut pas être chargée." #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" -"Chemin vers la police monospace.\n" -"Si \"freetype\" est activé : doit être une police TrueType.\n" -"Si \"freetype\" est désactivé : doit être une police de vecteurs bitmap ou " -"XML.\n" +"Chemin de la police monospace. Doit être une police TrueType.\n" "Cette police est utilisée par exemple pour la console et l’écran du " "profileur." #: src/settings_translation_file.cpp msgid "Pause on lost window focus" -msgstr "Mettre en pause sur perte du focus de la fenêtre" +msgstr "Mettre en pause sur perte de sélection de la fenêtre" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" @@ -5828,7 +6242,7 @@ msgstr "Limite par joueur de blocs en attente à charger depuis le disque" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks to generate" -msgstr "Limite par joueur des blocs émergents à créer" +msgstr "Limite par joueur de la file de blocs à générer" #: src/settings_translation_file.cpp msgid "Physics" @@ -5836,11 +6250,19 @@ msgstr "Physique" #: src/settings_translation_file.cpp msgid "Pitch move key" -msgstr "Touche de 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" +msgstr "Touche placer" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Intervalle de répétition du placement" #: src/settings_translation_file.cpp msgid "" @@ -5848,11 +6270,7 @@ msgid "" "This requires the \"fly\" privilege on the server." msgstr "" "Le joueur est capable de voler sans être affecté par la gravité.\n" -"Nécessite le privilège \"fly\" sur un serveur." - -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Nom du joueur" +"Nécessite le privilège « fly » sur le serveur." #: src/settings_translation_file.cpp msgid "Player transfer distance" @@ -5862,21 +6280,26 @@ msgstr "Distance de transfert du joueur" msgid "Player versus player" msgstr "Joueur contre joueur" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Filtrage 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 "" "Port où se connecter (UDP).\n" -"Notez que le champ de port dans le menu principal passe outre ce réglage." +"Noter que le champ de port dans le menu principal passe outre ce paramètre." #: 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 "" -"Évitez de répéter lorsque vous maintenez les boutons de la souris.\n" -"Activez cette option lorsque vous creusez ou placez trop souvent par " +"Empêche le minage et le placement de se répéter lors du maintien des boutons " +"de la souris.\n" +"Activer cette option lorsque vous creusez ou placez trop souvent par " "accident." #: src/settings_translation_file.cpp @@ -5897,8 +6320,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" msgstr "" -"Les privilèges que les joueurs ayant le privilège basic_privs peuvent " -"accorder" +"Les privilèges que les joueurs avec le privilège « basic_privs » peuvent " +"accorder." #: src/settings_translation_file.cpp msgid "Profiler" @@ -5906,11 +6329,7 @@ msgstr "Profileur" #: src/settings_translation_file.cpp msgid "Profiler toggle key" -msgstr "Profilage" - -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Profilage" +msgstr "Touche profilage" #: src/settings_translation_file.cpp msgid "Prometheus listener address" @@ -5919,14 +6338,14 @@ msgstr "Adresse d'écoute pour Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" "Adresse d'écoute pour Prometheus.\n" -"Lorsque Minetest est compilé avec l'option ENABLE_PROMETHEUS,\n" -"cette adresse est utilisée pour l'écoute de données pour Prometheus.\n" -"Les données sont sur http://127.0.0.1:30000/metrics" +"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." #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." @@ -5938,9 +6357,9 @@ msgid "" "Values larger than 26 will start to produce sharp cutoffs at cloud area " "corners." msgstr "" -"Rayon de l'aire des nuages où se trouve 64 blocs carrés de nuages.\n" -"Les valeurs plus grandes que 26 entraînent une \"coupure\" nette des nuages " -"aux coins de l'aire." +"Rayon de la zone de nuages établi en nombre de 64 blocs de nuages carrés.\n" +"Les valeurs plus grandes que 26 entraînent une coupure nette des nuages aux " +"coins des zones de nuages." #: src/settings_translation_file.cpp msgid "Raises terrain to make valleys around the rivers." @@ -5952,7 +6371,7 @@ msgstr "Entrée aléatoire" #: src/settings_translation_file.cpp msgid "Range select key" -msgstr "Distance d'affichage illimitée" +msgstr "Touche distance d'affichage illimitée" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" @@ -5960,7 +6379,7 @@ msgstr "Messages de discussion récents" #: src/settings_translation_file.cpp msgid "Regular font path" -msgstr "Chemin d'accès pour la police normale" +msgstr "Chemin de la police par défaut" #: src/settings_translation_file.cpp msgid "Remote media" @@ -5975,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" -"Utilisez cette option pour empêcher les joueurs d’utiliser la couleur dans " -"leurs messages" +"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." #: src/settings_translation_file.cpp msgid "Replaces the default main menu with a custom one." @@ -6000,15 +6419,16 @@ 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" -"Combiner les byteflags si dessous pour restraindre ou mettre 0\n" -"pour laisser sans restriction.\n" -"LOAD_CLIENT_MODS : 1 (désactive le chargement des mods du client)\n" -"CHAT_MESSAGES : 2 (désactivez l'appel send_chat_message côté client)\n" -"READ_ITEMDEFS : 4 (désactivez l'appel get_item_def côté client)\n" -"READ_NODEDEFS : 8 (désactiver l'appel côté client de get_node_def)\n" -"LOOKUP_NODES_LIMIT : 16 (limite les appels get_node côté client à\n" -"csm_restriction_noderange)" +"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" +"READ_PLAYERINFO : 32 (désactive l'appel « get_player_names » côté client)" #: src/settings_translation_file.cpp msgid "Ridge mountain spread noise" @@ -6016,23 +6436,19 @@ msgstr "Bruit pour l'espacement des crêtes de montagnes" #: src/settings_translation_file.cpp msgid "Ridge noise" -msgstr "Bruit pour les crêtes" +msgstr "Bruit des crêtes" #: src/settings_translation_file.cpp msgid "Ridge underwater noise" -msgstr "Bruit pour les crêtes sous l'eau" +msgstr "Bruit des crêtes sous l'eau" #: src/settings_translation_file.cpp msgid "Ridged mountain size noise" -msgstr "Bruit pour la taille des crêtes de montagne" +msgstr "Bruit de la taille des crêtes de montagnes" #: src/settings_translation_file.cpp msgid "Right key" -msgstr "Droite" - -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Intervalle de répétition du clic droit" +msgstr "Touche droite" #: src/settings_translation_file.cpp msgid "River channel depth" @@ -6048,7 +6464,7 @@ msgstr "Profondeur des rivières" #: src/settings_translation_file.cpp msgid "River noise" -msgstr "Bruit pour les rivières" +msgstr "Bruit des rivières" #: src/settings_translation_file.cpp msgid "River size" @@ -6076,25 +6492,25 @@ msgstr "Mini-carte circulaire" #: src/settings_translation_file.cpp msgid "Safe digging and placing" -msgstr "Placement et minage sécurisés" +msgstr "Minage et placement sécurisés" #: src/settings_translation_file.cpp msgid "Sandy beaches occur when np_beach exceeds this value." msgstr "" -"Des plages de sables apparaissent lorsque np_beach dépasse cette valeur." +"Des plages de sables apparaissent lorsque « np_beach » dépasse cette valeur." #: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." -msgstr "Sauvegarde le monde du serveur sur le disque-dur du client." +msgstr "Sauvegarde le monde du serveur sur le disque dur du client." #: src/settings_translation_file.cpp msgid "Save window size automatically when modified." msgstr "" -"Sauvegarder automatiquement la taille de la fenêtre quand elle est modifiée." +"Sauvegarde automatiquement la taille de la fenêtre quand elle est modifiée." #: src/settings_translation_file.cpp msgid "Saving map received from server" -msgstr "Sauvegarder le monde du serveur" +msgstr "Sauvegarde de la carte reçue du serveur" #: src/settings_translation_file.cpp msgid "" @@ -6104,13 +6520,15 @@ msgid "" "pixels when scaling down, at the cost of blurring some\n" "edge pixels when images are scaled by non-integer sizes." msgstr "" -"Met à l'échelle l'interface par une valeur spécifiée par l'utilisateur,\n" -"à l'aide d'un filtre au plus proche avec anticrénelage.\n" +"Met à l'échelle l'interface par une valeur spécifiée par l'utilisateur, à " +"l'aide d'un filtre au plus proche voisin avec anticrénelage.\n" "Cela va lisser certains bords grossiers, et mélanger les pixels en réduisant " -"l'échelle\n" -"au détriment d'un effet de flou sur des pixels en bordure quand les images " -"sont\n" -"mises à l'échelle par des valeurs fractionnelles." +"l'échelle au détriment d'un effet de flou sur des pixels en bordure quand " +"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" @@ -6139,26 +6557,26 @@ msgid "" "Use 0 for default quality." msgstr "" "Qualité de capture d'écran. Utilisé uniquement pour le format JPEG.\n" -"1 signifie mauvaise qualité; 100 signifie la meilleure qualité.\n" -"Utilisez 0 pour la qualité par défaut." +"1 signifie mauvaise qualité ; 100 signifie la meilleure qualité.\n" +"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 pour les fonds marins" +msgstr "Bruit des fonds marins" #: src/settings_translation_file.cpp msgid "Second of 4 2D noises that together define hill/mountain range height." msgstr "" -"Deuxième des 4 bruits 2D qui définissent ensemble la taille des collines et " -"montagnes." +"Deuxième des 4 bruits 2D qui définissent ensemble la hauteur des collines et " +"des montagnes." #: src/settings_translation_file.cpp msgid "Second of two 3D noises that together define tunnels." -msgstr "Deuxième des 2 bruits 3D qui définissent ensemble les tunnels." - -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "Sécurité" +msgstr "Deuxième des deux bruits 3D qui définissent ensemble les tunnels." #: src/settings_translation_file.cpp msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6166,7 +6584,7 @@ msgstr "Voir http://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp msgid "Selection box border color (R,G,B)." -msgstr "Couleur des bords de sélection (R,G,B)." +msgstr "Couleur des bords de sélection (R,V,B)." #: src/settings_translation_file.cpp msgid "Selection box color" @@ -6199,28 +6617,36 @@ msgid "" "18 = 4D \"Mandelbulb\" Julia set." msgstr "" "Choisit parmi 18 types de fractales.\n" -"1 = réglage Mandelbrot \"Roundy\" 4D.\n" -"2 = réglage Julia \"Roundy\" 4D.\n" -"3 = réglage Mandelbrot \"Squarry\" 4D.\n" -"4 = réglage Julia \"Squarry\" 4D.\n" -"5 = réglage Mandelbrot \"Cousin Mandy\" 4D.\n" -"6 = réglage Julia \"Cousin Mandy\" 4D.\n" -"7 = réglage Mandelbrot \"Variation\" 4D.\n" -"8 = réglage Julia \"Variation\" 4D.\n" -"9 = réglage Mandelbrot \"Mandelbrot/Mandelbar\" 3D.\n" -"10 = réglage Julia \"Mandelbrot/Mandelbar\" 3D.\n" -"11 = réglage Mandelbrot \"Christmas Tree\" 3D.\n" -"12 = réglage Julia \"Christmas Tree\" 3D.\n" -"13 = réglage Mandelbrot \"Mandelbulb\" 3D.\n" -"14 = réglage Julia \"Mandelbulb\" 3D.\n" -"15 = réglage Mandelbrot \"Cosine Mandelbulb\" 3D.\n" -"16 = réglage Julia \"Cosine Mandelbulb\" 3D.\n" -"17 = réglage Mandelbrot \"Mandelbulb\" 4D.\n" -"18 = réglage Julia \"Mandelbulb\" 4D." +"1 = réglage Mandelbrot « Roundy » 4D.\n" +"2 = réglage Julia « Roundy » 4D.\n" +"3 = réglage Mandelbrot « Squarry » 4D.\n" +"4 = réglage Julia « Squarry » 4D.\n" +"5 = réglage Mandelbrot « Cousin Mandy » 4D.\n" +"6 = réglage Julia « Cousin Mandy » 4D.\n" +"7 = réglage Mandelbrot « Variation » 4D.\n" +"8 = réglage Julia « Variation » 4D.\n" +"9 = réglage Mandelbrot « Mandelbrot/Mandelbar » 3D.\n" +"10 = réglage Julia « Mandelbrot/Mandelbar » 3D.\n" +"11 = réglage Mandelbrot « Christmas Tree » 3D.\n" +"12 = réglage Julia « Christmas Tree » 3D.\n" +"13 = réglage Mandelbrot « Mandelbulb » 3D.\n" +"14 = réglage Julia « Mandelbulb » 3D.\n" +"15 = réglage Mandelbrot « Cosine Mandelbulb » 3D.\n" +"16 = réglage Julia « Cosine Mandelbulb » 3D.\n" +"17 = réglage Mandelbrot « Mandelbulb » 4D.\n" +"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" @@ -6244,45 +6670,93 @@ msgstr "Port du serveur" #: src/settings_translation_file.cpp msgid "Server side occlusion culling" -msgstr "Tests d'occultation côté serveur" +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 publics" +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 des serveurs publics" +msgstr "Fichier de la liste des serveurs" #: 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 "" -"Détermine la langue. Laisser vide pour utiliser celui de votre système.\n" -"Un redémarrage du jeu est nécessaire pour prendre effet." +"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éfinir 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" +"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." + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"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 : 15,0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Définit l'inclinaison de l'orbite du soleil / lune en degrés.\n" +"La valeur de 0 signifie aucune inclinaison / orbite verticale.\n" +"Valeur minimale : 0,0 ; valeur maximale : 60,0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Mettre sur « Activé » active le « Shadow Mapping ».\n" +"Nécessite les shaders pour être activé." + #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving leaves.\n" "Requires shaders to be enabled." msgstr "" -"Mettre sur « true » active le mouvement des\n" -"feuilles d'arbres mouvantes. Nécessite les\n" -"shaders pour être activé." +"Mettre sur « Activé » active les feuilles ondulantes.\n" +"Nécessite les shaders pour être activé." #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"Mettre sur « true » active les vagues.\n" +"Mettre sur « Activé » active les liquides ondulants (comme l'eau).\n" "Nécessite les shaders pour être activé." #: src/settings_translation_file.cpp @@ -6290,10 +6764,19 @@ msgid "" "Set to true to enable waving plants.\n" "Requires shaders to be enabled." msgstr "" -"Mettre sur « true » active le mouvement\n" -"des végétaux.\n" +"Mettre sur « Activé » active le mouvement des végétaux.\n" "Nécessite les shaders pour être activé." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Définit la qualité de la texture de l'ombre sur 32 bits.\n" +"Si désactivé, une texture de 16 bits sera utilisée.\n" +"Cela peut causer beaucoup plus d'artefacts sur l'ombre." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Chemin des shaders" @@ -6309,6 +6792,23 @@ msgstr "" "performances sur certaines cartes graphiques.\n" "Fonctionne seulement avec OpenGL." +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "Qualité du filtre d’ombre" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" +"Distance maximale de la carte des ombres en nœuds pour le rendu des ombres" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "Texture de la carte des ombres en 32 bits" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Taille de la texture de la carte des ombres" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6318,12 +6818,8 @@ msgstr "" "valeur est 0." #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"Décalage de l'ombre de la police de secours (en pixel). Aucune ombre si la " -"valeur est 0." +msgid "Shadow strength gamma" +msgstr "Intensité gamma de l'ombre" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6337,9 +6833,21 @@ msgstr "Afficher les infos de débogage" msgid "Show entity selection boxes" msgstr "Afficher les boîtes de sélection de l'entité" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Afficher les boîtes de sélection de l'entité\n" +"Un redémarrage est nécessaire après cette modification." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +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 "" @@ -6350,14 +6858,13 @@ msgid "" "Altering this value is for special usage, leaving it unchanged is\n" "recommended." msgstr "" -"Taille des mapchunks générés par mapgen, indiquée dans les mapblocks (16 " -"nœuds).\n" -"ATTENTION !: Il n’ya aucun avantage, et il y a plusieurs dangers, dans\n" -"augmenter cette valeur au-dessus de 5.\n" +"Taille des tranches de carte générés à la création de terrain, établie en " +"blocs de carte (16 nœuds).\n" +"ATTENTION ! : Il n’y a aucun avantage, et plusieurs dangers, à augmenter " +"cette valeur au-dessus de 5.\n" "Réduire cette valeur augmente la densité de cavernes et de donjons.\n" -"La modification de cette valeur est réservée à un usage spécial, elle reste " -"inchangée.\n" -"conseillé." +"La modification de cette valeur est réservée à un usage spécial. Il est " +"conseillé de la laisser inchangée." #: src/settings_translation_file.cpp msgid "" @@ -6365,9 +6872,13 @@ msgid "" "increase the cache hit %, reducing the data being copied from the main\n" "thread, thus reducing jitter." msgstr "" -"Taille du cache de MapBlocks du générateur de maillage. Augmenter\n" -"ceci augmente le % d'interception du cache et réduit la copie de données\n" -"dans le fil principal, réduisant les tremblements." +"Taille du cache de blocs de carte du générateur de maillage. Augmenter ceci " +"augmente le % d'interception du cache et réduit la copie de données dans le " +"fil principal, réduisant les tremblements." + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Inclinaison de l'orbite du corps du ciel" #: src/settings_translation_file.cpp msgid "Slice w" @@ -6380,16 +6891,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Small cave maximum number" -msgstr "Nombre maximum de petites grottes" +msgstr "Nombre maximal de petites grottes" #: src/settings_translation_file.cpp msgid "Small cave minimum number" -msgstr "Nombre maximum de petites grottes" +msgstr "Nombre minimal de petites grottes" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." msgstr "" -"Variation d'humidité de petite échelle pour la transition entre les biomes." +"Variation de l'humidité de petite échelle pour la transition entre les " +"biomes." #: src/settings_translation_file.cpp msgid "Small-scale temperature variation for blending biomes on borders." @@ -6406,7 +6918,8 @@ msgid "" "Smooths camera when looking around. Also called look or mouse smoothing.\n" "Useful for recording videos." msgstr "" -"Lisse les mouvement de la caméra en se déplaçant et en regardant autour.\n" +"Lisse les mouvements de la caméra en se déplaçant et en regardant autour. " +"Également appelé « look smoothing » ou « mouse smoothing ».\n" "Utile pour enregistrer des vidéos." #: src/settings_translation_file.cpp @@ -6419,28 +6932,24 @@ msgstr "Lisse la rotation de la caméra. 0 pour désactiver." #: src/settings_translation_file.cpp msgid "Sneak key" -msgstr "Déplacement lent" +msgstr "Touche déplacement lent" #: src/settings_translation_file.cpp msgid "Sneaking speed" -msgstr "Vitesse d'accroupissement" +msgstr "Vitesse de déplacement lent" #: src/settings_translation_file.cpp msgid "Sneaking speed, in nodes per second." -msgstr "Vitesse furtive, en blocs par seconde." +msgstr "Vitesse de déplacement lent, en nœuds par seconde." + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Rayon de l'ombre douce" #: src/settings_translation_file.cpp msgid "Sound" msgstr "Audio" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Touche spéciale" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Touche spéciale pour monter/descendre" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6451,8 +6960,7 @@ msgstr "" "Spécifie l'URL à laquelle les clients obtiennent les fichiers média au lieu " "d'utiliser le port UDP.\n" "$filename doit être accessible depuis $remote_media$filename via cURL " -"(évidemment, remote_media devrait\n" -"se terminer avec un slash).\n" +"(évidemment, remote_media devrait se terminer avec un slash).\n" "Les fichiers qui ne sont pas présents seront récupérés de la manière " "habituelle." @@ -6467,6 +6975,19 @@ msgstr "" "Les mods ou les parties peuvent fixer explicitement une pile pour certains " "items." +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"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" +"Valeur minimale : 1 ; valeur maximale : 16" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6479,28 +7000,24 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Static spawnpoint" -msgstr "Emplacement du spawn statique" +msgstr "Point d'apparition statique" #: src/settings_translation_file.cpp msgid "Steepness noise" -msgstr "Bruit pour les pentes" +msgstr "Bruit des pentes" #: src/settings_translation_file.cpp msgid "Step mountain size noise" -msgstr "Bruit pour la taille des montagnes en escalier" +msgstr "Bruit de la taille des montagnes en escalier" #: src/settings_translation_file.cpp msgid "Step mountain spread noise" -msgstr "Bruit pour l’étalement des montagnes en escalier" +msgstr "Bruit d'étalement des montagnes en escalier" #: src/settings_translation_file.cpp msgid "Strength of 3D mode parallax." msgstr "Intensité de parallaxe en mode 3D." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Force des normalmaps autogénérés." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6508,8 +7025,8 @@ msgid "" "curve that is boosted in brightness." msgstr "" "Niveau d'amplification de la courbure de la lumière.\n" -"Les trois paramètres « d'amplification » définissent un intervalle\n" -"de la courbe de lumière pour lequel la luminosité est amplifiée." +"Les trois paramètres « d'amplification » définissent un intervalle de la " +"courbe de lumière pour lequel la luminosité est amplifiée." #: src/settings_translation_file.cpp msgid "Strict protocol checking" @@ -6517,7 +7034,7 @@ msgstr "Vérification stricte du protocole" #: src/settings_translation_file.cpp msgid "Strip color codes" -msgstr "Echapper les codes de couleur" +msgstr "Supprimer les codes couleurs" #: src/settings_translation_file.cpp msgid "" @@ -6532,6 +7049,18 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"Niveau de la surface de l'eau (optionnel) placée sur une couche solide de " +"terrain flottant.\n" +"L'eau est désactivée par défaut et ne sera placée que si cette valeur est " +"définie à plus de « mgv7_floatland_ymax » - « mgv7_floatland_taper » (début " +"de l’effilage du haut).\n" +"***ATTENTION, DANGER POTENTIEL AU MONDES ET AUX PERFORMANCES DES " +"SERVEURS*** :\n" +"Lorsque le placement de l'eau est activé, les terrains flottants doivent " +"être configurés et vérifiés pour être une couche solide en mettant " +"« mgv7_floatland_density » à 2,0 (ou autre valeur dépendante de " +"« mgv7_np_floatland »), pour éviter les chutes d'eaux énormes qui " +"surchargent les serveurs et pourraient inonder les terres en dessous." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6541,13 +7070,17 @@ msgstr "SQLite synchronisé" 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 pour le terrain" +msgstr "Bruit alternatif de terrain" #: src/settings_translation_file.cpp msgid "Terrain base noise" -msgstr "Bruit pour le terrain de base" +msgstr "Bruit de terrain de base" #: src/settings_translation_file.cpp msgid "Terrain height" @@ -6555,11 +7088,11 @@ msgstr "Hauteur du terrain" #: src/settings_translation_file.cpp msgid "Terrain higher noise" -msgstr "Bruit pour la hauteur du terrain" +msgstr "Bruit de hauteur du terrain" #: src/settings_translation_file.cpp msgid "Terrain noise" -msgstr "Bruit pour le terrain" +msgstr "Bruit de terrain" #: src/settings_translation_file.cpp msgid "" @@ -6568,8 +7101,8 @@ msgid "" "Adjust towards 0.0 for a larger proportion." msgstr "" "Seuil du bruit de relief pour les collines.\n" -"Contrôle la proportion sur la superficie d'un monde recouvert de collines.\n" -"Ajuster vers 0. 0 pour une plus grande proportion." +"Contrôle la proportion sur la zone d'un monde recouvert de collines.\n" +"Ajuster vers 0,0 pour une plus grande proportion." #: src/settings_translation_file.cpp msgid "" @@ -6578,17 +7111,28 @@ msgid "" "Adjust towards 0.0 for a larger proportion." msgstr "" "Seuil du bruit de relief pour les lacs.\n" -"Contrôle la proportion sur la superficie d'un monde recouvert de lacs.\n" -"Ajuster vers 0. 0 pour une plus grande proportion." +"Contrôle la proportion sur la zone d'un monde recouvert de lacs.\n" +"Ajuster vers 0,0 pour une plus grande proportion." #: src/settings_translation_file.cpp msgid "Terrain persistence noise" -msgstr "Bruit du terrain persistant" +msgstr "Bruit de persistance du terrain" #: src/settings_translation_file.cpp msgid "Texture path" msgstr "Chemin des textures" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Taille de la texture pour le rendu de la carte des ombres.\n" +"Il doit s'agir d'une puissance de deux.\n" +"Les nombres plus grands créent de meilleures ombres, mais ils sont aussi " +"plus coûteux." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6599,24 +7143,29 @@ msgid "" "that is considered EXPERIMENTAL and may not work properly." msgstr "" "Les textures sur un nœud peuvent être alignées soit sur le nœud, soit sur le " -"monde. L'ancien mode convient mieux aux machines, aux meubles, etc. ce " -"dernier rend les escaliers et les microblocs mieux adaptés à " -"l'environnement. Cependant, comme cette possibilité est nouvelle, elle ne " -"peut donc pas être utilisée par les anciens serveurs, cette option permet de " -"l'appliquer pour certains types de nœuds. Notez cependant que c'est " -"considéré comme EXPERIMENTAL et peut ne pas fonctionner correctement." +"monde. Le premier mode convient mieux aux choses comme des machines, des " +"meubles, etc., tandis que le second rend les escaliers et les microblocs " +"mieux adaptés à l'environnement. Cependant, comme cette possibilité est " +"nouvelle, elle ne peut donc pas être utilisée par les anciens serveurs, " +"cette option permet de l'appliquer pour certains types de nœuds. Noter " +"cependant que c'est considéré comme EXPÉRIMENTAL et peut ne pas fonctionner " +"correctement." #: 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" +msgstr "La zone morte de la manette" #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" "when calling `/profiler save [format]` without format." msgstr "" -"Le format par défaut dans lequel les profils seront sauvegardés,\n" -"lorsque la commande `/profiler save [format]` est entrée sans format." +"Le format par défaut dans lequel les profils sont enregistrés, lors de " +"l'appel de « /profiler save [format] » sans format." #: src/settings_translation_file.cpp msgid "The depth of dirt or other biome filler node." @@ -6633,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." @@ -6650,10 +7199,10 @@ msgid "" "Requires waving liquids to be enabled." msgstr "" "La hauteur maximale de la surface des liquides ondulants.\n" -"4.0 - La hauteur des vagues est de deux nœuds.\n" -"0.0 - La vague ne bouge pas du tout.\n" -"Par défaut est de 1,0 (1/2 nœud).\n" -"Nécessite d’activer les liquides ondulants." +"4,0 - La hauteur des vagues est de deux blocs.\n" +"0,0 - La vague ne bouge pas du tout.\n" +"Par défaut est de 1,0 (1/2 bloc).\n" +"Nécessite les liquides ondulants pour être activé." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6665,10 +7214,9 @@ msgid "" "See /privs in game for a full list on your server and mod configuration." msgstr "" "Les privilèges que les nouveaux joueurs obtiennent automatiquement.\n" -"Entrer /privs dans le jeu pour voir une liste complète des privilèges." +"Entrer « /privs » dans le jeu pour voir une liste complète des privilèges." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The radius of the volume of blocks around every player that is subject to " "the\n" @@ -6678,37 +7226,38 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" -"Le rayon du volume de blocs autour de chaque joueur soumis à la\n" -"truc de bloc actif, indiqué dans mapblocks (16 noeuds).\n" -"Dans les blocs actifs, les objets sont chargés et les guichets automatiques " -"sont exécutés.\n" -"C'est également la plage minimale dans laquelle les objets actifs (mobs) " +"Le rayon du volume de blocs autour de chaque joueur soumis au bloc actif, " +"établi en blocs de carte (16 nœuds).\n" +"Dans les blocs actifs, les objets sont chargés et les « ABMs » sont " +"exécutés.\n" +"C'est également la distance minimale dans laquelle les objets actifs (mobs) " "sont conservés.\n" -"Ceci devrait être configuré avec active_object_range." +"Ceci devrait être configuré avec « active_object_send_range_blocks »." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Le moteur de rendu utilisé par Irrlicht.\n" -"Un redémarrage est nécessaire après avoir changé cette option.\n" -"Il est recommandé de laisser OGLES1 sur Android. Dans le cas contraire, le " -"jeu risque de planter.\n" -"Sur les autres plateformes, OpenGL est recommandé, il s'agit du seul moteur\n" -"à prendre en charge les shaders." +"Le moteur de rendu.\n" +"Un redémarrage est nécessaire après cette modification.\n" +"Remarque : Sur Android, rester avec OGLES1 en cas de doute ! Autrement, " +"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)." #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" -"Sensibilité de la souris pour déplacer la \n" -"vue en jeu autour du tronc." +"Sensibilité des axes de la manette pour déplacer la vue en jeu autour du " +"tronc." #: src/settings_translation_file.cpp msgid "" @@ -6717,12 +7266,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 "" -"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 " -"valeur est en dehors\n" -"de cette gamme alors elle sera définie à la plus proche des valeurs valides." +"Une gamme valide de valeurs pour ceci se situe entre 0,25 et 4,0. Si la " +"valeur est en dehors de cette gamme alors elle sera définie à la plus proche " +"des valeurs valides." #: src/settings_translation_file.cpp msgid "" @@ -6730,28 +7279,34 @@ 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 "" -"Le temps (en secondes) où la file des liquides peut s'agrandir au-delà de " -"sa\n" +"Le temps (en secondes) où la file des liquides peut s'agrandir au-delà de sa " "capacité de traitement jusqu'à ce qu'une tentative soit faite pour réduire " -"sa taille en vidant\n" -"l'ancienne file d'articles. Une valeur de 0 désactive cette fonctionnalité." +"sa taille en vidant l'ancienne file d'articles.\n" +"Une valeur de 0 désactive cette fonctionnalité." + +#: 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 "" +"Budget de temps alloué aux « ABMs » pour s'exécuter à chaque étape (en " +"fraction de l'intervalle « 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 "" -"L'intervalle en secondes entre des clics droits répétés lors de l'appui sur " -"le bouton droit de la souris." +"Le temps en secondes qu'il faut entre des événements répétés lors de l'appui " +"d'une combinaison de boutons de la manette." #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"L'intervalle en secondes entre des clics droits répétés lors de l'appui sur " -"le bouton droit de la souris." +"Le temps en secondes qu'il faut entre des placements de blocs répétés lors " +"de l'appui sur le bouton de placement." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6764,30 +7319,28 @@ msgid "" "'altitude_dry' is enabled." msgstr "" "La distance verticale sur laquelle la chaleur diminue de 20 si " -"« altitude_chill » est\n" -"activé. Également la distance verticale sur laquelle l’humidité diminue de " -"10 si\n" -"« altitude_dry » est activé." +"« altitude_chill » est activé. Également la distance verticale sur laquelle " +"l’humidité diminue de 10 si « altitude_dry » est activé." #: src/settings_translation_file.cpp msgid "Third of 4 2D noises that together define hill/mountain range height." msgstr "" "Le troisième des 4 bruits 2D qui définissent ensemble la hauteur des " -"collines et montagnes." +"collines et des montagnes." #: 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 "" -"Durée en secondes pendant laquelle les objets jetés sont présents.\n" +"Temps en secondes pour les entités objets (objets lâchés) à exister.\n" "Définir à -1 pour désactiver cette fonctionnalité." #: src/settings_translation_file.cpp msgid "Time of day when a new world is started, in millihours (0-23999)." msgstr "" -"Heure de la journée lorsqu'un nouveau monde est créé, en milliheures " -"(0-23999)." +"Heure de la journée lorsqu'un nouveau monde est créé, en milliheures (0–" +"23999)." #: src/settings_translation_file.cpp msgid "Time send interval" @@ -6798,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 pendant lequel le client supprime les données de la carte de sa " -"mémoire." +"Délai d'interruption pour le client pour supprimer les données de carte " +"inutilisées de la mémoire, établi en secondes." #: src/settings_translation_file.cpp msgid "" @@ -6810,57 +7363,68 @@ msgid "" "This determines how long they are slowed down after placing or removing a " "node." msgstr "" -"Pour réduire le lag, le transfert des blocs est ralenti quand un joueur " +"Pour réduire le décalage, le transfert des blocs est ralenti quand un joueur " "construit quelque chose.\n" "Cela détermine la durée du ralentissement après placement ou destruction " "d'un nœud." #: src/settings_translation_file.cpp msgid "Toggle camera mode key" -msgstr "Basculement en mode caméra" +msgstr "Touche basculer en mode caméra" #: src/settings_translation_file.cpp msgid "Tooltip delay" -msgstr "Délais d'apparition des infobulles" +msgstr "Délai d'apparition des infobulles" #: src/settings_translation_file.cpp 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 pour les arbres" +msgstr "Bruit des arbres" #: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Filtrage trilinéaire" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" "Usable to make minimap smoother on slower machines." msgstr "" -"True = 256\n" -"False = 128\n" +"Activé = 256\n" +"Désactive = 128\n" "Utile pour rendre la mini-carte plus fluide sur des ordinateurs peu " "performants." #: 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." -msgstr "URL de la liste des serveurs affichée dans l'onglet multijoueur." +msgstr "" +"URL de la liste des serveurs affichée dans l'onglet « Rejoindre une partie »." #: src/settings_translation_file.cpp msgid "Undersampling" -msgstr "Sous-échantillonage" +msgstr "Sous-échantillonnage" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Undersampling is similar to using a lower screen resolution, but it applies\n" "to the game world only, keeping the GUI intact.\n" @@ -6868,11 +7432,12 @@ msgid "" "image.\n" "Higher values result in a less detailed image." msgstr "" -"Le sous-échantillonage ressemble à l'utilisation d'une définition d'écran\n" -"plus faible, mais il ne s'applique qu'au rendu 3D, gardant l'interface " +"Le sous-échantillonnage ressemble à l'utilisation d'une résolution d'écran " +"inférieure, mais il ne s'applique qu'au rendu 3D, gardant l'interface " "intacte.\n" -"Cela peut donner lieu à un bonus de performance conséquent, au détriment de " -"la qualité d'image." +"Cela doit donner un bonus de performance conséquent, au détriment de la " +"qualité d'image.\n" +"Les valeurs plus élevées réduisent la qualité du détail des images." #: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" @@ -6880,16 +7445,15 @@ msgstr "Distance de transfert du joueur illimitée" #: src/settings_translation_file.cpp msgid "Unload unused server data" -msgstr "Purger les données de serveur inutiles" +msgstr "Décharger les données de serveur inutilisées" #: src/settings_translation_file.cpp msgid "Upper Y limit of dungeons." msgstr "Limite haute Y des donjons." #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "Limite haute Y des donjons." +msgstr "Limite haute Y des terrains flottants." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6912,19 +7476,43 @@ msgstr "Utilisation du filtrage bilinéaire." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" -"Utilisez le mappage MIP pour mettre à l'échelle les textures. Peut augmenter " -"légèrement les performances,\n" -"surtout si vous utilisez un pack de textures haute résolution.\n" +"Utilise le mip-mapping pour mettre à l'échelle les textures.\n" +"Peut augmenter légèrement les performances, surtout lors de l'utilisation " +"d'un pack de textures haute résolution.\n" "La réduction d'échelle gamma correcte n'est pas prise en charge." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Utilise l'anticrénelage multi-échantillons (MSAA) pour lisser les bords des " +"blocs.\n" +"Cet algorithme lisse la vue 3D tout en conservant l'image nette, mais cela " +"ne concerne pas la partie interne des textures (ce qui est particulièrement " +"visible avec des textures transparentes).\n" +"Des espaces visibles apparaissent entre les blocs lorsque les shaders sont " +"désactivés.\n" +"Si définie à 0, MSAA est désactivé.\n" +"Un redémarrage est nécessaire après la modification de cette option." + #: src/settings_translation_file.cpp 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" @@ -6939,7 +7527,7 @@ msgstr "Profondeur des vallées" #: src/settings_translation_file.cpp msgid "Valley fill" -msgstr "Comblement de vallée" +msgstr "Comblement des vallées" #: src/settings_translation_file.cpp msgid "Valley profile" @@ -6959,7 +7547,7 @@ msgstr "Variation de la hauteur maximale des montagnes (en blocs)." #: src/settings_translation_file.cpp msgid "Variation of number of caves." -msgstr "Variation du nombre de cavernes." +msgstr "Variation du nombre de grottes." #: src/settings_translation_file.cpp msgid "" @@ -6967,7 +7555,7 @@ msgid "" "When noise is < -0.55 terrain is near-flat." msgstr "" "Variation du terrain en hauteur.\n" -"Quand le bruit est < à -0.55, le terrain est presque plat." +"Quand le bruit est inférieur à -0,55, le terrain est presque plat." #: src/settings_translation_file.cpp msgid "Varies depth of biome surface nodes." @@ -6979,7 +7567,7 @@ msgid "" "Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" "Variation de la rugosité du terrain.\n" -"Définit la valeur de « persistance » pour les bruits terrain_base et " +"Définit la valeur de « persistance » pour les bruits terrain_base et " "terrain_alt." #: src/settings_translation_file.cpp @@ -7000,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." @@ -7008,36 +7596,35 @@ msgstr "Distance d'affichage en blocs." #: src/settings_translation_file.cpp msgid "View range decrease key" -msgstr "Réduire la distance d'affichage" +msgstr "Touche réduire la distance d'affichage" #: src/settings_translation_file.cpp msgid "View range increase key" -msgstr "Augmenter la distance d'affichage" +msgstr "Touche augmenter la distance d'affichage" #: src/settings_translation_file.cpp msgid "View zoom key" -msgstr "Touche de vue du zoom" +msgstr "Touche zoomer" #: src/settings_translation_file.cpp msgid "Viewing range" msgstr "Plage de visualisation" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Joystick virtuel déclenche le bouton aux" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Manette virtuelle déclenche le bouton Aux1" #: src/settings_translation_file.cpp msgid "Volume" msgstr "Volume du son" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" -"Active l'occlusion parallaxe.\n" -"Nécessite les shaders pour être activé." +"Volume de tous les sons.\n" +"Exige que le son du système soit activé." #: src/settings_translation_file.cpp msgid "" @@ -7080,31 +7667,31 @@ msgstr "Environnement mouvant" #: src/settings_translation_file.cpp msgid "Waving leaves" -msgstr "Feuilles d'arbres mouvantes" +msgstr "Feuilles ondulantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" msgstr "Liquides ondulants" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "Hauteur des vagues" +msgstr "Hauteur des vagues des liquides ondulants" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" -msgstr "Vitesse de mouvement des liquides" +msgstr "Vitesse de mouvement des liquides ondulants" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" -msgstr "Durée du mouvement des liquides" +msgstr "Longueur d'onde des liquides ondulants" #: src/settings_translation_file.cpp msgid "Waving plants" -msgstr "Plantes mouvantes" +msgstr "Plantes ondulantes" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Couleur du lien web" #: src/settings_translation_file.cpp msgid "" @@ -7112,9 +7699,9 @@ msgid "" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" -"Quand gui_scaling_filter est activé, tous les images du GUI sont\n" -"filtrées dans Minetest, mais quelques images sont générées directement\n" -"par le matériel (ex.: textures des blocs dans l'inventaire)." +"Quand « gui_scaling_filter » est activé, tous les images du GUI sont " +"filtrées par le logiciel, mais certaines sont générées directement par le " +"matériel (ex. : textures des blocs dans l'inventaire)." #: src/settings_translation_file.cpp msgid "" @@ -7123,53 +7710,47 @@ msgid "" "to the old scaling method, for video drivers that don't\n" "properly support downloading textures back from hardware." msgstr "" -"Quand gui_scaling_filter_txr2img est activé, c'est Minetest qui s'occupe de\n" -"la mise à l'échelle des images et non votre matériel. Si désactivé,\n" -"l'ancienne méthode de mise à l'échelle est utilisée, pour les pilotes " -"vidéos\n" -"qui ne supportent pas le chargement des textures depuis le matériel." +"Quand « gui_scaling_filter_txr2img » est activé, copier les images du " +"matériel au logiciel pour mise à l'échelle.\n" +"Si désactivé, l'ancienne méthode de mise à l'échelle est utilisée, pour les " +"pilotes vidéos qui ne supportent pas le chargement des textures depuis le " +"matériel." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" "En utilisant le filtrage bilinéaire/trilinéaire/anisotrope, les textures de " -"basse résolution\n" -"peuvent être floutées, agrandissez-les donc automatiquement avec " -"l'interpolation du plus proche voisin\n" -"pour garder des pixels nets. Ceci détermine la taille de la texture " -"minimale\n" -"pour les textures agrandies ; les valeurs plus hautes rendent les textures " -"plus détaillées, mais nécessitent\n" -"plus de mémoire. Les puissances de 2 sont recommandées. Définir une valeur " -"supérieure à 1 peut ne pas\n" -"avoir d'effet visible sauf si le filtrage bilinéaire / trilinéaire / " +"basse résolution peuvent être brouillées. Elles seront donc automatiquement " +"agrandies avec l'interpolation du plus proche voisin pour garder des pixels " +"moins floues. Ceci détermine la taille de la texture minimale pour les " +"textures agrandies ; les valeurs plus hautes rendent plus détaillées, mais " +"nécessitent plus de mémoire. Les puissances de 2 sont recommandées. Ce " +"paramètre est appliqué uniquement si le filtrage bilinéaire/trilinéaire/" "anisotrope est activé.\n" -"ceci est également utilisée comme taille de texture de nœud par défaut pour\n" -"l'agrandissement des textures basé sur le monde." +"Ceci est également utilisée comme taille de texture de nœud de base pour " +"l'agrandissement automatique des textures alignées sur le monde." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Détermine l'utilisation des polices Freetype. Nécessite une compilation avec " -"le support Freetype." +"Si l'arrière-plan des badges doit être affiché par défaut.\n" +"Les mods peuvent toujours définir un arrière-plan." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "Détermine la désynchronisation des textures animées par mapblock." +msgstr "" +"Détermine la désynchronisation des animations de texture de nœud par bloc de " +"carte." #: src/settings_translation_file.cpp msgid "" @@ -7177,7 +7758,7 @@ msgid "" "Deprecated, use the setting player_transfer_distance instead." msgstr "" "Détermine l'exposition illimitée des noms de joueurs aux autres clients.\n" -"Obsolète : utiliser l'option player_transfer_distance à la place." +"Obsolète : utiliser le paramètre « player_transfer_distance » à la place." #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." @@ -7189,37 +7770,51 @@ 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" -"Activez-le si votre serveur est paramétré pour redémarrer automatiquement." +"Définir sur « Activé » si le serveur est paramétré pour redémarrer " +"automatiquement." #: src/settings_translation_file.cpp msgid "Whether to fog out the end of the visible area." -msgstr "Détermine la visibilité de la brume au bout de l'aire visible." +msgstr "Détermine la visibilité du brouillard au bout de l'aire visible." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Whether to mute sounds. You can unmute sounds at any time, unless the\n" "sound system is disabled (enable_sound=false).\n" "In-game, you can toggle the mute state with the mute key or by using the\n" "pause menu." msgstr "" -"S'il faut mettre les sons en sourdine. Vous pouvez désactiver les sons à " -"tout moment, sauf si le\n" -"le système de sonorisation est désactivé (enable_sound=false).\n" -"Dans le jeu, vous pouvez passer en mode silencieux avec la touche de mise en " -"sourdine ou en utilisant la\n" -"menu pause." +"S'il faut couper le son. Vous pouvez réactiver le son à tout moment, sauf si " +"le système audio est désactivé (« enable_sound=false »).\n" +"Dans le jeu, vous pouvez basculer l'état du son avec la touche « Muet » ou " +"en utilisant le menu pause." + +#: 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 infos de débogage du client (même effet que " -"taper F5)." +"Détermine la visibilité des informations de débogage du client (même effet " +"que taper F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Résolution verticale de la fenêtre de jeu." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Composant de largeur de la taille initiale de la fenêtre. Ignoré en mode " +"plein écran." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7231,9 +7826,9 @@ msgid "" "background.\n" "Contains the same information as the file debug.txt (default name)." msgstr "" -"Systèmes Windows seulement : démarrer Minetest avec la fenêtre de commandes\n" -"en arrière-plan. Contient les mêmes informations que dans debug.txt (nom par " -"défaut)." +"Systèmes Windows seulement : démarrer Minetest avec la fenêtre de ligne de " +"commande en arrière-plan. Contient les mêmes informations que le fichier " +"« debug.txt » (nom par défaut)." #: src/settings_translation_file.cpp msgid "" @@ -7257,15 +7852,12 @@ msgid "" "Warning: This option is EXPERIMENTAL!" msgstr "" "Les textures alignées sur le monde peuvent être mises à l'échelle pour " -"couvrir plusieurs nœuds. Cependant,\n" -"le serveur peut ne pas envoyer l'échelle que vous voulez, surtout si vous " -"utilisez\n" -"un pack de textures spécialement conçu ; avec cette option, le client " -"essaie\n" -"de déterminer l'échelle automatiquement en fonction de la taille de la " -"texture.\n" -"Voir aussi texture_min_size.\n" -"Avertissement : Cette option est EXPÉRIMENTALE !" +"couvrir plusieurs nœuds. Cependant, le serveur peut ne pas envoyer l'échelle " +"que vous voulez, surtout si vous utilisez un pack de textures spécialement " +"conçu ; avec cette option, le client essaie de déterminer l'échelle " +"automatiquement en fonction de la taille de la texture.\n" +"Voir aussi « texture_min_size ».\n" +"Avertissement : cette option est EXPÉRIMENTALE !" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" @@ -7285,12 +7877,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Y of upper limit of large caves." -msgstr "" -"Coordonnée Y de la limite supérieure des grandes grottes pseudo-aléatoires." +msgstr "Limite haute Y des grandes grottes." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." -msgstr "La distance Y jusqu'à laquelle la caverne peut s'étendre." +msgstr "" +"La distance Y jusqu'à laquelle les cavernes s'étendent à leur taille " +"maximale." #: src/settings_translation_file.cpp msgid "" @@ -7299,147 +7892,63 @@ 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 "" +"Hauteur-Y à laquelle les terrains flottants commencent à rétrécir.\n" +"L'effilage comment à cette distance de la limite en Y.\n" +"Pour une couche solide de terrain flottant, ceci contrôle la hauteur des " +"montagnes.\n" +"Doit être égale ou moindre à la moitié de la distance entre les limites Y." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." -msgstr "Hauteur (Y) moyenne de la surface du terrain." +msgstr "Limite moyenne Y de la surface du terrain." #: src/settings_translation_file.cpp msgid "Y-level of cavern upper limit." -msgstr "Limite haute de génération des cavernes." +msgstr "Limite haute Y de génération des cavernes." #: src/settings_translation_file.cpp msgid "Y-level of higher terrain that creates cliffs." -msgstr "Hauteur Y du plus haut terrain qui crée des falaises." +msgstr "Limite Y du plus haut terrain qui crée des falaises." #: src/settings_translation_file.cpp msgid "Y-level of lower terrain and seabed." -msgstr "Hauteur Y du plus bas terrain et des fonds marins." +msgstr "Limite Y du plus bas terrain et des fonds marins." #: src/settings_translation_file.cpp msgid "Y-level of seabed." -msgstr "Hauteur (Y) du fond marin." +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élais d'interruption de cURL lors d'un téléchargement de fichier" +msgstr "Délai d'interruption de cURL lors d'un téléchargement de fichier" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "Délai d'interruption interactive de cURL" #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Limite parallèle de cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Délais d'interruption de cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "– Mode créatif : " -#~ msgid "Toggle Cinematic" -#~ msgstr "Mode cinématique" - -#~ msgid "Select Package File:" -#~ msgstr "Sélectionner le fichier du mod :" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "" -#~ "Coordonnée Y de la limite supérieure des grandes grottes pseudo-" -#~ "aléatoires." - -#~ msgid "Waving Water" -#~ msgstr "Eau ondulante" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Si les donjons font parfois saillie du terrain." - -#~ msgid "Projecting dungeons" -#~ msgstr "Projection des donjons" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Hauteur (Y) auquel les ombres portées s’étendent." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "Hauteur (Y) du point de flottaison et de la surface des lacs." - -#~ msgid "Waving water" -#~ msgstr "Vagues" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variation de la hauteur des collines et de la profondeur des lacs sur les " -#~ "terrains plats flottants." +#~ msgid "- Damage: " +#~ msgstr "– Dégâts : " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Hauteur maximum typique, au-dessus et au-dessous du point médian, du " -#~ "terrain de montagne flottantes." +#~ "0 = occlusion parallaxe avec des informations de pente (plus rapide).\n" +#~ "1 = cartographie en relief (plus lent, plus précis)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Cette police sera utilisée pour certaines langues." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Force de la courbe de lumière mi-boost." - -#~ msgid "Shadow limit" -#~ msgstr "Limite des ombres" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Chemin vers police TrueType ou Bitmap." - -#~ msgid "Lightness sharpness" -#~ msgstr "Démarcation de la luminosité" - -#~ msgid "Lava depth" -#~ msgstr "Profondeur de lave" - -#~ msgid "IPv6 support." -#~ msgstr "Support IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Niveau d'opacité de l'ombre de la police (entre 0 et 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Hauteur des montagnes flottantes" - -#~ msgid "Floatland base height noise" -#~ msgstr "Le bruit de hauteur de base des terres flottantes" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Autorise le mappage tonal cinématographique" - -#~ msgid "Enable VBO" -#~ msgstr "Activer Vertex Buffer Object: objet tampon de vertex" - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Défini les zones de terrain plat flottant.\n" -#~ "Des terrains plats flottants apparaissent lorsque le bruit > 0." - -#~ msgid "Darkness sharpness" -#~ msgstr "Démarcation de l'obscurité" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Contrôle la largeur des tunnels, une valeur plus petite crée des tunnels " -#~ "plus larges." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Contrôle la densité des terrains montagneux sur les terres flottantes.\n" -#~ "C'est un décalage ajouté à la valeur du bruit 'mgv7_np_mountain'." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Milieu de la courbe de lumière mi-boost." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Modifie la façon dont les terres flottantes montagneuses s’effilent au-" -#~ "dessus et au-dessous du point médian." +#~ msgid "Address / Port" +#~ msgstr "Adresse / Port" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7449,20 +7958,455 @@ msgstr "Délais d'interruption de cURL" #~ "Ajuster la correction gamma. Les valeurs plus basses sont plus claires.\n" #~ "Ce paramètre s'applique au client seulement et est ignoré par le serveur." -#~ msgid "Path to save screenshots at." -#~ msgstr "Chemin où les captures d'écran sont sauvegardées." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Modifie la façon dont les terres flottantes montagneuses s’effilent au-" +#~ "dessus et au-dessous du point médian." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Force de l'occlusion parallaxe" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Limite des files émergentes sur le disque" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Téléchargement et installation de $1, veuillez patienter..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Êtes-vous sûr de vouloir réinitialiser votre monde ?" #~ 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." + +#~ msgid "Bump Mapping" +#~ msgstr "Placage de relief" + +#~ msgid "Bumpmapping" +#~ msgstr "Bump mapping" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Milieu de la courbe de lumière mi-boost." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Change l’interface du menu principal :\n" +#~ "- Complet : Mondes solo, choix du jeu, sélecteur du pack de textures, " +#~ "etc.\n" +#~ "- Simple : un monde solo, pas de sélecteurs de jeu ou de pack de " +#~ "textures. Peut être\n" +#~ "nécessaire pour les plus petits écrans." + +#~ msgid "Config mods" +#~ msgstr "Configurer les mods" + +#~ 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." +#~ msgstr "" +#~ "Contrôle la densité des terrains montagneux sur les terres flottantes.\n" +#~ "C'est un décalage ajouté à la valeur du bruit 'mgv7_np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Contrôle la largeur des tunnels, une valeur plus petite crée des tunnels " +#~ "plus larges." + +#~ msgid "Credits" +#~ msgstr "Crédits" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Couleur du réticule (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Dégâts activés" + +#~ msgid "Darkness sharpness" +#~ msgstr "Démarcation de l'obscurité" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Délais d'interruption de cURL par défaut, établi en millisecondes.\n" +#~ "Seulement appliqué si Minetest est compilé avec cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Défini les zones de terrain plat flottant.\n" +#~ "Des terrains plats flottants apparaissent lorsque le bruit > 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Active le bumpmapping pour les textures.\n" +#~ "Les normalmaps peuvent être fournies par un pack de textures pour un " +#~ "meilleur effet de relief,\n" +#~ "ou bien celui-ci est auto-généré.\n" +#~ "Nécessite les shaders pour être activé." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Autorise le mappage tonal cinématographique" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Active la génération à la volée des normalmaps.\n" +#~ "Nécessite le bumpmapping pour être activé." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "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." +#~ msgstr "" +#~ "Option expérimentale, peut causer un espace vide visible entre les blocs\n" +#~ "quand paramétré avec un nombre supérieur à 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS maximum sur le menu pause" + +#~ msgid "Fallback font shadow" +#~ msgstr "Ombre de la police alternative" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Opacité de l'ombre de la police alternative" + +#~ 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" + +#~ msgid "Floatland mountain height" +#~ msgstr "Hauteur des montagnes flottantes" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Niveau d'opacité de l'ombre de la police (entre 0 et 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Taille de police secondaire au point (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Polices Freetype" + +#~ msgid "Full screen BPP" +#~ msgstr "Bits par pixel en mode plein écran" + +#~ msgid "Game" +#~ msgstr "Jeu" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Génération de Normal Maps" + +#~ 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" + +#~ msgid "Lightness sharpness" +#~ msgstr "Démarcation de la luminosité" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Limite des files émergentes sur le disque" + +#~ msgid "Main" +#~ msgstr "Principal" + +#~ msgid "Main menu style" +#~ msgstr "Style du menu principal" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Mini-carte en mode radar, zoom x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Mini-carte en mode surface, zoom x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Mini-carte en mode surface, zoom x4" + +#~ msgid "Name / Password" +#~ msgstr "Nom / Mot de passe" + +#~ msgid "Name/Password" +#~ msgstr "Nom / Mot de passe" + +#~ msgid "No" +#~ msgstr "Non" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Échantillonnage de normalmaps" + +#~ msgid "Normalmaps strength" +#~ msgstr "Force des normalmaps" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Nombre d'itérations sur l'occlusion parallaxe." + #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Opacité (alpha) de l'ombre derrière la police secondaire, entre 0 et 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "Bias général de l'occlusion parallaxe, habituellement échelle/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Echelle générale de l'effet de l'occlusion parallaxe." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Occlusion parallaxe" + +#~ msgid "Parallax occlusion" +#~ msgstr "Occlusion parallaxe" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Bias de l'occlusion parallaxe" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Nombre d'itérations sur l'occlusion parallaxe" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Mode occlusion parallaxe" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Echelle de l'occlusion parallaxe" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Force de l'occlusion parallaxe" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Chemin vers police TrueType ou Bitmap." + +#~ 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" + +#~ msgid "PvP enabled" +#~ msgstr "JcJ activé" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Réinitialiser le monde" + +#~ 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 " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "Définit le temps de mise à jour des ombres.\n" +#~ "Une valeur plus faible signifie que les ombres et les mises à jour de la " +#~ "carte sont plus rapides, mais cela consomme plus de ressources.\n" +#~ "Valeur minimale 0,001 seconde et maximale 0,2 seconde." + +#~ msgid "Shadow limit" +#~ msgstr "Limite des ombres" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Décalage de l'ombre de la police de secours (en pixel). Aucune ombre si " +#~ "la valeur est 0." + +#~ msgid "Special" +#~ msgstr "Spécial" + +#~ msgid "Special key" +#~ msgstr "Touche spéciale" + +#~ msgid "Start Singleplayer" +#~ msgstr "Démarrer une partie solo" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Force des normalmaps autogénérés." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Force de la courbe de lumière mi-boost." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Cette police sera utilisée pour certaines langues." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Pour activer les shaders, le pilote OpenGL doit être utilisé." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Mode cinématique" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Hauteur maximum typique, au-dessus et au-dessous du point médian, du " +#~ "terrain de montagne flottantes." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variation de la hauteur des collines et de la profondeur des lacs sur les " +#~ "terrains plats flottants." + +#~ msgid "View" +#~ msgstr "Voir" + +#~ msgid "Waving Water" +#~ msgstr "Eau ondulante" + +#~ msgid "Waving water" +#~ msgstr "Vagues" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Détermine l'utilisation des polices Freetype. Nécessite une compilation " +#~ "avec le support Freetype.\n" +#~ "Si désactivée, des polices bitmap et en vecteurs XML seront utilisé en " +#~ "remplacement." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Si les donjons font parfois saillie du terrain." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "" +#~ "Coordonnée Y de la limite supérieure des grandes grottes pseudo-" +#~ "aléatoires." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "Hauteur (Y) du point de flottaison et de la surface des lacs." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Hauteur (Y) auquel les ombres portées s’étendent." + +#~ 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." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/gd/minetest.po b/po/gd/minetest.po index c3347ecda..5c46bfe9b 100644 --- a/po/gd/minetest.po +++ b/po/gd/minetest.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-22 17:56+0000\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/" "gd/>\n" @@ -18,14 +18,76 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " "(n > 2 && n < 20) ? 2 : 3;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.8-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Prìomh chlàr-taice" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" msgstr "" -#: builtin/client/death_formspec.lua src/client/game.cpp -msgid "Respawn" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" msgstr "" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp @@ -33,17 +95,9 @@ msgid "OK" msgstr "" #: builtin/fstk/ui.lua -msgid "The server has requested a reconnect:" +msgid "<none available>" msgstr "" -#: builtin/fstk/ui.lua -msgid "Reconnect" -msgstr "" - -#: builtin/fstk/ui.lua -msgid "Main menu" -msgstr "Prìomh chlàr-taice" - #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "" @@ -52,17 +106,45 @@ msgstr "" msgid "An error occurred:" msgstr "" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Prìomh chlàr-taice" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "" + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" msgstr "" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +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 "Server supports protocol versions between $1 and $2. " +msgid "Protocol version mismatch. " msgstr " " #: builtin/mainmenu/common.lua @@ -71,7 +153,12 @@ msgid "Server enforces protocol version $1. " msgstr " " #: builtin/mainmenu/common.lua -msgid "We support protocol versions between version $1 and $2." +#, fuzzy +msgid "Server supports protocol versions between $1 and $2. " +msgstr " " + +#: builtin/mainmenu/common.lua +msgid "Visit website" msgstr "" #: builtin/mainmenu/common.lua @@ -79,20 +166,56 @@ msgid "We only support protocol version $1." msgstr "" #: builtin/mainmenu/common.lua -#, fuzzy -msgid "Protocol version mismatch. " -msgstr " " - -#: builtin/mainmenu/dlg_config_world.lua -msgid "World:" +msgid "We support protocol versions between version $1 and $2." msgstr "" #: builtin/mainmenu/dlg_config_world.lua -msgid "No modpack description provided." +msgid "(Enabled, has error)" msgstr "" #: builtin/mainmenu/dlg_config_world.lua -msgid "No game description provided." +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_register.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp +#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp +msgid "Cancel" +msgstr "" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +msgstr "" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable modpack" +msgstr "" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable modpack" +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 "" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Find More Mods" msgstr "" #: builtin/mainmenu/dlg_config_world.lua @@ -103,69 +226,67 @@ msgstr "" msgid "No (optional) dependencies" msgstr "" +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua msgid "No hard dependencies" msgstr "Gun eisimeileachd chruaidh" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -msgid "Optional dependencies:" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -msgid "Dependencies:" +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" msgstr "" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp msgid "Save" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua -#: builtin/mainmenu/dlg_delete_content.lua -#: builtin/mainmenu/dlg_delete_world.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 -msgid "Cancel" -msgstr "" - #: builtin/mainmenu/dlg_config_world.lua -msgid "Find More Mods" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Disable modpack" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Enable modpack" +msgid "World:" msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua -msgid "Disable all" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Enable all" -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." +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." msgstr "" #: builtin/mainmenu/dlg_contentstore.lua @@ -173,26 +294,7 @@ msgid "All packages" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Games" -msgstr "" - -#: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Mods" -msgstr "" - -#: builtin/mainmenu/dlg_contentstore.lua -msgid "Texture packs" -msgstr "" - -#: builtin/mainmenu/dlg_contentstore.lua -msgid "Failed to download $1" -msgstr "" - -#: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" +msgid "Already installed" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua @@ -200,23 +302,77 @@ msgid "Back to Main Menu" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "No results" +msgid "Base Game:" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "No packages could be retrieved" +msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Failed to download $1" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Games" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Install" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "Update" +msgid "Install $1" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "" +"Stàladh: Faidhle dhen t-seòrsa “$1” ris nach eil taic no tasglann bhriste" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Mods" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No packages could be retrieved" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No results" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua @@ -224,51 +380,83 @@ msgid "Uninstall" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Caverns" +msgid "A world named \"$1\" already exists" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Very large caverns deep in the underground" +msgid "Additional terrain" msgstr "" -#: builtin/mainmenu/dlg_create_world.lua -msgid "Sea level rivers" -msgstr "Aibhnean air àirde na mara" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Rivers" -msgstr "Aibhnean" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Mountains" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Floatlands (experimental)" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Floating landmasses in the sky" -msgstr "Tìr air fhleòd san speur" - #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" msgstr "" -#: builtin/mainmenu/dlg_create_world.lua -msgid "Reduces heat with altitude" -msgstr "" - #: builtin/mainmenu/dlg_create_world.lua msgid "Altitude dry" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Reduces humidity with altitude" +msgid "Biome blending" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biomes" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caverns" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caves" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Development Test is meant for developers." +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Dungeons" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "Tìr air fhleòd san speur" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Hills" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -280,15 +468,12 @@ msgid "Increases humidity around rivers" msgstr "Nì seo an tìr nas buige faisg air aibhnean" #: builtin/mainmenu/dlg_create_world.lua -msgid "Vary river depth" -msgstr "Caochail doimhne nan aibhnean" +#, fuzzy +msgid "Install a game" +msgstr "Pacaidean air an stàladh:" #: builtin/mainmenu/dlg_create_world.lua -msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "Adhbharaichidh saoghal tioram is teth aibhnean tana no tioram" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Hills" +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -296,19 +481,23 @@ msgid "Lakes" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Additional terrain" -msgstr "" +msgid "Low humidity and high heat causes shallow or dry rivers" +msgstr "Adhbharaichidh saoghal tioram is teth aibhnean tana no tioram" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "Gineadair nam mapa" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "Brataich gineadair nam mapa" #: builtin/mainmenu/dlg_create_world.lua -msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgid "Mapgen-specific flags" +msgstr "Brataich shònraichte do ghineadair nam mapa" #: builtin/mainmenu/dlg_create_world.lua -msgid "Trees and jungle grass" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Flat terrain" +msgid "Mountains" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -316,39 +505,36 @@ msgid "Mud flow" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Terrain surface erosion" +msgid "Network of tunnels and caves" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgid "No game selected" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle" +msgid "Reduces heat with altitude" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert" +msgid "Reduces humidity with altitude" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "You have no games installed." +msgid "Rivers" +msgstr "Aibhnean" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Sea level rivers" +msgstr "Aibhnean air àirde na mara" + +#: builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Caves" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Dungeons" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Decorations" +msgid "Smooth transition between biomes" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -362,35 +548,31 @@ msgid "Structures appearing on the terrain, typically trees and plants" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Network of tunnels and caves" +msgid "Temperate, Desert" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Biomes" +msgid "Temperate, Desert, Jungle" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Biome blending" +msgid "Temperate, Desert, Jungle, Tundra, Taiga" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Smooth transition between biomes" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Mapgen flags" -msgstr "Brataich gineadair nam mapa" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Mapgen-specific flags" -msgstr "Brataich shònraichte do ghineadair nam mapa" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Warning: The Development Test is meant for developers." +msgid "Terrain surface erosion" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" +msgid "Trees and jungle grass" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Vary river depth" +msgstr "Caochail doimhne nan aibhnean" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Very large caverns deep in the underground" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -398,28 +580,7 @@ msgid "World name" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Seed" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Mapgen" -msgstr "Gineadair nam mapa" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Create" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "A world named \"$1\" already exists" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "No game selected" +msgid "You have no games installed." msgstr "" #: builtin/mainmenu/dlg_delete_content.lua @@ -444,46 +605,53 @@ 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 "" +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "" + #: 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 "" -#: builtin/mainmenu/dlg_rename_modpack.lua -msgid "Rename Modpack:" -msgstr "" - #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Disabled" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Enabled" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Browse" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp -msgid "Offset" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp -msgid "Scale" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "X spread" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Y spread" +msgid "(No description of setting given)" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -491,19 +659,119 @@ msgid "2D Noise" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Z spread" +msgid "< Back to Settings page" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +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 "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Lacunarity" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Octaves" msgstr "" -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Lacunarity" +msgid "Persistence" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "" + +#. ~ "absvalue" is a noise parameter flag. +#. It is short for "absolute value". +#. It can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "absvalue" msgstr "" #. ~ "defaults" is a noise parameter flag. @@ -521,76 +789,12 @@ msgstr "" msgid "eased" msgstr "" -#. ~ "absvalue" is a noise parameter flag. -#. It is short for "absolute value". -#. It can be enabled in noise settings in -#. main menu -> "All Settings". -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "absvalue" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "X" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Y" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Z" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "(No description of setting given)" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Please enter a valid integer." -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be at least $1." -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must not be larger than $1." -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Please enter a valid number." -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Select directory" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Select file" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "< Back to Settings page" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Edit" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Restore Default" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Show technical names" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" msgstr "" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a $1 as a texture pack" +msgid "$1 mods" msgstr "" #: builtin/mainmenu/pkgmgr.lua @@ -598,11 +802,7 @@ msgid "Failed to install $1 to $2" msgstr "" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to find a valid mod or modpack" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a modpack as a $1" +msgid "Install Mod: Unable to find real mod name for: $1" msgstr "" #: builtin/mainmenu/pkgmgr.lua @@ -610,11 +810,11 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a mod as a $1" +msgid "Unable to find a valid mod or modpack" msgstr "" #: builtin/mainmenu/pkgmgr.lua -msgid "Install Mod: Unable to find real mod name for: $1" +msgid "Unable to install a $1 as a texture pack" msgstr "" #: builtin/mainmenu/pkgmgr.lua @@ -622,16 +822,77 @@ msgid "Unable to install a game as a $1" msgstr "" #: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" +msgid "Unable to install a mod as a $1" msgstr "" #: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" +msgid "Unable to install a modpack as a $1" msgstr "" -"Stàladh: Faidhle dhen t-seòrsa “$1” ris nach eil taic no tasglann bhriste" -#: builtin/mainmenu/pkgmgr.lua -msgid "$1 mods" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 +msgid "Browse online content" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Content" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Information:" msgstr "" #: builtin/mainmenu/tab_content.lua @@ -639,7 +900,7 @@ msgid "Installed Packages:" msgstr "Pacaidean air an stàladh:" #: builtin/mainmenu/tab_content.lua -msgid "Browse online content" +msgid "No dependencies." msgstr "" #: builtin/mainmenu/tab_content.lua @@ -650,207 +911,142 @@ msgstr "" msgid "Rename" msgstr "" -#: builtin/mainmenu/tab_content.lua -msgid "No dependencies." -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "Disable Texture Pack" -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "Use Texture Pack" -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "Information:" -msgstr "" - #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" msgstr "" #: builtin/mainmenu/tab_content.lua -msgid "Content" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Install games from ContentDB" -msgstr "Stàlaich geamannan o ContentDB" - -#: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "New" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Select World:" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Creative Mode" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Enable Damage" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Server" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Game" +msgid "Use Texture Pack" msgstr "" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Port" +msgid "Creative Mode" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Server Port" +msgid "Enable Damage" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Play Game" +msgid "Host Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +msgstr "Stàlaich geamannan o ContentDB" + +#: 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 +msgid "Play Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + #: builtin/mainmenu/tab_local.lua msgid "Start Game" msgstr "" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Seòladh / Port" +#, fuzzy +msgid "Address" +msgstr " " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Ping" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "– Dochann: " + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" msgstr "" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Opaque Leaves" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Aibhnean boga" + +#: builtin/mainmenu/tab_online.lua +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 "Simple Leaves" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Fancy Leaves" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Node Outlining" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Node Highlighting" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "None" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Trilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No Mipmap" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Mipmap" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Mipmap + Aniso. Filter" +msgid "(game support required)" msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "4x" msgstr "" @@ -860,63 +1056,19 @@ msgid "8x" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Smooth Lighting" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Particles" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "3D Clouds" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Opaque Water" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Connected Glass" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Texturing:" +msgid "All Settings" msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Screen:" -msgstr "Sgrìn:" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Shaders" -msgstr "" - #: builtin/mainmenu/tab_settings.lua -msgid "Shaders (unavailable)" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" +msgid "Bilinear Filter" msgstr "" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp @@ -924,15 +1076,103 @@ msgid "Change Keys" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "All Settings" +msgid "Connected Glass" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +msgid "Dynamic shadows:" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" +msgid "Fancy Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Sgrìn:" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" msgstr "" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp @@ -940,49 +1180,51 @@ msgid "Tone Mapping" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" +msgid "Touch threshold (px):" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Liquids" +msgid "Trilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" -"Airson sgàileadairean a chur an comas, feumaidh tu draibhear OpenGL a " -"chleachdadh." - -#: builtin/mainmenu/tab_settings.lua -msgid "Settings" +#: src/client/client.cpp +msgid "Connection aborted (protocol error?)." msgstr "" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" +#: src/client/client.cpp src/client/game.cpp +msgid "Connection timed out." msgstr "" #: src/client/client.cpp -msgid "Connection timed out." +msgid "Done!" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes..." msgstr "" #: src/client/client.cpp @@ -993,28 +1235,32 @@ msgstr "" msgid "Rebuilding shaders..." msgstr "" -#: src/client/client.cpp -msgid "Initializing nodes..." +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" msgstr "" -#: src/client/client.cpp -msgid "Initializing nodes" +#: src/client/clientlauncher.cpp +msgid "Could not find or load game: " msgstr "" -#: src/client/client.cpp -msgid "Done!" +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." msgstr "" #: src/client/clientlauncher.cpp msgid "Main Menu" msgstr "" +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" + #: src/client/clientlauncher.cpp msgid "Player name too long." msgstr "" #: src/client/clientlauncher.cpp -msgid "Connection error (timed out?)" +msgid "Please choose a name!" msgstr "" #: src/client/clientlauncher.cpp @@ -1022,162 +1268,55 @@ msgstr "" msgid "Provided password file failed to open: " msgstr " " -#: src/client/clientlauncher.cpp -msgid "Please choose a name!" -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "No world selected and no address provided. Nothing to do." -msgstr "" - #: src/client/clientlauncher.cpp #, fuzzy msgid "Provided world path doesn't exist: " msgstr " " -#: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "Invalid gamespec." -msgstr "" - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp -msgid "Shutting down..." +msgid "" +"\n" +"Check debug.txt for details." msgstr "" #: src/client/game.cpp -msgid "Creating server..." -msgstr "" +#, fuzzy +msgid "- Address: " +msgstr " " #: src/client/game.cpp -msgid "Creating client..." -msgstr "" +#, fuzzy +msgid "- Mode: " +msgstr " " #: src/client/game.cpp -msgid "Resolving address..." -msgstr "" +#, fuzzy +msgid "- Port: " +msgstr " " #: src/client/game.cpp -msgid "Connecting to server..." -msgstr "" +#, fuzzy +msgid "- Public: " +msgstr " " + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +#, fuzzy +msgid "- PvP: " +msgstr " " #: src/client/game.cpp -msgid "Item definitions..." -msgstr "" +#, fuzzy +msgid "- Server Name: " +msgstr " " #: src/client/game.cpp -msgid "Node definitions..." -msgstr "" - -#: src/client/game.cpp -msgid "Media..." -msgstr "" - -#: src/client/game.cpp -msgid "KiB/s" -msgstr "" - -#: src/client/game.cpp -msgid "MiB/s" -msgstr "" - -#: src/client/game.cpp -msgid "Client side scripting is disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Sound muted" -msgstr "" - -#: src/client/game.cpp -msgid "Sound unmuted" -msgstr "" - -#: src/client/game.cpp -msgid "Sound system is disabled" +msgid "A serialization error occurred:" msgstr "" #: src/client/game.cpp #, c-format -msgid "Volume changed to %d%%" -msgstr "" - -#: src/client/game.cpp -msgid "Sound system is not supported on this build" -msgstr "" - -#: src/client/game.cpp -msgid "ok" -msgstr "" - -#: src/client/game.cpp -msgid "Fly mode enabled" -msgstr "Tha am modh sgiathaidh an comas" - -#: src/client/game.cpp -msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "Tha am modh sgiathaidh an comas (an aire: gun sochair “fly”)" - -#: src/client/game.cpp -msgid "Fly mode disabled" -msgstr "Tha am modh sgiathaidh à comas" - -#: src/client/game.cpp -msgid "Pitch move mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Pitch move mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fast mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "Tha am modh luath an comas (an aire: gun sochair “fast”)" - -#: src/client/game.cpp -msgid "Fast mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Noclip mode enabled" -msgstr "Tha am modh gun bhearradh an comas" - -#: src/client/game.cpp -msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "Tha am modh gun bhearradh an comas (an aire: gun sochair “noclip”)" - -#: src/client/game.cpp -msgid "Noclip mode disabled" -msgstr "Tha am modh gun bhearradh à comas" - -#: src/client/game.cpp -msgid "Cinematic mode enabled" -msgstr "Tha am modh film an comas" - -#: src/client/game.cpp -msgid "Cinematic mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Automatic forward enabled" +msgid "Access denied. Reason: %s" msgstr "" #: src/client/game.cpp @@ -1185,63 +1324,23 @@ msgid "Automatic forward disabled" msgstr "" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" +msgid "Automatic forward enabled" msgstr "" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" +msgid "Block bounds hidden" msgstr "" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" +msgid "Block bounds shown for all blocks" msgstr "" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" +msgid "Block bounds shown for current block" msgstr "" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap currently disabled by game or mod" -msgstr "" - -#: src/client/game.cpp -msgid "Fog disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fog enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Debug info shown" -msgstr "" - -#: src/client/game.cpp -msgid "Profiler graph shown" -msgstr "" - -#: src/client/game.cpp -msgid "Wireframe shown" -msgstr "" - -#: src/client/game.cpp -msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Debug info and profiler graph hidden" +msgid "Block bounds shown for nearby blocks" msgstr "" #: src/client/game.cpp @@ -1253,63 +1352,56 @@ msgid "Camera update enabled" msgstr "" #: src/client/game.cpp -#, c-format -msgid "Viewing range is at maximum: %d" -msgstr "Tha astar na faicsinn cho mòr sa ghabhas: %d" - -#: src/client/game.cpp -#, c-format -msgid "Viewing range changed to %d" +msgid "Can't show block bounds (disabled by mod or game)" msgstr "" #: src/client/game.cpp -#, c-format -msgid "Viewing range is at minimum: %d" +msgid "Change Password" msgstr "" #: src/client/game.cpp -msgid "Enabled unlimited viewing range" +msgid "Cinematic mode disabled" msgstr "" #: src/client/game.cpp -msgid "Disabled unlimited viewing range" +msgid "Cinematic mode enabled" +msgstr "Tha am modh film an comas" + +#: src/client/game.cpp +msgid "Client disconnected" msgstr "" #: src/client/game.cpp -msgid "Zoom currently disabled by game or mod" +msgid "Client side scripting is disabled" msgstr "" #: src/client/game.cpp -msgid "" -"Default Controls:\n" -"No menu visible:\n" -"- single tap: button activate\n" -"- double tap: place/use\n" -"- slide finger: look around\n" -"Menu/Inventory visible:\n" -"- double tap (outside):\n" -" -->close\n" -"- touch stack, touch slot:\n" -" --> move stack\n" -"- touch&drag, tap 2nd finger\n" -" --> place single item to slot\n" +msgid "Connecting to server..." msgstr "" #: src/client/game.cpp -#, c-format +msgid "Connection failed for unknown reason" +msgstr "" + +#: src/client/game.cpp +msgid "Continue" +msgstr "" + +#: src/client/game.cpp +#, fuzzy, c-format msgid "" "Controls:\n" "- %s: move forwards\n" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1329,19 +1421,57 @@ msgstr "" "- %s: cabadaich\n" #: src/client/game.cpp -msgid "Continue" +#, c-format +msgid "Couldn't resolve address: %s" msgstr "" #: src/client/game.cpp -msgid "Change Password" +msgid "Creating client..." msgstr "" #: src/client/game.cpp -msgid "Game paused" +msgid "Creating server..." msgstr "" #: src/client/game.cpp -msgid "Sound Volume" +msgid "Debug info and profiler graph hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info shown" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info, profiler graph, and wireframe hidden" +msgstr "" + +#: src/client/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/client/game.cpp +msgid "Disabled unlimited viewing range" +msgstr "" + +#: src/client/game.cpp +msgid "Enabled unlimited viewing range" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Error creating client: %s" msgstr "" #: src/client/game.cpp @@ -1352,39 +1482,88 @@ msgstr "" msgid "Exit to OS" msgstr "" +#: src/client/game.cpp +msgid "Fast mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "Tha am modh luath an comas (an aire: gun sochair “fast”)" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "Tha am modh sgiathaidh à comas" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "Tha am modh sgiathaidh an comas" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "Tha am modh sgiathaidh an comas (an aire: gun sochair “fly”)" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "" + #: src/client/game.cpp msgid "Game info:" msgstr "Fiosrachadh mun gheama:" #: src/client/game.cpp -#, fuzzy -msgid "- Mode: " -msgstr " " - -#: src/client/game.cpp -msgid "Remote server" +msgid "Game paused" msgstr "" -#: src/client/game.cpp -#, fuzzy -msgid "- Address: " -msgstr " " - #: src/client/game.cpp msgid "Hosting server" msgstr "" #: src/client/game.cpp -#, fuzzy -msgid "- Port: " -msgstr " " - -#: src/client/game.cpp -msgid "Singleplayer" +msgid "Item definitions..." msgstr "" #: src/client/game.cpp -msgid "On" +msgid "KiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Media..." +msgstr "" + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "Tha am modh gun bhearradh à comas" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "Tha am modh gun bhearradh an comas" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" +msgstr "Tha am modh gun bhearradh an comas (an aire: gun sochair “noclip”)" + +#: src/client/game.cpp +msgid "Node definitions..." msgstr "" #: src/client/game.cpp @@ -1392,34 +1571,106 @@ msgid "Off" msgstr "" #: src/client/game.cpp -msgid "- Damage: " -msgstr "– Dochann: " +msgid "On" +msgstr "" #: src/client/game.cpp -#, fuzzy -msgid "- Creative Mode: " -msgstr " " - -#. ~ PvP = Player versus Player -#: src/client/game.cpp -#, fuzzy -msgid "- PvP: " -msgstr " " +msgid "Pitch move mode disabled" +msgstr "" #: src/client/game.cpp -#, fuzzy -msgid "- Public: " -msgstr " " +msgid "Pitch move mode enabled" +msgstr "" #: src/client/game.cpp -#, fuzzy -msgid "- Server Name: " -msgstr " " +msgid "Profiler graph shown" +msgstr "" #: src/client/game.cpp -msgid "" -"\n" -"Check debug.txt for details." +msgid "Remote server" +msgstr "" + +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "" + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "" + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +msgstr "Tha astar na faicsinn cho mòr sa ghabhas: %d" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at minimum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "ok" +msgstr "" + +#: src/client/gameui.cpp +msgid "Chat hidden" msgstr "" #: src/client/gameui.cpp @@ -1427,7 +1678,7 @@ msgid "Chat shown" msgstr "Tha a’ chabadaich ’ga shealltainn" #: src/client/gameui.cpp -msgid "Chat hidden" +msgid "HUD hidden" msgstr "" #: src/client/gameui.cpp @@ -1435,7 +1686,7 @@ msgid "HUD shown" msgstr "" #: src/client/gameui.cpp -msgid "HUD hidden" +msgid "Profiler hidden" msgstr "" #: src/client/gameui.cpp @@ -1443,28 +1694,8 @@ msgstr "" msgid "Profiler shown (page %d of %d)" msgstr "" -#: src/client/gameui.cpp -msgid "Profiler hidden" -msgstr "" - #: src/client/keycode.cpp -msgid "Left Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "Middle Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "X Button 1" -msgstr "" - -#: src/client/keycode.cpp -msgid "X Button 2" +msgid "Apps" msgstr "" #: src/client/keycode.cpp @@ -1472,106 +1703,116 @@ msgid "Backspace" msgstr "Backspace" #: src/client/keycode.cpp -msgid "Tab" -msgstr "" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - -#: src/client/keycode.cpp -msgid "Return" -msgstr "" - -#: src/client/keycode.cpp -msgid "Shift" +msgid "Caps Lock" msgstr "" #: src/client/keycode.cpp msgid "Control" msgstr "" +#: src/client/keycode.cpp +msgid "Down" +msgstr "" + +#: src/client/keycode.cpp +msgid "End" +msgstr "" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "Control clì" + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "" + #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp msgid "Menu" msgstr "" #: src/client/keycode.cpp -msgid "Pause" +msgid "Middle Button" msgstr "" #: src/client/keycode.cpp -msgid "Caps Lock" +msgid "Num Lock" msgstr "" #: src/client/keycode.cpp -msgid "Space" +msgid "Numpad *" msgstr "" #: src/client/keycode.cpp -msgid "Page up" +msgid "Numpad +" msgstr "" #: src/client/keycode.cpp -msgid "Page down" +msgid "Numpad -" msgstr "" #: src/client/keycode.cpp -msgid "End" +msgid "Numpad ." msgstr "" #: src/client/keycode.cpp -msgid "Home" -msgstr "" - -#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -msgid "Left" -msgstr "" - -#: src/client/keycode.cpp -msgid "Up" -msgstr "" - -#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -msgid "Right" -msgstr "" - -#: src/client/keycode.cpp -msgid "Down" -msgstr "" - -#. ~ Key name -#: src/client/keycode.cpp -msgid "Select" -msgstr "" - -#. ~ "Print screen" key -#: src/client/keycode.cpp -msgid "Print" -msgstr "" - -#: src/client/keycode.cpp -msgid "Execute" -msgstr "" - -#: src/client/keycode.cpp -msgid "Snapshot" -msgstr "" - -#: src/client/keycode.cpp -msgid "Insert" -msgstr "" - -#: src/client/keycode.cpp -msgid "Help" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Windows" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Windows" +msgid "Numpad /" msgstr "" #: src/client/keycode.cpp @@ -1615,79 +1856,69 @@ msgid "Numpad 9" msgstr "" #: src/client/keycode.cpp -msgid "Numpad *" +msgid "OEM Clear" msgstr "" #: src/client/keycode.cpp -msgid "Numpad +" +msgid "Page down" msgstr "" #: src/client/keycode.cpp -msgid "Numpad ." +msgid "Page up" msgstr "" #: src/client/keycode.cpp -msgid "Numpad -" +msgid "Pause" msgstr "" #: src/client/keycode.cpp -msgid "Numpad /" +msgid "Play" +msgstr "" + +#. ~ "Print screen" key +#: src/client/keycode.cpp +msgid "Print" msgstr "" #: src/client/keycode.cpp -msgid "Num Lock" +msgid "Return" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" msgstr "" #: src/client/keycode.cpp -msgid "Scroll Lock" +msgid "Right Button" msgstr "" -#: src/client/keycode.cpp -msgid "Left Shift" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Shift" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Control" -msgstr "Control clì" - #: src/client/keycode.cpp msgid "Right Control" msgstr "" -#: src/client/keycode.cpp -msgid "Left Menu" -msgstr "" - #: src/client/keycode.cpp msgid "Right Menu" msgstr "" #: src/client/keycode.cpp -msgid "IME Escape" +msgid "Right Shift" msgstr "" #: src/client/keycode.cpp -msgid "IME Convert" +msgid "Right Windows" msgstr "" #: src/client/keycode.cpp -msgid "IME Nonconvert" +msgid "Scroll Lock" +msgstr "" + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" msgstr "" #: src/client/keycode.cpp -msgid "IME Accept" -msgstr "" - -#: src/client/keycode.cpp -msgid "IME Mode Change" -msgstr "" - -#: src/client/keycode.cpp -msgid "Apps" +msgid "Shift" msgstr "" #: src/client/keycode.cpp @@ -1695,37 +1926,57 @@ msgid "Sleep" msgstr "" #: src/client/keycode.cpp -msgid "Erase EOF" +msgid "Snapshot" msgstr "" #: src/client/keycode.cpp -msgid "Play" +msgid "Space" +msgstr "" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 2" msgstr "" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" msgstr "" -#: src/client/keycode.cpp -msgid "OEM Clear" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" msgstr "" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1733,31 +1984,19 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "Autoforward" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Double tap \"jump\" to toggle fly" -msgstr "Thoir gnogag dhùbailte air “leum” airson sgiathadh a thoglachadh" - #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "Key already in use" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "press key" -msgstr "brùth air iuchair" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Forward" +msgid "Aux1" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1765,105 +2004,97 @@ msgid "Backward" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Jump" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Sneak" -msgstr "Tàislich" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Drop" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inventory" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Prev. item" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Next item" +msgid "Block bounds" msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle minimap" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle fly" -msgstr "Toglaich sgiathadh" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle pitchmove" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle fast" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle noclip" -msgstr "Toglaich am modh gun bhearradh" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Mute" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Dec. volume" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inc. volume" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Autoforward" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Chat" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp -msgid "Screenshot" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Range select" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Dec. range" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inc. range" -msgstr "Meudaich an t-astar" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Console" +msgid "Chat" msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "Thoir gnogag dhùbailte air “leum” airson sgiathadh a thoglachadh" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "Meudaich an t-astar" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "Tàislich" + #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1872,12 +2103,36 @@ msgstr "" msgid "Toggle chat log" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "Toglaich sgiathadh" + #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "Toglaich am modh gun bhearradh" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "brùth air iuchair" + #: src/gui/guiPasswordChange.cpp -msgid "Old Password" +msgid "Change" msgstr "" #: src/gui/guiPasswordChange.cpp @@ -1885,18 +2140,13 @@ msgid "New Password" msgstr "" #: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" +msgid "Old Password" msgstr "" #: src/gui/guiPasswordChange.cpp -msgid "Change" +msgid "Passwords do not match!" msgstr "" -#: src/gui/guiVolumeChange.cpp -#, fuzzy -msgid "Sound Volume: " -msgstr " " - #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "" @@ -1905,11 +2155,10 @@ msgstr "" msgid "Muted" msgstr "" -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Cuir a-steach " +#: src/gui/guiVolumeChange.cpp +#, fuzzy, c-format +msgid "Sound Volume: %d%%" +msgstr " " #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1918,206 +2167,13 @@ msgstr "Cuir a-steach " msgid "LANG_CODE" msgstr "gd" -#: src/settings_translation_file.cpp -msgid "Controls" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Build inside player" -msgstr "" - -#: src/settings_translation_file.cpp +#: src/network/clientpackethandler.cpp msgid "" -"If enabled, you can place blocks at the position (feet + eye level) where " -"you stand.\n" -"This is helpful when working with nodeboxes in small areas." -msgstr "" -"Ma tha seo an comas, ’s urrainn dhut blocaichean a chur ann far a bheil thu ’" -"nad sheasamh (co chois + àirde do shùil).\n" -"Bidh seo feumail nuair a bhios tu ag obair le bogsaichean nòd ann an " -"raointean beaga." - -#: src/settings_translation_file.cpp -msgid "Flying" -msgstr "Sgiathadh" - -#: 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 "" -"’S urrainn dhan chluicheadair sgiathadh gun bhuaidh na iom-tharraing air.\n" -"Bidh feum air sochair “fly” air an fhrithealaiche." - -#: src/settings_translation_file.cpp -msgid "Pitch move mode" +"Name is not registered. To create an account on this server, click 'Register'" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"If enabled, makes move directions relative to the player's pitch when flying " -"or swimming." -msgstr "" -"Ma tha seo an comas, bidh an gluasad a-rèir pids a’ chluicheadair rè " -"sgiathaidh no snàimh." - -#: src/settings_translation_file.cpp -msgid "Fast movement" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Fast movement (via the \"special\" key).\n" -"This requires the \"fast\" privilege on the server." -msgstr "" -"Gluasad luath (leis an iuchair “shònraichte”).\n" -"Bidh feum air sochair “fast” air an fhrithealaiche." - -#: src/settings_translation_file.cpp -msgid "Noclip" -msgstr "Gun bhearradh" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled together with fly mode, player is able to fly through solid " -"nodes.\n" -"This requires the \"noclip\" privilege on the server." -msgstr "" -"Ma tha seo an comas còmhla ris a’ mhodh sgiathaidh, ’s urrainn dhan " -"chluicheadair sgiathadh tro nòdan soladach.\n" -"Bidh feum air sochair “noclip” on fhrithealaiche." - -#: src/settings_translation_file.cpp -msgid "Cinematic mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Smooths camera when looking around. Also called look or mouse smoothing.\n" -"Useful for recording videos." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera smoothing" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Smooths rotation of camera. 0 to disable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera smoothing in cinematic mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Smooths rotation of camera in cinematic mode. 0 to disable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Invert mouse" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Invert vertical mouse movement." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity multiplier." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" -"descending." -msgstr "" -"Ma tha seo an comas, thèid iuchair “shònraichte” seach “tàisleachaidh” a " -"chleachdadh\n" -"airson dìreadh." - -#: src/settings_translation_file.cpp -msgid "Double tap jump for fly" -msgstr "Thoir gnogag dhùbailte airson leum no sgiathadh" - -#: src/settings_translation_file.cpp -msgid "Double-tapping the jump key toggles fly mode." -msgstr "Toglaichidh gnogag dhùbailte air iuchair an leuma am modh sgiathaidh." - -#: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "Sgiathaich an-còmhnaidh ’s gu luath" - -#: src/settings_translation_file.cpp -msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" -"enabled." -msgstr "" -"Ma tha seo à comas, thèid iuchair “shònraichte” a chleachdadh airson " -"sgiathadh\n" -"ma tha an dà chuid am modh sgiathaidh ’s am modh luadh an comas." - -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatically jump up single-node obstacles." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Safe digging and placing" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Random input" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable random user input (only used for testing)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Continuous forward" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Touch screen threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The length in pixels it takes for touch screen interaction to start." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fixed virtual joystick" +#: src/network/clientpackethandler.cpp +msgid "Name is taken. Please choose another name" msgstr "" #: src/settings_translation_file.cpp @@ -2126,1425 +2182,225 @@ msgid "" "If disabled, virtual joystick will center to first-touch's position." msgstr "" -#: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "" - #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" -#: src/settings_translation_file.cpp -msgid "Enable joysticks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick ID" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The identifier of the joystick to use" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick type" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The type of joystick" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick button repetition interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated events\n" -"when holding down a joystick button combination." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick frustum sensitivity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Forward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player forward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Backward key" -msgstr "" - #: src/settings_translation_file.cpp msgid "" -"Key for moving the player backward.\n" -"Will also disable autoforward, when active.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Left key" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"situations.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Key for moving the player left.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"Default is for a vertically-squashed shape suitable for\n" +"an island, set all 3 numbers equal for the raw shape." msgstr "" -"An iuchair a ghluaiseas an cluicheadair dhan taobh chlì.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -msgid "Right key" +msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Key for moving the player right.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a ghluaiseas an cluicheadair dhan taobh deas.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +msgid "2D noise that controls the shape/size of rolling hills." +msgstr "Riasladh 2D a stiùiricheas cruth/meud nan cnoc." #: src/settings_translation_file.cpp -msgid "Jump key" +msgid "2D noise that controls the shape/size of step mountains." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Key for jumping.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." msgstr "" #: src/settings_translation_file.cpp -msgid "Sneak key" -msgstr "Iuchair an tàisleachaidh" - -#: src/settings_translation_file.cpp -msgid "" -"Key for sneaking.\n" -"Also used for climbing down and descending in water if aux1_descends is " -"disabled.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair airson tàisleachadh.\n" -"Tha i ‘ga cleachdadh airson dìreadh agus dìreadh san uisge ma bhios " -"aux1_descends à comas.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Inventory key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the inventory.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving fast in fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +msgid "2D noise that controls the size/occurrence of rolling hills." msgstr "" -"An iuchair a ghluaiseas gu luath sa mhodh luath.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -msgid "Chat key" +msgid "2D noise that controls the size/occurrence of step mountain ranges." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Command key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type local commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Range select key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling unlimited view range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fly key" -msgstr "Iuchair an sgiathaidh" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling flying.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thoglaicheas an sgiathadh.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Pitch move key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling pitch move mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noclip key" -msgstr "Iuchair modha gun bhearradh" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling noclip mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thoglaicheas am modh gun bhearradh.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar next key" -msgstr "Iuchair air adhart a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the next item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an ath-nì air a’ ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar previous key" -msgstr "Iuchair air ais a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the previous item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an nì roimhe air a’ ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Mute key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for muting the game.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Inc. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatic forward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling autoforward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cinematic mode key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling cinematic mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling display of minimap.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for taking screenshots.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Drop item key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for dropping the currently selected item.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View zoom key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key to use view zoom when possible.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 1 key" -msgstr "Iuchair air slot 1 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the first hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas a’ chiad slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 2 key" -msgstr "Iuchair air slot 2 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the second hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an dàrna slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 3 key" -msgstr "Iuchair air slot 3 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the third hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an treas slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 4 key" -msgstr "Iuchair air slot 4 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fourth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an ceathramh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 5 key" -msgstr "Iuchair air slot 5 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fifth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an còigeamh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 6 key" -msgstr "Iuchair air slot 6 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the sixth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an siathamh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 7 key" -msgstr "Iuchair air slot 7 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the seventh hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an seachdamh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 8 key" -msgstr "Iuchair air slot 8 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the eighth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an t-ochdamh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 9 key" -msgstr "Iuchair air slot 9 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the ninth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an naoidheamh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 10 key" -msgstr "Iuchair air slot 10 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the tenth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an deicheamh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 11 key" -msgstr "Iuchair air slot 11 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 11th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 11mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 12 key" -msgstr "Iuchair air slot 12 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 12th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 12mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 13 key" -msgstr "Iuchair air slot 13 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 13th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 13mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 14 key" -msgstr "Iuchair air slot 14 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 14th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 14mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 15 key" -msgstr "Iuchair air slot 15 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 15th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 15mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 16 key" -msgstr "Iuchair air slot 16 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 16th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 16mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 17 key" -msgstr "Iuchair air slot 17 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 17th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 17mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 18 key" -msgstr "Iuchair air slot 18 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 18th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 18mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 19 key" -msgstr "Iuchair air slot 19 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 19th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas an 19mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 20 key" -msgstr "Iuchair air slot 20 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 20th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 20mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 21 key" -msgstr "Iuchair air slot 21 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 21st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 21mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 22 key" -msgstr "Iuchair air slot 22 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 22nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 22mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 23 key" -msgstr "Iuchair air slot 23 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 23rd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 23mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 24 key" -msgstr "Iuchair air slot 24 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 24th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 24mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 25 key" -msgstr "Iuchair air slot 25 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 25th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 25mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 26 key" -msgstr "Iuchair air slot 26 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 26th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 26mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 27 key" -msgstr "Iuchair air slot 27 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 27th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 27mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 28 key" -msgstr "Iuchair air slot 28 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 28th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 28mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 29 key" -msgstr "Iuchair air slot 29 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 29th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 29mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 30 key" -msgstr "Iuchair air slot 30 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 30th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 30mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 31 key" -msgstr "Iuchair air slot 31 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 31st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 31mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 32 key" -msgstr "Iuchair air slot 32 a’ ghrad-bhàr" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 32nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"An iuchair a thaghas am 32mh slot dhen ghrad-bhàr.\n" -"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "HUD toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the HUD.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of chat.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large chat console key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the large chat console.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of fog.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera update toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the camera update. Only used for development\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug info toggle key" -msgstr "Iuchair toglachadh an fhiosrachaidh dì-bhugachaidh" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of debug info.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the profiler. Used for development.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Toggle camera mode key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for switching between first- and third-person camera.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range increase key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range decrease key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Graphics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VBO" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable vertex buffer objects.\n" -"This should greatly improve graphics performance." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to fog out the end of the visible area." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Leaves style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Leaves style:\n" -"- Fancy: all faces visible\n" -"- Simple: only outer faces, if defined special_tiles are used\n" -"- Opaque: disable transparency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Connect glass" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Connects glass if supported by node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Smooth lighting" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable smooth lighting with simple ambient occlusion.\n" -"Disable for speed or for different looks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clouds" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clouds are a client side effect." -msgstr "" +msgid "2D noise that locates the river valleys and channels." +msgstr "Riasladh 2D a shuidhicheas glinn is sruthan nan aibhnean." #: src/settings_translation_file.cpp msgid "3D clouds" msgstr "" #: src/settings_translation_file.cpp -msgid "Use 3D cloud look instead of flat." +msgid "3D mode" msgstr "" #: src/settings_translation_file.cpp -msgid "Node highlighting" +msgid "3D mode parallax strength" msgstr "" #: src/settings_translation_file.cpp -msgid "Method used to highlight selected object." +msgid "3D noise defining giant caverns." msgstr "" #: src/settings_translation_file.cpp -msgid "Digging particles" +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" +"Riasladh 3D a mhìnicheas structar is àirde nam beanntan.\n" +"Mìnichidh e cruth-tìre nam beanntan air tìr air fhleòd cuideachd." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"to be adjusted, as floatland tapering functions best when this noise has\n" +"a value range of approximately -2.0 to 2.0." +msgstr "" +"Riasladh 3D a mhìnicheas structar na tìre air fhleòd.\n" +"Mura cleachd thu an luach bunaiteach, dh’fhaoidte gum b’ fheàirrde thu\n" +"gleus a chur air “scale” an riaslaidh (0.7 a ghnàth) on a dh’obraicheas " +"foincseanan\n" +"cinn-chaoil as fheàrr nuair a bhios an riasladh seo eadar mu -2.0 agus 2.0." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "Riasladh 3D a mhìnicheas structar ballachan sgoltaidhean-aibhne." + +#: src/settings_translation_file.cpp +msgid "3D noise defining terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise that determines number of dungeons per mapchunk." +msgstr "" +"Riasladh 3D a mhìnicheas an àireamh dhe thuill-dhubha anns gach cnap mapa." + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- crossview: Cross-eyed 3d\n" +"- pageflip: quadbuffer based 3d.\n" +"Note that the interlaced mode requires shaders to be enabled." +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." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of queued blocks to emerge" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration of gravity, in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." msgstr "" #: src/settings_translation_file.cpp msgid "Adds particles when digging a node." msgstr "" -#: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mipmapping" -msgstr "" - #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" -"especially when using a high resolution texture pack.\n" -"Gamma correct downscaling is not supported." +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." msgstr "" #: src/settings_translation_file.cpp -msgid "Anisotropic filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use anisotropic filtering when viewing at textures from an angle." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bilinear filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use bilinear filtering when scaling textures." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trilinear filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use trilinear filtering when scaling textures." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clean transparent textures" +msgid "Adjust the detected display density, used for scaling UI elements." msgstr "" #: src/settings_translation_file.cpp +#, c-format msgid "" -"Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" +"to be sure) creates a solid floatland layer." msgstr "" #: src/settings_translation_file.cpp -msgid "Minimum texture size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" -"can be blurred, so automatically upscale them with nearest-neighbor\n" -"interpolation to preserve crisp pixels. This sets the minimum texture size\n" -"for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" -"This is also used as the base node texture size for world-aligned\n" -"texture autoscaling." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FSAA" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Undersampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Undersampling is similar to using a lower screen resolution, but it applies\n" -"to the game world only, keeping the GUI intact.\n" -"It should give a significant performance boost at the cost of less detailed " -"image.\n" -"Higher values result in a less detailed image." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shaders allow advanced visual effects and may increase performance on some " -"video\n" -"cards.\n" -"This only works with the OpenGL video backend." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shader path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to shader directory. If no path is defined, default location will be " -"used." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filmic tone mapping" -msgstr "Mapadh tòna film" - -#: src/settings_translation_file.cpp -msgid "" -"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" -"Simulates the tone curve of photographic film and how this approximates the\n" -"appearance of high dynamic range images. Mid-range contrast is slightly\n" -"enhanced, highlights and shadows are gradually compressed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" -"Claonadh na h-èifeachd occlusion na paraileig air fheadh, seo sgèile/2 mar " -"as àbhaist." - -#: src/settings_translation_file.cpp -msgid "Waving Nodes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving liquids (like water).\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wave height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The maximum height of the surface of waving liquids.\n" -"4.0 = Wave height is two nodes.\n" -"0.0 = Wave doesn't move at all.\n" -"Default is 1.0 (1/2 node).\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wavelength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of liquid waves.\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wave speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How fast liquid waves will move. Higher = faster.\n" -"If negative, liquid waves will move backwards.\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving leaves" -msgstr "Crathadh duillich" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving leaves.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving plants" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving plants.\n" -"Requires shaders to be enabled." +msgid "Admin name" msgstr "" #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" -#: src/settings_translation_file.cpp -msgid "Arm inertia" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Arm inertia, gives a more realistic movement of\n" -"the arm when the camera moves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Pause on lost window focus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Open the pause menu when the window's focus is lost. Does not pause if a " -"formspec is\n" -"open." -msgstr "" -"Fosgail clàr-taice a’ chuir ’na stad nuair a chailleas an uinneag am fòcas.\n" -"Cha dèid a chur ’na stad nuair a bhios formspec fosgailte." - -#: src/settings_translation_file.cpp -msgid "Viewing range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View distance in nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Near plane" -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" -"Increasing can reduce artifacting on weaker GPUs.\n" -"0.1 = Default, 0.25 = Good value for weaker tablets." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autosave screen size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save window size automatically when modified." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VSync" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical screen synchronization." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view in degrees." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve gamma" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Alters the light curve by applying 'gamma correction' to it.\n" @@ -3560,459 +2416,32 @@ msgstr "" "agus cha mhòr nach bi buaidh air solas oidhche nàdarra idir." #: src/settings_translation_file.cpp -msgid "Light curve low gradient" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Gradient of light curve at minimum light level.\n" -"Controls the contrast of the lowest light levels." -msgstr "" -"Caisead lùb an t-solais aig an ìre as fainne.\n" -"Stiùirichidh seo iomsgaradh an t-solais fhainn." - -#: src/settings_translation_file.cpp -msgid "Light curve high gradient" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Gradient of light curve at maximum light level.\n" -"Controls the contrast of the highest light levels." -msgstr "" -"Caisead lùb an t-solais aig an ìre as soilleire.\n" -"Stiùirichidh seo iomsgaradh an t-solais shoilleir." - -#: src/settings_translation_file.cpp -msgid "Light curve boost" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Strength of light curve boost.\n" -"The 3 'boost' parameters define a range of the light\n" -"curve that is boosted in brightness." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost center" -msgstr "" - -#: 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 "" -"Meadhan rainse meudachadh lùb an t-solais.\n" -"Is 0.0 an ìre as fhainne agus 1.0 an ìre as soilleire air an solas." - -#: src/settings_translation_file.cpp -msgid "Light curve boost spread" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Spread of light curve boost range.\n" -"Controls the width of the range to be boosted.\n" -"Standard deviation of the light curve boost Gaussian." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Texture path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Path to texture directory. All textures are first searched from here." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Video driver" -msgstr "Dràibhear video" - -#: src/settings_translation_file.cpp -msgid "" -"The rendering back-end for Irrlicht.\n" -"A restart is required after changing this.\n" -"Note: On Android, stick with OGLES1 if unsure! App may fail to start " -"otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cloud radius" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Radius of cloud area stated in number of 64 node cloud squares.\n" -"Values larger than 26 will start to produce sharp cutoffs at cloud area " -"corners." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View bobbing factor" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Fall bobbing factor" -msgstr "Factar bogadaich an tuiteim" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "3D mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"3D support.\n" -"Currently supported:\n" -"- none: no 3d output.\n" -"- anaglyph: cyan/magenta color 3d.\n" -"- interlaced: odd/even line based polarisation screen support.\n" -"- topbottom: split screen top/bottom.\n" -"- sidebyside: split screen side by side.\n" -"- crossview: Cross-eyed 3d\n" -"- pageflip: quadbuffer based 3d.\n" -"Note that the interlaced mode requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D mode parallax strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of 3D mode parallax." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Full-Screen Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec full-screen background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Full-Screen Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec full-screen background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box border color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width of the selection box lines around nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Recent Chat Messages" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of recent chat messages to show" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum hotbar width" -msgstr "Leud as motha a’ ghrad-bhàr" - -#: 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 "" -"A’ chuid as motha dhen uinneag làithreach a thèid a chleachdadh airson a’ " -"ghrad-bhàr.\n" -"Tha seo feumail ma dh’fheumas tu rudeigin a shealltainn taobh deas no clì " -"air a’ ghrad-bhàr." - -#: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mesh cache" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables caching of facedir rotated meshes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock mesh generation delay" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Size of the MapBlock cache of the mesh generator. Increasing this will\n" -"increase the cache hit %, reducing the data being copied from the main\n" -"thread, thus reducing jitter." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables minimap." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Round minimap" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shape of the minimap. Enabled = round, disabled = square." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap scan height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"True = 256\n" -"False = 128\n" -"Usable to make minimap smoother on slower machines." -msgstr "" -"True = 256\n" -"False = 128\n" -"Gabhaidh a chleachdadh airson am meanbh-mhapa a dhèanamh nas rèidhe air " -"uidheaman slaodach." - -#: src/settings_translation_file.cpp -msgid "Colored fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." -msgstr "" +#, fuzzy +msgid "Always fly fast" +msgstr "Sgiathaich an-còmhnaidh ’s gu luath" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"The strength (darkness) of node ambient-occlusion shading.\n" -"Lower is darker, Higher is lighter. The valid range of values for this\n" -"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." +msgid "Amount of messages a player may send per 10 seconds." msgstr "" #: src/settings_translation_file.cpp -msgid "Inventory items animations" +msgid "Amplifies the valleys." +msgstr "Meudaichidh seo na glinn." + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" msgstr "" #: src/settings_translation_file.cpp -msgid "Enables animation of inventory items." -msgstr "" +msgid "Announce server" +msgstr "Ainmich am frithealaiche" #: src/settings_translation_file.cpp -msgid "Fog start" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Opaque liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" -msgstr "Dèan gach lionn trìd-dhoilleir" - -#: src/settings_translation_file.cpp -msgid "World-aligned textures mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Textures on a node may be aligned either to the node or to the world.\n" -"The former mode suits better things like machines, furniture, etc., while\n" -"the latter makes stairs and microblocks fit surroundings better.\n" -"However, as this possibility is new, thus may not be used by older servers,\n" -"this option allows enforcing it for certain node types. Note though that\n" -"that is considered EXPERIMENTAL and may not work properly." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autoscaling mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"World-aligned textures may be scaled to span several nodes. However,\n" -"the server may not send the scale you want, especially if you use\n" -"a specially-designed texture pack; with this option, the client tries\n" -"to determine the scale automatically basing on the texture size.\n" -"See also texture_min_size.\n" -"Warning: This option is EXPERIMENTAL!" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Show entity selection boxes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clouds in menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use a cloud animation for the main menu background." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Scale GUI by a user specified value.\n" -"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" -"This will smooth over some of the rough edges, and blend\n" -"pixels when scaling down, at the cost of blurring some\n" -"edge pixels when images are scaled by non-integer sizes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling filter" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When gui_scaling_filter is true, all GUI images need to be\n" -"filtered in software, but some images are generated directly\n" -"to hardware (e.g. render-to-texture for nodes in inventory)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling filter txr2img" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When gui_scaling_filter_txr2img is true, copy those images\n" -"from hardware to software for scaling. When false, fall back\n" -"to the old scaling method, for video drivers that don't\n" -"properly support downloading textures back from hardware." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Tooltip delay" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay showing tooltips, stated in milliseconds." +msgid "Announce to this serverlist." msgstr "" #: src/settings_translation_file.cpp @@ -4024,1083 +2453,23 @@ msgid "Append item name to tooltip." msgstr "" #: src/settings_translation_file.cpp -msgid "FreeType fonts" +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font bold by default" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font italic by default" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " -"drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Regular font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"The fallback font will be used if the font cannot be loaded." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font path" -msgstr "Slighe dhan chlò aon-leud" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font is used for e.g. the console and profiler screen." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font will be used for certain languages or if the default font is " -"unavailable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat font size" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Screenshot folder" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Screenshot format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Format of screenshots." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screenshot quality" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Screenshot quality. Only used for JPEG format.\n" -"1 means worst quality; 100 means best quality.\n" -"Use 0 for default quality." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "DPI" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " -"screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable console window" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Windows systems only: Start Minetest with the command line window in the " -"background.\n" -"Contains the same information as the file debug.txt (default name)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables the sound system.\n" -"If disabled, this completely disables all sounds everywhere and the in-game\n" -"sound controls will be non-functional.\n" -"Changing this setting requires a restart." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Volume" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Volume of all sounds.\n" -"Requires the sound system to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mute sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to mute sounds. You can unmute sounds at any time, unless the\n" -"sound system is disabled (enable_sound=false).\n" -"In-game, you can toggle the mute state with the mute key or by using the\n" -"pause menu." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Address to connect to.\n" -"Leave this blank to start a local server.\n" -"Note that the address field in the main menu overrides this setting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Remote port" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Prometheus listener address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" -"enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Saving map received from server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save the map received by the client on disk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Connect to external media server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable usage of remote media server (if provided by server).\n" -"Remote servers offer a significantly faster way to download media (e.g. " -"textures)\n" -"when connecting to the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client modding" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable Lua modding support on client.\n" -"This support is experimental and API can change." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Serverlist URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "URL to the server list displayed in the Multiplayer Tab." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Serverlist file" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"File in client/serverlist/ that contains your favorite servers displayed in " -"the\n" -"Multiplayer Tab." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum size of the out chat queue" -msgstr "" - -#: 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 "" - -#: 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 "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Timeout for client to remove unused map data from memory." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock limit" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Show debug info" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to show the client debug info (has the same effect as hitting F5)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the server, to be displayed when players join and in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server description" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Description of server, to be displayed when players join and in the " -"serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Domain name of server, to be displayed in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Homepage of server, to be displayed in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Announce server" -msgstr "Ainmich am frithealaiche" - -#: src/settings_translation_file.cpp -msgid "Automatically report to the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Announce to this serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strip color codes" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Server port" -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 "Bind address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The network interface that the server listens on." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strict protocol checking" -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 " -"connecting\n" -"to new servers, but they may not support all new features that you are " -"expecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Remote media" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Specifies URL from which client fetches media instead of using UDP.\n" -"$filename should be accessible from $remote_media$filename via cURL\n" -"(obviously, remote_media should end with a slash).\n" -"Files that are not present will be fetched the usual way." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "IPv6 server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable/disable running an IPv6 server.\n" -"Ignored if bind_address is set.\n" -"Needs enable_ipv6 to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum simultaneous block sends per client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of blocks that are simultaneously sent per client.\n" -"The maximum total count is calculated dynamically:\n" -"max_total = ceil((#clients + max_users) * per_client / 4)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"To reduce lag, block transfers are slowed down when a player is building " -"something.\n" -"This determines how long they are slowed down after placing or removing a " -"node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. packets per iteration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of packets sent per send step, if you have a slow connection\n" -"try reducing it, but don't reduce it to a number below double of targeted\n" -"client number." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default game" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Message of the day" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Message of the day displayed to players connecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of players that can be connected simultaneously." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map directory" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Item entity TTL" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Default stack size" -msgstr "" - -#: src/settings_translation_file.cpp -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 "" - -#: src/settings_translation_file.cpp -msgid "Damage" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable players getting damage and dying." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Creative" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fixed map seed" -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 "" - -#: src/settings_translation_file.cpp -msgid "Default password" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "New users need to input this password." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default privileges" -msgstr "Sochairean tùsail" - -#: 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 "" -"Na sochairean a gheibh cleachdaichean ùra gu fèin-obrachail.\n" -"Faic /privs sa gheama airson liosta slàn air rèiteachadh an fhrithealaiche ’" -"s nan tuilleadan agad." - -#: src/settings_translation_file.cpp -msgid "Basic privileges" -msgstr "Sochairean bunasach" - -#: src/settings_translation_file.cpp -msgid "Privileges that players with basic_privs can grant" -msgstr "Sochairean as urrainn do chluicheadairean le basic_privs a cheadachadh" - -#: src/settings_translation_file.cpp -msgid "Unlimited player transfer distance" -msgstr "Astar tar-chur nan cluicheadairean gun chuingeachadh" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Player transfer distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." -msgstr "" -"Mìnichidh seo an t-astar as motha airson tar-chur chluicheadairean ann am " -"bloca (0 = gun chuingeachadh)." - -#: src/settings_translation_file.cpp -msgid "Player versus player" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to allow players to damage and kill each other." -msgstr "" -"Co-dhiù am faod cluicheadairean càch a chèile a leòn ’s a mharbhadh gus nach " -"fhaod." - -#: src/settings_translation_file.cpp -msgid "Mod channels" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod channels support." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Static spawnpoint" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If this is set, players will always (re)spawn at the given position." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disallow empty passwords" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, new players cannot join with an empty password." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disable anticheat" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rollback recording" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, actions are recorded for rollback.\n" -"This option is only read when server starts." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Format of player chat messages. The following strings are valid " -"placeholders:\n" -"@name, @message, @timestamp (optional)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shutdown message" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crash message" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "A message to be displayed to all clients when the server crashes." +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." msgstr "" #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" msgstr "" -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Active object send range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far clients know about objects, stated in mapblocks (16 nodes).\n" -"\n" -"Setting this larger than active_block_range will also cause the server\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Active block range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The radius of the volume of blocks around every player that is subject to " -"the\n" -"active block stuff, stated in mapblocks (16 nodes).\n" -"In active blocks objects are loaded and ABMs run.\n" -"This is also the minimum range in which active objects (mobs) are " -"maintained.\n" -"This should be configured together with active_object_send_range_blocks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max block send distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum forceloaded blocks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of forceloaded mapblocks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time send interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls length of day/night cycle.\n" -"Examples:\n" -"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "World start time" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time of day when a new world is started, in millihours (0-23999)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map save interval" -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 "Chat message max length" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message count limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amount of messages a player may send per 10 seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message kick threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Kick players who sent more than X messages per 10 seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Physics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default acceleration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal and vertical acceleration on ground or when climbing,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Acceleration in air" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal acceleration in air when jumping or falling,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast mode acceleration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal and vertical acceleration in fast mode,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking and flying speed, in nodes per second." -msgstr "Luaths na coiseachd is sgiathaidh, ann an nòd gach diog." - -#: src/settings_translation_file.cpp -msgid "Sneaking speed" -msgstr "Luaths an tàisleachaidh" - -#: src/settings_translation_file.cpp -msgid "Sneaking speed, in nodes per second." -msgstr "Luaths an tàisleachaidh ann an nòd gach diog." - -#: src/settings_translation_file.cpp -msgid "Fast mode speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking, flying and climbing speed in fast mode, in nodes per second." -msgstr "" -"Luaths na coiseachd, sgiathaidh is sreap sa mhodh luath, ann an nòd gach " -"diog." - -#: src/settings_translation_file.cpp -msgid "Climbing speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical climbing speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Jumping speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid fluidity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid fluidity smoothing" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum liquid resistance. Controls deceleration when entering liquid at\n" -"high speed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid sinking" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Gravity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Deprecated Lua API handling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" -"- error: abort on usage of deprecated call (suggested for mod developers)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. clearobjects extra blocks" -msgstr "" - -#: src/settings_translation_file.cpp -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 "Unload unused server data" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How much the server will wait before unloading unused mapblocks.\n" -"Higher value is smoother, but will use more RAM." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum objects per block" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of statically stored objects in a block." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Synchronous SQLite" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dedicated server step" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of a server tick and the interval at which objects are generally " -"updated over\n" -"network." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active block management interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between active block management cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "ABM interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "NodeTimer interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between NodeTimer execution cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ignore world errors" -msgstr "Leig seachad mearachdan an t-saoghail" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Liquid loop max" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max liquids processed per step." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid queue purge time" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time (in seconds) that the liquids queue may grow beyond processing\n" -"capacity until an attempt is made to decrease its size by dumping old queue\n" -"items. A value of 0 disables the functionality." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid update tick" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid update interval in seconds." -msgstr "Eadaramh nan ùrachaidhean air an lionn ann an diog." - -#: src/settings_translation_file.cpp -msgid "Block send optimize distance" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "At this distance the server will aggressively optimize which blocks are sent " @@ -5117,71 +2486,315 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server side occlusion culling" +msgid "Audio" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "Àirde bhunasach a’ ghrunnda" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "Sochairean bunasach" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome API noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Builtin" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera" msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled the server will perform map block occlusion culling based on\n" -"on the eye position of the player. This can reduce the number of blocks\n" -"sent to the client 50-80%. The client will not longer receive most " -"invisible\n" -"so that the utility of noclip mode is reduced." +"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 "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +msgstr "" + +#: 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 "" +"Meadhan rainse meudachadh lùb an t-solais.\n" +"Is 0.0 an ìre as fhainne agus 1.0 an ìre as soilleire air an solas." + +#: src/settings_translation_file.cpp +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Tha a’ chabadaich ’ga shealltainn" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "Ìre loga na cabadaich" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat weblinks" +msgstr "Tha a’ chabadaich ’ga shealltainn" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "Meud nan cnapan" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" msgstr "" #: src/settings_translation_file.cpp msgid "Client side modding restrictions" msgstr "Cuingeachadh tuilleadain air a’ chliant" -#: src/settings_translation_file.cpp -msgid "" -"Restricts the access of certain client-side functions on servers.\n" -"Combine the byteflags below to restrict client-side features, or set to 0\n" -"for no restrictions:\n" -"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" -"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" -"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" -"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" -"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" -"csm_restriction_noderange)\n" -"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" -msgstr "" - #: src/settings_translation_file.cpp msgid "Client side node lookup range restriction" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"If the CSM restriction for node range is enabled, get_node calls are " -"limited\n" -"to this distance from the player to the node." +#, fuzzy +msgid "Client-side Modding" +msgstr "Cuingeachadh tuilleadain air a’ chliant" + +#: src/settings_translation_file.cpp +msgid "Climbing speed" msgstr "" #: src/settings_translation_file.cpp -msgid "Security" +msgid "Cloud radius" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable mod security" +msgid "Clouds" msgstr "" #: src/settings_translation_file.cpp -msgid "Prevent mods from doing insecure things like running shell commands." +msgid "Clouds are a client side effect." msgstr "" #: src/settings_translation_file.cpp -msgid "Trusted mods" +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" msgstr "" #: 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 "" - -#: src/settings_translation_file.cpp -msgid "HTTP mods" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" #: src/settings_translation_file.cpp @@ -5191,374 +2804,105 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Profiling" +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 "" #: src/settings_translation_file.cpp -msgid "Load the game profiler" +msgid "Command key" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Load the game profiler to collect game profiling data.\n" -"Provides a /profiler command to access the compiled profile.\n" -"Useful for mod developers and server operators." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default report format" +"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 "" #: src/settings_translation_file.cpp msgid "" -"The default format in which profiles are being saved,\n" -"when calling `/profiler save [format]` without format." +"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 "" #: src/settings_translation_file.cpp -msgid "Report path" +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" msgstr "" #: src/settings_translation_file.cpp msgid "" -"The file path relative to your worldpath in which profiles will be saved to." +"Continuous forward movement, toggled by autoforward key.\n" +"Press the autoforward key again or the backwards movement to disable." msgstr "" #: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Entity methods" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument the methods of entities on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active Block Modifiers" +msgid "Controls" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Instrument the action function of Active Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Loading Block Modifiers" +"Controls length of day/night cycle.\n" +"Examples:\n" +"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Instrument the action function of Loading Block Modifiers on registration." +"Controls sinking speed in liquid when idling. Negative values will cause\n" +"you to rise instead." msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Controls steepness/depth of lake depressions." msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Global callbacks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument global callback functions on registration.\n" -"(anything you pass to a minetest.register_*() function)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Builtin" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument builtin.\n" -"This is usually only needed by core/builtin contributors" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Have the profiler instrument itself:\n" -"* Instrument an empty function.\n" -"This estimates the overhead, that instrumentation is adding (+1 function " -"call).\n" -"* Instrument the sampler being used to update the statistics." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client and Server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the player.\n" -"When running a server, clients connecting with this name are admins.\n" -"When starting from the main menu, this is overridden." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Language" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Debug log level" -msgstr "Ìre an loga dì-bhugachaidh" - -#: src/settings_translation_file.cpp -msgid "" -"Level of logging to be written to debug.txt:\n" -"- <nothing> (no logging)\n" -"- none (messages with no level)\n" -"- error\n" -"- warning\n" -"- action\n" -"- info\n" -"- verbose" -msgstr "" -"Ìre an loga a thèid a sgrìobhadh gu debug.txt:\n" -"- <bàn> (gun logadh)\n" -"- none (teachdaireachdan gun ìre)\n" -"- error\n" -"- warning\n" -"- action\n" -"- info\n" -"- verbose" - -#: src/settings_translation_file.cpp -msgid "Debug log file size threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the file size of debug.txt exceeds the number of megabytes specified in\n" -"this setting when it is opened, the file is moved to debug.txt.1,\n" -"deleting an older debug.txt.1 if it exists.\n" -"debug.txt is only moved if this setting is positive." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat log level" -msgstr "Ìre loga na cabadaich" - -#: src/settings_translation_file.cpp -msgid "Minimal level of logging to be written to chat." -msgstr "An ìre as lugha dhen loga a thèid a sgrìobhadh dhan chabadaich." - -#: src/settings_translation_file.cpp -msgid "IPv6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable IPv6 support (for both client and server).\n" -"Required for IPv6 connections to work at all." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL parallel limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Limits number of parallel HTTP requests. Affects:\n" -"- Media fetch if server uses remote_media setting.\n" -"- Serverlist download and server announcement.\n" -"- Downloads performed by main menu (e.g. mod manager).\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL file download timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu script" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Replaces the default main menu with a custom one." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Engine profiling data print interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Print the engine's profiling data in regular intervals (in seconds).\n" -"0 = disable. Useful for developers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen name" -msgstr "Ainm gineadair nam mapa" - -#: src/settings_translation_file.cpp -msgid "" -"Name of map generator to be used when creating a new world.\n" -"Creating a world in the main menu will override this.\n" -"Current mapgens in a highly unstable state:\n" -"- The optional floatlands of v7 (disabled by default)." -msgstr "" -"Ainm air gineadair nam mapa a thèid a chleachdadh airson saoghal ùr a " -"chruthachadh.\n" -"Tar-aithnidh cruthachadh saoghail ùir sa phrìomh chlàr-taice seo.\n" -"Seo gineadairean nam mapa a tha glè neo-sheasmhach aig an àm seo:\n" -"- floatlands roghainneil aig v7 (à comas o thùs)." - -#: src/settings_translation_file.cpp -msgid "Water level" -msgstr "Àirde an uisge" - -#: src/settings_translation_file.cpp -msgid "Water surface level of the world." -msgstr "Àirde uachdar an uisge air an t-saoghal." - -#: src/settings_translation_file.cpp -msgid "Max block generate distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far blocks are generated for clients, stated in mapblocks (16 " -"nodes)." -msgstr "" -"An t-astar on a thèid blocaichean a ghintinn dha na cliantan, ann am bloca " -"mapa (16 nòdan)." - -#: src/settings_translation_file.cpp -msgid "Map generation limit" -msgstr "Cuingeachadh gintinn mapa" - -#: 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 "" -"Cuingeachadh gintinn mapa, ann an nòd, sa h-uile 6 comhair o (0, 0, 0).\n" -"Cha dèid ach cnapan mapa a tha am broinn cuingeachadh gineadair nam mapa a " -"ghintinn.\n" -"Thèid luach fa leth a stòradh air gach saoghal." - -#: src/settings_translation_file.cpp -msgid "" -"Global map generation attributes.\n" -"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." -msgstr "" -"Buadhan gintinn mapa uile-choitcheann.\n" -"Ann an gineadair nam mapa v6, stiùirichidh bratach “decorations” sgeadachadh " -"seach craobhan is feur dlùth-choille\n" -"agus ann an gineadairean nam mapa eile, stiùirichidh a’ bhratach seo a h-" -"uile sgeadachadh." - -#: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Heat noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Temperature variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Heat blend noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small-scale temperature variation for blending biomes on borders." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity blend noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small-scale humidity variation for blending biomes on borders." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V5" -msgstr "Gineadair nam mapa V5" - -#: src/settings_translation_file.cpp -msgid "Mapgen V5 specific flags" -msgstr "Brataich shònraichte do ghineadair nam mapa V5" - -#: src/settings_translation_file.cpp -msgid "Map generation attributes specific to Mapgen v5." -msgstr "Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa v5." - -#: src/settings_translation_file.cpp -msgid "Cave width" +msgid "Controls steepness/height of hills." msgstr "" #: src/settings_translation_file.cpp @@ -5569,75 +2913,116 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Large cave depth" +msgid "Crash message" msgstr "" #: src/settings_translation_file.cpp -msgid "Y of upper limit of large caves." +msgid "Creative" msgstr "" #: src/settings_translation_file.cpp -msgid "Small cave minimum number" +msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "" -"An àireamh as lugha de dh’uamhan beaga air thuaiream anns gach cnap mapa." - -#: src/settings_translation_file.cpp -msgid "Small cave maximum number" +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "" -"An àireamh as motha de dh’uamhan beaga air thuaiream anns gach cnap mapa." - -#: src/settings_translation_file.cpp -msgid "Large cave minimum number" +msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "" -"An àireamh as lugha de dh’uamhan mòra air thuaiream anns gach cnap mapa." - -#: src/settings_translation_file.cpp -msgid "Large cave maximum number" +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" -"An àireamh as motha de dh’uamhan mòra air thuaiream anns gach cnap mapa." - -#: src/settings_translation_file.cpp -msgid "Large cave proportion flooded" +msgid "DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Proportion of large caves that contain liquid." +msgid "Damage" msgstr "" #: src/settings_translation_file.cpp -msgid "Cavern limit" +msgid "Debug info toggle key" +msgstr "Iuchair toglachadh an fhiosrachaidh dì-bhugachaidh" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" msgstr "" #: src/settings_translation_file.cpp -msgid "Y-level of cavern upper limit." -msgstr "Àirde-Y aig crìoch àrd nan uamhan." +msgid "Debug log level" +msgstr "Ìre an loga dì-bhugachaidh" #: src/settings_translation_file.cpp -msgid "Cavern taper" +msgid "Debugging" msgstr "" #: src/settings_translation_file.cpp -msgid "Y-distance over which caverns expand to full size." +msgid "Dec. volume key" msgstr "" #: src/settings_translation_file.cpp -msgid "Cavern threshold" +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "Sochairean bunaiteach" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain and steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain." msgstr "" #: src/settings_translation_file.cpp @@ -5645,112 +3030,70 @@ msgid "Defines full size of caverns, smaller values create larger caverns." msgstr "" #: src/settings_translation_file.cpp -msgid "Dungeon minimum Y" +msgid "Defines large-scale river channel structure." +msgstr "Mìnichidh seo structar sruth nan aibhnean mòra." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." msgstr "" #: src/settings_translation_file.cpp -msgid "Lower Y limit of dungeons." -msgstr "" +msgid "Defines the base ground level." +msgstr "Mìnichidh seo àirde bhunasach a’ ghrunnda." #: src/settings_translation_file.cpp -msgid "Dungeon maximum Y" -msgstr "" +msgid "Defines the depth of the river channel." +msgstr "Mìnichidh seo doimhne sruth nan aibhnean." #: src/settings_translation_file.cpp -msgid "Upper Y limit of dungeons." +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" +"Mìnichidh seo an t-astar as motha airson tar-chur chluicheadairean ann am " +"bloca (0 = gun chuingeachadh)." #: src/settings_translation_file.cpp -msgid "Noises" -msgstr "" +msgid "Defines the width of the river channel." +msgstr "Mìnichidh seo leud sruth nan aibhnean." #: src/settings_translation_file.cpp -msgid "Filler depth noise" -msgstr "" +msgid "Defines the width of the river valley." +msgstr "Mìnichidh seo leud gleanntan nan aibhnean." #: src/settings_translation_file.cpp -msgid "Variation of biome filler depth." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Factor noise" +msgid "Defines tree areas and tree density." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Variation of terrain vertical scale.\n" -"When noise is < -0.55 terrain is near-flat." +"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 "" #: src/settings_translation_file.cpp -msgid "Height noise" +msgid "Delay in sending blocks after building" msgstr "" #: src/settings_translation_file.cpp -msgid "Y-level of average terrain surface." -msgstr "Àirde-Y aig uachdar cuibheasach a’ chrutha-thìre." - -#: src/settings_translation_file.cpp -msgid "Cave1 noise" +msgid "Delay showing tooltips, stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp -msgid "First of two 3D noises that together define tunnels." +msgid "Deprecated Lua API handling" msgstr "" #: src/settings_translation_file.cpp -msgid "Cave2 noise" +msgid "Depth below which you'll find giant caverns." msgstr "" #: src/settings_translation_file.cpp -msgid "Second of two 3D noises that together define tunnels." +msgid "Depth below which you'll find large caves." msgstr "" -#: src/settings_translation_file.cpp -msgid "Cavern noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining giant caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ground noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" -"Riasladh 3D a mhìnicheas an àireamh dhe thuill-dhubha anns gach cnap mapa." - -#: src/settings_translation_file.cpp -msgid "Mapgen V6" -msgstr "Gineadair nam mapa V6" - -#: src/settings_translation_file.cpp -msgid "Mapgen V6 specific flags" -msgstr "Brataich shònraichte do ghineadair nam mapa V6" - #: src/settings_translation_file.cpp msgid "" -"Map generation attributes specific to Mapgen v6.\n" -"The 'snowbiomes' flag enables the new 5 biome system.\n" -"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" -"the 'jungles' flag is ignored." +"Description of server, to be displayed when players join and in the " +"serverlist." msgstr "" -"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa v6.\n" -"Cuiridh a’ bhratach “snowbiomes” siostam 5 ùr nam bitheom an comas.\n" -"Nuair a bhios a’ bhratach “snowbiomes” an comas, thèid dlùth-choilltean a " -"chur an comas gu fèin-obrachail \n" -"agus a’ bhratach “jungles” a leigeil seachad." #: src/settings_translation_file.cpp msgid "Desert noise threshold" @@ -5763,159 +3106,219 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Beach noise threshold" +msgid "Desynchronize block animation" msgstr "" #: src/settings_translation_file.cpp -msgid "Sandy beaches occur when np_beach exceeds this value." +msgid "Developer Options" msgstr "" #: src/settings_translation_file.cpp -msgid "Terrain base noise" +msgid "Dig key" msgstr "" #: src/settings_translation_file.cpp -msgid "Y-level of lower terrain and seabed." -msgstr "Àirde-Y a’ chrutha-thìre ìosal agus grunnd na mara." - -#: src/settings_translation_file.cpp -msgid "Terrain higher noise" +msgid "Digging particles" msgstr "" #: src/settings_translation_file.cpp -msgid "Y-level of higher terrain that creates cliffs." -msgstr "Àirde-Y a’ chrutha-thìre nas àirde a chruthaicheas creagan." - -#: src/settings_translation_file.cpp -msgid "Steepness noise" +msgid "Disable anticheat" msgstr "" #: src/settings_translation_file.cpp -msgid "Varies steepness of cliffs." +msgid "Disallow empty passwords" msgstr "" #: src/settings_translation_file.cpp -msgid "Height select noise" +msgid "Display Density Scaling Factor" msgstr "" -#: src/settings_translation_file.cpp -msgid "Defines distribution of higher terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mud noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Varies depth of biome surface nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Beach noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines areas with sandy beaches." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of number of caves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trees noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines tree areas and tree density." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Apple trees noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines areas where trees have apples." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V7" -msgstr "Gineadair nam mapa V7" - -#: src/settings_translation_file.cpp -msgid "Mapgen V7 specific flags" -msgstr "Brataich shònraichte do ghineadair nam mapa V7" - #: src/settings_translation_file.cpp msgid "" -"Map generation attributes specific to Mapgen v7.\n" -"'ridges': Rivers.\n" -"'floatlands': Floating land masses in the atmosphere.\n" -"'caverns': Giant caves deep underground." +"Distance in nodes at which transparency depth sorting is enabled\n" +"Use this to limit the performance impact of transparency depth sorting" msgstr "" -"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa v7.\n" -"“ridges”: Aibhnean.\n" -"“floatlands”: Tìr air fhleòd san àile.\n" -"“caverns”: Uamhan mòra domhainn fon talamh." #: src/settings_translation_file.cpp -msgid "Mountain zero level" -msgstr "Àirde neoini nam beanntan" +msgid "Domain name of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "Thoir gnogag dhùbailte airson leum no sgiathadh" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "Toglaichidh gnogag dhùbailte air iuchair an leuma am modh sgiathaidh." + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "Dumpaich fiosrachadh dì-bhugachaidh aig gineadair nam mapa." + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Y of mountain density gradient zero level. Used to shift mountains " -"vertically." +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." msgstr "" -"Y air àirde neoini air caisead dùmhlachd nam beanntan. Thèid seo a " -"chleachdadh airson beanntan a thogail gu h-inghearach." - -#: src/settings_translation_file.cpp -msgid "Floatland minimum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lower Y limit of floatlands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland maximum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Upper Y limit of floatlands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland tapering distance" -msgstr "Astar cinn-chaoil air tìr air fhleòd" #: src/settings_translation_file.cpp msgid "" -"Y-distance over which floatlands taper from full density to nothing.\n" -"Tapering starts at this distance from the Y limit.\n" -"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." +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." msgstr "" -"Seo an t-astar-Y eadar an dùbhlachd làn ’s an òir air cinn-chaoil na tìre " -"air fhleòd.\n" -"Tòsichidh na cinn-chaoil aig an astar seo on chrìoch Y.\n" -"Airson breath tìre air fhleòd sholadach, stiùirichidh seo àirde nan cnoc/nam " -"beanntan.\n" -"Feumaidh e a bhith nas lugha na no co-ionnann ris an dàrna leth dhen astar " -"eadar na crìochan Y." #: src/settings_translation_file.cpp -msgid "Floatland taper exponent" -msgstr "Easponant cinn-chaoil air tìr air fhleòd" +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +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 "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +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 " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server.\n" +"Ignored if bind_address is set.\n" +"Needs enable_ipv6 to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"appearance of high dynamic range images. Mid-range contrast is slightly\n" +"enhanced, highlights and shadows are gradually compressed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -5935,24 +3338,3100 @@ msgstr "" "nas rèidhe a bhios freagarrach\n" "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 "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "Factar bogadaich an tuiteim" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Fast movement (via the \"Aux1\" key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" +"Gluasad luath (leis an iuchair “shònraichte”).\n" +"Bidh feum air sochair “fast” air an fhrithealaiche." + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "Mapadh tòna film" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Filtering and Antialiasing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "Floatland density" msgstr "Dùmhlachd na tìre air fhleòd" #: src/settings_translation_file.cpp -#, c-format -msgid "" -"Adjusts the density of the floatland layer.\n" -"Increase value to increase density. Can be positive or negative.\n" -"Value = 0.0: 50% of volume is floatland.\n" -"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" -"to be sure) creates a solid floatland layer." +msgid "Floatland maximum Y" msgstr "" +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "Riasladh na tìre air fhleòd" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "Easponant cinn-chaoil air tìr air fhleòd" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "Astar cinn-chaoil air tìr air fhleòd" + #: src/settings_translation_file.cpp msgid "Floatland water level" msgstr "Àirde an uisge air tìr air fhleòd" +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "Iuchair an sgiathaidh" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "Sgiathadh" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font bold by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" +"An t-astar on a thèid blocaichean a ghintinn dha na cliantan, ann am bloca " +"mapa (16 nòdan)." + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" +"Buadhan gintinn mapa uile-choitcheann.\n" +"Ann an gineadair nam mapa v6, stiùirichidh bratach “decorations” sgeadachadh " +"seach craobhan is feur dlùth-choille\n" +"agus ann an gineadairean nam mapa eile, stiùirichidh a’ bhratach seo a h-" +"uile sgeadachadh." + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" +"Caisead lùb an t-solais aig an ìre as soilleire.\n" +"Stiùirichidh seo iomsgaradh an t-solais shoilleir." + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" +"Caisead lùb an t-solais aig an ìre as fainne.\n" +"Stiùirichidh seo iomsgaradh an t-solais fhainn." + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Àirde a’ ghrunnda" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal acceleration in air when jumping or falling,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration in fast mode,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration on ground or when climbing,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Iuchair air adhart a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Iuchair air ais a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "Iuchair air slot 1 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "Iuchair air slot 10 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "Iuchair air slot 11 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "Iuchair air slot 12 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "Iuchair air slot 13 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "Iuchair air slot 14 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "Iuchair air slot 15 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "Iuchair air slot 16 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "Iuchair air slot 17 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "Iuchair air slot 18 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "Iuchair air slot 19 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "Iuchair air slot 2 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "Iuchair air slot 20 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "Iuchair air slot 21 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "Iuchair air slot 22 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "Iuchair air slot 23 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "Iuchair air slot 24 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "Iuchair air slot 25 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "Iuchair air slot 26 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "Iuchair air slot 27 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "Iuchair air slot 28 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "Iuchair air slot 29 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "Iuchair air slot 3 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "Iuchair air slot 30 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "Iuchair air slot 31 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "Iuchair air slot 32 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "Iuchair air slot 4 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "Iuchair air slot 5 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "Iuchair air slot 6 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "Iuchair air slot 7 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "Iuchair air slot 8 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "Iuchair air slot 9 a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "Dè cho domhainn ’s a bhios aibhnean." + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"If negative, liquid waves will move backwards.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: 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." + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "" + +#: 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 "" + +#: 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 "" +"Ma tha seo à comas, thèid iuchair “shònraichte” a chleachdadh airson " +"sgiathadh\n" +"ma tha an dà chuid am modh sgiathaidh ’s am modh luadh an comas." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" +"Ma tha seo an comas còmhla ris a’ mhodh sgiathaidh, ’s urrainn dhan " +"chluicheadair sgiathadh tro nòdan soladach.\n" +"Bidh feum air sochair “noclip” on fhrithealaiche." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +msgstr "" +"Ma tha seo an comas, thèid iuchair “shònraichte” seach “tàisleachaidh” a " +"chleachdadh\n" +"airson dìreadh." + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" +"Ma tha seo an comas, bidh an gluasad a-rèir pids a’ chluicheadair rè " +"sgiathaidh no snàimh." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" +"Ma tha seo an comas, ’s urrainn dhut blocaichean a chur ann far a bheil thu " +"’nad sheasamh (co chois + àirde do shùil).\n" +"Bidh seo feumail nuair a bhios tu ag obair le bogsaichean nòd ann an " +"raointean beaga." + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "Leig seachad mearachdan an t-saoghail" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"increases processing load.\n" +"At iterations = 20 this mapgen has a similar load to mapgen V7." +msgstr "" +"Ath-thriall an fhoincsein ath-chùrsaiche.\n" +"Ma mheudaicheas tu seo, bidh barrachd mion-chruthan air\n" +"ach bi barrachd eallaich air a’ phròiseasadh cuideachd.\n" +"Ma tha ath-thriall = 20, bidh an t-eallach aig gineadair nam mapa seo " +"coltach ri eallach gineadair nam mapa V7." + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thoglaicheas an sgiathadh.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a ghluaiseas gu luath sa mhodh luath.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a ghluaiseas an cluicheadair dhan taobh chlì.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a ghluaiseas an cluicheadair dhan taobh deas.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thoglaicheas an sgiathadh.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 11mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 12mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 13mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 14mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 15mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 16mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 17mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 18mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an 19mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 20mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 21mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 22mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 23mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 24mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 25mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 26mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 27mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 28mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 29mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 30mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 31mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas am 32mh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an t-ochdamh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an còigeamh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas a’ chiad slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an ceathramh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an ath-nì air a’ ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an naoidheamh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an nì roimhe air a’ ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an dàrna slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an seachdamh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an siathamh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an deicheamh slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thaghas an treas slot dhen ghrad-bhàr.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair airson tàisleachadh.\n" +"Tha i ‘ga cleachdadh airson dìreadh agus dìreadh san uisge ma bhios " +"aux1_descends à comas.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thoglaicheas an sgiathadh.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"An iuchair a thoglaicheas am modh gun bhearradh.\n" +"Faic http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +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 "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of liquid waves.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +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" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" +"Ìre an loga a thèid a sgrìobhadh gu debug.txt:\n" +"- <bàn> (gun logadh)\n" +"- none (teachdaireachdan gun ìre)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Value is stored per-world." +msgstr "" +"Cuingeachadh gintinn mapa, ann an nòd, sa h-uile 6 comhair o (0, 0, 0).\n" +"Cha dèid ach cnapan mapa a tha am broinn cuingeachadh gineadair nam mapa a " +"ghintinn.\n" +"Thèid luach fa leth a stòradh air gach saoghal." + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "Eadaramh nan ùrachaidhean air an lionn ann an diog." + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Dèan gach lionn trìd-dhoilleir" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen Carpathian." +msgstr "" +"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa Carpathian." + +#: 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 "" +"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa Flat.\n" +"’S urrainn dhut lochan is cnuic ghanna a chur ris an t-saoghal rèidh." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'terrain' enables the generation of non-fractal terrain:\n" +"ocean, islands and underground." +msgstr "" +"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa Fractal.\n" +"Cuiridh “terrain” gintinn crutha-tìre nach eil fractalach an comas:\n" +"cuan, eileanan is fon talamh." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"to become shallower and occasionally dry.\n" +"'altitude_dry': Reduces humidity with altitude." +msgstr "" +"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa Valleys.\n" +"“altitude_chill”: Bidh tìr àrd nas fhuaire.\n" +"“humid_rivers”: Bidh an tìr nas buige faisg air aibhnean.\n" +"“vary_river_depth”: Ma tha seo an comas, bidh aibhnean nas tana agus tioram " +"aig amannan ma tha an saoghal tioram no teth.\n" +"’“altitude_dry”: Bidh tìr àrd nas tiorma." + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen v5." +msgstr "Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa v5." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored." +msgstr "" +"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa v6.\n" +"Cuiridh a’ bhratach “snowbiomes” siostam 5 ùr nam bitheom an comas.\n" +"Nuair a bhios a’ bhratach “snowbiomes” an comas, thèid dlùth-choilltean a " +"chur an comas gu fèin-obrachail \n" +"agus a’ bhratach “jungles” a leigeil seachad." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'floatlands': Floating land masses in the atmosphere.\n" +"'caverns': Giant caves deep underground." +msgstr "" +"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa v7.\n" +"“ridges”: Aibhnean.\n" +"“floatlands”: Tìr air fhleòd san àile.\n" +"“caverns”: Uamhan mòra domhainn fon talamh." + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "Cuingeachadh gintinn mapa" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "Gineadair nam mapa Carpathian" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "Brataich shònraichte do ghineadair nam mapa Carpathian" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "Gineadair nam mapa Flat" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "Brataich shònraichte do ghineadair nam mapa Flat" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "Gineadair nam mapa Fractal" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "Brataich shònraichte do ghineadair nam mapa Fractal" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "Gineadair nam mapa V5" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "Brataich shònraichte do ghineadair nam mapa V5" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "Gineadair nam mapa V6" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "Brataich shònraichte do ghineadair nam mapa V6" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "Gineadair nam mapa V7" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "Brataich shònraichte do ghineadair nam mapa V7" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "Gineadair nam mapa Valleys" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "Brataich shònraichte do ghineadair nam mapa Valleys" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "Dì-bhugachadh gineadair nam mapa" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "Ainm gineadair nam mapa" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "Leud as motha a’ ghrad-bhàr" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of large caves per mapchunk." +msgstr "" +"An àireamh as motha de dh’uamhan mòra air thuaiream anns gach cnap mapa." + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of small caves per mapchunk." +msgstr "" +"An àireamh as motha de dh’uamhan beaga air thuaiream anns gach cnap mapa." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum liquid resistance. Controls deceleration when entering liquid at\n" +"high speed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of recent chat messages to show" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: 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 "" +"A’ chuid as motha dhen uinneag làithreach a thèid a chleachdadh airson a’ " +"ghrad-bhàr.\n" +"Tha seo feumail ma dh’fheumas tu rudeigin a shealltainn taobh deas no clì " +"air a’ ghrad-bhàr." + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "An ìre as lugha dhen loga a thèid a sgrìobhadh dhan chabadaich." + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +msgstr "" +"An àireamh as lugha de dh’uamhan mòra air thuaiream anns gach cnap mapa." + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "" +"An àireamh as lugha de dh’uamhan beaga air thuaiream anns gach cnap mapa." + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "Slighe dhan chlò aon-leud" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "Àirde neoini nam beanntan" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"Current mapgens in a highly unstable state:\n" +"- The optional floatlands of v7 (disabled by default)." +msgstr "" +"Ainm air gineadair nam mapa a thèid a chleachdadh airson saoghal ùr a " +"chruthachadh.\n" +"Tar-aithnidh cruthachadh saoghail ùir sa phrìomh chlàr-taice seo.\n" +"Seo gineadairean nam mapa a tha glè neo-sheasmhach aig an àm seo:\n" +"- floatlands roghainneil aig v7 (à comas o thùs)." + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Near plane" +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 "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "Gun bhearradh" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"processes, especially in singleplayer and/or when running Lua code in\n" +"'on_generated'. For many users the optimum setting may be '1'." +msgstr "" + +#: src/settings_translation_file.cpp +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 "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" +"Fosgail clàr-taice a’ chuir ’na stad nuair a chailleas an uinneag am fòcas.\n" +"Cha dèid a chur ’na stad nuair a bhios formspec fosgailte." + +#: src/settings_translation_file.cpp +msgid "Optional override for chat weblink color." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Iuchair an sgiathaidh" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + +#: 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 "" +"’S urrainn dhan chluicheadair sgiathadh gun bhuaidh na iom-tharraing air.\n" +"Bidh feum air sochair “fly” air an fhrithealaiche." + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "Sochairean as urrainn do chluicheadairean le basic_privs a cheadachadh" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Proportion of large caves that contain liquid." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers." +msgstr "" +"Àrdaichidh seo an cruth-tìre airson glinn a chruthachadh timcheall air na h-" +"aibhnean." + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Restricts the access of certain client-side functions on servers.\n" +"Combine the byteflags below to restrict client-side features, or set to 0\n" +"for no restrictions:\n" +"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" +"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" +"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" +"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" +"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridged mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel depth" +msgstr "Doimhne sruth nan aibhnean" + +#: src/settings_translation_file.cpp +msgid "River channel width" +msgstr "Leud sruth nan aibhnean" + +#: src/settings_translation_file.cpp +msgid "River depth" +msgstr "Doimhne nan aibhnean" + +#: src/settings_translation_file.cpp +msgid "River noise" +msgstr "Riasladh aibhnean" + +#: src/settings_translation_file.cpp +msgid "River size" +msgstr "Meud nan aibhnean" + +#: src/settings_translation_file.cpp +msgid "River valley width" +msgstr "Leud gleanntan aibhne" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hill size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hills spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Sgrìn:" + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Sgrìn:" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Selects one of 18 fractal types.\n" +"1 = 4D \"Roundy\" Mandelbrot set.\n" +"2 = 4D \"Roundy\" Julia set.\n" +"3 = 4D \"Squarry\" Mandelbrot set.\n" +"4 = 4D \"Squarry\" Julia set.\n" +"5 = 4D \"Mandy Cousin\" Mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" Julia set.\n" +"7 = 4D \"Variation\" Mandelbrot set.\n" +"8 = 4D \"Variation\" Julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" Mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" Julia set.\n" +"11 = 3D \"Christmas Tree\" Mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" Julia set.\n" +"13 = 3D \"Mandelbulb\" Mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" Julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" Mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" Julia set.\n" +"17 = 4D \"Mandelbulb\" Mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" Julia set." +msgstr "" + +#: src/settings_translation_file.cpp +#, 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 +msgid "Server URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving liquids (like water).\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow strength gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).\n" +"WARNING!: There is no benefit, and there are several dangers, in\n" +"increasing this value above 5.\n" +"Reducing this value increases cave and dungeon density.\n" +"Altering this value is for special usage, leaving it unchanged is\n" +"recommended." +msgstr "" +"Meud nan cnapan mapa a thèid a ghintinn le gineadair nam mapa, ann am bloca " +"mapa (16 nòd).\n" +"RABHADH: Chan fhaigh thu buannachd ach cunnartan à luach nas àirde na 5.\n" +"Le luach nas lugha, gheibh thu barrachd uamhan is thuill-dubha.\n" +"Chan fhiach atharrachadh an luach seo ach air adhbhar sònraichte ’s " +"mholamaid\n" +"nach atharraich thu e." + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "Iuchair an tàisleachaidh" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "Luaths an tàisleachaidh" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "Luaths an tàisleachaidh ann an nòd gach diog." + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Surface level of optional water placed on a solid floatland layer.\n" @@ -5982,263 +6461,36 @@ msgstr "" "fhrithealaiche ’s ach an seachnaich thu tuil mhòr air uachdar na tìre " "foidhpe." +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" #: src/settings_translation_file.cpp -msgid "Terrain persistence noise" +msgid "Terrain base noise" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Varies roughness of terrain.\n" -"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgid "Terrain height" msgstr "" #: src/settings_translation_file.cpp -msgid "Defines distribution of higher terrain and steepness of cliffs." +msgid "Terrain higher noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mountain height noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of maximum mountain height (in nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridge underwater noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines large-scale river channel structure." -msgstr "Mìnichidh seo structar sruth nan aibhnean mòra." - -#: src/settings_translation_file.cpp -msgid "Mountain noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"3D noise defining mountain structure and height.\n" -"Also defines structure of floatland mountain terrain." -msgstr "" -"Riasladh 3D a mhìnicheas structar is àirde nam beanntan.\n" -"Mìnichidh e cruth-tìre nam beanntan air tìr air fhleòd cuideachd." - -#: src/settings_translation_file.cpp -msgid "Ridge noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining structure of river canyon walls." -msgstr "Riasladh 3D a mhìnicheas structar ballachan sgoltaidhean-aibhne." - -#: src/settings_translation_file.cpp -msgid "Floatland noise" -msgstr "Riasladh na tìre air fhleòd" - -#: src/settings_translation_file.cpp -msgid "" -"3D noise defining structure of floatlands.\n" -"If altered from the default, the noise 'scale' (0.7 by default) may need\n" -"to be adjusted, as floatland tapering functions best when this noise has\n" -"a value range of approximately -2.0 to 2.0." -msgstr "" -"Riasladh 3D a mhìnicheas structar na tìre air fhleòd.\n" -"Mura cleachd thu an luach tùsail, dh’fhaoidte gum fheàirrde thu gleus a chur " -"air “scale” an riaslaidh (0.7 o thùs)\n" -", on a dh’obraicheas foincseanan cinn-chaoil as fheàrr\n" -"nuair a bhios an riasladh seo eadar mu -2.0 agus 2.0." - -#: src/settings_translation_file.cpp -msgid "Mapgen Carpathian" -msgstr "Gineadair nam mapa Carpathian" - -#: src/settings_translation_file.cpp -msgid "Mapgen Carpathian specific flags" -msgstr "Brataich shònraichte do ghineadair nam mapa Carpathian" - -#: src/settings_translation_file.cpp -msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "" -"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa Carpathian." - -#: src/settings_translation_file.cpp -msgid "Base ground level" -msgstr "Àirde bhunasach a’ ghrunnda" - -#: src/settings_translation_file.cpp -msgid "Defines the base ground level." -msgstr "Mìnichidh seo àirde bhunasach a’ ghrunnda." - -#: src/settings_translation_file.cpp -msgid "River channel width" -msgstr "Leud sruth nan aibhnean" - -#: src/settings_translation_file.cpp -msgid "Defines the width of the river channel." -msgstr "Mìnichidh seo leud sruth nan aibhnean." - -#: src/settings_translation_file.cpp -msgid "River channel depth" -msgstr "Doimhne sruth nan aibhnean" - -#: src/settings_translation_file.cpp -msgid "Defines the depth of the river channel." -msgstr "Mìnichidh seo doimhne sruth nan aibhnean." - -#: src/settings_translation_file.cpp -msgid "River valley width" -msgstr "Leud gleanntan aibhne" - -#: src/settings_translation_file.cpp -msgid "Defines the width of the river valley." -msgstr "Mìnichidh seo leud gleanntan nan aibhnean." - -#: src/settings_translation_file.cpp -msgid "Hilliness1 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "First of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness2 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Second of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness3 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Third of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness4 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fourth of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rolling hills spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridge mountain spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Step mountain spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rolling hill size noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of rolling hills." -msgstr "Riasladh 2D a stiùiricheas cruth/meud nan cnoc." - -#: src/settings_translation_file.cpp -msgid "Ridged mountain size noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Step mountain size noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of step mountains." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River noise" -msgstr "Riasladh aibhnean" - -#: src/settings_translation_file.cpp -msgid "2D noise that locates the river valleys and channels." -msgstr "Riasladh 2D a shuidhicheas glinn is sruthan nan aibhnean." - -#: src/settings_translation_file.cpp -msgid "Mountain variation noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Flat" -msgstr "Gineadair nam mapa Flat" - -#: src/settings_translation_file.cpp -msgid "Mapgen Flat specific flags" -msgstr "Brataich shònraichte do ghineadair nam mapa Flat" - -#: 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 "" -"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa Flat.\n" -"’S urrainn dhut lochan is cnuic ghanna a chur ris an t-saoghal rèidh." - -#: src/settings_translation_file.cpp -msgid "Ground level" -msgstr "Àirde a’ ghrunnda" - -#: src/settings_translation_file.cpp -msgid "Y of flat ground." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Terrain noise threshold for lakes.\n" -"Controls proportion of world area covered by lakes.\n" -"Adjust towards 0.0 for a larger proportion." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hill threshold" +msgid "Terrain noise" msgstr "" #: src/settings_translation_file.cpp @@ -6248,109 +6500,422 @@ msgid "" "Adjust towards 0.0 for a larger proportion." msgstr "" -#: src/settings_translation_file.cpp -msgid "Hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines location and terrain of optional hills and lakes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Fractal" -msgstr "Gineadair nam mapa Fractal" - -#: src/settings_translation_file.cpp -msgid "Mapgen Fractal specific flags" -msgstr "Brataich shònraichte do ghineadair nam mapa Fractal" - #: src/settings_translation_file.cpp msgid "" -"Map generation attributes specific to Mapgen Fractal.\n" -"'terrain' enables the generation of non-fractal terrain:\n" -"ocean, islands and underground." +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." msgstr "" -"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa Fractal.\n" -"Cuiridh “terrain” gintinn crutha-tìre nach eil fractalach an comas:\n" -"cuan, eileanan is fon talamh." #: src/settings_translation_file.cpp -msgid "Fractal type" +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Selects one of 18 fractal types.\n" -"1 = 4D \"Roundy\" Mandelbrot set.\n" -"2 = 4D \"Roundy\" Julia set.\n" -"3 = 4D \"Squarry\" Mandelbrot set.\n" -"4 = 4D \"Squarry\" Julia set.\n" -"5 = 4D \"Mandy Cousin\" Mandelbrot set.\n" -"6 = 4D \"Mandy Cousin\" Julia set.\n" -"7 = 4D \"Variation\" Mandelbrot set.\n" -"8 = 4D \"Variation\" Julia set.\n" -"9 = 3D \"Mandelbrot/Mandelbar\" Mandelbrot set.\n" -"10 = 3D \"Mandelbrot/Mandelbar\" Julia set.\n" -"11 = 3D \"Christmas Tree\" Mandelbrot set.\n" -"12 = 3D \"Christmas Tree\" Julia set.\n" -"13 = 3D \"Mandelbulb\" Mandelbrot set.\n" -"14 = 3D \"Mandelbulb\" Julia set.\n" -"15 = 3D \"Cosine Mandelbulb\" Mandelbrot set.\n" -"16 = 3D \"Cosine Mandelbulb\" Julia set.\n" -"17 = 4D \"Mandelbulb\" Mandelbrot set.\n" -"18 = 4D \"Mandelbulb\" Julia set." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Iterations" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Iterations of the recursive function.\n" -"Increasing this increases the amount of fine detail, but also\n" -"increases processing load.\n" -"At iterations = 20 this mapgen has a similar load to mapgen V7." +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." msgstr "" -"Ath-thriall an fhoincsein ath-chùrsaiche.\n" -"Ma mheudaicheas tu seo, bidh barrachd mion-chruthan air\n" -"ach bi barrachd eallaich air a’ phròiseasadh cuideachd.\n" -"Ma tha ath-thriall = 20, bidh an t-eallach aig gineadair nam mapa seo " -"coltach ri eallach gineadair nam mapa V7." #: src/settings_translation_file.cpp -msgid "" -"(X,Y,Z) scale of fractal in nodes.\n" -"Actual fractal size will be 2 to 3 times larger.\n" -"These numbers can be made very large, the fractal does\n" -"not have to fit inside the world.\n" -"Increase these to 'zoom' into the detail of the fractal.\n" -"Default is for a vertically-squashed shape suitable for\n" -"an island, set all 3 numbers equal for the raw shape." +msgid "The URL for the content repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" msgstr "" #: src/settings_translation_file.cpp msgid "" -"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" -"Can be used to move a desired point to (0, 0) to create a\n" -"suitable spawn point, or to allow 'zooming in' on a desired\n" -"point by increasing 'scale'.\n" -"The default is tuned for a suitable spawn point for Mandelbrot\n" -"sets with default parameters, it may need altering in other\n" -"situations.\n" -"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." msgstr "" #: src/settings_translation_file.cpp -msgid "Slice w" +msgid "The depth of dirt or other biome filler node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The length in pixels it takes for touch screen interaction to start." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"Default is 1.0 (1/2 node).\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: 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 "" +"Na sochairean a gheibh cleachdaichean ùra gu fèin-obrachail.\n" +"Faic /privs sa gheama airson liosta slàn air rèiteachadh an fhrithealaiche " +"’s nan tuilleadan agad." + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Third of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Time of day when a new world is started, in millihours (0-23999)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" +"True = 256\n" +"False = 128\n" +"Gabhaidh a chleachdadh airson am meanbh-mhapa a dhèanamh nas rèidhe air " +"uidheaman slaodach." + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "Astar tar-chur nan cluicheadairean gun chuingeachadh" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "Dràibhear video" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Virtual joystick triggers Aux1 button" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Volume of all sounds.\n" +"Requires the sound system to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -6363,273 +6928,272 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Julia x" +msgid "Walking and flying speed, in nodes per second." +msgstr "Luaths na coiseachd is sgiathaidh, ann an nòd gach diog." + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking, flying and climbing speed in fast mode, in nodes per second." +msgstr "" +"Luaths na coiseachd, sgiathaidh is sreap sa mhodh luath, ann an nòd gach " +"diog." + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "Àirde an uisge" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "Àirde uachdar an uisge air an t-saoghal." + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "Crathadh duillich" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Weblink color" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"X component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia y" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"Y component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia z" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"Z component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia w" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"This is also used as the base node texture size for world-aligned\n" +"texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"W component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Has no effect on 3D fractals.\n" -"Range roughly -2 to 2." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp -msgid "Seabed noise" +msgid "Whether node texture animations should be desynchronized per mapblock." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" +"Co-dhiù am faod cluicheadairean càch a chèile a leòn ’s a mharbhadh gus nach " +"fhaod." + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." +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 "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "World start time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y of mountain density gradient zero level. Used to shift mountains " +"vertically." +msgstr "" +"Y air àirde neoini air caisead dùmhlachd nam beanntan. Thèid seo a " +"chleachdadh airson beanntan a thogail gu h-inghearach." + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "" +"Seo an t-astar-Y eadar an dùbhlachd làn ’s an òir air cinn-chaoil na tìre " +"air fhleòd.\n" +"Tòsichidh na cinn-chaoil aig an astar seo on chrìoch Y.\n" +"Airson breath tìre air fhleòd sholadach, stiùirichidh seo àirde nan cnoc/nam " +"beanntan.\n" +"Feumaidh e a bhith nas lugha na no co-ionnann ris an dàrna leth dhen astar " +"eadar na crìochan Y." + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "Àirde-Y aig uachdar cuibheasach a’ chrutha-thìre." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Àirde-Y aig crìoch àrd nan uamhan." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "Àirde-Y a’ chrutha-thìre nas àirde a chruthaicheas creagan." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +msgstr "Àirde-Y a’ chrutha-thìre ìosal agus grunnd na mara." + #: src/settings_translation_file.cpp msgid "Y-level of seabed." msgstr "Àirde-Y aig grunnd na mara." #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "Gineadair nam mapa Valleys" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys specific flags" -msgstr "Brataich shònraichte do ghineadair nam mapa Valleys" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen Valleys.\n" -"'altitude_chill': Reduces heat with altitude.\n" -"'humid_rivers': Increases humidity around rivers.\n" -"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" -"to become shallower and occasionally dry.\n" -"'altitude_dry': Reduces humidity with altitude." -msgstr "" -"Buadhan gintinn mapa a tha sònraichte do ghineadair nam mapa Valleys.\n" -"“altitude_chill”: Bidh tìr àrd nas fhuaire.\n" -"“humid_rivers”: Bidh an tìr nas buige faisg air aibhnean.\n" -"“vary_river_depth”: Ma tha seo an comas, bidh aibhnean nas tana agus tioram " -"aig amannan ma tha an saoghal tioram no teth.\n" -"’“altitude_dry”: Bidh tìr àrd nas tiorma." - -#: src/settings_translation_file.cpp -msgid "" -"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" -"enabled. Also the vertical distance over which humidity drops by 10 if\n" -"'altitude_dry' is enabled." +msgid "cURL" msgstr "" #: src/settings_translation_file.cpp -msgid "Depth below which you'll find large caves." +msgid "cURL file download timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Cavern upper limit" +msgid "cURL interactive timeout" msgstr "" #: src/settings_translation_file.cpp -msgid "Depth below which you'll find giant caverns." +msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "River depth" -msgstr "Doimhne nan aibhnean" +#, fuzzy +#~ msgid "- Creative Mode: " +#~ msgstr " " -#: src/settings_translation_file.cpp -msgid "How deep to make rivers." -msgstr "Dè cho domhainn ’s a bhios aibhnean." +#~ msgid "- Damage: " +#~ msgstr "– Dochann: " -#: src/settings_translation_file.cpp -msgid "River size" -msgstr "Meud nan aibhnean" +#~ msgid "Address / Port" +#~ msgstr "Seòladh / Port" -#: src/settings_translation_file.cpp -msgid "How wide to make rivers." -msgstr "Dè cho leathann ’s a bhios aibhnean." +#~ msgid "Enter " +#~ msgstr "Cuir a-steach " -#: src/settings_translation_file.cpp -msgid "Cave noise #1" -msgstr "" +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "" +#~ "Claonadh na h-èifeachd occlusion na paraileig air fheadh, seo sgèile/2 " +#~ "mar as àbhaist." -#: src/settings_translation_file.cpp -msgid "Cave noise #2" -msgstr "" +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "" +#~ "Airson sgàileadairean a chur an comas, feumaidh tu draibhear OpenGL a " +#~ "chleachdadh." -#: src/settings_translation_file.cpp -msgid "Filler depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The depth of dirt or other biome filler node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Base terrain height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Raises terrain to make valleys around the rivers." -msgstr "" -"Àrdaichidh seo an cruth-tìre airson glinn a chruthachadh timcheall air na " -"h-aibhnean." - -#: src/settings_translation_file.cpp -msgid "Valley fill" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Slope and fill work together to modify the heights." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley profile" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amplifies the valleys." -msgstr "Meudaichidh seo na glinn." - -#: src/settings_translation_file.cpp -msgid "Valley slope" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chunk size" -msgstr "Meud nan cnapan" - -#: src/settings_translation_file.cpp -msgid "" -"Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).\n" -"WARNING!: There is no benefit, and there are several dangers, in\n" -"increasing this value above 5.\n" -"Reducing this value increases cave and dungeon density.\n" -"Altering this value is for special usage, leaving it unchanged is\n" -"recommended." -msgstr "" -"Meud nan cnapan mapa a thèid a ghintinn le gineadair nam mapa, ann am bloca " -"mapa (16 nòd).\n" -"RABHADH: Chan fhaigh thu buannachd ach cunnartan à luach nas àirde na 5.\n" -"Le luach nas lugha, gheibh thu barrachd uamhan is thuill-dubha.\n" -"Chan fhiach atharrachadh an luach seo ach air adhbhar sònraichte ’s " -"mholamaid\n" -"nach atharraich thu e." - -#: src/settings_translation_file.cpp -msgid "Mapgen debug" -msgstr "Dì-bhugachadh gineadair nam mapa" - -#: src/settings_translation_file.cpp -msgid "Dump the mapgen debug information." -msgstr "Dumpaich fiosrachadh dì-bhugachaidh aig gineadair nam mapa." - -#: src/settings_translation_file.cpp -msgid "Absolute limit of queued blocks to emerge" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of blocks that can be queued for loading." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Per-player limit of queued blocks load from disk" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Per-player limit of queued blocks to generate" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Number of emerge threads" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Number of emerge threads to use.\n" -"Value 0:\n" -"- Automatic selection. The number of emerge threads will be\n" -"- 'number of processors - 2', with a lower limit of 1.\n" -"Any other value:\n" -"- Specifies the number of emerge threads, with a lower limit of 1.\n" -"WARNING: Increasing the number of emerge threads increases engine mapgen\n" -"speed, but this may harm game performance by interfering with other\n" -"processes, especially in singleplayer and/or when running Lua code in\n" -"'on_generated'. For many users the optimum setting may be '1'." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Ionad-tasgaidh susbaint air loidhne" - -#: src/settings_translation_file.cpp -msgid "ContentDB URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The URL for the content repository" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "ContentDB Flag Blacklist" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Comma-separated list of flags to hide in the content repository.\n" -"\"nonfree\" can be used to hide packages which do not qualify as 'free " -"software',\n" -"as defined by the Free Software Foundation.\n" -"You can also specify content ratings.\n" -"These flags are independent from Minetest versions,\n" -"so see a full list at https://content.minetest.net/help/content_flags/" -msgstr "" +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/gl/minetest.po b/po/gl/minetest.po index 115597bf8..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: 2020-06-13 23:17+0200\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,505 +17,765 @@ 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/death_formspec.lua src/client/game.cpp -msgid "You died" -msgstr "Morreches" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Limpar a fila de espera do chat" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Comando baleiro." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Sair ao menú principal" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Comando non válido: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Comando emitido: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Lista de xogadores en liña" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Xogadores en liña: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "A fila de espera do chat agora está baleira." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Este comando está desactivado polo servidor." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "Reaparecer" +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "You died" +msgstr "Morreches" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Comandos dispoñibeis:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Comandos dispoñibeis: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Comando non dispoñible: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[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 "The server has requested a reconnect:" -msgstr "O servidor solicitou que reconectes:" - -#: builtin/fstk/ui.lua -msgid "Reconnect" -msgstr "Reconectar" - -#: builtin/fstk/ui.lua -msgid "Main menu" -msgstr "Menu principal" +msgid "<none available>" +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/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Menú principal" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "Volver conectar" + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" +msgstr "O servidor solicitou volver conectar:" + +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" msgstr "" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +#, 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 "Server supports protocol versions between $1 and $2. " +msgid "Later" msgstr "" #: builtin/mainmenu/common.lua -msgid "Server enforces protocol version $1. " -msgstr "" - -#: builtin/mainmenu/common.lua -msgid "We support protocol versions between version $1 and $2." -msgstr "" - -#: builtin/mainmenu/common.lua -msgid "We only support protocol version $1." +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 "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 "World:" +msgid "(Unsatisfied)" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua -msgid "No modpack description provided." -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "No game description provided." -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Mod:" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "No (optional) dependencies" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "No hard dependencies" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -msgid "Optional dependencies:" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -msgid "Dependencies:" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "No optional dependencies" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp -msgid "Save" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 -msgid "Find More Mods" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Disable modpack" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Enable modpack" -msgstr "" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "enabled" -msgstr "" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +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 "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 "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 "Buscar máis mods" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No (optional) dependencies" +msgstr "Sen dependencias (opcionais)" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "Non se forneceu a descripción do xogo." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No hard dependencies" +msgstr "Sen dependencias importantes" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." +msgstr "Non se forneceu a descripción do paquete de mods." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No optional dependencies" +msgstr "Sen dependencias opcionais" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "Dependencias opcionais:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Gardar" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Mundo:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "activado" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" xa existe. Desexa substituílo?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Instalaranse as dependencias $1 e $2." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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 "Descargando $1..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +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 "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 -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Games" -msgstr "" - -#: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Mods" -msgstr "" - -#: builtin/mainmenu/dlg_contentstore.lua -msgid "Texture packs" -msgstr "" - -#: builtin/mainmenu/dlg_contentstore.lua -msgid "Failed to download $1" -msgstr "" - -#: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "" +msgid "Already installed" +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 "No results" -msgstr "" +msgid "Base Game:" +msgstr "Xogo base:" #: builtin/mainmenu/dlg_contentstore.lua -msgid "No packages could be retrieved" -msgstr "" +msgid "ContentDB is not available when Minetest was compiled without cURL" +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 "Erro ao descargar $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Games" +msgstr "Xogos" #: builtin/mainmenu/dlg_contentstore.lua msgid "Install" -msgstr "" +msgstr "Instalar" #: builtin/mainmenu/dlg_contentstore.lua -msgid "Update" +msgid "Install $1" +msgstr "Instalar $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +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 +msgid "Mods" +msgstr "Mods" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No packages could be retrieved" +msgstr "Non se puido recuperar ningún paquete" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No results" +msgstr "Non hai resultados" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No updates" +msgstr "Sen actualizacións" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Non atopado" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Sobrescribir" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Verifica que o xogo base esté correcto." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "En cola" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" +msgstr "Paq. de text." #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" -msgstr "" +msgstr "Desinstalar" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update" +msgstr "Actualizar" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "Actualizar Todo [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Ver máis información nun navegador web" #: builtin/mainmenu/dlg_create_world.lua -msgid "Caverns" -msgstr "" +msgid "A world named \"$1\" already exists" +msgstr "Xa existe un mundo chamado \"$1\"" #: builtin/mainmenu/dlg_create_world.lua -msgid "Very large caverns deep in the underground" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Sea level rivers" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Rivers" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Mountains" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Floatlands (experimental)" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Floating landmasses in the sky" -msgstr "" +msgid "Additional terrain" +msgstr "Terreo adicional" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Reduces heat with altitude" -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 "Reduces humidity with altitude" -msgstr "" +msgid "Biome blending" +msgstr "Mestura de biomas" #: builtin/mainmenu/dlg_create_world.lua -msgid "Humid rivers" -msgstr "" +msgid "Biomes" +msgstr "Biomas" #: builtin/mainmenu/dlg_create_world.lua -msgid "Increases humidity around rivers" -msgstr "" +msgid "Caverns" +msgstr "Cavernas" #: builtin/mainmenu/dlg_create_world.lua -msgid "Vary river depth" -msgstr "" +msgid "Caves" +msgstr "Covas" #: builtin/mainmenu/dlg_create_world.lua -msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgid "Create" +msgstr "Crear" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "Decoracións" + +#: builtin/mainmenu/dlg_create_world.lua +#, 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 "Calabozos" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "Terreo chan" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "Terreos flotantes no ceo" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "Terreos flotantes (experimental)" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "Xerar terreo non fractal: Océanos e subsolo" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" +msgstr "Outeiros" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Humid rivers" +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 "Additional terrain" +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 "Xerador de mundos" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "Parámetros do xerador de mundos" #: builtin/mainmenu/dlg_create_world.lua -msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgid "Mapgen-specific flags" +msgstr "Parámetros específicos do xerador de mundos" #: builtin/mainmenu/dlg_create_world.lua -msgid "Trees and jungle grass" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Flat terrain" -msgstr "" +msgid "Mountains" +msgstr "Montañas" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Fluxo de lodo" #: builtin/mainmenu/dlg_create_world.lua -msgid "Terrain surface erosion" -msgstr "" +msgid "Network of tunnels and caves" +msgstr "Rede de túneis e covas" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgid "No game selected" +msgstr "Ningunha partida seleccionada" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle" -msgstr "" +msgid "Reduces heat with altitude" +msgstr "Reduce a calor coa altitude" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert" -msgstr "" +msgid "Reduces humidity with altitude" +msgstr "Reduce a humidade coa altitude" #: builtin/mainmenu/dlg_create_world.lua -msgid "You have no games installed." -msgstr "" +msgid "Rivers" +msgstr "Ríos" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "" +msgid "Sea level rivers" +msgstr "Ríos ao nivel do mar" #: builtin/mainmenu/dlg_create_world.lua -msgid "Caves" -msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" +msgstr "Semente" #: builtin/mainmenu/dlg_create_world.lua -msgid "Dungeons" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Decorations" -msgstr "" +msgid "Smooth transition between biomes" +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 "Network of tunnels and caves" -msgstr "" +msgid "Temperate, Desert" +msgstr "Temperado, Deserto" #: builtin/mainmenu/dlg_create_world.lua -msgid "Biomes" -msgstr "" +msgid "Temperate, Desert, Jungle" +msgstr "Temperado, Deserto, Xungla" #: builtin/mainmenu/dlg_create_world.lua -msgid "Biome blending" -msgstr "" +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgstr "Temperado, Deserto, Xungla, Tundra, Taiga" #: builtin/mainmenu/dlg_create_world.lua -msgid "Smooth transition between biomes" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Mapgen flags" -msgstr "" +msgid "Terrain surface erosion" +msgstr "Erosión superficial do terreo" #: builtin/mainmenu/dlg_create_world.lua -msgid "Mapgen-specific flags" -msgstr "" +msgid "Trees and jungle grass" +msgstr "Árbores e céspede da xungla" #: builtin/mainmenu/dlg_create_world.lua -msgid "Warning: The Development Test is meant for developers." -msgstr "" +msgid "Vary river depth" +msgstr "Variar a profundidade do río" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "" +msgid "Very large caverns deep in the underground" +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 -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Seed" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Mapgen" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Create" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "A world named \"$1\" already exists" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "No game selected" -msgstr "" +msgid "You have no games installed." +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 "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 "" - -#: builtin/mainmenu/dlg_rename_modpack.lua -msgid "Rename Modpack:" -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 "Disabled" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Enabled" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Browse" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp -msgid "Offset" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp -msgid "Scale" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "X spread" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Y spread" -msgstr "" +msgid "(No description of setting given)" +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 "Z spread" -msgstr "" +msgid "< Back to Settings page" +msgstr "<Volver á configuración" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Octaves" -msgstr "" +msgid "Browse" +msgstr "Explorar" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" -msgstr "" +#, 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 "Desactivado" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "Editar" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "Activado" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Lacunarity" -msgstr "" +msgstr "Lacunaridade" -#. ~ "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 "" +msgid "Octaves" +msgstr "Oitavas" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" +msgstr "Desprazamento" -#. ~ "eased" is a noise parameter flag. -#. It is used to make the map smoother and -#. can be enabled in noise settings in -#. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "eased" -msgstr "" +msgid "Persistence" +msgstr "Persistencia" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "Introduce un número enteiro válido." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "Introduce un número válido." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "Restaurar" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "Escala" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Procurar" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "Seleccionar directorio" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "Seleccionar ficheiro" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "Mostrar nomes técnicos" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "O valor debe ser polo menos $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "O valor non debe ser máis grande que $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "Amplitude X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "Amplitude Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "Z" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "Amplitude Z" #. ~ "absvalue" is a noise parameter flag. #. It is short for "absolute value". @@ -523,752 +783,684 @@ 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 "X" -msgstr "" +msgid "defaults" +msgstr "Predefinido" +#. ~ "eased" is a noise parameter flag. +#. It is used to make the map smoother and +#. can be enabled in noise settings in +#. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Y" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Z" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "(No description of setting given)" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Please enter a valid integer." -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be at least $1." -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must not be larger than $1." -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Please enter a valid number." -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Select directory" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Select file" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "< Back to Settings page" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Edit" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Restore Default" -msgstr "" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Show technical names" -msgstr "" +msgid "eased" +msgstr "Suavizado" #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" -msgstr "" +msgstr "$1 (Activado)" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a $1 as a texture pack" -msgstr "" +msgid "$1 mods" +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 "Unable to find a valid mod or modpack" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a modpack as a $1" -msgstr "" +msgid "Install Mod: Unable to find real mod name for: $1" +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 install a mod as a $1" -msgstr "" +msgid "Unable to find a valid mod or modpack" +msgstr "Non se puido atopar un mod ou paquete de mods válido" #: builtin/mainmenu/pkgmgr.lua -msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "" +msgid "Unable to install a $1 as a texture pack" +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 "Install: file: \"$1\"" -msgstr "" +msgid "Unable to install a mod as a $1" +msgstr "Non se puido instalar un mod como $1" #: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" +msgid "Unable to install a modpack as a $1" +msgstr "Non se puido instalar un paquete de mods como $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "$1 mods" -msgstr "" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Cargando..." -#: builtin/mainmenu/tab_content.lua -msgid "Installed Packages:" +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +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 "Acerca de" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Colaboradores activos" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Renderizador activo:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Desenvolvedores principais" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "Colaboradores anteriores" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +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 "" - -#: builtin/mainmenu/tab_content.lua -msgid "No package description available" -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "Rename" -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "No dependencies." -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "Disable Texture Pack" -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "Use Texture Pack" -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "Information:" -msgstr "" - -#: builtin/mainmenu/tab_content.lua -msgid "Uninstall Package" -msgstr "" +msgstr "Explorar contido en liña" #: builtin/mainmenu/tab_content.lua msgid "Content" -msgstr "" +msgstr "Contido" -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "Desactivar paq. de texturas" -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" +#: builtin/mainmenu/tab_content.lua +msgid "Information:" +msgstr "Información:" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" +#: builtin/mainmenu/tab_content.lua +msgid "Installed Packages:" +msgstr "Paquetes instalados:" -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" +#: builtin/mainmenu/tab_content.lua +msgid "No dependencies." +msgstr "Sen dependencias." -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" +#: builtin/mainmenu/tab_content.lua +msgid "No package description available" +msgstr "A descripción do paquete non está dispoñible" -#: builtin/mainmenu/tab_local.lua -msgid "Install games from ContentDB" -msgstr "" +#: builtin/mainmenu/tab_content.lua +msgid "Rename" +msgstr "Renomear" -#: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "" +#: builtin/mainmenu/tab_content.lua +msgid "Uninstall Package" +msgstr "Desinstalar paquete" -#: builtin/mainmenu/tab_local.lua -msgid "New" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Select World:" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Creative Mode" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Enable Damage" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Server" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Game" -msgstr "" +#: builtin/mainmenu/tab_content.lua +msgid "Use Texture Pack" +msgstr "Usar paquete de texturas" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" +msgstr "Anunciar servidor" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" -msgstr "" +msgstr "Ligazón de enderezo" #: builtin/mainmenu/tab_local.lua -msgid "Port" -msgstr "" +msgid "Creative Mode" +msgstr "Modo creativo" #: builtin/mainmenu/tab_local.lua -msgid "Server Port" -msgstr "" +msgid "Enable Damage" +msgstr "Activar danos" #: builtin/mainmenu/tab_local.lua -msgid "Play Game" -msgstr "" +msgid "Host Game" +msgstr "Hospedar xogo" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Hospedar servidor" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +msgstr "Instalar xogos do ContentDB" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Novo" #: builtin/mainmenu/tab_local.lua msgid "No world created or selected!" -msgstr "" +msgstr "Ningún mundo creado ou seleccionado!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Xogar" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "Porto" + +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Seleccionar mods" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Seleccionar mundo:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "Porto do servidor" #: builtin/mainmenu/tab_local.lua msgid "Start Game" -msgstr "" +msgstr "Xogar só" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "" +msgid "Address" +msgstr "Enderezo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Limpar" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Ping" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "" +msgstr "Modo creativo" #. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Dano / PvP" + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favoritos" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +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_settings.lua -msgid "Opaque Leaves" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "Ping" + +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Servidores públicos" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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 "Simple Leaves" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Fancy Leaves" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Node Outlining" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Node Highlighting" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "None" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Trilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No Mipmap" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Mipmap" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Mipmap + Aniso. Filter" +msgid "(game support required)" msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "4x" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "8x" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Smooth Lighting" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Particles" -msgstr "" +msgstr "2x" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "" +msgstr "Nubes 3D" #: builtin/mainmenu/tab_settings.lua -msgid "Opaque Water" -msgstr "" +msgid "4x" +msgstr "4x" #: builtin/mainmenu/tab_settings.lua -msgid "Connected Glass" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Texturing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Antialiasing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Screen:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Autosave Screen Size" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Shaders" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Shaders (unavailable)" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/client/game.cpp -msgid "Change Keys" -msgstr "" +msgid "8x" +msgstr "8x" #: builtin/mainmenu/tab_settings.lua msgid "All Settings" -msgstr "" +msgstr "Toda a configuración" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "" +msgid "Antialiasing:" +msgstr "Suavizado:" #: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" +msgid "Autosave Screen Size" +msgstr "Autogardar tam. pantalla" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "Filtrado bilineal" + +#: builtin/mainmenu/tab_settings.lua src/client/game.cpp +msgid "Change Keys" +msgstr "Configurar teclas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "Vidro unificado" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Tone Mapping" -msgstr "" +msgid "Dynamic shadows" +msgstr "Sombras dinámicas" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Sombras dinámicas: " #: builtin/mainmenu/tab_settings.lua -msgid "Waving Liquids" -msgstr "" +msgid "Fancy Leaves" +msgstr "Follas detalladas" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Leaves" -msgstr "" +msgid "High" +msgstr "Alto" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Plants" -msgstr "" +msgid "Low" +msgstr "Baixo" #: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" +msgid "Medium" +msgstr "Medio" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "Mipmap" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "Mipmap + Filtro aniso." + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "Sen filtros" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "Sen Mipmap" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "Resaltar nodos" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "Marcar nodos" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "Ningún" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "Follas opacas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "Auga opaca" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "Partículas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Pantalla:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "" +msgstr "Configuración" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "Sombreadores" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Sombreadores (experimental)" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "Sombreadores (non dispoñible)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "Follas simples" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "Iluminación suave" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "Texturización:" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "Mapeado de tons" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Touch threshold (px):" +msgstr "Nivel de sensibilidade ao toque (px)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "Filtro trilineal" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Moi alto" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Moi baixo" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "Movemento das follas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "Movemento dos líquidos" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Plants" +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 "" - -#: src/client/client.cpp -msgid "Loading textures..." -msgstr "" - -#: src/client/client.cpp -msgid "Rebuilding shaders..." -msgstr "" - -#: src/client/client.cpp -msgid "Initializing nodes..." -msgstr "" - -#: src/client/client.cpp -msgid "Initializing nodes" -msgstr "" +msgstr "Esgotouse o tempo de conexión." #: src/client/client.cpp msgid "Done!" -msgstr "" +msgstr "Feito!" -#: src/client/clientlauncher.cpp -msgid "Main Menu" -msgstr "" +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "Iniciando nodos" -#: src/client/clientlauncher.cpp -msgid "Player name too long." -msgstr "" +#: src/client/client.cpp +msgid "Initializing nodes..." +msgstr "Iniciando nodos..." + +#: src/client/client.cpp +msgid "Loading textures..." +msgstr "Cargando texturas..." + +#: src/client/client.cpp +msgid "Rebuilding shaders..." +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 "Provided password file failed to open: " -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "Please choose a name!" -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "No world selected and no address provided. Nothing to do." -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "Provided world path doesn't exist: " -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "" +msgid "Could not find or load game: " +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." -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "Menú principal" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "Ningún mundo seleccionado e ningún enderezo fornecido. Nada que facer." + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "Nome do xogador demasiado longo." + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Escolle un nome!" + +#: src/client/clientlauncher.cpp +msgid "Provided password file failed to open: " +msgstr "O ficheiro do contrasinal fornecido non se puido abrir: " + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "O camiño do mundo fornecido non existe: " #: src/client/game.cpp -msgid "Shutting down..." +msgid "" +"\n" +"Check debug.txt for details." msgstr "" +"\n" +"Verifique debug.txt para obter detalles." #: src/client/game.cpp -msgid "Creating server..." -msgstr "" +msgid "- Address: " +msgstr "- Enderezo: " #: src/client/game.cpp -msgid "Creating client..." -msgstr "" +msgid "- Mode: " +msgstr "- Modo: " #: src/client/game.cpp -msgid "Resolving address..." -msgstr "" +msgid "- Port: " +msgstr "- Porto: " #: src/client/game.cpp -msgid "Connecting to server..." -msgstr "" +msgid "- Public: " +msgstr "- Público: " + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +msgid "- PvP: " +msgstr "- PvP: " #: src/client/game.cpp -msgid "Item definitions..." -msgstr "" +msgid "- Server Name: " +msgstr "- Nome do servidor: " #: src/client/game.cpp -msgid "Node definitions..." -msgstr "" - -#: src/client/game.cpp -msgid "Media..." -msgstr "" - -#: src/client/game.cpp -msgid "KiB/s" -msgstr "" - -#: src/client/game.cpp -msgid "MiB/s" -msgstr "" - -#: src/client/game.cpp -msgid "Client side scripting is disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Sound muted" -msgstr "" - -#: src/client/game.cpp -msgid "Sound unmuted" -msgstr "" - -#: src/client/game.cpp -msgid "Sound system is disabled" -msgstr "" +msgid "A serialization error occurred:" +msgstr "Ocurreu un erro:" #: src/client/game.cpp #, c-format -msgid "Volume changed to %d%%" -msgstr "" - -#: src/client/game.cpp -msgid "Sound system is not supported on this build" -msgstr "" - -#: src/client/game.cpp -msgid "ok" -msgstr "" - -#: src/client/game.cpp -msgid "Fly mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "" - -#: src/client/game.cpp -msgid "Fly mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Pitch move mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Pitch move mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fast mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "" - -#: src/client/game.cpp -msgid "Fast mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Noclip mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "" - -#: src/client/game.cpp -msgid "Noclip mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Cinematic mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Cinematic mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Automatic forward enabled" -msgstr "" +msgid "Access denied. Reason: %s" +msgstr "Acceso negado. Motivo: %s" #: src/client/game.cpp msgid "Automatic forward disabled" -msgstr "" +msgstr "Avance automático desactivado" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" +msgid "Automatic forward enabled" +msgstr "Avance automático activado" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" +msgid "Block bounds hidden" +msgstr "Lím. bloques ocultos" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Block bounds shown for all blocks" +msgstr "Límites de bloque mostrados para todos os bloques" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" +msgid "Block bounds shown for current block" +msgstr "Límites de bloques mostrados para o bloque actual" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" +msgid "Block bounds shown for nearby blocks" +msgstr "Límites de bloques mostrados para bloques pretos" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" +msgid "Camera update disabled" +msgstr "Actualización da cámara desactivada" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" +msgid "Camera update enabled" +msgstr "Actualización da cámara activada" #: src/client/game.cpp -msgid "Minimap currently disabled by game or mod" +#, 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 "Fog disabled" -msgstr "" +msgid "Change Password" +msgstr "Cambiar contrasinal" #: src/client/game.cpp -msgid "Fog enabled" +msgid "Cinematic mode disabled" +msgstr "Modo cinematográfico desactivado" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "Modo cinematográfico activado" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Cliente desconectado" + +#: src/client/game.cpp +msgid "Client side scripting is disabled" +msgstr "O scripting de cliente está desactivado" + +#: src/client/game.cpp +msgid "Connecting to server..." +msgstr "Conectando ao servidor..." + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Erro na conexión por un motivo descoñecido" + +#: src/client/game.cpp +msgid "Continue" +msgstr "Continuar" + +#: src/client/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- 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 "Non se puido resolver o enderezo: %s" + +#: src/client/game.cpp +msgid "Creating client..." +msgstr "Creando cliente..." + +#: src/client/game.cpp +msgid "Creating server..." +msgstr "Creando servidor..." + +#: src/client/game.cpp +msgid "Debug info and profiler graph hidden" +msgstr "Información de depuración e gráfico de análise do mundo ocultos" #: src/client/game.cpp msgid "Debug info shown" -msgstr "" - -#: src/client/game.cpp -msgid "Profiler graph shown" -msgstr "" - -#: src/client/game.cpp -msgid "Wireframe shown" -msgstr "" +msgstr "Info de depuración mostrada" #: src/client/game.cpp msgid "Debug info, profiler graph, and wireframe hidden" msgstr "" - -#: src/client/game.cpp -msgid "Debug info and profiler graph hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Camera update disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Camera update enabled" -msgstr "" - -#: src/client/game.cpp -#, c-format -msgid "Viewing range is at maximum: %d" -msgstr "" - -#: src/client/game.cpp -#, c-format -msgid "Viewing range changed to %d" -msgstr "" - -#: src/client/game.cpp -#, c-format -msgid "Viewing range is at minimum: %d" -msgstr "" - -#: src/client/game.cpp -msgid "Enabled unlimited viewing range" -msgstr "" - -#: src/client/game.cpp -msgid "Disabled unlimited viewing range" -msgstr "" - -#: src/client/game.cpp -msgid "Zoom currently disabled by game or mod" -msgstr "" +"Info de depuración, gráfico de análise do mundo e estrutura de arames ocultos" #: src/client/game.cpp msgid "" @@ -1285,600 +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 -#, c-format -msgid "" -"Controls:\n" -"- %s: move forwards\n" -"- %s: move backwards\n" -"- %s: move left\n" -"- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" -"- %s: drop item\n" -"- %s: inventory\n" -"- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" -"- Mouse wheel: select item\n" -"- %s: chat\n" -msgstr "" +msgid "Disabled unlimited viewing range" +msgstr "Campo de visión ilimitada desactivado" #: src/client/game.cpp -msgid "Continue" -msgstr "" +msgid "Enabled unlimited viewing range" +msgstr "Campo de visión ilimitada activado" #: src/client/game.cpp -msgid "Change Password" -msgstr "" - -#: src/client/game.cpp -msgid "Game paused" -msgstr "" - -#: src/client/game.cpp -msgid "Sound Volume" -msgstr "" +#, 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 "Modo rápido desactivado" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "Modo rápido activado" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "Modo rápido activado (nota: sen permiso 'rápido')" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "Modo voo desactivado" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "Modo voo activado" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "Modo voo activado (nota: sen permiso de 'voo')" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "Néboa desactivada" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "Néboa activada" #: src/client/game.cpp msgid "Game info:" -msgstr "" +msgstr "Información do xogo:" #: src/client/game.cpp -msgid "- Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "Remote server" -msgstr "" - -#: src/client/game.cpp -msgid "- Address: " -msgstr "" +msgid "Game paused" +msgstr "Xogo pausado" #: src/client/game.cpp msgid "Hosting server" -msgstr "" +msgstr "Servidor anfitrión" #: src/client/game.cpp -msgid "- Port: " -msgstr "" +msgid "Item definitions..." +msgstr "Definicións dos obxectos..." #: src/client/game.cpp -msgid "Singleplayer" -msgstr "" +msgid "KiB/s" +msgstr "KiB/s" #: src/client/game.cpp -msgid "On" -msgstr "" +msgid "Media..." +msgstr "Multimedia..." + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "MiB/s" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "O minimapa está actualmente desactivado polo xogo ou mod" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "Xogar en liña" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "Modo espectador desactivado" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "Modo espectador activado" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" +msgstr "Modo espectador activado (nota: sen permiso 'noclip')" + +#: src/client/game.cpp +msgid "Node definitions..." +msgstr "Definicións de nodos..." #: src/client/game.cpp msgid "Off" -msgstr "" +msgstr "Desactivado" #: src/client/game.cpp -msgid "- Damage: " -msgstr "" +msgid "On" +msgstr "Activado" #: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#. ~ PvP = Player versus Player -#: src/client/game.cpp -msgid "- PvP: " -msgstr "" +msgid "Pitch move mode disabled" +msgstr "Modo de movemiento rotación vertical desactivado" #: src/client/game.cpp -msgid "- Public: " -msgstr "" +msgid "Pitch move mode enabled" +msgstr "Modo de movemiento de rotación vertical activado" #: src/client/game.cpp -msgid "- Server Name: " -msgstr "" +msgid "Profiler graph shown" +msgstr "Gráfico de análise do mundo mostrado" #: src/client/game.cpp -msgid "" -"\n" -"Check debug.txt for details." -msgstr "" +msgid "Remote server" +msgstr "Servidor remoto" -#: src/client/gameui.cpp -msgid "Chat shown" -msgstr "" +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "Resolvendo enderezo..." + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "Cerrando..." + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "Un xogador" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "Volume do son" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "Sonido silenciado" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "O sistema de son está desactivado" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "O sistema de son non é compatible con esta versión" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "Son reactivado" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +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 "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 "Non se puido escoitar %s porque o IPv6 está desactivado" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "Campo de visión cambiada a %d" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +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 "O campo de visión está ao mínimo: %d" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "Volume cambiado a %d%%" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "Estrutura de arames mostrada" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "O zoom está actualmente desactivado polo xogo ou mod" + +#: src/client/game.cpp +msgid "ok" +msgstr "ok" #: src/client/gameui.cpp msgid "Chat hidden" -msgstr "" +msgstr "Chat oculto" #: src/client/gameui.cpp -msgid "HUD shown" -msgstr "" +msgid "Chat shown" +msgstr "Chat visible" #: src/client/gameui.cpp msgid "HUD hidden" -msgstr "" +msgstr "HUD oculto" + +#: src/client/gameui.cpp +msgid "HUD shown" +msgstr "HUD visible" + +#: src/client/gameui.cpp +msgid "Profiler hidden" +msgstr "Análise do mundo oculta" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" - -#: src/client/gameui.cpp -msgid "Profiler hidden" -msgstr "" +msgstr "Análise do mundo visible (páx. %d de %d)" #: src/client/keycode.cpp -msgid "Left Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "Middle Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "X Button 1" -msgstr "" - -#: src/client/keycode.cpp -msgid "X Button 2" -msgstr "" +msgid "Apps" +msgstr "Aplicaciones" #: src/client/keycode.cpp msgid "Backspace" -msgstr "" +msgstr "Retroceso" #: src/client/keycode.cpp -msgid "Tab" -msgstr "" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - -#: src/client/keycode.cpp -msgid "Return" -msgstr "" - -#: src/client/keycode.cpp -msgid "Shift" -msgstr "" +msgid "Caps Lock" +msgstr "Bloq Maiús" #: src/client/keycode.cpp msgid "Control" -msgstr "" +msgstr "Control" + +#: src/client/keycode.cpp +msgid "Down" +msgstr "Abaixo" + +#: src/client/keycode.cpp +msgid "End" +msgstr "Fin" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "Borrar EOF" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "Executar" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "Axuda" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "Inicio" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "Aceptar IME" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "Converter IME" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "Saír do IME" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "Cambiar modo do IME" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "Non converter IME" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "Inserir" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "Esquerda" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "Botón esquerdo" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "Ctrl esq." + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "Menú esquerdo" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "Shift esq." + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "Win. esq." #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp msgid "Menu" -msgstr "" +msgstr "Menú" #: src/client/keycode.cpp -msgid "Pause" -msgstr "" +msgid "Middle Button" +msgstr "Botón central" #: src/client/keycode.cpp -msgid "Caps Lock" -msgstr "" +msgid "Num Lock" +msgstr "Bloq. núm." #: src/client/keycode.cpp -msgid "Space" -msgstr "" +msgid "Numpad *" +msgstr "Teclado numérico *" #: src/client/keycode.cpp -msgid "Page up" -msgstr "" +msgid "Numpad +" +msgstr "Teclado numérico +" + +#: src/client/keycode.cpp +msgid "Numpad -" +msgstr "Teclado numérico -" + +#: src/client/keycode.cpp +msgid "Numpad ." +msgstr "Teclado numérico ." + +#: src/client/keycode.cpp +msgid "Numpad /" +msgstr "Teclado numérico /" + +#: src/client/keycode.cpp +msgid "Numpad 0" +msgstr "Teclado numérico 0" + +#: src/client/keycode.cpp +msgid "Numpad 1" +msgstr "Teclado numérico 1" + +#: src/client/keycode.cpp +msgid "Numpad 2" +msgstr "Teclado numérico 2" + +#: src/client/keycode.cpp +msgid "Numpad 3" +msgstr "Teclado numérico 3" + +#: src/client/keycode.cpp +msgid "Numpad 4" +msgstr "Teclado numérico 4" + +#: src/client/keycode.cpp +msgid "Numpad 5" +msgstr "Teclado numérico 5" + +#: src/client/keycode.cpp +msgid "Numpad 6" +msgstr "Teclado numérico 6" + +#: src/client/keycode.cpp +msgid "Numpad 7" +msgstr "Teclado numérico 7" + +#: src/client/keycode.cpp +msgid "Numpad 8" +msgstr "Teclado numérico 8" + +#: src/client/keycode.cpp +msgid "Numpad 9" +msgstr "Teclado numérico 9" + +#: src/client/keycode.cpp +msgid "OEM Clear" +msgstr "Limpar OEM" #: src/client/keycode.cpp msgid "Page down" -msgstr "" +msgstr "Avance páx." #: src/client/keycode.cpp -msgid "End" -msgstr "" +msgid "Page up" +msgstr "Retroceso pax." #: src/client/keycode.cpp -msgid "Home" -msgstr "" - -#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -msgid "Left" -msgstr "" +msgid "Pause" +msgstr "Pausa" #: src/client/keycode.cpp -msgid "Up" -msgstr "" - -#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -msgid "Right" -msgstr "" - -#: src/client/keycode.cpp -msgid "Down" -msgstr "" - -#. ~ Key name -#: src/client/keycode.cpp -msgid "Select" -msgstr "" +msgid "Play" +msgstr "Xogar" #. ~ "Print screen" key #: src/client/keycode.cpp msgid "Print" -msgstr "" +msgstr "Impr. pant." #: src/client/keycode.cpp -msgid "Execute" -msgstr "" +msgid "Return" +msgstr "Enter" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" +msgstr "Dereita" #: src/client/keycode.cpp -msgid "Snapshot" -msgstr "" - -#: src/client/keycode.cpp -msgid "Insert" -msgstr "" - -#: src/client/keycode.cpp -msgid "Help" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Windows" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Windows" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 0" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 1" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 2" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 3" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 4" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 5" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 6" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 7" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 8" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 9" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad *" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad +" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad ." -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad -" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad /" -msgstr "" - -#: src/client/keycode.cpp -msgid "Num Lock" -msgstr "" - -#: src/client/keycode.cpp -msgid "Scroll Lock" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Shift" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Shift" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Control" -msgstr "" +msgid "Right Button" +msgstr "Botón dereito" #: src/client/keycode.cpp msgid "Right Control" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Menu" -msgstr "" +msgstr "Ctrl der." #: src/client/keycode.cpp msgid "Right Menu" -msgstr "" +msgstr "Menú dereito" #: src/client/keycode.cpp -msgid "IME Escape" -msgstr "" +msgid "Right Shift" +msgstr "Shift der." #: src/client/keycode.cpp -msgid "IME Convert" -msgstr "" +msgid "Right Windows" +msgstr "Win. der." #: src/client/keycode.cpp -msgid "IME Nonconvert" -msgstr "" +msgid "Scroll Lock" +msgstr "Bloq. Despr." + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" +msgstr "Seleccionar" #: src/client/keycode.cpp -msgid "IME Accept" -msgstr "" - -#: src/client/keycode.cpp -msgid "IME Mode Change" -msgstr "" - -#: src/client/keycode.cpp -msgid "Apps" -msgstr "" +msgid "Shift" +msgstr "Shift" #: src/client/keycode.cpp msgid "Sleep" -msgstr "" +msgstr "Suspender" #: src/client/keycode.cpp -msgid "Erase EOF" -msgstr "" +msgid "Snapshot" +msgstr "Instantánea" #: src/client/keycode.cpp -msgid "Play" -msgstr "" +msgid "Space" +msgstr "Espazo" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "Tabulador" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "Arriba" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "X Botón 1" + +#: src/client/keycode.cpp +msgid "X Button 2" +msgstr "X Botón 2" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" -msgstr "" +msgstr "Zoom" -#: src/client/keycode.cpp -msgid "OEM Clear" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimapa oculto" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimapa en modo radar, Zoom x%d" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimapa en modo superficie, Zoom x%d" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimapa en modo textura" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Erro ao abrir páxina web" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Abrindo páxina web" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" -msgstr "" +msgstr "Continuar" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Double tap \"jump\" to toggle fly" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp -msgid "Automatic jumping" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Key already in use" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "press key" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Forward" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Backward" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Jump" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Sneak" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Drop" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inventory" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Prev. item" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Next item" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Change camera" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle minimap" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle fly" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle pitchmove" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle fast" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle noclip" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Mute" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Dec. volume" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inc. volume" -msgstr "" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = baixar" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Chat" -msgstr "" +msgstr "Avance automático" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp -msgid "Screenshot" -msgstr "" +msgid "Automatic jumping" +msgstr "Salto automático" #: src/gui/guiKeyChangeMenu.cpp -msgid "Range select" -msgstr "" +msgid "Aux1" +msgstr "Aux1" #: src/gui/guiKeyChangeMenu.cpp -msgid "Dec. range" -msgstr "" +msgid "Backward" +msgstr "Atrás" #: src/gui/guiKeyChangeMenu.cpp -msgid "Inc. range" -msgstr "" +msgid "Block bounds" +msgstr "Lím. bloques" #: src/gui/guiKeyChangeMenu.cpp -msgid "Console" -msgstr "" +msgid "Change camera" +msgstr "Cambiar cámara" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Chat" +msgstr "Chat" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" +msgstr "Comando" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "Consola" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "Dism. alcance" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Baixar volume" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "Con 2 veces \"saltar\" voas" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "Soltar" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "Adiante" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "Aum. alcance" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Subir volume" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "Inventario" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "Saltar" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "A tecla xa está en uso" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" -msgstr "" +msgstr "Comando local" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Silenciar" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "Seg. obxecto" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Obxecto ant." + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "Sel. alcance" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "Captura" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +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 "Alt. correr" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "Alt. voo" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" -msgstr "" +msgstr "Alt. néboa" -#: src/gui/guiPasswordChange.cpp -msgid "Old Password" -msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "Alt. minimapa" -#: src/gui/guiPasswordChange.cpp -msgid "New Password" -msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "Modo espectar" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "Alt. rot. vertical" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "Unha tecla" #: src/gui/guiPasswordChange.cpp msgid "Change" -msgstr "" +msgstr "Cambiar" -#: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "New Password" +msgstr "Novo" + +#: src/gui/guiPasswordChange.cpp +msgid "Old Password" +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" -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "" +#: src/gui/guiVolumeChange.cpp +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Son: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1887,1605 +2196,160 @@ msgstr "" msgid "LANG_CODE" msgstr "gl" -#: src/settings_translation_file.cpp -msgid "Controls" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Build inside player" -msgstr "" - -#: src/settings_translation_file.cpp +#: src/network/clientpackethandler.cpp msgid "" -"If enabled, you can place blocks at the position (feet + eye level) where " -"you stand.\n" -"This is helpful when working with nodeboxes in small areas." +"Name is not registered. To create an account on this server, click 'Register'" msgstr "" -#: src/settings_translation_file.cpp -msgid "Flying" -msgstr "" - -#: 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 "Pitch move mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, makes move directions relative to the player's pitch when flying " -"or swimming." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast movement" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Fast movement (via the \"special\" key).\n" -"This requires the \"fast\" privilege on the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noclip" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled together with fly mode, player is able to fly through solid " -"nodes.\n" -"This requires the \"noclip\" privilege on the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cinematic mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Smooths camera when looking around. Also called look or mouse smoothing.\n" -"Useful for recording videos." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera smoothing" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Smooths rotation of camera. 0 to disable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera smoothing in cinematic mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Smooths rotation of camera in cinematic mode. 0 to disable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Invert mouse" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Invert vertical mouse movement." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity multiplier." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" -"descending." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Double tap jump for fly" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Double-tapping the jump key toggles fly mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" -"enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatically jump up single-node obstacles." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Safe digging and placing" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Random input" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable random user input (only used for testing)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Continuous forward" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Touch screen threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The length in pixels it takes for touch screen interaction to start." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fixed virtual joystick" -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 "" - -#: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -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 "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable joysticks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick ID" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The identifier of the joystick to use" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick type" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The type of joystick" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick button repetition interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated events\n" -"when holding down a joystick button combination." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick frustum sensitivity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Forward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player forward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Backward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player backward.\n" -"Will also disable autoforward, when active.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Left key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player left.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Right key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player right.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Jump key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for jumping.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneak key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for sneaking.\n" -"Also used for climbing down and descending in water if aux1_descends is " -"disabled.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Inventory key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the inventory.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving fast in fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Command key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type local commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Range select key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling unlimited view range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fly key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling flying.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Pitch move key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling pitch move mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noclip key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling noclip mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar next key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the next item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar previous key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the previous item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mute key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for muting the game.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Inc. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatic forward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling autoforward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cinematic mode key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling cinematic mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling display of minimap.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for taking screenshots.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Drop item key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for dropping the currently selected item.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View zoom key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key to use view zoom when possible.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 1 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the first hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 2 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the second hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 3 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the third hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 4 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fourth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 5 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fifth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 6 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the sixth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 7 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the seventh hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 8 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the eighth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 9 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the ninth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 10 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the tenth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 11 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 11th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 12 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 12th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 13 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 13th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 14 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 14th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 15 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 15th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 16 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 16th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 17 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 17th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 18 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 18th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 19 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 19th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 20 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 20th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 21 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 21st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 22 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 22nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 23 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 23rd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 24 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 24th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 25 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 25th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 26 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 26th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 27 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 27th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 28 key" -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 "" -"Key for selecting the 28th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 29 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 29th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 30 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 30th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 31 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 31st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 32 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 32nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "HUD toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the HUD.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of chat.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large chat console key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the large chat console.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of fog.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera update toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the camera update. Only used for development\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug info toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of debug info.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the profiler. Used for development.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Toggle camera mode key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for switching between first- and third-person camera.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range increase key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range decrease key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Graphics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VBO" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"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 "" -"Enable vertex buffer objects.\n" -"This should greatly improve graphics performance." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to fog out the end of the visible area." +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"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 "Leaves style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Leaves style:\n" -"- Fancy: all faces visible\n" -"- Simple: only outer faces, if defined special_tiles are used\n" -"- Opaque: disable transparency" -msgstr "" +msgid "2D noise that controls the shape/size of ridged mountains." +msgstr "Ruído 2D que controla a forma/tamaño das montañas escarpadas." #: src/settings_translation_file.cpp -msgid "Connect glass" -msgstr "" +msgid "2D noise that controls the shape/size of rolling hills." +msgstr "Ruído 2D que controla a forma/tamaño dos outeiros." #: src/settings_translation_file.cpp -msgid "Connects glass if supported by node." -msgstr "" +msgid "2D noise that controls the shape/size of step mountains." +msgstr "Ruído 2D que controla a forma/tamaño das montañas inclinadas." #: src/settings_translation_file.cpp -msgid "Smooth lighting" -msgstr "" +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." +msgstr "Ruído 2D que controla o tamaño/frecuencia das cordilleiras montañosas." #: src/settings_translation_file.cpp -msgid "" -"Enable smooth lighting with simple ambient occlusion.\n" -"Disable for speed or for different looks." -msgstr "" +msgid "2D noise that controls the size/occurrence of rolling hills." +msgstr "Ruído 2D que controla o tamaño/frecuencia dos outeiros." #: src/settings_translation_file.cpp -msgid "Clouds" -msgstr "" +msgid "2D noise that controls the size/occurrence of step mountain ranges." +msgstr "Ruído 2D que controla o tamaño/frecuencia das cordilleiras de paso." #: src/settings_translation_file.cpp -msgid "Clouds are a client side effect." -msgstr "" +msgid "2D noise that locates the river valleys and channels." +msgstr "Ruído 2D que localiza os vales fluviais e canles dos ríos." #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use 3D cloud look instead of flat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Node highlighting" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Method used to highlight selected object." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Digging particles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Adds particles when digging a node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mipmapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" -"especially when using a high resolution texture pack.\n" -"Gamma correct downscaling is not supported." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Anisotropic filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use anisotropic filtering when viewing at textures from an angle." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bilinear filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use bilinear filtering when scaling textures." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trilinear filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use trilinear filtering when scaling textures." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clean transparent textures" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum texture size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" -"can be blurred, so automatically upscale them with nearest-neighbor\n" -"interpolation to preserve crisp pixels. This sets the minimum texture size\n" -"for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" -"This is also used as the base node texture size for world-aligned\n" -"texture autoscaling." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FSAA" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Undersampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Undersampling is similar to using a lower screen resolution, but it applies\n" -"to the game world only, keeping the GUI intact.\n" -"It should give a significant performance boost at the cost of less detailed " -"image.\n" -"Higher values result in a less detailed image." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shaders allow advanced visual effects and may increase performance on some " -"video\n" -"cards.\n" -"This only works with the OpenGL video backend." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shader path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to shader directory. If no path is defined, default location will be " -"used." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filmic tone mapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" -"Simulates the tone curve of photographic film and how this approximates the\n" -"appearance of high dynamic range images. Mid-range contrast is slightly\n" -"enhanced, highlights and shadows are gradually compressed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving Nodes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving liquids (like water).\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wave height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The maximum height of the surface of waving liquids.\n" -"4.0 = Wave height is two nodes.\n" -"0.0 = Wave doesn't move at all.\n" -"Default is 1.0 (1/2 node).\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wavelength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of liquid waves.\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wave speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How fast liquid waves will move. Higher = faster.\n" -"If negative, liquid waves will move backwards.\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving leaves" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving leaves.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving plants" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving plants.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Advanced" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Arm inertia" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Arm inertia, gives a more realistic movement of\n" -"the arm when the camera moves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Pause on lost window focus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Open the pause menu when the window's focus is lost. Does not pause if a " -"formspec is\n" -"open." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Viewing range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View distance in nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Near plane" -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" -"Increasing can reduce artifacting on weaker GPUs.\n" -"0.1 = Default, 0.25 = Good value for weaker tablets." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autosave screen size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save window size automatically when modified." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VSync" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical screen synchronization." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view in degrees." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve gamma" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Alters the light curve by applying 'gamma correction' to it.\n" -"Higher values make middle and lower light levels brighter.\n" -"Value '1.0' leaves the light curve unaltered.\n" -"This only has significant effect on daylight and artificial\n" -"light, it has very little effect on natural night light." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve low gradient" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Gradient of light curve at minimum light level.\n" -"Controls the contrast of the lowest light levels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve high gradient" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Gradient of light curve at maximum light level.\n" -"Controls the contrast of the highest light levels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Strength of light curve boost.\n" -"The 3 'boost' parameters define a range of the light\n" -"curve that is boosted in brightness." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost center" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost spread" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Spread of light curve boost range.\n" -"Controls the width of the range to be boosted.\n" -"Standard deviation of the light curve boost Gaussian." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Texture path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Path to texture directory. All textures are first searched from here." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Video driver" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The rendering back-end for Irrlicht.\n" -"A restart is required after changing this.\n" -"Note: On Android, stick with OGLES1 if unsure! App may fail to start " -"otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cloud radius" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Radius of cloud area stated in number of 64 node cloud squares.\n" -"Values larger than 26 will start to produce sharp cutoffs at cloud area " -"corners." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View bobbing factor" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Fall bobbing factor" -msgstr "" - -#: 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 "" +msgstr "Nubes 3D" #: src/settings_translation_file.cpp msgid "3D mode" +msgstr "Modo 3D" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "Forza de paralaxe en modo 3D" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +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 "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"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 "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 "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 "Ruído 3D que determina a cantidade de calabozos por chunk." #: src/settings_translation_file.cpp msgid "" @@ -3500,927 +2364,20 @@ msgid "" "- pageflip: quadbuffer based 3d.\n" "Note that the interlaced mode requires shaders to be enabled." msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D mode parallax strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of 3D mode parallax." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Full-Screen Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec full-screen background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Full-Screen Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec full-screen background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box border color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width of the selection box lines around nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Recent Chat Messages" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of recent chat messages to show" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum hotbar width" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mesh cache" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables caching of facedir rotated meshes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock mesh generation delay" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Size of the MapBlock cache of the mesh generator. Increasing this will\n" -"increase the cache hit %, reducing the data being copied from the main\n" -"thread, thus reducing jitter." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables minimap." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Round minimap" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shape of the minimap. Enabled = round, disabled = square." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap scan height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"True = 256\n" -"False = 128\n" -"Usable to make minimap smoother on slower machines." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Colored fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ambient occlusion gamma" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The strength (darkness) of node ambient-occlusion shading.\n" -"Lower is darker, Higher is lighter. The valid range of values for this\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Inventory items animations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables animation of inventory items." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog start" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Opaque liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "World-aligned textures mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Textures on a node may be aligned either to the node or to the world.\n" -"The former mode suits better things like machines, furniture, etc., while\n" -"the latter makes stairs and microblocks fit surroundings better.\n" -"However, as this possibility is new, thus may not be used by older servers,\n" -"this option allows enforcing it for certain node types. Note though that\n" -"that is considered EXPERIMENTAL and may not work properly." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autoscaling mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"World-aligned textures may be scaled to span several nodes. However,\n" -"the server may not send the scale you want, especially if you use\n" -"a specially-designed texture pack; with this option, the client tries\n" -"to determine the scale automatically basing on the texture size.\n" -"See also texture_min_size.\n" -"Warning: This option is EXPERIMENTAL!" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Show entity selection boxes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clouds in menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use a cloud animation for the main menu background." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Scale GUI by a user specified value.\n" -"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" -"This will smooth over some of the rough edges, and blend\n" -"pixels when scaling down, at the cost of blurring some\n" -"edge pixels when images are scaled by non-integer sizes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling filter" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When gui_scaling_filter is true, all GUI images need to be\n" -"filtered in software, but some images are generated directly\n" -"to hardware (e.g. render-to-texture for nodes in inventory)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling filter txr2img" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When gui_scaling_filter_txr2img is true, copy those images\n" -"from hardware to software for scaling. When false, fall back\n" -"to the old scaling method, for video drivers that don't\n" -"properly support downloading textures back from hardware." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Tooltip delay" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay showing tooltips, stated in milliseconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Append item name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Append item name to tooltip." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font bold by default" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font italic by default" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " -"drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Regular font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"The fallback font will be used if the font cannot be loaded." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font is used for e.g. the console and profiler screen." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font will be used for certain languages or if the default font is " -"unavailable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat font size" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Screenshot folder" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Screenshot format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Format of screenshots." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screenshot quality" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Screenshot quality. Only used for JPEG format.\n" -"1 means worst quality; 100 means best quality.\n" -"Use 0 for default quality." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "DPI" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " -"screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable console window" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Windows systems only: Start Minetest with the command line window in the " -"background.\n" -"Contains the same information as the file debug.txt (default name)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables the sound system.\n" -"If disabled, this completely disables all sounds everywhere and the in-game\n" -"sound controls will be non-functional.\n" -"Changing this setting requires a restart." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Volume" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Volume of all sounds.\n" -"Requires the sound system to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mute sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to mute sounds. You can unmute sounds at any time, unless the\n" -"sound system is disabled (enable_sound=false).\n" -"In-game, you can toggle the mute state with the mute key or by using the\n" -"pause menu." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Address to connect to.\n" -"Leave this blank to start a local server.\n" -"Note that the address field in the main menu overrides this setting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Remote port" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Prometheus listener address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" -"enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Saving map received from server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save the map received by the client on disk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Connect to external media server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable usage of remote media server (if provided by server).\n" -"Remote servers offer a significantly faster way to download media (e.g. " -"textures)\n" -"when connecting to the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client modding" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable Lua modding support on client.\n" -"This support is experimental and API can change." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Serverlist URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "URL to the server list displayed in the Multiplayer Tab." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Serverlist file" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"File in client/serverlist/ that contains your favorite servers displayed in " -"the\n" -"Multiplayer Tab." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum size of the out chat queue" -msgstr "" - -#: 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 "" - -#: 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 "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Timeout for client to remove unused map data from memory." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock limit" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Show debug info" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to show the client debug info (has the same effect as hitting F5)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the server, to be displayed when players join and in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server description" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Description of server, to be displayed when players join and in the " -"serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Domain name of server, to be displayed in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Homepage of server, to be displayed in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Announce server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatically report to the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Announce to this serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strip color codes" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Server port" -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 "Bind address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The network interface that the server listens on." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strict protocol checking" -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 " -"connecting\n" -"to new servers, but they may not support all new features that you are " -"expecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Remote media" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Specifies URL from which client fetches media instead of using UDP.\n" -"$filename should be accessible from $remote_media$filename via cURL\n" -"(obviously, remote_media should end with a slash).\n" -"Files that are not present will be fetched the usual way." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "IPv6 server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable/disable running an IPv6 server.\n" -"Ignored if bind_address is set.\n" -"Needs enable_ipv6 to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum simultaneous block sends per client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of blocks that are simultaneously sent per client.\n" -"The maximum total count is calculated dynamically:\n" -"max_total = ceil((#clients + max_users) * per_client / 4)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"To reduce lag, block transfers are slowed down when a player is building " -"something.\n" -"This determines how long they are slowed down after placing or removing a " -"node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. packets per iteration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of packets sent per send step, if you have a slow connection\n" -"try reducing it, but don't reduce it to a number below double of targeted\n" -"client number." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default game" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Message of the day" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Message of the day displayed to players connecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of players that can be connected simultaneously." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map directory" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Item entity TTL" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Default stack size" -msgstr "" - -#: src/settings_translation_file.cpp -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 "" - -#: src/settings_translation_file.cpp -msgid "Damage" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable players getting damage and dying." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Creative" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fixed map seed" +"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 @@ -4428,474 +2385,178 @@ 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 "" - -#: src/settings_translation_file.cpp -msgid "Default password" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "New users need to input this password." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default privileges" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Basic privileges" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Privileges that players with basic_privs can grant" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Unlimited player transfer distance" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Player transfer distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player versus player" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to allow players to damage and kill each other." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mod channels" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod channels support." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Static spawnpoint" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If this is set, players will always (re)spawn at the given position." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disallow empty passwords" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, new players cannot join with an empty password." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disable anticheat" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rollback recording" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, actions are recorded for rollback.\n" -"This option is only read when server starts." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Format of player chat messages. The following strings are valid " -"placeholders:\n" -"@name, @message, @timestamp (optional)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shutdown message" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crash message" -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 "Ask to reconnect after crash" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Active object send range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far clients know about objects, stated in mapblocks (16 nodes).\n" -"\n" -"Setting this larger than active_block_range will also cause the server\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Active block range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The radius of the volume of blocks around every player that is subject to " -"the\n" -"active block stuff, stated in mapblocks (16 nodes).\n" -"In active blocks objects are loaded and ABMs run.\n" -"This is also the minimum range in which active objects (mobs) are " -"maintained.\n" -"This should be configured together with active_object_send_range_blocks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max block send distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum forceloaded blocks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of forceloaded mapblocks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time send interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls length of day/night cycle.\n" -"Examples:\n" -"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "World start time" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time of day when a new world is started, in millihours (0-23999)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map save interval" -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 "Chat message max length" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message count limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amount of messages a player may send per 10 seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message kick threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Kick players who sent more than X messages per 10 seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Physics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default acceleration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal and vertical acceleration on ground or when climbing,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Acceleration in air" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal acceleration in air when jumping or falling,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast mode acceleration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal and vertical acceleration in fast mode,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking and flying speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneaking speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneaking speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast mode speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking, flying and climbing speed in fast mode, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Climbing speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical climbing speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Jumping speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid fluidity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid fluidity smoothing" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum liquid resistance. Controls deceleration when entering liquid at\n" -"high speed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid sinking" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Gravity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Deprecated Lua API handling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" -"- error: abort on usage of deprecated call (suggested for mod developers)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. clearobjects extra blocks" -msgstr "" - -#: src/settings_translation_file.cpp -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 "Unload unused server data" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How much the server will wait before unloading unused mapblocks.\n" -"Higher value is smoother, but will use more RAM." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum objects per block" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of statically stored objects in a block." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Synchronous SQLite" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dedicated server step" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of a server tick and the interval at which objects are generally " -"updated over\n" -"network." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active block management interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between active block management cycles" -msgstr "" +msgid "A message to be displayed to all clients when the server shuts down." +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 "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "" +msgid "ABM time budget" +msgstr "Límite de tempo para MBA" #: src/settings_translation_file.cpp -msgid "NodeTimer interval" -msgstr "" +msgid "Absolute limit of queued blocks to emerge" +msgstr "Límite absoluto de bloques en proceso de emerxer" #: src/settings_translation_file.cpp -msgid "Length of time between NodeTimer execution cycles" -msgstr "" +msgid "Acceleration in air" +msgstr "Aceleración no aire" #: src/settings_translation_file.cpp -msgid "Ignore world errors" -msgstr "" +msgid "Acceleration of gravity, in nodes per second per second." +msgstr "Aceleración da gravidade, en nós por segundo." + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "Modificadores de bloques activos" + +#: src/settings_translation_file.cpp +msgid "Active block management interval" +msgstr "Intervalo de administración de bloques activos" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "Rango de bloque activo" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "Rango de envío en obxetos activos" #: 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." +"Address to connect to.\n" +"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 "Liquid loop max" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max liquids processed per step." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid queue purge time" -msgstr "" +msgid "Adds particles when digging a node." +msgstr "Añade partículas ao excavar un nó." #: src/settings_translation_file.cpp msgid "" -"The time (in seconds) that the liquids queue may grow beyond processing\n" -"capacity until an attempt is made to decrease its size by dumping old queue\n" -"items. A value of 0 disables the functionality." +"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 "Liquid update tick" +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 -msgid "Liquid update interval in seconds." +#, c-format +msgid "" +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"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 -msgid "Block send optimize distance" +#, fuzzy +msgid "Admin name" +msgstr "Añadir nome de obxeto" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "Avanzado" + +#: src/settings_translation_file.cpp +msgid "" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"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 +#, fuzzy +msgid "Always fly fast" +msgstr "Sempre voar e correr" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "Oclusión ambiental gamma" + +#: src/settings_translation_file.cpp +msgid "Amount of messages a player may send per 10 seconds." +msgstr "Cantidade de mensaxes que un xogador pode enviar en 10 segundos." + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys." +msgstr "Amplifica os vales." + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "Filtrado anisotrópico" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "Anunciar o servidor" + +#: src/settings_translation_file.cpp +msgid "Announce to this serverlist." +msgstr "Anuncar en esta lista de servidores." + +#: src/settings_translation_file.cpp +msgid "Append item name" +msgstr "Añadir nome de obxeto" + +#: src/settings_translation_file.cpp +msgid "Append item name to tooltip." +msgstr "Añadir nome do obxecto á descripción." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Ruído das maceiras" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" +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 "Preguntar para reconectar logo dunha caída de conexión" #: src/settings_translation_file.cpp msgid "" @@ -4911,11 +2572,1705 @@ 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 "Server side occlusion culling" +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 "Saltar obstáculos de un só no automáticamente." + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "Informar automáticamente á lista do servidor." + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "Autogardar o tamaño da pantalla" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "Modo de autoescalado" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Tecla Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Tecla Aux1 para escalar/descender" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "Tecla retroceso" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "Nivel do chán base" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "Altura base do terreo." + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "Permisos básicos" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Ruído da praia" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Límite de ruído de praia" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "Filtrado bilineal" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "Vincular enderezo" + +#: src/settings_translation_file.cpp +#, 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 "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 "Camiño das fontes negras e cursivas" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "Camiño das fontes negras e cursivas monoespaciadas" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "Camiño das fontes negras" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "Camiño das fontes negras monoespaciadas" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "Colocar bloque na posición do xogador" + +#: src/settings_translation_file.cpp +msgid "Builtin" +msgstr "Integrado" + +#: 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" +"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 "Suavizado de cámara" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "Suavizado de cámara en modo cinematográfico" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "Alt. actualización de cámara" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Ruído de covas" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "Ruído de covas #1" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "Sonido de covas #2" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "Ancho da cova" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Sonido de cova1" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Sonido de cova2" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Limite da cova" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Ruído da cova" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "Conicidade da cova" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Límite da cova" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +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 "Límite de tempo de mensaxe de comando de chat" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Comandos do chat" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "Tamaño da fonte do chat" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "Tecla do chat" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "Nivel de rexistro do chat" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "Límite de mensaxes do chat" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "Formato da mensaxe do chat" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "Límite da mensaxe de expulsión" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "Lonxitude máxima da mensaxe do chat" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "Alt. chat" + +#: src/settings_translation_file.cpp +msgid "Chat weblinks" +msgstr "Ligazóns web do chat" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "Tamaño do chunk" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "Modo cinematográfico" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "Tecla para modo cinematográfico" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +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 "Cliente" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "Cliente e servidor" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Personalización do cliente" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" +msgstr "Restricións para modear no lado do cliente" + +#: src/settings_translation_file.cpp +msgid "Client side node lookup range restriction" +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 "Velocidade de escalada" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "Radio de nubes" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "Nubes" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "As nubes son un efecto do lado do cliente." + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "Nubes no menú" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "Néboa colorida" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Sombras coloridas" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"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 "Tecla comando" + +#: src/settings_translation_file.cpp +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 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 "" +"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 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 "Unificar vidro" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "Conectar a un servidor multimedia externo" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "Unifica o vidro se o bloque é compatible." + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "Opacidade da consola" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "Cor da consola" + +#: src/settings_translation_file.cpp +msgid "Console height" +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 "Lista negra de marcas de ContentDB" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Descargas máximas simultáneas para ContentDB" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "Ligazón URL de ContentDB" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +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 "Controis" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"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 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 "Controla a inclinación/profundidade dos lagos." + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "Controla a inclinación/altura dos outeiros." + +#: src/settings_translation_file.cpp +msgid "" +"Controls width of tunnels, a smaller value creates wider tunnels.\n" +"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 "Mensaxe de erro" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Creativo" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +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 "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 "DPI" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "Dano" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "Alt. inf. para depuración" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "Límite do tamaño do ficheiro de información de depuración" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "Nivel de rexistro de depuración" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Tecla baixar volume" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "Intervalo de servidor dedicado" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "Aceleración por defecto" + +#: src/settings_translation_file.cpp +msgid "Default game" +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 "Contrasinal por defecto" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "Permisos por defecto" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "Formato de reporte por defecto" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "Tamaño do agrupamento de obxectos por defecto" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"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 "Define as áreas onde as árbores teñen mazás." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +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 "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 "Define estruturas de canles fluviais a gran escala." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "Define a localización e terreo de outeiros e lagos opcionais." + +#: src/settings_translation_file.cpp +msgid "Defines the base ground level." +msgstr "Define o nivel base do terreo." + +#: src/settings_translation_file.cpp +msgid "Defines the depth of the river channel." +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 "Define a largura da canle do río." + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river valley." +msgstr "Define a largura do val do río." + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +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 "Atraso no envío de bloques logo de construír" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "Atraso para mostrar información de herramientas, en milisegundos." + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "Manexo de funcións de API Lua obsoletas" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find giant caverns." +msgstr "Profundidade na que atoparás cavernas xigantes." + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +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 "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 "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 "Tecla romper bloque" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "Partículas ao excavar" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "Desactivar anticheat" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +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 "Nome do servidor. Mostrarase na lista de servidores." + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "Pulsar dúas veces \"salto\" para voar" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "Pulsar dúas veces \"salto\" serve para activar e desactivar o voo." + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "Tecla para soltar obxecto" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "Mostrar información de depuración do xerador de terreos." + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "Nº máx. de calabozos Y" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "Nº mín. de calabozos Y" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +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 "" +"Enable Poisson disk filtering.\n" +"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 "Activar a xanela da consola" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +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 "Activar axuda para as canles de mods." + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "Activar seguridade dos mods" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "Activar dano e morte dos xogadores." + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "Activar a entrada de comandos aleatoria (só para tests)." + +#: src/settings_translation_file.cpp +msgid "" +"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 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 " +"connecting\n" +"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 "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"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 "" +"Enable/disable running an IPv6 server.\n" +"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 "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"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 "Activa a animación de obxetos no inventario." + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "Activa o rexistro de mallas xiradas." + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "Activa o minimapa." + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"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 "Intervalo de exposición dos datos da perfilaxe do motor" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "Métodos de entidade" + +#: src/settings_translation_file.cpp +msgid "" +"Exponent of the floatland tapering. Alters the tapering behaviour.\n" +"Value = 1.0 creates a uniform, linear tapering.\n" +"Values > 1.0 create a smooth tapering suitable for the default separated\n" +"floatlands.\n" +"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" +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 "FSAA" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "Factor de ruído" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "Factor de balanceo en caída" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "Camiño da fonte alternativa" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "Tecla de correr" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "Aceleración no modo rápido" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "Velocidade do modo rápido" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +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 "Campo de visión" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "Campo de visión en grados." + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"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 "Profundidade de recheo" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Ruído da profundidade de recheo" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "Mapa de tons fílmico" + +#: src/settings_translation_file.cpp +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 "" +"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 +#, 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 "Primeiro de 2 ruídos 3D que xuntos definen túneis." + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "Semente de mapa fixa" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "Joystick virtual fixo" + +#: src/settings_translation_file.cpp +msgid "Floatland density" +msgstr "Densidade dos terreos flotantes" + +#: src/settings_translation_file.cpp +msgid "Floatland maximum Y" +msgstr "Valor máximo de Y dos terreos flotantes" + +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "Valor mínimo de Y dos terreos flotantes" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "Ruído de terreos flotantes" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "Expoñente de conicidade de terreos flotantes" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "Distancia cónica de terreos flotantes" + +#: src/settings_translation_file.cpp +msgid "Floatland water level" +msgstr "Nivel da auga de terreos flotantes" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "Tecla de voo" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "Voar" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "Néboa" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "Inicio de néboa" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +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 "Fonte en negra por defecto" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "Fonte en cursiva por defecto" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "Sombra da fonte" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "Opacidade da sombra da fonte" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "Tamaño da fonte" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +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 "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 "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 "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"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 "" +"Format of player chat messages. The following strings are valid " +"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 "Formato das capturas de pantalla." + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "Cor de fondo por defecto para formularios" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "Opacidade de fondo por defecto para formularios" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "Cor de fondo para formularios en pantalla completa" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "Opacidade dos formularios en pantalla completa" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +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 "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 "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 "Opacidade de fondo por defecto para os formularios (entre 0 e 255)." + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "Tecla avance" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "Cuarto de 4 ruídos 2D que xuntos definen a altura das montañas." + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Tipo de fractal" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +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 "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "Pantalla completa" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "Modo de pantalla completa." + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "Escala de IGU" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +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 +#, 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 "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 "Gravidade" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Nivel do chán" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "Ruído do chán" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "Mods HTTP" + +#: src/settings_translation_file.cpp +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 "Alt. HUD" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- 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 "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"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 "Ruído de mestura de calor" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +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 "Altura do ruído" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Altura do ruído seleccionado" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "Desnivel do outeiro" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Límites do outeiro" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "Sonido de outeiros 1" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "Sonido de outeiros 2" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "Sonido de outeiros 3" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "Sonido de outeiros 4" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +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 "Tecla de próximo obxecto na barra principal" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Tecla de obxecto anterior na barra principal" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "Tecla de rañura 1" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "Tecla de rañura 10" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "Tecla de rañura 11" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "Tecla de rañura 12" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "Tecla de rañura 13" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "Tecla de rañura 14" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "Tecla de rañura 15" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "Tecla de rañura 16" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "Tecla de rañura 17" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "Tecla de rañura 18" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "Tecla de rañura 19" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "Tecla de rañura 2" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "Tecla de rañura 20" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "Tecla de rañura 21" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "Tecla de rañura 22" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "Tecla de rañura 23" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "Tecla de rañura 24" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "Tecla de rañura 25" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "Tecla de rañura 26" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "Tecla de rañura 27" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "Tecla de rañura 28" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "Tecla de rañura 29" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "Tecla de rañura 3" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "Tecla de rañura 30" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "Tecla de rañura 31" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "Tecla de rañura 32" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "Tecla de rañura 4" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "Tecla de rañura 5" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "Tecla de rañura 6" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "Tecla de rañura 7" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "Tecla de rañura 8" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "Tecla de rañura 9" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "Profundidade dos ríos." + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"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 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 "Largura dos ríos." + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Ruído de mestura da humidade" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Ruído da humidade" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Variación da humidade dos biomas." + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "IPv6" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +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 "" "If enabled the server will perform map block occlusion culling based on\n" @@ -4924,10 +4279,2141 @@ 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 "Client side modding restrictions" +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"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 "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"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 +#, 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 "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" +"Se está activado, pode colocar bloques na posición (pés + nivel dos ollos) " +"onde está.\n" +"Isto é útil cando se traballa con caixas de nós en áreas pequenas." + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"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 "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"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 "Ignorar erros do mundo" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +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 "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 "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 "Tecla para aumentar o volume" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +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 "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 "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 +#, 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 "Animacións dos obxectos do inventario" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "Tecla de inventario" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "Inverter rato" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "Inverter o movemento vertical do rato." + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "Ruta da fonte cursiva" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "Ruta da fonte monoespaciada en cursiva" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "TTL da entidade obxecto" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "Iteracións" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"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 "ID do joystick" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "Intervalo de repetición do botón do joystick" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Zona morta do joystick" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "Sensibilidade do gatillo do joystick" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "Tipo de joystick" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"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 "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"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 "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"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 "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"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 "Julia w" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "Julia x" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "Julia y" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "Julia z" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "Tecla de salto" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "Velocidade de salto" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"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 "" +"Key for decreasing the volume.\n" +"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 "" +"Key for digging.\n" +"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 "" +"Key for dropping the currently selected item.\n" +"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 "" +"Key for increasing the viewing range.\n" +"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 "" +"Key for increasing the volume.\n" +"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 "" +"Key for jumping.\n" +"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 "" +"Key for moving fast in fast mode.\n" +"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 "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"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 "" +"Key for moving the player forward.\n" +"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 "" +"Key for moving the player left.\n" +"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 "" +"Key for moving the player right.\n" +"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 "" +"Key for muting the game.\n" +"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 "" +"Key for opening the chat window to type commands.\n" +"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 "" +"Key for opening the chat window to type local commands.\n" +"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 "" +"Key for opening the chat window.\n" +"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 "" +"Key for opening the inventory.\n" +"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 "" +"Key for placing.\n" +"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 "" +"Key for selecting the 11th hotbar slot.\n" +"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 "" +"Key for selecting the 12th hotbar slot.\n" +"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 "" +"Key for selecting the 13th hotbar slot.\n" +"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 "" +"Key for selecting the 14th hotbar slot.\n" +"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 "" +"Key for selecting the 15th hotbar slot.\n" +"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 "" +"Key for selecting the 16th hotbar slot.\n" +"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 "" +"Key for selecting the 17th hotbar slot.\n" +"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 "" +"Key for selecting the 18th hotbar slot.\n" +"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 "" +"Key for selecting the 19th hotbar slot.\n" +"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 "" +"Key for selecting the 20th hotbar slot.\n" +"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 "" +"Key for selecting the 21st hotbar slot.\n" +"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 "" +"Key for selecting the 22nd hotbar slot.\n" +"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 "" +"Key for selecting the 23rd hotbar slot.\n" +"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 "" +"Key for selecting the 24th hotbar slot.\n" +"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 "" +"Key for selecting the 25th hotbar slot.\n" +"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 "" +"Key for selecting the 26th hotbar slot.\n" +"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 "" +"Key for selecting the 27th hotbar slot.\n" +"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 "" +"Key for selecting the 28th hotbar slot.\n" +"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 "" +"Key for selecting the 29th hotbar slot.\n" +"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 "" +"Key for selecting the 30th hotbar slot.\n" +"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 "" +"Key for selecting the 31st hotbar slot.\n" +"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 "" +"Key for selecting the 32nd hotbar slot.\n" +"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 "" +"Key for selecting the eighth hotbar slot.\n" +"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 "" +"Key for selecting the fifth hotbar slot.\n" +"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 "" +"Key for selecting the first hotbar slot.\n" +"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 "" +"Key for selecting the fourth hotbar slot.\n" +"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 "" +"Key for selecting the next item in the hotbar.\n" +"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 "" +"Key for selecting the ninth hotbar slot.\n" +"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 "" +"Key for selecting the previous item in the hotbar.\n" +"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 "" +"Key for selecting the second hotbar slot.\n" +"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 "" +"Key for selecting the seventh hotbar slot.\n" +"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 "" +"Key for selecting the sixth hotbar slot.\n" +"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 "" +"Key for selecting the tenth hotbar slot.\n" +"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 "" +"Key for selecting the third hotbar slot.\n" +"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 "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"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 "" +"Key for switching between first- and third-person camera.\n" +"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 "" +"Key for taking screenshots.\n" +"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 "" +"Key for toggling autoforward.\n" +"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 "" +"Key for toggling cinematic mode.\n" +"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 "" +"Key for toggling display of minimap.\n" +"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 "" +"Key for toggling fast mode.\n" +"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 "" +"Key for toggling flying.\n" +"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 "" +"Key for toggling noclip mode.\n" +"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 "" +"Key for toggling pitch move mode.\n" +"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 "" +"Key for toggling the camera update. Only used for development\n" +"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 "" +"Key for toggling the display of chat.\n" +"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 "" +"Key for toggling the display of debug info.\n" +"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 "" +"Key for toggling the display of fog.\n" +"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 "" +"Key for toggling the display of the HUD.\n" +"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 "" +"Key for toggling the display of the large chat console.\n" +"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 "" +"Key for toggling the display of the profiler. Used for development.\n" +"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 "" +"Key for toggling unlimited view range.\n" +"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 "" +"Key to use view zoom when possible.\n" +"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 "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 "Inclinación dos lagos" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Límite de lagos no mapa" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "Idiomas" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "Profundidade das covas grandes" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "Número máximo de covas grandes" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "Número mínimo de covas grandes" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "Proporción de covas grandes inundadas" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Tecla da consola do chat grande" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "Apariencia das follas" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- 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 "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, 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 +#, 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 +#, 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 +#, 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" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- 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 "Impulso da curva da luz" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "Centro de impulso da curva de luz" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "Dispersión de impulso de curva de luz" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "Gamma da curva de luz" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "Gradiente alto da curva de luz" + +#: src/settings_translation_file.cpp +msgid "Light curve low gradient" +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 "" +"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 "" +"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 "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- 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 "Fluidez dos líquidos" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "Suavizado da fluidez dos líquidos" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "Límite de procesamento de líquidos" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "Tempo para eliminar filas de líquidos" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "Afundimento en líquidos" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "Intervalo de actualización de líquidos en segundos." + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "Periodo de actualización dos líquidos" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "Cargar a análise do mundo" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"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 "Carga de modiificadores de bloques" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "Límite inferior Y de calabozos." + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "Límite inferior Y de terreos flotantes." + +#: src/settings_translation_file.cpp +msgid "Main menu script" +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 "Fai que todos os líquidos sexan opacos" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Nivel de compresión do mapa para almacenamiento de disco" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Nivel de compresión do mapa para tranferencias pola rede" + +#: src/settings_translation_file.cpp +msgid "Map directory" +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 "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'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 "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"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 "Atributos de xeración de mundos específicos do xerador de mundos v5." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"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 "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'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 "Límite de xeración de mapas" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "Intervalo de gardado de mapa" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Tempo de actualización das sombras do mapa" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "Límite do mapa de bloques" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +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 "Tempo límite de eliminación do mapa de bloques" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "Xerador de mundos carpatianos" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "Parámetros específicos de mundos carpatianos" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "Xerador de mundos planos" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "Parámetros específicos de mundos planos" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "Xerador de mundos fractais" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "Parámetros específicos de mundos fractais" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "Xerador de mundos v5" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "Parámetros específicos do xerador de mundos v5" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "Xerador de mundos v6" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "Parámetros específicos do xerador de mundos v6" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "Xerador de mundos v7" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "Parámetros específicos do xerador de mundos v7" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "Xerador de mundos con vales" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "Parámetros espcíficos o xerador de mundos con vales" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "Depuración do xerador de mundos" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "Nome do xerador de mundos" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "Distancia máxima de xeración de bloques" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "Distancia máxima de envío de bloques" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "Máximo de líquidos procesados por paso." + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "Max. clearobjects bloques extra" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "Máx. paquetes por iteración" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +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 "Distancia máxima para renderizar as sombras." + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "Máximo de bloques cargados de maneira forzada" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +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 "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 "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 "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" +"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 "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 "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"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 "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 "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"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 "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 "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 "Número máximo de obxectos almacenados estáticamente nun bloque." + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +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 "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 "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 "Usuarios máximos" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "Caché de malla" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "Mensaxe do día" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "Mensaxe do día mostrada aos xogadores que se conectan." + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +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 "Nivel mínimo de rexistro para escribir no chat." + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "Minimapa" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "Tecla do minimapa" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "Altura de escaneo do minimapa" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +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 "Límite mínimo do número aleatorio de covas pequenas por chunk." + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +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 "Canais de mod" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "Modifica o tamaño dos elementos do HUD." + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "Ruta da fonte monoespaciada" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "Tamaño da fonte monoespaciada" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Tamaño da fonte monoespaciada divisible por" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "Ruído da altura das montañas" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Ruído das montañas" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "Variación do ruído das montañas" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "Nivel cero das montañas" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "Sensibilidade do rato" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "Multiplicador da sensibilidade do rato." + +#: src/settings_translation_file.cpp +msgid "Mud noise" +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 "Tecla para silenciar" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "Silenciar son" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"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 "" +"Name of the player.\n" +"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 "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 "Os novos usuarios deben introducir este contrasinal." + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "Modo espectador" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +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 "Resaltado dos nós" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "Intervalo NodeTimer" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "Ruídos" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "Número de fíos emerxentes" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"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 "" +"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 "" +"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 "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 "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"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 "Substitución opcional da cor da ligazón web do chat." + +#: src/settings_translation_file.cpp +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 "" +"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 "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 "Pausa cando se perfe o foco da pantalla" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +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 "Límite por xogador de bloques en cola que xerar" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "Físicas" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "Tecla de voo libre" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "Modo de rotación vertical" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Tecla para colocar obxectos" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +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 "" +"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 "Distancia de transferencia do xogador" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "Xogador contra xogador" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +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 "Permisos que poden conceder os xogadores con basic_privs" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "Análise do mundo" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "Alt. análise do mundo" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "Enderezo do Prometheus" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" +"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 "Proporción de covas grandes que conteñen líquido." + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"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 "Eleva o terreo para facer vales arredor dos ríos." + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "Entrada aleatoria" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "Tecla de campo de visión" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "Mensaxes do chat recientes" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "Camiño da fonte regular" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "Medios remotos" + +#: src/settings_translation_file.cpp +msgid "Remote port" +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 "Substitúe o menú principal por defecto por un personalizado." + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "Directorio para logs" #: src/settings_translation_file.cpp msgid "" @@ -4942,1062 +6428,179 @@ msgid "" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client side node lookup range restriction" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the CSM restriction for node range is enabled, get_node calls are " -"limited\n" -"to this distance from the player to the node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod security" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Prevent mods from doing insecure things like running shell commands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trusted mods" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "HTTP mods" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Load the game profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Load the game profiler to collect game profiling data.\n" -"Provides a /profiler command to access the compiled profile.\n" -"Useful for mod developers and server operators." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default report format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The default format in which profiles are being saved,\n" -"when calling `/profiler save [format]` without format." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Report path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The file path relative to your worldpath in which profiles will be saved to." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Entity methods" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument the methods of entities on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active Block Modifiers" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument the action function of Active Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Loading Block Modifiers" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument the action function of Loading Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Global callbacks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument global callback functions on registration.\n" -"(anything you pass to a minetest.register_*() function)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Builtin" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument builtin.\n" -"This is usually only needed by core/builtin contributors" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Have the profiler instrument itself:\n" -"* Instrument an empty function.\n" -"This estimates the overhead, that instrumentation is adding (+1 function " -"call).\n" -"* Instrument the sampler being used to update the statistics." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client and Server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the player.\n" -"When running a server, clients connecting with this name are admins.\n" -"When starting from the main menu, this is overridden." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Language" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Debug log level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Level of logging to be written to debug.txt:\n" -"- <nothing> (no logging)\n" -"- none (messages with no level)\n" -"- error\n" -"- warning\n" -"- action\n" -"- info\n" -"- verbose" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug log file size threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the file size of debug.txt exceeds the number of megabytes specified in\n" -"this setting when it is opened, the file is moved to debug.txt.1,\n" -"deleting an older debug.txt.1 if it exists.\n" -"debug.txt is only moved if this setting is positive." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat log level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimal level of logging to be written to chat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "IPv6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable IPv6 support (for both client and server).\n" -"Required for IPv6 connections to work at all." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL parallel limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Limits number of parallel HTTP requests. Affects:\n" -"- Media fetch if server uses remote_media setting.\n" -"- Serverlist download and server announcement.\n" -"- Downloads performed by main menu (e.g. mod manager).\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL file download timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu script" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Replaces the default main menu with a custom one." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Engine profiling data print interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Print the engine's profiling data in regular intervals (in seconds).\n" -"0 = disable. Useful for developers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of map generator to be used when creating a new world.\n" -"Creating a world in the main menu will override this.\n" -"Current mapgens in a highly unstable state:\n" -"- The optional floatlands of v7 (disabled by default)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Water level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Water surface level of the world." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max block generate distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far blocks are generated for clients, stated in mapblocks (16 " -"nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation limit" -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" -"Value is stored per-world." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Global map generation attributes.\n" -"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Heat noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Temperature variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Heat blend noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small-scale temperature variation for blending biomes on borders." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity blend noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small-scale humidity variation for blending biomes on borders." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V5" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V5 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation attributes specific to Mapgen v5." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls width of tunnels, a smaller value creates wider tunnels.\n" -"Value >= 10.0 completely disables generation of tunnels and avoids the\n" -"intensive noise calculations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y of upper limit of large caves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small cave minimum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small cave maximum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave minimum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave maximum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave proportion flooded" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Proportion of large caves that contain liquid." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of cavern upper limit." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern taper" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-distance over which caverns expand to full size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines full size of caverns, smaller values create larger caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon minimum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lower Y limit of dungeons." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon maximum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Upper Y limit of dungeons." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noises" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filler depth noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of biome filler depth." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Factor noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Variation of terrain vertical scale.\n" -"When noise is < -0.55 terrain is near-flat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of average terrain surface." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave1 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "First of two 3D noises that together define tunnels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave2 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Second of two 3D noises that together define tunnels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining giant caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ground noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V6 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen v6.\n" -"The 'snowbiomes' flag enables the new 5 biome system.\n" -"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" -"the 'jungles' flag is ignored." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Desert noise threshold" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Beach noise threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sandy beaches occur when np_beach exceeds this value." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain base noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of lower terrain and seabed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain higher noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of higher terrain that creates cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Steepness noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Varies steepness of cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height select noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines distribution of higher terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mud noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Varies depth of biome surface nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Beach noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines areas with sandy beaches." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of number of caves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trees noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines tree areas and tree density." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Apple trees noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines areas where trees have apples." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V7" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V7 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen v7.\n" -"'ridges': Rivers.\n" -"'floatlands': Floating land masses in the atmosphere.\n" -"'caverns': Giant caves deep underground." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain zero level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Y of mountain density gradient zero level. Used to shift mountains " -"vertically." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland minimum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lower Y limit of floatlands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland maximum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Upper Y limit of floatlands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland tapering distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Y-distance over which floatlands taper from full density to nothing.\n" -"Tapering starts at this distance from the Y limit.\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Floatland taper exponent" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Exponent of the floatland tapering. Alters the tapering behaviour.\n" -"Value = 1.0 creates a uniform, linear tapering.\n" -"Values > 1.0 create a smooth tapering suitable for the default separated\n" -"floatlands.\n" -"Values < 1.0 (for example 0.25) create a more defined surface level with\n" -"flatter lowlands, suitable for a solid floatland layer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland density" -msgstr "" - -#: src/settings_translation_file.cpp -#, c-format -msgid "" -"Adjusts the density of the floatland layer.\n" -"Increase value to increase density. Can be positive or negative.\n" -"Value = 0.0: 50% of volume is floatland.\n" -"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" -"to be sure) creates a solid floatland layer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland water level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Surface level of optional water placed on a solid floatland layer.\n" -"Water is disabled by default and will only be placed if this value is set\n" -"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" -"upper tapering).\n" -"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" -"When enabling water placement the floatlands must be configured and tested\n" -"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" -"required value depending on 'mgv7_np_floatland'), to avoid\n" -"server-intensive extreme water flow and to avoid vast flooding of the\n" -"world surface below." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain alternative noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain persistence noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Varies roughness of terrain.\n" -"Defines the 'persistence' value for terrain_base and terrain_alt noises." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain height noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of maximum mountain height (in nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridge underwater noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines large-scale river channel structure." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"3D noise defining mountain structure and height.\n" -"Also defines structure of floatland mountain terrain." -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 "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 "3D noise defining structure of river canyon walls." -msgstr "" +msgid "Ridge underwater noise" +msgstr "Ruído das cristas debaixo da auga" #: src/settings_translation_file.cpp -msgid "Floatland noise" -msgstr "" +msgid "Ridged mountain size noise" +msgstr "Ruído do tamaño das dorsais das montañas" #: src/settings_translation_file.cpp -msgid "" -"3D noise defining structure of floatlands.\n" -"If altered from the default, the noise 'scale' (0.7 by default) may need\n" -"to be adjusted, as floatland tapering functions best when this noise has\n" -"a value range of approximately -2.0 to 2.0." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Carpathian" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Carpathian specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Base ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the base ground level." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River channel width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the width of the river channel." -msgstr "" +msgid "Right key" +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 "Defines the depth of the river channel." -msgstr "" +msgid "River channel width" +msgstr "Largura da canle do río" + +#: src/settings_translation_file.cpp +msgid "River depth" +msgstr "Profundidade do río" + +#: src/settings_translation_file.cpp +msgid "River noise" +msgstr "Ruído do río" + +#: src/settings_translation_file.cpp +msgid "River size" +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 "Defines the width of the river valley." -msgstr "" +msgid "Rollback recording" +msgstr "Rexistro das accións" #: src/settings_translation_file.cpp -msgid "Hilliness1 noise" -msgstr "" +msgid "Rolling hill size noise" +msgstr "Tamaño do ruído de outeiros redondeados" #: src/settings_translation_file.cpp -msgid "First of 4 2D noises that together define hill/mountain range height." -msgstr "" +msgid "Rolling hills spread noise" +msgstr "Ruído espallado de outeiros redondeados" #: src/settings_translation_file.cpp -msgid "Hilliness2 noise" +msgid "Round minimap" +msgstr "Minimapa circular" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "Remover e colocar obxectos de maneira segura" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +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 "Gardar o mapa recibido polo cliente no disco." + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "Gardar automaticamente o tamaño da xanela cando é modificado." + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "Gardar mapa recibido do servidor" + +#: src/settings_translation_file.cpp +msgid "" +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"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 "Altura da xanela" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "Largura da xanela" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "Cartafol das capturas" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "Formato de captura de pantalla" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "Calidade de captura de pantalla" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"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 "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 "Hilliness3 noise" -msgstr "" +msgid "Second of two 3D noises that together define tunnels." +msgstr "Segundo de 2 ruídos 3D que xuntos definen túneis." #: src/settings_translation_file.cpp -msgid "Third of 4 2D noises that together define hill/mountain range height." -msgstr "" +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "Ver https://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp -msgid "Hilliness4 noise" -msgstr "" +msgid "Selection box border color (R,G,B)." +msgstr "Cor dos bordes da caixa de selección (R,G,B)." #: src/settings_translation_file.cpp -msgid "Fourth of 4 2D noises that together define hill/mountain range height." -msgstr "" +msgid "Selection box color" +msgstr "Cor da caixa de selección" #: src/settings_translation_file.cpp -msgid "Rolling hills spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridge mountain spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Step mountain spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rolling hill size noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridged mountain size noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Step mountain size noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of step mountains." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that locates the river valleys and channels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain variation noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Flat" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Flat specific flags" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y of flat ground." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lake threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Terrain noise threshold for lakes.\n" -"Controls proportion of world area covered by lakes.\n" -"Adjust towards 0.0 for a larger proportion." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lake steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hill threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Terrain noise threshold for hills.\n" -"Controls proportion of world area covered by hills.\n" -"Adjust towards 0.0 for a larger proportion." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hill steepness" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines location and terrain of optional hills and lakes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Fractal specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen Fractal.\n" -"'terrain' enables the generation of non-fractal terrain:\n" -"ocean, islands and underground." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fractal type" -msgstr "" +msgid "Selection box width" +msgstr "Largura da caixa de selección" #: src/settings_translation_file.cpp msgid "" @@ -6021,220 +6624,247 @@ 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 "Iterations" -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 "URL do servidor" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "Enderezo do servidor" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "Descripción do servidor" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "Nome do servidor" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "Porto do servidor" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +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 "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 "Ficheiro da lista de servidores" #: src/settings_translation_file.cpp msgid "" -"Iterations of the recursive function.\n" -"Increasing this increases the amount of fine detail, but also\n" -"increases processing load.\n" -"At iterations = 20 this mapgen has a similar load to mapgen V7." +"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 +#, 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 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: 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 "" -"(X,Y,Z) scale of fractal in nodes.\n" -"Actual fractal size will be 2 to 3 times larger.\n" -"These numbers can be made very large, the fractal does\n" -"not have to fit inside the world.\n" -"Increase these to 'zoom' into the detail of the fractal.\n" -"Default is for a vertically-squashed shape suitable for\n" -"an island, set all 3 numbers equal for the raw shape." +"Set the tilt of Sun/Moon orbit in degrees.\n" +"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 "" -"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" -"Can be used to move a desired point to (0, 0) to create a\n" -"suitable spawn point, or to allow 'zooming in' on a desired\n" -"point by increasing 'scale'.\n" -"The default is tuned for a suitable spawn point for Mandelbrot\n" -"sets with default parameters, it may need altering in other\n" -"situations.\n" -"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Slice w" +"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 "" -"W coordinate of the generated 3D slice of a 4D fractal.\n" -"Determines which 3D slice of the 4D shape is generated.\n" -"Alters the shape of the fractal.\n" -"Has no effect on 3D fractals.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia x" +"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 "" -"Julia set only.\n" -"X component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia y" +"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 "" -"Julia set only.\n" -"Y component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia z" +"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 "" -"Julia set only.\n" -"Z component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." +"Sets shadow texture quality to 32 bits.\n" +"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 "Julia w" -msgstr "" +msgid "Shader path" +msgstr "Camiño dos sombreadores" #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"W component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Has no effect on 3D fractals.\n" -"Range roughly -2 to 2." +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"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 "Seabed noise" -msgstr "" +msgid "Shadow filter quality" +msgstr "Calidade do filtro de sombras" #: src/settings_translation_file.cpp -msgid "Y-level of seabed." -msgstr "" +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Distancia do mapa de sombras en nós para renderizar sombras" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "" +msgid "Shadow map texture in 32 bits" +msgstr "Textura do mapa de sombras en 32 bits" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys specific flags" -msgstr "" +msgid "Shadow map texture size" +msgstr "Tamaño da textura do mapa de sombras" #: src/settings_translation_file.cpp msgid "" -"Map generation attributes specific to Mapgen Valleys.\n" -"'altitude_chill': Reduces heat with altitude.\n" -"'humid_rivers': Increases humidity around rivers.\n" -"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" -"to become shallower and occasionally dry.\n" -"'altitude_dry': Reduces humidity with altitude." +"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 +#, fuzzy +msgid "Shadow strength gamma" +msgstr "Intensidade da sombra" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "Forma do minimapa. Activado = redondo, desactivado = cadrado." + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "Mostrar información de depuración" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "Mostrar as caixas de selección de entidades" #: src/settings_translation_file.cpp msgid "" -"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" -"enabled. Also the vertical distance over which humidity drops by 10 if\n" -"'altitude_dry' is enabled." +"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 "Depth below which you'll find large caves." -msgstr "" +msgid "Show name tag backgrounds by default" +msgstr "Mostra os fondos das etiquetas de nome por defecto" #: src/settings_translation_file.cpp -msgid "Cavern upper limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Depth below which you'll find giant caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "How deep to make rivers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "How wide to make rivers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave noise #1" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave noise #2" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filler depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The depth of dirt or other biome filler node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Base terrain height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Raises terrain to make valleys around the rivers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley fill" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Slope and fill work together to modify the heights." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley profile" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amplifies the valleys." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley slope" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chunk size" -msgstr "" +msgid "Shutdown message" +msgstr "Mensaxe de desconexión" #: src/settings_translation_file.cpp msgid "" @@ -6245,84 +6875,1147 @@ msgid "" "Altering this value is for special usage, leaving it unchanged is\n" "recommended." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen debug" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dump the mapgen debug information." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Absolute limit of queued blocks to emerge" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of blocks that can be queued for loading." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Per-player limit of queued blocks load from disk" -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 "" -"Maximum number of blocks to be queued that are to be loaded from file.\n" -"This limit is enforced per player." +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"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 "Per-player limit of queued blocks to generate" +msgid "Sky Body Orbit Tilt" +msgstr "Inclinación da órbita do ceo" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "Porción w" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights." +msgstr "Pendente e recheo traballan xuntos para modificar as alturas." + +#: src/settings_translation_file.cpp +msgid "Small cave maximum number" +msgstr "Cantidade máxima de covas pequenas" + +#: src/settings_translation_file.cpp +msgid "Small cave minimum number" +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 "Iluminación suave" #: 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." +"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 "Number of emerge threads" -msgstr "" +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +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 "Suaviza a rotación da cámara. 0 para desactivar." + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "Tecla para agacharse" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "Velocidade ao estar agachado" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "Velocidade ao se agachar, en nós por segundo." + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Radio das sombras suaves" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "Son" #: src/settings_translation_file.cpp msgid "" -"Number of emerge threads to use.\n" -"Value 0:\n" -"- Automatic selection. The number of emerge threads will be\n" -"- 'number of processors - 2', with a lower limit of 1.\n" -"Any other value:\n" -"- Specifies the number of emerge threads, with a lower limit of 1.\n" -"WARNING: Increasing the number of emerge threads increases engine mapgen\n" -"speed, but this may harm game performance by interfering with other\n" -"processes, especially in singleplayer and/or when running Lua code in\n" -"'on_generated'. For many users the optimum setting may be '1'." +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(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 "Online Content Repository" +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 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 "ContentDB URL" +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"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 "" +"Spread of light curve boost range.\n" +"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 "Punto de aparición estático" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Ruído das pendentes" + +#: src/settings_translation_file.cpp +msgid "Step mountain size noise" +msgstr "Ruído do tamaño das montañas de paso" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "Ruído doespallamento das montañas de paso" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "Intensidade do modo de paralaxe 3D." + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"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 "Verificación estricta do protocolo" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "Eliminar códigos de cores" + +#: src/settings_translation_file.cpp +msgid "" +"Surface level of optional water placed on a solid floatland layer.\n" +"Water is disabled by default and will only be placed if this value is set\n" +"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" +"upper tapering).\n" +"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" +"When enabling water placement the floatlands must be configured and tested\n" +"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" +"required value depending on 'mgv7_np_floatland'), to avoid\n" +"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 "SQLite sincrónico" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +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 "Ruído alternativo do terreo" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Ruído base do terreo" + +#: src/settings_translation_file.cpp +msgid "Terrain height" +msgstr "Altura do terreo" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Maior ruído do terreo" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Ruído do terreo" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"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 "" +"Terrain noise threshold for lakes.\n" +"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 "Ruído de persistencia do terreo" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "Camiño dos packs de textura" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"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 "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"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 "O URL do repositorio de contido" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +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 "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 "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 "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"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 "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 "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"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 "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"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 "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"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 "O tipo de joystick" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" +"A distancia vertical sobre a que a calor cae 20 se é 'altitude_chill'\n" +"activado. Tamén a distancia vertical na que a humidade cae 10 se\n" +"'altitude_dry' está activado." + +#: 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 "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 "Intervalo de envío de tempo" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "Velocidade do tempo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" +"Tempo de espera para que o cliente elimine os datos do mapa non utilizados " +"da memoria." + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"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 "Tecla para alternar o modo cámara" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "Atraso da información sobre ferramentas" + +#: src/settings_translation_file.cpp +msgid "Touch screen threshold" +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 "ContentDB Flag Blacklist" +msgid "Trees noise" +msgstr "Ruído das árbores" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "Filtrado trilineal" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"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 "Mods seguros" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "URL á lista de servidores que aparece na xanela Xogo en liña." + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "Submostraxe" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"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 "Distancia de transferencia de xogador ilimitada" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "Eliminar datos do servidor non utilizados" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "Límite Y superior dos calabozos." + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "Límite Y superior dos terreos flotantes." + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +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 "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 "Usa o filtro anisótropo ao ver texturas desde un ángulo." + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "Usa o filtro bilineal ao escalar texturas." + +#: src/settings_translation_file.cpp +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 "" +"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 "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"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 "VBO" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "Sincronizaión vertical" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "Profundade dos vales" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "Recheo dos vales" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "Perfil dos vales" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "Inclinación dos vales" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "Variación da profundidade do recheo do bioma." + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +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 "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 "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 "Varía a pendiente dos acantilados." + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "Velocidade de escalada vertical, en nós por segundo." + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "Sincronización de pantalla vertical." + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "Controlador de vídeo" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "Ver o factor de balance" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "Distancia de visión en nós." + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "Ver a tecla de diminución do intervalo" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "Ver a tecla de aumento do intervalo" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Ver tecla de zoom" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "Campo de visión" + +#: src/settings_translation_file.cpp +msgid "Virtual joystick triggers Aux1 button" +msgstr "O joystick virtual activa o botón Aux1" + +#: src/settings_translation_file.cpp +msgid "Volume" +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 "" +"W coordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Alters the shape of the fractal.\n" +"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 "Velocidade ao camiñar e voar, en nós por segundo." + +#: src/settings_translation_file.cpp +msgid "Walking speed" +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 "Nivel da auga" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "Nivel da superficie da auga no mundo." + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "Bloques ondulantes" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "Movemento das follas" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "Ondas dos líquidos" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "Altura das ondas dos líquidos" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "Velocidade de movemento das ondas dos líquidos" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "Movemento das ondas dos líquidos" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "Movemento das plantas" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Cor de ligazóns web" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"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 "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"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 "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"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 "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 "Indica se hai que poñar néboa ao final da zona visible." + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"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 "" -"Comma-separated list of flags to hide in the content repository.\n" -"\"nonfree\" can be used to hide packages which do not qualify as 'free " -"software',\n" -"as defined by the Free Software Foundation.\n" -"You can also specify content ratings.\n" -"These flags are independent from Minetest versions,\n" -"so see a full list at https://content.minetest.net/help/content_flags/" +"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 "Largura das liñas do bloque de selección arredor dos nós." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"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 "Horario de inicio do mundo" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"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 "Modo de texturas aliñadas ao mundo" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +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 "Límite Y máximo das covas grandes." + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "Distancia Y sobre a cal as cavernas expándense até o seu tamaño total." + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "Nivel Y da superficie media do terreo." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Nivel Y do límite superior da caverna." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "Nivel Y de terreo que crea acantilados." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +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 "Tempo límite de descarga do ficheiro por cURL" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "Tempo limite de cURL" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +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." +#~ msgstr "Morreches" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/he/minetest.po b/po/he/minetest.po index f0a49f82e..f396cc0ba 100644 --- a/po/he/minetest.po +++ b/po/he/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Hebrew (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2019-11-10 15:04+0000\n" -"Last-Translator: Krock <mk939@ymail.com>\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/" "he/>\n" "Language: he\n" @@ -13,29 +13,99 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 3.10-dev\n" +"X-Generator: Weblate 4.6-dev\n" -#: builtin/client/death_formspec.lua src/client/game.cpp -msgid "Respawn" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "פקודות צ'אט" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "יציאה לתפריט" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "פקודה מקומית" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "שחקן יחיד" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "שחקן יחיד" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." msgstr "" +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "הזדמן" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" +msgstr "מתת" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "פקודה מקומית" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "פקודה מקומית" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" msgstr "" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" +msgstr "אישור" + +#: builtin/fstk/ui.lua +msgid "<none available>" msgstr "" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred in a Lua script:" -msgstr "אירעה שגיאה בקוד לואה (Lua), כנראה באחד המודים:" +msgstr "אירעה שגיאה בתסריט Lua:" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred:" -msgstr "התרחשה שגיאה:" +msgstr "אירעה שגיאה:" #: builtin/fstk/ui.lua msgid "Main menu" @@ -43,15 +113,36 @@ msgstr "תפריט ראשי" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "התחבר מחדש" +msgstr "התחברות מחדש" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "השרת מבקש שתתחבר מחדש:" +msgstr "השרת מבקש התחברות מחדש:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -59,15 +150,15 @@ msgstr "שגיאה בגרסאות הפרוטוקול. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "השרת יפעיל את פרוטוקול גרסה $1. בכוח " +msgstr "השרת מחייב שימוש בגרסת פרוטוקול $1. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " msgstr "השרת תומך בפרוטוקולים בין גרסה $1 וגרסה $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "נסה לצאת והכנס מחדש לרשימת השרתים ובדוק את חיבור האינטרנט שלך." +msgid "Visit website" +msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,86 +168,89 @@ msgstr "אנו תומכים רק בגירסה 1$ של הפרוטוקול." msgid "We support protocol versions between version $1 and $2." msgstr "אנו תומכים בגרסאות בין 1$ ל-2$ של הפרוטוקול." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "ביטול" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -#, fuzzy +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" -msgstr "תלוי ב:" +msgstr "תלויות:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Disable all" -msgstr "אפשר הכל" +msgstr "להשבית הכול" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Disable modpack" -msgstr "אפשר הכל" +msgstr "השבתת ערכת השיפורים" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "אפשר הכל" +msgstr "להפעיל הכול" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Enable modpack" -msgstr "אפשר הכל" +msgstr "הפעלת ערכת השיפורים" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"טעינת המוד \"1$\" נכשלה מכיוון שהוא מכיל תווים לא חוקיים. רק התווים [a-" +"הפעלת השיפור \"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" -msgstr "" +msgstr "אין תלויות (רשות)" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." -msgstr "" +msgstr "לא סופק תיאור משחק." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy 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 msgid "Save" -msgstr "שמור" +msgstr "שמירה" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" @@ -167,413 +261,519 @@ msgid "enabled" msgstr "מופעל" #: builtin/mainmenu/dlg_contentstore.lua -msgid "All packages" -msgstr "" +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" כבר קיים. האם תרצה להחליף אותו?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "התלויות $1 ו $2 יותקנו." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "$1 כעת בהורדה..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "לא ניתן למצוא תלות חובה של $1." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 יותקן ו $2 תלויות שידולגו." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "כל החבילות" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "כבר מותקן" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Back to Main Menu" -msgstr "תפריט ראשי" +msgstr "חזרה לתפריט הראשי" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "משחק בסיסי:" #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgstr "בסיס נתוני התוכן לא זמין כאשר מיינטסט מקומפל בלי cUrl" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "טוען..." +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 "משחקים" #: builtin/mainmenu/dlg_contentstore.lua msgid "Install" -msgstr "החקן" +msgstr "התקנה" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "התקנת $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "מתקין תלויות חסרות" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "התקנה: סוג קובץ לא נתמך \"$1\" או שהארכיב פגום" #: 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" -msgstr "" +msgstr "אין תוצאות" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "חפש" +msgid "No updates" +msgstr "אין עדכונים" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "לא נמצא" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "דרוס" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "אנא בדוק שמשחק הבסיס תקין." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "נכנס לתור" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Texture packs" -msgstr "חבילות מרקם" +msgstr "חבילות טקסטורה (מרקם)" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Uninstall" -msgstr "החקן" +msgstr "הסרה" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "" +msgstr "עדכון" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "עדכן הכל [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "צפה במידע נוסף בדפדפן האינטרנט" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "עולם בשם \"1$\" כבר קיים" +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" -msgstr "" +msgstr "מיזוג ביומים (אקולוגי)" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" -msgstr "" +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" -msgstr "ליצור" +msgstr "יצירה" #: builtin/mainmenu/dlg_create_world.lua msgid "Decorations" -msgstr "" +msgstr "קישוטים" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy -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\"" +msgid "Development Test is meant for developers." +msgstr "אזהרה: מצב בדיקת הפיתוח נועד למפתחים." #: 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 "צור שטח לא פרקטלי: אוקיינוסים ותת קרקעי" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +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 msgid "Lakes" -msgstr "" +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 -#, fuzzy msgid "Mapgen-specific flags" -msgstr "מנוע מפות" +msgstr "אפשרויות ספציפיות למנוע מפות" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +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 -#, fuzzy msgid "No game selected" -msgstr "אין עולם נוצר או נבחר!" +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" -msgstr "" +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 msgid "Seed" -msgstr "" +msgstr "זרע" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "מעבר חלק בין אזורי אקלים שונים" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" -msgstr "" +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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "אזהרה: מצב המפתחים נועד למפתחים!." +msgstr "מערות גדולות מאוד עמוק מתחת לאדמה" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "שם העולם" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "You have no games installed." -msgstr "אין לך אף מפעיל משחק מותקן." +msgstr "אין לך משחקים מותקנים." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "האם ברצונך למחוק את \"$1\"?" +msgstr "האם אכן ברצונך למחוק את \"$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 "מחיקה" #: 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\"?" +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 "קבל" +msgstr "הסכמה" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "" +msgstr "שינוי שם ערכת השיפורים:" #: 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.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 "רעש דו-מיימדי" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "" +msgstr "חזור לדף ההגדרות >" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" -msgstr "" +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 "" +msgstr "מושבת" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "" +msgstr "עריכה" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" -msgstr "" +msgstr "מופעל" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Lacunarity" -msgstr "" +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 "Persistance" -msgstr "" +#, fuzzy +msgid "Persistence" +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" +msgstr "חיפוש" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Select directory" -msgstr "בחר עולם:" +msgstr "נא לבחור תיקיה" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Select file" -msgstr "בחר עולם:" +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" -msgstr "" +msgstr "X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X spread" -msgstr "" +msgstr "מרווחיות X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y" -msgstr "" +msgstr "Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y spread" -msgstr "" +msgstr "מרווחיות Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z" -msgstr "" +msgstr "Z" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z spread" -msgstr "" +msgstr "מרווחיות Z" #. ~ "absvalue" is a noise parameter flag. #. It is short for "absolute value". @@ -581,14 +781,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 @@ -596,157 +796,169 @@ msgstr "" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "eased" -msgstr "" +msgstr "החלקת ערכים" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "$1 (Enabled)" -msgstr "מופעל" +msgstr "$1 (מופעל)" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy 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 "" +msgstr "התקנת שיפור: לא ניתן למצוא את שם השיפור האמיתי עבור: $1" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" +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 "אין אפשרות להתקין ערכת שיפורים בשם $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "כעת בטעינה..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "רשימת השרתים הציבורים מושבתת" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"נא לנסות לצאת ולהיכנס מחדש לרשימת השרתים ולבדוק את החיבור שלך לאינטרנט." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "תורמים פעילים" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "טווח שליחת אובייקט פעיל" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "מפתחים עיקריים" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "תורמים קודמים" + +#: 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 msgid "Browse online content" -msgstr "" +msgstr "עיון בתוכן מקוון" #: builtin/mainmenu/tab_content.lua msgid "Content" -msgstr "" +msgstr "תוכן" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Disable Texture Pack" -msgstr "חבילות מרקם" +msgstr "השבתת חבילת המרקם" #: builtin/mainmenu/tab_content.lua msgid "Information:" -msgstr "" +msgstr "מידע:" #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" -msgstr "" +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" -msgstr "" +msgstr "שנה שם" #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" -msgstr "" +msgstr "הסרת החבילה" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Use Texture Pack" -msgstr "חבילות מרקם" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "קרדיטים" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -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 "Configure" -msgstr "קביעת תצורה" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "משחק יצירתי" +msgstr "מצב יצירתי" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" -msgstr "אפשר נזק" +msgstr "לאפשר חבלה" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Host Game" -msgstr "הסתר משחק" +msgstr "אירוח משחק" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Host Server" -msgstr "שרת" +msgstr "אכסון שרת" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "שם/סיסמה" +msgstr "התקנת משחק מContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -754,186 +966,202 @@ msgstr "חדש" #: builtin/mainmenu/tab_local.lua msgid "No world created or selected!" -msgstr "אין עולם נוצר או נבחר!" +msgstr "אין עולם שנוצר או נבחר!" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Play Game" -msgstr "התחל משחק" +msgstr "להתחיל לשחק" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "פורט" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "בחירת שיפורים" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" -msgstr "בחר עולם:" +msgstr "נא לבחור עולם:" #: builtin/mainmenu/tab_local.lua msgid "Server Port" -msgstr "" +msgstr "פורט לשרת" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Start Game" -msgstr "הסתר משחק" - -#: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "כתובת / פורט" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "התחבר" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Creative mode" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "" +msgstr "התחלת המשחק" #: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "Join Game" -msgstr "הסתר משחק" +msgid "Address" +msgstr "- כתובת: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "שם/סיסמה" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "נקה" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Ping" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Creative mode" +msgstr "מצב יצירתי" #. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP אפשר" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "חבלה" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" +msgstr "מועדף" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Join Game" +msgstr "הצטרפות למשחק" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "פינג" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "הכרז על השרת" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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 "" +msgstr "x2" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "" +msgstr "עננים תלת מימדיים" #: builtin/mainmenu/tab_settings.lua msgid "4x" -msgstr "" +msgstr "x4" #: builtin/mainmenu/tab_settings.lua msgid "8x" -msgstr "" +msgstr "x8" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "All Settings" -msgstr "הגדרות" +msgstr "כל ההגדרות" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" +msgstr "החלקת קצוות (AA):" #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" -msgstr "" +msgstr "שמור אוטומטית גודל מסך" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" +msgstr "פילטר בילינארי" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" +msgstr "שנה מקשים" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "זכוכיות מחוברות" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" msgstr "" #: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Connected Glass" -msgstr "התחבר" +msgid "Dynamic shadows:" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" +msgstr "עלים מגניבים" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "" +msgstr "מיפמאפ" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap + Aniso. Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "לא" +msgstr "מיפמאפ + פילטר אניסוטרופי" #: builtin/mainmenu/tab_settings.lua msgid "No Filter" -msgstr "" +msgstr "בלי פילטר" #: builtin/mainmenu/tab_settings.lua msgid "No Mipmap" -msgstr "" +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" -msgstr "" +msgstr "ללא" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" -msgstr "" +msgstr "עלים אטומים" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" +msgstr "מים אטומים לאור" #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "חלקיקים" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Reset singleplayer world" -msgstr "שרת" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" -msgstr "" +msgstr "מסך:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" @@ -941,223 +1169,238 @@ msgstr "הגדרות" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" -msgstr "" +msgstr "שיידרים" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "שיידרים (נסיוני)" #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" -msgstr "" +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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -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 "פילטר תלת לינארי" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" 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 "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "כן" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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!" -msgstr "" +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 "" +#, fuzzy +msgid "Could not find or load game: " +msgstr "לא מצליח למצוא או לטעון משחק \"" #: src/client/clientlauncher.cpp msgid "Invalid gamespec." -msgstr "" +msgstr "הגדרת משחק לא תקינה." #: src/client/clientlauncher.cpp msgid "Main Menu" -msgstr "" +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!" -msgstr "" +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 "" - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" +msgstr "נתיב העולם שניתן לא קיים: " #: src/client/game.cpp msgid "" "\n" "Check debug.txt for details." msgstr "" +"\n" +"בדוק את debug.txt לפרטים נוספים." #: src/client/game.cpp -#, fuzzy msgid "- Address: " -msgstr "כתובת / פורט" - -#: src/client/game.cpp -#, fuzzy -msgid "- Creative Mode: " -msgstr "משחק יצירתי" - -#: src/client/game.cpp -#, fuzzy -msgid "- Damage: " -msgstr "אפשר נזק" +msgstr "- כתובת: " #: src/client/game.cpp msgid "- Mode: " -msgstr "" +msgstr "- מצב: " #: src/client/game.cpp -#, fuzzy msgid "- Port: " -msgstr "פורט" +msgstr "- פורט: " #: src/client/game.cpp -#, fuzzy msgid "- Public: " -msgstr "ציבורי" +msgstr "- ציבורי: " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "" +msgstr "- קרב: " #: src/client/game.cpp msgid "- Server Name: " +msgstr "- שם שרת: " + +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "אירעה שגיאה:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" msgstr "" #: src/client/game.cpp msgid "Automatic forward disabled" -msgstr "" +msgstr "התקדמות אוטומטית קדימה מבוטלת" #: src/client/game.cpp msgid "Automatic forward enabled" +msgstr "תנועה קדימה אוטומטית מופעל" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" msgstr "" #: src/client/game.cpp msgid "Camera update disabled" -msgstr "" +msgstr "עדכון מצלמה מבוטל" #: src/client/game.cpp msgid "Camera update enabled" +msgstr "עדכון מצלמה מופעל" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" msgstr "" #: 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 +#, fuzzy +msgid "Client disconnected" +msgstr "קלינט" #: src/client/game.cpp msgid "Client side scripting is disabled" -msgstr "" +msgstr "סקריפטים בצד לקוח מבוטלים" #: src/client/game.cpp msgid "Connecting to server..." +msgstr "מתחבר לשרת..." + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" msgstr "" #: src/client/game.cpp msgid "Continue" -msgstr "" +msgstr "המשך" #: src/client/game.cpp #, c-format @@ -1167,36 +1410,55 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- 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 "" #: 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 msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "" +msgstr "מידע דיבאג, גרף פרופיילר, ומצב שלד מוסתר" #: src/client/game.cpp msgid "" @@ -1213,165 +1475,156 @@ msgid "" "- touch&drag, tap 2nd finger\n" " --> place single item to slot\n" msgstr "" +"פקדי ברירת מחדל:\n" +"לא נראה תפריט:\n" +"- לחיצה בודדת: הפעלת כפתור\n" +"- הקשה כפולה: מקום / שימוש\n" +"- החלק אצבע: הביט סביב\n" +"תפריט / מלאי גלוי:\n" +"- לחיצה כפולה (בחוץ):\n" +"--> סגור\n" +"- מחסנית מגע, חריץ מגע:\n" +"--> הזז מחסנית\n" +"- גע וגרור, הקש על האצבע השנייה\n" +"--> מקם פריט יחיד לחריץ\n" #: 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" -msgstr "" +msgstr "יציאה לתפריט" #: src/client/game.cpp msgid "Exit to OS" -msgstr "" +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 "" +msgstr "מצב המהירות מופעל (לתשומת ליבך: אין הרשאת \"fast\")" #: src/client/game.cpp msgid "Fly mode disabled" -msgstr "" +msgstr "מצב התעופה מושבת" #: src/client/game.cpp -#, fuzzy msgid "Fly mode enabled" -msgstr "מופעל" +msgstr "מצב התעופה מופעל" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "" +msgstr "מצב התעופה מופעל (לתשומת ליבך: אין הרשאת \"fly\")" #: src/client/game.cpp msgid "Fog disabled" -msgstr "" +msgstr "ערפל מבוטל" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled" -msgstr "מופעל" +msgstr "ערפל מופעל" #: src/client/game.cpp msgid "Game info:" -msgstr "" +msgstr "מידע על המשחק:" #: src/client/game.cpp -#, fuzzy 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" -msgstr "" +msgstr "‏KiB/s" #: src/client/game.cpp msgid "Media..." -msgstr "" +msgstr "מדיה..." #: src/client/game.cpp msgid "MiB/s" -msgstr "" +msgstr "מגהבייט/שניה" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "" +msgstr "מיפמאפ כרגע מבוטל ע\"י המשחק או המוד" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +#, fuzzy +msgid "Multiplayer" +msgstr "שחקן יחיד" #: src/client/game.cpp msgid "Noclip mode disabled" -msgstr "" +msgstr "מעבר דרך קירות מבוטל" #: src/client/game.cpp msgid "Noclip mode enabled" -msgstr "" +msgstr "מעבר דרך קירות מופעל" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "" +msgstr "מעבר דרך קירות מופעל (שים לב, אין הרשאת 'noclip')" #: src/client/game.cpp msgid "Node definitions..." -msgstr "" +msgstr "הגדרות קוביה..." #: src/client/game.cpp msgid "Off" -msgstr "" +msgstr "מכובה" #: src/client/game.cpp msgid "On" -msgstr "" +msgstr "דולק" #: src/client/game.cpp msgid "Pitch move mode disabled" -msgstr "" +msgstr "תנועה לכיוון מבט מכובה" #: src/client/game.cpp msgid "Pitch move mode enabled" -msgstr "" +msgstr "תנועה לכיוון מבט מופעל" #: src/client/game.cpp msgid "Profiler graph shown" -msgstr "" +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" @@ -1379,262 +1632,272 @@ msgstr "שחקן יחיד" #: src/client/game.cpp msgid "Sound Volume" -msgstr "" +msgstr "ווליום שמע" #: src/client/game.cpp msgid "Sound muted" -msgstr "" +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" +msgstr "מערכת שמע מופעלת" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" msgstr "" #: 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" -msgstr "" +msgstr "מסגרת שלדית מוצגת" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "" +msgstr "המבט מקרוב מושבת על ידי המשחק או השיפור" #: src/client/game.cpp msgid "ok" -msgstr "" +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" -msgstr "" +msgstr "מידע-על-מסך מוסתר" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "" +msgstr "מידע-על-מסך מוצג" #: src/client/gameui.cpp msgid "Profiler hidden" -msgstr "" +msgstr "פרופיילר מוסתר" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" +msgstr "פרופיילר מוצג (עמוד %d מתוך %d)" #: src/client/keycode.cpp msgid "Apps" -msgstr "" +msgstr "אפליקציות" #: src/client/keycode.cpp msgid "Backspace" -msgstr "" +msgstr "Backspace" #: src/client/keycode.cpp msgid "Caps Lock" -msgstr "" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" +msgstr "Caps Lock" #: src/client/keycode.cpp msgid "Control" -msgstr "" +msgstr "קונטרול" #: src/client/keycode.cpp msgid "Down" -msgstr "" +msgstr "למטה" #: src/client/keycode.cpp msgid "End" -msgstr "" +msgstr "End" #: src/client/keycode.cpp msgid "Erase EOF" -msgstr "" +msgstr "מחק EOF" #: src/client/keycode.cpp msgid "Execute" -msgstr "" +msgstr "בצע" #: src/client/keycode.cpp msgid "Help" -msgstr "" +msgstr "עזרה" #: src/client/keycode.cpp msgid "Home" -msgstr "" +msgstr "Home" #: src/client/keycode.cpp -#, fuzzy msgid "IME Accept" -msgstr "קבל" +msgstr "קבל IME" #: src/client/keycode.cpp msgid "IME Convert" -msgstr "" +msgstr "המרת IME" #: src/client/keycode.cpp msgid "IME Escape" -msgstr "" +msgstr "יציאת IME" #: src/client/keycode.cpp msgid "IME Mode Change" -msgstr "" +msgstr "שינוי מצב IME" #: src/client/keycode.cpp msgid "IME Nonconvert" -msgstr "" +msgstr "IME ללא המרה" #: src/client/keycode.cpp msgid "Insert" -msgstr "" +msgstr "Insert" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Left" -msgstr "" +msgstr "שמאלה" #: src/client/keycode.cpp msgid "Left Button" -msgstr "" +msgstr "הלחצן השמאלי" #: src/client/keycode.cpp msgid "Left Control" -msgstr "" +msgstr "מקש Control השמאלי" #: src/client/keycode.cpp msgid "Left Menu" -msgstr "" +msgstr "תפריט שמאלי" #: src/client/keycode.cpp msgid "Left Shift" -msgstr "" +msgstr "מקש Shift השמאלי" #: src/client/keycode.cpp msgid "Left Windows" -msgstr "" +msgstr "מקש Windows השמאלי" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp msgid "Menu" -msgstr "" +msgstr "תפריט" #: src/client/keycode.cpp msgid "Middle Button" -msgstr "" +msgstr "כפתור אמצעי" #: src/client/keycode.cpp msgid "Num Lock" -msgstr "" +msgstr "נעילה נומרית" #: src/client/keycode.cpp msgid "Numpad *" -msgstr "" +msgstr "מקלדת נומרית *" #: src/client/keycode.cpp msgid "Numpad +" -msgstr "" +msgstr "מקלדת נומרית +" #: src/client/keycode.cpp msgid "Numpad -" -msgstr "" +msgstr "מקלדת נומרית -" #: src/client/keycode.cpp msgid "Numpad ." -msgstr "" +msgstr "מקלדת נומרית ." #: src/client/keycode.cpp msgid "Numpad /" -msgstr "" +msgstr "מקלדת נומרית /" #: src/client/keycode.cpp msgid "Numpad 0" -msgstr "" +msgstr "מקלדת נומרית 0" #: src/client/keycode.cpp msgid "Numpad 1" -msgstr "" +msgstr "מקלדת נומרית 1" #: src/client/keycode.cpp msgid "Numpad 2" -msgstr "" +msgstr "מקלדת נומרית 2" #: src/client/keycode.cpp msgid "Numpad 3" -msgstr "" +msgstr "מקלדת נומרית 3" #: src/client/keycode.cpp msgid "Numpad 4" -msgstr "" +msgstr "מקלדת נומרית 4" #: src/client/keycode.cpp msgid "Numpad 5" -msgstr "" +msgstr "מקלדת נומרית 5" #: src/client/keycode.cpp msgid "Numpad 6" -msgstr "" +msgstr "מקלדת נומרית 6" #: src/client/keycode.cpp msgid "Numpad 7" -msgstr "" +msgstr "מקלדת נומרית 7" #: src/client/keycode.cpp msgid "Numpad 8" -msgstr "" +msgstr "מקלדת נומרית 8" #: src/client/keycode.cpp msgid "Numpad 9" -msgstr "" +msgstr "מקלדת נומרית 9" #: src/client/keycode.cpp msgid "OEM Clear" -msgstr "" +msgstr "ניקוי OME" #: 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" @@ -1643,280 +1906,289 @@ msgstr "שחק" #. ~ "Print screen" key #: src/client/keycode.cpp msgid "Print" -msgstr "" +msgstr "PrintScreen" #: src/client/keycode.cpp msgid "Return" -msgstr "" +msgstr "Enter" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Right" -msgstr "" +msgstr "ימינה" #: src/client/keycode.cpp msgid "Right Button" -msgstr "" +msgstr "הלחצן הימני" #: src/client/keycode.cpp msgid "Right Control" -msgstr "" +msgstr "מקש Control הימני" #: src/client/keycode.cpp msgid "Right Menu" -msgstr "" +msgstr "תפריט ימני" #: src/client/keycode.cpp msgid "Right Shift" -msgstr "" +msgstr "מקש Shift הימני" #: src/client/keycode.cpp msgid "Right Windows" -msgstr "" +msgstr "מקש 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 "שינה" #: src/client/keycode.cpp msgid "Snapshot" -msgstr "" +msgstr "צילום רגעי" #: src/client/keycode.cpp msgid "Space" -msgstr "" +msgstr "רווח" #: src/client/keycode.cpp msgid "Tab" -msgstr "" +msgstr "Tab" #: src/client/keycode.cpp msgid "Up" -msgstr "" +msgstr "למעלה" #: src/client/keycode.cpp msgid "X Button 1" -msgstr "" +msgstr "X כפתור 1" #: src/client/keycode.cpp msgid "X Button 2" -msgstr "" +msgstr "X כפתור 2" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" -msgstr "" +msgstr "זום" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "מפה קטנה מוסתרת" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "מפה קטנה במצב מכ״ם, יחס תצוגה x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "מפה קטנה במצב שטח, זום x %d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "מפה קטנה במצב טקסטורה" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "הורדת $1 נכשלה" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" -msgstr "" +msgstr "להמשיך" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "" +#, fuzzy +msgid "\"Aux1\" = climb down" +msgstr "\"מיוחד\" = טפס למטה" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" -msgstr "" +msgstr "קדימה אוטומטי" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" +msgstr "קפיצה אוטומטית" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" +msgstr "אחורה" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" -msgstr "" +msgstr "שנה מצלמה" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" -msgstr "" +msgstr "צ'אט" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" -msgstr "" +msgstr "פקודה" #: src/gui/guiKeyChangeMenu.cpp msgid "Console" -msgstr "" +msgstr "קונסולה" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. range" -msgstr "" +msgstr "הקטן טווח" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. volume" -msgstr "" +msgstr "הנמך ווליום" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "" +msgstr "לחיצה כפולה על \"קפיצה\" כדי לכבות או להדליק את מצב התעופה" #: src/gui/guiKeyChangeMenu.cpp msgid "Drop" -msgstr "" +msgstr "הפל" #: src/gui/guiKeyChangeMenu.cpp msgid "Forward" -msgstr "" +msgstr "קדימה" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. range" -msgstr "" +msgstr "הגדל טווח" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" -msgstr "" +msgstr "הגבר ווליום" #: src/gui/guiKeyChangeMenu.cpp msgid "Inventory" -msgstr "" +msgstr "תיק חפצים" #: src/gui/guiKeyChangeMenu.cpp msgid "Jump" -msgstr "" +msgstr "קפיצה" #: src/gui/guiKeyChangeMenu.cpp msgid "Key already in use" -msgstr "" +msgstr "מקש כבר בשימוש" #: 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 "פקודה מקומית" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" -msgstr "" +msgstr "השתק" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" -msgstr "" +msgstr "הפריט הבא" #: src/gui/guiKeyChangeMenu.cpp msgid "Prev. item" -msgstr "" +msgstr "הפריט הקודם" #: src/gui/guiKeyChangeMenu.cpp msgid "Range select" -msgstr "" +msgstr "בחר טווח" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Screenshot" -msgstr "" +msgstr "צילום מסך" #: src/gui/guiKeyChangeMenu.cpp msgid "Sneak" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" +msgstr "התכופף" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" -msgstr "" +msgstr "מתג מידע על מסך" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle chat log" -msgstr "" +msgstr "מתג צא'ט לוג" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "" +msgstr "מתג מצב מהיר" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fly" -msgstr "" +msgstr "מתג תעופה" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" -msgstr "" +msgstr "מתג ערפל" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle minimap" -msgstr "" +msgstr "מתג מפה קטנה" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle noclip" -msgstr "" +msgstr "מתג מעבר דרך קירות" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle pitchmove" -msgstr "" +msgstr "מתג תנועה לכיוון מבט" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" -msgstr "" +msgstr "לחץ מקש" #: src/gui/guiPasswordChange.cpp msgid "Change" -msgstr "" - -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" +msgstr "שנה" #: src/gui/guiPasswordChange.cpp msgid "New Password" -msgstr "" +msgstr "סיסמה חדשה" #: src/gui/guiPasswordChange.cpp msgid "Old Password" -msgstr "" +msgstr "סיסמה ישנה" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "סיסמאות לא תואמות!" #: src/gui/guiVolumeChange.cpp msgid "Exit" -msgstr "" +msgstr "יציאה" #: src/gui/guiVolumeChange.cpp msgid "Muted" -msgstr "" +msgstr "מושתק" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "" +#, fuzzy, c-format +msgid "Sound Volume: %d%%" +msgstr "עוצמת שמע: " #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1925,18 +2197,34 @@ 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" "If disabled, virtual joystick will center to first-touch's position." msgstr "" +"(Android) מתקן את המיקום של הג'ויסטיק הווירטואלי.\n" +"אם מושבת, הג'ויסטיק הווירטואלי יעמוד במיקום המגע הראשון." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) השתמש בג'ויסטיק וירטואלי כדי להפעיל את כפתור \"aux\".\n" +"אם הוא מופעל, הג'ויסטיק הווירטואלי ילחץ גם על כפתור \"aux\" כשהוא מחוץ למעגל " +"הראשי." #: src/settings_translation_file.cpp msgid "" @@ -1949,6 +2237,14 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"(X, Y, Z) היסט של פרקטל ממרכז עולמי ביחידות 'סקאלה'.\n" +"ניתן להשתמש בה כדי להעביר נקודה רצויה ל (0, 0) כדי ליצור\n" +"נקודת הופעה מתאימה, או כדי לאפשר 'התקרבות' לנקודה רצויה\n" +"על ידי הגדלת 'סקאלה'.\n" +"ברירת המחדל מכוונת לנקודת הופעה מתאימה למנדלברוט\n" +"קבוצות עם פרמטרי ברירת מחדל, יתכן שיהיה צורך לשנות זאת\n" +"מצבים.\n" +"טווח בערך -2 עד 2. הכפל באמצעות 'קנה מידה' עבור קיזוז בצמתים." #: src/settings_translation_file.cpp msgid "" @@ -1960,62 +2256,65 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" +"(X, Y, Z) סקאלה של פרקטל בצמתים.\n" +"גודל הפרקטל בפועל יהיה גדול פי 2 עד 3.\n" +"ניתן להפוך את המספרים הללו לגדולים מאוד, כך הפרקטל\n" +"לא צריך להשתלב בעולם.\n" +"הגדל את אלה ל\"התקרב \"לפרטי הפרקטל.\n" +"ברירת המחדל היא לצורה מעוכה אנכית המתאימה ל\n" +"אי, קבע את כל 3 המספרים שווים לצורה הגולמית." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" +msgstr "רעש דו-ממדי השולט על צורתם / גודל ההרים המחורצים." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgstr "רעש דו-ממדי השולט על צורתם / גודל הגבעות המתונות." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgstr "רעש דו-ממדי השולט על צורתם / גודל ההרים הנישאים." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" +msgstr "רעש דו-ממדי השולט על תדירות/ גודל רכסי ההרים." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +msgstr "רעש דו-ממדי השולט על תדירות/גודל הגבעות המתונות." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" +msgstr "רעש דו-ממדי השולט על תדירות/גודל רכסי ההרים." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgstr "רעש דו-ממדי שמאתר את עמקי הנהרות ותעלותיהם." #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" +msgstr "עננים תלת מימדיים" #: src/settings_translation_file.cpp msgid "3D mode" -msgstr "" +msgstr "מצב תלת־ממד" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" -msgstr "" +msgstr "חוזק פרלקסה במצב תלת ממדי" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "" +msgstr "רעשי תלת מימד המגדירים מערות ענק." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" +"רעש תלת ממדי המגדיר את מבנה ההרים וגובהם.\n" +"מגדיר גם מבנה שטח הרים צפים." #: src/settings_translation_file.cpp msgid "" @@ -2024,22 +2323,27 @@ 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 "" +"רעש תלת ממדי מגדיר מבנה של שטחי צף.\n" +"אם משתנה מברירת המחדל, ייתכן ש\"סקאלת\" הרעש (0.7 כברירת מחדל) זקוקה\n" +"להיות מותאמת, מכיוון שההתפשטות של שטחי צף מתפקדת בצורה הטובה ביותר כאשר יש " +"לרעש זה\n" +"טווח ערכים של כ -2.0 עד 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." -msgstr "" +msgstr "מבנה מגדיר רעש תלת ממדי של קירות קניון הנהר." #: src/settings_translation_file.cpp msgid "3D noise defining terrain." -msgstr "" +msgstr "רעש תלת ממדי המגדיר שטח." #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." -msgstr "" +msgstr "רעש תלת ממדי להרים תלויים, צוקים וכו'בדרך כלל וריאציות קטנות." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" +msgstr "רעש תלת ממדי הקובע את מספר הצינוקים בנתח מפה." #: src/settings_translation_file.cpp msgid "" @@ -2054,52 +2358,72 @@ msgid "" "- pageflip: quadbuffer based 3d.\n" "Note that the interlaced mode requires shaders to be enabled." msgstr "" +"תמיכה בתלת מימד.\n" +"נתמך כרגע:\n" +"- ללא: אין פלט תלת-ממדי.\n" +"- אנאגליף: צבע ציאן / מגנטה 3d.\n" +"- interlaced: תמיכה במסך קיטוב מבוסס מוזר / שווה\n" +"- topbottom: מסך מפוצל למעלה / למטה.\n" +"- צדדי: פיצול מסך זה לצד זה.\n" +"- תצוגת רוחב: 3D עם עיניים צולבות\n" +"- pageflip: quadbuffer מבוסס 3d.\n" +"שים לב שמצב 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." msgstr "" +"זרע מפה שנבחר עבור מפה חדשה, השאר ריק לאקראי.\n" +"יבוטל בעת יצירת עולם חדש בתפריט הראשי." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "הודעה שתוצג בפני כל הלקוחות כאשר השרת קורס." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" +msgstr "הודעה שתוצג בפני כל הלקוחות כאשר השרת יכבה." #: src/settings_translation_file.cpp msgid "ABM interval" -msgstr "" +msgstr "אינטרוול ABM" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "הקצאת זמן ABM" #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "" +msgstr "מגבלה מוחלטת של בלוקים בתור שיופיעו" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "תאוצה באויר" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "האצת כוח הכבידה, בקוביות לשנייה בריבוע." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "משניי בלוק פעיל" #: src/settings_translation_file.cpp msgid "Active block management interval" -msgstr "" +msgstr "אינטרוול ניהול בלוק פעיל" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "" +msgstr "טווח בלוק פעיל" #: src/settings_translation_file.cpp msgid "Active object send range" -msgstr "" +msgstr "טווח שליחת אובייקט פעיל" #: src/settings_translation_file.cpp msgid "" @@ -2107,15 +2431,22 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"כתובת להתחברות אליה.\n" +"השאר את זה ריק כדי להפעיל שרת מקומי.\n" +"שים לב ששדה הכתובת בתפריט הראשי עוקף הגדרה זו." #: src/settings_translation_file.cpp msgid "Adds particles when digging a node." -msgstr "" +msgstr "הוסף חלקיקים כשחופרים בקוביה." #: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." +msgstr "התאם את תצורת dpi למסך שלך (לא X11 / Android בלבד) למשל. למסכי 4k." + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." msgstr "" #: src/settings_translation_file.cpp @@ -2127,10 +2458,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 "" +"מכוון את הצפיפות של שכבת אדמות צותף.\n" +"הגדל את הערך כדי להגדיל את הצפיפות. יכול להיות חיובי או שלילי.\n" +"ערך = 0.0: 50% מהנפח הוא שטח צף.\n" +"ערך = 2.0 (יכול להיות גבוה יותר בהתאם ל- 'mgv7_np_floatland', בדוק תמיד\n" +"כדי להיות בטוח) יוצר שכבת צף מוצקה." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "הוסף שם פריט" #: src/settings_translation_file.cpp msgid "Advanced" -msgstr "" +msgstr "מתקדם" #: src/settings_translation_file.cpp msgid "" @@ -2140,60 +2481,68 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" +"משנה את עקומת האור על ידי החלת 'תיקון גמא' עליה.\n" +"ערכים גבוהים הופכים את רמות האור האמצעיות והתחתונות לבהירות יותר.\n" +"הערך '1.0' משאיר את עקומת האור ללא שינוי.\n" +"יש לכך השפעה משמעותית רק על אור יום ומלאכותי\n" +"זה משפיע מעט מאוד על אור הלילה הטבעי." #: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "" +#, fuzzy +msgid "Always fly fast" +msgstr "תמיד לעוף ומהר" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" -msgstr "" +msgstr "גמא חסימה סביבתית" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "כמות ההודעות ששחקן עשוי לשלוח לכל 10 שניות." #: src/settings_translation_file.cpp msgid "Amplifies the valleys." -msgstr "" +msgstr "מגביר את העמקים." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" -msgstr "" +msgstr "פילטר אנטיסטרופי" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "" +msgstr "הכרזת שרת" #: src/settings_translation_file.cpp msgid "Announce to this serverlist." -msgstr "" +msgstr "הכרז לרשימת השרתים." #: src/settings_translation_file.cpp msgid "Append item name" -msgstr "" +msgstr "הוסף שם פריט" #: src/settings_translation_file.cpp msgid "Append item name to tooltip." -msgstr "" +msgstr "הוסף את שם הפריט לטיפ הכלים." #: src/settings_translation_file.cpp msgid "Apple trees noise" -msgstr "" +msgstr "רעש עצי תפוחים" #: src/settings_translation_file.cpp msgid "Arm inertia" -msgstr "" +msgstr "אינרציה בזרוע" #: src/settings_translation_file.cpp msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" +"אינרציה בזרוע, נותנת תנועה מציאותית יותר של\n" +"הזרוע כשהמצלמה נעה." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" -msgstr "" +msgstr "שאל האם להתחבר מחדש לאחר קריסה" #: src/settings_translation_file.cpp msgid "" @@ -2209,106 +2558,125 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" +"במרחק זה השרת יעשה אופטימיזציה לאילו בלוקים נשלחים\n" +"ללקוחות.\n" +"ערכים קטנים עשויים לשפר ביצועים רבות, על חשבון גלוי\n" +"עיבוד תקלות (חלק מהבלוקים לא יועברו מתחת למים ובמערות,\n" +"כמו גם לפעמים ביבשה).\n" +"הגדרת ערך זה יותר מ- max_block_send_distance מבטלת זאת\n" +"אופטימיזציה.\n" +"מצוין במפה (16 קוביות)." + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" #: src/settings_translation_file.cpp msgid "Automatic forward key" -msgstr "" +msgstr "מקש התקדמות אוטומטית" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." -msgstr "" +msgstr "קפיצה אוטומטית של מכשולים בקוביה יחידה." #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." -msgstr "" +msgstr "דווח אוטומטית לרשימת השרתים." #: src/settings_translation_file.cpp msgid "Autosave screen size" -msgstr "" +msgstr "שמור אוטומטית גודל מסך" #: src/settings_translation_file.cpp msgid "Autoscaling mode" +msgstr "מצב סקאלה אוטומטית (Autoscale)" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "מקש הקפיצה" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" msgstr "" #: src/settings_translation_file.cpp msgid "Backward key" -msgstr "" +msgstr "מקש התזוזה אחורה" #: src/settings_translation_file.cpp msgid "Base ground level" -msgstr "" +msgstr "מפלס בסיס האדמה" #: src/settings_translation_file.cpp msgid "Base terrain height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" +msgstr "גובה השטח." #: src/settings_translation_file.cpp msgid "Basic privileges" -msgstr "" +msgstr "הרשאות בסיסיות" #: src/settings_translation_file.cpp msgid "Beach noise" -msgstr "" +msgstr "רעש חופים" #: src/settings_translation_file.cpp msgid "Beach noise threshold" -msgstr "" +msgstr "סף רעש חופים" #: src/settings_translation_file.cpp msgid "Bilinear filtering" -msgstr "" +msgstr "סינון בילינארי" #: src/settings_translation_file.cpp msgid "Bind address" -msgstr "" +msgstr "הצמד כתובת" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "" +#, fuzzy +msgid "Biome API noise parameters" +msgstr "פרמטרי רעש טמפרטורה ולחות של Biome API" #: src/settings_translation_file.cpp msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" +msgstr "רעש Biome" #: src/settings_translation_file.cpp 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 "" +msgstr "נתיב גופן עבה/מוטה" #: src/settings_translation_file.cpp msgid "Bold and italic monospace font path" -msgstr "" +msgstr "נתיב גופן עם מרווח אחיד עבה/מוטה" #: src/settings_translation_file.cpp msgid "Bold font path" -msgstr "" +msgstr "נתיב גופן עבה" #: src/settings_translation_file.cpp msgid "Bold monospace font path" -msgstr "" +msgstr "נתיב גופן מרווח אחיד" #: src/settings_translation_file.cpp msgid "Build inside player" -msgstr "" +msgstr "בנה בתוך שחקן" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "בילדאין" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "שנה מצלמה" #: src/settings_translation_file.cpp msgid "" @@ -2317,138 +2685,151 @@ msgid "" "Increasing can reduce artifacting on weaker GPUs.\n" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" +"מרחק מצלמה 'קרוב לקיר' בקוביות, בין 0 ל -0.25\n" +"עובד רק בפלטפורמות GLES. רוב המשתמשים לא יצטרכו לשנות זאת.\n" +"הגדלה יכולה להפחית חפצים על גרפי GPU חלשים יותר.\n" +"0.1 = ברירת מחדל, 0.25 = ערך טוב לטאבלטים חלשים יותר." #: src/settings_translation_file.cpp msgid "Camera smoothing" -msgstr "" +msgstr "החלקת מצלמה" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "" +msgstr "החלקת מצלמה ומצב קולנועי" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "" +msgstr "מקש החלפת עדכון המצלמה" #: src/settings_translation_file.cpp msgid "Cave noise" -msgstr "" +msgstr "רעש מערות" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "" +msgstr "רעש מערות #1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "" +msgstr "רעש מערות #2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "רוחב מערות" #: src/settings_translation_file.cpp msgid "Cave1 noise" -msgstr "" +msgstr "רעש מערה1" #: src/settings_translation_file.cpp msgid "Cave2 noise" -msgstr "" +msgstr "רעש מערה2" #: src/settings_translation_file.cpp msgid "Cavern limit" -msgstr "" +msgstr "גבול מנהרות" #: src/settings_translation_file.cpp msgid "Cavern noise" -msgstr "" +msgstr "רעש מנהרות" #: src/settings_translation_file.cpp msgid "Cavern taper" -msgstr "" +msgstr "מחדד מערות" #: src/settings_translation_file.cpp msgid "Cavern threshold" -msgstr "" +msgstr "סף מערות" #: src/settings_translation_file.cpp msgid "Cavern upper limit" -msgstr "" +msgstr "גבול עליון מערות" #: 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 "" +"טווח דחיפה של מרכז עקומת אור.\n" +"כאשר 0.0 הוא רמת אור מינימלית, 1.0 הוא רמת אור מקסימלית." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +#, fuzzy +msgid "Chat command time message threshold" +msgstr "סף בעיטה להודעות צ'אט" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "פקודות צ'אט" #: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "" +msgstr "גודל גופן צ'אט" #: src/settings_translation_file.cpp msgid "Chat key" -msgstr "" +msgstr "מקש צ'אט" #: src/settings_translation_file.cpp msgid "Chat log level" -msgstr "" +msgstr "רמת לוג צ'אט" #: src/settings_translation_file.cpp msgid "Chat message count limit" -msgstr "" +msgstr "הגבלת מספר הודעות צ'אט" #: src/settings_translation_file.cpp msgid "Chat message format" -msgstr "" +msgstr "פורמט הודעות צ'אט" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" -msgstr "" +msgstr "סף בעיטה להודעות צ'אט" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "אורך הודעת צ'אט מקסימלי" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "" +msgstr "מתג הפעלת צ'אט" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" +#, fuzzy +msgid "Chat weblinks" +msgstr "צ'אט מוצג" #: src/settings_translation_file.cpp msgid "Chunk size" -msgstr "" +msgstr "גודל חתיכה" #: src/settings_translation_file.cpp msgid "Cinematic mode" -msgstr "" +msgstr "מצב קולנועי" #: src/settings_translation_file.cpp msgid "Cinematic mode key" -msgstr "" +msgstr "מקש מצב קולנועי" #: src/settings_translation_file.cpp msgid "Clean transparent textures" +msgstr "טקסטורות נקיות ושקופות" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." msgstr "" #: src/settings_translation_file.cpp msgid "Client" -msgstr "קלינט" +msgstr "לקוח" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "שרת ולקוח" #: src/settings_translation_file.cpp #, fuzzy @@ -2464,6 +2845,11 @@ msgstr "קלינט" 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 "" @@ -2488,6 +2874,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2515,6 +2905,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2539,10 +2945,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2569,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 @@ -2592,16 +3008,17 @@ msgid "Crash message" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Creative" -msgstr "ליצור" +msgstr "יצירתי" #: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2609,7 +3026,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2618,7 +3037,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Damage" -msgstr "" +msgstr "חבלה" #: src/settings_translation_file.cpp msgid "Debug info toggle key" @@ -2633,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 @@ -2676,8 +3095,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2708,12 +3128,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2784,6 +3198,16 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "קישוטים" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "מקש התזוזה ימינה" + #: src/settings_translation_file.cpp #, fuzzy msgid "Digging particles" @@ -2797,13 +3221,23 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" #: src/settings_translation_file.cpp msgid "Double tap jump for fly" -msgstr "" +msgstr "הקשה כפולה על \"קפיצה\" לתעופה" #: src/settings_translation_file.cpp msgid "Double-tapping the jump key toggles fly mode." @@ -2841,18 +3275,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" +msgid "Enable creative mode for all players" +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 "" @@ -2863,28 +3314,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." -msgstr "" +msgstr "לאפשר חבלה ומוות של השחקנים." #: 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 "" - -#: 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." 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" @@ -2933,14 +3378,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2949,18 +3386,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2969,6 +3394,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2977,12 +3412,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2994,7 +3423,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3013,18 +3446,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3043,7 +3464,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3077,14 +3498,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: 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." @@ -3150,6 +3572,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3171,15 +3597,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3188,6 +3614,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3233,7 +3670,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Forward key" -msgstr "" +msgstr "מקש התזוזה קדימה" #: src/settings_translation_file.cpp msgid "Fourth of 4 2D noises that together define hill/mountain range height." @@ -3247,10 +3684,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3275,13 +3708,9 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." -msgstr "" +msgstr "מצב מסך מלא." #: src/settings_translation_file.cpp msgid "GUI scaling" @@ -3296,7 +3725,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3307,7 +3745,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3326,6 +3764,14 @@ msgstr "" 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 "" @@ -3344,9 +3790,14 @@ 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 "" @@ -3354,8 +3805,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3377,8 +3828,10 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "" +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "רכיב רוחב של גודל החלון הראשוני." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3388,10 +3841,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3587,10 +4036,17 @@ 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 "" @@ -3623,8 +4079,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3646,11 +4101,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3674,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 @@ -3691,6 +4154,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3707,10 +4176,6 @@ msgstr "" 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 "" @@ -3738,7 +4203,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3761,16 +4226,12 @@ msgstr "" 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 @@ -3821,6 +4282,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3880,11 +4345,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Jump key" -msgstr "" +msgstr "מקש הקפיצה" #: src/settings_translation_file.cpp msgid "Jumping speed" -msgstr "" +msgstr "מהירות הקפיצה" #: src/settings_translation_file.cpp msgid "" @@ -3900,6 +4365,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3999,6 +4471,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4372,6 +4851,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4422,13 +4905,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Left key" -msgstr "" +msgstr "מקש התזוזה שמאלה" #: src/settings_translation_file.cpp 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 @@ -4438,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 @@ -4458,7 +4944,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4485,6 +4972,11 @@ msgstr "" 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" @@ -4556,22 +5048,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "תפריט ראשי" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4633,6 +5124,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4744,7 +5239,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4792,6 +5291,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4846,17 +5352,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4903,6 +5413,18 @@ msgstr "" #: src/settings_translation_file.cpp 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 @@ -4910,7 +5432,7 @@ msgid "Mod channels" msgstr "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4921,6 +5443,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4987,16 +5513,16 @@ msgstr "" 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 "" @@ -5009,6 +5535,11 @@ msgstr "" 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 "" @@ -5021,14 +5552,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5050,18 +5573,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5071,11 +5586,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5084,38 +5594,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5138,17 +5622,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5177,13 +5657,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5194,6 +5678,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "סינון בילינארי" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5228,10 +5717,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5239,9 +5724,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5329,11 +5814,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Right key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" +msgstr "מקש התזוזה ימינה" #: src/settings_translation_file.cpp msgid "River channel depth" @@ -5404,6 +5885,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "מסך:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5431,6 +5917,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "צילום מסך" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5443,10 +5934,6 @@ msgstr "" 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 "" @@ -5487,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" @@ -5514,10 +6012,19 @@ msgstr "" 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 "" @@ -5529,9 +6036,40 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"עוצמת הקול של כל הצלילים.\n" +"דורש הפעלת מערכת הקול." + #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving leaves.\n" @@ -5550,6 +6088,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5562,6 +6107,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5569,9 +6130,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5586,6 +6145,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5607,6 +6176,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5661,18 +6234,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5688,6 +6257,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5715,10 +6292,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5756,6 +6329,11 @@ msgstr "" 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 "" @@ -5798,6 +6376,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5812,6 +6397,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5867,18 +6456,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5896,6 +6485,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5904,9 +6499,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5943,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 @@ -5966,6 +6560,18 @@ msgstr "" 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 "" @@ -6036,15 +6642,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6119,37 +6740,40 @@ msgstr "" #: src/settings_translation_file.cpp msgid "View distance in nodes." -msgstr "" +msgstr "טווח ראיה בקוביות." #: src/settings_translation_file.cpp msgid "View range decrease key" -msgstr "" +msgstr "מקש הקטנת טווח ראיה" #: src/settings_translation_file.cpp msgid "View range increase key" -msgstr "" +msgstr "מקש הגדלת טוחח ראיה" #: src/settings_translation_file.cpp msgid "View zoom key" -msgstr "" +msgstr "מקש זום (משקפת)" #: src/settings_translation_file.cpp msgid "Viewing range" -msgstr "" +msgstr "טווח ראיה" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "" +#, fuzzy +msgid "Virtual joystick triggers Aux1 button" +msgstr "מקש הפעלת ג'ויסטיק וירטואלי" #: src/settings_translation_file.cpp msgid "Volume" -msgstr "" +msgstr "ווליום" #: src/settings_translation_file.cpp msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" +"עוצמת הקול של כל הצלילים.\n" +"דורש הפעלת מערכת הקול." #: src/settings_translation_file.cpp msgid "" @@ -6166,19 +6790,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Walking speed" -msgstr "" +msgstr "מהירות הליכה" #: src/settings_translation_file.cpp msgid "Walking, flying and climbing speed in fast mode, in nodes per second." -msgstr "" +msgstr "מהירות הליכה, טיסה וטיפוס במצב מהיר, בקוביות לשנייה." #: src/settings_translation_file.cpp msgid "Water level" -msgstr "" +msgstr "מפלס המים" #: src/settings_translation_file.cpp msgid "Water surface level of the world." -msgstr "" +msgstr "מפלס פני המים בעולם." #: src/settings_translation_file.cpp msgid "Waving Nodes" @@ -6198,14 +6822,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Waving liquids wave speed" -msgstr "" +msgstr "מהירות גל של נוזלים עם גלים" #: src/settings_translation_file.cpp msgid "Waving liquids wavelength" -msgstr "" +msgstr "אורך גל של נוזלים עם גלים" #: src/settings_translation_file.cpp msgid "Waving plants" +msgstr "צמחים מתנופפים" + +#: src/settings_translation_file.cpp +msgid "Weblink color" msgstr "" #: src/settings_translation_file.cpp @@ -6229,18 +6857,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6255,7 +6881,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." -msgstr "" +msgstr "האם לאפשר לשחקנים להרוג אחד־את־השני." #: src/settings_translation_file.cpp msgid "" @@ -6275,14 +6901,24 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "רכיב רוחב של גודל החלון הראשוני." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -6318,25 +6954,25 @@ msgstr "" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" -msgstr "" +msgstr "מצב טקסטורות מיושרות לעולם" #: src/settings_translation_file.cpp msgid "Y of flat ground." -msgstr "" +msgstr "Y לקרקע שטוחה." #: src/settings_translation_file.cpp msgid "" "Y of mountain density gradient zero level. Used to shift mountains " "vertically." -msgstr "" +msgstr "Y של צפיפות הרים שיפוע רמת אפס. משמש להעברת הרים אנכית." #: src/settings_translation_file.cpp msgid "Y of upper limit of large caves." -msgstr "" +msgstr "Y של הגבול העליון של מערות גדולות." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." -msgstr "" +msgstr "מרחק Y שעליו מתרחבות מערות לגודל מלא." #: src/settings_translation_file.cpp msgid "" @@ -6367,20 +7003,120 @@ msgid "Y-level of seabed." msgstr "" #: src/settings_translation_file.cpp -msgid "cURL file download timeout" +msgid "cURL" msgstr "" +#: src/settings_translation_file.cpp +msgid "cURL file download timeout" +msgstr "(cURL) זמן להורדה נגמר" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "(cURL) מגבלת זמן" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" -msgstr "" +msgstr "(cURL) מגבלה לפעולות במקביל" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- מצב יצירתי: " + +#~ msgid "- Damage: " +#~ msgstr "- חבלה: " + +#~ 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 "סגנון התפריט הראשי" + +#~ msgid "Name / Password" +#~ msgstr "שם/סיסמה" + +#~ msgid "No" +#~ msgstr "לא" + #~ msgid "Ok" #~ msgstr "אישור" + +#~ msgid "PvP enabled" +#~ msgstr "לאפשר קרבות" + +#, fuzzy +#~ msgid "Reset singleplayer world" +#~ msgstr "שרת" + +#~ msgid "Special" +#~ msgstr "מיוחד" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "כדי לאפשר שיידרים יש להשתמש בדרייבר של OpenGL." + +#~ msgid "View" +#~ 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 "מתת" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/hi/minetest.po b/po/hi/minetest.po index a45a5ae89..dc79d1c87 100644 --- a/po/hi/minetest.po +++ b/po/hi/minetest.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-29 07:53+0000\n" -"Last-Translator: Agastya <acagastya@outlook.com>\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/" "hi/>\n" "Language: hi\n" @@ -17,7 +17,47 @@ 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.3-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "बंद करके मेनू पर जाएं" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "लोकल कमांड" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "एक-खिलाडी" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "एक-खिलाडी" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -27,9 +67,40 @@ msgstr "वापस ज़िंदा होएं" msgid "You died" msgstr "आपकी मौत हो गयी" +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "लोकल कमांड" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "लोकल कमांड" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "Okay" +msgstr "ठीक है" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -51,9 +122,30 @@ msgstr "वापस कनेक्ट करें" msgid "The server has requested a reconnect:" msgstr "सर्वर वापस कनेक्ट करना चाहता है :" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -68,8 +160,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "सर्वर केवल प्रोटोकॉल $1 से $2 ही लेता है। " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "सार्वजनिक सर्वर शृंखला (सर्वर लिस्ट) को 'हां' करें और इंटरनेट कनेक्शन जांचें।" +msgid "Visit website" +msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -79,17 +171,26 @@ msgstr "हम केवल प्रोटोकॉल $1 ही लेते msgid "We support protocol versions between version $1 and $2." msgstr "हम प्रोटोकॉल $1 से $2 ही लेते हैं।" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "रोकें" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "निर्भरताएं :" @@ -162,20 +263,60 @@ msgstr "दुनिया :" msgid "enabled" msgstr "चालू" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "लोड हो रहा है ..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "सभी पैकेज" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Already installed" +msgstr "की पहले से इस्तेमाल में है" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "वापस मुख्य पृष्ठ पर जाएं" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +#, fuzzy +msgid "Base Game:" +msgstr "खेल चलाएं" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "cURL के बगैर कंपाइल होने के कारण Content DB उपलब्ध नहीं है" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." msgstr "लोड हो रहा है ..." @@ -184,7 +325,6 @@ msgid "Failed to download $1" msgstr "$1 का डाऊनलोड असफल हुआ" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "अनेक खेल" @@ -193,7 +333,21 @@ msgid "Install" msgstr "इन्स्टाल करें" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "इन्स्टाल करें" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "अनावश्यक निर्भरताएं :" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "इन्स्टाल : \"$1\" का फाईल टाईप अंजान है याफिर आरकाइव खराब है" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "माॅड" @@ -206,9 +360,25 @@ msgid "No results" msgstr "कुछ नहीं मिला" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "ढूंढें" +#, fuzzy +msgid "No updates" +msgstr "नया संस्करण इन्स्टाल करें" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -223,8 +393,12 @@ msgid "Update" msgstr "नया संस्करण इन्स्टाल करें" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "दृश्य" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -232,32 +406,31 @@ 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" -msgstr "" +msgstr "बायोम परिवर्तन नज़र न आना (Biome Blending)" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" -msgstr "" +msgstr "बायोम" #: builtin/mainmenu/dlg_create_world.lua msgid "Caverns" -msgstr "" +msgstr "गुफाएं" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "सप्टक (आक्टेव)" +msgstr "गुफाएं" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" @@ -268,40 +441,34 @@ 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" -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" -msgstr "" +msgstr "छोटे पहाड़" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" @@ -311,6 +478,15 @@ msgstr "नम नदियाँ" 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 "झीलें" @@ -370,13 +546,13 @@ msgstr "बीज" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "बायोम के बीच में धीरे-धीरे परिवर्तन" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" -msgstr "" +msgstr "भूमि पर बनावटें (v6 के पेड़ व जंगली घास पर कोई असर नहीं)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" @@ -404,18 +580,12 @@ 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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "" -"चेतावनी : न्यूनतम विकास खेल (Minimal development test) खेल बनाने वालों के लिए है।" - #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "दुनिया का नाम" @@ -446,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 "हां" @@ -477,6 +680,16 @@ 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 "रुका हुआ" @@ -501,7 +714,8 @@ msgid "Offset" msgstr "आफसेट" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "हठ (पर्सिस्टेन्स)" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -520,6 +734,10 @@ msgstr "मूल चुनें" msgid "Scale" msgstr "स्केल" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "ढूंढें" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "फाईल पाथ चुनें" @@ -528,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 "तकनीकी नाम देखें" @@ -607,14 +825,6 @@ msgstr "इन्स्टाल मॉड: $1 का असल नाम नह msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "माॅड इन्स्टाल: माॅडपैक $1 के लिए सही फोल्डर नहीं ढूंढा जा सका" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "इन्स्टाल : \"$1\" का फाईल टाईप अंजान है याफिर आरकाइव खराब है" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "इन्स्टाल : फाईल : \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "सही माॅड या माॅडपैक नहीं ढूंढ पाया गया" @@ -635,6 +845,58 @@ msgstr "मॉड को $1 के रूप में इन्स्टाल msgid "Unable to install a modpack as a $1" msgstr "माॅडपैक को $1 के रूप में इन्स्टाल नहीं किया जा सका" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "लोड हो रहा है ..." + +#: builtin/mainmenu/serverlistmgr.lua +#, fuzzy +msgid "Public server list is disabled" +msgstr "क्लाइंट की तरफ से स्क्रिप्ट लगाना मना है" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "सार्वजनिक सर्वर शृंखला (सर्वर लिस्ट) को 'हां' करें और इंटरनेट कनेक्शन जांचें।" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "सक्रिय सहायक" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "मुख्य डेवेलपर" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "नेट पर वस्तुएं ढूंढें" @@ -675,26 +937,6 @@ msgstr "पैकेज हटाएं" msgid "Use Texture Pack" msgstr "कला संकुल चालू करें" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "सक्रिय सहायक" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "मुख्य डेवेलपर" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "आभार सूची" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "पूर्व सहायक" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "पूर्व मुख्य डेवेलपर" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "सर्वर सार्वजनिक सर्वर सूची (server list) में दिखे" @@ -704,14 +946,10 @@ msgid "Bind Address" msgstr "बाईंड एड्रेस" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "सेटिंग बदलें" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "असीमित संसाधन" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "हानि व मृत्यु हो सकती है" @@ -727,10 +965,6 @@ msgstr "सर्वर चलाएं" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "नाम/पासवर्ड" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "नया" @@ -743,10 +977,15 @@ msgstr "कोई दुनिया उपस्थित या चुनी msgid "Play Game" msgstr "खेल खेलें" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "पोर्ट" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "दुनिया चुन्हें :" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "दुनिया चुन्हें :" @@ -760,45 +999,67 @@ msgid "Start Game" msgstr "खेल शुरू करें" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "ऐडरेस / पोर्ट" +#, fuzzy +msgid "Address" +msgstr "- एड्रेस : " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "कनेक्ट करें" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "खाली करें" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "असीमित संसाधन" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "हानि व मृत्यु हो सकती है" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "- हानि : " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "पसंद हटाएं" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "पसंद" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "खेल में शामिल होएं" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "नाम/पासवर्ड" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "पिंग" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "खिलाडियों में मारा-पीटी की अनुमती है" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "सर्वर सार्वजनिक सर्वर सूची (server list) में दिखे" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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" @@ -824,10 +1085,6 @@ msgstr "सभी सेटिंग देखें" msgid "Antialiasing:" msgstr "ऐन्टी एलियासिंग :" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "क्या आप सचमुच अपने एक-खिलाडी दुनिया रद्द करना चाहते हैं?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "स्क्रीन परिमाण स्वयं सेव हो" @@ -836,10 +1093,6 @@ msgstr "स्क्रीन परिमाण स्वयं सेव ह msgid "Bilinear Filter" msgstr "द्विरेखिय फिल्टर" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "टकराव मैपिंग" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "की बदलें" @@ -848,13 +1101,29 @@ msgstr "की बदलें" msgid "Connected Glass" msgstr "जुडे शिशे" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "रोचक पत्ते" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "मामूली नक्शे बनाएं" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -864,10 +1133,6 @@ msgstr "मिपमैप" msgid "Mipmap + Aniso. Filter" msgstr "मिपमैप व अनीसो. फिल्टर" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "नहीं" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "कोई फिल्टर नहीं" @@ -896,18 +1161,10 @@ msgstr "अपारदर्शी पत्ते" msgid "Opaque Water" msgstr "अपारदर्शी पानी" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "पेरलेक्स ऑक्लूजन" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "कण" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "एक-खिलाडी दुनिया रीसेट करें" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "स्क्रीन :" @@ -920,6 +1177,11 @@ msgstr "सेटिंग" msgid "Shaders" msgstr "छाया बनावट" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "फ्लोटलैंड्स (आसमान में तैरते हुए भूमि-खंड) (प्रायोगिक)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "छाया बनावट (अनुपलब्ध)" @@ -936,22 +1198,27 @@ msgstr "चिकना उजाला" msgid "Texturing:" msgstr "कला बनावट :" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "छाया बनावट कॆ लिये OpenGL ड्राईवर आवश्यक हैं|" - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "टोन मैपिंग" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "छूने की त्रिज्या : (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "त्रिरेखीय फिल्टर" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "पत्ते लहराएं" @@ -964,23 +1231,12 @@ msgstr "पानी में लहरें बनें" msgid "Waving Plants" msgstr "पाैधे लहराएं" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "हां" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "मॉड कॆ सेटिंग बदलें" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "मुख्य" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "कनेक्शन समय अंत|" @@ -1009,7 +1265,8 @@ msgid "Connection error (timed out?)" msgstr "कनेक्शन खराबी (समय अंत?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "खेल ढूंढा ना जा सका या लोड नहीं किया जा सका \"" #: src/client/clientlauncher.cpp @@ -1040,18 +1297,6 @@ msgstr "पासवर्ड फाईल नहीं खुला :- " msgid "Provided world path doesn't exist: " msgstr "दुनिया का फाईल पाथ नहीं है : " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1064,14 +1309,6 @@ msgstr "" msgid "- Address: " msgstr "- एड्रेस : " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- असीमित साधन " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- हानि : " - #: src/client/game.cpp msgid "- Mode: " msgstr "- तकनीक : " @@ -1093,6 +1330,16 @@ msgstr "- खिलाड़ियों में मारा-पीटी : " msgid "- Server Name: " msgstr "- सर्वर का नाम : " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "एक खराबी हो गयी :" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "स्वचाल रुका हुआ" @@ -1101,6 +1348,22 @@ msgstr "स्वचाल रुका हुआ" msgid "Automatic forward enabled" msgstr "स्वचाल चालू" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "कैमरा रुका हुआ" @@ -1109,6 +1372,10 @@ msgstr "कैमरा रुका हुआ" msgid "Camera update enabled" msgstr "कैमरा चालू" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "पासवर्ड बदलें" @@ -1121,6 +1388,10 @@ msgstr "सिनेमा चाल रुका हुआ" msgid "Cinematic mode enabled" msgstr "सिनेमा चाल चालू" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "क्लाइंट की तरफ से स्क्रिप्ट लगाना मना है" @@ -1129,25 +1400,29 @@ msgstr "क्लाइंट की तरफ से स्क्रिप् msgid "Connecting to server..." msgstr "सर्वर से कनेक्ट हुआ जा रहा है ..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "आगे बढ़ें" #: src/client/game.cpp -#, c-format +#, fuzzy, c-format msgid "" "Controls:\n" "- %s: move forwards\n" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1166,6 +1441,11 @@ msgstr "" "- : माउस पहिया : वस्तु चुनें\n" "- %s : बात करने के लिए\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "क्लाइंट बनाया जा रहा है ..." @@ -1222,6 +1502,11 @@ msgstr "दृष्टि सीमित" 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 "बंद करके मेनू पर जाएं" @@ -1295,32 +1580,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "खेल या मॉड़ के वजह से छोटा नक्शा मना है" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "छोटा नक्शा गायब" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "छोटा नक्शा रेडार मोड, 1 गुना ज़ूम" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "छोटा नक्शा रेडर मोड, दोगुना जूम" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "छोटा नक्शा रेडार मोड, 4 गुना ज़ूम" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "छोटा नक्शा जमीन मोड, 1 गुना ज़ूम" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "छोटा नक्शा जमीन मोड, दोगुना जूम" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "छोटा नक्शा जमीन मोड, 4 गुना जून" +#, fuzzy +msgid "Multiplayer" +msgstr "एक-खिलाडी" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1394,6 +1656,21 @@ msgstr "" msgid "Sound unmuted" msgstr "आवाज चालू" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1463,10 +1740,6 @@ msgstr "बैकस्पेस" msgid "Caps Lock" msgstr "कैप्स लाक" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "खाली करें" - #: src/client/keycode.cpp msgid "Control" msgstr "कंट्रोल" @@ -1714,35 +1987,41 @@ msgstr "X बटन २" msgid "Zoom" msgstr "ज़ूम" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "पासवर्ड अलग अलग हैं!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "छोटा नक्शा गायब" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "पंजीकरण व खेलें" +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "छोटा नक्शा रेडार मोड, 1 गुना ज़ूम" -#: 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." +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "छोटा नक्शा जमीन मोड, 1 गुना ज़ूम" + +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap in texture mode" +msgstr "छोटा नक्शा जमीन मोड, 1 गुना ज़ूम" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "$1 का डाऊनलोड असफल हुआ" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" -"आप \"%s\" नाम से इस सरवर में पहली बार आने वाले हैं। अगर आप आगे बढ़ते हैं तो आपके लिए इस " -"सर्वर पर एक अकाउंट बनाया जाएगा।\n" -"\n" -"आगे बढ़ने ए लिखें कृपया अपने पासवर्ड को वापस लिखें और फिर 'पंजीकरण व खेलें' दबाएं, अथवा " -"'रोकें' दबाएं।" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "आगे बढ़े" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +#, fuzzy +msgid "\"Aux1\" = climb down" msgstr "\"स्पेशल\" = नीचे उतरना" #: src/gui/guiKeyChangeMenu.cpp @@ -1753,15 +2032,23 @@ msgstr "स्वचालन" msgid "Automatic jumping" msgstr "कूदने के लिए बटन दबाना अनावश्यक" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "पीछे जाएं" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "कैमरा बदलना" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "बातें" @@ -1814,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" @@ -1845,10 +2132,6 @@ msgstr "स्क्रीनशॉट" msgid "Sneak" msgstr "संभल के चलना" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "स्पेशल" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "हे. अ. डि" @@ -1889,10 +2172,6 @@ msgstr "की दबाएं" msgid "Change" msgstr "बदलें" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "पासवर्ड दोबारा लिखें" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "नया पासवर्ड" @@ -1901,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 "निकास" @@ -1910,15 +2193,10 @@ msgid "Muted" msgstr "चुप" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, 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 "डालें " - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -1926,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" @@ -1934,8 +2222,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1962,12 +2250,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2056,6 +2338,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2074,6 +2360,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2119,6 +2409,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2129,6 +2423,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "दुनिया का नाम" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2143,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 @@ -2211,6 +2511,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2231,6 +2535,15 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "चलने उतरने के लिए स्पेशल की" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2243,10 +2556,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2268,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 @@ -2276,11 +2585,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2308,8 +2617,9 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "कैमरा बदलना" #: src/settings_translation_file.cpp msgid "" @@ -2382,15 +2692,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "आज्ञा" + #: src/settings_translation_file.cpp msgid "Chat font size" msgstr "" @@ -2424,8 +2733,9 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" +#, fuzzy +msgid "Chat weblinks" +msgstr "बातें दिखाई देंगी" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2443,6 +2753,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2463,6 +2779,10 @@ msgstr "" 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 "" @@ -2487,6 +2807,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2514,6 +2838,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2538,10 +2878,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2568,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 @@ -2599,7 +2949,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2607,7 +2959,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2631,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 @@ -2674,8 +3028,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2706,12 +3061,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2782,6 +3131,15 @@ msgstr "" 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 "" @@ -2794,6 +3152,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2838,18 +3206,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2866,22 +3251,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2930,14 +3309,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2946,18 +3317,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2966,6 +3325,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2974,12 +3343,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2991,7 +3354,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3010,18 +3377,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3039,8 +3394,9 @@ msgid "Fast movement" msgstr "तेज चलन" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "स्पेशल की दबाने पर आप बहुत तॆज चलने लगेंगे |\n" @@ -3076,14 +3432,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: 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." @@ -3149,6 +3506,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3170,15 +3531,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3187,6 +3548,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3246,10 +3618,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3274,10 +3642,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3295,7 +3659,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3306,7 +3679,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3325,6 +3698,14 @@ msgstr "" 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 "" @@ -3342,9 +3723,14 @@ 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 "" @@ -3352,8 +3738,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3375,7 +3761,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3386,10 +3773,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3585,10 +3968,17 @@ 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 "" @@ -3620,9 +4010,9 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" "अगर यह रुका हुआ हुआ तो तेज उड़ने के लिए\n" @@ -3647,14 +4037,21 @@ msgstr "" "इसके लिये \"तरल चाल\" विषेशाधिकार आवश्यक है |" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" "अगर यहां चालू हुआ तो नीचे उतरने के लिए स्पेशल\n" "की का इस्तेमाल होगा।" +#: 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" @@ -3678,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 @@ -3697,6 +4096,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3713,10 +4118,6 @@ msgstr "" 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 "" @@ -3744,7 +4145,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3767,16 +4168,12 @@ msgstr "" 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 @@ -3827,6 +4224,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3906,6 +4307,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4005,6 +4413,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4378,6 +4793,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4434,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 @@ -4444,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 @@ -4464,7 +4886,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4491,6 +4914,11 @@ msgstr "" 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" @@ -4562,21 +4990,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4638,6 +5066,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4743,7 +5175,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4791,6 +5227,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4845,17 +5288,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4904,12 +5351,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4920,6 +5379,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4986,16 +5449,16 @@ msgstr "" 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 "" @@ -5008,6 +5471,11 @@ msgstr "तरल चाल" 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 "" @@ -5020,14 +5488,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5049,18 +5509,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5070,11 +5522,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5083,38 +5530,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5137,17 +5558,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5175,6 +5592,15 @@ msgstr "" msgid "Pitch move mode" msgstr "पिच चलन" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "राइट क्लिक के दोहराने का समय" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5183,10 +5609,6 @@ msgstr "" "खिलाडी के असर से मुक्त उड सकेगा |\n" "इसके लिये \"उडान\" विषेशाधिकार आवश्यक है |" -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5195,6 +5617,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5229,10 +5655,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5240,9 +5662,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5332,10 +5754,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "राइट क्लिक के दोहराने का समय" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5405,6 +5823,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "स्क्रीन :" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5432,6 +5855,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "स्क्रीनशॉट" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5444,10 +5872,6 @@ msgstr "" 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 "" @@ -5488,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" @@ -5515,10 +5950,19 @@ msgstr "" 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 "" @@ -5530,7 +5974,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5551,6 +6023,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5563,6 +6042,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5570,9 +6065,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5587,6 +6080,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5608,6 +6111,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5664,18 +6171,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "चलने उतरने के लिए स्पेशल की" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5691,6 +6194,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5718,10 +6229,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5759,6 +6266,11 @@ msgstr "" 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 "" @@ -5801,6 +6313,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5815,6 +6334,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5870,18 +6393,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5899,6 +6422,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5907,9 +6436,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5946,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 @@ -5969,6 +6497,18 @@ msgstr "" 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 "" @@ -6039,15 +6579,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6141,7 +6696,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6211,6 +6766,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6232,18 +6791,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6278,13 +6835,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6368,23 +6934,150 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- असीमित साधन " + +#~ msgid "- Damage: " +#~ msgstr "- हानि : " + +#~ msgid "Address / Port" +#~ msgstr "ऐडरेस / पोर्ट" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "क्या आप सचमुच अपने एक-खिलाडी दुनिया रद्द करना चाहते हैं?" #~ msgid "Back" #~ msgstr "पीछे" +#~ msgid "Bump Mapping" +#~ msgstr "टकराव मैपिंग" + +#~ msgid "Config mods" +#~ 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 "मुख्य" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "छोटा नक्शा रेडर मोड, दोगुना जूम" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "छोटा नक्शा रेडार मोड, 4 गुना ज़ूम" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "छोटा नक्शा जमीन मोड, दोगुना जूम" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "छोटा नक्शा जमीन मोड, 4 गुना जून" + +#~ msgid "Name / Password" +#~ msgstr "नाम/पासवर्ड" + +#~ msgid "Name/Password" +#~ msgstr "नाम/पासवर्ड" + +#~ msgid "No" +#~ msgstr "नहीं" + #~ msgid "Ok" #~ msgstr "ठीक है" + +#~ msgid "Parallax Occlusion" +#~ msgstr "पेरलेक्स ऑक्लूजन" + +#~ msgid "PvP enabled" +#~ msgstr "खिलाडियों में मारा-पीटी की अनुमती है" + +#~ msgid "Reset singleplayer world" +#~ msgstr "एक-खिलाडी दुनिया रीसेट करें" + +#~ msgid "Special" +#~ msgstr "स्पेशल" + +#~ msgid "Start Singleplayer" +#~ msgstr "एक-खिलाडी शुरू करें" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "छाया बनावट कॆ लिये OpenGL ड्राईवर आवश्यक हैं|" + +#~ msgid "View" +#~ 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 "आपकी मौत हो गयी" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/hu/minetest.po b/po/hu/minetest.po index 725c12629..7bc6b5258 100644 --- a/po/hu/minetest.po +++ b/po/hu/minetest.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: Hungarian (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-22 17:56+0000\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" @@ -12,7 +12,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-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Kimenő üzenetek sorának törlése" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Üres parancs." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Kilépés a főmenübe" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Érvénytelen parancs: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Kiadott parancs: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Online játékosok listázása" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Online játékosok: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "A kimenő üzenetek sora jelenleg üres." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Ezt a parancsot a szerver letiltotta." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,9 +58,40 @@ msgstr "Újraéledés" msgid "You died" msgstr "Meghaltál" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Elérhető parancsok:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Elérhető parancsok: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "A parancs nem elérhető: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Segítség kérése a parancsokhoz" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"További információkhoz adja ki a '.help <cmd>' parancsot, vagy az összes " +"kilistázásához a '.help all' parancsot." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<nincs elérhető>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -44,11 +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 src/client/game.cpp -msgid "Loading..." -msgstr "Betöltés…" +#: 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. " @@ -60,33 +148,40 @@ 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 "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Próbáld újra engedélyezni a nyilvános kiszolgálólistát, és ellenőrizd az " -"internetkapcsolatot." #: 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Függőségek:" @@ -124,7 +219,7 @@ msgstr "Mod:" #: builtin/mainmenu/dlg_config_world.lua msgid "No (optional) dependencies" -msgstr "Nincsenek (választható) függőségek:" +msgstr "Nincsenek (választható) függőségek" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." @@ -132,7 +227,7 @@ msgstr "Nincs elérhető játékleírás." #: builtin/mainmenu/dlg_config_world.lua msgid "No hard dependencies" -msgstr "Nincsenek függőségek." +msgstr "Nincsenek kötelező függőségek" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." @@ -140,7 +235,7 @@ msgstr "Nincs elérhető modcsomag-leírás." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" -msgstr "Nincsenek választható függőségek. " +msgstr "Nincsenek választható függőségek" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" @@ -159,17 +254,57 @@ msgstr "Világ:" msgid "enabled" msgstr "engedélyezve" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" már létezik. Szeretné felülírni?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 és $2 függőségek telepítve lesznek." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 az $2-ből" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 letöltése,\n" +"$2 sorba állítva" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 Letöltése…" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "Ehhez szükséges függőségek nem találhatók: $1." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 telepítve lesz, és $2 függőségek ki lesznek hagyva." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Minden csomag" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Már telepítve" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Vissza a főmenübe" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Alapjáték:" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgstr "A ContentDB nem elérhető, ha a Minetest cURL nélkül lett lefordítva" #: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." @@ -180,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" @@ -189,7 +323,18 @@ msgid "Install" msgstr "Telepítés" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "$1 telepítése" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "hiányzó függőségek telepitése" + +#: builtin/mainmenu/dlg_contentstore.lua +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 msgid "Mods" msgstr "Modok" @@ -202,9 +347,24 @@ msgid "No results" msgstr "Nincs találat" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Keresés" +msgid "No updates" +msgstr "Nincsenek frissítések" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Nem található" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +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 ." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Sorbaállítva" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -219,8 +379,12 @@ msgid "Update" msgstr "Frissítés" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Megtekintés" +msgid "Update All [$1]" +msgstr "Összes frissítése [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "További információ megtekintése böngészőben" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -231,9 +395,8 @@ msgid "Additional terrain" msgstr "További terep" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -#, fuzzy msgid "Altitude chill" -msgstr "Hőmérsékletcsökkenés a magassággal" +msgstr "Hőmérséklet-csökkenés a magassággal" #: builtin/mainmenu/dlg_create_world.lua msgid "Altitude dry" @@ -263,38 +426,30 @@ msgstr "Létrehozás" 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" - #: builtin/mainmenu/dlg_create_world.lua #, 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" -msgstr "Tömlöc zaj" +msgstr "Tömlöcök" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Lapos terep" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "Lebegő földdarabok az égben" +msgstr "Lebegő földtömegek az égben" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "Lebegő földek" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Játék" +msgstr "Lebegő földek (kísérleti)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Nem-fraktál terep generálása: Óceánok és földalatti rész" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" @@ -308,6 +463,15 @@ msgstr "Párás folyók" 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" @@ -336,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" @@ -369,17 +533,19 @@ 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 "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"A terepen megjelenő struktúrák (nincs hatása a fákra és a dzsungelfűre, " +"amelyet a v6 készített)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "A terepen megjelenő struktúrák, általában fák és növények" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" @@ -394,9 +560,8 @@ msgid "Temperate, Desert, Jungle, Tundra, Taiga" msgstr "Mérsékelt, Sivatag, Dzsungel, Tundra, Tajga" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Terrain surface erosion" -msgstr "Terep alapzaj" +msgstr "Terepfelület erózió" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" @@ -410,10 +575,6 @@ msgstr "Változatos folyómélység" 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" @@ -444,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" @@ -477,6 +671,16 @@ 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" @@ -501,7 +705,7 @@ msgid "Offset" msgstr "Eltolás" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Folytonosság" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -520,6 +724,10 @@ msgstr "Alapértelmezés visszaállítása" msgid "Scale" msgstr "Mérték" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Keresés" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Útvonal kiválasztása" @@ -528,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" @@ -608,14 +816,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" "Mod telepítése: nem található megfelelő mappanév ehhez a modcsomaghoz: $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Telepítés: nem támogatott „$1” fájltípus, vagy sérült archívum" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Fájl telepítése: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Nem található érvényes mod vagy modcsomag" @@ -636,6 +836,62 @@ msgstr "$1 mod telepítése meghiúsult" msgid "Unable to install a modpack as a $1" msgstr "$1 modcsomag telepítése meghiúsult" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Betöltés…" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +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 szerverlistát, és ellenőrizd az " +"internetkapcsolatot." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Névjegy" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktív közreműködők" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Aktív renderelő:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Játékmotor-fejlesztők" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Felhasználói adatok mappája" + +#: 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 "" +"Megnyitja a fájlkezelőben / intézőben azt a könyvtárat, amely a felhasználó " +"világait,\n" +"játékait, modjait, és textúráit tartalmazza." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Korábbi közreműködők" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +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" msgstr "Online tartalmak böngészése" @@ -650,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:" @@ -676,26 +932,6 @@ msgstr "Csomag eltávolítása" msgid "Use Texture Pack" msgstr "Textúracsomag használata" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktív közreműködők" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Belső fejlesztők" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Köszönetnyilvánítás" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Korábbi közreműködők" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Korábbi belső fejlesztők" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Szerver nyilvánossá tétele" @@ -705,20 +941,16 @@ msgid "Bind Address" msgstr "Cím csatolása" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Beállítás" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Kreatív mód" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" 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" @@ -728,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 -msgid "Name/Password" -msgstr "Név/jelszó" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Új" @@ -744,62 +972,83 @@ msgstr "Nincs létrehozott vagy kiválasztott világ!" msgid "Play Game" msgstr "Játék indítása" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Modok kiválasztása" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" 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" msgstr "Indítás" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Cím / Port" +msgid "Address" +msgstr "Cím" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Kapcsolódás" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Törlés" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Kreatív mód" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Sérülés engedélyezve" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Sérülés / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Kedvenc törlése" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Kedvencek" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Kedvenc" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Nem kompatibilis szerverek" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Csatlakozás játékhoz" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Név / Jelszó" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP engedélyezve" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Nyilvános szerverek" + +#: builtin/mainmenu/tab_online.lua +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ása" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -825,49 +1074,54 @@ msgstr "Minden beállítás" msgid "Antialiasing:" msgstr "Élsimítás:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Biztosan visszaállítod az egyjátékos világod?" - #: 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" msgstr "Bilineáris szűrés" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bump mapping" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" 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 +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Dinamikus árnyékok: " #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Szép levelek" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Normál felületek generálása" +msgid "High" +msgstr "Magas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Alacsony" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +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" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nem" +msgstr "Mipmap + anizotróp szűrés" #: builtin/mainmenu/tab_settings.lua msgid "No Filter" @@ -875,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" @@ -897,18 +1151,10 @@ msgstr "Átlátszatlan levelek" msgid "Opaque Water" msgstr "Átlátszatlan víz" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax Occlusion ( domború textúra )" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Részecskék" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Egyjátékos világ visszaállítása" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Képernyő:" @@ -921,6 +1167,10 @@ msgstr "Beállítások" msgid "Shaders" msgstr "Árnyalók" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Árnyalók (kísérleti)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Árnyalók (nem elérhető)" @@ -931,31 +1181,37 @@ 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:" msgstr "Textúrázás:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Az árnyalók engedélyezéséhez OpenGL driver használata szükséges." - #: 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 msgid "Trilinear Filter" msgstr "Trilineáris szűrés" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Nagyon magas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +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" @@ -963,25 +1219,14 @@ msgstr "Hullámzó folyadékok" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" -msgstr "Hullámzó növények" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Igen" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Modok beállítása" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Fő" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Egyjátékos mód indítása" +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." msgstr "Csatlakozási idő lejárt." @@ -991,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..." @@ -1010,8 +1255,8 @@ msgid "Connection error (timed out?)" msgstr "Kapcsolódási hiba (időtúllépés?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Nem található vagy nem betölthető a játék" +msgid "Could not find or load game: " +msgstr "Nem található vagy nem betölthető a játék: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1027,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!" @@ -1035,44 +1280,24 @@ 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: " msgstr "A megadott útvonalon nem létezik világ: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" "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: " msgstr "- Cím: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Kreatív mód: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Sérülés: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Mód: " @@ -1092,15 +1317,40 @@ 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 "Hiba történt a sorosítás közben:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +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" +msgstr "Blokkhatárok elrejtve" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Blokkhatárok mutatása minden blokk esetén" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Blokkhatárok mutatása az aktuális blokk esetén" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Közeli blokkok blokkhatárainak megjelenítése" #: src/client/game.cpp msgid "Camera update disabled" @@ -1110,17 +1360,27 @@ msgstr "Kamera frissítés letiltva" msgid "Camera update enabled" msgstr "Kamera frissítés engedélyezve" +#: src/client/game.cpp +#, 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ó változtatá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" +msgstr "Kliens lecsatlakozott" #: src/client/game.cpp msgid "Client side scripting is disabled" @@ -1130,6 +1390,10 @@ msgstr "Kliens oldali szkriptek letiltva" msgid "Connecting to server..." msgstr "Kapcsolódás szerverhez..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Kapcsolat megszakadt ismeretlen okból" + #: src/client/game.cpp msgid "Continue" msgstr "Folytatás" @@ -1142,13 +1406,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1158,22 +1422,27 @@ msgstr "" "- %s: mozgás balra\n" "- %s: mozgás jobbra\n" "- %s: ugrás/mászás\n" +"- %s: ásás/ütés\n" +"- %s: letevés/használat\n" "- %s: lopakodás/lefelé mászás\n" "- %s: tárgy eldobása\n" -"- %s: eszköztár\n" +"- %s: felszerelés\n" "- Egér: forgás/nézelődés\n" -"- Bal-egér: ásás/ütés\n" -"- Jobb-egér: elhelyezés/használat\n" -"- Egér görgő: tárgy választása\n" +"- Egérgörgő: tárgy kiválasztása\n" "- %s: csevegés\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Cím feloldása sikertelen: %s" + #: src/client/game.cpp msgid "Creating client..." 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" @@ -1203,17 +1472,17 @@ msgid "" " --> place single item to slot\n" msgstr "" "Alapértelmezett irányítás:\n" -"Nem látható menü:\n" +"Ha nem látható menü:\n" "- egy érintés: gomb aktiválás\n" "- dupla érintés: lehelyezés/használat\n" "- ujj csúsztatás: körbenézés\n" -"Menü/Eszköztár látható:\n" +"Ha a Menü/Felszerelés látható:\n" "- dupla érintés (kívül):\n" " -->bezárás\n" -"- stack, vagy slot érintése:\n" -" --> stack mozgatás\n" +"- köteg, vagy hely érintése:\n" +" --> köteg mozgatás\n" "- \"érint&húz\", érintés 2. ujjal\n" -" --> egy elem slotba helyezése\n" +" --> letesz egyetlen tárgyat a helyre\n" #: src/client/game.cpp msgid "Disabled unlimited viewing range" @@ -1223,6 +1492,11 @@ msgstr "Korlátlan látótáv letiltása" 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" @@ -1296,32 +1570,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "A kistérkép letiltva (szerver, vagy mod által)" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Kistérkép letiltva" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Kistérkép radar módban x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Kistérkép radar módban x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Kistérkép radar módban x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Kistérkép terület módban x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Kistérkép terület módban x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Kistérkép terület módban x4" +msgid "Multiplayer" +msgstr "Többjátékos" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1337,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" @@ -1361,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..." @@ -1395,6 +1645,21 @@ msgstr "A hangrendszer nem támogatott ebben build-ben" msgid "Sound unmuted" msgstr "Hang visszahangosítva" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "A szerveren valószínűleg a %s másik verziója fut." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Nem lehet csatlakozni a %s-hoz mivel az IPv6 nincs engedélyezve" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Nem lehet figyelni a %s-t mert az IPv6 nincs engedélyezve" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1450,7 +1715,7 @@ msgstr "Profiler elrejtése" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "Profiler megjelenítése (lap: %d1 ennyiből : %d2)" +msgstr "Profiler megjelenítése (lap: %d1 ennyiből: %d2)" #: src/client/keycode.cpp msgid "Apps" @@ -1464,10 +1729,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Törlés" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1510,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" @@ -1715,55 +1976,65 @@ msgstr "X Gomb 2" msgid "Zoom" msgstr "Nagyítás" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "A jelszavak nem egyeznek!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Kistérkép letiltva" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Regisztráció és belépés" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 most %1$s szerverre csatlakozol \"%2$s\" névvel először.\n" -"Ha folytatod, akkor egy új fiók lesz létrehozva a hitelesítő adatokkal a " -"szerveren.\n" -"Kérlek írd be újra a jelszavad, kattints Regisztrációra majd " -"Bejelentkezésre, hogy megerősítsd a fióklétrehozást vagy kattints Kilépés " -"gombra a megszakításhoz." +msgid "Minimap in radar mode, Zoom x%d" +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" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Kistérkép textúra módban" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Weblap megnyitása nem sikerült" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Weblap megnyitása" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Folytatás" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "különleges = lemászás" +msgid "\"Aux1\" = climb down" +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" msgstr "Automatikus ugrás" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Hátra" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Blokkhatárok" + #: src/gui/guiKeyChangeMenu.cpp 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" @@ -1816,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" @@ -1849,10 +2118,6 @@ msgstr "Képernyőkép" msgid "Sneak" msgstr "Lopakodás" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Különleges" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "HUD váltása" @@ -1893,10 +2158,6 @@ msgstr "Nyomj meg egy gombot" 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ó" @@ -1905,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" @@ -1914,14 +2179,9 @@ msgid "Muted" msgstr "Némitva" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Hangerő: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Belépés " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Hangerő: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1930,27 +2190,36 @@ 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 "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Használd a virtuális joystick-ot az \"aux\" gomb kapcsolásához.\n" -"Ha ez engedélyezve van, akkor a virtuális joystick is aktiválja az aux " -"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 -#, fuzzy msgid "" "(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" "Can be used to move a desired point to (0, 0) to create a\n" @@ -1961,13 +2230,17 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" -"A fraktál (X,Y,Z) eltolása a világ középpontjától, 'scale' egységekben.\n" -"Egy megfelelő, alacsony magasságú keletkezési pont (0, 0) közelébe " -"mozgatására használható.\n" -"Az alapértelmezés megfelelő Mandelbrot-halmazokhoz, a szerkesztés Julia-" -"halmazok esetén szükséges.\n" -"Körülbelül -2 és 2 közötti érték. Szorozd be 'scale'-lel, hogy kockákban " -"kapd meg az eltolást." +"A fraktál (X,Y,Z) relatív pozíciója a világ közepéhez képest, egységekben " +"mérve.\n" +"Használható arra, hogy egy kívánt pontot a (0, 0)-ra tegyünk, hogy " +"megfelelő\n" +"játékoskezdőpontot készítsünk, vagy hogy \"rázoomoljunk\" egy kívánt pontra\n" +"az egység növelése által.\n" +"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. Kockákban mért pozícióhoz szorzunk az " +"egységgel." #: src/settings_translation_file.cpp msgid "" @@ -1979,14 +2252,13 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax occlusion with slope information (gyorsabb).\n" -"1 = relief mapping (lassabb, pontosabb)." +"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" +"Növelje meg, hogy \"rázoomoljon\" a fraktál részleteire.\n" +"Az alapérték egy függőlegesen összenyomott alakot ad, amely\n" +"szigetekhez alkalmas. Ha a 3 szám egyenlő, a nyers alakot kapjuk." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." @@ -2011,7 +2283,7 @@ msgstr "2D zaj, amely a dombok méretét/előfordulását szabályozza." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" +msgstr "2D zaj, amely a lépcsős hegységek méretét/előrordulását szabályozza." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." @@ -2027,9 +2299,8 @@ msgid "3D mode" msgstr "3D mód" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Parallax Occlusion hatás ereje" +msgstr "3D mód parallax hatásának erőssége" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2041,7 +2312,7 @@ msgid "" "Also defines structure of floatland mountain terrain." msgstr "" "A hegyek szerkezetét és magasságát meghatározó 3D zaj.\n" -"A lebegő tájak hegyeit is meghatározza." +"A lebegő földek hegyeit is meghatározza." #: src/settings_translation_file.cpp msgid "" @@ -2050,6 +2321,10 @@ 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 "" +"A lebegő földek szerkezetét meghatározó 3D zaj.\n" +"Ha az alapértékekekt megváltoztatják, a zajszintet is át kell állítani\n" +"(0,7 alapbeállításban), mivel a lebegő földeket vékonyítása akkor a\n" +"leghatékonyabb, ha ez az érték körülbelül -2,0 és 2,0 közötti." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2069,7 +2344,6 @@ msgid "3D noise that determines number of dungeons per mapchunk." msgstr "3D-s zaj, amely meghatározza a tömlöcök számát egy térképdarabkánként." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "3D support.\n" "Currently supported:\n" @@ -2084,12 +2358,18 @@ msgid "" msgstr "" "3D támogatás.\n" "Jelenleg támogatott:\n" -"- none: nincs 3d kimenet.\n" -"- anaglyph: cián/magenta színű 3d.\n" -"- interlaced: odd/even line based polarisation screen support.\n" -"- topbottom: osztott képernyő fent/lent.\n" -"- sidebyside: osztott képernyő kétoldalt.\n" -"- pageflip: quadbuffer based 3d." +"- none: nincs 3d kimenet.\n" +"- anaglyph: cián/magenta színű 3d.\n" +"- interlaced: páros/páratlan soralapú polarizációs képernyő támogatás.\n" +"- topbottom: osztott képernyő fent/lent.\n" +"- 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 árnyalók használatát." + +#: src/settings_translation_file.cpp +msgid "3d" +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -2109,12 +2389,15 @@ msgstr "Az összes kliensen megjelenített üzenet a szerver leállításakor." #: src/settings_translation_file.cpp msgid "ABM interval" -msgstr "" +msgstr "ABM intervallum" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "ABM időgazdálkodás" #: src/settings_translation_file.cpp -#, fuzzy msgid "Absolute limit of queued blocks to emerge" -msgstr "A világgeneráló szálak számának abszolút határa" +msgstr "A várakozó blokkok felbukkanásának határa" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2122,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" @@ -2152,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 "" @@ -2162,6 +2445,12 @@ msgstr "" "Dpi konfiguráció igazítása a képernyődhöz (nem X11/csak Android) pl. 4k " "képernyőkhöz." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Az észlelt képsűrűség kiigazítása a felhasználói felület elemeinek " +"méretezéséhez." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2171,6 +2460,18 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "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" +"É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" @@ -2184,14 +2485,20 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" +"Módosítja a fénygörbét gamma korrekció hozzáadásával.\n" +"Magasabb értékek esetén a közepes és alacsony fényszintek világosabbak.\n" +"Az 1,0-ás érték a fénygörbét érintetlenül hagyja.\n" +"Csak a nappali és a mesterséges fényt befolyásolja jelentősen,\n" +"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" -msgstr "Ambiens okklúzió gamma" +msgstr "Környezeti árnyékolás gamma" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." @@ -2214,9 +2521,8 @@ msgid "Announce to this serverlist." msgstr "Szerver kihirdetése erre a szerverlistára." #: src/settings_translation_file.cpp -#, fuzzy msgid "Append item name" -msgstr "Elem nevének hozzáadása" +msgstr "Elemnév hozzáadása" #: src/settings_translation_file.cpp msgid "Append item name to tooltip." @@ -2227,12 +2533,10 @@ msgid "Apple trees noise" msgstr "Almafa zaj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Arm inertia" msgstr "Kar tehetetlenség" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." @@ -2258,22 +2562,28 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" -"Ennél a távolságnál a szerver agresszívan optimalizálja, melyik blokkokat " +"Ennél a távolságnál a szerver agresszívan optimalizálja, hogy melyik " +"blokkokat\n" "küldje a klienseknek.\n" "Kis értékek valószínűleg sokat javítanak a teljesítményen, látható " -"megjelenítési hibák árán.\n" -"(Néhány víz alatti és barlangokban lévő blokk nem jelenik meg, néha a " -"felszínen lévők sem.)\n" -"Ha nagyobb, mint a \"max_block_send_distance\", akkor nincs optimalizáció.\n" -"A távolság blokkokban értendő (16 node)" +"megjelenítési\n" +"hibák árán. (Néhány víz alatti és barlangokban lévő blokk nem jelenik meg,\n" +"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 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." @@ -2281,13 +2591,20 @@ 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 -#, fuzzy msgid "Autoscaling mode" msgstr "Automatikus méretezés mód" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1 gomb" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Aux1 gomb a mászáshoz/ereszkedéshez" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Vissza gomb" @@ -2298,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" @@ -2325,21 +2638,22 @@ 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 msgid "Biome noise" msgstr "Biom zaj" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bit/pixel (vagyis színmélység) teljes képernyős módban." - #: src/settings_translation_file.cpp 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" @@ -2349,9 +2663,8 @@ msgid "Bold and italic monospace font path" msgstr "Félkövér dőlt monospace betűtípus útvonal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold font path" -msgstr "Betűtípus helye" +msgstr "Félkövér betűtípus útvonala" #: src/settings_translation_file.cpp msgid "Bold monospace font path" @@ -2366,8 +2679,9 @@ msgid "Builtin" msgstr "Beépített" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bumpmappolás" +#, fuzzy +msgid "Camera" +msgstr "Nézet váltása" #: src/settings_translation_file.cpp msgid "" @@ -2376,14 +2690,20 @@ msgid "" "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\" 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" +"0,1 = alapértelmezett, 0,25 = jóválasztás gyengébb tabletekhez." #: 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" @@ -2438,46 +2758,36 @@ msgid "" "Center of light curve boost range.\n" "Where 0.0 is minimum light level, 1.0 is maximum light level." msgstr "" +"A fénygörbe közepének erősítési tartománya.\n" +"Ahol 0,0 a minimális fényszint, 1,0 a maximális fényszint." #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Megváltoztatja a főmenü felhasználói felületét:\n" -"- Teljes: Több egyjátékos világ, játékválasztás, textúracsomag-választó " -"stb.\n" -"- Egyszerű: Egy egyjátékos világ, nincs játék- vagy textúracsomag-választó.\n" -"Szükséges lehet a kisebb képernyőkhöz." +msgid "Chat command time message threshold" +msgstr "Csevegésparancs üzeneteinek időkorlátja" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Parancsok" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "Betűtípus mérete" +msgstr "Chat betűméret" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Csevegés gomb" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Hibakereső naplózás szintje" +msgstr "Chat napló szintje" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message count limit" -msgstr "Chat üzenetek maximális száma" +msgstr "Csevegőüzenetek számának korlátozása" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message format" -msgstr "Üzenet összeomláskor" +msgstr "Üzenet formátum" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" @@ -2492,8 +2802,8 @@ msgid "Chat toggle key" msgstr "Csevegés váltása gomb" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Parancsok" +msgid "Chat weblinks" +msgstr "Internetes linkek a csevegésben" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2501,16 +2811,24 @@ 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" msgstr "Tiszta átlátszó textúrák" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Kattintható internetes hivatkozások (középső egérkattintás vagy Ctrl+bal " +"klikk) engedélyezve az elküldött chatüzenetekben." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Kliens" @@ -2529,7 +2847,12 @@ msgstr "Kliens modolási korlátozások" #: src/settings_translation_file.cpp msgid "Client side node lookup range restriction" -msgstr "" +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" @@ -2545,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" @@ -2555,6 +2878,10 @@ msgstr "Felhők a menüben" msgid "Colored fog" msgstr "Színezett köd" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Színezett árnyékok" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2565,6 +2892,14 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" +"A tartalomtárban elrejtendő jelölők vesszővel tagolt listája.\n" +"\"nonfree\" használatával elrejthetők azok a csomagok, amelyek nem tartoznak " +"a\n" +"\"szabad szoftverek kategóriájába a Free Software Foundation meghatározása " +"szerint.\n" +"Megadhatja továbbá a tartalom besorolásait is.\n" +"Ezek a jelölők függetlenek a Minetest verziótól, ezért nézze meg\n" +"a teljes listát itt: https://content.minetest.net/help/content_flags/" #: src/settings_translation_file.cpp msgid "" @@ -2589,9 +2924,33 @@ msgstr "" msgid "Command key" msgstr "Parancs gomb" +#: src/settings_translation_file.cpp +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 "" +"A tömörítés foka a térképblokkok lemezre mentéséhez.\n" +"-1 - alapértelmezett tömörítési fok\n" +"0 - legkisebb tömörítés, leggyorsabb\n" +"9 - legjobb tömörítés, leglassabb" + +#: src/settings_translation_file.cpp +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 "" +"Tömörítés foka a térképblokkok kliensnek küldéséhez.\n" +"-1 - alapértelmezett tömörítési fok\n" +"0 - legkisebb tömörítés, leggyorsabb\n" +"9 - legjobb tömörítés, leglassabb" + #: 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" @@ -2599,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" @@ -2613,23 +2972,34 @@ msgstr "Konzol szín" 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" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB egyidejű letöltések maximális száma" + #: src/settings_translation_file.cpp msgid "ContentDB URL" 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 "" +"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" @@ -2641,14 +3011,16 @@ msgid "" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" -"Nappal/éjjel ciklus hossza.\n" -"Példák: 72 = 20 perc, 360 = 4 perc, 1 = 24 óra, 0 = nappal/éjjel/bármelyik " +"Nappal/éjjel ciklus hosszát határozza meg.\n" +"Példák:\n" +"72 = 20 perc, 360 = 4 perc, 1 = 24 óra, 0 = nappal/éjjel/bármelyik " "változatlan marad." #: src/settings_translation_file.cpp -#, fuzzy -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." @@ -2664,6 +3036,10 @@ msgid "" "Value >= 10.0 completely disables generation of tunnels and avoids the\n" "intensive noise calculations." msgstr "" +"A csatornák szélességét irányítja, a kisebb érték szélesebb csatornát hoz " +"létre.\n" +"Érték >= 10.0 teljesen kikapcsolja a csatornák generálását és elkerüli az\n" +"intenzív zajszámítást." #: src/settings_translation_file.cpp msgid "Crash message" @@ -2678,16 +3054,24 @@ msgid "Crosshair alpha" msgstr "Célkereszt átlátszóság" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Célkereszt átlátszóság (0 és 255 között)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Célkereszt átlátszóság (0 és 255 között).\n" +"Az objektum célkereszt színét is meghatározza." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Célkereszt színe" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Célkereszt színe (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Célkereszt szín (R,G,B).\n" +"Az objektum célkereszt színét is állítja" #: src/settings_translation_file.cpp msgid "DPI" @@ -2702,21 +3086,20 @@ msgid "Debug info toggle key" msgstr "Hibakereső információra váltás gomb" #: src/settings_translation_file.cpp -#, fuzzy msgid "Debug log file size threshold" -msgstr "Sivatag zajának küszöbszintje" +msgstr "Hibakeresési naplófájl méretküszöbe" #: src/settings_translation_file.cpp 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" @@ -2751,17 +3134,18 @@ msgid "Default report format" msgstr "Alapértelmezett jelentésformátum" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Alapértelmezett játék" +msgstr "Alapértelmezett kötegméret" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"A cURL alapértelmezett időkorlátja ezredmásodpercekben.\n" -"Csak akkor van hatása, ha a program cURL-lel lett lefordítva." +"Árnyékszűrők minőségének beállítása.\n" +"Lágy árnyék effektus szimulálása PCF vagy Poisson disk eljárással,\n" +"de egyéb erőforrásokat is használ." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2773,20 +3157,17 @@ msgstr "A homokos tengerpartok területeit határozza meg." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" -"A magasabb terep (hegytetők) területeit szabja meg és a szirtek\n" -"meredekségére is hatással van." +msgstr "A magasabb terep eloszlását, a szirtek meredekségét szabályozza." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines distribution of higher terrain." -msgstr "A \"terrain_higher\" területeit határozza meg (hegytetők terepe)." +msgstr "A magasabb területek eloszlását határozza meg." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." msgstr "" -"Az üregek teljes méretét adja meg. Kisebb értékek nagyobb\n" -"üregeket képeznek." +"Az üregek teljes méretét adja meg, a kisebb értékek nagyobb üregeket " +"képeznek." #: src/settings_translation_file.cpp msgid "Defines large-scale river channel structure." @@ -2796,14 +3177,6 @@ msgstr "A nagy léptékű folyómeder-struktúrát határozza meg." msgid "Defines location and terrain of optional hills and lakes." msgstr "Az opcionális hegyek és tavak helyzetét és terepét határozza meg." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"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." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Meghatározza az alap talajszintet." @@ -2815,8 +3188,7 @@ msgstr "A folyómedrek mélységét határozza meg." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" -"A maximális távolság, aminél a játékosok látják egymást,\n" -"blokkokban megadva (0 = korlátlan)." +"A maximális játékos küldési távolság blokkokban megadva (0 = korlátlan)." #: src/settings_translation_file.cpp msgid "Defines the width of the river channel." @@ -2863,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 @@ -2882,6 +3254,15 @@ msgstr "" 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" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Ásási részecskék" @@ -2894,6 +3275,16 @@ msgstr "Csalás elleni védelem letiltása" msgid "Disallow empty passwords" msgstr "Üres jelszavak tiltása" +#: src/settings_translation_file.cpp +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." @@ -2915,12 +3306,10 @@ msgid "Dump the mapgen debug information." msgstr "A térképgenerátor hibakeresési információinak kiírása." #: src/settings_translation_file.cpp -#, fuzzy msgid "Dungeon maximum Y" -msgstr "Tömlöc maximális Y magassága" +msgstr "Tömlöc maximális Y magassága" #: src/settings_translation_file.cpp -#, fuzzy msgid "Dungeon minimum Y" msgstr "Tömlöc minimális Y magassága" @@ -2933,6 +3322,8 @@ msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" +"IPv6 támogatás engedélyezése (a kliens és a szerver számára is).\n" +"Szükséges, hogy az IPv6 kapcsolatok egyáltalán működjenek." #: src/settings_translation_file.cpp msgid "" @@ -2942,19 +3333,41 @@ msgstr "" "Lua modolás támogatás bekapcsolása a kliensen.\n" "Ez a támogatás még kísérleti fázisban van, így az API változhat." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Poisson disk szűrés engedélyezése.\n" +"Igazra állítás esetén Poisson disk eljárással képez lágy árnyékokat. " +"Különben a PCF szűrőt használja." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Színes árnyékok engedélyezése.\n" +"Igaz érték esetén az áttettsző kockák színes árnyékot vetnek. " +"Erőforrásigényes." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Konzolablak engedélyezése" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Kreatív mód engedélyezése az újonnan létrehozott térképekhez." +msgid "Enable creative mode for all players" +msgstr "Kreatív mód engedélyezése az összes játékos számára" #: src/settings_translation_file.cpp -#, fuzzy 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." @@ -2973,28 +3386,18 @@ msgstr "" "Véletlenszerű felhasználói bemenet engedélyezése (csak teszteléshez " "használható)." -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Enable register confirmation" -msgstr "Regisztermegerősítés engedélyezése" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" -"Engedélyezze a regisztráció megerősítését, amikor csatlakozik a szerverhez.\n" -"Letiltás esetén 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ű ambient occlusion-nel.\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" @@ -3025,27 +3428,27 @@ msgid "" "Enable vertex buffer objects.\n" "This should greatly improve graphics performance." msgstr "" +"Vertex buffer objektumok engedélyezése.\n" +"Ez nagyban javíthatja a grafikus teljesítményt." #: 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 "" -"Bekapcsolja a fejmozgást és beállítja a mértékét.\n" +"Bekapcsolja a fejbillegést és beállítja a mértékét.\n" "Pl: 0 nincs fejmozgás; 1.0 alapértelmezett fejmozgás van; 2.0 dupla " -"fejmozgás van" +"fejmozgás van." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Enable/disable running an IPv6 server.\n" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" -"IPv6 szerver futtatásának engedélyezése/letiltása. Egy IPv6 szerver " -"lehetséges, hogy\n" -"IPv6 kliensekre van korlátozva, a rendszer konfigurációtól függően.\n" -"Nincs figyelembe véve, ha bind_address van beállítva." +"IPv6 szerver futtatásának engedélyezése/letiltása.\n" +"Nincs figyelembe véve, ha bind_address van beállítva.\n" +"Szükséges hozzá, hogy az ipv6 engedélyezve legyen." #: src/settings_translation_file.cpp msgid "" @@ -3054,42 +3457,23 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" +"Engedélyezi Hable 'Uncharted 2' színtónusleképezését.\n" +"A fotófilmek színgörbéjét szimulálja és utánozza a nagy dinamikatartományú\n" +"képi megjelenést. A közepző színtartomány kontrasztját kissé\n" +"erősíti, a világosabb és sötétebb részeket fokozatosan tömöríti." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." -msgstr "Az eszköztárelemek animációjának engedélyezése." +msgstr "Az felszerelésben lévő tárgyak animációjának engedélyezése." #: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Enables caching of facedir rotated meshes." -msgstr "Engedélyezi az elforgatott rácsvonalak gyorsítótárazását." +msgstr "Az elforgatott hálók irányának gyorsítótárazásának engedélyezése." #: src/settings_translation_file.cpp msgid "Enables minimap." msgstr "Engedélyezi a kistérképet." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Parallax occlusion mapping bekapcsolása.\n" -"A shaderek engedélyezve kell hogy legyenek." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3097,23 +3481,34 @@ msgid "" "sound controls will be non-functional.\n" "Changing this setting requires a restart." msgstr "" +"Engedélyezi a hangrendszert.\n" +"Ha ki van kapcsolva, teljesen kikapcsol minden hangot és a játék " +"hangvezérlői\n" +"nem fognak működni.\n" +"Ennek a beállításnak a megváltoztatása a játék újraindítását igényli." + +#: 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 "" +"Engedélyez olyan kompromisszimus megoldásokat, amelyek csökkentik a CPU " +"terhelését vagy\n" +"növelik a renderelési teljesítményt kisebb vizuális hibák árán, amelyek nem " +"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" #: src/settings_translation_file.cpp -#, fuzzy msgid "Entity methods" -msgstr "Egység módszerek" - -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Kísérleti opció, látható rések jelenhetnek meg a blokkok között\n" -"ha nagyobbra van állítva, mint 0." +msgstr "Entitás metódusok" #: src/settings_translation_file.cpp msgid "" @@ -3124,40 +3519,37 @@ 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 "" +"A lebegő földek vékonyításának kitevője. A vékonyítás módján változtat.\n" +"Érték = 1,0 egyeneletes, lineáris vékonyítás.\n" +"Értékek > 1,0 az alapértelmezett különálló lebegő földekhez illő könnyed\n" +"vékonyítás.\n" +"Értékek < 1,0 (például 0,25) határozottab felszínt képez laposabb " +"alföldekkel,\n" +"egybefüggű lebegő föld réteghez használható." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS a szünet menüben" +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" #: src/settings_translation_file.cpp msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp -#, fuzzy msgid "Factor noise" msgstr "Tényezőzaj" #: src/settings_translation_file.cpp msgid "Fall bobbing factor" -msgstr "" +msgstr "Leesés utáni fejrázkódási tényező" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font path" -msgstr "Tartalék betűtípus" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Tartalék betűtípus árnyéka" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Tartalék betűtípus árnyék átlátszósága" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Tartalék betűtípus mérete" +msgstr "Tartalék betűtípus útvonala" #: src/settings_translation_file.cpp msgid "Fast key" @@ -3177,10 +3569,10 @@ msgstr "Gyors mozgás" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Gyors mozgás (a használat gombbal).\n" +"Gyors mozgás (az \"Aux1\" gombbal).\n" "Szükséges hozzá a gyors mód jogosultság a szerveren." #: src/settings_translation_file.cpp @@ -3192,14 +3584,14 @@ msgid "Field of view in degrees." msgstr "Látóterület fokokban." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "File in client/serverlist/ that contains your favorite servers displayed in " "the\n" "Multiplayer Tab." msgstr "" "A client/serverlist/ mappában lévő fájl, ami tartalmazza a kedvenc " -"szervereket, amik a Többjátékos fül alatt jelennek meg." +"szervereidet,\n" +"amik a Többjátékos fül alatt jelennek meg." #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3211,34 +3603,45 @@ 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 "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" +"A szűrt textúrák vegyíthetik a teljesen átlátszó szomszédokkal rendelkező " +"RGB értékeket,\n" +"amit a PNG optimalizálók általában figyelmen kívül hagynak, és ez gyakran " +"sötét vagy\n" +"világos élekhez vezet az átlátszó textúráknál. Használjon szűrőt ezeknek a " +"textúra betöltésekor\n" +"történő eltüntetésére. Ez automatikusan bekapcsol, ha a mipmapping be van " +"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." msgstr "" +"Az első a négy 2D zajból, amelyek együttesen meghatározzák a dombságok/" +"hegységek magasságát." #: src/settings_translation_file.cpp msgid "First of two 3D noises that together define tunnels." msgstr "" +"Az első a két 3D zajból, amelyek együttesen meghatározzák az alagutakat." #: src/settings_translation_file.cpp msgid "Fixed map seed" msgstr "Fix térkép seed" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fixed virtual joystick" msgstr "Rögzített virtuális joystick" @@ -3256,16 +3659,15 @@ msgstr "Lebegő földek minimális Y magassága" #: src/settings_translation_file.cpp msgid "Floatland noise" -msgstr "Lebegőföldek zaja" +msgstr "Lebegő földek zaja" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "A lebegő hegyek alapzaja" +msgstr "A lebegő földek kúpkitevője" #: src/settings_translation_file.cpp msgid "Floatland tapering distance" -msgstr "A lebegő földek hegyeinek távolsága" +msgstr "A lebegő földek kúpjainak távolsága" #: src/settings_translation_file.cpp msgid "Floatland water level" @@ -3291,13 +3693,18 @@ msgstr "Köd indulás" 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 "" +msgstr "Félkövér betűtípus alapértelmezetten" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "" +msgstr "Dőlt betűtípus alapértelmezetten" #: src/settings_translation_file.cpp msgid "Font shadow" @@ -3312,25 +3719,47 @@ msgid "Font size" msgstr "Betűtípus mérete" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" +msgid "Font size divisible by" +msgstr "Betűméret osztója" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" +"Az alapértelmezett betűtípus betűmérete, ahol 1 egység = 1 pixel 96 DPI " +"esetén" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +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" #: 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 "" +"A legutóbbi csevegésszövegek és üzenetek betűmérete pontban (pt).\n" +"0 érték esetén az alapértelmezett betűméretet fogja használni." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"A pixeles stílusú betűtípusokhoz, amelyek nem méretezhetők olyan jól, ez " +"biztosítja, hogy a használt\n" +"betűméretek az ilyen betűtípus esetén mindig oszthatók legyenek ezzel az " +"értékkel, pixelben. Például\n" +"egy 16 pixel magas pixeles stílusú betűtípus esetén ezt 16-ra kell állítani, " +"ezáltal csak 16, 32, 48 stb.\n" +"lesz használható, ezért ha egy mod 25-ös méretet igényel, 32-est fog kapni." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Format of player chat messages. The following strings are valid " "placeholders:\n" @@ -3338,7 +3767,7 @@ msgid "" msgstr "" "A játékos csevegési üzeneteinek formátuma. A következő karakterláncok " "érvényesek:\n" -"@ név, @ üzenet, @ időbélyeg (opcionális)" +"@név, @üzenet, @időbélyeg (opcionális)" #: src/settings_translation_file.cpp msgid "Format of screenshots." @@ -3346,36 +3775,34 @@ msgstr "Képernyőmentések formátuma." #: src/settings_translation_file.cpp msgid "Formspec Default Background Color" -msgstr "" +msgstr "Formspec panelek alapértelmezett háttérszíne" #: src/settings_translation_file.cpp msgid "Formspec Default Background Opacity" -msgstr "" +msgstr "Formspec panelek hátterének alapértelmezett átlátszósága" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Color" -msgstr "" +msgstr "Teljes képernyős Formspec panelek háttérszíne" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Opacity" -msgstr "" +msgstr "Teljes képernyős Formspec panelek hátterének átlátszósága" #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec default background color (R,G,B)." -msgstr "Játékon belüli csevegő konzol hátterének színe (R,G,B)." +msgstr "Formspec panelek alapértelmezett háttérszíne (R,G,B)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec default background opacity (between 0 and 255)." msgstr "" -"Játékon belüli csevegő konzol hátterének alfája (átlátszatlanság, 0 és 255 " +"Játékon belüli kezelőpanelek hátterének alfája (átlátszatlanság, 0 és 255 " "között)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec full-screen background color (R,G,B)." -msgstr "Játékon belüli csevegő konzol hátterének színe (R,G,B)." +msgstr "" +"Játékon belüli teljes képrenyős kezelőpanelek hátterének színe (R,G,B)." #: src/settings_translation_file.cpp msgid "Formspec full-screen background opacity (between 0 and 255)." @@ -3389,6 +3816,8 @@ msgstr "Előre gomb" #: src/settings_translation_file.cpp msgid "Fourth of 4 2D noises that together define hill/mountain range height." msgstr "" +"A negyedik a négy 2D zajból, amelyek együttesen meghatározzák a dombságok/" +"hegységek magasságát." #: src/settings_translation_file.cpp msgid "Fractal type" @@ -3396,11 +3825,7 @@ msgstr "Fraktál típusa" #: src/settings_translation_file.cpp msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "FreeType betűtípusok" +msgstr "A látótávolságnak az a része, amelynél a köd renderelése kezdődik" #: src/settings_translation_file.cpp msgid "" @@ -3408,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 "" @@ -3425,15 +3850,19 @@ 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 "" +"Mekkora távolságból észleljék a kliensek az objektumokat, térképblokkokban " +"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" +"az aktív objektumokat betöltve tartsa eddig a távolságig a játékos " +"tekintetének irányában.\n" +"(Ez megakadályozza, hogy a mobok hirtelen eltűnjenek a látómezőből)" #: src/settings_translation_file.cpp msgid "Full screen" msgstr "Teljes képernyő" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Teljes képernyő BPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Teljes képernyős mód." @@ -3451,45 +3880,64 @@ msgid "GUI scaling filter txr2img" msgstr "Felhasználói felület méretarány szűrő txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Normálfelületek generálása" +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 visszahívások" +msgstr "Globális visszatérések" #: 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 junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" -"Térkép generálási jellemzők csak a Flat (lapos) térképgenerátor esetében.\n" -"Esetenkénti tavak és dombok generálása a lapos világba.\n" -"The default flags set in the engine are: none\n" -"The flags string modifies the engine defaults.\n" -"Flags that are not specified in the flag string are not modified from the " -"default.\n" -"Flags starting with \"no\" are used to explicitly disable them." +"Globális térképgenerálási jellemzők.\n" +"A Mapgen v6 térképgenerátorban a 'decorations' jelző szabályozza az összes " +"dekorációt,\n" +"kivéve a fákat és a dzsungelfüvet, a többi térképgenerátornál pedig az " +"összeset." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." msgstr "" +"A fénygörbe gradiense a legmagasabb fényszinten.\n" +"A legmagasabb fényszintek kontrasztrját szabályozza." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." msgstr "" +"A fénygörbe gradiense a legalacsonyabb fényszinten.\n" +"A legalacsonyabb fényszintek kontrasztrját szabályozza." #: src/settings_translation_file.cpp 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ó" @@ -3503,32 +3951,34 @@ msgid "Ground noise" msgstr "Talaj zaj" #: src/settings_translation_file.cpp -#, fuzzy 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" msgstr "HUD váltás gomb" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"Az elavult lua API hívások kezelése:\n" -"-örökölt: (próbálja meg) a régi viselkedést utánozni (alapértelmezett).\n" -"-log: elavult hívás visszakövetése és naplózása (hibakereséshez " -"alapértelmezett).\n" -"-error: Megszakítja az elavult hívás használatát (javasolt a mod " -"fejlesztőknek)." +"Az elavult Lua API hívások kezelése:\n" +"-none: ne naplózza az elavult hívásokat\n" +"-log: elavult hívás utánozása és naplózása (alapértelmezett).\n" +"-error: megszakítja az elavult hívás használatát (javasolt a " +"modfejlesztőknek)." #: src/settings_translation_file.cpp msgid "" @@ -3538,6 +3988,11 @@ msgid "" "call).\n" "* Instrument the sampler being used to update the statistics." 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" +"* A mintavevő hangolása a mutatószámok frissítésehez." #: src/settings_translation_file.cpp msgid "Heat blend noise" @@ -3548,8 +4003,10 @@ msgid "Heat noise" msgstr "Hőzaj" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "A kezdeti ablak magassága." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"A kezdőablak magassága. Teljes képernyős módban nem kerül figyelmbe vételre." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3559,10 +4016,6 @@ msgstr "Magasság zaj" msgid "Height select noise" msgstr "A magasságot kiválasztó zaj" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Nagy pontosságú FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Domb meredekség" @@ -3592,167 +4045,164 @@ msgid "Homepage of server, to be displayed in the serverlist." msgstr "A szerver honlapja, ami a szerverlistában megjelenik." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" "Vízszintes gyorsulás a levegőben ugráskor vagy leeséskor,\n" -"blokk/másodpercben" +"kocka/másodperc/másodpercben." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Horizontal and vertical acceleration in fast mode,\n" "in nodes per second per second." msgstr "" "Vízszintes és függőleges gyorsulás gyors módban,\n" -"blokk/másodpercben." +"kocka/másodperc/másodpercben." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Horizontal and vertical acceleration on ground or when climbing,\n" "in nodes per second per second." -msgstr "Vízszintes és függőleges gyorsulás a földön, blokk/másodpercben." +msgstr "" +"Vízszintes és függőleges gyorsulás a földön, vagy mászáskor,\n" +"kocka/másodperc/másodpercben." #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar next key" -msgstr "Gyorsgomb következő gomb" +msgstr "Gyorselérési sáv következő gomb" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar previous key" -msgstr "Gyorsgomb előző gomb" +msgstr "Gyorselérési sáv előző gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 1 key" -msgstr "" +msgstr "Gyorselérési sáv 1-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 10 key" -msgstr "" +msgstr "Gyorselérési sáv 10-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 11 key" -msgstr "" +msgstr "Gyorselérési sáv 11-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 12 key" -msgstr "" +msgstr "Gyorselérési sáv 12-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 13 key" -msgstr "" +msgstr "Gyorselérési sáv 13-as hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 14 key" -msgstr "" +msgstr "Gyorselérési sáv 14-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 15 key" -msgstr "" +msgstr "Gyorselérési sáv 15-ös hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 16 key" -msgstr "" +msgstr "Gyorselérési sáv 16-os hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 17 key" -msgstr "" +msgstr "Gyorselérési sáv 17-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 18 key" -msgstr "" +msgstr "Gyorselérési sáv 18-as hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 19 key" -msgstr "" +msgstr "Gyorselérési sáv 19-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 2 key" -msgstr "" +msgstr "Gyorselérési sáv 2-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 20 key" -msgstr "" +msgstr "Gyorselérési sáv 20-as hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 21 key" -msgstr "" +msgstr "Gyorselérési sáv 21-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 22 key" -msgstr "" +msgstr "Gyorselérési sáv 22-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 23 key" -msgstr "" +msgstr "Gyorselérési sáv 23-as hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 24 key" -msgstr "" +msgstr "Gyorselérési sáv 24-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 25 key" -msgstr "" +msgstr "Gyorselérési sáv 25-ös hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 26 key" -msgstr "" +msgstr "Gyorselérési sáv 26-os hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 27 key" -msgstr "" +msgstr "Gyorselérési sáv 27-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 28 key" -msgstr "" +msgstr "Gyorselérési sáv 28-as hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 29 key" -msgstr "" +msgstr "Gyorselérési sáv 29-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 3 key" -msgstr "" +msgstr "Gyorselérési sáv 3-as hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 30 key" -msgstr "" +msgstr "Gyorselérési sáv 30-as hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 31 key" -msgstr "" +msgstr "Gyorselérési sáv 31-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 32 key" -msgstr "" +msgstr "Gyorselérési sáv 32-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 4 key" -msgstr "" +msgstr "Gyorselérési sáv 4-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 5 key" -msgstr "" +msgstr "Gyorselérési sáv 5-ös hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 6 key" -msgstr "" +msgstr "Gyorselérési sáv 6-os hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 7 key" -msgstr "" +msgstr "Gyorselérési sáv 7-es hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 8 key" -msgstr "" +msgstr "Gyorselérési sáv 8-as hely gomb" #: src/settings_translation_file.cpp msgid "Hotbar slot 9 key" -msgstr "" +msgstr "Gyorselérési sáv 9-es hely gomb" #: src/settings_translation_file.cpp msgid "How deep to make rivers." @@ -3764,15 +4214,27 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"Milyen gyorsan mozognak a folyadékhullámok. Magasabb = gyorsabb.\n" +"Ha negatív, a folyadékhullámok hátrafelé mozognak.\n" +"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 betöltetlenné teszi a nem használt " +"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." @@ -3783,9 +4245,8 @@ msgid "Humidity blend noise" msgstr "Páratartalom keverés zaj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Humidity noise" -msgstr "Páratartalomzaj" +msgstr "Páratartalom zaj" #: src/settings_translation_file.cpp msgid "Humidity variation for biomes." @@ -3808,15 +4269,12 @@ msgstr "" "hogy ne pazaroljon CPU erőforrást feleslegesen." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Ha le van tiltva, a használat (use) 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 "" @@ -3826,6 +4284,10 @@ msgid "" "invisible\n" "so that the utility of noclip mode is reduced." msgstr "" +"Ha engedélyezve, a szerver kiválogatja a takarásban lévő térképblokkokat\n" +"a játékos szemszögének megfelelően. Ezáltal a kliensnek küldött blokkok\n" +"száma 50-80%-kal csökkenthető. A klines nem kapja ezentúl a legtöbb nem\n" +"látható blokkot, emiatt a noclip mód (falonátjárás) kevésbé lesz használható." #: src/settings_translation_file.cpp msgid "" @@ -3834,26 +4296,35 @@ 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 "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +msgstr "" +"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, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" -"descending." +"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 engedélyezve van, a \"használat\" (use) gomb lesz használatban a " -"\"lopakodás\" (sneak) helyett lefelé mászáskor, vagy ereszkedéskor." +"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 -#, fuzzy msgid "" "If enabled, actions are recorded for rollback.\n" "This option is only read when server starts." msgstr "" -"Ha engedélyezve van, akkor a műveleteket rögzíti a visszagörgetéshez.\n" -"Ez az opció csak akkor olvasható, amikor a szerver elindul." +"Ha engedélyezve van, akkor a műveletek rögzülnek a visszavonhatóság " +"érdekében.\n" +"Ez az opció csak akkor van beolvasva, amikor a szerver elindul." #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." @@ -3873,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 @@ -3886,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." @@ -3896,6 +4370,19 @@ 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 kockák távolságára, akkor a " +"get_node\n" +"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 "" +"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 "" +"Ha egy parancs végrehajtása tovább tart, mint az itt másodpercben megadott " +"idő,\n" +"az időadatok hozzá lesznek fűzve a parancs visszajelző üzenetéhez" #: src/settings_translation_file.cpp msgid "" @@ -3904,6 +4391,10 @@ msgid "" "deleting an older debug.txt.1 if it exists.\n" "debug.txt is only moved if this setting is positive." msgstr "" +"Ha a debug.txt fájlmérete megabájtban meghaladja megnyitáskor az itt \n" +"megadott számot, a fájl átnevezésre kerül debug.txt.1-re,\n" +"és ha létezett egy régebbi debug.txt.1, az törlésre kerül.\n" +"A debug.txt csak akkor lesz átnevezve, ha ez a beállítás engedélyzve van." #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." @@ -3915,10 +4406,6 @@ msgstr "" 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 "" @@ -3930,7 +4417,8 @@ msgstr "Játékon belüli csevegő konzol hátterének színe (R,G,B)." #: src/settings_translation_file.cpp msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." -msgstr "Játékon belüli csevegéskonzol magassága 0,1 (10%) és 1,0 (100%) között." +msgstr "" +"Játékon belüli csevegéskonzol magassága 0,1 (10%) és 1,0 (100%) között." #: src/settings_translation_file.cpp msgid "Inc. volume key" @@ -3938,41 +4426,44 @@ 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 "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" msgstr "" +"Beépülő behangolása.\n" +"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 chatcommands on registration." -msgstr "Csevegésparancsok bemutatása regisztrációkor." +msgid "Instrument chat commands on registration." +msgstr "Csevegésparancsok behangolása regisztrációkor." #: src/settings_translation_file.cpp msgid "" "Instrument global callback functions on registration.\n" "(anything you pass to a minetest.register_*() function)" msgstr "" +"A globális callback függvények behangolása regisztrációkor.\n" +"(bármi, amit átadsz egy minetest.register_*() függvénynek)" #: 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." #: 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." #: src/settings_translation_file.cpp msgid "Instrument the methods of entities on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "" +msgstr "Az entitások metódusainak hangolása regisztrációkor." #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." @@ -3980,20 +4471,21 @@ 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." -msgstr "" +#, 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 msgid "Inventory items animations" -msgstr "Eszköztár elemek animációi" +msgstr "Felszerelésben lévő tárgyak animációi" #: src/settings_translation_file.cpp msgid "Inventory key" -msgstr "Eszköztár gomb" +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." @@ -4001,19 +4493,17 @@ 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 -#, fuzzy msgid "Item entity TTL" msgstr "Elem entitás TTL" #: src/settings_translation_file.cpp -#, fuzzy msgid "Iterations" msgstr "Ismétlések" @@ -4036,15 +4526,19 @@ 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" +msgstr "Joystick holttér" #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" -msgstr "Joystick frustum é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 "" @@ -4085,15 +4579,14 @@ msgstr "" "Tartomány nagyjából -2 és 2 között." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "Z component of hypercomplex constant.\n" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Julia-halmaz.\n" -"Z komponens hiperkomplex konstans.\n" +"Csak Julia-halmaz.\n" +"Hiperkomplex állandó Z összetevője.\n" "Megváltoztatja a fraktál alakját.\n" "Tartomány nagyjából -2 és 2 között." @@ -4141,6 +4634,16 @@ msgstr "" "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Gomb az ásáshoz.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4199,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" @@ -4210,7 +4713,7 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Gomb a játékos előre mozgásához.\n" -"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp @@ -4279,7 +4782,17 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Gomb az eszköztár megnyitásához.\n" +"Gomb a felszerelés megnyitásához.\n" +"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Gomb a lehelyezéshez.\n" "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4632,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" @@ -4663,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" @@ -4673,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" @@ -4793,6 +5306,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"A profiler kijelzőjének kapcsológombja. Fejlesztéshez használatos.\n" +"Lásd http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4814,6 +5330,10 @@ msgstr "" "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4864,21 +5384,25 @@ 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" +"frissíti a hálózaton." #: src/settings_translation_file.cpp msgid "" @@ -4890,18 +5414,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 "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" -msgstr "" +#, 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" -msgstr "" +#, 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" @@ -4910,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" @@ -4923,27 +5454,32 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Light curve boost" -msgstr "" +msgstr "Fénygörbe kiemelés" #: src/settings_translation_file.cpp msgid "Light curve boost center" -msgstr "" +msgstr "Fénygörbe kiemelés középpontja" #: src/settings_translation_file.cpp msgid "Light curve boost spread" -msgstr "" +msgstr "Fénygörbe kiemelés kiterjedése" #: src/settings_translation_file.cpp msgid "Light curve gamma" -msgstr "" +msgstr "Fénygörbe kiemelés gammája" #: src/settings_translation_file.cpp msgid "Light curve high gradient" -msgstr "" +msgstr "A fénygörbe tetejének gradiense" #: src/settings_translation_file.cpp msgid "Light curve low gradient" -msgstr "" +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 "" @@ -4951,6 +5487,11 @@ msgid "" "Only mapchunks completely within the mapgen limit are generated.\n" "Value is stored per-world." msgstr "" +"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" +"Az érték világonként külön tárolódik." #: src/settings_translation_file.cpp msgid "" @@ -4960,6 +5501,11 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"A párhzamos HTTP-kérések számának korlátja. Hatása:\n" +"- Médialekérések, ha a szerver remote_media beállítást használ.\n" +"- Szerverlista letöltés és szerverközzététel.\n" +"- Letöltések a főmenüből (pl. mod manager).\n" +"Csak akkor van hatása, ha cURL-lel lett összeállítva." #: src/settings_translation_file.cpp msgid "Liquid fluidity" @@ -4967,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" @@ -4975,15 +5521,13 @@ msgstr "Folyadékhullámzás maximum" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" -msgstr "" +msgstr "Folyadék sortisztítási ideje" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid sinking" msgstr "Folyadék süllyedés" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid update interval in seconds." msgstr "A folyadékok frissítési időköze másodpercben." @@ -5001,13 +5545,16 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." 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 modfejelsztőknek és szerverüzemeltetőknek." #: src/settings_translation_file.cpp msgid "Loading Block Modifiers" -msgstr "Blokk módosítók betöltése" +msgstr "Betöltendő blokk módosítók" #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of dungeons." msgstr "A tömlöcök alsó Y határa." @@ -5019,10 +5566,6 @@ msgstr "A lebegő földek alsó Y határa." msgid "Main menu script" msgstr "Főmenü szkript" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Főmenü stílusa" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5031,52 +5574,42 @@ msgstr "" "látószögtől." #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"Lehetővé teszi, hogy a DirectX működjön a LuaJIT-tel. Tiltsd le, ha " -"problémákat okoz." - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Makes all liquids opaque" msgstr "Az összes folyadékot átlátszatlanná teszi" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "A térkép tömörítésének foka merevlemezen való tároláshoz" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "A térkép tömörítésének foka hálózati átvitelhez" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Térkép mappája" #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "" +msgstr "A Kárpátok térképgenerátorra vonatkozó térképgenerálási beállítások." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." msgstr "" -"Térkép generálási jellemzők csak a Flat (lapos) térképgenerátor esetében.\n" -"Esetenkénti tavak és dombok generálása a lapos világba.\n" -"The default flags set in the engine are: none\n" -"The flags string modifies the engine defaults.\n" -"Flags that are not specified in the flag string are not modified from the " -"default.\n" -"Flags starting with \"no\" are used to explicitly disable them." +"A Lapos térképgenerátor sajátos tulajdonságai.\n" +"Alkalmanként tavak és dombok hozzáadódhatnak a lapos világhoz." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Fractal.\n" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" -"Térkép generálási jellemzők csak a Flat (lapos) térképgenerátor esetében.\n" -"Esetenkénti tavak és dombok generálása a lapos világba.\n" -"The default flags set in the engine are: none\n" -"The flags string modifies the engine defaults.\n" -"Flags that are not specified in the flag string are not modified from the " -"default.\n" -"Flags starting with \"no\" are used to explicitly disable them." +"A Fraktál térképgenerátor sajátos jellemzői.\n" +"A 'terrain' engedélyezi a nem-fraktál terep generálását,\n" +"mint az óceán, szigetek és a földalatti részek." #: src/settings_translation_file.cpp msgid "" @@ -5087,43 +5620,42 @@ msgid "" "to become shallower and occasionally dry.\n" "'altitude_dry': Reduces humidity with altitude." msgstr "" +"A Völgyek térképgenerátor sajátos jellemzői.\n" +"'altitude_chill': csökkenti a hőmérsékletet a magassággal.\n" +"'humid_rivers': megnöveli a páratartalmat a folyók körül.\n" +"'vary_river_depth': ha engedélyezve van, az alacsony páratalom és a magas\n" +"hőmérséklet hatására a folyók sekélyebbé válnak, és lehet, hogy " +"kiszáradnak.\n" +"'altitude_dry': csökkenti a páratartalmat a magassággal." #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen v5." -msgstr "" +msgstr "A v5 térképgenerátor sajátos tulajdonságai." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" "When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" "the 'jungles' flag is ignored." msgstr "" -"Térképgenerálási jellemzők csak a v6 térképgenerátor esetében.\n" -"When snowbiomes are enabled jungles are enabled and the jungles flag is " -"ignored.\n" -"The default flags set in the engine are: biomeblend, mudflow\n" -"The flags string modifies the engine defaults.\n" -"Flags that are not specified in the flag string are not modified from the " -"default.\n" -"Flags starting with \"no\" are used to explicitly disable them." +"A v6 térképgenerátor sajátos jellemzői.\n" +"A 'snowbiomes' zászló engedélyezi az új 5 biomos rendszert.\n" +"Amikor a 'snowbiomes' zászló engedélyezett a dzsungelek automatikusan " +"engedélyezve vannak\n" +"és a 'jungles' zászló figyelmen kívül van hagyva." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Térkép generálási jellemzők csak a Flat (lapos) térképgenerátor esetében.\n" -"Esetenkénti tavak és dombok generálása a lapos világba.\n" -"The default flags set in the engine are: none\n" -"The flags string modifies the engine defaults.\n" -"Flags that are not specified in the flag string are not modified from the " -"default.\n" -"Flags starting with \"no\" are used to explicitly disable them." +"Térkép generálási jellemzők csak a v7 térképgenerátor esetében.\n" +"'ridges': folyók.\n" +"'floatlands': lebegő földtömegek a légkörben.\n" +"'caverns': óriási barlangok mélyen a föld alatt." #: src/settings_translation_file.cpp msgid "Map generation limit" @@ -5133,23 +5665,25 @@ msgstr "Térkép generálási korlát" msgid "Map save interval" msgstr "Térkép mentésének időköze" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Árnyéktérkép frissítési idő" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Térképblokk korlát" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapblock mesh generation delay" -msgstr "Térkép generálási korlát" +msgstr "Térképblokk háló generálási késleltetés" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "Térkép generálási korlát" +msgstr "Térképblokk hálógenerátor MapBlock gyorsítótár mérete MB-ban" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" -msgstr "" +msgstr "Térképblokk memóriaürítésének időkorlátja" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian" @@ -5229,43 +5763,51 @@ msgstr "Max folyadék feldolgozva lépésenként." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" -msgstr "" +msgstr "Max. objektumtakarítás az extra blokkora" #: src/settings_translation_file.cpp -#, fuzzy msgid "Max. packets per iteration" -msgstr "Max csomag ismétlésenként" +msgstr "Maximum csomagok ismétlésenként" #: src/settings_translation_file.cpp msgid "Maximum FPS" msgstr "Maximum FPS (képkocka/mp)" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Maximum FPS a játék szüneteltetésekor." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "Maximum FPS, amikor a játék szüneteltetve van, vagy nincs fókuszban." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Az árnyékok renderelésének maximális távolsága." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum forceloaded blocks" -msgstr "A maximálisan terhelt blokkok" +msgstr "Az erőltetett betöltésű blokkok maximuma" #: src/settings_translation_file.cpp msgid "Maximum hotbar width" -msgstr "Maximum hotbar szélesség" +msgstr "Gyorselérési sáv maximális szélessége" #: src/settings_translation_file.cpp msgid "Maximum limit of random number of large caves per mapchunk." msgstr "" +"A véletlenszerűen egy térképdarabkára jutó nagy barlangok számának maximális " +"korlátja." #: src/settings_translation_file.cpp msgid "Maximum limit of random number of small caves per mapchunk." msgstr "" +"A véletlenszerűen egy térképdarabkára jutó kis barlangok számának maximális " +"korlátja." #: src/settings_translation_file.cpp msgid "" "Maximum liquid resistance. Controls deceleration when entering liquid at\n" "high speed." msgstr "" +"Maximális közegellenállás folyadékban. A nagy sebességgel folyadékba való\n" +"belépéskor bekövetkező lassulást szabályozza." #: src/settings_translation_file.cpp msgid "" @@ -5273,32 +5815,43 @@ msgid "" "The maximum total count is calculated dynamically:\n" "max_total = ceil((#clients + max_users) * per_client / 4)" msgstr "" +"A szimultán küldött blokkok maximális száma kliensenként.\n" +"A maximális összértéket így számoljuk dinamikusan:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." msgstr "Maximum blokkok száma, amik sorban állhatnak betöltésre." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "This limit is enforced per player." msgstr "" "Maximum blokkok száma, amik sorban állhatnak generálásra.\n" -"Hagyd üresen, hogy automatikusan legyen kiválasztva a megfelelő mennyiség." +"Ez a korlát játékosonként van kényszerítve." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" "Maximum blokkok száma, amik sorban állhatnak egy fájlból való betöltésre.\n" -"Hagyd üresen, hogy automatikusan legyen kiválasztva a megfelelő mennyiség." +"Ez a korlát játékosonként van kényszerítve." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Az egyszerre folyó letöltések maximális száma. A korláton túli letöltéseket " +"várólistára teszi.\n" +"A curl_parallel_limit-nél kisebbnek kell lennie." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." -msgstr "" +msgstr "Az erőltetetten betöltött térképblokkok maximális száma." #: src/settings_translation_file.cpp msgid "" @@ -5314,65 +5867,73 @@ msgid "" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" +"A lépésenként küldött csomagok maximális száma,\n" +"ha lassú kapcsolattal rendelkezel, próbáld csökkenteni,\n" +"de ne csökkentsd a kívánt kliensszám duplája alá." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum number of players that can be connected simultaneously." msgstr "Az egy időben csatlakozó játékosok maximális száma." #: src/settings_translation_file.cpp msgid "Maximum number of recent chat messages to show" -msgstr "A megjelenítendő csevegésüzenetek maximális száma." +msgstr "A megjelenítendő csevegésüzenetek maximális száma" #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." msgstr "Statikusan tárolt objektumok maximális száma egy térképblokkban." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum objects per block" -msgstr "Maximum objektum térképblokkonként" +msgstr "Maximum objektumok térképblokkonként" #: 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 "" -"Az aktuális ablak maximum hányada a hotbar számára.\n" -"Hasznos, ha valamit el kell helyezni a hotbar jobb, vagy bal oldalán." +"Az aktuális ablak maximum hányada a gyorselérési sáv számára.\n" +"Hasznos, ha valamit el kell helyezni a sáv jobb, vagy bal oldalán." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum simultaneous block sends per client" msgstr "Az egyidejűleg a kliensenként küldött térképblokkok maximális száma" #: src/settings_translation_file.cpp msgid "Maximum size of the out chat queue" -msgstr "" +msgstr "Kimenő üzenetek sorának maximális mérete" #: 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 "" +"A kimenő üzenetek sorának maximális mérete.\n" +"0 letiltja a várolistára helyezést, míg -1 korlátlanná teszi a sor méretét." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" "Egy fájl letöltésének maximum ideje (milliszekundumban), amíg eltarthat (pl. " "mod letöltés)." +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Az interaktív kérések (pl. szerverlista lekérése) számára rendelkezésre álló " +"maximális idő milliszekundumban." + #: src/settings_translation_file.cpp 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 "" +msgstr "Poligonháló cashe" #: src/settings_translation_file.cpp msgid "Message of the day" @@ -5388,7 +5949,7 @@ msgstr "Kijelölt objektum kiemelésére használt módszer." #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "A naplózás csevegésbe írásának minimális szintje." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5403,30 +5964,46 @@ msgid "Minimap scan height" msgstr "Kistérkép letapogatási magasság" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "3D-s zaj, amely meghatározza a tömlöcök számát egy mapchunkonként." +msgstr "" +"A véletlenszerűen egy térképdarabkára jutó nagy barlangok számának minimális " +"korlátja." #: src/settings_translation_file.cpp msgid "Minimum limit of random number of small caves per mapchunk." msgstr "" +"A véletlenszerűen egy térképdarabkára jutó kis barlangok számának minimális " +"korlátja." #: src/settings_translation_file.cpp msgid "Minimum texture size" msgstr "Minimum textúra méret" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mipmapping" -msgstr "Mip-mapping" +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" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "A hudbar elemméretét módosítja" +msgid "Modifies the size of the HUD elements." +msgstr "A HUD elemméretét módosítja." #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5436,6 +6013,10 @@ msgstr "Monospace betűtípus útvonal" msgid "Monospace font size" msgstr "Monospace betűméret" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Monospace betűméret osztója" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Hegy magasság zaj" @@ -5454,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" @@ -5469,6 +6050,8 @@ msgid "" "Multiplier for fall bobbing.\n" "For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double." msgstr "" +"A zuhanás utáni fejbillenés szorzója.\n" +"Például: 0 nincs biccentés; 1,0 normál; 2,0 dupla." #: src/settings_translation_file.cpp msgid "Mute key" @@ -5485,6 +6068,10 @@ msgid "" "Current mapgens in a highly unstable state:\n" "- The optional floatlands of v7 (disabled by default)." msgstr "" +"Az új világ létrehozásakor használandó térképgenerátor neve.\n" +"Új világ főmenüben történő létrehozása felülírja ezt.\n" +"Jelenleg a következő térképgenerátorok nagyon instabilak:\n" +"- Az opcionális lebegő földek a v7-ben (alapértelmezés szerint tiltott)." #: src/settings_translation_file.cpp msgid "" @@ -5507,15 +6094,18 @@ msgstr "" 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." msgstr "" +"Figyelt hálózati port (UDP).\n" +"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." @@ -5523,35 +6113,32 @@ msgstr "Az új felhasználóknak ezt a jelszót kell megadniuk." #: src/settings_translation_file.cpp msgid "Noclip" -msgstr "" +msgstr "Noclip" #: src/settings_translation_file.cpp 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" -msgstr "" +msgstr "NodeTimer időköz" #: src/settings_translation_file.cpp msgid "Noises" msgstr "Zajok" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" -msgstr "" +msgstr "A térképblokk betöltő szálak száma" #: src/settings_translation_file.cpp msgid "" @@ -5566,21 +6153,31 @@ 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 "" +"A térképblokkok betöltésére használt szálak száma.\n" +"Érték 0:\n" +"- Automatikus választás. A térképblokkok betöltését végző szálak száma\n" +"- \"processzorok száma - 2\" lesz, de legalább 1.\n" +"Bármilyen más érték:\n" +"- Meghatározza a térképblokkbetöltő szálak számát, amelynek alsó korlátja " +"1.\n" +"FIGYELEM: A térképblokkbetöltő szálak számának növelése növeli a játékmotor " +"mapgen\n" +"folyamatainak sebességét, de csökkentheti a játékteljesítményt azáltal, hogy " +"más\n" +"folyamatokat akadályoznak, különösen egyjátékos módban és/vagy Lua kódok " +"futtatásakor\n" +"az 'on_generated' eseményben. Sok játékos számára valószínűleg az 1 az " +"optimális beállítás." #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Online tartalomtár" +"A /clearobjects parancs által egyidejűleg betölthető extra blokkok száma.\n" +"Kompromisszum az SQLite tranzakciók erőforrásigénye és a\n" +"memóriahasználat között (4096=100MB hüvelykujjszabályként)." #: src/settings_translation_file.cpp msgid "Opaque liquids" @@ -5590,11 +6187,8 @@ msgstr "Átlátszatlan folyadékok" msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" +"Az alapértelmezett betűtípus mögötti árnyék átlátszatlansága (alfa) 0 és 255 " +"között." #: src/settings_translation_file.cpp msgid "" @@ -5602,55 +6196,40 @@ msgid "" "formspec is\n" "open." msgstr "" +"Megnyitja a szünet menüt, ha az ablak kikerül a fókuszból. Nem szünetel, ha " +"nyitva van\n" +"egy formspec panel." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Parallax Occlusion effekt" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Parallax Occlusion módja" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Parallax Occlusion mértéke" +msgid "Optional override for chat weblink color." +msgstr "A csevegésben lévő internetes linkek színének opcionális felülírása." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" +"A tartalék betűtípus elérési útvonala. TrueType betűtípusnak kell lenni.\n" +"Bizonyos nyelvek ezt a betűtípust használják vagy ha az alapértelmezett " +"betűtípus nem elérhető." #: 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 "" +"A képernyőképek mentésének elérési útvonala. Lehet abszolút vagy relatív " +"elérési út.\n" +"Ha még nem létezik a mappa, létre lesz hozva." #: src/settings_translation_file.cpp msgid "" "Path to shader directory. If no path is defined, default location will be " "used." msgstr "" +"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 msgid "Path to texture directory. All textures are first searched from here." @@ -5658,31 +6237,34 @@ msgstr "Textúra mappa útvonala. Először minden textúrát itt keres a játé #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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" +"Ha nem lehet betölteni a betűtípust, a tartalék betűtípust fogja használni." #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" +"A monospace betűtípus elérési útvonala. TrueType betűtípusnak kell lenni.\n" +"Ezt a betűtípust használja pl. a konzol és a profiler képernyő." #: src/settings_translation_file.cpp msgid "Pause on lost window focus" -msgstr "" +msgstr "Szüneteltetés ha az ablak kikerül a fókuszból" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" msgstr "" +"A merevlemezről várólistára töltött blokkok számának korlátja játékosonként" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks to generate" msgstr "" +"A várólistára töltött létrehozandó blokkok számának korlátja játékosonként" #: src/settings_translation_file.cpp msgid "Physics" @@ -5694,7 +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 "Lehelyezés gomb" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Lehelyezés-ismétlési időköz" #: src/settings_translation_file.cpp msgid "" @@ -5704,18 +6294,18 @@ msgstr "" "A játékos képes repülni, nem hat rá a gravitáció.\n" "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 "" +msgstr "Játékosátviteli távolság" #: src/settings_translation_file.cpp msgid "Player versus player" msgstr "Játékos játékos ellen" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Poisson szűrés" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5729,6 +6319,10 @@ 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 "" +"Ásás és lehelyezés ismétlődésének megakadályozása, amikor nyomva tartod az " +"egérgombokat.\n" +"Engedélyezd, ha túl gyakran fordul elő, hogy véletlenül lehelyezel vagy " +"kiásol blokkokat." #: src/settings_translation_file.cpp msgid "Prevent mods from doing insecure things like running shell commands." @@ -5741,8 +6335,8 @@ msgid "" "Print the engine's profiling data in regular intervals (in seconds).\n" "0 = disable. Useful for developers." msgstr "" -"A játékmotor profiladatainak kiírása szabályos időközökben (másodpercekben)." -"\n" +"A játékmotor profiladatainak kiírása szabályos időközökben " +"(másodpercekben).\n" "0 a kikapcsoláshoz. Hasznos fejlesztőknek." #: src/settings_translation_file.cpp @@ -5757,21 +6351,22 @@ msgstr "Profiler" msgid "Profiler toggle key" msgstr "Profiler váltó gomb" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" -msgstr "" +msgstr "Prometheus figyelési cím" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"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" +"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" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." @@ -5783,6 +6378,8 @@ msgid "" "Values larger than 26 will start to produce sharp cutoffs at cloud area " "corners." msgstr "" +"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 msgid "Raises terrain to make valleys around the rivers." @@ -5801,9 +6398,8 @@ msgid "Recent Chat Messages" msgstr "Legutóbbi csevegésüzenetek" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "Betűtípus helye" +msgstr "Betűtípus útvonala" #: src/settings_translation_file.cpp msgid "Remote media" @@ -5820,7 +6416,7 @@ msgid "" msgstr "" "Színkódok eltávolítása a bejövő csevegésüzenetekből\n" "Használd ezt hogy megakadályozd, hogy a játékosok színeket használjanak az " -"üzeneteikben." +"üzeneteikben" #: src/settings_translation_file.cpp msgid "Replaces the default main menu with a custom one." @@ -5843,31 +6439,37 @@ msgid "" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" +"Korlátozza bizonyos kliensoldali függvényekhez a hozzáférést a szerveren.\n" +"Kombináld az alábbi bájtcímkéket a kliensoldali képességek korlátozásához,\n" +"vagy állítsd 0-ra a korlátozások eltávolításához:\n" +"LOAD_CLIENT_MODS: 1 (letitlja a kliensoldali modok betöltését)\n" +"CHAT_MESSAGES: 2 (letiltja a send_chat_message hívásokat kliensoldalon)\n" +"READ_ITEMDEFS: 4 (letiltja a get_item_def hívásokat kliensoldalon)\n" +"READ_NODEDEFS: 8 (letiltja a get_node_def hívásokat kliensoldalon)\n" +"LOOKUP_NODES_LIMIT: 16 (korlátozza a get_node hívásokat kliensoldalon a\n" +"csm_restriction_noderange esetén)\n" +"READ_PLAYERINFO: 32 (letiltja a get_player_names hívásokat kliensoldalon)" #: src/settings_translation_file.cpp msgid "Ridge mountain spread noise" -msgstr "" +msgstr "A hegyvonulatok kiterjedésének zaja" #: src/settings_translation_file.cpp msgid "Ridge noise" -msgstr "" +msgstr "Hegygerinc zaj" #: src/settings_translation_file.cpp msgid "Ridge underwater noise" -msgstr "" +msgstr "Víz alatti hegygerinc zaj" #: src/settings_translation_file.cpp msgid "Ridged mountain size noise" -msgstr "" +msgstr "Hegyvonulatok méretének zaja" #: src/settings_translation_file.cpp msgid "Right key" msgstr "Jobb gomb" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Jobb kattintás ismétlési időköz" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Folyómeder mélysége" @@ -5894,7 +6496,7 @@ msgstr "Folyóvölgy szélessége" #: src/settings_translation_file.cpp msgid "Rollback recording" -msgstr "" +msgstr "Visszavonási pontok rögzítése" #: src/settings_translation_file.cpp msgid "Rolling hill size noise" @@ -5910,11 +6512,11 @@ 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." -msgstr "" +msgstr "Homokos partok képződnek, ha az np_beach meghaladja ezt az értéket." #: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." @@ -5938,11 +6540,16 @@ 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 az ára, hogy elhomályosít néhány szélső pixelt, ha a képek nem\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" @@ -5973,6 +6580,11 @@ msgstr "" "1 jelenti a legrosszabb minőséget; 100 jelenti a legjobb minőséget.\n" "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" @@ -5980,17 +6592,15 @@ msgstr "Folyómeder zaj" #: src/settings_translation_file.cpp msgid "Second of 4 2D noises that together define hill/mountain range height." msgstr "" +"A második a négy 2D zajból, amelyek együttesen meghatározzák a dombságok/" +"hegységek magasságát." #: src/settings_translation_file.cpp msgid "Second of two 3D noises that together define tunnels." 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 -#, fuzzy msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Lásd: http://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6007,7 +6617,6 @@ msgid "Selection box width" msgstr "Kijelölő doboz szélessége" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Selects one of 18 fractal types.\n" "1 = 4D \"Roundy\" Mandelbrot set.\n" @@ -6050,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" @@ -6071,16 +6691,26 @@ 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 "" +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" @@ -6094,9 +6724,50 @@ 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 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: 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" +"Minimális érték: 1,0; maximális érték: 10,0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"A Nap/Hold pályájának fokokban mért döntési szögét szabályozza.\n" +"A 0 érték azt jelenti, hogy nincs döntés / függőleges a pályájuk.\n" +"Minimális érték: 0,0; maximális érték: 60,0" + +#: src/settings_translation_file.cpp +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" +"Az árnyalók engedélyezése szükséges hozzá." + #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving leaves.\n" @@ -6121,6 +6792,16 @@ msgstr "" "A \"true\" beállítás engedélyezi a növények hullámzását.\n" "Az árnyalók engedélyezése szükséges hozzá." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Az árnyék textúrájának minőségét 32 bitesre állítja.\n" +"Ha hamis, 16 bites textúrát fog használni.\n" +"Ez sokkal több grafikai hibát okoz az árnyékon." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Árnyaló útvonala" @@ -6132,10 +6813,27 @@ msgid "" "cards.\n" "This only works with the OpenGL video backend." msgstr "" -"Az árnyalók fejlett vizuális effekteket engedélyeznek és növelhetik a " -"teljesítményt néhány videókártya esetében.\n" +"Az árnyalók fejlett vizuális effekteket tesznek lehetővé és növelhetik a " +"teljesítményt\n" +"néhány videókártya esetében.\n" "Csak OpenGL-el működnek." +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +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 kockákban" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "32 bites árnyéktérkép textúra" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Árnyéktérkép textúra méret" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6143,11 +6841,9 @@ 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 offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"Tartalék betűtípus árnyékának eltolása. Ha 0, akkor nem lesz árnyék rajzolva." +#, fuzzy +msgid "Shadow strength gamma" +msgstr "Árnyék kivehetősége" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6163,6 +6859,18 @@ msgstr "Hibakereső információ megjelenítése" msgid "Show entity selection boxes" msgstr "Entitások kijelölő dobozának megjelenítése" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Entitás hitboxok megjelenítése.\n" +"A változtatás után a játék újraindítása szükséges." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Névcédulák háttere alapértelmezésben látszik" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Leállítási üzenet" @@ -6176,6 +6884,14 @@ 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 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" +"Ha csökkentjük ezt az értéket, gyakrabban fordulnak elő barlangok és " +"tömlöcök.\n" +"Változtasd meg, ha valami különleges okból kell, de ajánlott\n" +"változatlanul hagyni." #: src/settings_translation_file.cpp msgid "" @@ -6183,10 +6899,18 @@ msgid "" "increase the cache hit %, reducing the data being copied from the main\n" "thread, thus reducing jitter." msgstr "" +"A poligonhálót generáló MapBlock cache mérete. Növelése megnöveli a\n" +"cache kiszolgálási teljesítményét, ezáltal csökken a fő szálból másolt " +"adatok\n" +"mennyisége, és ezáltal csökken a szaggatás." + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Égitestek pályájának döntése" #: src/settings_translation_file.cpp msgid "Slice w" -msgstr "" +msgstr "W szelet" #: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights." @@ -6203,31 +6927,34 @@ msgstr "Kis barlangok minimális száma" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." msgstr "" +"A biomok közötti átmeneti határra vonatkozó kisléptékű páratartalom-" +"ingadozás." #: src/settings_translation_file.cpp msgid "Small-scale temperature variation for blending biomes on borders." msgstr "" +"A biomok közötti átmeneti határra vonatkozó kisléptékű hőmérséklet-ingadozás." #: 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 -#, fuzzy 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 mozgáskor és körbenézéskor.\n" -"Videófelvételekhez hasznos." +"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" @@ -6239,20 +6966,16 @@ 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" +msgstr "Lágy árnyék sugara" #: src/settings_translation_file.cpp msgid "Sound" msgstr "Hang" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Különleges gomb" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Különleges gomb a mászáshoz/ereszkedéshez" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6260,6 +6983,13 @@ msgid "" "(obviously, remote_media should end with a slash).\n" "Files that are not present will be fetched the usual way." msgstr "" +"Meghatározza, mely URL-ről töltse le a kliens a médiatartalmat az UDP " +"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" +"A nem elérhető fájlokat a normál módon fogja letölteni." #: src/settings_translation_file.cpp msgid "" @@ -6267,6 +6997,21 @@ msgid "" "Note that mods or games may explicitly set a stack for certain (or all) " "items." msgstr "" +"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." + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Az árnyéktérkép firssítését széthúzza a megadott számú képkockára.\n" +"Magasabb érték esetén az árnyékok késhetnek, alacsabb érékek\n" +"viszont több erőforrást igényelnek.\n" +"Minimális érték: 1; maximális érték: 16" #: src/settings_translation_file.cpp msgid "" @@ -6274,6 +7019,9 @@ msgid "" "Controls the width of the range to be boosted.\n" "Standard deviation of the light curve boost Gaussian." msgstr "" +"A fénygörbe kiemelésének hatósugara.\n" +"A kiemelendő tartomány szélességét szabályozza.\n" +"A fénygörbe kiemelés Gauss-görbéjének szórása." #: src/settings_translation_file.cpp msgid "Static spawnpoint" @@ -6284,22 +7032,16 @@ msgid "Steepness noise" msgstr "Meredekség zaj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Step mountain size noise" -msgstr "Terep magasság" +msgstr "Lépcsős hegyek méretének zajossága" #: src/settings_translation_file.cpp msgid "Step mountain spread noise" -msgstr "" +msgstr "Lépcsős hegy kiterjedésének zaja" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." -msgstr "Generált normálfelületek erőssége." - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Generált normálfelületek erőssége." +msgstr "3D mód parallax hatásának erőssége." #: src/settings_translation_file.cpp msgid "" @@ -6307,14 +7049,17 @@ msgid "" "The 3 'boost' parameters define a range of the light\n" "curve that is boosted in brightness." msgstr "" +"A fénygörbe kiemelésének erőssége.\n" +"A 3 'boost' parameter a fénygörbe egy tartományát\n" +"határozza meg, amelyeken erősebbek a fények." #: src/settings_translation_file.cpp msgid "Strict protocol checking" -msgstr "" +msgstr "Szigorú protokollellenőrzés" #: src/settings_translation_file.cpp msgid "Strip color codes" -msgstr "" +msgstr "Színkódok kinyerése" #: src/settings_translation_file.cpp msgid "" @@ -6329,15 +7074,37 @@ 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" +"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í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" +"értékének 2,0-nak (vagy az 'mgv7_np_floatland'-től függően más szükséges " +"értéknek)\n" +"kell lenni, hogy elkerülhető legyen a szervert leterhelő extrém vízfolyás és " +"az alatta lévő\n" +"földfelszín elárasztása." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" -msgstr "" +msgstr "Szinkron SQLite" #: src/settings_translation_file.cpp 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" @@ -6347,7 +7114,6 @@ msgid "Terrain base noise" msgstr "Terep alapzaj" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain height" msgstr "Terep magasság" @@ -6365,6 +7131,9 @@ msgid "" "Controls proportion of world area covered by hills.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"A dombok terep zajküszöbe.\n" +"A világ dombokkal fedett területének arányát szabályozza.\n" +"Állítsd 0,0-hoz közelebb, hogy az arány növekedjen." #: src/settings_translation_file.cpp msgid "" @@ -6372,15 +7141,29 @@ msgid "" "Controls proportion of world area covered by lakes.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"A tavak terep zajküszöbe.\n" +"A világ tavakkal fedett területének arányát szabályozza.\n" +"Állítsd 0,0-hoz közelebb, hogy az arány növekedjen." #: src/settings_translation_file.cpp msgid "Terrain persistence noise" -msgstr "" +msgstr "Terep folytonossági zaj" #: src/settings_translation_file.cpp msgid "Texture path" msgstr "Textúrák útvonala" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Az árnyéktérkép rendereléséhez használt textúraméret.\n" +"Kettő hatványának kell lennie.\n" +"Nagyobb számok nagyobb árnyékokat hoznak létre, de ez egyben " +"erőforrásigényesebb is." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6390,25 +7173,42 @@ 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 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 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." #: src/settings_translation_file.cpp msgid "The URL for the content repository" msgstr "Az URL a tartalomtárhoz" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "A joystick holttere" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" "when calling `/profiler save [format]` without format." msgstr "" +"A profilok mentéséhez használt alapértelmezett formátum, amikor\n" +"formátum nélkül kerül meghívásra a `/profiler save [format]` parancs." #: src/settings_translation_file.cpp msgid "The depth of dirt or other biome filler node." -msgstr "" +msgstr "A föld vagy egyéb biomkitöltő kockaréteg mélysége." #: src/settings_translation_file.cpp msgid "" "The file path relative to your worldpath in which profiles will be saved to." msgstr "" +"A profilok mentésének relatív elérési útja a világod elérési útjához képest." #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" @@ -6417,6 +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ó aktiválódásához szükséges távolság pixelekben." #: src/settings_translation_file.cpp msgid "" @@ -6426,10 +7227,15 @@ msgid "" "Default is 1.0 (1/2 node).\n" "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 kocka.\n" +"0,0 = A hullámok egyáltalán nem mozognak.\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 msgid "The network interface that the server listens on." -msgstr "" +msgstr "A hálózati interfész, amelyen a szerver figyel." #: src/settings_translation_file.cpp msgid "" @@ -6450,22 +7256,38 @@ msgid "" "maintained.\n" "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 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" +"Ezt a beállítást az active_object_send_range_blocks-szal összhangban kell " +"megadni." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" +"A renderelő háttérprogram.\n" +"Ha ezt megváltoztatod, újraindítás szükséges.\n" +"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 árnyalókat az OpenGL (csak asztali rendszeren) és OGLES2 (kísérleti) " +"támogatja" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" +"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 "" @@ -6474,6 +7296,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 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 " +"adunk meg,\n" +"a legközelebbi érvényes értékre lesz állítva." #: src/settings_translation_file.cpp msgid "" @@ -6481,24 +7309,33 @@ 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 "" +"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" +"hogy törli a régóta sorbanálló elemeket. A 0 érték letiltja ezt a funkciót." + +#: 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 "" +"Az ABM-ek rendelkezésére álló lépésenkénti végrehajtási időkeret\n" +"(az ABM intervallum törtrésze)" #: src/settings_translation_file.cpp -#, fuzzy 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 ismételt jobb kattintáshoz a jobb egérgomb " +"Ennyi másodperc szükséges az esemény megismétléséhez a joystick gombok " "nyomva tartásakor." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"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 jobb kattintáshoz a jobb egérgomb " +"Ennyi másodperc szükséges az ismételt kockalehelyezéshez a lehelyezés gomb " "nyomva tartásakor." #: src/settings_translation_file.cpp @@ -6511,34 +7348,44 @@ msgid "" "enabled. Also the vertical distance over which humidity drops by 10 if\n" "'altitude_dry' is enabled." msgstr "" +"Az a függőleges távolság, amely során a hőmérséklet 20 fokkal csökken, ha az " +"'altitude_chill'\n" +"be van kapcsolva. Ugyanez a távolság, amely során a páratartalom esik 10 " +"egységgel, ha az\n" +"'altitude_dry' be van kapcsolva." #: src/settings_translation_file.cpp msgid "Third of 4 2D noises that together define hill/mountain range height." msgstr "" +"A harmadik a négy 2D zajból, amelyek együttesen meghatározzák a dombságok/" +"hegységek magasságát." #: 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 "" -"Annak az ideje, hogy mennyi ideig \"élnek\" az eldobott tárgyak.\n" +"Annak az ideje, hogy mennyi ideig maradnak meg az eldobott tárgyak.\n" "-1-re állítás kikapcsolja ezt a funkciót." #: src/settings_translation_file.cpp msgid "Time of day when a new world is started, in millihours (0-23999)." -msgstr "" +msgstr "Az új világ létrehozásakor érvényes napszak milliórában (0-23999)." #: src/settings_translation_file.cpp msgid "Time send interval" -msgstr "" +msgstr "Idő küldési gyakoriság" #: src/settings_translation_file.cpp 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." #: src/settings_translation_file.cpp msgid "" @@ -6547,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" @@ -6562,7 +7409,20 @@ 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" @@ -6573,7 +7433,6 @@ msgid "Trilinear filtering" msgstr "Trilineáris szűrés" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" @@ -6581,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" @@ -6592,9 +7451,8 @@ msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "A Többjátékos fül alatt megjelenített szerverlista URL-je." #: src/settings_translation_file.cpp -#, fuzzy msgid "Undersampling" -msgstr "Renderelés:" +msgstr "Alulmintavételezés" #: src/settings_translation_file.cpp msgid "" @@ -6604,24 +7462,28 @@ msgid "" "image.\n" "Higher values result in a less detailed image." msgstr "" +"Az alulmintavételezés olyan, mintha kisebb képernyőfelbontást használnál, " +"de\n" +"csak a játék világára van hatással, a GUI-t változatlanul hagyja.\n" +"Sokkal jobb teljesítmény érhető el vele annak árán, hogy a kép kevésbé\n" +"részletgazdaggá válik. Magasabb értékek kevésbé részletes képet " +"eredményeznek." #: src/settings_translation_file.cpp -#, fuzzy msgid "Unlimited player transfer distance" msgstr "Korlátlan játékosátviteli távolság" #: src/settings_translation_file.cpp msgid "Unload unused server data" -msgstr "" +msgstr "A használaton kívüli szerveradatok eltávolítása a memóriából" #: src/settings_translation_file.cpp msgid "Upper Y limit of dungeons." msgstr "A tömlöcök felső Y határa." #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "A tömlöcök felső Y határa." +msgstr "A lebegő földek felső Y határa." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6641,25 +7503,49 @@ msgstr "Bilineáris szűrés a textúrák méretezésekor." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +"Mipmapping használata a textúrák méretezéséhez. Kis mértékben növelheti a\n" +"teljesítményt, különösen nagy felbontású textúracsomagok használatakor.\n" +"Gamma-megőrző zsugorítás nem támogatott." + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Többmintás élsimítás (MSAA) használata a blokkélek simításához.\n" +"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 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." #: src/settings_translation_file.cpp 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 "VBO" +msgid "User Interfaces" msgstr "" +#: src/settings_translation_file.cpp +msgid "VBO" +msgstr "VBO" + #: src/settings_translation_file.cpp msgid "VSync" msgstr "Függőleges szinkron" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley depth" msgstr "Völgyek mélysége" @@ -6668,12 +7554,10 @@ msgid "Valley fill" msgstr "Völgyek kitöltése" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley profile" -msgstr "Völgyek meredeksége" +msgstr "Völgyek profilja" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley slope" msgstr "Völgyek meredeksége" @@ -6683,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 "" +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." @@ -6694,24 +7578,28 @@ msgid "" "Variation of terrain vertical scale.\n" "When noise is < -0.55 terrain is near-flat." msgstr "" +"A terep függőleges kiterjedésének mozgástere.\n" +"Ha a zaj < -0,55, akkor a terep szinte lapos." #: src/settings_translation_file.cpp msgid "Varies depth of biome surface nodes." -msgstr "" +msgstr "A biomok felületét képező kockaréteg mélységét variálja." #: src/settings_translation_file.cpp msgid "" "Varies roughness of terrain.\n" "Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" +"A terep töredezettségét variálja.\n" +"Meghatározza a terrain_base és terrain_alt zajok folytonosságának értékét." #: src/settings_translation_file.cpp msgid "Varies steepness of cliffs." -msgstr "A szirtek meredekségét állítja." +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." @@ -6723,11 +7611,11 @@ msgstr "Videó driver" #: src/settings_translation_file.cpp msgid "View bobbing factor" -msgstr "" +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" @@ -6746,21 +7634,20 @@ msgid "Viewing range" msgstr "Látóterület" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "" +msgid "Virtual joystick triggers Aux1 button" +msgstr "A virtuális joystick működteti az Aux1 gombot" #: src/settings_translation_file.cpp msgid "Volume" msgstr "Hangerő" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" -"Parallax occlusion mapping bekapcsolása.\n" -"A shaderek engedélyezve kell legyenek." +"Az összes hang hangereje.\n" +"A hangrendszer engedélyezésére van szükség hozzá." #: src/settings_translation_file.cpp msgid "" @@ -6770,10 +7657,15 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"A 4D fraktál generált 3D szeletének W koordinátája.\n" +"Meghatározza, hogy a 4D-s alakzat mely 3D-s szeletét kell generálni.\n" +"Megváltoztatja a fraktál alakját.\n" +"Nincs hatása a 3D fraktálokra.\n" +"Nagyjából -2 és 2 közötti az értéktartománya." #: 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" @@ -6781,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" @@ -6793,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" @@ -6817,7 +7709,11 @@ 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" +msgstr "Internetes hivatkozások színe" #: src/settings_translation_file.cpp msgid "" @@ -6825,6 +7721,9 @@ msgid "" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." 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ő kockák textúrára renderelése)." #: src/settings_translation_file.cpp msgid "" @@ -6833,6 +7732,10 @@ msgid "" "to the old scaling method, for video drivers that don't\n" "properly support downloading textures back from hardware." msgstr "" +"Ha a gui_scaling_filter_txr2img be van kapcsolva, ezeket a képeket\n" +"a hardverről a szoftverbe másolja méretezésre. Ha ki van kapcsolva,\n" +"a régi méretezési módszert használja, azoknál a videó drivereknél,\n" +"amelyek nem megfelelően támogatják a textúra hardverről való letöltését." #: src/settings_translation_file.cpp msgid "" @@ -6840,32 +7743,46 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" +"A bilineáris/trilineáris/anizotróp szűrők használatakor, a kis felbontású " +"textúrák\n" +"homályosak lehetnek, ezért automatikusan felskálázza őket legközelebbi\n" +"szomszéd módszerrel, hogy megőrizze az éles pixeleket. Ez a beállítás " +"meghatározza\n" +"a minimális textúraméretet a felnagyított textúrákhoz; magasabb értéknél " +"élesebb,\n" +"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 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." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Használatban vannak-e freetype betűtípusok. Szükséges a beépített freetype " -"támogatás." +"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 kockák textúraanimációinak időzítése az egyes " +"térképblokkokban." #: 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 "" +"Lássák-e a játékosokat a kliensek mindenféle távolsági korlát nélkül.\n" +"Elavult, használd a player_transfer_distance beállítást ehelyett." #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." @@ -6890,6 +7807,19 @@ msgid "" "In-game, you can toggle the mute state with the mute key or by using the\n" "pause menu." msgstr "" +"Némítsuk-e le a hangokat. Bármikor visszakapcsolhatod a hangokat, kivéve,\n" +"ha a hangrendszer le van tiltva (enable_sound=false).\n" +"A játékon belül a némítás állapotát a némítás gombbal vagy a szünet\n" +"menüben tudod beállítani." + +#: 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 "" @@ -6898,12 +7828,13 @@ msgstr "" "A hibakereső információ megjelenítése (ugyanaz a hatás, ha F5-öt nyomunk)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Kezdeti ablak szélessége." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"A kezdőablak szélessége. Teljes képernyős módban nem kerül figyelmbe vételre." #: 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 "" @@ -6912,8 +7843,8 @@ msgid "" "Contains the same information as the file debug.txt (default name)." msgstr "" "Csak Windows rendszeren: Minetest indítása parancssorral a háttérben.\n" -"Ugyanazokat az információkat tartalmazza, mint a debug.txt fájl (" -"alapértelmezett név)." +"Ugyanazokat az információkat tartalmazza, mint a debug.txt fájl " +"(alapértelmezett név)." #: src/settings_translation_file.cpp msgid "" @@ -6924,7 +7855,6 @@ msgstr "" "Ez nem szükséges, ha a főmenüből indítják." #: src/settings_translation_file.cpp -#, fuzzy msgid "World start time" msgstr "Világ-kezdőidő" @@ -6937,10 +7867,18 @@ msgid "" "See also texture_min_size.\n" "Warning: This option is EXPERIMENTAL!" msgstr "" +"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" +"Lásd még texture_min_size.\n" +"Figyelem: Ez KÍSÉRLETI beállítás!" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" -msgstr "" +msgstr "Világhoz igazított textúrakezelési mód" #: src/settings_translation_file.cpp msgid "Y of flat ground." @@ -6951,6 +7889,8 @@ msgid "" "Y of mountain density gradient zero level. Used to shift mountains " "vertically." msgstr "" +"A hegyek sűrűséggradiensének alapsíkjának Y koordinátája. A hegyek " +"függőleges eltolásához használatos." #: src/settings_translation_file.cpp msgid "Y of upper limit of large caves." @@ -6967,6 +7907,12 @@ 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 "" +"Az az Y irányú távolság, amely során a lebegő földek a maximális sűrűségtől " +"kezdve teljesen elvékonyodnak.\n" +"A vékonyítás ennél az Y határtól való távolságnál kezdőik.\n" +"Egybefüggő lebegő föld rétegek esetén, ez a beállítás szabályozza a dombok/" +"hegyek magasságát.\n" +"Kisebbnek vagy egyenlőnek kell lennie az Y határok közötti távolság felénél." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." @@ -6988,93 +7934,37 @@ msgstr "Alacsony terep és tengerfenék Y szintje." 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" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "cURL interaktív időtúllépés" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL párhuzamossági korlát" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL időkorlát" +#~ msgid "- Creative Mode: " +#~ msgstr "- Kreatív mód: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Váltás „mozi” módba" - -#~ msgid "Select Package File:" -#~ msgstr "csomag fájl kiválasztása:" - -#~ msgid "Waving Water" -#~ msgstr "Hullámzó víz" - -#~ msgid "Waving water" -#~ msgstr "Hullámzó víz" - -#~ msgid "This font will be used for certain languages." -#~ msgstr "Ezt a betűtípust bizonyos nyelvek használják." - -#, fuzzy -#~ msgid "Shadow limit" -#~ msgstr "Térképblokk korlát" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "A TrueType betűtípus (ttf) vagy bitmap útvonala." - -#, fuzzy -#~ msgid "Lightness sharpness" -#~ msgstr "Fényélesség" - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "Nagy barlang mélység" - -#~ msgid "IPv6 support." -#~ msgstr "IPv6 támogatás." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Betűtípus árnyék alfa (átlátszatlanság, 0 és 255 között)." - -#, fuzzy -#~ msgid "Floatland mountain height" -#~ msgstr "Lebegő hegyek magassága" - -#, fuzzy -#~ msgid "Floatland base height noise" -#~ msgstr "A lebegő hegyek alapmagassága" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "filmes tónus effektek bekapcsolása" - -#~ msgid "Enable VBO" -#~ msgstr "VBO engedélyez" +#~ msgid "- Damage: " +#~ msgstr "- Sérülés: " #~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "A lebegő szigetek sima területeit határozza meg.\n" -#~ "Lapos szigetek ott fordulnak elő, ahol a zaj értéke pozitív." +#~ "0 = parallax occlusion with slope information (gyorsabb).\n" +#~ "1 = relief mapping (lassabb, pontosabb)." -#~ msgid "Darkness sharpness" -#~ msgstr "a sötétség élessége" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "A járatok szélességét határozza meg, alacsonyabb érték szélesebb " -#~ "járatokat hoz létre." - -#, fuzzy -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "A lebegő szigetek hegységeinek sűrűségét szabályozza.\n" -#~ "Az \"np_mountain\" zaj értékéhez hozzáadott eltolás." +#~ msgid "Address / Port" +#~ msgstr "Cím / Port" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7085,14 +7975,358 @@ msgstr "cURL időkorlát" #~ "fényerő.\n" #~ "Ez a beállítás csak a kliensre érvényes, a szerver nem veszi figyelembe." -#~ msgid "Path to save screenshots at." -#~ msgstr "Képernyőmentések mappája." - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "$1 letöltése és telepítése, kérlek várj…" +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Biztosan visszaállítod az egyjátékos világod?" #~ 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." + +#~ msgid "Bump Mapping" +#~ msgstr "Bump mapping" + +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmappolás" + +#, fuzzy +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Megváltoztatja a főmenü felhasználói felületét:\n" +#~ "- Teljes: Több egyjátékos világ, játékválasztás, textúracsomag-választó " +#~ "stb.\n" +#~ "- Egyszerű: Egy egyjátékos világ, nincs játék- vagy textúracsomag-" +#~ "választó.\n" +#~ "Szükséges lehet a kisebb képernyőkhöz." + +#~ msgid "Config mods" +#~ msgstr "Modok beállítása" + +#~ 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" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "A lebegő szigetek hegységeinek sűrűségét szabályozza.\n" +#~ "Az \"np_mountain\" zaj értékéhez hozzáadott eltolás." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "A járatok szélességét határozza meg, alacsonyabb érték szélesebb " +#~ "járatokat hoz létre." + +#~ msgid "Credits" +#~ msgstr "Köszönetnyilvánítás" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Célkereszt színe (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Sérülés engedélyezve" + +#~ msgid "Darkness sharpness" +#~ msgstr "a sötétség élessége" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "A cURL alapértelmezett időkorlátja ezredmásodpercekben.\n" +#~ "Csak akkor van hatása, ha a program cURL-lel lett lefordítva." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "A lebegő szigetek sima területeit határozza meg.\n" +#~ "Lapos szigetek ott fordulnak elő, ahol a zaj értéke pozitív." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "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" + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "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." +#~ msgstr "" +#~ "Kísérleti opció, látható rések jelenhetnek meg a blokkok között\n" +#~ "ha nagyobbra van állítva, mint 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS a szünet menüben" + +#~ msgid "Fallback font shadow" +#~ msgstr "Tartalék betűtípus árnyéka" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Tartalék betűtípus árnyék átlátszósága" + +#~ 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" + +#, fuzzy +#~ msgid "Floatland mountain height" +#~ msgstr "Lebegő hegyek magassága" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Betűtípus árnyék alfa (átlátszatlanság, 0 és 255 között)." + +#~ msgid "FreeType fonts" +#~ msgstr "FreeType betűtípusok" + +#~ msgid "Full screen BPP" +#~ msgstr "Teljes képernyő BPP" + +#~ msgid "Game" +#~ msgstr "Játék" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Normál felületek generálása" + +#~ 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" + +#, fuzzy +#~ msgid "Lightness sharpness" +#~ msgstr "Fényélesség" + +#~ msgid "Main" +#~ msgstr "Fő" + +#~ msgid "Main menu style" +#~ msgstr "Főmenü stílusa" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Kistérkép radar módban x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Kistérkép terület módban x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Kistérkép terület módban x4" + +#~ msgid "Name / Password" +#~ msgstr "Név / Jelszó" + +#~ msgid "Name/Password" +#~ msgstr "Név/jelszó" + +#~ msgid "No" +#~ msgstr "Nem" + #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax Occlusion ( domború textúra )" + +#~ msgid "Parallax occlusion" +#~ msgstr "Parallax Occlusion effekt" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Parallax Occlusion módja" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Parallax Occlusion mértéke" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "A TrueType betűtípus (ttf) vagy bitmap útvonala." + +#~ 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" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Egyjátékos világ visszaállítása" + +#~ 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" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Tartalék betűtípus árnyékának eltolása. Ha 0, akkor nem lesz árnyék " +#~ "rajzolva." + +#~ msgid "Special" +#~ msgstr "Különleges" + +#~ msgid "Special key" +#~ msgstr "Különleges gomb" + +#~ msgid "Start Singleplayer" +#~ msgstr "Egyjátékos mód indítása" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Generált normálfelületek erőssége." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Ezt a betűtípust bizonyos nyelvek használják." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Az árnyalók engedélyezéséhez OpenGL driver használata szükséges." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Váltás „mozi” módba" + +#~ msgid "View" +#~ msgstr "Megtekintés" + +#~ msgid "Waving Water" +#~ msgstr "Hullámzó víz" + +#~ msgid "Waving water" +#~ msgstr "Hullámzó víz" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Használhatók-e FreeType betűtípusok. Szükséges a beépített FreeType " +#~ "támogatás.\n" +#~ "Ha ki van kapcsolva, bittérképes és XML vektoros betűtípusok lesznek " +#~ "használva helyette." + +#~ 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." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/id/minetest.po b/po/id/minetest.po index 21fd705bb..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: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-25 16:39+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,43 @@ 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.2-dev\n" +"X-Generator: Weblate 4.11-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Bersihkan antrean obrolan keluar" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Perintah kosong." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Kembali ke menu utama" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Perintah tidak sah " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Perintah yang dikeluarkan: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Daftar pemain daring" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Pemain daring: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Antran obrolan keluar sudah dibersihkan." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Perintah ini dinonaktifkan oleh server." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -23,10 +58,41 @@ msgstr "Bangkit kembali" msgid "You died" msgstr "Anda mati" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Perintah yang ada:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Perintah yang ada: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Perintah tidak tersedia: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Dapatkan bantuan untuk perintah-perintah" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Pakai '.help <cmd>' untuk mendapatkan informasi lanjut atau '.help all' " +"untuk menampilkan semuanya." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[semua | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "Oke" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<tiada yang tersedia>" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Suatu galat terjadi pada suatu skrip Lua:" @@ -47,9 +113,30 @@ msgstr "Sambung ulang" msgid "The server has requested a reconnect:" msgstr "Server ini meminta untuk menyambung ulang:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Memuat..." +#: 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. " @@ -64,9 +151,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Server mendukung protokol antara versi $1 dan versi $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Coba nyalakan ulang daftar server publik dan periksa sambungan internet Anda." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +162,26 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Dependensi:" @@ -159,14 +254,54 @@ msgstr "Dunia:" msgid "enabled" msgstr "dinyalakan" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" telah ada. Apakah Anda mau menimpanya?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Dependensi $1 dan $2 akan dipasang." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 oleh $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 sedang diunduh,\n" +"$2 dalam antrean" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 mengunduh..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 membutuhkan dependensi yang tidak bisa ditemukan." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 akan dipasang dan $2 dependensi akan dilewati." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Semua paket" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Telah terpasang" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Kembali ke menu utama" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Permainan Dasar:" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "ContentDB tidak tersedia ketika Minetest tidak dikompilasi dengan cURL" @@ -180,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" @@ -189,7 +323,18 @@ msgid "Install" msgstr "Pasang" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Pasang $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Pasang dependensi yang belum ada" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Pemasangan: Tipe berkas tidak didukung atau arsip rusak" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mod" @@ -202,9 +347,24 @@ msgid "No results" msgstr "Tiada hasil" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Cari" +msgid "No updates" +msgstr "Tiada pembaruan" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Tidak ditemukan" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Timpa" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Harap pastikan bahwa permainan dasar telah sesuai." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Diantrekan" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -219,8 +379,12 @@ msgid "Update" msgstr "Perbarui" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Tinjau" +msgid "Update All [$1]" +msgstr "Perbarui Semua [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Lihat informasi lebih lanjut di peramban web" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -263,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" @@ -284,11 +445,7 @@ msgstr "Tanah mengambang di langit" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "Floatland (uji coba)" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Permainan" +msgstr "Floatland (tahap percobaan)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" @@ -306,6 +463,15 @@ msgstr "Sungai lembap" 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" @@ -407,10 +573,6 @@ msgstr "Variasi kedalaman sungai" 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" @@ -441,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" @@ -474,6 +669,16 @@ 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" @@ -498,8 +703,8 @@ msgid "Offset" msgstr "Pergeseran" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" -msgstr "Persistensi" +msgid "Persistence" +msgstr "Kegigihan" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." @@ -517,6 +722,10 @@ msgstr "Atur ke bawaan" msgid "Scale" msgstr "Skala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Cari" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Pilih direktori" @@ -525,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" @@ -606,14 +815,6 @@ msgstr "" "Pemasangan mod: Tidak dapat mencari nama folder yang sesuai untuk paket mod " "$1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Pemasangan: Tipe berkas \"$1\" tidak didukung atau arsip rusak" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Pemasangan: berkas: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Tidak dapat mencari mod atau paket mod yang sah" @@ -634,6 +835,60 @@ msgstr "Gagal memasang mod sebagai $1" msgid "Unable to install a modpack as a $1" msgstr "Gagal memasang paket mod sebagai $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Memuat..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Daftar server publik dimatikan" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Coba nyalakan ulang daftar server publik dan periksa sambungan internet Anda." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Tentang" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Penyumbang Aktif" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Penggambar aktif:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Pengembang Inti" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Pilih direktori" + +#: 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 "" +"Membuka direktori yang berisi dunia, permainan, mod, dan paket tekstur\n" +"dari pengguna dalam pengelola/penjelajah berkas." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Penyumbang Sebelumnya" + +#: builtin/mainmenu/tab_about.lua +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" @@ -674,26 +929,6 @@ msgstr "Copot paket" msgid "Use Texture Pack" msgstr "Gunakan paket tekstur" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Penyumbang Aktif" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Pengembang Inti" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Penghargaan" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Penyumbang Sebelumnya" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Pengembang Inti Sebelumnya" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Umumkan Server" @@ -703,14 +938,10 @@ msgid "Bind Address" msgstr "Alamat Sambungan" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigurasi" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Mode Kreatif" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Nyalakan Kerusakan" @@ -726,10 +957,6 @@ msgstr "Host Server" msgid "Install games from ContentDB" msgstr "Pasang permainan dari ContentDB" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nama/Kata Sandi" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Baru" @@ -742,10 +969,14 @@ msgstr "Tiada dunia yang dibuat atau dipilih!" msgid "Play Game" msgstr "Mainkan Permainan" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Porta" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Pilih Mod" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Pilih Dunia:" @@ -759,45 +990,62 @@ msgid "Start Game" msgstr "Mulai Permainan" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Alamat/Porta" +msgid "Address" +msgstr "Alamat" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Sambung" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Clear" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Mode kreatif" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Kerusakan dinyalakan" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Kerusakan/PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Hapus favorit" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "Favorit" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Server Tidak Kompatibel" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Gabung Permainan" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nama/Kata Sandi" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP dinyalakan" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Server Publik" + +#: builtin/mainmenu/tab_online.lua +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" @@ -823,10 +1071,6 @@ msgstr "Semua Pengaturan" msgid "Antialiasing:" msgstr "Antialiasing:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Apakah Anda yakin ingin mengatur ulang dunia Anda?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Simpan Ukuran Layar" @@ -835,10 +1079,6 @@ msgstr "Simpan Ukuran Layar" msgid "Bilinear Filter" msgstr "Filter Bilinear" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bump Mapping" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Ubah Tombol" @@ -847,13 +1087,30 @@ msgstr "Ubah Tombol" msgid "Connected Glass" msgstr "Kaca Tersambung" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Bayangan dinamis" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Bayangan dinamis: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Daun Megah" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Buat Normal Maps" +msgid "High" +msgstr "Tinggi" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Rendah" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Menengah" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -863,10 +1120,6 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Filter Aniso. + Mipmap" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Tidak" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Tanpa Filter" @@ -885,7 +1138,7 @@ msgstr "Garis Bentuk Nodus" #: builtin/mainmenu/tab_settings.lua msgid "None" -msgstr "Tidak ada" +msgstr "Tidak Ada" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" @@ -895,18 +1148,10 @@ msgstr "Daun Opak" msgid "Opaque Water" msgstr "Air Opak" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax Occlusion" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partikel" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Atur ulang dunia pemain tunggal" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Layar:" @@ -919,6 +1164,10 @@ msgstr "Pengaturan" msgid "Shaders" msgstr "Shader" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shader (tahap percobaan)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Shader (tidak tersedia)" @@ -935,22 +1184,28 @@ msgstr "Pencahayaan Halus" msgid "Texturing:" msgstr "Peneksturan:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Untuk menggunakan shader, pengandar OpenGL harus digunakan." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" -msgstr "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 msgid "Trilinear Filter" msgstr "Filter Trilinear" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Ultratinggi" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Sangat Rendah" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Daun Melambai" @@ -963,23 +1218,12 @@ msgstr "Air Berombak" msgid "Waving Plants" msgstr "Tanaman Berayun" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ya" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Konfigurasi mod" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Beranda" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Mulai Pemain Tunggal" - #: 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." @@ -1008,8 +1252,8 @@ msgid "Connection error (timed out?)" msgstr "Galat sambungan (terlalu lama?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Tidak dapat mencari atau memuat permainan \"" +msgid "Could not find or load game: " +msgstr "Tidak dapat mencari atau memuat permainan: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1039,18 +1283,6 @@ msgstr "Berkas kata sandi yang diberikan gagal dibuka: " msgid "Provided world path doesn't exist: " msgstr "Jalur dunia yang diberikan tidak ada: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1063,14 +1295,6 @@ msgstr "" msgid "- Address: " msgstr "- Alamat: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Mode Kreatif: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Kerusakan: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Mode: " @@ -1092,6 +1316,15 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "- Nama Server: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Sebuah galat serialisasi terjadi:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Akses ditolak. Alasan: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Maju otomatis dimatikan" @@ -1100,6 +1333,22 @@ msgstr "Maju otomatis dimatikan" msgid "Automatic forward enabled" msgstr "Maju otomatis dinyalakan" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Batasan blok disembunyikan" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Batasan blok ditampilkan untuk semua blok" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Batasan blok ditampilkan untuk blok saat ini" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Batasan blok ditampilkan untuk blok sekitar" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Pembaruan kamera dimatikan" @@ -1108,9 +1357,14 @@ msgstr "Pembaruan kamera dimatikan" msgid "Camera update enabled" msgstr "Pembaruan kamera dinyalakan" +#: src/client/game.cpp +#, 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 msgid "Change Password" -msgstr "Ganti kata sandi" +msgstr "Ganti Kata Sandi" #: src/client/game.cpp msgid "Cinematic mode disabled" @@ -1120,6 +1374,10 @@ msgstr "Mode sinema dimatikan" msgid "Cinematic mode enabled" msgstr "Mode sinema dinyalakan" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Klien terputus" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Skrip sisi klien dimatikan" @@ -1128,6 +1386,10 @@ msgstr "Skrip sisi klien dimatikan" msgid "Connecting to server..." msgstr "Menyambung ke server..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Sambungan gagal karena sebab yang tak diketahui" + #: src/client/game.cpp msgid "Continue" msgstr "Lanjutkan" @@ -1140,13 +1402,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1156,15 +1418,20 @@ msgstr "" "- %s: geser kiri\n" "- %s: geser kanan\n" "- %s: lompat/panjat\n" +"- %s: gali/pukul\n" +"- %s: taruh/pakai\n" "- %s: menyelinap/turun\n" "- %s: jatuhkan barang\n" "- %s: inventaris\n" "- Tetikus: belok/lihat\n" -"- Klik kiri: gali/pukul\n" -"- Klik kanan: taruh/pakai\n" "- Roda tetikus: pilih barang\n" "- %s: obrolan\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Tidak bisa menyelesaikan alamat: %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "Membuat klien..." @@ -1221,6 +1488,11 @@ msgstr "Matikan jarak pandang tak terbatas" 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" @@ -1294,32 +1566,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Peta mini sedang dilarang oleh permainan atau mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Peta mini disembunyikan" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Peta mini mode radar, perbesaran 1x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Peta mini mode radar, perbesaran 2x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Peta mini mode radar, perbesaran 4x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Peta mini mode permukaan, perbesaran 1x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Peta mini mode permukaan, perbesaran 2x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Peta mini mode permukaan, perbesaran 4x" +msgid "Multiplayer" +msgstr "Multipemain" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1393,6 +1641,21 @@ msgstr "Sistem suara tidak didukung dalam buatan ini" msgid "Sound unmuted" msgstr "Suara dibunyikan" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Server ini mungkin menjalankan versi %s yang berbeda." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Tidak bisa menyambung ke %s karena IPv6 dimatikan" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Tidak bisa mendengarkan %s karena IPv6 dimatikan" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1462,10 +1725,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Clear" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1488,7 +1747,7 @@ msgstr "Execute" #: src/client/keycode.cpp msgid "Help" -msgstr "Help" +msgstr "Bantuan" #: src/client/keycode.cpp msgid "Home" @@ -1713,36 +1972,39 @@ msgstr "Tombol X 2" msgid "Zoom" msgstr "Zum" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Kata sandi tidak cocok!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Peta mini disembunyikan" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Daftar dan Gabung" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Peta mini mode radar, perbesaran %dx" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Peta mini mode permukaan, perbesaran %dx" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Peta mini mode tekstur" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Gagal membuka laman web" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Membuka laman web" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Lanjut" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Spesial\" = turun" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = turun" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1752,15 +2014,23 @@ msgstr "Maju otomatis" msgid "Automatic jumping" msgstr "Lompat otomatis" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Mundur" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Batasan blok" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Ubah kamera" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Obrolan" @@ -1813,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" @@ -1846,10 +2114,6 @@ msgstr "Tangkapan layar" msgid "Sneak" msgstr "Menyelinap" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Spesial" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Alih HUD" @@ -1890,10 +2154,6 @@ msgstr "tekan tombol" 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" @@ -1902,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" @@ -1911,14 +2175,9 @@ msgid "Muted" msgstr "Dibisukan" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Volume Suara: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Masuk " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Volume Suara: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1927,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" @@ -1937,12 +2206,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Gunakan joystick virtual untuk mengetuk tombol \"aux\".\n" -"Jika dinyalakan, joystick virtual juga akan mengetuk tombol \"aux\" saat " +"(Android) Gunakan joystick virtual untuk mengetuk tombol \"Aux1\".\n" +"Jika dinyalakan, joystick virtual juga akan mengetuk tombol \"Aux1\" saat " "berada di luar lingkaran utama." #: src/settings_translation_file.cpp @@ -1983,14 +2252,6 @@ msgstr "" "Nilai bawaannya untuk bentuk pipih vertikal yang cocok\n" "untuk pulau, atur ketiga angka menjadi sama untuk bentuk mentah." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax occlusion dengan informasi kemiringan (cepat).\n" -"1 = relief mapping (pelan, lebih akurat)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "Noise 2D yang mengatur bentuk/ukuran punggung gunung." @@ -2096,6 +2357,10 @@ msgstr "" "- pageflip: 3d dengan quadbuffer.\n" "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" @@ -2117,6 +2382,10 @@ msgstr "" msgid "ABM interval" msgstr "Selang waktu ABM" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "Anggaran waktu ABM" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "Batas mutlak antrean kemunculan blok" @@ -2167,6 +2436,12 @@ msgstr "" "Atur konfigurasi dpi ke layar Anda (selain X11/Android saja) misalnya untuk " "layar 4K." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Menyesuaikan kepadatan tampilan yang dideteksi, dipakai untuk mengatur skala " +"elemen UI." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2178,10 +2453,15 @@ msgid "" msgstr "" "Sesuaikan kepadatan lapisan floatland.\n" "Tambahkan nilai untuk menambah kepadatan. Dapat positif atau negatif.\n" -"Nilai = 0.0: 50% volume adalah floatland.\n" +"Nilai = 0.0: 50% o volume adalah floatland.\n" "Nilai = 2.0 (dapat lebih tinggi tergantung 'mgv7_np_floatland', selalu uji\n" "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" @@ -2201,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 @@ -2279,6 +2560,10 @@ msgstr "" "optimasi ini.\n" "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" @@ -2299,6 +2584,14 @@ msgstr "Simpan ukuran layar" msgid "Autoscaling mode" msgstr "Mode penyekalaan otomatis" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Tombol Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Tombol Aux1 untuk memanjat/turun" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tombol mundur" @@ -2311,10 +2604,6 @@ msgstr "Ketinggian dasar tanah" 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" @@ -2336,21 +2625,22 @@ 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 msgid "Biome noise" msgstr "Noise bioma" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bit per piksel (alias kedalaman warna) dalam mode layar penuh." - #: src/settings_translation_file.cpp 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" @@ -2376,8 +2666,9 @@ msgid "Builtin" msgstr "Terpasang bawaan" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bumpmapping" +#, fuzzy +msgid "Camera" +msgstr "Ubah kamera" #: src/settings_translation_file.cpp msgid "" @@ -2456,18 +2747,12 @@ msgstr "" "Nilai 0.0 adalah minimum, 1.0 adalah maksimum." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Mengubah antarmuka menu utama:\n" -"- Full: Banyak dunia pemain tunggal, pilih permainan, paket tekstur, dll.\n" -"- Simple: Satu dunia pemain tunggal, tanpa pilihan permainan atau paket\n" -"tekstur. Cocok untuk layar kecil." +msgid "Chat command time message threshold" +msgstr "Ambang batas waktu pesan perintah obrolan" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Perintah obrolan" #: src/settings_translation_file.cpp msgid "Chat font size" @@ -2502,8 +2787,8 @@ msgid "Chat toggle key" msgstr "Tombol beralih obrolan" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Perintah obrolan" +msgid "Chat weblinks" +msgstr "Tautan web obrolan" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2521,6 +2806,14 @@ msgstr "Tombol mode sinema" msgid "Clean transparent textures" msgstr "Bersihkan tekstur transparan" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Tautan web yang bisa diklik (klik-tengah atau Ctrl+klik-kiri) dibolehkan " +"dalam konsol obrolan." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Klien" @@ -2541,6 +2834,11 @@ msgstr "Pembatasan mod sisi klien" 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" @@ -2565,6 +2863,10 @@ msgstr "Awan dalam menu" msgid "Colored fog" msgstr "Kabut berwarna" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Bayangan berwarna" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2590,8 +2892,8 @@ msgid "" "allow them to upload and download data to/from the internet." msgstr "" "Daftar yang dipisahkan dengan koma dari mod yang dibolehkan untuk\n" -"mengakses HTTP API, membolehkan mereka untuk mengunggah dan\n" -"mengunduh data ke/dari internet." +"mengakses HTTP API, membolehkan mereka untuk mengunggah dan mengunduh data " +"ke/dari internet." #: src/settings_translation_file.cpp msgid "" @@ -2599,13 +2901,37 @@ msgid "" "functions even when mod security is on (via request_insecure_environment())." msgstr "" "Daftar yang dengan dipisahkan koma dari mod terpercaya yang diperbolehkan\n" -"untuk mengakses fungsi yang tidak aman bahkan ketika mod security aktif\n" +"untuk mengakses fungsi yang tidak aman bahkan ketika mod security aktif " "(melalui request_insecure_environment())." #: src/settings_translation_file.cpp msgid "Command key" msgstr "Tombol perintah" +#: src/settings_translation_file.cpp +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 "" +"Tingkat kompresi saat menyimpan blok peta ke diska.\n" +"-1 - tingkat kompresi bawaan\n" +"0 - kompresi sedikit, tercepat\n" +"9 - kompresi terbaik, terlambat" + +#: src/settings_translation_file.cpp +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 "" +"Tingkat kompresi saat mengirimkan blok peta kepada klien.\n" +"-1 - tingkat kompresi bawaan\n" +"0 - kompresi sedikit, tercepat\n" +"9 - kompresi terbaik, terlambat" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Sambungkan kaca" @@ -2630,10 +2956,19 @@ msgstr "Warna konsol" 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" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Jumlah Maks Pengunduhan ContentDB Bersamaan" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "URL ContentDB" @@ -2666,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." @@ -2700,16 +3037,24 @@ msgid "Crosshair alpha" msgstr "Keburaman crosshair" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Keburaman crosshair (keopakan, dari 0 sampai 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Keburaman crosshair (keopakan, dari 0 sampai 255).\n" +"Juga mengatur warna crosshair objek." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Warna crosshair" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Warna crosshair: (merah,hijau,biru) atau (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Warna crosshair (R,G,B),\n" +"sekaligus mengatur warna crosshair objek" #: src/settings_translation_file.cpp msgid "DPI" @@ -2732,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" @@ -2777,11 +3122,13 @@ msgstr "Ukuran tumpukan bawaan" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Batas waktu bawaan untuk cURL, dalam milidetik.\n" -"Hanya berlaku jika dikompilasi dengan cURL." +"Mengatur kualitas filter bayangan.\n" +"Ini menyimulasikan efek bayangan halus dengan menerapkan PCF atau\n" +"diska Poisson, tetapi menggunakan sumber daya lebih banyak." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2812,14 +3159,6 @@ msgstr "Menetapkan struktur kanal sungai skala besar." msgid "Defines location and terrain of optional hills and lakes." msgstr "Menetapkan lokasi dan medan dari danau dan bukit pilihan." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Menentukan langkah penyampelan tekstur.\n" -"Nilai lebih tinggi menghasilkan peta lebih halus." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Mengatur ketinggian dasar tanah." @@ -2898,6 +3237,15 @@ msgstr "" 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" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Partikel menggali" @@ -2910,6 +3258,16 @@ msgstr "Matikan anticurang" msgid "Disallow empty passwords" msgstr "Larang kata sandi kosong" +#: src/settings_translation_file.cpp +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." @@ -2958,18 +3316,42 @@ msgstr "" "Gunakan dukungan Lua modding pada klien.\n" "Dukungan ini masih tahap percobaan dan API dapat berubah." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Menyalakan filter diska Poisson.\n" +"Nilai true berarti memakai diska Poisson untuk \"bayangan halus\". Nilai " +"lain berarti\n" +"memakai filter PCF." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Menyalakan bayangan berwarna.\n" +"Nilai true berarti nodus agak tembus pandang memiliki bayangan berwarna.\n" +"Ini sangat membutuhkan sumber daya besar." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Gunakan jendela konsol" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Gunakan mode kreatif pada peta baru." +msgid "Enable creative mode for all players" +msgstr "Nyalakan mode kreatif untuk semua pemain" #: src/settings_translation_file.cpp 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." @@ -2986,18 +3368,6 @@ msgstr "Membolehkan pemain terkena kerusakan dan mati." 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" @@ -3006,6 +3376,10 @@ msgstr "" "Gunakan pencahayaan halus dengan ambient occlusion sederhana.\n" "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" @@ -3072,17 +3446,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Jalankan animasi barang inventaris." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Gunakan bumpmapping untuk tekstur. Normalmap harus disediakan oleh paket\n" -"tekstur atau harus dihasilkan otomatis.\n" -"Membutuhkan penggunaan shader." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Gunakan tembolok untuk facedir mesh yang diputar." @@ -3091,22 +3454,6 @@ msgstr "Gunakan tembolok untuk facedir mesh yang diputar." msgid "Enables minimap." msgstr "Gunakan peta mini." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Buat normalmap secara langsung (efek Emboss).\n" -"Membutuhkan penggunaan bumpmapping." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Gunakan pemetaan parallax occlusion.\n" -"Membutuhkan penggunaan shader." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3119,6 +3466,20 @@ msgstr "" "akan tidak berfungsi.\n" "Perubahan pengaturan ini membutuhkan mulai ulang." +#: 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 "" +"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" msgstr "Jarak pencetakan data profiling mesin" @@ -3127,14 +3488,6 @@ msgstr "Jarak pencetakan data profiling mesin" msgid "Entity methods" msgstr "Metode benda (entity)" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Masih tahap percobaan, dapat menyebabkan terlihatnya spasi antarblok\n" -"saat diatur dengan angka yang lebih besar dari 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3152,8 +3505,12 @@ msgstr "" "yang rata dan cocok untuk lapisan floatland padat (penuh)." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS (bingkai per detik) pada menu jeda" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS (bingkai per detik) saat dijeda atau tidak difokuskan" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3171,18 +3528,6 @@ msgstr "Faktor fall bobbing" msgid "Fallback font path" msgstr "Jalur fon cadangan" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Bayangan fon cadangan" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Keburaman bayangan fon cadangan" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Ukuran fon cadangan" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Tombol gerak cepat" @@ -3201,10 +3546,10 @@ msgstr "Gerak cepat" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Gerak cepat (lewat tombol \"spesial\").\n" +"Gerak cepat (lewat tombol \"Aux1\").\n" "Membutuhkan hak \"fast\" pada server." #: src/settings_translation_file.cpp @@ -3239,18 +3584,21 @@ msgstr "Pemetaan suasana filmis" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Tekstur yang difilter dapat memadukan nilai RGB dengan tetangganya yang\n" "sepenuhnya transparan, yang biasanya diabaikan oleh pengoptimal PNG,\n" "terkadang menghasilkan tepi gelap atau terang pada tekstur transparan. \n" -"Terapkan filter ini untuk membersihkannya ketika memuat tekstur." +"Terapkan filter ini untuk membersihkannya ketika memuat tekstur. Ini " +"dinyalakan\n" +"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." @@ -3316,6 +3664,11 @@ msgstr "Mulai kabut" 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" @@ -3337,16 +3690,16 @@ msgid "Font size" msgstr "Ukuran fon" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "Ukuran fon bawaan dalam poin (pt)." +msgid "Font size divisible by" +msgstr "Ukuran fon dapat dibagi dengan" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Ukuran fon cadangan bawaan dalam poin (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Ukuran fon bawaan dalam dimana 1 unit = 1 pixel di 96 DPI" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "Ukuran fon monospace bawaan dalam poin (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Ukuran fon monospace bawaan dimana 1 unit = 1 pixel di 96 DPI" #: src/settings_translation_file.cpp msgid "" @@ -3356,6 +3709,24 @@ msgstr "" "Ukuran fon teks obrolan terkini dan prompt obrolan dalam poin (pt).\n" "Nilai 0 akan memakai ukuran bawaan." +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"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 "" "Format of player chat messages. The following strings are valid " @@ -3417,10 +3788,6 @@ msgstr "Jenis fraktal" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Bagian dari jarak pandang tempat kabut mulai tampak" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Fon FreeType" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3453,10 +3820,6 @@ msgstr "" msgid "Full screen" msgstr "Layar penuh" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "BPP layar penuh" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Mode layar penuh." @@ -3474,8 +3837,17 @@ msgid "GUI scaling filter txr2img" msgstr "Filter txr2img skala GUI" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Buat normalmap" +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" @@ -3485,12 +3857,12 @@ msgstr "Callback global" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Atribut pembuatan peta global.\n" -"Dalam pembuat peta v6, flag \"decorations\" mengatur semua hiasan kecuali\n" -"pohon dan rumput rimba. Dalam pembuat peta lain, flag ini mengatur\n" -"semua dekorasi." +"Dalam pembuat peta v6, flag \"decorations\" mengatur semua hiasan, kecuali\n" +"pohon dan rumput rimba. Dalam pembuat peta lain, flag ini mengatur semua " +"dekorasi." #: src/settings_translation_file.cpp msgid "" @@ -3512,6 +3884,16 @@ msgstr "" 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" @@ -3529,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" @@ -3539,12 +3926,12 @@ msgstr "Tombol beralih HUD" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Penanganan panggilan Lua API usang:\n" -"- legacy: (mencoba untuk) menyerupai aturan lawas (bawaan untuk rilis).\n" +"- none: jangan catat panggilan usang\n" "- log: menyerupai dan mencatat asal-usul panggilan usang (bawaan untuk " "awakutu).\n" "- error: batalkan penggunaan panggilan usang (disarankan untuk pengembang " @@ -3572,8 +3959,9 @@ msgid "Heat noise" msgstr "Noise panas" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Tinggi ukuran jendela mula-mula." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "Tinggi ukuran jendela mula-mula. Ini diabaikan dalam mode layar penuh." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3583,10 +3971,6 @@ msgstr "Noise ketinggian" msgid "Height select noise" msgstr "Noise pemilihan ketinggian" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "FPU (satuan titik mengambang) berketelitian tinggi" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Kecuraman bukit" @@ -3790,14 +4174,23 @@ 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 " "dipakai.\n" "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." @@ -3827,17 +4220,15 @@ msgid "" "If FPS would go higher than this, limit it by sleeping\n" "to not waste CPU power for no benefit." msgstr "" -"Jika FPS (bingkai per detik) lebih tinggi dari ini, akan\n" -"dibatasi dengan jeda agar tidak menghabiskan tenaga\n" -"CPU dengan percuma." +"Jika FPS (bingkai per detik) lebih tinggi daripada ini, akan dibatasi\n" +"dengan jeda agar tidak membuang tenaga CPU dengan percuma." #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Jika dimatikan, tombol \"spesial\" digunakan untuk terbang cepat jika mode\n" +"Jika dimatikan, tombol \"Aux1\" digunakan untuk terbang cepat jika mode\n" "terbang dan cepat dinyalakan." #: src/settings_translation_file.cpp @@ -3865,14 +4256,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Jika dinyalakan, tombol \"spesial\" digunakan untuk bergerak turun alih-" -"alih\n" +"Jika dinyalakan, tombol \"Aux1\" digunakan untuk bergerak turun alih-alih\n" "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" @@ -3903,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." @@ -3915,8 +4317,8 @@ msgid "" msgstr "" "Jika dinyalakan, Anda dapat menaruh blok pada posisi (kaki + ketinggian " "mata)\n" -"tempat Anda berdiri.\n" -"Ini berguna saat bekerja dengan kotak nodus (nodebox) dalam daerah sempit." +"tempat Anda berdiri. Ini berguna saat bekerja dengan kotak nodus (nodebox) " +"dalam daerah sempit." #: src/settings_translation_file.cpp msgid "" @@ -3927,6 +4329,14 @@ msgstr "" "Jika pembatasan CSM untuk jangkauan nodus dinyalakan, panggilan\n" "get_node dibatasi hingga sejauh ini dari pemain ke nodus." +#: 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 "" +"Jika pelaksanaan perintah obrolan lebih lama daripada ini (dalam detik),\n" +"tambahkan informasi waktu ke pesan perintah obrolan" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3948,10 +4358,6 @@ msgstr "Jika diatur, pemain akan bangkit (ulang) pada posisi yang diberikan." 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 "" @@ -3983,16 +4389,15 @@ msgstr "" "Ini biasanya hanya dibutuhkan oleh kontributor inti/bawaan" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "Melengkapi perintah obrolan saat didaftarkan, dengan perkakas." +msgid "Instrument chat commands on registration." +msgstr "Perkakas perintah obrolan saat pendaftaran." #: src/settings_translation_file.cpp msgid "" "Instrument global callback functions on registration.\n" "(anything you pass to a minetest.register_*() function)" msgstr "" -"Melengkapi fungsi panggil balik (callback) global saat didaftarkan,\n" -"dengan perkakas.\n" +"Melengkapi fungsi panggil balik (callback) global saat didaftarkan.\n" "(semua yang dimasukkan ke fungsi minetest.register_*())" #: src/settings_translation_file.cpp @@ -4013,16 +4418,13 @@ msgstr "" 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 @@ -4067,8 +4469,7 @@ msgstr "" "Perulangan fungsi rekursif.\n" "Menaikkan nilai ini menaikkan detail, tetapi juga menambah\n" "beban pemrosesan.\n" -"Saat perulangan = 20, pembuat peta ini memiliki beban yang\n" -"mirip dengan pembuat peta v7." +"Saat perulangan = 20, beban pembuat peta ini mirip dengan v7." #: src/settings_translation_file.cpp msgid "Joystick ID" @@ -4078,6 +4479,10 @@ msgstr "ID Joystick" msgid "Joystick button repetition interval" msgstr "Jarak penekanan tombol joystick terus-menerus" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Zona mati joystick" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Kepekaan ruang gerak joystick" @@ -4180,6 +4585,16 @@ msgstr "" "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk gali.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4322,6 +4737,16 @@ msgstr "" "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tombol untuk taruh.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4856,6 +5281,10 @@ msgstr "" "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." "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." @@ -4914,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" @@ -4932,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" @@ -4952,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" @@ -4987,6 +5425,11 @@ msgstr "Titik tinggi gradasi kurva cahaya" 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" @@ -5070,10 +5513,6 @@ msgstr "Batas bawah Y floatland." msgid "Main menu script" msgstr "Skrip menu utama" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Gaya menu utama" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5081,14 +5520,18 @@ msgstr "" "Buat warna kabut dan langit tergantung pada waktu (fajar/maghrib) dan arah " "pandangan." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "Buat DirectX bekerja dengan LuaJIT. Matikan jika bermasalah." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Buat semua cairan buram" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Tingkat Kompresi Peta untuk Penyimpanan Diska" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Tingkat Kompresi Peta untuk Transfer Jaringan" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Direktori peta" @@ -5167,6 +5610,10 @@ msgstr "Batas pembuatan peta" msgid "Map save interval" msgstr "Selang waktu menyimpan peta" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Bingkai pembaruan peta bayangan" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Batas blok peta" @@ -5272,8 +5719,14 @@ msgid "Maximum FPS" msgstr "FPS (bingkai per detik) maksimum" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "FPS (bingkai per detik) maksimum saat permainan dijeda." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"FPS (bingkai per detik) maksimum saat permainan dijeda atau saat jendela " +"tidak difokuskan." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Jarak maksimum untuk menggambar bayangan." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5329,6 +5782,16 @@ msgstr "" "Jumlah maksimum blok yang akan diantrekan untuk dimuat dari berkas.\n" "Batasan ini diatur per pemain." +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Jumlah maksimum pengunduhan bersamaan. Pengunduhan yang melebihi batas ini " +"akan\n" +"diantrekan. Nilai ini harus lebih rendah daripada curl_parallel_limit." + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "Jumlah maksimum blok peta yang dipaksa muat." @@ -5393,18 +5856,24 @@ msgstr "" "0 untuk mematikan pengantrean dan -1 untuk mengatur antrean tanpa batas." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Waktu maksimum dalam milidetik saat mengunduh berkas (misal.: mengunduh mod)." +"Waktu maksimum saat mengunduh berkas (misal.: mengunduh mod) dalam milidetik." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Waktu maksimum permintaan interaktif (misal ambil daftar server), dalam " +"milidetik." #: src/settings_translation_file.cpp 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" @@ -5453,13 +5922,27 @@ msgstr "Ukuran tekstur minimum" 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" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "Mengubah ukuran dari elemen hudbar." +msgid "Modifies the size of the HUD elements." +msgstr "Mengubah ukuran elemen HUD." #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5469,6 +5952,10 @@ msgstr "Jalur fon monospace" msgid "Monospace font size" msgstr "Ukuran fon monospace" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Ukuran fon monospace dapat dibagi dengan" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Noise ketinggian gunung" @@ -5545,10 +6032,6 @@ msgstr "Nama server, ditampilkan saat pemain bergabung dan pada daftar server." 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" @@ -5557,6 +6040,11 @@ msgstr "" "Porta jaringan untuk didengar (UDP).\n" "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." @@ -5569,6 +6057,11 @@ msgstr "Tembus nodus" 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" @@ -5581,14 +6074,6 @@ msgstr "Jarak NodeTimer" msgid "Noises" msgstr "Noise" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Sampling normalmap" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Kekuatan normalmap" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Jumlah utas kemunculan" @@ -5615,28 +6100,20 @@ msgstr "" "PERINGATAN: Penambahan jumlah utas kemunculan mempercepat mesin pembuat\n" "peta, tetapi dapat merusak kinerja permainan dengan mengganggu proses lain,\n" "terutama dalam pemain tunggal dan/atau saat menjalankan kode Lua dalam\n" -"\"on_generated\". Untuk kebanyakan pengguna, pengaturan yang cocok adalah \"1" -"\"." +"\"on_generated\". Untuk kebanyakan pengguna, pengaturan yang cocok adalah " +"\"1\"." #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Jumlah dari blok tambahan yang dapat dimuat oleh /clearobjects dalam satu " "waktu.\n" -"Ini adalah pemilihan antara transaksi sqlite dan\n" +"Ini adalah pemilihan antara transaksi SQLite dan\n" "penggunaan memori (4096=100MB, kasarannya)." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Jumlah pengulangan parallax occlusion." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Gudang konten daring" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "Cairan opak" @@ -5646,60 +6123,29 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "Keburaman (alfa) bayangan di belakang fon bawaan, antara 0 dan 255." -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "Keburaman (alfa) bayangan di belakang fon cadangan, antara 0 dan 255." - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " "formspec is\n" "open." msgstr "" -"Buka menu jeda saat jendela hilang fokus. Tidak menjeda jika formspec sedang " +"Buka menu jeda saat jendela hilang fokus. Tidak menjeda jika formspec " +"sedang \n" "dibuka." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Bias keseluruhan dari efek parallax occlusion, biasanya skala/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Skala keseluruhan dari efek parallax occlusion." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Parallax occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Pergeseran parallax occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Pengulangan parallax occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Mode parallax occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Skala parallax occlusion" +msgid "Optional override for chat weblink color." +msgstr "Penimpaan opsional untuk warna tautan web pada obrolan." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5722,27 +6168,19 @@ msgstr "Jalur ke direktori tekstur. Semua tekstur akan dicari mulai dari sini." #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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" @@ -5768,6 +6206,14 @@ msgstr "Tombol gerak sesuai pandang" msgid "Pitch move mode" msgstr "Mode gerak sesuai pandang" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Tombol taruh" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Jeda waktu taruh berulang" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5776,10 +6222,6 @@ msgstr "" "Pemain dapat terbang tanpa terpengaruh gravitasi.\n" "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" @@ -5788,6 +6230,10 @@ msgstr "Jarak pemindahan pemain" msgid "Player versus player" msgstr "Pemain lawan pemain" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Pemfilteran Poisson" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5830,21 +6276,21 @@ msgstr "Profiler" 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 "" +msgstr "Alamat pendengar Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"Alamat pendengar Prometheus.\n" +"Jika Minetest dikompilasi dengan pilihan ENABLE_PROMETHEUS dinyalakan,\n" +"ini menyalakan pendengar metrik untuk Prometheus pada alamat itu.\n" +"Metrik dapat diambil pada http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." @@ -5885,7 +6331,7 @@ msgstr "Media jarak jauh" #: src/settings_translation_file.cpp msgid "Remote port" -msgstr "Porta server jarak jauh" +msgstr "Port utk Kendali Jarak Jauh" #: src/settings_translation_file.cpp msgid "" @@ -5948,10 +6394,6 @@ msgstr "Noise ukuran punggung gunung" msgid "Right key" msgstr "Tombol kanan" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Jarak klik kanan berulang" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Kedalaman kanal sungai" @@ -6021,12 +6463,16 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" "Perbesar/perkecil GUI sesuai pengguna.\n" -"Menggunakan filter nearest-neighbor-anti-alias untuk\n" -"perbesar/perkecil GUI.\n" +"Menggunakan filter nearest-neighbor-anti-alias untuk perbesar/perkecil GUI.\n" "Ini akan menghaluskan beberapa tepi kasar dan\n" "mencampurkan piksel-piksel saat diperkecil dengan\n" -"mengaburkan beberapa piksel tepi saat diperkecil dengan\n" -"skala bukan bilangan bulat." +"mengaburkan beberapa piksel tepi saat diperkecil dengan skala bukan bilangan " +"bulat." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Layar:" #: src/settings_translation_file.cpp msgid "Screen height" @@ -6058,6 +6504,11 @@ msgstr "" "1 berarti kualitas terburuk; 100 berarti kualitas terbaik.\n" "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" @@ -6070,10 +6521,6 @@ msgstr "Noise 2D kedua dari empat yang mengatur ketinggian bukit/gunung." 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" @@ -6133,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" @@ -6160,10 +6618,20 @@ msgstr "Porta server" 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" @@ -6177,9 +6645,51 @@ 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 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: 15.0" +msgstr "" +"Atur besar jari-jari bayangan halus.\n" +"Nilai rendah berarti bayangan lebih tajam, nilai tinggi berarti lebih " +"halus.\n" +"Nilai minimum: 1.0; nilai maksimum 10.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Atur kemiringan orbit Matahari/Bulan dalam derajat.\n" +"Nilai 0 berarti tidak miring/orbit tegak.\n" +"Nilai minimum: 0.0; nilai maksimum 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Atur ke true untuk menyalakan Pemetaan Bayangan.\n" +"Membutuhkan penggunaan shader." + #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving leaves.\n" @@ -6204,6 +6714,16 @@ msgstr "" "Atur ke true untuk menyalakan tanaman berayun.\n" "Membutuhkan penggunaan shader." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Atur kualitas tekstur bayangan ke 32 bit.\n" +"Nilai false berarti tekstur 16 bit akan dipakai.\n" +"Ini akan menimbulkan lebih banyak artefak pada bayangan." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Jalur shader" @@ -6220,6 +6740,22 @@ msgstr "" "pada beberapa kartu video.\n" "Ini hanya bekerja dengan video OpenGL." +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "Kualitas filter bayangan" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Jarak maks. peta bayangan (dalam nodus) untuk digambar" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "Tekstur peta bayangan dalam 32 bit" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Ukuran tekstur peta bayangan" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6229,12 +6765,9 @@ msgstr "" "digambar." #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"Pergeseran bayangan fon cadangan dalam piksel. Jika 0, bayangan tidak akan " -"digambar." +#, fuzzy +msgid "Shadow strength gamma" +msgstr "Kekuatan bayangan" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6248,6 +6781,18 @@ msgstr "Tampilkan info awakutu" msgid "Show entity selection boxes" msgstr "Tampilkan kotak pilihan benda" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Tampilkan kotak pilihan entitas\n" +"Dibutuhkan mulai ulang setelah mengganti ini." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Tampilkan latar belakang tanda nama secara bawaan" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Pesan saat server dimatikan" @@ -6266,7 +6811,8 @@ msgstr "" "PERINGATAN! Tidak ada untungnya dan berbahaya jika menaikkan\n" "nilai ini di atas 5.\n" "Mengecilkan nilai ini akan meningkatkan kekerapan gua dan dungeon.\n" -"Mengubah nilai ini untuk kegunaan khusus, membiarkannya disarankan." +"Mengubah nilai ini untuk kegunaan khusus, membiarkannya \n" +"disarankan." #: src/settings_translation_file.cpp msgid "" @@ -6278,6 +6824,10 @@ msgstr "" "menambah persentase cache hit, mengurangi data yang disalin dari\n" "utas utama, sehingga mengurangi jitter." +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Kemiringan Orbit Benda Langit" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "Irisan w" @@ -6336,18 +6886,14 @@ msgstr "Kelajuan menyelinap" msgid "Sneaking speed, in nodes per second." msgstr "Kelajuan menyelinap dalam nodus per detik." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Jari-jari bayangan halus" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Suara" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Tombol spesial" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Tombol spesial untuk memanjat/turun" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6370,6 +6916,18 @@ msgstr "" "Catat bahwa mod dan permainan dapat mengatur tumpukan untuk sebagian (atau " "semua) barang." +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Menyebarkan pembaruan peta bayangan dalam jumlah bingkai yang diberikan.\n" +"Nilai tinggi bisa membuat bayangan patah-patah, nilai rendah akan butuh\n" +"sumber daya lebih banyak.\n" +"Nilai minimum: 1; nilai maksimum: 16" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6400,10 +6958,6 @@ msgstr "Noise persebaran teras gunung" msgid "Strength of 3D mode parallax." msgstr "Kekuatan mode paralaks 3D." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Kekuatan normalmap yang dibuat." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6435,6 +6989,16 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"Tingkat permukaan peletakan air pada lapisan floatland padat.\n" +"Air tidak ditaruh secara bawaan dan akan ditaruh jika nilai ini diatur ke\n" +"atas 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (mulai dari\n" +"penirusan atas).\n" +"***PERINGATAN, POTENSI BAHAYA TERHADAP DUNIA DAN KINERJA SERVER***\n" +"Ketika penaruhan air dinyalakan, floatland wajib diatur dan diuji agar\n" +"berupa lapisan padat dengan mengatur 'mgv7_floatland_density' ke 2.0\n" +"(atau nilai wajib lainnya sesuai 'mgv7_np_floatland') untuk menghindari\n" +"aliran air ekstrem yang membebani server dan menghindari banjir\n" +"bandang di permukaan dunia bawah." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6444,6 +7008,11 @@ msgstr "SQLite sinkron" 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" @@ -6492,6 +7061,16 @@ msgstr "Persistence noise medan" msgid "Texture path" msgstr "Jalur tekstur" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Ukuran tekstur tempat peta bayangan digambar.\n" +"Ini harus bernilai perpangkatan dua.\n" +"Nilai yang besar akan menghasilkan bayangan yang bagus, tetapi lebih berat." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6512,6 +7091,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "URL dari gudang konten" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "Zona mati joystick yang digunakan" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6568,7 +7151,6 @@ msgstr "" "server Anda." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The radius of the volume of blocks around every player that is subject to " "the\n" @@ -6578,31 +7160,31 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" -"Jari-jari ruang di sekitar pemain yang menjadi blok aktif, dalam blok peta\n" -"(16 nodus).\n" +"Jari-jari volume blok di sekitar pemain yang menjadi blok aktif, dalam\n" +"blok peta (16 nodus).\n" "Dalam blok aktif, objek dimuat dan ABM berjalan.\n" "Ini juga jangkauan minimum pengelolaan objek aktif (makhluk).\n" "Ini harus diatur bersama dengan active_object_range." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" "Penggambar untuk Irrlicht.\n" "Mulai ulang dibutuhkan setelah mengganti ini.\n" "Catatan: Pada Android, gunakan OGLES1 jika tidak yakin! Apl mungkin gagal\n" -"berjalan pada lainnya. Pada platform lain, OpenGL disarankan yang menjadi\n" -"satu-satunya pengandar yang mendukung shader untuk saat ini." +"berjalan untuk pilihan lainnya. Pada platform lain, OpenGL disarankan.\n" +"Shader didukung oleh OpenGL (khusus desktop) dan OGLES2 (tahap percobaan)" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "Kepekaan dari sumbu joystick untuk menggerakkan batas\n" "tampilan dalam permainan." @@ -6630,6 +7212,14 @@ msgstr "" "pemrosesan sampai usaha dilakukan untuk mengurangi ukurannya dengan\n" "membuang antrean lama. Nilai 0 mematikan fungsi ini." +#: 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 "" +"Anggaran waktu yang dibolehkan untuk ABM dalam menjalankan\n" +"tiap langkah (dalam pecahan dari jarak ABM)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6640,11 +7230,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"Jeda dalam detik antarklik kanan berulang saat menekan tombol kanan tetikus." +"Jeda dalam detik antar-penaruhan berulang saat menekan \n" +"tombol taruh." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6685,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." @@ -6714,6 +7305,19 @@ msgstr "Jeda tooltip" 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 msgid "Trees noise" msgstr "Noise pepohonan" @@ -6792,19 +7396,40 @@ msgstr "Gunakan pemfilteran bilinear saat mengubah ukuran tekstur." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" -"Gunakan mip mapping untuk penyekalaan tekstur. Dapat sedikit\n" -"meningkatkan kinerja, terutama saat menggunakan paket tekstur\n" -"beresolusi tinggi.\n" -"Pengecilan dengan tepat gamma tidak didukung." +"Pakai mipmap untuk penyekalaan tekstur. Bisa sedikit menaikkan\n" +"kinerja, terutama pada saat memakai paket tekstur beresolusi tinggi.\n" +"Pengecilan dengan tepat-gamma tidak didukung." + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Pakai antialias multisampel (MSAA) untuk memperhalus tepian blok.\n" +"Algoritme ini memperhalus tampilan 3D sambil menjaga ketajaman gambar,\n" +"tetapi tidak memengaruhi tekstur bagian dalam (yang terlihat khususnya\n" +"dengan tekstur transparan).\n" +"Muncul spasi tampak di antara nodus ketika shader dimatikan.\n" +"Jika diatur 0, MSAA dimatikan.\n" +"Dibutuhkan mulai ulang setelah penggantian pengaturan ini." #: src/settings_translation_file.cpp 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" @@ -6902,8 +7527,8 @@ msgid "Viewing range" msgstr "Jarak pandang" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Joystick virtual mengetuk tombol aux" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Joystick virtual mengetuk tombol Aux1" #: src/settings_translation_file.cpp msgid "Volume" @@ -6981,16 +7606,19 @@ msgstr "Panjang ombak air" msgid "Waving plants" msgstr "Tanaman berayun" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Warna tautan web" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" -"Saat gui_scaling_filter diatur ke true, semua gambar GUI harus\n" -"difilter dalam perangkat lunak, tetapi beberapa gambar dibuat\n" -"langsung ke perangkat keras (misal. render ke tekstur untuk nodus\n" -"dalam inventaris)." +"Saat gui_scaling_filter diatur ke true, semua gambar GUI harus difilter\n" +"dalam perangkat lunak, tetapi beberapa gambar dibuat langsung ke\n" +"perangkat keras (misal. render ke tekstur untuk nodus dalam inventaris)." #: src/settings_translation_file.cpp msgid "" @@ -6999,11 +7627,10 @@ msgid "" "to the old scaling method, for video drivers that don't\n" "properly support downloading textures back from hardware." msgstr "" -"Saat gui_scaling_filter_txr2img dibolehkan, salin gambar-gambar\n" -"tersebut dari perangkat keras ke perangkat lunak untuk perbesar/\n" -"perkecil. Saat tidak dibolehkan, kembali ke cara lama, untuk\n" -"pengandar video yang tidak mendukung pengunduhan tekstur dari\n" -"perangkat keras." +"Saat gui_scaling_filter_txr2img dibolehkan, salin gambar-gambar tersebut\n" +"dari perangkat keras ke perangkat lunak untuk perbesar/perkecil. Saat tidak\n" +"dibolehkan, kembali ke cara lama, untuk pengandar video yang tidak\n" +"mendukung pengunduhan tekstur dari perangkat keras." #: src/settings_translation_file.cpp msgid "" @@ -7011,9 +7638,8 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7021,21 +7647,19 @@ msgstr "" "rendah dapat dikaburkan sehingga diperbesar otomatis dengan interpolasi\n" "nearest-neighbor untuk menjaga ketajaman piksel. Ini mengatur ukuran\n" "tekstur minimum untuk tekstur yang diperbesar; semakin tinggi semakin\n" -"tajam, tetapi butuh memori lebih. Perpangkatan dua disarankan. Mengatur\n" -"ini menjadi lebih dari 1 mungkin tidak tampak perubahannya kecuali\n" -"menggunakan filter bilinear/trilinear/anisotropik.\n" +"tajam, tetapi butuh memori lebih. Perpangkatan dua disarankan. Pengaturan\n" +"ini HANYA diterapkan jika menggunakan filter bilinear/trilinear/" +"anisotropik.\n" "Ini juga dipakai sebagai ukuran dasar tekstur nodus untuk penyekalaan\n" "otomatis tekstur yang sejajar dengan dunia." #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Apakah fon FreeType digunakan, membutuhkan dukungan FreeType saat " -"dikompilasi.\n" -"Jika dimatikan, fon bitmap dan vektor XML akan dipakai." +"Apakah latar belakang tanda nama ditampilkan secara bawaan.\n" +"Mod masih bisa mengatur latar belakang." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7077,14 +7701,23 @@ msgstr "" "Dalam permainan, Anda dapat beralih mode bisu dengan tombol bisu\n" "atau melalui menu jeda." +#: 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)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Lebar ukuran jendela mula-mula." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "Lebar ukuran jendela mula-mula. Ini diabaikan dalam mode layar penuh." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7141,8 +7774,8 @@ msgid "" "Y of mountain density gradient zero level. Used to shift mountains " "vertically." msgstr "" -"Titik acuan kemiringan kepadatan gunung pada sumbu Y.\n" -"Digunakan untuk menggeser gunung secara vertikal." +"Titik acuan kemiringan kepadatan gunung pada sumbu Y. Digunakan untuk " +"menggeser gunung secara vertikal." #: src/settings_translation_file.cpp msgid "Y of upper limit of large caves." @@ -7159,6 +7792,10 @@ msgid "" "For a solid floatland layer, this controls the height of hills/mountains.\n" "Must be less than or equal to half the distance between the Y limits." msgstr "" +"Jarak Y penirusan floatland dari padat sampai kosong.\n" +"Penirusan dimulai dari jarak ini sampai batas Y.\n" +"Untuk lapisan floatland padat, nilai ini mengatur tinggi bukit/gunung.\n" +"Nilai ini harus kurang dari atau sama dengan setengah jarak antarbatas Y." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." @@ -7180,122 +7817,37 @@ msgstr "Ketinggian Y dari medan yang lebih rendah dan dasar laut." 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" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "Waktu habis untuk cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Batas cURL paralel" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Waktu habis untuk cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "- Mode Kreatif: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Mode sinema" - -#~ msgid "Select Package File:" -#~ msgstr "Pilih berkas paket:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Batas atas Y untuk lava dalam gua besar." - -#~ msgid "Waving Water" -#~ msgstr "Air Berombak" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Apakah dungeon terkadang muncul dari medan." - -#~ msgid "Projecting dungeons" -#~ msgstr "Dungeon yang menonjol" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Ketinggian Y tempat bayangan floatland diperpanjang." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "Ketinggian Y dari titik tengah floatland dan permukaan danau." - -#~ msgid "Waving water" -#~ msgstr "Air berombak" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variasi dari ketinggian bukit dan kedalaman danau pada medan halus " -#~ "floatland." +#~ msgid "- Damage: " +#~ msgstr "- Kerusakan: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Ketinggian maksimum secara umum, di atas dan di bawah titik tengah, dari " -#~ "gunung floatland." +#~ "0 = parallax occlusion dengan informasi kemiringan (cepat).\n" +#~ "1 = relief mapping (pelan, lebih akurat)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Fon ini akan digunakan pada bahasa tertentu." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Kekuatan penguatan tengah kurva cahaya." - -#~ msgid "Shadow limit" -#~ msgstr "Batas bayangan" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Jalur ke TrueTypeFont atau bitmap." - -#~ msgid "Lightness sharpness" -#~ msgstr "Kecuraman keterangan" - -#~ msgid "Lava depth" -#~ msgstr "Kedalaman lava" - -#~ msgid "IPv6 support." -#~ msgstr "Dukungan IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Keburaman bayangan fon (keopakan, dari 0 sampai 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Ketinggian gunung floatland" - -#~ msgid "Floatland base height noise" -#~ msgstr "Noise ketinggian dasar floatland" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Gunakan pemetaan suasana (tone mapping) filmis" - -#~ msgid "Enable VBO" -#~ msgstr "Gunakan VBO" - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Mengatur daerah dari medan halus floatland.\n" -#~ "Floatland halus muncul saat noise > 0." - -#~ msgid "Darkness sharpness" -#~ msgstr "Kecuraman kegelapan" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Mengatur lebar terowongan, nilai lebih kecil terowongan semakin lebar." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Atur kepadatan floatland berbentuk gunung.\n" -#~ "Merupakan pergeseran yang ditambahkan ke nilai noise \"mgv7_np_mountain\"." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Titik tengah penguatan tengah kurva cahaya." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Ubah cara gunung floatland meramping di atas dan di bawah titik tengah." +#~ msgid "Address / Port" +#~ msgstr "Alamat/Porta" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7306,20 +7858,436 @@ msgstr "Waktu habis untuk cURL" #~ "Angka yang lebih tinggi lebih terang.\n" #~ "Pengaturan ini untuk klien saja dan diabaikan oleh peladen." -#~ msgid "Path to save screenshots at." -#~ msgstr "Jalur untuk menyimpan tangkapan layar." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Ubah cara gunung floatland meramping di atas dan di bawah titik tengah." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Kekuatan parallax occlusion" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Batas antrean kemunculan (emerge queue) pada diska" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Mengunduh dan memasang $1, mohon tunggu..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Apakah Anda yakin ingin mengatur ulang dunia Anda?" #~ 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." + +#~ msgid "Bump Mapping" +#~ msgstr "Bump Mapping" + +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmapping" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Titik tengah penguatan tengah kurva cahaya." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Mengubah antarmuka menu utama:\n" +#~ "- Full: Banyak dunia pemain tunggal, pilih permainan, paket tekstur, " +#~ "dll.\n" +#~ "- Simple: Satu dunia pemain tunggal, tanpa pilihan permainan atau " +#~ "paket\n" +#~ "tekstur. Cocok untuk layar kecil." + +#~ msgid "Config mods" +#~ msgstr "Konfigurasi mod" + +#~ 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." +#~ msgstr "" +#~ "Atur kepadatan floatland berbentuk gunung.\n" +#~ "Merupakan pergeseran yang ditambahkan ke nilai noise \"mgv7_np_mountain\"." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Mengatur lebar terowongan, nilai lebih kecil terowongan semakin lebar." + +#~ msgid "Credits" +#~ msgstr "Penghargaan" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Warna crosshair: (merah,hijau,biru) atau (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Kerusakan dinyalakan" + +#~ msgid "Darkness sharpness" +#~ msgstr "Kecuraman kegelapan" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Batas waktu bawaan untuk cURL, dalam milidetik.\n" +#~ "Hanya berlaku jika dikompilasi dengan cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Mengatur daerah dari medan halus floatland.\n" +#~ "Floatland halus muncul saat noise > 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Gunakan bumpmapping untuk tekstur. Normalmap harus disediakan oleh paket\n" +#~ "tekstur atau harus dihasilkan otomatis.\n" +#~ "Membutuhkan penggunaan shader." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Gunakan pemetaan suasana (tone mapping) filmis" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Buat normalmap secara langsung (efek Emboss).\n" +#~ "Membutuhkan penggunaan bumpmapping." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "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." +#~ msgstr "" +#~ "Masih tahap percobaan, dapat menyebabkan terlihatnya spasi antarblok\n" +#~ "saat diatur dengan angka yang lebih besar dari 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS (bingkai per detik) pada menu jeda" + +#~ msgid "Fallback font shadow" +#~ msgstr "Bayangan fon cadangan" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Keburaman bayangan fon cadangan" + +#~ msgid "Fallback font size" +#~ msgstr "Ukuran fon cadangan" + +#~ msgid "Filtering" +#~ msgstr "Pemfilteran" + +#~ msgid "Floatland base height noise" +#~ msgstr "Noise ketinggian dasar floatland" + +#~ msgid "Floatland mountain height" +#~ msgstr "Ketinggian gunung floatland" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Keburaman bayangan fon (keopakan, dari 0 sampai 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Ukuran fon cadangan bawaan dalam poin (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Fon FreeType" + +#~ msgid "Full screen BPP" +#~ msgstr "BPP layar penuh" + +#~ msgid "Game" +#~ msgstr "Permainan" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Buat Normal Maps" + +#~ 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" + +#~ msgid "Lightness sharpness" +#~ msgstr "Kecuraman keterangan" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Batas antrean kemunculan (emerge queue) pada diska" + +#~ msgid "Main" +#~ msgstr "Beranda" + +#~ msgid "Main menu style" +#~ msgstr "Gaya menu utama" + +#~ 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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Peta mini mode radar, perbesaran 4x" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Peta mini mode permukaan, perbesaran 2x" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Peta mini mode permukaan, perbesaran 4x" + +#~ msgid "Name / Password" +#~ msgstr "Nama/Kata Sandi" + +#~ msgid "Name/Password" +#~ msgstr "Nama/Kata Sandi" + +#~ msgid "No" +#~ msgstr "Tidak" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Sampling normalmap" + +#~ msgid "Normalmaps strength" +#~ msgstr "Kekuatan normalmap" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Jumlah pengulangan parallax occlusion." + #~ msgid "Ok" #~ msgstr "Oke" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Keburaman (alfa) bayangan di belakang fon cadangan, antara 0 dan 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "Bias keseluruhan dari efek parallax occlusion, biasanya skala/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Skala keseluruhan dari efek parallax occlusion." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax Occlusion" + +#~ msgid "Parallax occlusion" +#~ msgstr "Parallax occlusion" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Pergeseran parallax occlusion" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Pengulangan parallax occlusion" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Mode parallax occlusion" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Skala parallax occlusion" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Kekuatan parallax occlusion" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Jalur ke TrueTypeFont atau bitmap." + +#~ 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" + +#~ msgid "PvP enabled" +#~ msgstr "PvP dinyalakan" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Atur ulang dunia pemain tunggal" + +#~ msgid "Select Package File:" +#~ msgstr "Pilih berkas paket:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Server/Pemain tunggal" + +#~ msgid "Shadow limit" +#~ msgstr "Batas bayangan" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Pergeseran bayangan fon cadangan dalam piksel. Jika 0, bayangan tidak " +#~ "akan digambar." + +#~ msgid "Special" +#~ msgstr "Spesial" + +#~ msgid "Special key" +#~ msgstr "Tombol spesial" + +#~ msgid "Start Singleplayer" +#~ msgstr "Mulai Pemain Tunggal" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Kekuatan normalmap yang dibuat." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Kekuatan penguatan tengah kurva cahaya." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Fon ini akan digunakan pada bahasa tertentu." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Untuk menggunakan shader, pengandar OpenGL harus digunakan." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Mode sinema" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Ketinggian maksimum secara umum, di atas dan di bawah titik tengah, dari " +#~ "gunung floatland." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variasi dari ketinggian bukit dan kedalaman danau pada medan halus " +#~ "floatland." + +#~ msgid "View" +#~ msgstr "Tinjau" + +#~ msgid "Waving Water" +#~ msgstr "Air Berombak" + +#~ msgid "Waving water" +#~ msgstr "Air berombak" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Apakah fon FreeType digunakan, membutuhkan dukungan FreeType saat " +#~ "dikompilasi.\n" +#~ "Jika dimatikan, fon bitmap dan vektor XML akan dipakai." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Apakah dungeon terkadang muncul dari medan." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Batas atas Y untuk lava dalam gua besar." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "Ketinggian Y dari titik tengah floatland dan permukaan danau." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Ketinggian Y tempat bayangan floatland diperpanjang." + +#~ 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" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/it/minetest.po b/po/it/minetest.po index c7ce03705..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: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-26 10:41+0000\n" -"Last-Translator: Hamlet <hamlatmesehub@riseup.net>\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,7 +12,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 "Pulisci la coda di uscita dei messaggi della chat" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Comando vuoto." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Ritorna al menu principale" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Comando non valido: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Comando eseguito: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Elenca i giocatori connessi" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Giocatori connessi: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "La coda di uscita dei messaggi della chat ora è vuota." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Questo comando è stato disabilitato dal server." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,9 +58,40 @@ msgstr "Rinasci" msgid "You died" msgstr "Sei morto" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Comandi disponibili:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Comandi disponibili: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Comando non disponibile: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Ottieni aiuto per i comandi" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"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 "[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>" +msgstr "<nessuno disponibile>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -44,11 +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 src/client/game.cpp -msgid "Loading..." -msgstr "Caricamento..." +#: 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. " @@ -63,10 +151,8 @@ 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 "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Prova a riabilitare l'elenco dei server pubblici e controlla la tua " -"connessione internet." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -74,19 +160,28 @@ 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 builtin/mainmenu/dlg_create_world.lua +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Dipendenze:" @@ -111,12 +206,12 @@ 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:" @@ -132,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 nessuna descrizione per la raccolta di mod." +msgstr "Non è stata fornita alcuna descrizione per la raccolta di mod." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" @@ -159,17 +254,57 @@ msgstr "Mondo:" msgid "enabled" msgstr "abilitato" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +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 saranno installate." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 con $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"Scaricando $1,\n" +"$2 in coda" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "Scaricando $1..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +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 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" +msgstr "Già installato" #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Torna al Menu Principale" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +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..." @@ -180,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" @@ -189,26 +323,52 @@ msgid "Install" msgstr "Installa" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Installa $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Installa le dipendenze mancanti" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Installazione: Tipo di file non supportato o archivio danneggiato" + +#: builtin/mainmenu/dlg_contentstore.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" msgstr "Nessun risultato" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Cerca" +msgid "No updates" +msgstr "Nessun aggiornamento" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Non trovato" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Sovrascrivi" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Per favore, controlla che il gioco di base sia corretto." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "In coda" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" -msgstr "Raccolte di immagini" +msgstr "Raccolte di texture" #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" @@ -219,8 +379,12 @@ msgid "Update" msgstr "Aggiorna" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Vedi" +msgid "Update All [$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" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -240,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" @@ -263,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" @@ -280,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" @@ -306,25 +463,34 @@ msgstr "Fiumi umidi" 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" @@ -332,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" @@ -407,11 +573,6 @@ msgstr "Diversifica la profondità dei fiumi" 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" @@ -428,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\"" @@ -440,11 +601,44 @@ 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:" @@ -455,12 +649,12 @@ msgid "" "This modpack has an explicit name given in its modpack.conf which will " "override any renaming here." msgstr "" -"Questa raccolta di mod esplicita un nome in modpack.conf che sovrascriverà " -"ogni modifica qui fatta." +"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" @@ -468,13 +662,23 @@ 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" msgstr "Disabilitato" @@ -499,7 +703,7 @@ msgid "Offset" msgstr "Scarto" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Persistenza" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -512,21 +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 "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" @@ -536,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" @@ -568,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 @@ -583,37 +791,29 @@ 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 la raccolta " -"di mod $1" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Installa: Tipo di file non supportato \"$1\" o archivio danneggiato" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Install: File: \"$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" @@ -621,7 +821,7 @@ 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 una raccolta di immagini" +msgstr "Impossibile installare un $1 come una raccolta di texture" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a game as a $1" @@ -635,17 +835,72 @@ msgstr "Impossibile installare un mod come un $1" msgid "Unable to install a modpack as a $1" msgstr "Impossibile installare una raccolta di mod come un $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Caricamento..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +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." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Informazioni" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Contributori Attivi" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Algoritmo di resa attivo:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Sviluppatori Principali" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 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" +msgstr "Contributori precedenti" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +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 in linea" +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 raccolta immagini" +msgstr "Disattiva la Raccolta di Texture" #: builtin/mainmenu/tab_content.lua msgid "Information:" @@ -653,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." @@ -661,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" @@ -669,67 +924,39 @@ msgstr "Rinomina" #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" -msgstr "Disinstalla la raccolta" +msgstr "Disinstalla il Contenuto" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" -msgstr "Usa la raccolta di immagini" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Contributori attivi" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Sviluppatori principali" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Riconoscimenti" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Contributori precedenti" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Sviluppatori principali precedenti" +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 "Configure" -msgstr "Configura" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "Modalità creativa" +msgstr "Modalità Creativa" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: 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 dal ContentDB" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nome/Password" +msgstr "Installa giochi da ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -743,62 +970,83 @@ msgstr "Nessun mondo creato o selezionato!" msgid "Play Game" msgstr "Avvia il gioco" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Porta" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +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" -msgstr "Comincia gioco" +msgstr "Gioca" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Indirizzo / Porta" +msgid "Address" +msgstr "Indirizzo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Connettiti" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Canc" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Modalità creativa" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Danno fisico abilitato" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Ferimento / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Elimina preferito" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Preferiti" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Preferito" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Server Incompatibili" #: builtin/mainmenu/tab_online.lua msgid "Join Game" -msgstr "Entra in un gioco" +msgstr "Unisciti al Gioco" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nome / Password" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP abilitato" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Server Pubblici" + +#: builtin/mainmenu/tab_online.lua +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" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -818,71 +1066,76 @@ 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:" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Sei sicuro di azzerare il tuo mondo locale?" +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" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bump Mapping" +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" + +#: builtin/mainmenu/tab_settings.lua +#, 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 "Generate Normal Maps" -msgstr "Genera Normal Map" +msgid "High" +msgstr "Alto" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Basso" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +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." - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "No" +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" @@ -890,24 +1143,16 @@ 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" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax Occlusion" +msgstr "Acqua Opaca" #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Particelle" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Azzera mondo locale" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Schermo:" @@ -918,7 +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 "Shaders (sperimentali)" #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" @@ -926,61 +1175,56 @@ 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:" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Per abilitare gli shader si deve usare il driver OpenGL." +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 +#, fuzzy +msgid "Very High" +msgstr "Ultra" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +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" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Sì" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Config mod" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Principale" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Avvia in locale" +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." msgstr "Connessione scaduta." @@ -990,35 +1234,35 @@ 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 "Caricamento immagini..." +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?)" msgstr "Errore di connessione (scaduta?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Impossibile trovare o caricare il gioco \"" +msgid "Could not find or load game: " +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." @@ -1026,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!" @@ -1034,23 +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: " - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" +msgstr "Il percorso del mondo fornito non esiste: " #: src/client/game.cpp msgid "" @@ -1064,14 +1296,6 @@ msgstr "" msgid "- Address: " msgstr "- Indirizzo: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Modalità creativa: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Ferimento: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Modalità: " @@ -1091,7 +1315,16 @@ 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 "Si è verificato un errore di serializzazione:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Accesso negato. Motivo: %s" #: src/client/game.cpp msgid "Automatic forward disabled" @@ -1101,25 +1334,52 @@ msgstr "Avanzamento automatico disabilitato" msgid "Automatic forward enabled" msgstr "Avanzamento automatico abilitato" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Limiti del blocco nascosti" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "I limiti del blocco sono mostrati per tutti i blocchi" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "I limiti del blocco sono mostrati per il blocco attuale" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +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 +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" +"Impossibile mostrare i limiti del blocco (si ha bisogno del privilegio " +"'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" +msgstr "Client disconnesso" #: src/client/game.cpp msgid "Client side scripting is disabled" @@ -1129,6 +1389,10 @@ msgstr "Scripting su lato client disabilitato" msgid "Connecting to server..." msgstr "Connessione al server..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Connessione fallita per motivo sconosciuto" + #: src/client/game.cpp msgid "Continue" msgstr "Continua" @@ -1141,13 +1405,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1156,23 +1420,28 @@ msgstr "" "- %s: arretra\n" "- %s: sinistra\n" "- %s: destra\n" -"- %s: salta/arrampica\n" -"- %s: striscia/scendi\n" -"- %s: butta oggetto\n" +"- %s: salta/scala su\n" +"- %s: scava/colpisci\n" +"- %s: piazza/utilizza\n" +"- %s: furtivo/scendi\n" +"- %s: getta via oggetto\n" "- %s: inventario\n" -"- Mouse: gira/guarda\n" -"- Mouse sx: scava/colpisci\n" -"- Mouse dx: piazza/usa\n" +"- Mouse: girati/guarda\n" "- Rotella mouse: scegli oggetto\n" "- %s: chat\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +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" @@ -1184,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 "" @@ -1201,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" @@ -1222,9 +1491,14 @@ msgstr "Raggio visivo illimitato disabilitato" 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" @@ -1240,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" @@ -1252,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" @@ -1272,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" @@ -1292,35 +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 "Minimap hidden" -msgstr "Minimappa nascosta" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Minimappa in modalità radar, ingrandimento x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Minimappa in modalità radar, ingrandimento x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Minimappa in modalità radar, ingrandimento x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minimappa in modalità superficie, ingrandimento x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minimappa in modalità superficie, ingrandimento x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minimappa in modalità superficie, ingrandimento x4" +msgid "Multiplayer" +msgstr "Multigiocatore" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1332,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" @@ -1348,11 +1598,11 @@ msgstr "Attivato" #: src/client/game.cpp msgid "Pitch move mode disabled" -msgstr "Modalità movimento inclinazione disabilitata" +msgstr "Modalità inclinazione movimento disabilitata" #: src/client/game.cpp msgid "Pitch move mode enabled" -msgstr "Modalità movimento inclinazione abilitata" +msgstr "Modalità inclinazione movimento abilitata" #: src/client/game.cpp msgid "Profiler graph shown" @@ -1364,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" @@ -1376,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" @@ -1388,12 +1638,27 @@ 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" msgstr "Suono attivato" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Il server sta probabilmente eseguendo una versione differente di %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Impossibile connettersi a %s perché IPv6 è disabilitato" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Impossibile ascoltare su %s perché IPv6 è disabilitato" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1416,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" @@ -1432,44 +1697,40 @@ msgstr "Chat nascosta" #: src/client/gameui.cpp msgid "Chat shown" -msgstr "Chat visualizzata" +msgstr "Chat mostrata" #: src/client/gameui.cpp msgid "HUD hidden" -msgstr "Visore nascosto" +msgstr "HUD nascosto" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "Visore visualizzato" +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." - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Canc" +msgstr "Blocco Maiusc." #: src/client/keycode.cpp msgid "Control" -msgstr "Ctrl" +msgstr "Control" #: src/client/keycode.cpp msgid "Down" @@ -1497,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" @@ -1525,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 @@ -1550,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" @@ -1634,7 +1895,7 @@ msgstr "Pausa" #: src/client/keycode.cpp msgid "Play" -msgstr "Play" +msgstr "Avvia" #. ~ "Print screen" key #: src/client/keycode.cpp @@ -1714,36 +1975,39 @@ msgstr "Pulsante X 2" msgid "Zoom" msgstr "Ingrandimento" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Le password non corrispondono!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimappa nascosta" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registrati e accedi" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimappa in modalità radar, ingrandimento x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimappa in modalità superficie, ingrandimento x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimappa in modalità texture" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Impossibile aprire la pagina web" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Apertura pagina web" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Prosegui" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Speciale\" = scendi" +msgid "\"Aux1\" = climb down" +msgstr "\"Speciale\" = discendi" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1753,15 +2017,23 @@ msgstr "Avanzam. autom." msgid "Automatic jumping" msgstr "Salto automatico" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Speciale" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Indietreggia" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Limiti del blocco nascosto" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Cambia vista" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Chat" @@ -1783,7 +2055,7 @@ msgstr "Diminuisci volume" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "Doppio \"salta\" per scegliere il volo" +msgstr "Doppio \"salta\" per volare" #: src/gui/guiKeyChangeMenu.cpp msgid "Drop" @@ -1814,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" @@ -1824,7 +2095,7 @@ msgstr "Comando locale" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" -msgstr "Silenzio" +msgstr "Muta audio" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" @@ -1840,47 +2111,43 @@ msgstr "Selezione raggio" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Screenshot" -msgstr "Schermata" +msgstr "Screenshot" #: src/gui/guiKeyChangeMenu.cpp msgid "Sneak" -msgstr "Striscia" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Speciale" +msgstr "Furtivo" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" -msgstr "Scegli visore" +msgstr "HUD sì/no" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle chat log" -msgstr "Scegli registro chat" +msgstr "Log chat sì/no" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "Scegli rapido" +msgstr "Corsa sì/no" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fly" -msgstr "Scegli volo" +msgstr "Volo sì/no" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" -msgstr "Scegli nebbia" +msgstr "Nebbia sì/no" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle minimap" -msgstr "Scegli minimappa" +msgstr "Minimappa sì/no" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle noclip" -msgstr "Scegli incorporea" +msgstr "Incorporeità sì/no" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle pitchmove" -msgstr "Modalità beccheggio" +msgstr "Beccheggio sì/no" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" @@ -1890,10 +2157,6 @@ msgstr "premi il tasto" 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" @@ -1902,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" @@ -1911,14 +2178,9 @@ msgid "Muted" msgstr "Silenziato" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Volume suono: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Inserisci " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Volume suono: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1927,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" @@ -1937,12 +2209,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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 @@ -1988,14 +2260,6 @@ msgstr "" "a un'isola, si impostino tutti e tre i numeri sullo stesso valore per la " "forma grezza." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = occlusione di parallasse con informazione di inclinazione (più veloce).\n" -"1 = relief mapping (più lenta, più accurata)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "Rumore 2D che controlla forma/dimensione delle montagne con dirupi." @@ -2107,6 +2371,10 @@ msgstr "" "- inversione pagina: 3D basato su quadbuffer.\n" "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" @@ -2128,6 +2396,10 @@ msgstr "Un messaggio da mostrare a tutti i client quando il server chiude." msgid "ABM interval" msgstr "Intervallo ABM" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "Budget di tempo ABM" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "Limite assoluto di blocchi in coda da fare apparire" @@ -2176,8 +2448,14 @@ 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." +msgstr "" +"Aggiusta la densità del display rilevato, utilizzato per scalare gli " +"elementi UI." #: src/settings_translation_file.cpp #, c-format @@ -2188,14 +2466,19 @@ 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" @@ -2216,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 @@ -2295,6 +2579,10 @@ msgstr "" "questa ottimizzazione.\n" "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" @@ -2315,6 +2603,14 @@ msgstr "Salvare dim. finestra" msgid "Autoscaling mode" msgstr "Modalità scalamento automatico" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Tasto Speciale" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Tasto Speciale per scendere/immergersi" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tasto per indietreggiare" @@ -2327,10 +2623,6 @@ msgstr "Livello base del terreno" 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" @@ -2352,21 +2644,22 @@ 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 msgid "Biome noise" msgstr "Rumore biomi" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bit per pixel (o profondità di colore) in modalità schermo intero." - #: src/settings_translation_file.cpp 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" @@ -2392,8 +2685,9 @@ msgid "Builtin" msgstr "Incorporato" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bumpmapping" +#, fuzzy +msgid "Camera" +msgstr "Cambia vista" #: src/settings_translation_file.cpp msgid "" @@ -2418,7 +2712,7 @@ msgstr "Fluidità della telecamera in modalità cinematic" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "Tasto di scelta dell'aggiornamento della telecamera" +msgstr "Tasto di (dis)attivazione dell'aggiornamento della telecamera" #: src/settings_translation_file.cpp msgid "Cave noise" @@ -2473,20 +2767,14 @@ msgstr "" "Dove 0.0 è il livello di luce minimo, 1.0 è il livello di luce massimo." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" -"Cambia l'UI del menu principale:\n" -"- Completa: mondi locali multipli, scelta del gioco, selettore pacchetti " -"grafici, ecc.\n" -"- Semplice: un mondo locale, nessun selettore di gioco o pacchetti " -"grafici.\n" -"Potrebbe servire per gli schermi più piccoli." +"Limite di tempo per il completamento di un comando, oltre cui mostrare un " +"messaggio nella chat" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Comandi della chat" #: src/settings_translation_file.cpp msgid "Chat font size" @@ -2518,11 +2806,11 @@ msgstr "Lunghezza massima dei messaggi di chat" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "Tasto di scelta della chat" +msgstr "Tasto di (dis)attivazione della chat" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Comandi della chat" +msgid "Chat weblinks" +msgstr "Collegamenti a siti Web nella chat" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2538,7 +2826,15 @@ msgstr "Tasto modalità cinematic" #: src/settings_translation_file.cpp msgid "Clean transparent textures" -msgstr "Pulizia delle immagini trasparenti" +msgstr "Pulizia delle textures trasparenti" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Link web cliccabili (tasto-centrale o Ctrl+tasto-sinistro) abilitati nel " +"output della chat." #: src/settings_translation_file.cpp msgid "Client" @@ -2560,6 +2856,11 @@ msgstr "Restrizioni delle modifiche del client" 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" @@ -2584,6 +2885,10 @@ msgstr "Nuvole nel menu" msgid "Colored fog" msgstr "Nebbia colorata" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Ombre colorate" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2594,8 +2899,8 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" -"Elenco separato da virgole di valori da nascondere nel deposito dei " -"contenuti.\n" +"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" "come \"software libero\", così come definito dalla Free Software " @@ -2627,6 +2932,32 @@ msgstr "" msgid "Command key" msgstr "Tasto comando" +#: src/settings_translation_file.cpp +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 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 +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 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" msgstr "Unire i vetri" @@ -2651,9 +2982,18 @@ msgstr "Colore della console" 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 "Lista nera dei valori per il ContentDB" +msgstr "Contenuti esclusi da ContentDB" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Massimi download contemporanei di ContentDB" #: src/settings_translation_file.cpp msgid "ContentDB URL" @@ -2668,9 +3008,9 @@ msgid "" "Continuous forward movement, toggled by autoforward key.\n" "Press the autoforward key again or the backwards movement to disable." msgstr "" -"Avanzamento continuo, scelto dal tasto avanzamento automatico.\n" -"Premi nuovamente il tasto avanzamento automatico o il tasto di arretramento " -"per disabilitarlo." +"Avanzamento continuo, attivato dal tasto avanzamento automatico.\n" +"Premi nuovamente il tasto di avanzamento automatico o il tasto di " +"arretramento per disabilitarlo." #: src/settings_translation_file.cpp msgid "Controls" @@ -2687,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." @@ -2723,16 +3065,24 @@ msgid "Crosshair alpha" msgstr "Trasparenza del mirino" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Trasparenza del mirino (opacità, tra 0 e 255)." +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" +"Lo stesso si applica al mirino dell'oggetto." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Colore del mirino" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Colore del mirino (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Colore del mirino (R,G,B).\n" +"Controlla anche il colore del mirino dell'oggetto" #: src/settings_translation_file.cpp msgid "DPI" @@ -2744,7 +3094,7 @@ msgstr "Ferimento" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "Tasto di scelta delle informazioni di debug" +msgstr "Tasto di (dis)attivazione delle informazioni di debug" #: src/settings_translation_file.cpp msgid "Debug log file size threshold" @@ -2755,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" @@ -2800,11 +3150,14 @@ msgstr "Dimensione predefinita della pila" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Scadenza predefinita per cURL, fissata in millisecondi.\n" -"Ha effetto solo se Minetest è stato compilato con cURL." +"Definisci la qualità del filtraggio delle ombre.\n" +"Questo simula l'effetto delle ombre morbide applicando un PCF o Poisson " +"disk\n" +"ma utilizza più risorse." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2837,14 +3190,6 @@ msgstr "Definisce la struttura dei canali fluviali di ampia scala." msgid "Defines location and terrain of optional hills and lakes." msgstr "Definisce posizione e terreno di colline e laghi facoltativi." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Stabilisce il passo di campionamento dell'immagine.\n" -"Un valore maggiore dà normalmap più uniformi." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Definisce il livello base del terreno." @@ -2924,6 +3269,15 @@ msgstr "" 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" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Particelle di scavo" @@ -2936,6 +3290,16 @@ msgstr "Disattiva anti-trucchi" msgid "Disallow empty passwords" msgstr "Rifiutare le password vuote" +#: src/settings_translation_file.cpp +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." @@ -2946,7 +3310,8 @@ msgstr "Doppio \"salta\" per volare" #: src/settings_translation_file.cpp msgid "Double-tapping the jump key toggles fly mode." -msgstr "Premendo due volte il tasto di salto si sceglie la modalità di volo." +msgstr "" +"Premendo due volte il tasto di salto si (dis)attiva la modalità di volo." #: src/settings_translation_file.cpp msgid "Drop item key" @@ -2984,18 +3349,40 @@ msgstr "" "Abilita il supporto per le modifiche tramite Lua sul client.\n" "Questo supporto è sperimentale e l'API potrebbe cambiare." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Abilità il filtraggio Poisson disk\n" +"Se abilitato si hanno le \\\"ombre morbide\\\". Altrimenti utilizza il " +"filtraggio PCF." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Abilità ombre colorate.\n" +"Se abilitato nodi traslucidi producono ombre colorate. Questo è costoso." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Attivare la finestra della console" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Abilitare la modalità creativa per le nuove mappe create." +msgid "Enable creative mode for all players" +msgstr "Abilitare la modalità creativa per tutti i giocatori" #: src/settings_translation_file.cpp 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." @@ -3014,18 +3401,6 @@ msgstr "" "Abilita l'ingresso di dati casuali da parte dell'utente (utilizzato solo per " "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" @@ -3034,6 +3409,10 @@ msgstr "" "Abilita l'illuminazione armoniosa con una occlusione ambientale semplice.\n" "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" @@ -3059,7 +3438,7 @@ msgstr "" "server).\n" "I server remoti offrono un sistema significativamente più rapido per " "scaricare\n" -"contenuti multimediali (es. immagini) quando ci si connette al server." +"contenuti multimediali (es. textures) quando ci si connette al server." #: src/settings_translation_file.cpp msgid "" @@ -3105,17 +3484,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Attiva l'animazione degli oggetti dell'inventario." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Attiva il bumpmapping per le immagini. È necessario fornire le normalmap\n" -"con la raccolta di immagini, o devono essere generate automaticamente.\n" -"Necessita l'attivazione degli shader." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Attiva la cache delle mesh ruotate con facedir." @@ -3124,22 +3492,6 @@ msgstr "Attiva la cache delle mesh ruotate con facedir." msgid "Enables minimap." msgstr "Attiva la minimappa." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Attiva la generazione istantanea delle normalmap (effetto rilievo).\n" -"Necessita l'attivazione del bumpmapping." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Attiva la parallax occlusion mapping.\n" -"Necessita l'attivazione degli shader." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3153,6 +3505,20 @@ msgstr "" "nel gioco non saranno funzionanti.\n" "Cambiare questa impostazione richiede un riavvio." +#: 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 "" +"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" msgstr "Intervallo di stampa dei dati di profilo del motore di gioco" @@ -3161,14 +3527,6 @@ msgstr "Intervallo di stampa dei dati di profilo del motore di gioco" msgid "Entity methods" msgstr "Sistemi di entità" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Opzione sperimentale, potrebbe causare spazi visibili tra i blocchi\n" -"quando impostata su numeri maggiori di 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3188,8 +3546,12 @@ msgstr "" "pianure più piatte, adatti a uno strato solido di terre fluttuanti." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS nel menu di pausa" +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" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3207,18 +3569,6 @@ msgstr "Fattore di ondeggiamento in caduta" msgid "Fallback font path" msgstr "Percorso del carattere di ripiego" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Ombreggiatura del carattere di ripiego" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Trasparenza del carattere di ripiego" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Dimensione del carattere di ripiego" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Tasto corsa" @@ -3237,11 +3587,11 @@ msgstr "Movimento rapido" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"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" @@ -3257,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." @@ -3271,25 +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 msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 immagini 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 immagini trasparenti scure o\n" -"dai bordi chiari. Applicare questo filtro aiuta a ripulire tutto ciò\n" -"al momento del caricamento dell'immagine." +"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." @@ -3355,7 +3708,12 @@ msgstr "Inizio nebbia" #: src/settings_translation_file.cpp msgid "Fog toggle key" -msgstr "Tasto scelta nebbia" +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" @@ -3378,16 +3736,20 @@ msgid "Font size" msgstr "Dimensione del carattere" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "Dimensione carattere del carattere predefinito, in punti (pt)." +msgid "Font size divisible by" +msgstr "Dimensione carattere divisibile per" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Dimensione carattere del carattere di ripiego, in punti (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "" +"Dimensione carattere del carattere predefinito, dove 1 unità equivale ad 1 " +"pixel a DPI 96" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "Dimensione carattere del carattere a spaziatura fissa, in punti (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" +"Dimensione carattere del carattere a spaziatura fissa, dove 1 unità equivale " +"ad 1 pixel a DPI 96" #: src/settings_translation_file.cpp msgid "" @@ -3398,6 +3760,25 @@ msgstr "" "punti (pt).\n" "Valore 0 userà la dimensione carattere predefinita." +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"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 "" "Format of player chat messages. The following strings are valid " @@ -3410,7 +3791,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Format of screenshots." -msgstr "Formato delle schermate." +msgstr "Formato degli screenshot." #: src/settings_translation_file.cpp msgid "Formspec Default Background Color" @@ -3461,11 +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" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Caratteri FreeType" +"Frazione della distanza visibile oltre cui si comincia a renderizzare la " +"nebbia" #: src/settings_translation_file.cpp msgid "" @@ -3502,10 +3880,6 @@ msgstr "" msgid "Full screen" msgstr "Schermo intero" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "BPP dello schermo intero" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Modalità a schermo intero." @@ -3523,8 +3897,17 @@ msgid "GUI scaling filter txr2img" msgstr "Filtro di scala txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Generare le normalmap" +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" @@ -3534,13 +3917,13 @@ msgstr "Callback globali" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"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 "" @@ -3562,6 +3945,16 @@ msgstr "" 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à" @@ -3579,27 +3972,31 @@ msgid "HTTP mods" msgstr "Moduli HTTP" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "Fattore di scala del visore" +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" -msgstr "Tasto di scelta del visore" +msgstr "Tasto di (dis)attivazione dell'HUD" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"Gestione delle chiamate deprecate alle API Lua:\n" -"- legacy (ereditaria): (prova a) simulare il vecchio comportamento (" -"predefinito per i rilasci).\n" -"- log (registro): simula e registra la traccia della chiamata deprecata (" -"predefinito per il debug).\n" -"- error (errore): interrompere all'uso della chiamata deprecata (suggerito " -"per lo sviluppo di moduli)." +"Gestione delle chiamate API Lua deprecate:\n" +"- none (nessuno): non registra le chiamate obsolete\n" +"- log (registro): imita e registra il backtrace di una chiamata obsoleta " +"(impostazione predefinita).\n" +"- error (errore): interrompe l'utilizzo della chiamata deprecata " +"(consigliata per gli sviluppatori di mod)." #: src/settings_translation_file.cpp msgid "" @@ -3624,8 +4021,11 @@ msgid "Heat noise" msgstr "Rumore del calore" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Componente altezza della dimensione iniziale della finestra." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Componente altezza della dimensione iniziale della finestra. Ignorata in " +"modalità a schermo intero." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3635,10 +4035,6 @@ msgstr "Rumore dell'altezza" msgid "Height select noise" msgstr "Rumore di selezione dell'altezza" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "FPU ad alta precisione" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Ripidità delle colline" @@ -3837,18 +4233,27 @@ 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." @@ -3883,11 +4288,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"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 @@ -3918,13 +4323,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"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 \"striscia\" 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 "" @@ -3956,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." @@ -3980,6 +4397,15 @@ msgstr "" "get_node\n" "sono limitate a questa distanza dal giocatore al nodo." +#: 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 l'esecuzione del comando in chat impiega più tempo di quello specificato " +"in\n" +"secondi, aggiungi l'informazione sul tempo al messaggio di comando in chat" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -4001,10 +4427,6 @@ msgstr "Se impostata, i giocatori (ri)compariranno sempre alla posizione data." 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 "" @@ -4036,7 +4458,7 @@ msgstr "" "Questo normalmente serve solo ai contributori principali" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "Predisporre i comandi della chat alla registrazione." #: src/settings_translation_file.cpp @@ -4065,10 +4487,6 @@ msgstr "" 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 "" @@ -4076,7 +4494,8 @@ msgstr "" "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 @@ -4132,6 +4551,10 @@ msgstr "ID del joystick" msgid "Joystick button repetition interval" msgstr "Intervallo di ripetizione del pulsante del joystick" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Punto cieco joystick" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Sensibilità del tronco del joystick" @@ -4192,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" @@ -4234,6 +4657,16 @@ msgstr "" "Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per scavare.\n" +"Vedi http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4376,6 +4809,16 @@ msgstr "" "Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tasto per piazzare.\n" +"Vedi http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4724,7 +5167,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tasto per strisciare.\n" +"Tasto per muoversi furtivamente.\n" "Usato anche per scendere, e per immergersi in acqua se aux1_descends è " "disattivato.\n" "Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -4746,7 +5189,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tasto per scattare schermate.\n" +"Tasto per scattare gli screenshot.\n" "Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4816,7 +5259,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tasto per scegliere la modalità di movimento di pendenza.\n" +"Tasto per scegliere la modalità di inclinazione del movimento. \n" "Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4857,7 +5300,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tasto per scegliere la visualizzazione della nebbia.\n" +"Tasto per attivare/disattivare la visualizzazione della nebbia.\n" "Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4867,7 +5310,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tasto per scegliere la visualizzazione del visore.\n" +"Tasto per attivare/disattivare la visualizzazione dell'HUD.\n" "Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4912,6 +5355,10 @@ msgstr "" "Si veda http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4971,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." @@ -4988,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" @@ -5010,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" @@ -5045,6 +5501,11 @@ msgstr "Gradiente alto della curva di luce" 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" @@ -5131,10 +5592,6 @@ msgstr "Limite inferiore Y delle terre fluttuanti." msgid "Main menu script" msgstr "Script del menu principale" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Stile del menu principale" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5142,17 +5599,21 @@ msgstr "" "Far sì che i colori di nebbia e cielo dipendano da ora del giorno (alba/" "tramonto) e direzione della visuale." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "Fa lavorare DirectX con LuaJIT. Disabilitare se provoca problemi." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Rende opachi tutti i liquidi" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Livello di compressione della mappa per l'archiviazione su disco" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +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." @@ -5165,8 +5626,8 @@ msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." msgstr "" -"Attributi di generazione della mappa specifici del generatore di mappe Flat." -"\n" +"Attributi di generazione della mappa specifici del generatore di mappe " +"Flat.\n" "Al mondo piatto possono essere aggiunti laghi e colline occasionali." #: src/settings_translation_file.cpp @@ -5234,6 +5695,10 @@ msgstr "Limite di generazione della mappa" msgid "Map save interval" msgstr "Intervallo di salvataggio della mappa" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Frame di aggiornamento delle mappe d'ombra" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Limite dei blocchi mappa" @@ -5339,8 +5804,14 @@ msgid "Maximum FPS" msgstr "FPS massimi" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "FPS massimi quando il gioco è in pausa." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"FPS massimi quando la finestra è in secondo piano o quando il gioco è in " +"pausa." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Distanza massima per renderizzare le ombre." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5398,6 +5869,16 @@ msgstr "" "Numero massimo di blocchi da accodarsi che devono essere caricati da file.\n" "Questo limite viene imposto per ciascun giocatore." +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Numero massimo di download simultanei. I download che superano questo limite " +"verranno messi in coda.\n" +"Dovrebbe essere inferiore a curl_parallel_limit." + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "Numero massimo di blocchi mappa caricati a forza." @@ -5466,19 +5947,25 @@ msgstr "" "della coda." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Tempo massimo in ms che può richiedere lo scaricamento di un file (es. un " -"mod)." +"Tempo massimo in millisecondi che può richiedere lo scaricamento di un file " +"(es. un mod)." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Tempo massimo che può richiedere una richiesta interattiva (es. lista presa " +"dal server), dichiarato in secondi." #: src/settings_translation_file.cpp 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" @@ -5522,19 +6009,33 @@ msgstr "Limite minimo di piccole grotte casuali per pezzo di mappa." #: src/settings_translation_file.cpp msgid "Minimum texture size" -msgstr "Dimensione minima dell'immagine" +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 -msgid "Modifies the size of the hudbar elements." -msgstr "Modifica la dimensione degli elementi della barra del visore." +msgid "Modifies the size of the HUD elements." +msgstr "Modifica la dimensione degli elementi dello HUD." #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5544,6 +6045,10 @@ msgstr "Percorso del carattere a spaziatura fissa" msgid "Monospace font size" msgstr "Dimensione del carattere a spaziatura fissa" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Dimensione del carattere a spaziatura fissa divisibile per" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Rumore dell'altezza montana" @@ -5582,7 +6087,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Mute key" -msgstr "Tasto silenzio" +msgstr "Tasto muta" #: src/settings_translation_file.cpp msgid "Mute sound" @@ -5622,10 +6127,6 @@ msgstr "" 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" @@ -5634,6 +6135,11 @@ msgstr "" "Porta di rete da ascoltare (UDP).\n" "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." @@ -5646,6 +6152,11 @@ msgstr "Incorporeo" 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" @@ -5658,14 +6169,6 @@ msgstr "Intervallo NodeTimer" msgid "Noises" msgstr "Rumori" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Campionamento normalmap" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Intensità normalmap" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Numero di thread emerge" @@ -5688,8 +6191,8 @@ msgstr "" "- Selezione automatica. Il numero di thread di comparsa sarà\n" "- 'numero di processori - 2', con un limite inferiore di 1.\n" "Qualsiasi altro valore:\n" -"- Specifica il numero di thread di comparsa, con un limite inferiore di 1." -"\n" +"- Specifica il numero di thread di comparsa, con un limite inferiore di " +"1.\n" "AVVISO: Aumentare il numero dei thread di comparsa aumenta la velocità del " "motore\n" "del generatore di mappe, ma questo potrebbe danneggiare le prestazioni del " @@ -5701,22 +6204,14 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Numero di blocchi extra che possono essere caricati da /clearobjects in una " "volta.\n" -"Questo è un controbilanciare tra spesa di transazione sqlite e\n" +"Questo è un compromesso tra spesa di transazione sqlite e\n" "consumo di memoria (4096 = 100MB, come regola generale)." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Numero di iterazioni dell'occlusione di parallasse." - -#: 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" @@ -5724,12 +6219,8 @@ msgstr "Liquidi opachi" #: src/settings_translation_file.cpp msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "Opacità (alfa) dell'ombra dietro il carattere predefinito, tra 0 e 255." - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "Opacità (alfa) dell'ombra dietro il carattere di riserva, tra 0 e 255." +msgstr "" +"Opacità (alfa) dell'ombra dietro il carattere predefinito, tra 0 e 255." #: src/settings_translation_file.cpp msgid "" @@ -5741,48 +6232,16 @@ msgstr "" "mette in pausa se è aperta una finestra di dialogo." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" -"Deviazione complessiva dell'effetto di occlusione di parallasse, solitamente " -"scala/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Scala globale dell'effetto di occlusione di parallasse." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Parallax Occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Deviazione dell'occlusione di parallasse" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Iterazioni dell'occlusione di parallasse" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Modalità dell'occlusione di parallasse" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Scala dell'occlusione di parallasse" +msgid "Optional override for chat weblink color." +msgstr "Sovrascrittura opzionale per i colori dei link web in chat." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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." @@ -5791,7 +6250,7 @@ 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 "" -"Percorso dove salvare le schermate. Può essere un percorso assoluto o " +"Percorso dove salvare gli screenshot. Può essere un percorso assoluto o " "relativo.\n" "La cartella sarà create se non esiste già." @@ -5800,42 +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 immagini. Tutte le immagini vengono cercate a " -"partire da qui." +"Percorso dell'indirizzo contenente le textures. Tutte le textures vengono " +"cercate a partire da qui." #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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." @@ -5857,11 +6305,19 @@ msgstr "Fisica" #: src/settings_translation_file.cpp msgid "Pitch move key" -msgstr "Modalità movimento pendenza" +msgstr "Modalità inclinazione movimento" #: src/settings_translation_file.cpp msgid "Pitch move mode" -msgstr "Modalità movimento pendenza" +msgstr "Modalità inclinazione movimento" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Tasto piazza" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Intervallo di ripetizione per il piazzamento" #: src/settings_translation_file.cpp msgid "" @@ -5871,10 +6327,6 @@ msgstr "" "Il giocatore può volare senza essere soggetto alla gravità.\n" "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" @@ -5883,6 +6335,10 @@ msgstr "Distanza di trasferimento del giocatore" msgid "Player versus player" msgstr "Giocatore contro giocatore" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Filtraggio Poisson" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5926,11 +6382,7 @@ msgstr "Generatore di profili" #: src/settings_translation_file.cpp msgid "Profiler toggle key" -msgstr "Tasto di scelta del generatore di profili" - -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Generazione di profili" +msgstr "Tasto di (dis)attivazione del generatore di profili" #: src/settings_translation_file.cpp msgid "Prometheus listener address" @@ -5939,18 +6391,19 @@ msgstr "Indirizzo del listener Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"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" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." -msgstr "Proporzione delle grotte di grandi dimensioni che contiene del liquido." +msgstr "" +"Proporzione delle grotte di grandi dimensioni che contiene del liquido." #: src/settings_translation_file.cpp msgid "" @@ -6052,10 +6505,6 @@ msgstr "Dimensione del rumore dei crinali montani" msgid "Right key" msgstr "Tasto des." -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Intervallo di ripetizione del click destro" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Profondità dell'alveo dei fiumi" @@ -6133,6 +6582,11 @@ msgstr "" "rimpicciolimento, al costo di sfocare alcuni pixel di punta\n" "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" @@ -6143,15 +6597,15 @@ msgstr "Larghezza dello schermo" #: src/settings_translation_file.cpp msgid "Screenshot folder" -msgstr "Cartella delle schermate" +msgstr "Cartella degli screenshot" #: src/settings_translation_file.cpp msgid "Screenshot format" -msgstr "Formato delle schermate" +msgstr "Formato degli screenshot" #: src/settings_translation_file.cpp msgid "Screenshot quality" -msgstr "Qualità delle schermate" +msgstr "Qualità degli screenshot" #: src/settings_translation_file.cpp msgid "" @@ -6159,10 +6613,15 @@ msgid "" "1 means worst quality; 100 means best quality.\n" "Use 0 for default quality." msgstr "" -"Qualità delle schermate. Usata solo per il formato JPEG.\n" -"1 significa qualità peggiore, 100 significa qualità migliore.\n" +"Qualità degli screenshot. Usata solo per il formato JPEG.\n" +"1 significa la qualità peggiore, 100 quella migliore.\n" "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" @@ -6177,10 +6636,6 @@ msgstr "" 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" @@ -6240,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" @@ -6267,10 +6733,20 @@ msgstr "Porta del server" 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" @@ -6284,11 +6760,54 @@ 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 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" +"Un valore basso significa avere ombre chiare, un valore alto significa avere " +"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: 15.0" +msgstr "" +"Imposta la dimensione del raggio delle ombre morbide.\n" +"Valori bassi significano ombre nitide, valori alti significano ombre " +"morbide.\n" +"Valore minimo: 1.0; Valore massimo: 10.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Imposta l'inclinazione dell'orbita del Sole/Luna in gradi.\n" +"Il valore 0 significa nessuna inclinazione/orbita verticale.\n" +"Valore minimo: 0.0; valore massimo: 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Impostata su vero abilita la Mappatura delle ombre.\n" +"Necessita l'attivazione degli shader." + #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving leaves.\n" @@ -6302,8 +6821,8 @@ msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"Impostata su vero abilita i liquidi ondeggianti (come, ad esempio, l'acqua)." -"\n" +"Impostata su vero abilita i liquidi ondeggianti (come, ad esempio, " +"l'acqua).\n" "Necessita l'attivazione degli shader." #: src/settings_translation_file.cpp @@ -6314,6 +6833,16 @@ msgstr "" "Impostata su vero abilita le piante ondeggianti.\n" "Necessita l'attivazione degli shader." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Imposta la qualità della textura dell'ombra a 32 bit.\n" +"Su falso, 16 bit di texture saranno utilizzati.\n" +"Questo può causare molti più artefatti nell'ombra." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Percorso shader" @@ -6330,6 +6859,23 @@ msgstr "" "le prestazioni su alcune schede video.\n" "Ciò funziona solo col supporto video OpenGL." +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "Qualità filtro ombra" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" +"Distanza massima della mappa delle ombre nei nodi per renderizzare le ombre" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "Texture della mappa delle ombre in 32 bit" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Dimensione della texture della mappa d'ombra" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6339,12 +6885,9 @@ msgstr "" "allora l'ombra non sarà disegnata." #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"Scarto (in pixel) dell'ombreggiatura del carattere di riserva. Se è 0, " -"allora l'ombra non sarà disegnata." +#, fuzzy +msgid "Shadow strength gamma" +msgstr "Intensità dell'ombra" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6358,6 +6901,18 @@ msgstr "Mostra le informazioni di debug" msgid "Show entity selection boxes" msgstr "Mostrare le aree di selezione delle entità" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Mostra la casella di selezione delle entità\n" +"È necessario riavviare dopo aver cambiato questo." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Mostra lo sfondo dell'etichetta del nome per impostazione predefinita" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Messaggio di chiusura" @@ -6389,6 +6944,10 @@ msgstr "" "Aumentandola si incrementerà l'impatto percentuale sulla cache, diminuendo\n" "i dati copiati dal thread principale, riducendo così lo sfarfallio." +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Inclinazione dell'orbita di un corpo celeste" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "Fetta w" @@ -6440,28 +6999,24 @@ msgstr "Rende fluida la rotazione della telecamera. 0 per disattivare." #: src/settings_translation_file.cpp msgid "Sneak key" -msgstr "Tasto striscia" +msgstr "Tasto furtivo" #: src/settings_translation_file.cpp msgid "Sneaking speed" -msgstr "Velocità di strisciamento" +msgstr "Velocità furtiva" #: src/settings_translation_file.cpp msgid "Sneaking speed, in nodes per second." msgstr "Velocità furtiva, in nodi al secondo." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Raggio dell'ombra morbida" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Audio" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Tasto speciale" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Tasto speciale per arrampicarsi/scendere" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6485,6 +7040,19 @@ msgstr "" "Si noti che mod o giochi possono impostare esplicitamente una pila per " "alcuni (o tutti) gli oggetti." +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Diffondi un aggiornamento completo della mappa d'ombra su un certo numero di " +"frame.\n" +"Valori alti potrebbero rendere le ombre laggose, valori bassi\n" +"consumeranno più risorse.\n" +"Valore minimo: 1; valore massimo: 16" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6515,10 +7083,6 @@ msgstr "Rumore della diffusione del passo montano" msgid "Strength of 3D mode parallax." msgstr "Intensità della parallasse della modalità 3D." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Intensità delle normalmap generate." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6554,8 +7118,8 @@ msgstr "" "di terra fluttuante.\n" "L'acqua è disabilitata in modo predefinito e sarà posizionata se questo " "valore è impostato\n" -"al di sopra di 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (l'inizio dell'" -"affusolamento\n" +"al di sopra di 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (l'inizio " +"dell'affusolamento\n" "superiore).\n" "***AVVISO, PERICOLO POTENZIALE PER MONDI E PRESTAZIONI SERVER***:\n" "Quando si abilita il posizionamento dell'acqua, le terre fluttuanti devono " @@ -6575,6 +7139,11 @@ msgstr "SQLite sincronizzato" 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" @@ -6621,7 +7190,17 @@ msgstr "Rumore di continuità del terreno" #: src/settings_translation_file.cpp msgid "Texture path" -msgstr "Percorso delle immagini" +msgstr "Percorso delle texture" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Dimensione della texture su cui renderizzare la mappa d'ombra.\n" +"Questa deve essere una potenza di due.\n" +"Valori alti creano ombre migliori ma è anche molto costoso." #: src/settings_translation_file.cpp msgid "" @@ -6632,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 immagini 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" @@ -6645,6 +7224,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "L'URL per il deposito dei contenuti" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "Il punto cieco del joystick" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6688,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 "" @@ -6719,27 +7302,28 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Il motore di resa per Irrlicht.\n" +"Il rendering di back-end.\n" "Dopo averlo cambiato è necessario un riavvio.\n" -"Nota: su Android, si resti con OGLES1 se incerti! Altrimenti l'app potrebbe " +"Nota: su Android, restare con OGLES1 se incerti! Altrimenti l'app potrebbe " "non partire.\n" -"Su altre piattaforme, si raccomanda OpenGL, ed è attualmente l'unico driver\n" -"con supporto degli shader." +"Su altre piattaforme, si raccomanda OpenGL\n" +"Gli shader sono supportati da OpenGL (solo su desktop) e OGLES2 " +"(sperimentale)" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"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 "" @@ -6768,6 +7352,14 @@ msgstr "" "scaricando gli oggetti della vecchia coda. Un valore di 0 disabilita la " "funzionalità." +#: 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 "" +"Il budget di tempo ha consentito agli ABM per eseguire ogni passaggio\n" +"(come frazione dell'intervallo ABM)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6778,12 +7370,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"Il tempo in secondi richiesto tra click destri ripetuti quando\n" -"si tiene premuto il tasto destro del mouse." +"Il tempo in secondi che intercorre tra il piazzamento dei nodi quando si " +"tiene\n" +"premuto il pulsante piazza." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6795,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." @@ -6829,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." @@ -6847,7 +7440,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Toggle camera mode key" -msgstr "Tasto di scelta della modalità telecamera" +msgstr "Tasto di (dis)attivazione della modalità telecamera" #: src/settings_translation_file.cpp msgid "Tooltip delay" @@ -6857,6 +7450,19 @@ msgstr "Ritardo dei suggerimenti" 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 msgid "Trees noise" msgstr "Rumore degli alberi" @@ -6930,27 +7536,52 @@ 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 immagini 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 immagini." +msgstr "Usare il filtraggio bilineare quando si ridimensionano le textures." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 immagini. Potrebbe aumentare " +"Usare il mipmapping per ridimensionare le textures. Potrebbe aumentare " "leggermente le prestazioni,\n" -"specialmente quando si usa una raccolta di immagini 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 "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Utilizzare l'antialiasing multi-campione (MSAA) per smussare i bordi del " +"blocco.\n" +"Questo algoritmo uniforma la visualizzazione 3D mantenendo l'immagine " +"nitida,\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" +"È necessario riavviare dopo aver modificato questa opzione." #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." -msgstr "Usare il filtraggio trilineare quando si ridimensionano le immagini." +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" @@ -7050,8 +7681,8 @@ msgid "Viewing range" msgstr "Raggio visivo" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Il joystick virtuale attiva il pulsante aux" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Il joystick virtuale aziona il pulsante \"Speciale\"" #: src/settings_translation_file.cpp msgid "Volume" @@ -7129,6 +7760,10 @@ msgstr "Lunghezza d'onda dei liquidi ondulanti" msgid "Waving plants" msgstr "Piante ondeggianti" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Colore del link web" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7150,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 immagini dall'hardware." +"non supportano correttamente lo scaricamento delle textures dall'hardware." #: src/settings_translation_file.cpp msgid "" @@ -7158,42 +7793,39 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "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 immagini a " -"bassa risoluzione\n" -"possono essere sfocate, così si esegue l'upscaling automatico con " -"l'interpolazione nearest-neighbor\n" -"per conservare pixel chiari. Questo imposta la dimensione minima delle " -"immagini\n" -"per le immagini upscaled; valori più alti hanno un aspetto più nitido, ma " -"richiedono più memoria.\n" -"Sono raccomandate le potenze di 2. Impostarla a un valore maggiore di 1 " -"potrebbe non avere\n" -"un effetto visibile, a meno che il filtraggio bilineare/trilineare/" -"anisotropico sia 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 msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Se si usano caratteri FreeType, richiede la compilazione col supporto " -"FreeType.\n" -"Se disabilitati, si utilizzano invece i caratteri bitmap e XML vettoriali." +"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." msgstr "" -"Se le animazioni delle immagini dei nodi dovrebbero essere asincrone per " +"Se le animazioni delle texture dei nodi dovrebbero essere asincrone per " "blocco mappa." #: src/settings_translation_file.cpp @@ -7214,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 @@ -7231,10 +7863,18 @@ msgstr "" "Se silenziare i suoni. È possibile de-silenziare i suoni in qualsiasi " "momento, a meno che\n" "il sistema audio non sia disabilitato (enable_sound=false).\n" -"Nel gioco, puoi alternare lo stato silenziato col tasto di silenzio o " -"usando\n" +"Nel gioco, puoi alternare lo stato silenziato col tasto muta o usando\n" "il menu di 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)." @@ -7243,8 +7883,10 @@ msgstr "" "premere F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Componente larghezza della dimensione iniziale della finestra." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Componente larghezza della dimensione iniziale della finestra. Ignorata in " +"modalità a schermo intero." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7265,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 @@ -7281,19 +7923,19 @@ msgid "" "See also texture_min_size.\n" "Warning: This option is EXPERIMENTAL!" msgstr "" -"Le immagini 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 una raccolta di immagini\n" -"progettata specificamente; con questa opzione, il client prova a stabilire " -"automaticamente la scala\n" -"basandosi sulla dimensione dell'immagine.\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à immagini allineate al mondo" +msgstr "Modalità delle textures allineate al mondo" #: src/settings_translation_file.cpp msgid "Y of flat ground." @@ -7349,136 +7991,38 @@ msgstr "Livello Y del terreno inferiore e del fondale marino." 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 +msgid "cURL interactive timeout" +msgstr "Scadenza interattiva cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Limite parallelo cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Scadenza cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "- Modalità creativa: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Scegli cinematica" - -#~ msgid "Select Package File:" -#~ msgstr "Seleziona pacchetto file:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Y del limite superiore della lava nelle caverne grandi." - -#~ msgid "Waving Water" -#~ msgstr "Acqua ondeggiante" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Se i sotterranei saltuariamente si protendono dal terreno." - -#~ msgid "Projecting dungeons" -#~ msgstr "Sotterranei protundenti" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Livello Y a cui si estendono le ombre delle terre fluttuanti." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "" -#~ "Livello Y del punto medio delle terre fluttuanti e della superficie dei " -#~ "laghi." - -#~ msgid "Waving water" -#~ msgstr "Acqua ondeggiante" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variazione dell'altezza delle colline, e della profondità dei laghi sul\n" -#~ "terreno uniforme delle terre fluttuanti." +#~ msgid "- Damage: " +#~ msgstr "- Ferimento: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Altezza massima tipica, sopra e sotto il punto medio, delle montagne dei " -#~ "terreni fluttuanti." +#~ "0 = occlusione di parallasse con informazione di inclinazione (più " +#~ "veloce).\n" +#~ "1 = relief mapping (più lenta, più accurata)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Questo carattere sarà usato per certe Lingue." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Intensità dell'aumento mediano della curva di luce." - -#~ msgid "Shadow limit" -#~ msgstr "Limite dell'ombra" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Percorso del carattere TrueType o bitmap." - -#~ msgid "Lightness sharpness" -#~ msgstr "Nitidezza della luminosità" - -#~ msgid "Lava depth" -#~ msgstr "Profondità della lava" - -#~ msgid "IPv6 support." -#~ msgstr "Supporto IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Trasparenza ombreggiatura carattere (opacità, tra 0 e 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Altezza delle montagne delle terre fluttuanti" - -#~ msgid "Floatland base height noise" -#~ msgstr "Rumore base dell'altezza delle terre fluttuanti" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Attiva il filmic tone mapping" - -#~ msgid "Enable VBO" -#~ msgstr "Abilitare i VBO" - -#~ msgid "" -#~ "Deprecated, define and locate cave liquids using biome definitions " -#~ "instead.\n" -#~ "Y of upper limit of lava in large caves." -#~ msgstr "" -#~ "Sconsigliato, va usata la definizione del bioma per definire e " -#~ "posizionare le caverne di liquido.\n" -#~ "Limite verticale della lava nelle caverne grandi." - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Definisce aree di terreno uniforme nelle terre fluttuanti.\n" -#~ "Le terre fluttuanti uniformi avvengono quando il rumore è > 0." - -#~ msgid "Darkness sharpness" -#~ msgstr "Nitidezza dell'oscurità" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Controlla la larghezza delle gallerie, un valore più piccolo crea " -#~ "gallerie più larghe." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Controlla la densità delle terre fluttuanti di tipo montuoso.\n" -#~ "È uno spostamento di rumore aggiunto al valore del rumore " -#~ "'mgv7_np_mountain'." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Centro dell'aumento mediano della curva della luce." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Modifica il restringimento superiore e inferiore rispetto al punto " -#~ "mediano delle terre fluttuanti di tipo montagnoso." +#~ msgid "Address / Port" +#~ msgstr "Indirizzo / Porta" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7489,20 +8033,452 @@ msgstr "Scadenza cURL" #~ "sono più chiari.\n" #~ "Questa impostazione è solo per il client ed è ignorata dal server." -#~ msgid "Path to save screenshots at." -#~ msgstr "Percorso dove salvare le schermate." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Modifica il restringimento superiore e inferiore rispetto al punto " +#~ "mediano delle terre fluttuanti di tipo montagnoso." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Intensità dell'occlusione di parallasse" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Limite di code emerge su disco" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Scaricamento e installazione di $1, attendere prego..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Sei sicuro di azzerare il tuo mondo locale?" #~ 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." + +#~ msgid "Bump Mapping" +#~ msgstr "Bump Mapping" + +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmapping" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Centro dell'aumento mediano della curva della luce." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Cambia l'UI del menu principale:\n" +#~ "- Completa: mondi locali multipli, scelta del gioco, selettore " +#~ "pacchetti texture, ecc.\n" +#~ "- Semplice: un mondo locale, nessun selettore di gioco o pacchetti " +#~ "grafici.\n" +#~ "Potrebbe servire per gli schermi più piccoli." + +#~ msgid "Config mods" +#~ msgstr "Config mod" + +#~ 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." +#~ msgstr "" +#~ "Controlla la densità delle terre fluttuanti di tipo montuoso.\n" +#~ "È uno spostamento di rumore aggiunto al valore del rumore " +#~ "'mgv7_np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Controlla la larghezza delle gallerie, un valore più piccolo crea " +#~ "gallerie più larghe." + +#~ msgid "Credits" +#~ msgstr "Riconoscimenti" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Colore del mirino (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Danno fisico abilitato" + +#~ msgid "Darkness sharpness" +#~ msgstr "Nitidezza dell'oscurità" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Scadenza predefinita per cURL, fissata in millisecondi.\n" +#~ "Ha effetto solo se Minetest è stato compilato con cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Definisce aree di terreno uniforme nelle terre fluttuanti.\n" +#~ "Le terre fluttuanti uniformi avvengono quando il rumore è > 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "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" +#~ "Y of upper limit of lava in large caves." +#~ msgstr "" +#~ "Sconsigliato, va usata la definizione del bioma per definire e " +#~ "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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Attiva il bumpmapping per le texture. È necessario fornire le normalmap\n" +#~ "con i pacchetti texture, o devono essere generate automaticamente.\n" +#~ "Necessita l'attivazione degli shader." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Attiva il filmic tone mapping" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Attiva la generazione istantanea delle normalmap (effetto rilievo).\n" +#~ "Necessita l'attivazione del bumpmapping." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "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." +#~ msgstr "" +#~ "Opzione sperimentale, potrebbe causare spazi visibili tra i blocchi\n" +#~ "quando impostata su numeri maggiori di 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS nel menu di pausa" + +#~ msgid "Fallback font shadow" +#~ msgstr "Ombreggiatura del carattere di ripiego" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Trasparenza del carattere di ripiego" + +#~ 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" + +#~ msgid "Floatland mountain height" +#~ msgstr "Altezza delle montagne delle terre fluttuanti" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Trasparenza ombreggiatura carattere (opacità, tra 0 e 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Dimensione carattere del carattere di ripiego, in punti (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Caratteri FreeType" + +#~ msgid "Full screen BPP" +#~ msgstr "BPP dello schermo intero" + +#~ msgid "Game" +#~ msgstr "Gioco" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Genera Normal Map" + +#~ 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" + +#~ msgid "Lightness sharpness" +#~ msgstr "Nitidezza della luminosità" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Limite di code emerge su disco" + +#~ msgid "Main" +#~ msgstr "Principale" + +#~ msgid "Main menu style" +#~ msgstr "Stile del menu principale" + +#~ 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" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minimappa in modalità radar, ingrandimento x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minimappa in modalità superficie, ingrandimento x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minimappa in modalità superficie, ingrandimento x4" + +#~ msgid "Name / Password" +#~ msgstr "Nome / Password" + +#~ msgid "Name/Password" +#~ msgstr "Nome/Password" + +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Campionamento normalmap" + +#~ msgid "Normalmaps strength" +#~ msgstr "Intensità normalmap" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Numero di iterazioni dell'occlusione di parallasse." + #~ msgid "Ok" #~ msgstr "OK" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Opacità (alfa) dell'ombra dietro il carattere di riserva, tra 0 e 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "" +#~ "Deviazione complessiva dell'effetto di occlusione di parallasse, " +#~ "solitamente scala/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Scala globale dell'effetto di occlusione di parallasse." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax Occlusion" + +#~ msgid "Parallax occlusion" +#~ msgstr "Parallax Occlusion" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Deviazione dell'occlusione di parallasse" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Iterazioni dell'occlusione di parallasse" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Modalità dell'occlusione di parallasse" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Scala dell'occlusione di parallasse" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Intensità dell'occlusione di parallasse" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Percorso del carattere TrueType o bitmap." + +#~ 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" + +#~ msgid "PvP enabled" +#~ msgstr "PvP abilitato" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Azzera mondo locale" + +#~ msgid "Select Package File:" +#~ msgstr "Seleziona pacchetto file:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Server / Gioco locale" + +#~ msgid "Shadow limit" +#~ msgstr "Limite dell'ombra" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Scarto (in pixel) dell'ombreggiatura del carattere di riserva. Se è 0, " +#~ "allora l'ombra non sarà disegnata." + +#~ msgid "Special" +#~ msgstr "Speciale" + +#~ msgid "Special key" +#~ msgstr "Tasto speciale" + +#~ msgid "Start Singleplayer" +#~ msgstr "Avvia in locale" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Intensità delle normalmap generate." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Intensità dell'aumento mediano della curva di luce." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Questo carattere sarà usato per certe Lingue." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Per abilitare gli shader si deve usare il driver OpenGL." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Scegli cinematica" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Altezza massima tipica, sopra e sotto il punto medio, delle montagne dei " +#~ "terreni fluttuanti." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variazione dell'altezza delle colline, e della profondità dei laghi sul\n" +#~ "terreno uniforme delle terre fluttuanti." + +#~ msgid "View" +#~ msgstr "Vedi" + +#~ msgid "Waving Water" +#~ msgstr "Acqua ondeggiante" + +#~ msgid "Waving water" +#~ msgstr "Acqua ondeggiante" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Se si usano caratteri FreeType, richiede la compilazione col supporto " +#~ "FreeType.\n" +#~ "Se disabilitati, si utilizzano invece i caratteri bitmap e XML vettoriali." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Se i sotterranei saltuariamente si protendono dal terreno." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Y del limite superiore della lava nelle caverne grandi." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "" +#~ "Livello Y del punto medio delle terre fluttuanti e della superficie dei " +#~ "laghi." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Livello Y a cui si estendono le ombre delle terre fluttuanti." + +#~ 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" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/ja/minetest.po b/po/ja/minetest.po index f274682c4..bb80f775a 100644 --- a/po/ja/minetest.po +++ b/po/ja/minetest.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: Japanese (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-15 22:41+0000\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-07-31 17:28+0000\n" "Last-Translator: BreadW <toshiharu.uno@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/minetest/" "minetest/ja/>\n" @@ -12,7 +12,43 @@ 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.1\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "アウト チャット キューをクリアする" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "空のコマンドです。" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "メインメニューに戻る" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "無効なコマンド: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "発行されたコマンド: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "オンラインプレーヤーを一覧表示する" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "オンラインプレイヤー: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "アウトチャットキューは空になりました。" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "このコマンドはサーバによって無効にされています。" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +58,41 @@ msgstr "リスポーン" msgid "You died" msgstr "死んでしまった" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "使用可能なコマンド:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "使用可能なコマンド: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "コマンドは使用できません: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[all | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "OK" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<利用できません>" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Luaスクリプトでエラーが発生しました:" @@ -44,11 +111,35 @@ msgstr "再接続" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "サーバが再接続を要求しました:" +msgstr "サーバーが再接続を要求しました:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "読み込み中..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "新しいバージョン $1 が利用可能" + +#: builtin/mainmenu/common.lua +msgid "Client Mods" +msgstr "クライアント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 "" +"インストール済みバージョン: $1\n" +"新バージョン: $2\n" +"$3 にアクセスして、最新バージョンを入手し、機能とバグ修正を最新の状態に保つ方" +"法を確認してください。" + +#: builtin/mainmenu/common.lua +msgid "Later" +msgstr "あとで" + +#: builtin/mainmenu/common.lua +msgid "Never" +msgstr "しない" #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " @@ -56,15 +147,15 @@ msgstr "プロトコルのバージョンが一致していません。 " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "サーバはバージョン$1のプロトコルを強制しています。 " +msgstr "サーバーはバージョン$1のプロトコルを強制しています。 " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " -msgstr "サーバは$1から$2までのプロトコルのバージョンをサポートしています。 " +msgstr "サーバーは$1から$2までのプロトコルのバージョンをサポートしています。 " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "インターネット接続を確認し、公開サーバ一覧を再有効化してください。" +msgid "Visit website" +msgstr "ウェブサイトを見る" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -74,19 +165,28 @@ msgstr "プロトコルはバージョン$1のみをサポートしています msgid "We support protocol versions between version $1 and $2." msgstr "バージョン$1から$2までのプロトコルをサポートしています。" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "キャンセル" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" -msgstr "依存関係:" +msgstr "依存MOD:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable all" @@ -94,7 +194,7 @@ msgstr "すべて無効化" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "Modパック無効化" +msgstr "MODパック無効化" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -102,27 +202,26 @@ msgstr "すべて有効化" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" -msgstr "Modパック有効化" +msgstr "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 "" -"許可されていない文字が含まれているため、Mod \"$1\" を有効にできませんでした。" +msgstr "許可されていない文字が含まれているため、MOD \"$1\" を有効にできませんでした。" "許可される文字は [a-z0-9_] のみです。" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "他のModを探す" +msgstr "他のMODを探す" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" -msgstr "Mod:" +msgstr "MOD:" #: builtin/mainmenu/dlg_config_world.lua msgid "No (optional) dependencies" -msgstr "(任意)依存関係なし" +msgstr "(任意) 依存MODなし" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." @@ -130,19 +229,19 @@ msgstr "ゲームの説明がありません。" #: builtin/mainmenu/dlg_config_world.lua msgid "No hard dependencies" -msgstr "依存関係なし" +msgstr "必須依存MODなし" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." -msgstr "Modパックの説明がありません。" +msgstr "MODパックの説明がありません。" #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" -msgstr "任意依存関係なし" +msgstr "任意依存MODなし" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" -msgstr "任意:" +msgstr "任意依存MOD:" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp @@ -157,13 +256,53 @@ msgstr "ワールド:" msgid "enabled" msgstr "有効" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "「$1」はすでに存在します。上書きしますか?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 と依存MOD $2 がインストールされます。" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 by $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 ダウンロード中、\n" +"$2 ダウンロード待機中" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 ダウンロード中..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 つの必要な依存MODが見つかりませんでした。" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 がインストールされ、依存MOD $2 はスキップされます。" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "すべて" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "インストール済み" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" -msgstr "メインメニューへ戻る" +msgstr "メインメニューへ" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "基盤ゲーム:" #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" @@ -178,7 +317,6 @@ msgid "Failed to download $1" msgstr "$1のダウンロードに失敗" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "ゲーム" @@ -187,9 +325,20 @@ msgid "Install" msgstr "入手" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "$1 のインストール" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "不足依存MODインストール" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "インストール: 非対応のファイル形式か、壊れたアーカイブ" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" -msgstr "Mod" +msgstr "MOD" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" @@ -200,9 +349,24 @@ msgid "No results" msgstr "何も見つかりませんでした" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "検索" +msgid "No updates" +msgstr "更新なし" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "見つかりません" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "上書き" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "基盤となるゲームが正しいかどうか確認してください。" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "待機中" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -217,12 +381,16 @@ msgid "Update" msgstr "更新" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "見る" +msgid "Update All [$1]" +msgstr "すべて更新 [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Webブラウザで詳細を見る" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "ワールド名「$1」は既に存在します" +msgstr "ワールド名「$1」はすでに存在します" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" @@ -261,12 +429,8 @@ 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からダウンロードしてください" +msgid "Development Test is meant for developers." +msgstr "Development Testは開発者用です。" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -282,11 +446,7 @@ 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" @@ -304,6 +464,14 @@ msgstr "湿気のある川" msgid "Increases humidity around rivers" msgstr "川周辺の湿度を上げる" +#: builtin/mainmenu/dlg_create_world.lua +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 "湖" @@ -369,7 +537,7 @@ msgstr "バイオーム間の円滑な移行" msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" -msgstr "地形上に現れる構造物(v6によって生成された木やジャングルの草に影響なし)" +msgstr "地形上に現れる構造物 (v6によって生成された木やジャングルの草に影響なし)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" @@ -403,10 +571,6 @@ msgstr "川の深さを多様にする" 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 "警告: The Development Testは開発者用です。" - #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "ワールド名" @@ -437,21 +601,50 @@ 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 "$1 に参加する" + +#: 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 msgid "Accept" msgstr "決定" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Modパック名を変更:" +msgstr "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 "" -"このModパックは、modpack.conf に明示的な名前が付けられており、ここでの名前変" -"更をすべて上書きします。" +msgstr "このMODパックは、modpack.conf " +"に明示的な名前が付けられており、ここでの名前変更をすべて上書きします。" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" @@ -470,6 +663,14 @@ msgid "Browse" msgstr "参照" #: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Games" +msgstr "コンテンツ: ゲーム" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Mods" +msgstr "コンテンツ: MOD" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "無効" @@ -494,7 +695,7 @@ msgid "Offset" msgstr "オフセット" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "永続性" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -513,6 +714,10 @@ msgstr "初期設定に戻す" msgid "Scale" msgstr "スケール" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "検索" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "ディレクトリの選択" @@ -521,7 +726,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 "技術名称を表示" @@ -586,7 +791,7 @@ msgstr "$1 (有効)" #: builtin/mainmenu/pkgmgr.lua msgid "$1 mods" -msgstr "$1 Mod" +msgstr "$1 MOD" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" @@ -594,23 +799,15 @@ msgstr "$2へ$1をインストールできませんでした" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "Modインストール: 実際のMod名が見つかりません: $1" +msgstr "MODインストール: 実際のMOD名が見つかりません: $1" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" -msgstr "Modインストール: Modパック $1 に適したフォルダ名が見つかりません" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "インストール: \"$1\"は非対応のファイル形式か、壊れたアーカイブです" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "インストール: ファイル: \"$1\"" +msgstr "MODインストール: MODパック $1 に適したフォルダ名が見つかりません" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" -msgstr "有効なModまたはModパックが見つかりません" +msgstr "有効なMODまたはMODパックが見つかりません" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a $1 as a texture pack" @@ -622,11 +819,63 @@ msgstr "ゲームを$1としてインストールすることができません" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" -msgstr "Modを$1としてインストールすることができません" +msgstr "MODを$1としてインストールすることができません" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a modpack as a $1" -msgstr "Modパックを$1としてインストールすることができません" +msgstr "MODパックを$1としてインストールすることができません" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "読み込み中..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "公開サーバー一覧は無効" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "インターネット接続を確認し、公開サーバー一覧を再有効化してください。" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "情報" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "活動中の貢献者" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "アクティブなレンダラー:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "開発者" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" +"ファイルマネージャー/エクスプローラーで、ワールド、ゲーム、MOD、\n" +"およびテクスチャパックを含むディレクトリを開きます。" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" @@ -650,7 +899,7 @@ msgstr "インストール済みのパッケージ:" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." -msgstr "依存なし。" +msgstr "依存MODなし。" #: builtin/mainmenu/tab_content.lua msgid "No package description available" @@ -668,43 +917,19 @@ msgstr "パッケージを削除" msgid "Use Texture Pack" msgstr "テクスチャパック使用" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "活動中の貢献者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "開発者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "クレジット" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "以前の貢献者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "以前の開発者" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "公開サーバ" +msgstr "公開サーバー" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" msgstr "バインドアドレス" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "設定" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "クリエイティブモード" +msgstr "クリエイティブ" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "ダメージ有効" @@ -714,16 +939,12 @@ msgstr "ゲームホスト" #: builtin/mainmenu/tab_local.lua msgid "Host Server" -msgstr "ホストサーバ" +msgstr "ホストサーバー" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" msgstr "コンテンツDBからゲームをインストール" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "名前 / パスワード" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "新規作成" @@ -736,62 +957,82 @@ msgstr "ワールドが作成または選択されていません!" msgid "Play Game" msgstr "ゲームプレイ" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "ポート" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "MODを選択" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "ワールドを選択:" #: builtin/mainmenu/tab_local.lua msgid "Server Port" -msgstr "サーバのポート" +msgstr "サーバーのポート" #: builtin/mainmenu/tab_local.lua msgid "Start Game" msgstr "ゲームスタート" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "アドレス / ポート" +msgid "Address" +msgstr "アドレス" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "接続" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Clear" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "クリエイティブモード" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "ダメージ有効" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "ダメージ / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "お気に入り削除" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "お気に入り" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "互換性のないサーバ" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "ゲームに参加" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "名前 / パスワード" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "ログイン" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "応答速度" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP有効" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "公開サーバー" + +#: builtin/mainmenu/tab_online.lua +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" @@ -817,22 +1058,14 @@ msgstr "すべての設定" msgid "Antialiasing:" msgstr "アンチエイリアス:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "シングルプレイヤーのワールドをリセットしてよろしいですか?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" -msgstr "画面の大きさを自動保存" +msgstr "大きさを自動保存" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" msgstr "バイリニアフィルタ" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "バンプマッピング" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "キー変更" @@ -841,13 +1074,29 @@ msgstr "キー変更" msgid "Connected Glass" msgstr "ガラスを繋げる" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "動的な影" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "動的な影:" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "綺麗な葉" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "法線マップの生成" +msgid "High" +msgstr "強め" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "弱め" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "普通" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -857,10 +1106,6 @@ msgstr "ミップマップ" msgid "Mipmap + Aniso. Filter" msgstr "ミップマップと異方性フィルタ" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "いいえ" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "フィルタ無し" @@ -889,18 +1134,10 @@ msgstr "不透明な葉" msgid "Opaque Water" msgstr "不透明な水" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "視差遮蔽" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "パーティクル" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "ワールドをリセット" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "画面:" @@ -913,6 +1150,10 @@ msgstr "設定" msgid "Shaders" msgstr "シェーダー" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "シェーダー (実験的)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "シェーダー (無効)" @@ -929,22 +1170,26 @@ msgstr "滑らかな光" msgid "Texturing:" msgstr "テクスチャリング:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "シェーダーを有効にするにはOpenGLのドライバを使用する必要があります。" - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "トーンマッピング" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "タッチのしきい値: (px)" +msgid "Touch threshold (px):" +msgstr "タッチのしきい値 (px):" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "トライリニアフィルタ" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "とても強く" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "とても弱く" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "揺れる葉" @@ -957,23 +1202,11 @@ msgstr "揺れる液体" msgid "Waving Plants" msgstr "揺れる草花" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "はい" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Mod設定" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "メイン" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "シングルプレイスタート" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "接続が中断されました (プロトコル エラー?)。" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "接続がタイムアウトしました。" @@ -1002,8 +1235,8 @@ msgid "Connection error (timed out?)" msgstr "接続エラー (タイムアウト?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "以下のゲームが見つからないか読み込めません \"" +msgid "Could not find or load game: " +msgstr "ゲームが見つからないか読み込めません: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1033,18 +1266,6 @@ msgstr "パスワードファイルを開けませんでした: " msgid "Provided world path doesn't exist: " msgstr "ワールドが存在しません: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1057,14 +1278,6 @@ msgstr "" msgid "- Address: " msgstr "- アドレス: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- クリエイティブモード: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- ダメージ: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- モード: " @@ -1075,7 +1288,7 @@ msgstr "- ポート: " #: src/client/game.cpp msgid "- Public: " -msgstr "- 公開サーバ: " +msgstr "- 公開サーバー: " #. ~ PvP = Player versus Player #: src/client/game.cpp @@ -1084,7 +1297,16 @@ msgstr "- PvP: " #: src/client/game.cpp msgid "- Server Name: " -msgstr "- サーバ名: " +msgstr "- サーバー名: " + +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "シリアライズエラーが発生しました:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "アクセスが拒否されました。理由: %s" #: src/client/game.cpp msgid "Automatic forward disabled" @@ -1094,6 +1316,22 @@ msgstr "自動前進 無効" msgid "Automatic forward enabled" msgstr "自動前進 有効" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "ブロック境界線を非表示" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "すべてのブロックにブロック境界線を表示" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "現在のブロックにブロック境界を表示" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "近くのブロックにブロック境界を表示" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "カメラ更新 無効" @@ -1102,6 +1340,10 @@ msgstr "カメラ更新 無効" msgid "Camera update enabled" msgstr "カメラ更新 有効" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "ブロック境界を表示できない (MODやゲームで無効化されている)" + #: src/client/game.cpp msgid "Change Password" msgstr "パスワード変更" @@ -1114,13 +1356,21 @@ msgstr "映画風モード 無効" msgid "Cinematic mode enabled" msgstr "映画風モード 有効" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "クライアントが切断されました" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "クライアント側のスクリプトは無効" #: src/client/game.cpp msgid "Connecting to server..." -msgstr "サーバに接続中..." +msgstr "サーバーに接続中..." + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "未知の理由で接続に失敗しました" #: src/client/game.cpp msgid "Continue" @@ -1134,38 +1384,43 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" -"操作:\n" +"操作方法:\n" "- %s: 前進\n" "- %s: 後退\n" "- %s: 左移動\n" "- %s: 右移動\n" "- %s: ジャンプ/登る\n" +"- %s: 掘削/パンチ\n" +"- %s: 設置/使用\n" "- %s: スニーク/降りる\n" "- %s: アイテムを落とす\n" "- %s: インベントリ\n" "- マウス: 見回す\n" -"- 左クリック: 掘削/パンチ\n" -"- 右クリック: 設置/使用\n" -"- ホイール: アイテム選択\n" +"- マウスホイール: アイテム選択\n" "- %s: チャット\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "アドレスを解決できませんでした: %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "クライアントを作成中..." #: src/client/game.cpp msgid "Creating server..." -msgstr "サーバを作成中..." +msgstr "サーバーを作成中..." #: src/client/game.cpp msgid "Debug info and profiler graph hidden" @@ -1215,6 +1470,11 @@ msgstr "視野無制限 無効" msgid "Enabled unlimited viewing range" msgstr "視野無制限 有効" +#: src/client/game.cpp +#, c-format +msgid "Error creating client: %s" +msgstr "クライアント作成中にエラー: %s" + #: src/client/game.cpp msgid "Exit to Menu" msgstr "メインメニュー" @@ -1265,7 +1525,7 @@ msgstr "ポーズメニュー" #: src/client/game.cpp msgid "Hosting server" -msgstr "ホスティングサーバ" +msgstr "ホスティングサーバー" #: src/client/game.cpp msgid "Item definitions..." @@ -1285,35 +1545,11 @@ msgstr "MiB/秒" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "ミニマップは現在ゲームまたはModにより無効" +msgstr "ミニマップは現在ゲームまたはMODにより無効" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "ミニマップ 非表示" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "ミニマップ レーダーモード、ズーム x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "ミニマップ レーダーモード、ズーム x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "ミニマップ レーダーモード、ズーム x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "ミニマップ 表面モード、ズーム x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "ミニマップ 表面モード、ズーム x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "ミニマップ 表面モード、ズーム x4" +msgid "Multiplayer" +msgstr "マルチプレイヤー" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1353,7 +1589,7 @@ msgstr "観測記録グラフ 表示" #: src/client/game.cpp msgid "Remote server" -msgstr "リモートサーバ" +msgstr "リモートサーバー" #: src/client/game.cpp msgid "Resolving address..." @@ -1387,6 +1623,21 @@ msgstr "このビルドではサウンド システムがサポートされて msgid "Sound unmuted" msgstr "消音 取り消し" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "サーバーが別のバージョン %s を実行している可能性があります。" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "IPv6が無効なため、%sに接続できません" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "IPv6が無効なため、%sでリッスンできません" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1413,7 +1664,7 @@ msgstr "ワイヤーフレーム 表示" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "ズームは現在ゲームまたはModにより無効" +msgstr "ズームは現在ゲームまたはMODにより無効" #: src/client/game.cpp msgid "ok" @@ -1456,10 +1707,6 @@ msgstr "Back Space" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Clear" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1482,7 +1729,7 @@ msgstr "Execute" #: src/client/keycode.cpp msgid "Help" -msgstr "Help" +msgstr "ヘルプ" #: src/client/keycode.cpp msgid "Home" @@ -1502,7 +1749,7 @@ msgstr "Esc" #: src/client/keycode.cpp msgid "IME Mode Change" -msgstr "IME Mode Change" +msgstr "IMEモード変更" #: src/client/keycode.cpp msgid "IME Nonconvert" @@ -1707,36 +1954,38 @@ msgstr "Xボタン2" msgid "Zoom" msgstr "ズーム" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "パスワードが一致しません!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "ミニマップ 非表示" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "参加登録" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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" -"あなたのパスワードを再入力してから '参加登録' をクリックしてアカウント作成す" -"るか、\n" -"キャンセルをクリックして中断してください。" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "ミニマップ レーダーモード、ズーム x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "ミニマップ 表面モード、ズーム x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "ミニマップ テクスチャモード" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "ウェブページを開けませんでした" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "ウェブページを開いています" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "決定" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "\"スペシャル\" = 降りる" #: src/gui/guiKeyChangeMenu.cpp @@ -1747,15 +1996,23 @@ msgstr "自動前進" msgid "Automatic jumping" msgstr "自動ジャンプ" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "後退" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "ブロック境界線表示切替" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "視点変更" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "チャット" @@ -1777,7 +2034,7 @@ msgstr "音量を下げる" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "\"ジャンプ\"二度押しで飛行モード切替" +msgstr "\"ジャンプ\"2回で飛行モード切替" #: src/gui/guiKeyChangeMenu.cpp msgid "Drop" @@ -1808,10 +2065,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" @@ -1841,10 +2096,6 @@ msgstr "スクリーンショット" msgid "Sneak" msgstr "スニーク" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "スペシャル" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "HUD表示切替" @@ -1885,10 +2136,6 @@ msgstr "キー入力待ち" msgid "Change" msgstr "変更" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "パスワードの確認" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "新しいパスワード" @@ -1897,6 +2144,10 @@ msgstr "新しいパスワード" msgid "Old Password" msgstr "古いパスワード" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "パスワードが一致しません!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "閉じる" @@ -1906,14 +2157,9 @@ msgid "Muted" msgstr "消音" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "音量: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "エンター " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "音量: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1922,6 +2168,16 @@ msgstr "エンター " msgid "LANG_CODE" msgstr "ja" +#: 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" @@ -1932,13 +2188,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) バーチャルパッドを使用して\"aux\"ボタンを起動します。\n" +"(Android) バーチャルパッドを使用して\"Aux1\"ボタンを起動します。\n" "有効にした場合、バーチャルパッドはメインサークルから外れたときにも\n" -"\"aux\"ボタンをタップします。" +"\"Aux1\"ボタンをタップします。" #: src/settings_translation_file.cpp msgid "" @@ -1951,8 +2207,8 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" -"(X,Y,Z)ワールドの中心からのフラクタルの「スケール」単位のオフセット。\n" -"目的のポイントを(0,0)に移動して適切なスポーンポイントを作成したり、\n" +"(X,Y,Z) ワールドの中心からのフラクタルの「スケール」単位のオフセット。\n" +"目的のポイントを (0,0) に移動して適切なスポーンポイントを作成したり、\n" "「スケール」を増やして目的のポイントに「ズームイン」したりするために\n" "使用できます。\n" "既定のパラメータを使用してマンデルブロ集合の適切なスポーンポイントに\n" @@ -1977,14 +2233,6 @@ msgstr "" "既定値は島に適した垂直方向に押しつぶされた形状のためのもので、\n" "加工していないの形状のためには3つの数字をすべて等しく設定します。" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = 斜面情報付きの視差遮蔽マッピング(高速)。\n" -"1 = リリーフマッピング(正確だが低速)。" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "尾根の形状/大きさを制御する2Dノイズ。" @@ -2045,7 +2293,7 @@ msgid "" "a value range of approximately -2.0 to 2.0." msgstr "" "浮遊大陸の構造を定義する3Dノイズ。\n" -"既定から変更すると、ノイズの「スケール」(規定では 0.7)の調整が\n" +"既定から変更すると、ノイズの「スケール」 (規定では 0.7) の調整が\n" "必要になる場合があり、このノイズの値の範囲は約 -2.0 ~ 2.0 で\n" "浮遊大陸の先細りが最も良く機能します。" @@ -2089,6 +2337,10 @@ msgstr "" "- pageflip: クァドバッファベースの3Dです。\n" "interlacedはシェーダーが有効である必要があることに注意してください。" +#: 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" @@ -2099,16 +2351,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "サーバクラッシュ時に全てのクライアントへ表示するメッセージ。" +msgstr "サーバークラッシュ時にすべてのクライアントへ表示するメッセージ。" #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." -msgstr "サーバ終了時に全てのクライアントへ表示するメッセージ。" +msgstr "サーバー終了時にすべてのクライアントへ表示するメッセージ。" #: src/settings_translation_file.cpp msgid "ABM interval" msgstr "ABMの間隔" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "ABMの時間予算" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "キューに入れられたブロックが出現する絶対制限" @@ -2123,7 +2379,7 @@ msgstr "重力加速度、1秒あたりのノード数/秒です。" #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "アクティブブロックモディファイヤー(ABM)" +msgstr "アクティブブロックモディファイヤー (ABM)" #: src/settings_translation_file.cpp msgid "Active block management interval" @@ -2144,7 +2400,7 @@ msgid "" "Note that the address field in the main menu overrides this setting." msgstr "" "接続先のアドレスです。\n" -"ローカルサーバを起動する際は空白に設定してください。\n" +"ローカルサーバーを起動する際は空白に設定してください。\n" "メインメニューのアドレス欄はこの設定を上書きすることに注意してください。" #: src/settings_translation_file.cpp @@ -2158,6 +2414,11 @@ msgid "" msgstr "" "4kスクリーンなどのための、画面の解像度の設定です (非X11/Android環境のみ)。" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"検出されたディスプレイの密度を調整し、UI要素のスケーリングに使用します。" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2170,8 +2431,12 @@ msgstr "" "浮遊大陸層の密度を調整します。\n" "密度を高めるために値を増やします。正または負の値を指定できます。\n" "値 = 0.0: 50% が浮遊大陸です。\n" -"値 = 2.0('mgv7_np_floatland' によって高くなる場合があります、常に\n" -"念のためテスト)浮遊大陸層を密に作成します。" +"値 = 2.0 ('mgv7_np_floatland' によって高くなる場合があります、常に\n" +"念のためテスト) 浮遊大陸層を密に作成します。" + +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "管理者名" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2192,8 +2457,8 @@ msgstr "" "自然な夜の光にはほとんど影響を与えません。" #: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "飛行時に加速する" +msgid "Always fly fast" +msgstr "常に高速で飛行" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -2213,11 +2478,11 @@ msgstr "異方性フィルタリング" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "サーバを公開" +msgstr "サーバーを公開" #: src/settings_translation_file.cpp msgid "Announce to this serverlist." -msgstr "このサーバ一覧に告知します。" +msgstr "このサーバー一覧に告知します。" #: src/settings_translation_file.cpp msgid "Append item name" @@ -2261,15 +2526,19 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" -"この距離でサーバはどのブロックをクライアントへ送信するかを積極的に\n" +"この距離でサーバーはどのブロックをクライアントへ送信するかを積極的に\n" "最適化します。\n" -"小さい値に設定すると、レンダリングの視覚的な不具合を犠牲にして、\n" +"小さい値に設定すると、描画の視覚的な不具合を犠牲にして、\n" "パフォーマンスが大幅に向上する可能性があります(いくつかのブロックは\n" -"水中や洞窟、時には陸の上でもレンダリングされません)。\n" +"水中や洞窟、時には陸の上でも描画されません)。\n" "max_block_send_distance より大きい値に設定すると、この最適化は\n" "無効になります。 \n" "マップブロック(16ノード)で表記。" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "オーディオ" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "自動前進キー" @@ -2280,7 +2549,7 @@ msgstr "自動的に1ノードの障害物をジャンプします。" #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." -msgstr "サーバ一覧に自動的に報告します。" +msgstr "サーバー一覧に自動的に報告します。" #: src/settings_translation_file.cpp msgid "Autosave screen size" @@ -2290,6 +2559,14 @@ msgstr "画面の大きさを自動保存" msgid "Autoscaling mode" msgstr "自動拡大縮小モード" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1キー" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "昇降用のAux1キー" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "後退キー" @@ -2302,10 +2579,6 @@ msgstr "基準地上レベル" msgid "Base terrain height." msgstr "基準地形の高さ。" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "基本" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "基本的な特権" @@ -2327,21 +2600,21 @@ msgid "Bind address" msgstr "バインドアドレス" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "バイオームAPIの温度と湿度のノイズパラメータ" +msgid "Biome API noise parameters" +msgstr "バイオームAPIのノイズパラメータ" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "バイオームノイズ" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "フルスクリーンモードでのビット数(色深度)。" - #: src/settings_translation_file.cpp 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 "太字と斜体のフォントのパス" @@ -2367,8 +2640,8 @@ msgid "Builtin" msgstr "ビルトイン" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "バンプマッピング" +msgid "Camera" +msgstr "カメラ" #: src/settings_translation_file.cpp msgid "" @@ -2448,19 +2721,12 @@ msgstr "" "0.0は最小光レベル、1.0は最大光レベルです。" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"メインメニューUIを変更:\n" -"- Full: 複数のシングルプレイヤーのワールド、ゲームの選択、\n" -"テクスチャパックの選択、その他。\n" -"- Simple: 1つのシングルプレイヤーのワールド、ゲームや\n" -"テクスチャパックの選択はありません。小さな画面で必要かもしれません。" +msgid "Chat command time message threshold" +msgstr "チャットコマンド時間切れメッセージのしきい値" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "チャットコマンド" #: src/settings_translation_file.cpp msgid "Chat font size" @@ -2495,8 +2761,8 @@ msgid "Chat toggle key" msgstr "チャット切替キー" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "チャットコマンド" +msgid "Chat weblinks" +msgstr "チャットのウェブリンク" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2514,13 +2780,20 @@ msgstr "映画風モード切り替えキー" msgid "Clean transparent textures" msgstr "テクスチャの透過を削除" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "チャットコンソールの出力で、クリック可能なウェブリンク " +"(中クリックまたはCtrl+左クリック) を有効になります。" + #: src/settings_translation_file.cpp msgid "Client" msgstr "クライアント" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "クライアントとサーバ" +msgstr "クライアントとサーバー" #: src/settings_translation_file.cpp msgid "Client modding" @@ -2534,6 +2807,10 @@ msgstr "クライアント側での改造制限" 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 "上る速度" @@ -2558,6 +2835,10 @@ msgstr "メニューに雲" msgid "Colored fog" msgstr "色つきの霧" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "色つきの影" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2589,21 +2870,45 @@ 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 "" -"Modのセキュリティが有効の場合でも (request_insecure_environment() \n" +"MODのセキュリティが有効の場合でも (request_insecure_environment() \n" "を介して) 安全でない機能へのアクセスが許可されている信頼できる\n" -"Modのコンマ区切りリスト。" +"MODのコンマ区切りリスト。" #: src/settings_translation_file.cpp msgid "Command key" msgstr "コマンドキー" +#: src/settings_translation_file.cpp +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 "" +"マップブロックをディスクに保存するときに使用する圧縮レベル。\n" +"-1 - 規定の圧縮レベルを使用\n" +"0 - 最小の圧縮、最も速い\n" +"9 - 最高の圧縮、最も遅い" + +#: src/settings_translation_file.cpp +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 "" +"マップブロックをクライアントに送信するときに使用する圧縮レベル。\n" +"-1 - 規定の圧縮レベルを使用\n" +"0 - 最小の圧縮、最も速い\n" +"9 - 最高の圧縮、最も遅い" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "ガラスを繋げる" #: src/settings_translation_file.cpp msgid "Connect to external media server" -msgstr "外部メディアサーバに接続" +msgstr "外部メディアサーバーに接続" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." @@ -2621,10 +2926,18 @@ msgstr "コンソール色" msgid "Console height" msgstr "コンソールの高さ" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "コンテンツリポジトリ" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "コンテンツDBフラグのブラックリスト" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "コンテンツDBの最大同時ダウンロード数" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "コンテンツDBのURL" @@ -2656,8 +2969,12 @@ 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 "" +"アイドリング時の液体中沈下速度を制御します。負の値は\n" +"代わりに浮上します。" #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." @@ -2687,19 +3004,27 @@ msgstr "クリエイティブ" #: src/settings_translation_file.cpp msgid "Crosshair alpha" -msgstr "照準線の透過度" +msgstr "十字カーソルの透過度" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "照準線の透過 (不透明、0~255の間)。" +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"十字カーソルの透過度 (不透明、0~255の間)。\n" +"これはオブジェクトの十字カーソルにも適用されます。" #: src/settings_translation_file.cpp msgid "Crosshair color" -msgstr "照準線の色" +msgstr "十字カーソルの色" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "照準線の色 (R,G,B)。" +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"十字カーソルの色 (R,G,B)。\n" +"オブジェクト十字カーソルの色も制御" #: src/settings_translation_file.cpp msgid "DPI" @@ -2721,17 +3046,17 @@ msgstr "デバッグログファイルのサイズのしきい値" msgid "Debug log level" msgstr "デバッグログのレベル" +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "デバッグ" + #: src/settings_translation_file.cpp msgid "Dec. volume key" msgstr "音量を下げるキー" -#: 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 "専用サーバステップ" +msgstr "専用サーバーステップ" #: src/settings_translation_file.cpp msgid "Default acceleration" @@ -2767,11 +3092,14 @@ msgstr "既定のスタック数" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"cURLの既定のタイムアウト、ミリ秒で定めます。\n" -"cURLでコンパイルされた場合にのみ効果があります。" +"影フィルタの品質を定義します。\n" +"これは、PCFまたはポアソンディスクを適用することで、やわらない影効果をシミュ" +"レートするものです。\n" +"しかし、より多くのリソースを消費します。" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2801,14 +3129,6 @@ msgstr "大規模な河川構造を定義します。" msgid "Defines location and terrain of optional hills and lakes." msgstr "オプションの丘と湖の場所と地形を定義します。" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"テクスチャのサンプリング手順を定義します。\n" -"値が大きいほど、法線マップが滑らかになります。" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "基準地上レベルを定義します。" @@ -2838,7 +3158,7 @@ msgid "" "Delay between mesh updates on the client in ms. Increasing this will slow\n" "down the rate of mesh updates, thus reducing jitter on slower clients." msgstr "" -"クライアント上のメッシュ更新間の遅延(ミリ秒)。これを大きくすると\n" +"クライアント上のメッシュ更新間の遅延 (ミリ秒)。これを大きくすると\n" "メッシュの更新速度が遅くなり、低速のクライアントのジッタが減少します。" #: src/settings_translation_file.cpp @@ -2851,7 +3171,7 @@ msgstr "ツールチップを表示するまでの遅延、ミリ秒で定めま #: src/settings_translation_file.cpp msgid "Deprecated Lua API handling" -msgstr "廃止予定のLua APIの処理" +msgstr "非推奨の Lua API の処理" #: src/settings_translation_file.cpp msgid "Depth below which you'll find giant caverns." @@ -2865,7 +3185,7 @@ msgstr "これ以下の深さで大きな洞窟が見つかります。" msgid "" "Description of server, to be displayed when players join and in the " "serverlist." -msgstr "サーバの説明。プレイヤーが参加したときとサーバ一覧に表示されます。" +msgstr "サーバーの説明。プレイヤーが参加したときとサーバー一覧に表示されます。" #: src/settings_translation_file.cpp msgid "Desert noise threshold" @@ -2883,6 +3203,14 @@ msgstr "" msgid "Desynchronize block animation" msgstr "ブロックのアニメーションの非同期化" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "開発者向けオプション" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "掘削キー" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "掘削時パーティクル" @@ -2895,9 +3223,21 @@ msgstr "対チート機関無効化" msgid "Disallow empty passwords" msgstr "空のパスワードを許可しない" +#: src/settings_translation_file.cpp +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 "" +"透明度の深さの並べ替えが有効になっているノードの距離\n" +"これを使用して、透明度の深さの並べ替えによるパフォーマンスへの影響を制限" + #: src/settings_translation_file.cpp msgid "Domain name of server, to be displayed in the serverlist." -msgstr "サーバ一覧に表示されるサーバのドメイン名。" +msgstr "サーバー一覧に表示されるサーバーのドメイン名。" #: src/settings_translation_file.cpp msgid "Double tap jump for fly" @@ -2932,7 +3272,7 @@ msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" -"IPv6サポートを有効にします(クライアントとサーバーの両方に対して)。\n" +"IPv6サポートを有効にします (クライアントとサーバーの両方に対して)。\n" "機能するためにはIPv6接続が必要です。" #: src/settings_translation_file.cpp @@ -2943,25 +3283,47 @@ msgstr "" "クライアントでのLua改造サポートを有効にします。\n" "このサポートは実験的であり、APIは変わることがあります。" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"ポアソンディスクによるフィルタリングを有効にします。\n" +"true の場合、ポアソンディスクを使用して「やわらない影」を作ります。それ以外の" +"場合は、PCFフィルタリングを使用します。" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"色つきの影を有効にします。\n" +"真の半透明ノードでは、色つきの影を落とします。これは負荷が大きいです。" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "コンソールウィンドウを有効化" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "新しく作成されたマップでクリエイティブモードを有効にします。" +msgid "Enable creative mode for all players" +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 "Modチャンネルのサポートを有効にします。" +msgstr "MODチャンネルのサポートを有効にします。" #: src/settings_translation_file.cpp msgid "Enable mod security" -msgstr "Modのセキュリティを有効化" +msgstr "MODのセキュリティを有効化" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." @@ -2971,18 +3333,6 @@ msgstr "プレイヤーがダメージを受けて死亡するのを有効にし 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" @@ -2991,6 +3341,10 @@ msgstr "" "シンプルなアンビエントオクルージョンで滑らかな照明を有効にします。\n" "速度や異なる見た目のために無効にしてください。" +#: 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" @@ -3000,7 +3354,7 @@ msgid "" "expecting." msgstr "" "古いクライアントが接続できないようにします。\n" -"古いクライアントは新しいサーバに接続してもクラッシュしないという\n" +"古いクライアントは新しいサーバーに接続してもクラッシュしないという\n" "意味で互換性がありますが、期待しているすべての新機能をサポート\n" "しているわけではありません。" @@ -3011,9 +3365,9 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" -"リモートメディアサーバの使用を有効にします (サーバによって提供\n" +"リモートメディアサーバーの使用を有効にします (サーバーによって提供\n" "されている場合)。\n" -"リモートサーバはサーバに接続するときにメディア (例えば、テクスチャ) を\n" +"リモートサーバはサーバーに接続するときにメディア (例えば、テクスチャ) を\n" "ダウンロードするための非常に高速な方法を提供します。" #: src/settings_translation_file.cpp @@ -3058,17 +3412,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "インベントリのアイテムのアニメーションを有効にします。" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"テクスチャのバンプマッピングを有効にします。法線マップは\n" -"テクスチャパックによって提供されるかまたは自動生成される必要があります。\n" -"シェーダーが有効である必要があります。" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "facedir回転メッシュのキャッシングを有効にします。" @@ -3077,22 +3420,6 @@ msgstr "facedir回転メッシュのキャッシングを有効にします。" msgid "Enables minimap." msgstr "ミニマップを有効にする。" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"法線マップ生成を臨機応変に有効にします(エンボス効果)。\n" -"バンプマッピングが有効である必要があります。" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"視差遮蔽マッピングを有効にします。\n" -"シェーダーが有効である必要があります。" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3105,6 +3432,19 @@ msgstr "" "ゲーム内の音の制御は機能しなくなります。\n" "この設定を変更するには再起動が必要です。" +#: 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 "" +"ゲームのプレイアビリティに影響を与えない小さな視覚的な不具合を犠牲にして\n" +"CPU負荷を軽減するか、レンダリングパフォーマンスを向上させるトレードオフを有効" +"にします。" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "エンジンの観測記録" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "エンジンプロファイリングデータの出力間隔" @@ -3113,14 +3453,6 @@ msgstr "エンジンプロファイリングデータの出力間隔" msgid "Entity methods" msgstr "エンティティメソッド" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"実験的なオプションで、0 より大きい数値に設定すると、ブロック間に\n" -"目に見えるスペースが生じる可能性があります。" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3134,12 +3466,16 @@ msgstr "" "値 = 1.0は、均一で線形な先細りを作成します。\n" "値 > 1.0は、規定の分離された浮遊大陸に適した滑らかな先細りを\n" "作成します。\n" -"値 < 1.0(例 0.25)は、より明確な表面レベルで平坦な低地を\n" +"値 < 1.0 (例 0.25) は、より明確な表面レベルで平坦な低地を\n" "作成し、密な浮遊大陸層に適しています。" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "ポーズメニューでのFPS" +msgid "FPS" +msgstr "FPS" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "非アクティブまたはポーズメニュー表示中のFPS" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3157,18 +3493,6 @@ msgstr "落下時の上下の揺れ係数" msgid "Fallback font path" msgstr "フォールバックフォントのパス" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "フォールバックフォントの影" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "フォールバックフォントの影の透過" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "フォールバックフォントの大きさ" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "高速移動モード切替キー" @@ -3187,11 +3511,11 @@ msgstr "高速移動モード" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"高速移動 (\"スペシャル\"キーによる)。\n" -"これにはサーバ上に \"fast\" 特権が必要です。" +"高速移動 (\"Aux1\"キーによる)。\n" +"これにはサーバー上に \"fast\" 特権が必要です。" #: src/settings_translation_file.cpp msgid "Field of view" @@ -3208,7 +3532,7 @@ msgid "" "Multiplayer Tab." msgstr "" "client/serverlist/ フォルダ内のファイルで、ゲームに参加タブで表示されている\n" -"お気に入りのサーバが含まれています。" +"お気に入りのサーバーが含まれています。" #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3225,18 +3549,19 @@ msgstr "フィルム調トーンマッピング" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" -"フィルタ処理されたテクスチャはRGB値と完全に透明な隣り合うものと混ぜる\n" -"ことができます。PNGオプティマイザは通常これを破棄します。その結果、\n" -"透明なテクスチャに対して暗いまたは明るいエッジが生じることがあります。\n" -"このフィルタを適用してテクスチャ読み込み時にそれをきれいにします。" +"フィルタ処理されたテクスチャは、RGB値を完全に透明な隣り合うものと\n" +"混ぜることができます。これはPNGオプティマイザーが通常廃棄するもので、\n" +"透過テクスチャの端が暗くなったり明るくなったりすることがよくあります。\n" +"テクスチャの読み込み時にフィルタを適用してそれをきれいにします。\n" +"これはミップマッピングが有効な場合に自動的に有効になります。" #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "フィルタリング" +msgid "Filtering and Antialiasing" +msgstr "フィルタリングとアンチエイリアス" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3302,6 +3627,10 @@ msgstr "霧の始まり" msgid "Fog toggle key" msgstr "霧表示切り替えキー" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "フォント" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "既定で太字のフォント" @@ -3323,25 +3652,42 @@ msgid "Font size" msgstr "フォントの大きさ" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "既定のフォントのフォント サイズ (pt)。" +msgid "Font size divisible by" +msgstr "割り切れるフォントサイズ" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "フォールバックフォントのフォント サイズ (pt)。" +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "96 DPIで1ユニット=1ピクセルとなる既定のフォントのフォントサイズ" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "固定幅フォントのフォントサイズ (pt)。" +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "96 DPIで1ユニット=1ピクセルとなる固定幅フォントのフォントサイズ" #: 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 "" -"最近のチャットテキストとチャットプロンプトのフォントサイズ(ポイント)。\n" +"最近のチャットテキストとチャットプロンプトのフォントサイズ (pt)。\n" "値 0 は規定のフォントサイズを使用します。" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"拡大縮小がうまくいかないピクセルスタイルのフォントの場合、このフォントで\n" +"使用されるフォントサイズは、常にこの値で割り切れます。例えば高さ16ピクセル" +"の\n" +"ピクセルフォントの場合、この値を16に設定すると、16、32、48などのサイズにし" +"か\n" +"なりませんので、25のサイズを要求したMODは32を取得します。" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3402,11 +3748,7 @@ msgstr "フラクタルの種類" #: src/settings_translation_file.cpp msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "霧がレンダリングされ始める可視距離の割合" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "フリータイプフォント" +msgstr "霧が描画され始める可視距離の割合" #: src/settings_translation_file.cpp msgid "" @@ -3432,21 +3774,17 @@ msgid "" "player is looking. (This can avoid mobs suddenly disappearing from view)" msgstr "" "クライアントがどれくらいの距離のオブジェクトを知っているか、\n" -"マップブロック(16ノード)で定めます。\n" +"マップブロック (16ノード) で定めます。\n" "\n" -"これを active_block_range よりも大きく設定すると、サーバは\n" +"これを active_block_range よりも大きく設定すると、サーバーは\n" "この距離までプレーヤーが見ている方向に\n" -"アクティブなオブジェクトを維持します。(これによりモブが突然\n" -"視野から消えるのを避けることができます)" +"アクティブなオブジェクトを維持します。(これによりモブが突然\n" +"視野から消えるのを避けることができます)" #: src/settings_translation_file.cpp msgid "Full screen" msgstr "フルスクリーン表示" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "フルスクリーンのBPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "全画面表示モードです。" @@ -3464,8 +3802,16 @@ msgid "GUI scaling filter txr2img" msgstr "GUI拡大縮小フィルタ txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "法線マップの生成" +msgid "GUIs" +msgstr "GUI" + +#: src/settings_translation_file.cpp +msgid "Gamepads" +msgstr "ゲームパッド" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "一般" #: src/settings_translation_file.cpp msgid "Global callbacks" @@ -3475,10 +3821,10 @@ msgstr "グローバルコールバック" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" -"グローバルマップ生成属性。\n" -"マップジェネレータv6では、'decorations' フラグは木とジャングルの草を\n" +"全体的なマップ生成属性。\n" +"マップジェネレータv6では、'decorations' フラグで木とジャングルの草を\n" "除くすべての装飾を制御しますが、他のすべてのマップジェネレータでは\n" "このフラグがすべての装飾を制御します。" @@ -3502,6 +3848,14 @@ msgstr "" 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 "重力" @@ -3516,11 +3870,15 @@ msgstr "地上ノイズ" #: src/settings_translation_file.cpp msgid "HTTP mods" -msgstr "HTTP Mod" +msgstr "HTTP MOD" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "HUDの倍率" +msgid "HUD" +msgstr "HUD" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "HUDのサイズ" #: src/settings_translation_file.cpp msgid "HUD toggle key" @@ -3529,15 +3887,14 @@ msgstr "HUD表示切り替えキー" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"廃止予定のLua API呼び出しの処理:\n" -"- legacy: 古い振る舞いを模倣する(試みる) (リリース版の既定値)。\n" -"- log: 廃止予定の呼び出しを模倣してバックトレースを記録 (デバッグ版の既定" -"値)。\n" -"- error: 廃止予定の呼び出しの使用を中止する (Mod開発者向けに推奨)。" +"非推奨の Lua API 呼び出しの処理:\n" +"- none: 非推奨の呼び出しを記録しない\n" +"- log: 非推奨の呼び出しのバックトレースを模倣して記録します (既定値)。\n" +"- error: 非推奨の呼び出しの使用を中止します (MOD開発者に推奨)。" #: src/settings_translation_file.cpp msgid "" @@ -3562,8 +3919,9 @@ msgid "Heat noise" msgstr "熱ノイズ" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "ウィンドウ高さの初期値。" +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "初期ウィンドウサイズの高さ。フルスクリーンモードでは無視されます。" #: src/settings_translation_file.cpp msgid "Height noise" @@ -3573,10 +3931,6 @@ msgstr "高さノイズ" msgid "Height select noise" msgstr "高さ選択ノイズ" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "高精度FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "丘陵の険しさ" @@ -3603,7 +3957,7 @@ msgstr "丘陵性4ノイズ" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." -msgstr "サーバ一覧に表示されるサーバのホームページ。" +msgstr "サーバー一覧に表示されるサーバのホームページ。" #: src/settings_translation_file.cpp msgid "" @@ -3781,12 +4135,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 "" -"未使用のマップブロックをアンロードするまでにサーバが待機する量。\n" +"未使用のマップブロックをアンロードするまでにサーバーが待機する時間を秒単位で" +"定めます。\n" "値が大きいほど滑らかになりますが、より多くの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 "" +"液体の中を移動するときに、どれくらい速度を低下させるかです。\n" +"これを小さくすると、液体の動きに対する抵抗が大きくなります。" + #: src/settings_translation_file.cpp msgid "How wide to make rivers." msgstr "川を作る幅。" @@ -3809,7 +4173,7 @@ msgstr "IPv6" #: src/settings_translation_file.cpp msgid "IPv6 server" -msgstr "IPv6 サーバ" +msgstr "IPv6 サーバー" #: src/settings_translation_file.cpp msgid "" @@ -3821,12 +4185,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" "無効になっている場合、飛行モードと高速移動モードの両方が有効になって\n" -"いると、\"スペシャル\"キーを使用して高速で飛行することができます。" +"いると、\"Aux1\"キーを使用して高速で飛行できます。" #: src/settings_translation_file.cpp msgid "" @@ -3836,7 +4199,7 @@ msgid "" "invisible\n" "so that the utility of noclip mode is reduced." msgstr "" -"有効にすると、サーバはプレーヤーの目の位置に基づいてマップブロック\n" +"有効にすると、サーバーはプレーヤーの目の位置に基づいてマップブロック\n" "オクルージョンカリングを実行します。これによりクライアントに送信される\n" "ブロック数を50〜80%減らすことができます。すり抜けモードの有用性が\n" "減るように、クライアントはもはや目に見えないものを受け取りません。" @@ -3853,12 +4216,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"有効にすると、降りるときや水中を潜るとき \"スニーク\" キーの代りに \n" -"\"スペシャル\" キーが使用されます。" +"有効にすると、降りるとき \"スニーク\" キーの代りに \n" +"\"Aux1\" キーが使用されます。" + +#: 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 "" +"有効にした場合、アカウント登録はログインとは別になります。\n" +"無効にした場合、新しいアカウントはログイン時に自動的に登録されます。" #: src/settings_translation_file.cpp msgid "" @@ -3866,7 +4237,7 @@ msgid "" "This option is only read when server starts." msgstr "" "有効にした場合、ロールバックのために行動が記録されます。\n" -"このオプションはサーバ起動時にのみ読み込まれます。" +"このオプションはサーバー起動時にのみ読み込まれます。" #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." @@ -3877,7 +4248,7 @@ 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 "" -"有効にした場合、無効なワールドデータによってサーバがシャットダウン\n" +"有効にした場合、無効なワールドデータによってサーバーがシャットダウン\n" "することはありません。\n" "自分がしていることがわかっている場合のみこれを有効にします。" @@ -3888,10 +4259,11 @@ msgid "" msgstr "有効にすると、飛行中または水泳中にプレーヤーのピッチ方向に移動します。" #: src/settings_translation_file.cpp -msgid "If enabled, new players cannot join with an empty password." -msgstr "" -"有効にした場合、新しいプレイヤーは空のパスワードでゲームに参加する\n" -"ことはできません。" +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "有効にすると、プレーヤーはパスワードなしで参加したり、空のパスワードに変更す" +"ることはできません。" #: src/settings_translation_file.cpp msgid "" @@ -3912,6 +4284,14 @@ msgstr "" "ノード範囲のCSM制限が有効になっている場合、get_node 呼び出しは\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 "" +"チャットコマンドの実行が、この指定された時間 (秒) よりも長くかかる場合は\n" +"チャットコマンドのメッセージに時間の情報を追加" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3932,10 +4312,6 @@ msgstr "これを設定すると、プレーヤーが常に与えられた場所 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の間)。" @@ -3965,7 +4341,7 @@ msgstr "" "これは通常、コア/ビルトイン貢献者にのみ必要" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "チャットコマンドが登録されるとすぐに計測します。" #: src/settings_translation_file.cpp @@ -3980,31 +4356,27 @@ msgstr "" msgid "" "Instrument the action function of Active Block Modifiers on registration." msgstr "" -"アクティブブロックモディファイヤー(ABM)のアクション関数が\n" +"アクティブブロックモディファイヤー (ABM) のアクション関数が\n" "登録されるとすぐに計測します。" #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Loading Block Modifiers on registration." msgstr "" -"ローディングブロックモディファイヤー(LBM)のアクション関数が\n" +"ローディングブロックモディファイヤー (LBM) のアクション関数が\n" "登録されるとすぐに計測します。" #: src/settings_translation_file.cpp 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 "ワールドで重要な変化を保存する秒単位の間隔。" +msgstr "ワールドで重要な変化を保存する間隔を秒単位で定めます。" #: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." -msgstr "クライアントに時刻を送信する間隔。" +msgid "Interval of sending time of day to clients, stated in seconds." +msgstr "クライアントに時刻を送信する間隔を秒単位で定めます。" #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -4058,6 +4430,10 @@ msgstr "ジョイスティックID" msgid "Joystick button repetition interval" msgstr "ジョイスティックボタンの繰り返し間隔" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "ジョイスティックのデッドゾーン" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "ジョイスティック視錐台感度" @@ -4160,6 +4536,16 @@ msgstr "" "参照 http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"掘削するキーです。\n" +"参照 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4302,6 +4688,16 @@ msgstr "" "参照 http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"設置するキーです。\n" +"参照 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4836,6 +5232,10 @@ msgstr "" "参照 http://irrlicht.sourceforge.net/docu/namespaceirr." "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秒あたりにXメッセージ以上送信したプレイヤーをキックします。" @@ -4896,8 +5296,10 @@ msgstr "左キー" msgid "" "Length of a server tick and the interval at which objects are generally " "updated over\n" -"network." -msgstr "サーバの間隔の長さとオブジェクトが通常ネットワーク上で更新される間隔。" +"network, stated in seconds." +msgstr "" +"サーバーが時を刻む間隔とオブジェクトが通常ネットワーク上で更新される間隔を\n" +"秒単位で定めます。" #: src/settings_translation_file.cpp msgid "" @@ -4908,16 +5310,20 @@ msgstr "" "揺れる液体 を有効にする必要があります。" #: src/settings_translation_file.cpp -msgid "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "アクティブブロックモディファイヤー(ABM)実行サイクル間の時間の長さ" +msgid "" +"Length of time between Active Block Modifier (ABM) execution cycles, stated " +"in seconds." +msgstr "アクティブブロックモディファイヤー (ABM) " +"実行サイクル間の時間の長さを秒単位で定めます。" #: src/settings_translation_file.cpp -msgid "Length of time between NodeTimer execution cycles" -msgstr "ノードタイマー実行サイクル間の時間の長さ" +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" -msgstr "アクティブなブロックの管理サイクル間の時間の長さ" +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "アクティブなブロック管理サイクル間の時間の長さを秒単位で定めます。" #: src/settings_translation_file.cpp msgid "" @@ -4928,16 +5334,18 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" -"debug.txt に書き込まれるログ記録のレベル:\n" -"- <nothing> (ログ記録なし)\n" +"debug.txt に書き込まれるログのレベル:\n" +"- <nothing> (ログなし)\n" "- none (レベルがないメッセージ)\n" "- error\n" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" #: src/settings_translation_file.cpp msgid "Light curve boost" @@ -4963,6 +5371,10 @@ msgstr "光度曲線の高勾配" 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" @@ -4982,9 +5394,9 @@ msgid "" "Only has an effect if compiled with cURL." msgstr "" "並列HTTPリクエストの数を制限します。影響:\n" -"- サーバが remote_media 設定を使用している場合はメディアの取得。\n" -"- サーバ一覧のダウンロードとサーバの公開。\n" -"- メインメニューで実行されたダウンロード(例えば、コンテンツ)。\n" +"- サーバーが remote_media 設定を使用している場合はメディアの取得。\n" +"- サーバー一覧のダウンロードとサーバの公開。\n" +"- メインメニューで実行されたダウンロード (例えば、コンテンツ)。\n" "cURLでコンパイルされた場合にのみ効果があります。" #: src/settings_translation_file.cpp @@ -5027,11 +5439,11 @@ msgid "" msgstr "" "ゲームの観測記録を読み込んで、ゲームの観測データを収集します。\n" "集められた観測記録にアクセスするための /profiler コマンドを提供します。\n" -"Mod開発者やサーバオペレーターに役立ちます。" +"MOD開発者やサーバーオペレーターに役立ちます。" #: src/settings_translation_file.cpp msgid "Loading Block Modifiers" -msgstr "ローディングブロックモディファイヤー(LBM)" +msgstr "ローディングブロックモディファイヤー (LBM)" #: src/settings_translation_file.cpp msgid "Lower Y limit of dungeons." @@ -5045,23 +5457,23 @@ msgstr "浮遊大陸の Y の下限。" msgid "Main menu script" msgstr "メインメニュースクリプト" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "メインメニューのスタイル" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "霧と空の色を日中(夜明け/日没)と視線方向に依存させます。" -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "DirectX を LuaJIT と連携させます。問題がある場合は無効にしてください。" - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "すべての液体を不透明にする" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "ディスクストレージのマップ圧縮レベル" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "ネットワーク転送のためのマップ圧縮レベル" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "マップディレクトリ" @@ -5140,6 +5552,10 @@ msgstr "マップ生成の制限" msgid "Map save interval" msgstr "マップ保存間隔" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "地図の影の更新フレーム" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "マップブロック制限" @@ -5154,7 +5570,7 @@ msgstr "メッシュ生成のマップブロックキャッシュサイズ(MB)" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" -msgstr "マップブロックアンロードタイムアウト" +msgstr "マップブロック破棄タイムアウト" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian" @@ -5245,8 +5661,14 @@ msgid "Maximum FPS" msgstr "最大FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "ポーズメニューでの最大FPS。" +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"ウィンドウにフォーカスが合っていないとき、またはポーズメニュー表示中の最大" +"FPS。" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "影を描画する最大距離。" #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5300,6 +5722,16 @@ msgstr "" "ファイルから読み込まれてキューに入れられる最大ブロック数。\n" "この制限はプレイヤーごとに適用されます。" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"同時ダウンロードの最大数です。この制限を超えるダウンロードはキューに入れられ" +"ます。\n" +"これは curl_parallel_limit よりも低い値でなければなりません。" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "強制読み込みマップブロックの最大数。" @@ -5363,17 +5795,23 @@ msgstr "" "キューを無効にするには 0、サイズを無制限にするには -1 を指定します。" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." -msgstr "ファイルダウンロード (例: Modのダウンロード)の最大経過時間。" +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "ファイルダウンロード (MODのダウンロードなど) " +"にかかる最大時間をミリ秒単位で定めます。" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "インタラクティブリクエスト (サーバー一覧の取得など) " +"にかかる最大時間をミリ秒単位で定めます。" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "最大ユーザー数" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "メニュー" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "メッシュキャッシュ" @@ -5423,12 +5861,24 @@ msgid "Mipmapping" msgstr "ミップマッピング" #: src/settings_translation_file.cpp -msgid "Mod channels" -msgstr "Modチャンネル" +msgid "Misc" +msgstr "その他" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "HUDバー要素のサイズを変更します。" +msgid "Mod Profiler" +msgstr "MODの観測記録" + +#: src/settings_translation_file.cpp +msgid "Mod Security" +msgstr "MODのセキュリティ" + +#: src/settings_translation_file.cpp +msgid "Mod channels" +msgstr "MODのチャンネル" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "HUD要素のサイズを変更します。" #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5438,6 +5888,10 @@ msgstr "固定幅フォントのパス" msgid "Monospace font size" msgstr "固定幅フォントのサイズ" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "割り切れる固定幅フォントのサイズ" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "山の高さノイズ" @@ -5501,23 +5955,19 @@ msgid "" "When starting from the main menu, this is overridden." msgstr "" "プレイヤーの名前。\n" -"サーバを実行している場合、この名前で接続しているクライアントは管理者\n" +"サーバーを実行している場合、この名前で接続しているクライアントは管理者\n" "です。\n" "メインメニューから起動すると、これは上書きされます。" #: src/settings_translation_file.cpp msgid "" "Name of the server, to be displayed when players join and in the serverlist." -msgstr "プレイヤーが参加したときにサーバ一覧に表示されるサーバの名前。" +msgstr "プレイヤーが参加したときにサーバー一覧に表示されるサーバーの名前。" #: src/settings_translation_file.cpp msgid "Near plane" msgstr "近くの面" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "ネットワーク" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5526,6 +5976,10 @@ msgstr "" "待機するネットワークポート (UDP)。\n" "メインメニューから起動すると、この値は上書きされます。" +#: src/settings_translation_file.cpp +msgid "Networking" +msgstr "ネットワーク" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "新しいユーザーはこのパスワードを入力する必要があります。" @@ -5538,6 +5992,10 @@ msgstr "すり抜けモード" msgid "Noclip key" msgstr "すり抜けモード切替キー" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "ノードとエンティティのハイライト" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "ノードをハイライト" @@ -5550,14 +6008,6 @@ msgstr "ノードタイマーの間隔" msgid "Noises" msgstr "ノイズ" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "法線マップのサンプリング" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "法線マップの強さ" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "出現するスレッド数" @@ -5590,20 +6040,12 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" -"一度に /clearobjects によってロードできる追加ブロックの数。\n" +"/clearobjects によって一度に読み込みできる追加ブロックの数です。\n" "これは、SQLiteトランザクションのオーバーヘッドとメモリ消費の間の\n" -"トレードオフです (経験則として、4096 = 100MB)。" - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "視差遮蔽反復の回数です。" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "オンラインコンテンツリポジトリ" +"トレードオフです (大体 4096 = 100MB)。" #: src/settings_translation_file.cpp msgid "Opaque liquids" @@ -5612,12 +6054,7 @@ msgstr "不透明な液体" #: src/settings_translation_file.cpp msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "既定のフォントの影の不透明度(透過)は0から255の間です。" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "フォールバックフォントの影の不透明度(透過)は0から255の間です。" +msgstr "既定のフォントの影の不透明度 (透過) は0から255の間です。" #: src/settings_translation_file.cpp msgid "" @@ -5629,48 +6066,17 @@ msgstr "" "フォームスペックが開かれているときはポーズメニューを開きません。" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "視差遮蔽効果の全体的バイアス、通常 スケール/2 です。" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "視差遮蔽効果の全体的なスケールです。" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "視差遮蔽" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "視差遮蔽バイアス" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "視差遮蔽反復" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "視差遮蔽モード" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "視差遮蔽スケール" +msgid "Optional override for chat weblink color." +msgstr "チャットのウェブリンクの色を上書きするオプションです。" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" -"フォールバックフォントのパス。\n" -"「フリータイプフォント」が有効な場合:TrueTypeフォントでなければなりませ" -"ん。\n" -"「フリータイプフォント」が無効な場合:ビットマップまたはXMLベクターフォント\n" -"でなければなりません。\n" -"このフォントは特定の言語で使用されるか、規定のフォントが使用できない\n" -"ときに使用されます。" +"フォールバックフォントのパス。TrueType フォントでなければなりません。\n" +"このフォントは特定の言語か、規定のフォントが使用できないときに使用されます。" #: src/settings_translation_file.cpp msgid "" @@ -5696,30 +6102,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" -"既定のフォントのパス。\n" -"「フリータイプフォント」が有効な場合:TrueTypeフォントでなければなりませ" -"ん。\n" -"「フリータイプフォント」が無効な場合:ビットマップまたはXMLベクターフォント\n" -"でなければなりません。\n" +"既定のフォントのパス。TrueType フォントでなければなりません。\n" "このフォールバックフォントはフォントが読み込めないときに使用されます。" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" -"固定幅フォントのパス。\n" -"「フリータイプフォント」が有効な場合:TrueTypeフォントでなければなりませ" -"ん。\n" -"「フリータイプフォント」が無効な場合:ビットマップまたはXMLベクターフォント\n" -"でなければなりません。\n" +"固定幅フォントのパス。TrueType フォントでなければなりません。\n" "このフォントはコンソールや観測記録画面などで使用されます。" #: src/settings_translation_file.cpp @@ -5746,6 +6140,14 @@ msgstr "ピッチ移動モード切替キー" msgid "Pitch move mode" msgstr "ピッチ移動モード" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "設置キー" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "設置の繰り返し間隔" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5754,10 +6156,6 @@ msgstr "" "プレイヤーは重力の影響を受けずに飛ぶことができます。\n" "これにはサーバー上に \"fly\" 特権が必要です。" -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "プレイヤー名" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "プレイヤー転送距離" @@ -5766,6 +6164,10 @@ msgstr "プレイヤー転送距離" msgid "Player versus player" msgstr "プレイヤー対プレイヤー" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "ポアソンフィルタリング" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5784,7 +6186,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Prevent mods from doing insecure things like running shell commands." -msgstr "Modがシェルコマンドを実行するような安全でないことをするのを防ぎます。" +msgstr "MODがシェルコマンドを実行するような安全でないことをするのを防ぎます。" #: src/settings_translation_file.cpp msgid "" @@ -5806,10 +6208,6 @@ msgstr "観測記録" msgid "Profiler toggle key" msgstr "観測記録表示切替キー" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "プロファイリング" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "プロメテウスリスナーのアドレス" @@ -5817,14 +6215,15 @@ msgstr "プロメテウスリスナーのアドレス" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" "プロメテウスリスナーのアドレス。\n" -"minetest が ENABLE_PROMETHEUS オプションを有効にしてコンパイルされている場合、\n" +"Minetest が ENABLE_PROMETHEUS オプションを有効にしてコンパイルされている場" +"合、\n" "そのアドレスのプロメテウスのメトリックスリスナーを有効にします。\n" -"メトリックは http://127.0.0.1:30000/metrics で取得可能" +"メトリックスは http://127.0.0.1:30000/metrics で取得可能" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." @@ -5897,10 +6296,10 @@ msgid "" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" -"サーバで特定のクライアント側機能へのアクセスを制限します。\n" +"サーバーで特定のクライアント側機能へのアクセスを制限します。\n" "以下の byteflags を合わせてクライアント側の機能を制限するか、制限なしの\n" "場合は 0 に設定します。\n" -"LOAD_CLIENT_MODS: 1 (クライアント提供のModの読み込みを無効)\n" +"LOAD_CLIENT_MODS: 1 (クライアント提供のMODの読み込みを無効)\n" "CHAT_MESSAGES: 2 (クライアント側での send_chat_message 呼び出しを無効)\n" "READ_ITEMDEFS: 4 (クライアント側での get_item_def 呼び出しを無効)\n" "READ_NODEDEFS: 8 (クライアント側での get_node_def 呼び出しを無効)\n" @@ -5928,10 +6327,6 @@ msgstr "尾根の大きさノイズ" msgid "Right key" msgstr "右キー" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "右クリック繰り返しの間隔" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "河道の深さ" @@ -5990,7 +6385,7 @@ msgstr "ウィンドウサイズ変更時に自動的に保存します。" #: src/settings_translation_file.cpp msgid "Saving map received from server" -msgstr "サーバから受信したマップ保存" +msgstr "サーバーから受信したマップ保存" #: src/settings_translation_file.cpp msgid "" @@ -6006,6 +6401,10 @@ msgstr "" "エッジピクセルをぼかすことを犠牲にして、粗いエッジの一部を滑らかにし、\n" "縮小するときにピクセルを混合します。" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "画面" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "画面の高さ" @@ -6036,6 +6435,10 @@ msgstr "" "1 は最低品質; 100 は最高品質です。\n" "既定の品質には 0 を使用します。" +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "スクリーンショット" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "海底ノイズ" @@ -6048,10 +6451,6 @@ msgstr "一緒に丘陵/山岳地帯の高さを定義する2Dノイズ4つの msgid "Second of two 3D noises that together define tunnels." msgstr "トンネルを定義する2つの3Dノイズのうちの2番目。" -#: 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" @@ -6111,40 +6510,56 @@ msgstr "" "18 = 4D \"Mandelbulb\" ジュリア集合。" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "サーバ / シングルプレイヤー" +msgid "Server" +msgstr "サーバー" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "サーバーのゲームプレイ" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "サーバーのセキュリティ" #: src/settings_translation_file.cpp msgid "Server URL" -msgstr "サーバURL" +msgstr "サーバーURL" #: src/settings_translation_file.cpp msgid "Server address" -msgstr "サーバアドレス" +msgstr "サーバーアドレス" #: src/settings_translation_file.cpp msgid "Server description" -msgstr "サーバ説明" +msgstr "サーバー説明" #: src/settings_translation_file.cpp msgid "Server name" -msgstr "サーバ名" +msgstr "サーバー名" #: src/settings_translation_file.cpp msgid "Server port" -msgstr "サーバポート" +msgstr "サーバーポート" #: src/settings_translation_file.cpp msgid "Server side occlusion culling" -msgstr "サーバ側のオクルージョンカリング" +msgstr "サーバー側のオクルージョンカリング" + +#: src/settings_translation_file.cpp +msgid "Server/Env Performance" +msgstr "サーバー/環境のパフォーマンス" #: src/settings_translation_file.cpp msgid "Serverlist URL" -msgstr "サーバ一覧URL" +msgstr "サーバー一覧URL" + +#: src/settings_translation_file.cpp +msgid "Serverlist and MOTD" +msgstr "サーバー一覧とその日のメッセージ" #: src/settings_translation_file.cpp msgid "Serverlist file" -msgstr "サーバ一覧ファイル" +msgstr "サーバー一覧ファイル" #: src/settings_translation_file.cpp msgid "" @@ -6155,8 +6570,47 @@ msgstr "" "変更後は再起動が必要です。" #: src/settings_translation_file.cpp -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "クライアントから送信されるチャットメッセージの最大文字数を設定します。" +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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" +"影の強さのガンマを設定します。\n" +"ゲーム内の動的な影の強度を調整します。\n" +"低い値は明るい影を意味し、高い値は暗い影を意味します。" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"やわらかい影の半径サイズを設定します。\n" +"値が小さいほどシャープな影、大きいほどやわらない影になります。\n" +"最小値: 1.0、最大値: 15.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"太陽/月の軌道の傾きを度数で設定します。\n" +"0 は傾きのない垂直な軌道です。\n" +"最小値: 0.0、最大値: 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"有効にすると影を映します。\n" +"シェーダーが有効である必要があります。" #: src/settings_translation_file.cpp msgid "" @@ -6171,7 +6625,7 @@ msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"有効にすると液体が揺れます(水のような)。\n" +"有効にすると液体が揺れます (水のような)。\n" "シェーダーが有効である必要があります。" #: src/settings_translation_file.cpp @@ -6182,6 +6636,16 @@ msgstr "" "有効にすると草花が揺れます。\n" "シェーダーが有効である必要があります。" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"影のテクスチャの品質を 32 ビットに設定します。\n" +"false の場合、16ビットのテクスチャが使用されます。\n" +"これは、影がさら不自然になる可能性があります。" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "シェーダーパス" @@ -6198,20 +6662,30 @@ msgstr "" "これはOpenGLビデオバックエンドでのみ機能します。" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " -"drawn." -msgstr "" -"既定のフォントの影のオフセット(ピクセル単位)。 0の場合、影は描画されませ" -"ん。" +msgid "Shadow filter quality" +msgstr "影フィルタの品質" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "影を描画するためのノードの最大距離" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "32ビットの影投影テクスチャ" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "影投影テクスチャサイズ" #: src/settings_translation_file.cpp msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"フォールバックフォントの影のオフセット(ピクセル単位)。 \n" -"0の場合、影は描画されません。" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "既定のフォントの影のオフセット (ピクセル単位)。 0の場合、影は描画されません。" + +#: src/settings_translation_file.cpp +msgid "Shadow strength gamma" +msgstr "影の強さのガンマ" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6223,11 +6697,23 @@ msgstr "デバッグ情報を表示" #: src/settings_translation_file.cpp msgid "Show entity selection boxes" -msgstr "エンティティの選択ボックスを表示" +msgstr "エンティティの選択ボックス表示" + +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"エンティティの選択ボックスを表示\n" +"変更後は再起動が必要です。" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "ネームタグの背景を既定で表示" #: src/settings_translation_file.cpp msgid "Shutdown message" -msgstr "サーバ終了時のメッセージ" +msgstr "サーバー終了時のメッセージ" #: src/settings_translation_file.cpp msgid "" @@ -6239,7 +6725,7 @@ msgid "" "recommended." msgstr "" "マップジェネレータによって生成されたマップチャンクのサイズで、\n" -"マップブロック(16ノード)で表されます。\n" +"マップブロック (16ノード) で表されます。\n" "警告!: この値を5より大きくすることには利点がなく、いくつかの危険が\n" "あります。この値を減らすと洞窟とダンジョンの密度が上がります。\n" "この値を変更するのは特別な用途のためです。変更しないでおくことを\n" @@ -6255,6 +6741,10 @@ msgstr "" "キャッシュヒット率が上がり、メインスレッドからコピーされるデータが\n" "減るため、ジッタが減少します。" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "天体の軌道傾斜角" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "スライス w" @@ -6312,18 +6802,14 @@ msgstr "スニーク時の速度" msgid "Sneaking speed, in nodes per second." msgstr "スニーク時の速度、1秒あたりのノード数です。" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "やわらない影半径" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "サウンド" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "スペシャルキー" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "降りるためのスペシャルキー" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6343,9 +6829,21 @@ msgid "" "items." msgstr "" "既定のノード、アイテム、ツールのスタック数を指定します。\n" -"Mod またはゲームは、特定の(またはすべての)アイテムのスタック数を\n" +"MOD またはゲームは、特定の (またはすべての) アイテムのスタック数を\n" "明示的に設定する場合があることに注意してください。" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"影の描画の完全な更新を指定されたフレーム数に広げます。\n" +"値を大きくすると影が遅延することがあり、値を小さくすると\n" +"より多くのリソースを消費します。\n" +"最小値: 1、最大値: 16" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6376,10 +6874,6 @@ msgstr "ステップマウンテンの広がりノイズ" msgid "Strength of 3D mode parallax." msgstr "3Dモード視差の強さです。" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "生成された法線マップの強さです。" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6412,11 +6906,13 @@ msgid "" "world surface below." msgstr "" "密な浮遊大陸層に配置されるオプションの水の表面レベル。\n" -"水は規定で無効になっており、この値が 'mgv7_floatland_ymax' - 'mgv7_floatland_taper'\n" +"水は規定で無効になっており、この値が 'mgv7_floatland_ymax' - " +"'mgv7_floatland_taper'\n" "(上部の先細り開始点)より上に設定されている場合にのみ配置されます。\n" "***警告、サーバーのパフォーマンスへの潜在的な危険性***:\n" "水の配置を有効にする場合、浮遊大陸を密な層にするために\n" -"'mgv7_floatland_density' を2.0(または 'mgv7_np_floatland' に応じて他の必要な値)に\n" +"'mgv7_floatland_density' を2.0 (または 'mgv7_np_floatland' " +"に応じて他の必要な値) に\n" "設定して、サーバーに集中する極端な水の流れを避け、下の世界表面への大規模な\n" "洪水を避けるようにテストする必要があります。" @@ -6428,6 +6924,10 @@ msgstr "SQLite同期" 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 "地形別ノイズ" @@ -6476,6 +6976,16 @@ msgstr "地形持続性ノイズ" msgid "Texture path" msgstr "テクスチャパス" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"影を描画するためのテクスチャサイズです。\n" +"これは2の累乗でなければなりません。\n" +"数字が大きいほどより良い影ができますが、負荷も高くなります。" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6489,7 +6999,7 @@ msgstr "" "ことができます。\n" "前者のモードは、機械、家具などのようなものに適していますが、\n" "後者のモードは階段やマイクロブロックを周囲の環境に合わせやすくします。\n" -"しかし、この機能は新しく、古いサーバでは使用できない可能性があります。\n" +"しかし、この機能は新しく、古いサーバーでは使用できない可能性があります。\n" "このオプションを使用すると特定のノードタイプに適用できます。ただし、\n" "これは実験的なものであり、正しく機能しない可能性があります。" @@ -6497,6 +7007,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "コンテンツリポジトリのURL" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "ジョイスティックのデッドゾーン" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6533,12 +7047,12 @@ msgstr "" "揺れる液体の表面の最大高さ。\n" "4.0 =波高は2ノードです。\n" "0.0 =波はまったく動きません。\n" -"既定は1.0(1/2ノード)です。\n" +"既定は1.0 (1/2ノード) です。\n" "揺れる液体 を有効にする必要があります。" #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." -msgstr "サーバが待機しているネットワークインターフェース。" +msgstr "サーバがー待機しているネットワークインターフェース。" #: src/settings_translation_file.cpp msgid "" @@ -6546,7 +7060,7 @@ msgid "" "See /privs in game for a full list on your server and mod configuration." msgstr "" "新規ユーザーが自動的に取得する特権。\n" -"サーバとModの構成の完全なリストについては、ゲーム内の /privs を参照\n" +"サーバーとMODの構成の完全なリストについては、ゲーム内の /privs を参照\n" "してください。" #: src/settings_translation_file.cpp @@ -6560,31 +7074,32 @@ msgid "" "This should be configured together with active_object_send_range_blocks." msgstr "" "アクティブブロックの対象となる各プレイヤーの周囲のブロックの量の半径、\n" -"マップブロック(16ノード)で定めます。\n" +"マップブロック (16ノード) で定めます。\n" "アクティブブロックのオブジェクトはロードされ、ABMが実行されます。\n" -"これはアクティブオブジェクト(モブ)が維持される最小範囲でもあります。\n" +"これはアクティブオブジェクト (モブ) が維持される最小範囲でもあります。\n" "これは active_object_send_range_blocks と一緒に設定する必要があります。" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Irrlichtのレンダリングバックエンド。\n" +"レンダリングのバックエンドです。\n" "変更後は再起動が必要です。\n" -"メモ: Androidでは、不明な場合は OGLES1 を使用してください! \n" -"それ以外の場合アプリは起動に失敗することがあります。\n" -"他のプラットフォームでは、OpenGL が推奨されており、現在それが\n" -"シェーダーをサポートする唯一のドライバです。" +"注:Androidでは、不明な場合はOGRES1を使用してください!そうしないとアプリの起" +"動に失敗することがあります。\n" +"その他のプラットフォームでは、OpenGLを推奨します。\n" +"シェーダーは、OpenGL (デスクトップのみ) とOGRES2 (実験的) " +"でサポートされています。" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "ゲーム内の視錐台を動かすためのジョイスティック軸の感度。" #: src/settings_translation_file.cpp @@ -6594,7 +7109,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 "" -"ノードのアンビエントオクルージョンシェーディングの強度(暗さ)。\n" +"ノードのアンビエントオクルージョンシェーディングの強度 (暗さ)。\n" "低いほど暗く、高いほど明るくなります。設定の有効範囲は 0.25~4.0 です。\n" "値が範囲外の場合は、最も近い有効な値に設定されます。" @@ -6607,6 +7122,14 @@ msgstr "" "古いキューアイテムを出力してサイズを減らそうとするまでに、液体キューが\n" "処理能力を超えて拡張できる時間(秒単位)。値 0 は機能を無効にします。" +#: 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 "" +"ABM が各ステップで実行できる時間予算\n" +"(ABM間隔の一部として)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6617,10 +7140,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." -msgstr "マウスの右ボタンを押したまま右クリックを繰り返す秒単位の間隔。" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "設置ボタンを押したままノードの設置を繰り返す秒単位の間隔。" #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6649,7 +7171,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Time of day when a new world is started, in millihours (0-23999)." -msgstr "新しいワールドが開始される時刻。ミリ時間単位(0〜23999)。" +msgstr "新しいワールドが開始される時刻。ミリ時間単位 (0〜23999)。" #: src/settings_translation_file.cpp msgid "Time send interval" @@ -6660,10 +7182,9 @@ msgid "Time speed" msgstr "時間の速さ" #: src/settings_translation_file.cpp -msgid "Timeout for client to remove unused map data from memory." -msgstr "" -"クライアントがメモリから未使用のマップデータを削除するための\n" -"タイムアウト。" +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "クライアントがメモリから未使用のマップデータを削除するためのタイムアウト " +"(秒単位)。" #: src/settings_translation_file.cpp msgid "" @@ -6688,6 +7209,18 @@ msgstr "ツールチップの遅延" 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 "木のノイズ" @@ -6708,11 +7241,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Trusted mods" -msgstr "信頼するMod" +msgstr "信頼するMOD" #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." -msgstr "ゲームに参加タブで表示されるサーバ一覧へのURL。" +msgstr "ゲームに参加タブで表示されるサーバー一覧へのURL。" #: src/settings_translation_file.cpp msgid "Undersampling" @@ -6737,7 +7270,7 @@ msgstr "無制限のプレーヤー転送距離" #: src/settings_translation_file.cpp msgid "Unload unused server data" -msgstr "未使用のサーバデータをアンロード" +msgstr "未使用のサーバーデータを破棄" #: src/settings_translation_file.cpp msgid "Upper Y limit of dungeons." @@ -6765,19 +7298,41 @@ msgstr "テクスチャを拡大縮小する場合はバイリニアフィルタ #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" "ミップマッピングを使用してテクスチャを拡大縮小します。特に高解像度の\n" "テクスチャパックを使用する場合は、パフォーマンスがわずかに向上する\n" -"可能性があります。\n" -"ガンマ補正縮小はサポートされていません。" +"可能性があります。ガンマ補正縮小はサポートされていません。" + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"マルチサンプルアンチエイリアス (MSAA) " +"を使用して、ブロックエッジを滑らかにします。\n" +"このアルゴリズムは、画像を鮮明に保ちながら3Dビューポートを滑らかにします。\n" +"しかし、それはテクスチャの内部には影響しません\n" +"(これは、透明なテクスチャで特に目立ちます)。\n" +"シェーダーを無効にすると、ノード間に可視スペースが表示されます。\n" +"0 に設定すると、MSAAは無効になります。\n" +"このオプションを変更した場合、再起動が必要です。" #: src/settings_translation_file.cpp 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" @@ -6875,8 +7430,8 @@ msgid "Viewing range" msgstr "視野" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "バーチャルパッドでauxボタン動作" +msgid "Virtual joystick triggers Aux1 button" +msgstr "バーチャルパッドで Aux1 ボタン動作" #: src/settings_translation_file.cpp msgid "Volume" @@ -6952,6 +7507,10 @@ msgstr "揺れる液体の波長" msgid "Waving plants" msgstr "揺れる草花" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "ウェブリンクの色" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6981,33 +7540,30 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" "バイリニア/トライリニア/異方性フィルタを使用すると、低解像度の\n" "テクスチャがぼやける可能性があるため、鮮明なピクセルを保持するために\n" -"最近傍補間を使用して自動的にそれらを拡大します。\n" -"これは拡大されたテクスチャのための最小テクスチャサイズを設定します。\n" -"より高い値はよりシャープに見えますが、より多くのメモリを必要とします。\n" -"2のべき乗が推奨されます。これを1より高く設定すると、\n" -"バイリニア/トライリニア/異方性フィルタリングが有効になっていない限り、\n" -"目に見える効果がない場合があります。\n" +"最近傍補間を使用して自動的にそれらを拡大します。これは拡大されたテクスチャ" +"の\n" +"ための最小テクスチャサイズを設定します。より高い値はよりシャープに見えます" +"が、\n" +"より多くのメモリを必要とします。2の累乗が推奨されます。この設定は、\n" +"バイリニア/トライリニア/異方性フィルタリングが有効の場合にのみ適用されま" +"す。\n" "これは整列テクスチャの自動スケーリング用の基準ノードテクスチャサイズと\n" "しても使用されます。" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"フリータイプフォントを使用するかどうかは、フリータイプをサポートして\n" -"コンパイルされている必要があります。 \n" -"無効にした場合、代わりにビットマップおよび XML ベクターフォントが使用されま" -"す。" +"ネームタグの背景を既定で表示するかどうかです。\n" +"MODで背景を設定することもできます。" #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7021,7 +7577,7 @@ msgid "" "Deprecated, use the setting player_transfer_distance instead." msgstr "" "プレイヤーが範囲制限なしでクライアントに表示されるかどうかです。\n" -"廃止予定、代わりに設定 player_transfer_distance を使用してください。" +"非推奨。代わりに設定 player_transfer_distance を使用してください。" #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." @@ -7034,7 +7590,7 @@ msgid "" msgstr "" "(Luaが)クラッシュした際にクライアントに再接続を要求するかどうかの\n" "設定です。\n" -"サーバが自動で再起動されるように設定されているならば true に設定\n" +"サーバーが自動で再起動されるように設定されているならば true に設定\n" "してください。" #: src/settings_translation_file.cpp @@ -7049,10 +7605,23 @@ msgid "" "pause menu." msgstr "" "音をミュートするかどうか。サウンドシステムが無効になっていない限り\n" -"(enable_sound = false)、いつでもミュートを解除できます。\n" +"(enable_sound = false)、いつでもミュートを解除できます。\n" "ゲーム内ではミュートキーを使用するかポーズメニューを使用して、\n" "ミュート状態を切り替えることができます。" +#: 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 "" +"技術名を表示するかどうか。\n" +"コンテンツとMOD選択メニューのMODとテクスチャパック、および\n" +"すべての設定の設定名に影響します。\n" +"「すべての設定」メニューのチェックボックスで制御されます。" + #: src/settings_translation_file.cpp msgid "" "Whether to show the client debug info (has the same effect as hitting F5)." @@ -7061,8 +7630,8 @@ msgstr "" "(F5を押すのと同じ効果)。" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "ウィンドウ幅の初期値。" +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "初期ウィンドウサイズの幅。フルスクリーンモードでは無視されます。" #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7163,90 +7732,141 @@ msgstr "低い地形と海底のYレベル。" msgid "Y-level of seabed." msgstr "海底のYレベル。" +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "cURL" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURLファイルダウンロードタイムアウト" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "cURL インタラクティブタイムアウト" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL並行処理制限" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURLタイムアウト" +#~ msgid "- Creative Mode: " +#~ msgstr "- クリエイティブモード: " -#~ msgid "Toggle Cinematic" -#~ msgstr "映画風モード切替" - -#~ msgid "Select Package File:" -#~ msgstr "パッケージファイルを選択:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "大きな洞窟内の溶岩のY高さ上限。" - -#~ msgid "Waving Water" -#~ msgstr "揺れる水" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "ダンジョンが時折地形から突出するかどうか。" - -#~ msgid "Projecting dungeons" -#~ msgstr "突出するダンジョン" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "浮遊大陸の影が広がるYレベル。" - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "浮遊大陸の中間点と湖面のYレベル。" - -#~ msgid "Waving water" -#~ msgstr "揺れる水" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "浮遊大陸の滑らかな地形における丘の高さと湖の深さの変動。" +#~ msgid "- Damage: " +#~ msgstr "- ダメージ: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." -#~ msgstr "浮遊大陸の山の中間点の上と下の典型的な最大高さ。" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." +#~ msgstr "" +#~ "0 = 斜面情報付きの視差遮蔽マッピング(高速)。\n" +#~ "1 = リリーフマッピング(正確だが低速)。" -#~ msgid "This font will be used for certain languages." -#~ msgstr "このフォントは特定の言語で使用されます。" +#~ msgid "Address / Port" +#~ msgstr "アドレス / ポート" -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "光度曲線ミッドブーストの強さ。" +#~ msgid "" +#~ "Adjust the gamma encoding for the light tables. Higher numbers are " +#~ "brighter.\n" +#~ "This setting is for the client only and is ignored by the server." +#~ msgstr "" +#~ "ライトテーブルのガンマ補正を調整します。数値が大きいほど明るくなります。\n" +#~ "この設定はクライアント専用であり、サーバでは無視されます。" -#~ msgid "Shadow limit" -#~ msgstr "影の制限" +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "山型浮遊大陸が中間点の上下でどのように先細くなるかを変更します。" -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "TrueTypeフォントまたはビットマップへのパス。" +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "シングルプレイヤーのワールドをリセットしてよろしいですか?" -#~ msgid "Lightness sharpness" -#~ msgstr "明るさの鋭さ" +#~ msgid "Back" +#~ msgstr "戻る" -#~ msgid "Lava depth" -#~ msgstr "溶岩の深さ" +#~ msgid "Basic" +#~ msgstr "基本" -#~ msgid "IPv6 support." -#~ msgstr "IPv6 サポート。" +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "フルスクリーンモードでのビット数(色深度)。" -#~ msgid "Gamma" -#~ msgstr "ガンマ" +#~ msgid "Bump Mapping" +#~ msgstr "バンプマッピング" -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "フォントの影の透過 (不透明、0~255の間)。" +#~ msgid "Bumpmapping" +#~ msgstr "バンプマッピング" -#~ msgid "Floatland mountain height" -#~ msgstr "浮遊大陸の山の高さ" +#~ msgid "Center of light curve mid-boost." +#~ msgstr "光度曲線ミッドブーストの中心。" -#~ msgid "Floatland base height noise" -#~ msgstr "浮遊大陸の基準高さノイズ" +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "メインメニューUIを変更:\n" +#~ "- Full: 複数のシングルプレイヤーのワールド、ゲームの選択、\n" +#~ "テクスチャパックの選択、その他。\n" +#~ "- Simple: 1つのシングルプレイヤーのワールド、ゲームや\n" +#~ "テクスチャパックの選択はありません。小さな画面で必要かもしれません。" -#~ msgid "Enables filmic tone mapping" -#~ msgstr "フィルム調トーンマッピング有効にする" +#~ msgid "Config mods" +#~ msgstr "Mod設定" -#~ msgid "Enable VBO" -#~ msgstr "VBOを有効化" +#~ msgid "Configure" +#~ msgstr "設定" + +#~ msgid "Connect" +#~ 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." +#~ msgstr "" +#~ "山型浮遊大陸の密度を制御します。\n" +#~ "ノイズのオフセットは、'mgv7_np_mountain' ノイズ値に追加されます。" + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "トンネルの幅を制御、小さい方の値ほど広いトンネルを生成します。" + +#~ msgid "Credits" +#~ msgstr "クレジット" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "照準線の色 (R,G,B)。" + +#~ msgid "Damage enabled" +#~ msgstr "ダメージ有効" + +#~ msgid "Darkness sharpness" +#~ msgstr "暗さの鋭さ" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "cURLの既定のタイムアウト、ミリ秒で定めます。\n" +#~ "cURLでコンパイルされた場合にのみ効果があります。" + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "浮遊大陸の滑らかな地形の地域を定義します。\n" +#~ "ノイズが 0 より大きいとき、滑らかな浮遊大陸になります。" + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "テクスチャのサンプリング手順を定義します。\n" +#~ "値が大きいほど、法線マップが滑らかになります。" + +#~ msgid "Del. Favorite" +#~ msgstr "お気に入り削除" #~ msgid "" #~ "Deprecated, define and locate cave liquids using biome definitions " @@ -7257,54 +7877,347 @@ msgstr "cURLタイムアウト" #~ "す。\n" #~ "大きな洞窟内の溶岩のY高さ上限。" -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ msgid "Download a game, such as Minetest Game, from minetest.net" #~ msgstr "" -#~ "浮遊大陸の滑らかな地形の地域を定義します。\n" -#~ "ノイズが 0 より大きいとき、滑らかな浮遊大陸になります。" +#~ "Minetest Game などのゲームを minetest.net からダウンロードしてください" -#~ msgid "Darkness sharpness" -#~ msgstr "暗さの鋭さ" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "トンネルの幅を制御、小さい方の値ほど広いトンネルを生成します。" - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "山型浮遊大陸の密度を制御します。\n" -#~ "ノイズのオフセットは、'mgv7_np_mountain' ノイズ値に追加されます。" - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "光度曲線ミッドブーストの中心。" - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "山型浮遊大陸が中間点の上下でどのように先細くなるかを変更します。" - -#~ msgid "" -#~ "Adjust the gamma encoding for the light tables. Higher numbers are " -#~ "brighter.\n" -#~ "This setting is for the client only and is ignored by the server." -#~ msgstr "" -#~ "ライトテーブルのガンマ補正を調整します。数値が大きいほど明るくなります。\n" -#~ "この設定はクライアント専用であり、サーバでは無視されます。" - -#~ msgid "Path to save screenshots at." -#~ msgstr "スクリーンショットを保存するパス。" - -#~ msgid "Parallax occlusion strength" -#~ msgstr "視差遮蔽強度" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "ディスク上に出現するキューの制限" +#~ msgid "Download one from minetest.net" +#~ msgstr "minetest.netからダウンロードしてください" #~ msgid "Downloading and installing $1, please wait..." #~ msgstr "$1をインストールしています、お待ちください..." -#~ msgid "Back" -#~ msgstr "戻る" +#~ 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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "テクスチャのバンプマッピングを有効にします。法線マップは\n" +#~ "テクスチャパックによって提供されるかまたは自動生成される必要があります。\n" +#~ "シェーダーが有効である必要があります。" + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "フィルム調トーンマッピング有効にする" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "法線マップ生成を臨機応変に有効にします(エンボス効果)。\n" +#~ "バンプマッピングが有効である必要があります。" + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "視差遮蔽マッピングを有効にします。\n" +#~ "シェーダーが有効である必要があります。" + +#~ msgid "Enter " +#~ msgstr "エンター " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "実験的なオプションで、0 より大きい数値に設定すると、ブロック間に\n" +#~ "目に見えるスペースが生じる可能性があります。" + +#~ msgid "FPS in pause menu" +#~ msgstr "ポーズメニューでのFPS" + +#~ msgid "Fallback font shadow" +#~ msgstr "フォールバックフォントの影" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "フォールバックフォントの影の透過" + +#~ msgid "Fallback font size" +#~ msgstr "フォールバックフォントの大きさ" + +#~ msgid "Filtering" +#~ msgstr "フィルタリング" + +#~ msgid "Floatland base height noise" +#~ msgstr "浮遊大陸の基準高さノイズ" + +#~ msgid "Floatland mountain height" +#~ msgstr "浮遊大陸の山の高さ" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "フォントの影の透過 (不透明、0~255の間)。" + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "フォールバックフォントのフォント サイズ (pt)。" + +#~ msgid "FreeType fonts" +#~ msgstr "フリータイプフォント" + +#~ msgid "Full screen BPP" +#~ msgstr "フルスクリーンのBPP" + +#~ msgid "Game" +#~ msgstr "ゲーム" + +#~ msgid "Gamma" +#~ msgstr "ガンマ" + +#~ msgid "Generate Normal Maps" +#~ msgstr "法線マップの生成" + +#~ msgid "Generate normalmaps" +#~ msgstr "法線マップの生成" + +#~ msgid "HUD scale factor" +#~ msgstr "HUDの倍率" + +#~ msgid "High-precision FPU" +#~ msgstr "高精度FPU" + +#~ msgid "IPv6 support." +#~ msgstr "IPv6 サポート。" + +#~ 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 "溶岩の深さ" + +#~ msgid "Lightness sharpness" +#~ msgstr "明るさの鋭さ" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "ディスク上に出現するキューの制限" + +#~ msgid "Main" +#~ msgstr "メイン" + +#~ msgid "Main menu style" +#~ msgstr "メインメニューのスタイル" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "DirectX を LuaJIT と連携させます。問題がある場合は無効にしてください。" + +#~ msgid "Menus" +#~ msgstr "メニュー" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "ミニマップ レーダーモード、ズーム x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "ミニマップ レーダーモード、ズーム x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "ミニマップ 表面モード、ズーム x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "ミニマップ 表面モード、ズーム x4" + +#~ msgid "Name / Password" +#~ msgstr "名前 / パスワード" + +#~ msgid "Name/Password" +#~ msgstr "名前 / パスワード" + +#~ msgid "No" +#~ msgstr "いいえ" + +#~ msgid "Normalmaps sampling" +#~ msgstr "法線マップのサンプリング" + +#~ msgid "Normalmaps strength" +#~ msgstr "法線マップの強さ" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "視差遮蔽反復の回数です。" #~ msgid "Ok" #~ msgstr "決定" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "フォールバックフォントの影の不透明度(透過)は0から255の間です。" + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "視差遮蔽効果の全体的バイアス、通常 スケール/2 です。" + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "視差遮蔽効果の全体的なスケールです。" + +#~ msgid "Parallax Occlusion" +#~ msgstr "視差遮蔽" + +#~ msgid "Parallax occlusion" +#~ msgstr "視差遮蔽" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "視差遮蔽バイアス" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "視差遮蔽反復" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "視差遮蔽モード" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "視差遮蔽スケール" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "視差遮蔽強度" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "TrueTypeフォントまたはビットマップへのパス。" + +#~ msgid "Path to save screenshots at." +#~ msgstr "スクリーンショットを保存するパス。" + +#~ msgid "Player name" +#~ msgstr "プレイヤー名" + +#~ msgid "Profiling" +#~ msgstr "プロファイリング" + +#~ msgid "Projecting dungeons" +#~ msgstr "突出するダンジョン" + +#~ msgid "PvP enabled" +#~ msgstr "PvP有効" + +#~ msgid "Reset singleplayer world" +#~ msgstr "ワールドをリセット" + +#~ msgid "Select Package File:" +#~ msgstr "パッケージファイルを選択:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "サーバー / シングルプレイヤー" + +#~ msgid "" +#~ "Set the shadow update time.\n" +#~ "Lower value means shadows and map updates faster, but it consume more " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "影の更新時間を設定します。\n" +#~ "値が小さいほど影やマップの更新が速くなりますが、リソースを多く消費しま" +#~ "す。\n" +#~ "最小値0.001秒、最大値0.2秒" + +#~ msgid "Shadow limit" +#~ msgstr "影の制限" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "フォールバックフォントの影のオフセット(ピクセル単位)。 \n" +#~ "0の場合、影は描画されません。" + +#~ msgid "Special" +#~ msgstr "スペシャル" + +#~ msgid "Special key" +#~ msgstr "スペシャルキー" + +#~ msgid "Start Singleplayer" +#~ msgstr "シングルプレイスタート" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "生成された法線マップの強さです。" + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "光度曲線ミッドブーストの強さ。" + +#~ msgid "This font will be used for certain languages." +#~ msgstr "このフォントは特定の言語で使用されます。" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "" +#~ "シェーダーを有効にするにはOpenGLのドライバを使用する必要があります。" + +#~ msgid "Toggle Cinematic" +#~ msgstr "映画風モード切替" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "浮遊大陸の山の中間点の上と下の典型的な最大高さ。" + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "浮遊大陸の滑らかな地形における丘の高さと湖の深さの変動。" + +#~ msgid "View" +#~ msgstr "見る" + +#~ msgid "Waving Water" +#~ msgstr "揺れる水" + +#~ msgid "Waving water" +#~ msgstr "揺れる水" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "フリータイプフォントを使用するかどうかは、フリータイプをサポートして\n" +#~ "コンパイルされている必要があります。 \n" +#~ "無効にした場合、代わりにビットマップおよび XML ベクターフォントが使用され" +#~ "ます。" + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "ダンジョンが時折地形から突出するかどうか。" + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "大きな洞窟内の溶岩のY高さ上限。" + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "浮遊大陸の中間点と湖面のYレベル。" + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "浮遊大陸の影が広がるYレベル。" + +#~ 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" +#~ "あなたのパスワードを再入力してから '参加登録' をクリックしてアカウント作成" +#~ "するか、\n" +#~ "キャンセルをクリックして中断してください。" + +#~ msgid "You died." +#~ msgstr "あなたは死にました。" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/jbo/minetest.po b/po/jbo/minetest.po index 016dd43ed..1f5f4e500 100644 --- a/po/jbo/minetest.po +++ b/po/jbo/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Lojban (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-03-15 18:36+0000\n" -"Last-Translator: Robin Townsend <iantownsend@disroot.org>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2021-02-13 08:50+0000\n" +"Last-Translator: Wuzzy <almikes@aol.com>\n" "Language-Team: Lojban <https://hosted.weblate.org/projects/minetest/minetest/" "jbo/>\n" "Language: jbo\n" @@ -12,7 +12,48 @@ 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.0-dev\n" +"X-Generator: Weblate 4.5-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "minde" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "sisti tu'a le se kelci" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "minde" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "nonselkansa" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "nonselkansa" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,8 +63,39 @@ msgstr "tolcanci" msgid "You died" msgstr ".i do morsi" +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "minde" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "minde" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" +msgstr "fitytu'i" + +#: builtin/fstk/ui.lua +msgid "<none available>" msgstr "" #: builtin/fstk/ui.lua @@ -49,9 +121,30 @@ msgstr "za'u re'u samjo'e" msgid "The server has requested a reconnect:" msgstr ".i le samtcise'u cu cpedu pa nu za'u re'u co'a samjo'e" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr ".i ca'o samymo'i" +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr ".i ko cuxna fi lu'i le munje" + +#: 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 @@ -68,10 +161,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -".i ko troci lo nu za'u re'u samymo'i lo liste be lo'i samse'u .i ko cipcta " -"lo do te samjo'e" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -81,17 +172,26 @@ msgstr "" msgid "We support protocol versions between version $1 and $2." msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "sisti" +msgstr "fitytoltu'i" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "jai se nitcu" @@ -165,14 +265,54 @@ msgstr "munje" msgid "enabled" msgstr "katci" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr ".i ca'o samymo'i" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "se cmima ro bakfu" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "xruti fi tu'a le ralju liste" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "cfari fa lo nu kelci" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -187,7 +327,6 @@ msgid "Failed to download $1" msgstr ".i da nabmi fi le nu kibycpa la'o zoi. $1 .zoi" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "se kelci" @@ -196,7 +335,20 @@ msgid "Install" msgstr "samtcise'a" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "samtcise'a" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "na'e se nitcu" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "se samtcise'a" @@ -209,9 +361,24 @@ msgid "No results" msgstr ".i no da ckaji lo se sisku" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "sisku" +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy @@ -227,7 +394,11 @@ msgid "Update" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -260,7 +431,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Caves" -msgstr "" +msgstr "kevzda" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" @@ -272,18 +443,13 @@ msgid "Decorations" msgstr "datni" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "" -".i ko kibycpa pa se kelci to mupli fa la .maintest. se kelci toi la'o zoi. " -"minetest.net .zoi" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr ".i ko kibycpa pa se kelci la'o zoi. minetest.net .zoi" +#, fuzzy +msgid "Development Test is meant for developers." +msgstr ".i la'o zoi. Minimal development test .zoi na'o selpli lo favgau .o'i" #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "" +msgstr "kevdi'u" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" @@ -291,15 +457,12 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "" +msgstr "lo tumla cu fulta lo tsani" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Floatlands (experimental)" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "se kelci" +msgstr "fulta tumla" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" @@ -317,6 +480,15 @@ msgstr "" msgid "Increases humidity around rivers" msgstr "" +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "samtcise'a" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "" + #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" msgstr "" @@ -340,7 +512,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "cmana" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" @@ -364,7 +536,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Rivers" -msgstr "" +msgstr "rirxe" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" @@ -372,9 +544,8 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Seed" -msgstr "cunso jai krasi" +msgstr "cunso namcu" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" @@ -418,11 +589,6 @@ msgstr "" 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 ".i la'o zoi. Minimal development test .zoi na'o selpli lo favgau .o'i" - #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "cmene le munje" @@ -453,6 +619,38 @@ msgstr "" msgid "Delete World \"$1\"?" msgstr ".i xu do djica le nu vimcu la'o zoi. $1 .zoi noi munje" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +#, fuzzy +msgid "Confirm Password" +msgstr "le rapli lerpoijaspu" + +#: 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 "lo lerpoijaspu" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr ".i lu'i le re lerpoijaspu na simxu le ka mintu" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "mulno" @@ -484,6 +682,16 @@ msgid "Browse" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "kakne le ka se samtcise'a" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "kakne le ka se samtcise'a" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "ganda" @@ -508,7 +716,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -527,6 +735,10 @@ msgstr "xruti fi le zmiselcu'a" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "sisku" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "cuxna fi lu'i le datnyveimei" @@ -535,7 +747,7 @@ msgstr "cuxna fi lu'i le datnyveimei" msgid "Select file" msgstr "cuxna fi lu'i le datnyvei" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "" @@ -616,14 +828,6 @@ msgstr "" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" @@ -644,6 +848,59 @@ msgstr "" msgid "Unable to install a modpack as a $1" msgstr "" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr ".i ca'o samymo'i" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +".i ko troci lo nu za'u re'u samymo'i lo liste be lo'i samse'u .i ko cipcta " +"lo do te samjo'e" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "liste lu'i ro ca gunka" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "cuxna fi lu'i le datnyveimei" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "liste lu'i ro pu je nai ca gunka" + +#: 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 msgid "Browse online content" msgstr "" @@ -687,26 +944,6 @@ msgstr "to'e samtcise'a le bakfu" msgid "Use Texture Pack" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "liste lu'i ro ca gunka" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "liste lu'i ro gunka" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "liste lu'i ro pu je nai ca gunka" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "" @@ -716,16 +953,12 @@ msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "tcimi'e" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "finti se kelci" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" -msgstr "" +msgstr "pilno lo selxai" #: builtin/mainmenu/tab_local.lua #, fuzzy @@ -740,10 +973,6 @@ msgstr "co'a samtcise'u" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "cmene .i lerpoijaspu" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "cnino" @@ -756,10 +985,15 @@ msgstr ".i do no munje cu cupra ja cu cuxna" msgid "Play Game" msgstr "co'a kelci" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "judrnporte" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr ".i ko cuxna fi lu'i le munje" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr ".i ko cuxna fi lu'i le munje" @@ -773,44 +1007,64 @@ msgid "Start Game" msgstr "co'a kelci" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "judri .i judrnporte" +#, fuzzy +msgid "Address" +msgstr "- judri: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "co'a samjo'e" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "finti se kelci" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "co'u cmima lu'i ro nelci se tcita" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "nelci se tcita" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "co'a kansa fi le ka kelci" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "cmene .i lerpoijaspu" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr ".pin. temci" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "co'u cmima lu'i ro nelci se tcita" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Server Description" +msgstr "ve skicu le samtcise'u" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -818,9 +1072,8 @@ msgid "2x" msgstr "" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "3D Clouds" -msgstr "le bliku dilnu" +msgstr "cibyca'u dilnu" #: builtin/mainmenu/tab_settings.lua msgid "4x" @@ -838,10 +1091,6 @@ msgstr "se cmima ro te tcimi'e" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr ".i xu do djica le nu xruti le do nonselkansa munje" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -850,11 +1099,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "puvyrelyli'iju'e" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Bump Mapping" -msgstr "lo puvrmipmepi" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "" @@ -864,37 +1108,46 @@ msgstr "" msgid "Connected Glass" msgstr "lo jorne blaci" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Fancy Leaves" msgstr "lo tolkli pezli" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Mipmap" msgstr "lo puvrmipmepi" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Mipmap + Aniso. Filter" msgstr "lo puvrmipmepi .e lo puvytolmanfyju'e" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "na go'i" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "No Mipmap" -msgstr "lo puvrmipmepi" +msgstr "" #: builtin/mainmenu/tab_settings.lua #, fuzzy @@ -916,22 +1169,12 @@ msgid "Opaque Leaves" msgstr "lo tolkli pezli" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Opaque Water" -msgstr "lo tolkli djacu" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" +msgstr "tolkli djacu" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Particles" -msgstr "lo kantu" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "xruti le nonselkansa munje" +msgstr "kantu" #: builtin/mainmenu/tab_settings.lua msgid "Screen:" @@ -945,6 +1188,11 @@ msgstr "te tcimi'e" msgid "Shaders" msgstr "ti'orkemsamtci" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "ti'orkemsamtci to na kakne toi" + #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Shaders (unavailable)" @@ -964,23 +1212,27 @@ msgstr "lo xutla se gusni" msgid "Texturing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp #, fuzzy msgid "Tone Mapping" msgstr "lo puvrmipmepi" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +msgid "Touch threshold (px):" msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "puvycibli'iju'e" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Waving Leaves" @@ -996,23 +1248,14 @@ msgstr ".i ca'o samymo'i lo me la'o gy.node.gy." msgid "Waving Plants" msgstr "lo melbi pezli" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "go'i" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "ralju" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "co'a nonselkansa kelci" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "" +".i da nabmi fi le nu co'a jorne to la'a cu'i le temci cu dukse le ka clani " +"toi" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "" @@ -1046,7 +1289,8 @@ msgstr "" "toi" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "" ".i na cumki fa le nu le se kelci cu jai se facki je cu se samymo'i .i ky. du " "la'o zoi." @@ -1079,18 +1323,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1103,14 +1335,6 @@ msgstr "" msgid "- Address: " msgstr "- judri: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- finti se kelci: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1133,6 +1357,16 @@ msgstr "- kakne le ka simxu le ka xrani: " msgid "- Server Name: " msgstr "- cmene le samtcise'u: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr ".i da nabmi" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Automatic forward disabled" @@ -1143,6 +1377,22 @@ msgstr "za'i ca'u muvdu" msgid "Automatic forward enabled" msgstr "za'i ca'u muvdu" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1151,6 +1401,10 @@ msgstr "" msgid "Camera update enabled" msgstr "" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "basti fi le ka lerpoijaspu" @@ -1165,6 +1419,11 @@ msgstr "le nu finti kelci" msgid "Cinematic mode enabled" msgstr "le nu finti kelci" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "lo samtciselse'u" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1173,6 +1432,10 @@ msgstr "" msgid "Connecting to server..." msgstr ".i ca'o samjo'e le samse'u" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "ranji" @@ -1185,17 +1448,22 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr ".i ca'o cupra le samtciselse'u" @@ -1240,6 +1508,11 @@ msgstr "" msgid "Enabled unlimited viewing range" msgstr "" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr ".i ca'o cupra le samtciselse'u" + #: src/client/game.cpp msgid "Exit to Menu" msgstr "sisti tu'a le se kelci" @@ -1317,32 +1590,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +#, fuzzy +msgid "Multiplayer" +msgstr "nonselkansa" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1399,7 +1649,7 @@ msgstr "nonselkansa" #: src/client/game.cpp msgid "Sound Volume" -msgstr "" +msgstr "ni sance" #: src/client/game.cpp #, fuzzy @@ -1419,6 +1669,21 @@ msgstr "" msgid "Sound unmuted" msgstr "lo ni sance " +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1437,7 +1702,7 @@ msgstr "" #: src/client/game.cpp #, c-format msgid "Volume changed to %d%%" -msgstr "" +msgstr ".i fe lo ni sance cu cenba fi li %d ce'i" #: src/client/game.cpp msgid "Wireframe shown" @@ -1488,10 +1753,6 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "" @@ -1548,9 +1809,8 @@ msgid "Insert" msgstr "" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Left" -msgstr "za'i zu'e muvdu" +msgstr "zu'e muvdu" #: src/client/keycode.cpp msgid "Left Button" @@ -1676,9 +1936,8 @@ msgid "Return" msgstr "" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Right" -msgstr "za'i ri'u muvdu" +msgstr "ri'u muvdu" #: src/client/keycode.cpp msgid "Right Button" @@ -1747,22 +2006,31 @@ msgstr "la'o gy.X Button 2.gy." msgid "Zoom" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr ".i lu'i le re lerpoijaspu na simxu le ka mintu" - -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr ".i da nabmi fi le nu kibycpa la'o zoi. $1 .zoi" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1770,7 +2038,7 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1783,16 +2051,23 @@ msgid "Automatic jumping" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy +msgid "Aux1" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp msgid "Backward" -msgstr "za'i ti'a muvdu" +msgstr "ti'a muvdu" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Change camera" msgstr "gafygau lo lerpoijaspu" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "tavla" @@ -1810,21 +2085,19 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. volume" -msgstr "" +msgstr "jdikygau lo ni sance" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Drop" -msgstr "mu'e falcru" +msgstr "falcru" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Forward" -msgstr "za'i ca'u muvdu" +msgstr "ca'u muvdu" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. range" @@ -1832,7 +2105,7 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" -msgstr "" +msgstr "zengau lo ni sance" #: src/gui/guiKeyChangeMenu.cpp msgid "Inventory" @@ -1847,7 +2120,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 @@ -1879,10 +2152,6 @@ msgstr "vidnyxra" msgid "Sneak" msgstr "masno cadzu" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Toggle HUD" @@ -1931,11 +2200,6 @@ msgstr ".i ko da'ergau pa batke" msgid "Change" msgstr "basti" -#: src/gui/guiPasswordChange.cpp -#, fuzzy -msgid "Confirm Password" -msgstr "le rapli lerpoijaspu" - #: src/gui/guiPasswordChange.cpp #, fuzzy msgid "New Password" @@ -1946,6 +2210,10 @@ msgstr "lo cnino lerpoijaspu" msgid "Old Password" msgstr "lo slabu lerpoijaspu" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr ".i lu'i le re lerpoijaspu na simxu le ka mintu" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "sisti" @@ -1956,16 +2224,10 @@ msgid "Muted" msgstr "ko da'ergau le batke" #: src/gui/guiVolumeChange.cpp -#, fuzzy -msgid "Sound Volume: " +#, fuzzy, c-format +msgid "Sound Volume: %d%%" msgstr "lo ni sance " -#. ~ 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). @@ -1973,6 +2235,16 @@ msgstr "" msgid "LANG_CODE" msgstr "jbo" +#: 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 ".i ko ckaji le ka da zo'u jdice le du'u da cmene" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1981,8 +2253,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -2009,12 +2281,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2044,9 +2310,8 @@ msgid "2D noise that locates the river valleys and channels." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D clouds" -msgstr "le bliku dilnu" +msgstr "cibyca'u dilnu" #: src/settings_translation_file.cpp msgid "3D mode" @@ -2104,6 +2369,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2123,6 +2392,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2168,6 +2441,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2178,6 +2455,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "cmene le munje" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2192,7 +2474,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2260,6 +2542,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Automatic forward key" @@ -2281,6 +2567,15 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "mu'e plipe" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Backward key" @@ -2294,10 +2589,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "jicmu" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "jicmu se curmi" @@ -2320,7 +2611,7 @@ msgid "Bind address" msgstr ".i ca'o troci lo nu facki lo samjudri" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +msgid "Biome API noise parameters" msgstr "" #: src/settings_translation_file.cpp @@ -2328,11 +2619,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2360,8 +2651,9 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "gafygau lo lerpoijaspu" #: src/settings_translation_file.cpp msgid "" @@ -2434,15 +2726,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "minde" + #: src/settings_translation_file.cpp msgid "Chat font size" msgstr "" @@ -2478,8 +2769,8 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Chatcommands" -msgstr "minde" +msgid "Chat weblinks" +msgstr ".i ca viska le tavla .uidje" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2499,6 +2790,12 @@ msgstr "le nu finti kelci" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "lo samtciselse'u" @@ -2521,6 +2818,11 @@ msgstr "lo samtciselse'u" msgid "Client side node lookup range restriction" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "lo samtciselse'u" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -2546,6 +2848,11 @@ msgstr "lo ralju" msgid "Colored fog" msgstr "le bumgapci cu skari" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "le bumgapci cu skari" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2574,6 +2881,22 @@ msgstr "" msgid "Command key" msgstr "minde" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Connect glass" @@ -2600,10 +2923,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2631,7 +2962,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 @@ -2662,7 +2995,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2670,7 +3005,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2694,11 +3031,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 @@ -2737,8 +3074,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2769,12 +3107,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2847,8 +3179,17 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Developer Options" +msgstr "datni" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "za'i ri'u muvdu" + +#: src/settings_translation_file.cpp msgid "Digging particles" -msgstr "lo kantu" +msgstr "kakpa kantu" #: src/settings_translation_file.cpp #, fuzzy @@ -2859,6 +3200,16 @@ msgstr "lo kantu" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2903,18 +3254,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2931,22 +3299,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2995,14 +3357,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -3011,18 +3365,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3031,6 +3373,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -3039,12 +3391,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3056,7 +3402,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3076,18 +3426,6 @@ msgstr "" msgid "Fallback font path" msgstr "no" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3106,7 +3444,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3140,13 +3478,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3213,6 +3551,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3234,15 +3576,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3251,6 +3593,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3311,10 +3664,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3339,10 +3688,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3360,7 +3705,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "se kelci" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3371,7 +3725,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3390,6 +3744,14 @@ msgstr "" 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 "" @@ -3407,9 +3769,14 @@ 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 ".i ca viska le crakemsazycimde" + #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -3417,8 +3784,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3440,7 +3807,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3451,10 +3819,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3650,10 +4014,17 @@ 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 "" @@ -3686,8 +4057,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3709,11 +4079,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3737,7 +4113,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 @@ -3754,6 +4132,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3770,10 +4154,6 @@ msgstr "" 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 "" @@ -3801,7 +4181,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3824,16 +4204,12 @@ msgstr "" 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 @@ -3885,6 +4261,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3965,6 +4345,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4064,6 +4451,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4437,6 +4831,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4494,7 +4892,7 @@ msgstr "za'i zu'e muvdu" 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 @@ -4504,15 +4902,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 @@ -4524,7 +4925,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4551,6 +4953,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "lo xutla se gusni" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4623,22 +5030,21 @@ msgstr "" msgid "Main menu script" msgstr "lo ralju" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "lo ralju" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4700,6 +5106,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4805,7 +5215,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4853,6 +5267,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4907,17 +5328,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4963,16 +5388,27 @@ msgid "Minimum texture size" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mipmapping" msgstr "lo puvrmipmepi" +#: 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4983,6 +5419,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5050,16 +5490,17 @@ msgstr "" msgid "Near plane" msgstr "" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "te samjo'e" - #: 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 "te samjo'e" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "" @@ -5072,6 +5513,11 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "lo xutla se gusni" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5084,14 +5530,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5113,18 +5551,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5134,11 +5564,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5147,38 +5572,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5201,17 +5600,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5240,16 +5635,21 @@ msgstr "le nu finti kelci" msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "le nu finti kelci" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + #: 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 "plicme" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5258,6 +5658,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "puvyrelyli'iju'e" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5292,10 +5697,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5303,9 +5704,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5397,10 +5798,6 @@ msgstr "" msgid "Right key" msgstr "za'i ri'u muvdu" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5470,6 +5867,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "vidnyxra" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5497,6 +5899,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "vidnyxra" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5509,10 +5916,6 @@ msgstr "" 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 "" @@ -5554,8 +5957,18 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Server / Singleplayer" -msgstr "pa kelci" +msgid "Server" +msgstr "veirjudri le samtcise'u" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "cmene le samtcise'u" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "ve skicu le samtcise'u" #: src/settings_translation_file.cpp msgid "Server URL" @@ -5581,11 +5994,21 @@ msgstr "judrnporte le samtcise'u" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "judrnporte le samtcise'u" + #: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "lo samtcise'u" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "lo samtcise'u" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "" @@ -5597,7 +6020,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5618,6 +6069,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "judri le ti'orkemsamtci" @@ -5630,6 +6088,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5637,9 +6111,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5654,6 +6126,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5675,6 +6157,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5733,16 +6219,11 @@ msgid "Sneaking speed, in nodes per second." msgstr "" #: src/settings_translation_file.cpp -msgid "Sound" +msgid "Soft shadow radius" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "za'i masno cadzu" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" +msgid "Sound" msgstr "" #: src/settings_translation_file.cpp @@ -5760,6 +6241,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5787,10 +6276,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5828,6 +6313,11 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "te tcimi'e" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -5870,6 +6360,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5884,6 +6381,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5939,18 +6440,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5968,6 +6469,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5976,9 +6483,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6015,7 +6521,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 @@ -6038,6 +6544,18 @@ msgstr "" 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 "" @@ -6109,15 +6627,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6211,13 +6744,12 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Volume" -msgstr "lo ni sance " +msgstr "lo ni sance" #: src/settings_translation_file.cpp msgid "" @@ -6288,6 +6820,10 @@ msgstr "lo melbi pezli" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6309,18 +6845,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6355,13 +6889,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6446,27 +6989,110 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- finti se kelci: " + +#~ msgid "Address / Port" +#~ msgstr "lo samjudri jo'u judrnporte" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr ".i xu do djica le nu xruti le do nonselkansa munje" + +#~ msgid "Back" +#~ msgstr "xruti" + +#~ msgid "Basic" +#~ msgstr "jicmu" + +#, fuzzy +#~ msgid "Bump Mapping" +#~ msgstr "lo puvrmipmepi" + +#~ msgid "Configure" +#~ msgstr "tcimi'e" + +#~ msgid "Connect" +#~ msgstr "co'a samjo'e" + +#~ msgid "Credits" +#~ msgstr "liste lu'i ro gunka" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "" +#~ ".i ko kibycpa pa se kelci to mupli fa la .maintest. se kelci toi la'o " +#~ "zoi. minetest.net .zoi" + +#~ msgid "Download one from minetest.net" +#~ msgstr ".i ko kibycpa pa se kelci la'o zoi. minetest.net .zoi" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr ".i ca'o kibycpa la'o zoi. $1 .zoi je cu samtcise'a ri .i ko denpa" #, fuzzy #~ msgid "Enable VBO" #~ msgstr "selpli" -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr ".i ca'o kibycpa la'o zoi. $1 .zoi je cu samtcise'a ri .i ko denpa" +#~ msgid "Game" +#~ msgstr "se kelci" -#~ msgid "Back" -#~ msgstr "xruti" +#~ msgid "Main" +#~ msgstr "ralju" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "lo ralju" + +#~ msgid "Name / Password" +#~ msgstr "lo cmene .e lo lerpoijaspu" + +#~ msgid "Name/Password" +#~ msgstr "cmene .i lerpoijaspu" + +#~ msgid "No" +#~ msgstr "na go'i" #~ msgid "Ok" #~ msgstr "je'e" + +#~ msgid "Player name" +#~ msgstr "plicme" + +#~ msgid "Reset singleplayer world" +#~ msgstr "xruti le nonselkansa munje" + +#, fuzzy +#~ msgid "Server / Singleplayer" +#~ msgstr "pa kelci" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "za'i masno cadzu" + +#~ msgid "Start Singleplayer" +#~ msgstr "co'a nonselkansa kelci" + +#~ msgid "Yes" +#~ msgstr "go'i" + +#, fuzzy +#~ msgid "You died." +#~ msgstr ".i do morsi" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/kk/minetest.po b/po/kk/minetest.po index 3f68fbc97..7e97de7bd 100644 --- a/po/kk/minetest.po +++ b/po/kk/minetest.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: Kazakh (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-07-06 21:41+0000\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2020-09-09 01:23+0000\n" "Last-Translator: Fontan 030 <pomanfedurin@gmail.com>\n" "Language-Team: Kazakh <https://hosted.weblate.org/projects/minetest/minetest/" "kk/>\n" @@ -12,7 +12,46 @@ 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.3-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Мәзірге шығу" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "Бір ойыншы" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "Бір ойыншы" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +61,39 @@ msgstr "" msgid "You died" msgstr "" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Lua скриптінде қате кездесті:" @@ -46,9 +114,29 @@ msgstr "" msgid "The server has requested a reconnect:" msgstr "" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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 msgid "Protocol version mismatch. " @@ -63,7 +151,7 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" #: builtin/mainmenu/common.lua @@ -74,17 +162,26 @@ msgstr "" msgid "We support protocol versions between version $1 and $2." msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Болдырмау" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "" @@ -155,14 +252,53 @@ msgstr "" msgid "enabled" msgstr "қосылған" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Жүктелуде..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -176,7 +312,6 @@ msgid "Failed to download $1" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Ойындар" @@ -185,7 +320,19 @@ msgid "Install" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "Жою" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Модтар" @@ -198,9 +345,25 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Іздеу" +#, fuzzy +msgid "No updates" +msgstr "Жаңарту" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -215,7 +378,11 @@ msgid "Update" msgstr "Жаңарту" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -259,11 +426,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 @@ -282,10 +445,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 "" @@ -302,6 +461,15 @@ msgstr "" 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 "Көлдер" @@ -401,10 +569,6 @@ msgstr "" 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 "" @@ -435,6 +599,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 +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 "" @@ -466,6 +661,14 @@ 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 "" @@ -490,7 +693,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -509,6 +712,10 @@ msgstr "" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Іздеу" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "" @@ -517,7 +724,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 "" @@ -596,14 +803,6 @@ msgstr "" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" @@ -624,6 +823,56 @@ msgstr "" msgid "Unable to install a modpack as a $1" msgstr "" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Жүктелуде..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "" @@ -664,26 +913,6 @@ msgstr "" msgid "Use Texture Pack" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "" @@ -693,14 +922,10 @@ msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "" @@ -716,10 +941,6 @@ msgstr "" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Жаңа" @@ -732,10 +953,14 @@ msgstr "" msgid "Play Game" msgstr "" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "" @@ -749,44 +974,60 @@ msgid "Start Game" msgstr "" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" +msgid "Address" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" msgstr "" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_online.lua +msgid "Login" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +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 @@ -813,21 +1054,13 @@ msgstr "" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" +msgstr "Бисызықты фильтрация" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" @@ -837,12 +1070,28 @@ msgstr "" msgid "Connected Glass" msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -853,10 +1102,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Жоқ" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" @@ -875,7 +1120,7 @@ msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "None" -msgstr "" +msgstr "Жоқ" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" @@ -885,17 +1130,9 @@ msgstr "" msgid "Opaque Water" msgstr "" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" +msgstr "Бөлшектер" #: builtin/mainmenu/tab_settings.lua msgid "Screen:" @@ -909,6 +1146,10 @@ msgstr "Баптаулар" msgid "Shaders" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -923,22 +1164,26 @@ msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Texturing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" +msgstr "Текстурлеу:" #: 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 "Үшсызықты фильтрация" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -953,23 +1198,11 @@ msgstr "" msgid "Waving Plants" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Иә" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "" @@ -998,7 +1231,7 @@ msgid "Connection error (timed out?)" msgstr "" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +msgid "Could not find or load game: " msgstr "" #: src/client/clientlauncher.cpp @@ -1029,18 +1262,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1051,14 +1272,6 @@ msgstr "" msgid "- Address: " msgstr "" -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1080,6 +1293,16 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Қате кездесті:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "" @@ -1088,6 +1311,22 @@ msgstr "" msgid "Automatic forward enabled" msgstr "" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1097,9 +1336,13 @@ msgid "Camera update enabled" msgstr "" #: src/client/game.cpp -msgid "Change Password" +msgid "Can't show block bounds (disabled by mod or game)" msgstr "" +#: src/client/game.cpp +msgid "Change Password" +msgstr "Құпия сөзді өзгерту" + #: src/client/game.cpp msgid "Cinematic mode disabled" msgstr "" @@ -1108,6 +1351,10 @@ msgstr "" msgid "Cinematic mode enabled" msgstr "" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1116,6 +1363,10 @@ msgstr "" msgid "Connecting to server..." msgstr "" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Жалғастыру" @@ -1128,17 +1379,22 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "" @@ -1183,6 +1439,11 @@ msgstr "" 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 "Мәзірге шығу" @@ -1256,32 +1517,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Миникарта жасырылды" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +#, fuzzy +msgid "Multiplayer" +msgstr "Бір ойыншы" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1355,6 +1593,21 @@ msgstr "" msgid "Sound unmuted" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1424,10 +1677,6 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "" @@ -1675,22 +1924,30 @@ msgstr "" msgid "Zoom" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Миникарта жасырылды" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1698,7 +1955,7 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1709,15 +1966,23 @@ msgstr "" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "" @@ -1770,7 +2035,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 @@ -1801,10 +2066,6 @@ msgstr "" msgid "Sneak" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1845,10 +2106,6 @@ msgstr "" msgid "Change" msgstr "" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "" @@ -1857,6 +2114,10 @@ msgstr "" msgid "Old Password" msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "" @@ -1866,13 +2127,8 @@ msgid "Muted" msgstr "" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " +#, c-format +msgid "Sound Volume: %d%%" msgstr "" #. ~ DO NOT TRANSLATE THIS LITERALLY! @@ -1882,6 +2138,15 @@ msgstr "" msgid "LANG_CODE" msgstr "kk" +#: 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" @@ -1890,8 +2155,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1918,12 +2183,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2012,6 +2271,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2030,6 +2293,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2075,6 +2342,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2085,6 +2356,10 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2099,7 +2374,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2167,6 +2442,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2187,6 +2466,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2199,10 +2486,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2224,7 +2507,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 @@ -2232,11 +2515,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2264,7 +2547,7 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" +msgid "Camera" msgstr "" #: src/settings_translation_file.cpp @@ -2338,15 +2621,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Чат көрсетілді" + #: src/settings_translation_file.cpp msgid "Chat font size" msgstr "" @@ -2380,8 +2662,9 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" +#, fuzzy +msgid "Chat weblinks" +msgstr "Чат көрсетілді" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2399,6 +2682,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2419,6 +2708,10 @@ msgstr "" 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 "" @@ -2443,6 +2736,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2470,6 +2767,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2494,10 +2807,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2524,7 +2845,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 @@ -2555,7 +2878,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2563,7 +2888,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2587,11 +2914,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 @@ -2630,8 +2957,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2662,12 +2990,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2738,6 +3060,14 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "" @@ -2750,6 +3080,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2794,18 +3134,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2822,22 +3179,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2886,14 +3237,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2902,18 +3245,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2922,6 +3253,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2930,12 +3271,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2947,7 +3282,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2966,18 +3305,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -2996,7 +3323,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3030,13 +3357,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3103,6 +3430,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3124,15 +3455,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3141,6 +3472,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3200,10 +3542,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "FreeType қаріптері" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3228,10 +3566,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3249,7 +3583,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3260,7 +3603,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3279,6 +3622,16 @@ msgstr "" 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 "Гравитация" @@ -3296,9 +3649,14 @@ 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 "" @@ -3306,8 +3664,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3329,7 +3687,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3340,10 +3699,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3539,10 +3894,17 @@ 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 "" @@ -3575,8 +3937,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3598,11 +3959,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3626,7 +3993,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 @@ -3643,6 +4012,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3659,10 +4034,6 @@ msgstr "" 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 "" @@ -3690,7 +4061,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3713,16 +4084,12 @@ msgstr "" 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 @@ -3773,6 +4140,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3852,6 +4223,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3951,6 +4329,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4324,6 +4709,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4380,7 +4769,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 @@ -4390,15 +4779,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 @@ -4410,7 +4802,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4437,6 +4830,10 @@ msgstr "" 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" @@ -4508,21 +4905,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4584,6 +4981,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4689,7 +5090,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4737,6 +5142,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4791,17 +5203,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4850,12 +5266,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4866,6 +5294,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4932,16 +5364,16 @@ msgstr "" 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 "" @@ -4954,6 +5386,10 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -4966,14 +5402,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -4995,18 +5423,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5016,11 +5436,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5029,38 +5444,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5083,17 +5472,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5122,13 +5507,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5139,6 +5528,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5173,10 +5566,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5184,9 +5573,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5276,10 +5665,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5349,6 +5734,10 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5376,6 +5765,10 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5388,10 +5781,6 @@ msgstr "" 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 "" @@ -5432,7 +5821,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" +msgid "Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Security" msgstr "" #: src/settings_translation_file.cpp @@ -5459,10 +5856,18 @@ msgstr "" 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 "" @@ -5474,7 +5879,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5495,6 +5928,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5507,6 +5947,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5514,9 +5970,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5531,6 +5985,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5552,6 +6016,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5606,18 +6074,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5633,6 +6097,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5660,10 +6132,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5701,6 +6169,11 @@ msgstr "" 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 "" @@ -5743,6 +6216,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5757,6 +6237,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5812,18 +6296,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5841,6 +6325,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5849,9 +6339,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5888,7 +6377,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 @@ -5911,6 +6400,18 @@ msgstr "" 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 "" @@ -5981,15 +6482,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6056,7 +6572,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Video driver" -msgstr "" +msgstr "Видеодрайвер" #: src/settings_translation_file.cpp msgid "View bobbing factor" @@ -6083,7 +6599,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6111,7 +6627,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Walking speed" -msgstr "" +msgstr "Жүру жылдамдығы" #: src/settings_translation_file.cpp msgid "Walking, flying and climbing speed in fast mode, in nodes per second." @@ -6153,6 +6669,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6174,18 +6694,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6220,13 +6738,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6276,7 +6803,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Y of upper limit of large caves." -msgstr "" +msgstr "Үлкен үңгірлердің жоғарғы шегінің Y координаты." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." @@ -6310,14 +6837,36 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "FreeType fonts" +#~ msgstr "FreeType қаріптері" + +#~ msgid "Game" +#~ msgstr "Ойын" + +#~ msgid "Main" +#~ msgstr "Басты мәзір" + +#~ msgid "No" +#~ msgstr "Жоқ" + +#~ msgid "Yes" +#~ msgstr "Иә" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/kn/minetest.po b/po/kn/minetest.po index 91fc52c2a..7d640cccf 100644 --- a/po/kn/minetest.po +++ b/po/kn/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Kannada (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2019-11-10 15:04+0000\n" -"Last-Translator: Krock <mk939@ymail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2021-01-02 07:29+0000\n" +"Last-Translator: Tejaswi Hegde <tejaswihegde1@gmail.com>\n" "Language-Team: Kannada <https://hosted.weblate.org/projects/minetest/" "minetest/kn/>\n" "Language: kn\n" @@ -12,7 +12,44 @@ 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 3.10-dev\n" +"X-Generator: Weblate 4.4.1-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "ಮುಖ್ಯ ಮೆನುಗೆ ಹಿಂತಿರುಗಿ" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,19 +59,46 @@ msgstr "ಮತ್ತೆ ಹುಟ್ಟು" msgid "You died" msgstr "ನೀನು ಸತ್ತುಹೋದೆ" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" +msgstr "ಸರಿ" + +#: builtin/fstk/ui.lua +msgid "<none available>" msgstr "" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred in a Lua script:" -msgstr "ಒಂದು ಲುವಾ ಸ್ಕ್ರಿಪ್ಟ್ ನಲ್ಲಿ ತಪ್ಪಾಗಿದೆ, ಉದಾಹರಣೆ ಮಾಡ್‍ನಲ್ಲಿ" +msgstr "ಒಂದು ಲುವಾ ಸ್ಕ್ರಿಪ್ಟ್ ನಲ್ಲಿ ತಪ್ಪಾಗಿದೆ:" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred:" -msgstr "ಒಂದು ತಪ್ಪಾಗಿದೆ:" +msgstr "ದೋಷ ವೊಂದು ಸಂಭವಿಸಿದೆ:" #: builtin/fstk/ui.lua msgid "Main menu" @@ -48,9 +112,29 @@ msgstr "ಮರುಸಂಪರ್ಕಿಸು" msgid "The server has requested a reconnect:" msgstr "ಸರ್ವರ್ ಮರುಸಂಪರ್ಕ ಮಾಡಲು ಕೇಳಿದೆ:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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 msgid "Protocol version mismatch. " @@ -61,17 +145,12 @@ msgid "Server enforces protocol version $1. " msgstr "ಸರ್ವರ್ ಪ್ರೋಟೋಕಾಲ್ ಆವೃತ್ತಿ $1 ಅನ್ನು ಜಾರಿಗೊಳಿಸುತ್ತದೆ. " #: builtin/mainmenu/common.lua -#, fuzzy msgid "Server supports protocol versions between $1 and $2. " -msgstr "" -"ಸರ್ವರ್ $1 ಮತ್ತು $2 ನಡುವೆಯ ಪ್ರೋಟೋಕಾಲ್ \n" -"ಅವೃತ್ತಿಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ. " +msgstr "ಸರ್ವರ್ $1 ಮತ್ತು $2 ನಡುವೆಯ ಪ್ರೋಟೋಕಾಲ್ ಅವೃತ್ತಿಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"ಪಬ್ಲಿಕ್ ಸರ್ವರ್ಲಿಸ್ಟ್ಅನ್ನು ರಿಎನೆಬಲ್ ಮಾಡಿ ಮತ್ತು ಅಂತರ್ಜಾಲ ಸಂಪರ್ಕ \n" -"ಪರಿಶೀಲಿಸಿ." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -81,17 +160,26 @@ msgstr "ನಾವು $ 1 ಪ್ರೋಟೋಕಾಲ್ ಆವೃತ್ತಿಯ msgid "We support protocol versions between version $1 and $2." msgstr "ಆವೃತ್ತಿ $1 ಮತ್ತು $2 ನಡುವಿನ ಪ್ರೋಟೋಕಾಲ್ ಆವೃತ್ತಿಯನ್ನು ನಾವು ಬೆಂಬಲಿಸುತ್ತೇವೆ." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "ರದ್ದುಮಾಡಿ" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "ಅವಲಂಬನೆಗಳು:" @@ -101,7 +189,7 @@ msgstr "ಎಲ್ಲವನ್ನೂ ನಿಷ್ಕ್ರಿಯೆಗೊಳ #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "" +msgstr "ಮಾಡ್ ಪ್ಯಾಕ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -109,47 +197,43 @@ msgstr "ಎಲ್ಲವನ್ನೂ ಸಕ್ರಿಯಗೊಳಿಸಿ" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" -msgstr "" +msgstr "ಮಾಡ್ ಪ್ಯಾಕ್ ಕ್ರಿಯಾತ್ಮಕಗೊಳಿಸಿ" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"\"$1\" ಮಾಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ ಏಕೆಂದರೆ ಅದು ಅನುಮತಿಸದ ಅಕ್ಷರಗಳನ್ನು ಒಳಗೊಂಡಿದೆ. " -"ಮಾತ್ರ chararacters [a-z0-9_] ಅನುಮತಿಸಲಾಗಿದೆ." +"ಅನುಮತಿಸದೇ ಇರುವ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರುವ ುದರಿಂದ 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 "ಮಾಡ್:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No (optional) dependencies" -msgstr "ಐಚ್ಛಿಕ ಅವಲಂಬನೆಗಳು:" +msgstr "(ಐಚ್ಛಿಕ) ಅವಲಂಬನೆಗಳು ಇಲ್ಲ" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." msgstr "ಯಾವುದೇ ಆಟದ ವಿವರಣೆ ಒದಗಿಸಿಲ್ಲ." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "ಐಚ್ಛಿಕ ಅವಲಂಬನೆಗಳು:" +msgstr "ಯಾವುದೇ ಗಟ್ಟಿ ಅವಲಂಬನೆಗಳಿಲ್ಲ" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." msgstr "ಯಾವುದೇ ಮಾಡ್ಪ್ಯಾಕ್ ವಿವರಣೆ ಕೊಟ್ಟಿಲ್ಲ." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No optional dependencies" -msgstr "ಐಚ್ಛಿಕ ಅವಲಂಬನೆಗಳು:" +msgstr "ಯಾವುದೇ ಐಚ್ಛಿಕ ಅವಲಂಬನೆಗಳಿಲ್ಲ" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" @@ -168,29 +252,66 @@ msgstr "ಪ್ರಪಂಚ:" msgid "enabled" msgstr "ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "ಡೌನ್ ಲೋಡ್ ಆಗುತ್ತಿದೆ..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "ಎಲ್ಲಾ ಪ್ಯಾಕೇಜುಗಳು" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "ಮುಖ್ಯ ಮೆನುಗೆ ಹಿಂತಿರುಗಿ" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" +msgid "Base Game:" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "cURL ಇಲ್ಲದೆ ಮೈನ್ ಟೆಸ್ಟ್ ಅನ್ನು ಕಂಪೈಲ್ ಮಾಡಿದಾಗ ContentDB ಲಭ್ಯವಿಲ್ಲ" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." -msgstr "ಲೋಡ್ ಆಗುತ್ತಿದೆ..." +msgstr "ಡೌನ್ ಲೋಡ್ ಆಗುತ್ತಿದೆ..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" msgstr "$1 ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಆಗಿಲ್ಲ" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "ಆಟಗಳು" @@ -199,22 +320,51 @@ msgid "Install" msgstr "ಇನ್ಸ್ಟಾಲ್" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "ಇನ್ಸ್ಟಾಲ್" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "ಐಚ್ಛಿಕ ಅವಲಂಬನೆಗಳು:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "ಮಾಡ್‍ಗಳು" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" -msgstr "" +msgstr "ಯಾವುದೇ ಪ್ಯಾಕೇಜ್ ಗಳನ್ನು ಪಡೆಯಲಾಗಲಿಲ್ಲ" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" msgstr "ಫಲಿತಾಂಶಗಳಿಲ್ಲ" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "ಹುಡುಕು" +#, fuzzy +msgid "No updates" +msgstr "ನವೀಕರಿಸಿ" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -229,16 +379,20 @@ msgid "Update" msgstr "ನವೀಕರಿಸಿ" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" 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" @@ -249,133 +403,150 @@ msgid "Altitude dry" msgstr "" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Biome blending" -msgstr "" +msgstr "ಪ್ರದೇಶ ಮಿಶ್ರಣ" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Biomes" -msgstr "" +msgstr "ಪ್ರದೇಶಗಳು" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Caverns" -msgstr "" +msgstr "ಗುಹೆಗಳು" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Caves" -msgstr "" +msgstr "ಗುಹೆಗಳು" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Create" -msgstr "" +msgstr "ರಚಿಸು" #: builtin/mainmenu/dlg_create_world.lua msgid "Decorations" +msgstr "ಅಲಂಕಾರಗಳು" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Development Test is meant for developers." 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 "" - -#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy 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 +#, fuzzy 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 +#, fuzzy msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "ಫ್ರಾಕ್ಟಲ್ ಅಲ್ಲದ ಭೂಪ್ರದೇಶ ಸೃಷ್ಟಿಸಿ: ಸಾಗರಗಳು ಮತ್ತು ಭೂಗರ್ಭ" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "ಬೆಟ್ಟಗಳು" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy 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 "ಇನ್ಸ್ಟಾಲ್" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "ಕೆರೆ" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgstr "ಕಡಿಮೆ ಆರ್ದ್ರತೆ ಮತ್ತು ಅಧಿಕ ಶಾಖವು ಆಳವಿಲ್ಲದ ಅಥವಾ ಶುಷ್ಕ ನದಿಗಳನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen" -msgstr "" +msgstr "ಮ್ಯಾಪ್ಜೆನ್" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen flags" -msgstr "" +msgstr "ಮ್ಯಾಪ್ಜೆನ್ ಧ್ವಜಗಳು" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Mapgen-specific flags" -msgstr "" +msgstr "ಮ್ಯಾಪ್ಜೆನ್-ನಿರ್ದಿಷ್ಟ ಧ್ವಜಗಳು" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "ಪರ್ವತಗಳು" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy 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" -msgstr "" +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" -msgstr "" +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 +#, fuzzy msgid "Seed" -msgstr "" +msgstr "ಬೀಜ" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Smooth transition between biomes" -msgstr "" +msgstr "ಪ್ರದೇಶಗಳ ನಡುವೆ ಸುಗಮವಾದ ಸ್ಥಿತ್ಯಂತರ" #: builtin/mainmenu/dlg_create_world.lua msgid "" @@ -415,10 +586,6 @@ msgstr "" 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 "" @@ -449,6 +616,36 @@ 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 +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 msgid "Accept" msgstr "" @@ -480,6 +677,14 @@ 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 "" @@ -504,7 +709,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -523,6 +728,10 @@ msgstr "" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "ಹುಡುಕು" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "" @@ -531,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 "" @@ -610,14 +819,6 @@ msgstr "" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" @@ -638,6 +839,56 @@ msgstr "" msgid "Unable to install a modpack as a $1" msgstr "" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "ಲೋಡ್ ಆಗುತ್ತಿದೆ..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "ಪಬ್ಲಿಕ್ ಸರ್ವರ್ಲಿಸ್ಟ್ಅನ್ನು ರಿಎನೆಬಲ್ ಮಾಡಿ ಮತ್ತು ಅಂತರ್ಜಾಲ ಸಂಪರ್ಕ ಪರಿಶೀಲಿಸಿ." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "" @@ -678,26 +929,6 @@ msgstr "" msgid "Use Texture Pack" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "" @@ -707,14 +938,10 @@ msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "" @@ -730,10 +957,6 @@ msgstr "" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "" @@ -746,10 +969,14 @@ msgstr "" msgid "Play Game" msgstr "" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "" @@ -763,44 +990,61 @@ msgid "Start Game" msgstr "" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" +msgid "Address" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" msgstr "" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_online.lua +msgid "Login" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "ಆರ್ದ್ರ ನದಿಗಳು" + +#: builtin/mainmenu/tab_online.lua +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 @@ -827,10 +1071,6 @@ msgstr "" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -839,10 +1079,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "" @@ -851,12 +1087,28 @@ msgstr "" msgid "Connected Glass" msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -867,10 +1119,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" @@ -899,18 +1147,10 @@ msgstr "" msgid "Opaque Water" msgstr "" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "" @@ -923,6 +1163,11 @@ msgstr "" msgid "Shaders" msgstr "" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "ತೇಲುವ ಭೂಮಿಗಳು (ಪ್ರಾಯೋಗಿಕ)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -939,22 +1184,26 @@ msgstr "" msgid "Texturing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" - #: 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 "" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "" @@ -967,23 +1216,11 @@ msgstr "" msgid "Waving Plants" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "" @@ -1012,7 +1249,7 @@ msgid "Connection error (timed out?)" msgstr "" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +msgid "Could not find or load game: " msgstr "" #: src/client/clientlauncher.cpp @@ -1043,18 +1280,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1065,14 +1290,6 @@ msgstr "" msgid "- Address: " msgstr "" -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1094,6 +1311,16 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "ದೋಷ ವೊಂದು ಸಂಭವಿಸಿದೆ:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "" @@ -1102,6 +1329,22 @@ msgstr "" msgid "Automatic forward enabled" msgstr "" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1110,6 +1353,10 @@ msgstr "" msgid "Camera update enabled" msgstr "" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "" @@ -1122,6 +1369,10 @@ msgstr "" msgid "Cinematic mode enabled" msgstr "" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1130,6 +1381,10 @@ msgstr "" msgid "Connecting to server..." msgstr "" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "" @@ -1142,17 +1397,22 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "" @@ -1197,6 +1457,11 @@ msgstr "" 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 "" @@ -1270,31 +1535,7 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" +msgid "Multiplayer" msgstr "" #: src/client/game.cpp @@ -1369,6 +1610,21 @@ msgstr "" msgid "Sound unmuted" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1438,10 +1694,6 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "" @@ -1689,22 +1941,31 @@ msgstr "" msgid "Zoom" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "$1 ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಆಗಿಲ್ಲ" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1712,7 +1973,7 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1723,15 +1984,23 @@ msgstr "" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "" @@ -1784,7 +2053,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 @@ -1815,10 +2084,6 @@ msgstr "" msgid "Sneak" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1859,10 +2124,6 @@ msgstr "" msgid "Change" msgstr "" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "" @@ -1871,6 +2132,10 @@ msgstr "" msgid "Old Password" msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "" @@ -1880,13 +2145,8 @@ msgid "Muted" msgstr "" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " +#, c-format +msgid "Sound Volume: %d%%" msgstr "" #. ~ DO NOT TRANSLATE THIS LITERALLY! @@ -1896,6 +2156,15 @@ msgstr "" msgid "LANG_CODE" msgstr "kn" +#: 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" @@ -1904,8 +2173,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1932,12 +2201,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2026,6 +2289,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2044,6 +2311,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2089,6 +2360,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2099,6 +2374,10 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2113,7 +2392,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2181,6 +2460,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2201,6 +2484,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2213,10 +2504,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2238,7 +2525,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 @@ -2246,11 +2533,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2278,7 +2565,7 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" +msgid "Camera" msgstr "" #: src/settings_translation_file.cpp @@ -2352,13 +2639,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" msgstr "" #: src/settings_translation_file.cpp @@ -2394,7 +2679,7 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp @@ -2413,6 +2698,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2433,6 +2724,10 @@ msgstr "" 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 "" @@ -2457,6 +2752,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2484,6 +2783,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2508,10 +2823,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2538,7 +2861,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 @@ -2569,7 +2894,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2577,7 +2904,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2601,11 +2930,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 @@ -2644,8 +2973,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2676,12 +3006,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2752,6 +3076,15 @@ msgstr "" 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 "" @@ -2764,6 +3097,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2808,18 +3151,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2836,22 +3196,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2900,14 +3254,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2916,18 +3262,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2936,6 +3270,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2944,12 +3288,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2961,7 +3299,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2980,18 +3322,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3010,7 +3340,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3044,13 +3374,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3117,6 +3447,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3138,15 +3472,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3155,6 +3489,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3214,10 +3559,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3242,10 +3583,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3263,7 +3600,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3274,7 +3620,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3293,6 +3639,14 @@ msgstr "" 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 "" @@ -3310,7 +3664,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 @@ -3320,8 +3678,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3343,7 +3701,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3354,10 +3713,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3553,10 +3908,17 @@ 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 "" @@ -3589,8 +3951,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3612,11 +3973,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3640,7 +4007,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 @@ -3657,6 +4026,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3673,10 +4048,6 @@ msgstr "" 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 "" @@ -3704,7 +4075,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3727,16 +4098,12 @@ msgstr "" 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 @@ -3787,6 +4154,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3866,6 +4237,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3965,6 +4343,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4338,6 +4723,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4394,7 +4783,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 @@ -4404,15 +4793,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 @@ -4424,7 +4816,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4451,6 +4844,10 @@ msgstr "" 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" @@ -4522,21 +4919,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4598,6 +4995,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4703,7 +5104,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4751,6 +5156,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4805,17 +5217,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4864,12 +5280,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4880,6 +5308,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4946,16 +5378,16 @@ msgstr "" 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 "" @@ -4968,6 +5400,10 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -4980,14 +5416,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5009,18 +5437,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5030,11 +5450,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5043,38 +5458,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5097,17 +5486,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5136,13 +5521,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5153,6 +5542,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5187,10 +5580,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5198,9 +5587,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5290,10 +5679,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5363,6 +5748,10 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5390,6 +5779,10 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5402,10 +5795,6 @@ msgstr "" 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 "" @@ -5446,7 +5835,16 @@ 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 +msgid "Server Security" msgstr "" #: src/settings_translation_file.cpp @@ -5473,10 +5871,18 @@ msgstr "" 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 "" @@ -5488,7 +5894,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5509,6 +5943,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5521,6 +5962,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5528,9 +5985,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5545,6 +6000,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5566,6 +6031,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5620,18 +6089,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5647,6 +6112,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5674,10 +6147,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5715,6 +6184,10 @@ msgstr "" 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 "" @@ -5757,6 +6230,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5771,6 +6251,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5826,18 +6310,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5855,6 +6339,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5863,9 +6353,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5902,7 +6391,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 @@ -5925,6 +6414,18 @@ msgstr "" 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 "" @@ -5995,15 +6496,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6097,7 +6613,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6167,6 +6683,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6188,18 +6708,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6234,13 +6752,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6324,23 +6851,47 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "Back" +#~ 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 "Back" -#~ msgstr "ಹಿಂದೆ" +#~ msgid "Game" +#~ msgstr "ಆಟ" #~ msgid "Ok" #~ msgstr "ಸರಿ" + +#, fuzzy +#~ msgid "View" +#~ msgstr "ತೋರಿಸು" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "ನೀನು ಸತ್ತುಹೋದೆ" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/ko/minetest.po b/po/ko/minetest.po index c28e410a4..f30943348 100644 --- a/po/ko/minetest.po +++ b/po/ko/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Korean (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-05-08 00:22+0000\n" +"Last-Translator: Han So Ri <2_0_2_0_@naver.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/minetest/minetest/" "ko/>\n" "Language: ko\n" @@ -12,46 +12,132 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.9-dev\n" +"X-Generator: Weblate 4.12.1\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "채팅 명렁어" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "메인 메뉴로 나가기" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "유효하지 않은 명령어: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "온라인 플레이어 목록" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "온라인 플레이어: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "서버에서 사용 할 수 없는 명령어입니다." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "리스폰" #: builtin/client/death_formspec.lua src/client/game.cpp -#, fuzzy msgid "You died" -msgstr "사망했습니다." +msgstr "사망했습니다" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "지역 명령어" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "지역 명령어" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" +msgstr "확인" + +#: builtin/fstk/ui.lua +msgid "<none available>" msgstr "" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred in a Lua script:" -msgstr "Lua 스크립트에서 오류가 발생했습니다. 해당 모드:" +msgstr "Lua 스크립트에서 오류가 발생했습니다:" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred:" msgstr "오류가 발생했습니다:" #: builtin/fstk/ui.lua msgid "Main menu" -msgstr "주 메뉴" +msgstr "메인 메뉴" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "재접속" +msgstr "재연결" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" msgstr "서버에 재접속 하세요:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -66,8 +152,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "서버가 프로토콜 버전 $1와(과) $2 두 가지를 제공합니다. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "인터넷 연결을 확인한 후 서버 목록을 새로 고쳐보세요." +msgid "Visit website" +msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,83 +163,84 @@ msgstr "프로토콜 버전 $1만 제공합니다." msgid "We support protocol versions between version $1 and $2." msgstr "프로토콜 버전 $1와(과) $2 사이의 버전을 제공합니다." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "취소" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" -msgstr "필수적인 모드:" +msgstr "의존:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable all" -msgstr "모두 비활성화" +msgstr "모두 사용안함" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Disable modpack" -msgstr "비활성화됨" +msgstr "모드 팩 비활성화" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" msgstr "모두 활성화" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Enable modpack" -msgstr "모드 팩 이름 바꾸기:" +msgstr "모드 팩 활성화" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"\"$1\"은(는) 사용할 수 없는 문자이기에 모드를 활성화하지 못 했습니다. 이름에" -"는 [a-z0-9_]만 사용할 수 있습니다." +"\"$1\"은(는) 사용할 수 없는 문자이기에 모드를 활성화하지 못했습니다. 이름에" +"는 [a-z,0-9,_]만 사용할 수 있습니다." #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "더 많은 모드 찾기" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "모드:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No (optional) dependencies" -msgstr "선택적인 모드:" +msgstr "종속성 없음 (옵션)" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No game description provided." -msgstr "모드 설명이 없습니다" +msgstr "게임 설명이 제공되지 않았습니다." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "요구사항 없음." +msgstr "요구사항 없음" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No modpack description provided." -msgstr "모드 설명이 없습니다" +msgstr "모드 설명이 제공되지 않았습니다." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy 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 @@ -169,30 +256,66 @@ msgid "enabled" msgstr "활성화됨" #: builtin/mainmenu/dlg_contentstore.lua -msgid "All packages" -msgstr "모든 패키지" +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy -msgid "Back to Main Menu" -msgstr "주 메뉴" +msgid "$1 and $2 dependencies will be installed." +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy -msgid "Downloading..." -msgstr "불러오는 중..." +msgid "$1 downloading..." +msgstr "다운 받는 중..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "모든 패키지" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "이미 설치됨" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Back to Main Menu" +msgstr "주 메뉴로 돌아가기" #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy -msgid "Failed to download $1" -msgstr "$1을 $2에 설치하는데 실패했습니다" +msgid "Base Game:" +msgstr "호스트 게임" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "cURL 없이 Minetest를 컴파일한 경우 ContentDB를 사용할 수 없습니다" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Downloading..." +msgstr "다운 받는 중..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Failed to download $1" +msgstr "$1을 다운로드하는 데에 실패했습니다" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "게임" @@ -201,7 +324,23 @@ msgid "Install" msgstr "설치" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "설치" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "종속성 선택:" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "" +"모드 설치: \"$1\"는(은) 지원 되지 않는 파일 형식 이거나 손상된 압축 파일입니" +"다" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "모드" @@ -214,129 +353,138 @@ msgid "No results" msgstr "결과 없음" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "찾기" +msgid "No updates" +msgstr "업데이트 없음" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "찾을 수 없음" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Texture packs" -msgstr "텍스쳐 팩" +msgstr "텍스처 팩" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Uninstall" -msgstr "설치" +msgstr "제거" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" msgstr "업데이트" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "\"$1\" 이름의 세계가 이미 존재합니다" +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 -#, fuzzy msgid "Biome blending" -msgstr "강 소리" +msgstr "혼합 생물 군계" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "강 소리" +msgstr "생물 군계" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "동굴 잡음 #1" +msgstr "석회동굴" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "동굴 잡음 #1" +msgstr "동굴" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "만들기" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "모드 정보:" +msgstr "장식" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "minetest.net에서 minetest_game 같은 서브 게임을 다운로드하세요." +msgid "Development Test is meant for developers." +msgstr "경고: Development Test는 개발자를 위한 모드입니다." #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "minetest.net에서 다운로드 하세요" - -#: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Dungeons" -msgstr "강 소리" +msgstr "던전" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "평평한 지형" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floating landmasses in the sky" -msgstr "Floatland의 산 밀집도" +msgstr "하늘에 떠있는 광대한 대지" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floatlands (experimental)" -msgstr "Floatland의 높이" - -#: 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 "추상적이지 않은 지형 생성: 바다와 지하" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "언덕" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 "설치" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +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" @@ -344,46 +492,43 @@ msgstr "세계 생성기" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "" +msgstr "세계 생성기 신호" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Mapgen 이름" +msgstr "세계 생성기-특정 신호" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +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 -#, fuzzy msgid "No game selected" -msgstr "범위 선택" +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 -#, fuzzy msgid "Rivers" -msgstr "강 크기" +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 @@ -392,61 +537,54 @@ msgstr "시드" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "생물 군계 간 부드러운 전환" #: builtin/mainmenu/dlg_create_world.lua 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 -#, fuzzy 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 -#, fuzzy 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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "경고: 'minimal develop test'는 개발자를 위한 것입니다." +msgstr "지하의 큰 동굴의 깊이 변화" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "세계 이름" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "You have no games installed." -msgstr "서브게임을 설치하지 않았습니다." +msgstr "게임이 설치되어 있지 않습니다." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" @@ -459,19 +597,51 @@ msgid "Delete" msgstr "삭제" #: builtin/mainmenu/dlg_delete_content.lua -#, fuzzy msgid "pkgmgr: failed to delete \"$1\"" -msgstr "Modmgr: \"$1\"을(를) 삭제하지 못했습니다" +msgstr "pkgmgr: \"$1\"을(를) 삭제하지 못했습니다" #: builtin/mainmenu/dlg_delete_content.lua -#, fuzzy msgid "pkgmgr: invalid path \"$1\"" -msgstr "Modmgr: \"$1\"을(를) 인식할 수 없습니다" +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 +#, fuzzy +msgid "Missing name" +msgstr "Mapgen 이름" + +#: 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 "수락" @@ -485,15 +655,16 @@ msgid "" "This modpack has an explicit name given in its modpack.conf which will " "override any renaming here." msgstr "" +"이 모드팩에는 modpack.conf에 명시적인 이름이 부여되어 있으며, 이는 여기서 이" +"름을 바꾸는 것을 적용하지 않습니다." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" msgstr "(설정에 대한 설명이 없습니다)" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "2D Noise" -msgstr "소리" +msgstr "2차원 소음" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" @@ -504,6 +675,16 @@ 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 "비활성화됨" @@ -516,21 +697,20 @@ msgid "Enabled" msgstr "활성화됨" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Lacunarity" -msgstr "보안" +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 #, fuzzy -msgid "Persistance" +msgid "Persistence" msgstr "플레이어 전송 거리" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -547,19 +727,21 @@ 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" +msgstr "찾기" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Select directory" -msgstr "선택한 모드 파일:" +msgstr "경로를 선택하세요" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Select file" -msgstr "선택한 모드 파일:" +msgstr "파일 선택" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "기술적 이름 보기" @@ -573,27 +755,27 @@ msgstr "값이 $1을 초과하면 안 됩니다." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X" -msgstr "" +msgstr "X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X spread" -msgstr "" +msgstr "X 분산" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y" -msgstr "" +msgstr "Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y spread" -msgstr "" +msgstr "Y 분산" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z" -msgstr "" +msgstr "Z" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z spread" -msgstr "" +msgstr "Z 분산" #. ~ "absvalue" is a noise parameter flag. #. It is short for "absolute value". @@ -601,15 +783,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 -#, fuzzy msgid "defaults" -msgstr "기본 게임" +msgstr "기본값" #. ~ "eased" is a noise parameter flag. #. It is used to make the map smoother and @@ -617,174 +798,169 @@ msgstr "기본 게임" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "eased" -msgstr "" +msgstr "맵 부드러움" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "$1 (Enabled)" -msgstr "활성화됨" +msgstr "$1 (활성화됨)" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "$1 mods" -msgstr "3D 모드" +msgstr "$1 모드" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" msgstr "$1을 $2에 설치하는데 실패했습니다" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Install Mod: Unable to find real mod name for: $1" msgstr "모드 설치: $1를(을) 찾을 수 없습니다" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Install Mod: Unable to find suitable folder name for modpack $1" -msgstr "설치 모드: 모드 팩 $1 (이)의 올바른 폴더이름을 찾을 수 없습니다" +msgstr "모드 설치: 모드 팩 $1 (이)의 올바른 폴더이름을 찾을 수 없습니다" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"\n" -"모드 설치: \"$1\"는(은) 지원 되지 않는 파일 형식 이거나 깨진 압축 파일입니다" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: file: \"$1\"" -msgstr "모드 설치: 파일: \"$1\"" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to find a valid mod or modpack" msgstr "설치 모드: 모드 팩 $1 (이)의 올바른 폴더이름을 찾을 수 없습니다" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a $1 as a texture pack" -msgstr "$1을 $2에 설치하는데 실패했습니다" +msgstr "$1을 텍스쳐팩으로 설치할 수 없습니다" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a game as a $1" -msgstr "$1을 $2에 설치하는데 실패했습니다" +msgstr "$1을 설치할 수 없습니다" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a mod as a $1" -msgstr "$1을 $2에 설치하는데 실패했습니다" +msgstr "$1 모드를 설치할 수 없습니다" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a modpack as a $1" -msgstr "$1을 $2에 설치하는데 실패했습니다" +msgstr "$1 모드팩을 설치할 수 없습니다" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "불러오는 중..." + +#: builtin/mainmenu/serverlistmgr.lua +#, fuzzy +msgid "Public server list is disabled" +msgstr "클라이언트 스크립트가 비활성화됨" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "인터넷 연결을 확인한 후 서버 목록을 새로 고쳐보세요." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "활동적인 공헌자" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "객체 전달 범위 활성화" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "코어 개발자" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "이전 공헌자들" + +#: builtin/mainmenu/tab_about.lua +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 "온라인 컨텐츠 검색" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Content" -msgstr "계속" +msgstr "컨텐츠" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Disable Texture Pack" -msgstr "선택한 텍스쳐 팩:" +msgstr "비활성화된 텍스쳐 팩" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Information:" -msgstr "모드 정보:" +msgstr "정보:" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Installed Packages:" -msgstr "설치한 모드:" +msgstr "설치된 패키지:" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." msgstr "요구사항 없음." #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "No package description available" -msgstr "모드 설명이 없습니다" +msgstr "사용 가능한 패키지 설명이 없습니다" #: builtin/mainmenu/tab_content.lua msgid "Rename" msgstr "이름 바꾸기" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Uninstall Package" -msgstr "선택한 모드 삭제" +msgstr "패키지 삭제" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Use Texture Pack" -msgstr "텍스쳐 팩" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "활동적인 공헌자" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "코어 개발자" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "만든이" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "이전 공헌자들" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "이전 코어 개발자들" +msgstr "텍스쳐 팩 사용" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Announce Server" -msgstr "서버 발표" +msgstr "서버 알리기" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" msgstr "바인딩 주소" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "환경설정" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "크리에이티브 모드" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "데미지 활성화" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Host Game" -msgstr "게임 호스트하기" +msgstr "호스트 게임" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Host Server" -msgstr "서버 호스트하기" +msgstr "호스트 서버" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "이름/비밀번호" +msgstr "ContentDB에서 게임 설치" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -798,10 +974,15 @@ msgstr "월드를 만들거나 선택하지 않았습니다!" msgid "Play Game" msgstr "게임하기" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "포트" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "월드 선택:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "월드 선택:" @@ -811,51 +992,71 @@ msgid "Server Port" msgstr "서버 포트" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Start Game" -msgstr "게임 호스트하기" +msgstr "게임 시작" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "주소/포트" +#, fuzzy +msgid "Address" +msgstr "- 주소: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "연결" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "지우기" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "크리에이티브 모드" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "데미지 활성화" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "즐겨찾기 삭제" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "즐겨찾기" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "데미지" #: builtin/mainmenu/tab_online.lua #, fuzzy +msgid "Favorites" +msgstr "즐겨찾기" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua msgid "Join Game" -msgstr "게임 호스트하기" +msgstr "게임 참가" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "이름/비밀번호" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "핑" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP 가능" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "서버 알리기" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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" @@ -874,20 +1075,14 @@ msgid "8x" msgstr "8 배속" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "All Settings" -msgstr "설정" +msgstr "모든 설정" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" msgstr "매끄럽게 표현하기:" #: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "싱글 플레이어 월드를 리셋하겠습니까?" - -#: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Autosave Screen Size" msgstr "스크린 크기 자동 저장" @@ -895,10 +1090,6 @@ msgstr "스크린 크기 자동 저장" msgid "Bilinear Filter" msgstr "이중 선형 필터" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "범프 매핑" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "키 변경" @@ -907,14 +1098,31 @@ msgstr "키 변경" msgid "Connected Glass" msgstr "연결된 유리" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +#, fuzzy +msgid "Dynamic shadows" +msgstr "글꼴 그림자" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "글꼴 그림자" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "아름다운 나뭇잎 효과" #: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Generate Normal Maps" -msgstr "Normalmaps 생성" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -924,10 +1132,6 @@ msgstr "밉 맵" msgid "Mipmap + Aniso. Filter" msgstr "밉맵 + Aniso. 필터" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "아니오" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "필터 없음" @@ -956,22 +1160,13 @@ msgstr "불투명한 나뭇잎 효과" msgid "Opaque Water" msgstr "불투명한 물 효과" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "시차 교합" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "입자 효과" #: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "싱글 플레이어 월드 초기화" - -#: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Screen:" -msgstr "스크린:" +msgstr "화면:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" @@ -981,6 +1176,11 @@ msgstr "설정" msgid "Shaders" msgstr "쉐이더" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "평평한 땅 (실험용)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "쉐이더 (사용할 수 없음)" @@ -997,53 +1197,45 @@ msgstr "부드러운 조명 효과" msgid "Texturing:" msgstr "질감:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "쉐이더를 사용하려면 OpenGL 드라이버를 사용할 필요가 있습니다." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "톤 매핑" #: builtin/mainmenu/tab_settings.lua #, fuzzy -msgid "Touchthreshold: (px)" -msgstr "터치임계값 (픽셀)" +msgid "Touch threshold (px):" +msgstr "터치 임계값: (픽셀)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "선형 필터" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "움직이는 나뭇잎 효과" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Waving Liquids" -msgstr "움직이는 Node" +msgstr "물 등의 물결효과" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" msgstr "움직이는 식물 효과" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "예" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "모드 설정" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "메인" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "연결 시간이 초과했습니다." @@ -1072,7 +1264,8 @@ msgid "Connection error (timed out?)" msgstr "연결 오류 (시간초과)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "게임을 찾지 못했거나 로딩할 수 없습니다\"" #: src/client/clientlauncher.cpp @@ -1097,24 +1290,12 @@ 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 "월드 경로가 존재하지 않습니다: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1124,17 +1305,8 @@ msgstr "" "자세한 내용은 debug.txt을 확인 합니다." #: src/client/game.cpp -#, fuzzy msgid "- Address: " -msgstr "바인딩 주소" - -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- 크리에이티브 모드: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- 데미지: " +msgstr "- 주소: " #: src/client/game.cpp msgid "- Mode: " @@ -1145,14 +1317,13 @@ msgid "- Port: " msgstr "- 포트: " #: src/client/game.cpp -#, fuzzy msgid "- Public: " -msgstr "일반" +msgstr "- 공개: " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "- PvP: " +msgstr "- Player vs Player: " #: src/client/game.cpp msgid "- Server Name: " @@ -1160,46 +1331,79 @@ msgstr "- 서버 이름: " #: src/client/game.cpp #, fuzzy +msgid "A serialization error occurred:" +msgstr "오류가 발생했습니다:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + +#: src/client/game.cpp msgid "Automatic forward disabled" -msgstr "앞으로 가는 키" +msgstr "자동 전진 비활성화" #: src/client/game.cpp -#, fuzzy msgid "Automatic forward enabled" -msgstr "앞으로 가는 키" +msgstr "자동 전진 활성화" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" #: src/client/game.cpp -#, fuzzy msgid "Camera update disabled" -msgstr "카메라 업데이트 토글 키" +msgstr "카메라 업데이트 비활성화" #: src/client/game.cpp -#, fuzzy msgid "Camera update enabled" -msgstr "카메라 업데이트 토글 키" +msgstr "카메라 업데이트 활성화" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" #: src/client/game.cpp msgid "Change Password" msgstr "비밀번호 변경" #: src/client/game.cpp -#, fuzzy msgid "Cinematic mode disabled" -msgstr "시네마틱 모드 스위치" +msgstr "시네마틱 모드 비활성화" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "시네마틱 모드 활성화" #: src/client/game.cpp #, fuzzy -msgid "Cinematic mode enabled" -msgstr "시네마틱 모드 스위치" +msgid "Client disconnected" +msgstr "클라이언트 모딩" #: src/client/game.cpp msgid "Client side scripting is disabled" -msgstr "" +msgstr "클라이언트 스크립트가 비활성화됨" #: src/client/game.cpp msgid "Connecting to server..." msgstr "서버 연결중..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "계속" @@ -1212,26 +1416,35 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" -"기본 컨트롤:-WASD: 이동\n" -"-스페이스: 점프/오르기\n" -"-쉬프트:살금살금/내려가기\n" -"-Q: 아이템 드롭\n" -"-I: 인벤토리\n" -"-마우스: 돌아보기/보기\n" -"-마우스 왼쪽: 파내기/공격\n" -"-마우스 오른쪽: 배치/사용\n" -"-마우스 휠: 아이템 선택\n" -"-T: 채팅\n" +"조작:\n" +"-%s: 앞으로 이동\n" +"-%s:뒤로 이동\n" +"-%s:왼쪽으로 이동\n" +"-%s:오른쪽으로 이동\n" +"-%s: 점프/오르기\n" +"-%s:조용히 걷기/내려가기\n" +"-%s:아이템 버리기\n" +"-%s:인벤토리\n" +"-마우스: 돌기/보기\n" +"-마우스 왼쪽 클릭: 땅파기/펀치\n" +"-마우스 오른쪽 클릭: 두기/사용하기\n" +"-마우스 휠:아이템 선택\n" +"-%s: 채팅\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" #: src/client/game.cpp msgid "Creating client..." @@ -1243,16 +1456,15 @@ msgstr "서버 만드는 중..." #: src/client/game.cpp msgid "Debug info and profiler graph hidden" -msgstr "" +msgstr "디버그 정보 및 프로파일러 그래프 숨기기" #: src/client/game.cpp -#, fuzzy msgid "Debug info shown" -msgstr "디버그 정보 토글 키" +msgstr "디버그 정보 표시" #: src/client/game.cpp msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "" +msgstr "디버그 정보, 프로파일러 그래프 , 선 표현 숨김" #: src/client/game.cpp msgid "" @@ -1284,11 +1496,16 @@ msgstr "" #: 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" @@ -1299,42 +1516,36 @@ msgid "Exit to OS" msgstr "게임 종료" #: src/client/game.cpp -#, fuzzy msgid "Fast mode disabled" -msgstr "고속 모드 속도" +msgstr "고속 모드 비활성화" #: src/client/game.cpp -#, fuzzy msgid "Fast mode enabled" -msgstr "고속 모드 속도" +msgstr "고속 모드 활성화" #: src/client/game.cpp msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "" +msgstr "고속 모드 활성화(참고 : '고속'에 대한 권한 없음)" #: src/client/game.cpp -#, fuzzy msgid "Fly mode disabled" -msgstr "고속 모드 속도" +msgstr "비행 모드 비활성화" #: src/client/game.cpp -#, fuzzy msgid "Fly mode enabled" -msgstr "데미지 활성화" +msgstr "비행 모드 활성화" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "" +msgstr "비행 모드 활성화 (참고 : '비행'에 대한 권한 없음)" #: src/client/game.cpp -#, fuzzy msgid "Fog disabled" -msgstr "비활성화됨" +msgstr "안개 비활성화" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled" -msgstr "활성화됨" +msgstr "안개 활성화" #: src/client/game.cpp msgid "Game info:" @@ -1345,9 +1556,8 @@ msgid "Game paused" msgstr "게임 일시정지" #: src/client/game.cpp -#, fuzzy msgid "Hosting server" -msgstr "서버 만드는 중..." +msgstr "호스팅 서버" #: src/client/game.cpp msgid "Item definitions..." @@ -1367,49 +1577,24 @@ msgstr "MiB/s" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "" +msgstr "게임 또는 모드에 의해 현재 미니맵 비활성화" #: src/client/game.cpp #, fuzzy -msgid "Minimap hidden" -msgstr "미니맵 키" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +msgstr "싱글 플레이어" #: src/client/game.cpp msgid "Noclip mode disabled" -msgstr "" +msgstr "Noclip 모드 비활성화" #: src/client/game.cpp -#, fuzzy msgid "Noclip mode enabled" -msgstr "데미지 활성화" +msgstr "Noclip 모드 활성화" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "" +msgstr "Noclip 모드 활성화 (참고 : 'noclip'에 대한 권한 없음)" #: src/client/game.cpp msgid "Node definitions..." @@ -1425,20 +1610,19 @@ msgstr "켜기" #: src/client/game.cpp msgid "Pitch move mode disabled" -msgstr "" +msgstr "피치 이동 모드 비활성화" #: src/client/game.cpp msgid "Pitch move mode enabled" -msgstr "" +msgstr "피치 이동 모드 활성화" #: src/client/game.cpp msgid "Profiler graph shown" -msgstr "" +msgstr "프로파일러 그래프 보이기" #: src/client/game.cpp -#, fuzzy msgid "Remote server" -msgstr "원격 포트" +msgstr "원격 서버" #: src/client/game.cpp msgid "Resolving address..." @@ -1457,88 +1641,98 @@ msgid "Sound Volume" msgstr "볼륨 조절" #: src/client/game.cpp -#, fuzzy msgid "Sound muted" -msgstr "볼륨 조절" +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 "본 빌드에서 지원되지 않는 사운드 시스템" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "음소거 해제" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." msgstr "" #: src/client/game.cpp -#, fuzzy -msgid "Sound unmuted" -msgstr "볼륨 조절" +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: 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" -msgstr "" +msgstr "선 표면 보이기" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "" +msgstr "게임 또는 모드에 의해 현재 확대 비활성화" #: src/client/game.cpp msgid "ok" msgstr "확인" #: src/client/gameui.cpp -#, fuzzy msgid "Chat hidden" -msgstr "채팅" +msgstr "채팅 숨기기" #: src/client/gameui.cpp msgid "Chat shown" -msgstr "" +msgstr "채팅 보이기" #: src/client/gameui.cpp msgid "HUD hidden" -msgstr "" +msgstr "HUD 숨기기" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "" +msgstr "HUD 보이기" #: src/client/gameui.cpp -#, fuzzy msgid "Profiler hidden" -msgstr "프로파일러" +msgstr "프로파일러 숨기기" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" +msgstr "프로파일러 보이기 (%d중 %d 페이지)" #: src/client/keycode.cpp msgid "Apps" msgstr "애플리케이션" #: src/client/keycode.cpp -#, fuzzy msgid "Backspace" msgstr "뒤로" @@ -1546,10 +1740,6 @@ msgstr "뒤로" msgid "Caps Lock" msgstr "캡스락" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "지우기" - #: src/client/keycode.cpp msgid "Control" msgstr "컨트롤" @@ -1563,9 +1753,8 @@ msgid "End" msgstr "끝" #: src/client/keycode.cpp -#, fuzzy msgid "Erase EOF" -msgstr "OEF를 지우기" +msgstr "EOF 지우기" #: src/client/keycode.cpp msgid "Execute" @@ -1589,7 +1778,7 @@ msgstr "IME 변환" #: src/client/keycode.cpp msgid "IME Escape" -msgstr "" +msgstr "IME 종료" #: src/client/keycode.cpp msgid "IME Mode Change" @@ -1609,7 +1798,7 @@ msgstr "왼쪽" #: src/client/keycode.cpp msgid "Left Button" -msgstr "왼쪽된 버튼" +msgstr "왼쪽 버튼" #: src/client/keycode.cpp msgid "Left Control" @@ -1637,7 +1826,6 @@ msgid "Middle Button" msgstr "가운데 버튼" #: src/client/keycode.cpp -#, fuzzy msgid "Num Lock" msgstr "Num Lock" @@ -1703,20 +1891,19 @@ msgstr "숫자 키패드 9" #: src/client/keycode.cpp msgid "OEM Clear" -msgstr "" +msgstr "OEM 초기화" #: src/client/keycode.cpp msgid "Page down" -msgstr "" +msgstr "페이지 내리기" #: src/client/keycode.cpp msgid "Page up" -msgstr "" +msgstr "페이지 올리기" #: src/client/keycode.cpp -#, fuzzy msgid "Pause" -msgstr "일시 중지" +msgstr "일시 정지" #: src/client/keycode.cpp msgid "Play" @@ -1724,9 +1911,8 @@ msgstr "시작" #. ~ "Print screen" key #: src/client/keycode.cpp -#, fuzzy msgid "Print" -msgstr "인쇄" +msgstr "출력" #: src/client/keycode.cpp msgid "Return" @@ -1757,7 +1943,6 @@ msgid "Right Windows" msgstr "오른쪽 창" #: src/client/keycode.cpp -#, fuzzy msgid "Scroll Lock" msgstr "스크롤 락" @@ -1779,9 +1964,8 @@ msgid "Snapshot" msgstr "스냅샷" #: src/client/keycode.cpp -#, fuzzy msgid "Space" -msgstr "스페이스" +msgstr "스페이스바" #: src/client/keycode.cpp msgid "Tab" @@ -1803,22 +1987,32 @@ msgstr "X 버튼 2" msgid "Zoom" msgstr "확대/축소" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "비밀번호가 맞지 않습니다!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "미니맵 숨김" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "레이더 모드의 미니맵, 1배 확대" -#: 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." +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "표면 모드의 미니맵, 1배 확대" + +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap in texture mode" +msgstr "최소 텍스처 크기" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "$1을 다운로드하는 데에 실패했습니다" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1827,16 +2021,19 @@ msgstr "계속하기" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy -msgid "\"Special\" = climb down" -msgstr "\"Use\" = 내려가기" +msgid "\"Aux1\" = climb down" +msgstr "\"특별함\" = 아래로 타고 내려가기" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Autoforward" -msgstr "앞으로" +msgstr "자동전진" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" +msgstr "자동 점프" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1844,11 +2041,14 @@ msgid "Backward" msgstr "뒤로" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy -msgid "Change camera" -msgstr "키 변경" +msgid "Block bounds" +msgstr "" #: src/gui/guiKeyChangeMenu.cpp +msgid "Change camera" +msgstr "카메라 변경" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "채팅" @@ -1861,9 +2061,8 @@ msgid "Console" msgstr "콘솔" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Dec. range" -msgstr "시야 범위" +msgstr "범위 감소" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. volume" @@ -1882,9 +2081,8 @@ msgid "Forward" msgstr "앞으로" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Inc. range" -msgstr "시야 범위" +msgstr "범위 증가" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" @@ -1903,14 +2101,12 @@ 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 "" -"Keybindings. (이 메뉴를 고정하려면 minetest.cof에서 stuff를 제거해야합니다.)" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Local command" -msgstr "채팅 명렁어" +msgstr "지역 명령어" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" @@ -1937,18 +2133,12 @@ msgid "Sneak" msgstr "살금살금" #: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle HUD" -msgstr "비행 스위치" +msgstr "HUD 토글" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle chat log" -msgstr "고속 스위치" +msgstr "채팅 기록 토글" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" @@ -1959,23 +2149,20 @@ msgid "Toggle fly" msgstr "비행 스위치" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle fog" -msgstr "비행 스위치" +msgstr "안개 토글" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle minimap" -msgstr "자유시점 스위치" +msgstr "미니맵 토글" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle noclip" msgstr "자유시점 스위치" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle pitchmove" -msgstr "고속 스위치" +msgstr "피치 이동 토글" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" @@ -1985,10 +2172,6 @@ msgstr "키를 누르세요" msgid "Change" msgstr "변경" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "비밀번호 확인" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "새로운 비밀번호" @@ -1997,25 +2180,23 @@ msgstr "새로운 비밀번호" msgid "Old Password" msgstr "현재 비밀번호" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "비밀번호가 맞지 않습니다!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "나가기" #: src/gui/guiVolumeChange.cpp -#, fuzzy msgid "Muted" msgstr "음소거" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, 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 "들어가기 " - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -2023,18 +2204,34 @@ msgstr "들어가기 " msgid "LANG_CODE" msgstr "ko" +#: 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" "If disabled, virtual joystick will center to first-touch's position." msgstr "" +"(Android) 가상 조이스틱의 위치를 수정합니다.\n" +"비활성화하면, 가상 조이스틱이 첫번째 터치 위치의 중앙에 위치합니다." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) 가상 조이스틱을 사용하여 \"aux\"버튼을 트리거합니다.\n" +"활성화 된 경우 가상 조이스틱은 메인 서클에서 벗어날 때 \"aux\"버튼도 탭합니" +"다." #: src/settings_translation_file.cpp msgid "" @@ -2047,6 +2244,15 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"(X, Y, Z) '스케일' 단위로 세계 중심을 기준으로 프랙탈 오프셋을 정합니다.\n" +"원하는 지점을 (0, 0)으로 이동하여 적합한 스폰 지점을 만들거나 \n" +"'스케일'을 늘려 원하는 지점에서 '확대'할 수 있습니다.\n" +"기본값은 기본 매개 변수가있는 Mandelbrot 세트에 적합한 스폰 지점에 맞게 조정" +"되어 있으며 \n" +"다른 상황에서 변경해야 할 수도 있습니다. \n" +"범위는 대략 -2 ~ 2입니다. \n" +"노드의 오프셋에 대해\n" +"'스케일'을 곱합니다." #: src/settings_translation_file.cpp msgid "" @@ -2058,40 +2264,41 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" +"노드에서 프랙탈의 (X, Y, Z) 스케일.\n" +"실제 프랙탈 크기는 2 ~ 3 배 더 큽니다.\n" +"이 숫자는 매우 크게 만들 수 있으며 프랙탈은 세계에 맞지 않아도됩니다.\n" +"프랙탈의 세부 사항을 '확대'하도록 늘리십시오.\n" +"기본값은 섬에 적합한 수직으로 쪼개진 모양이며 \n" +"기존 모양에 대해 3 개의 숫자를 \n" +"모두 동일하게 설정합니다." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" +msgstr "산의 모양 / 크기를 제어하는 2D 노이즈." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgstr "언덕의 모양 / 크기를 제어하는 2D 노이즈." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgstr "계단 형태 산의 모양 / 크기를 제어하는 2D 노이즈." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" +msgstr "능선 산맥의 크기 / 발생정도를 제어하는 2D 노이즈." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +msgstr "언덕의 크기 / 발생정도를 제어하는 2D 노이즈." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" +msgstr "계단 형태의 산맥의 크기 / 발생정도를 제어하는 2D 노이즈." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgstr "강 계곡과 채널에 위치한 2D 노이즈." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2102,19 +2309,20 @@ msgid "3D mode" msgstr "3D 모드" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Normalmaps 강도" +msgstr "3D 모드 시차 강도" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "" +msgstr "거대한 동굴을 정의하는 3D 노이즈." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" +"산의 구조와 높이를 정의하는 3D 노이즈.\n" +"또한 수상 지형 산악 지형의 구조를 정의합니다." #: src/settings_translation_file.cpp msgid "" @@ -2123,25 +2331,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 노이즈.\n" +"기본값에서 변경하면 노이즈 '스케일'(기본값 0.7)이 필요할 수 있습니다.\n" +"이 소음의 값 범위가 약 -2.0 ~ 2.0 일 때 플로 트랜드 테이퍼링이 가장 잘 작동하" +"므로 \n" +"조정해야합니다." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." -msgstr "" +msgstr "강 협곡 벽의 구조를 정의하는 3D 노이즈." #: src/settings_translation_file.cpp msgid "3D noise defining terrain." -msgstr "" +msgstr "지형을 정의하는 3D 노이즈." #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." msgstr "" +"산 돌출부, 절벽 등에 대한 3D 노이즈. 일반적으로 작은 변화로 나타납니다." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" +msgstr "맵 당 던전 수를 결정하는 3D 노이즈." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "3D support.\n" "Currently supported:\n" @@ -2163,6 +2376,10 @@ msgstr "" "- sidebyside: split screen side by side.↵\n" "- 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" @@ -2180,13 +2397,16 @@ msgid "A message to be displayed to all clients when the server shuts down." msgstr "서버가 닫힐 때 모든 사용자들에게 표시 될 메시지입니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "ABM interval" -msgstr "맵 저장 간격" +msgstr "ABM 간격" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "" +msgstr "대기중인 블록의 절대 한계" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2194,16 +2414,15 @@ msgstr "공중에서 가속" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "중력 가속도, 노드는 초당 노드입니다." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" msgstr "블록 수식어 활성" #: src/settings_translation_file.cpp -#, fuzzy msgid "Active block management interval" -msgstr "블록 관리 간격 활성" +msgstr "블록 관리 간격 활성화" #: src/settings_translation_file.cpp msgid "Active block range" @@ -2211,7 +2430,7 @@ msgstr "블록 범위 활성" #: src/settings_translation_file.cpp msgid "Active object send range" -msgstr "" +msgstr "객체 전달 범위 활성화" #: src/settings_translation_file.cpp msgid "" @@ -2219,17 +2438,24 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"연결할 주소입니다.\n" +"로컬 서버를 시작하려면 공백으로 두십시오.\n" +"주 메뉴의 주소 공간은 이 설정에 중복됩니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Adds particles when digging a node." -msgstr "node를 부술 때의 파티클 효과를 추가합니다" +msgstr "node를 부술 때의 파티클 효과를 추가합니다." #: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" +"화면에 맞게 dpi 구성을 조정합니다 (X11 미지원 / Android 만 해당). 4k 화면 용." + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" #: src/settings_translation_file.cpp #, c-format @@ -2240,6 +2466,16 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"플롯랜드 레이어의 밀도를 조정합니다.\n" +"밀도를 높이려면 값을 늘리십시오. 양수 또는 음수입니다.\n" +"값 = 0.0 : 부피의 50 % o가 플롯랜드입니다.\n" +"값 = 2.0 ( 'mgv7_np_floatland'에 따라 더 높을 수 있음, \n" +"항상 확실하게 테스트 후 사용)는 단단한 플롯랜드 레이어를 만듭니다." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "아이템 이름 추가" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2253,59 +2489,64 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "항상 비행하고 빠르게" - -#: src/settings_translation_file.cpp -msgid "Ambient occlusion gamma" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +"'감마 보정'을 적용하여 조명 곡선을 변경합니다.\n" +"값이 높을수록 중간 및 낮은 조명 수준이 더 밝아집니다.\n" +"값 '1.0'은 조명 곡선을 변경하지 않습니다.\n" +"이것은 일광 및 인공 조명에만 중요한 영향을 미칩니다.\n" +"빛은, 자연적인 야간 조명에 거의 영향을 미치지 않습니다." #: src/settings_translation_file.cpp #, fuzzy +msgid "Always fly fast" +msgstr "항상 비행 및 고속 모드" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "주변 occlusion 감마" + +#: src/settings_translation_file.cpp +msgid "Amount of messages a player may send per 10 seconds." +msgstr "플레이어가 10 초당 보낼 수있는 메시지의 양." + +#: src/settings_translation_file.cpp msgid "Amplifies the valleys." -msgstr "계곡 증폭" +msgstr "계곡 증폭." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" msgstr "이방성 필터링" #: src/settings_translation_file.cpp -#, fuzzy msgid "Announce server" -msgstr "서버 발표" +msgstr "서버 공지" #: src/settings_translation_file.cpp -#, fuzzy msgid "Announce to this serverlist." -msgstr "서버 발표" +msgstr "이 서버 목록에 알림." #: src/settings_translation_file.cpp msgid "Append item name" -msgstr "" +msgstr "아이템 이름 추가" #: src/settings_translation_file.cpp msgid "Append item name to tooltip." -msgstr "" +msgstr "툴팁에 아이템 이름 추가." #: src/settings_translation_file.cpp msgid "Apple trees noise" -msgstr "" +msgstr "사과 나무 노이즈" #: src/settings_translation_file.cpp msgid "Arm inertia" -msgstr "" +msgstr "팔 관성" #: src/settings_translation_file.cpp msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" +"팔 관성,보다 현실적인 움직임을 제공합니다.\n" +"카메라가 움직일 때 팔도 함께 움직입니다." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" @@ -2325,19 +2566,30 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" +"이 거리에서 서버는 클라이언트로 전송되는 블록의 최적화를\n" +"활성화합니다.\n" +"작은 값은 눈에 띄는 렌더링 결함을 통해 \n" +"잠재적으로 성능을 크게 향상시킵니다 \n" +"(일부 블록은 수중과 동굴, 때로는 육지에서도 렌더링되지 않습니다).\n" +"이 값을 max_block_send_distance보다 큰 값으로 설정하면 \n" +"최적화가 비활성화됩니다.\n" +"맵 블록 (16 개 노드)에 명시되어 있습니다." + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Automatic forward key" -msgstr "앞으로 가는 키" +msgstr "자동 전진 키" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." -msgstr "" +msgstr "단일 노드 장애물에 대한 자동 점프." #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." -msgstr "" +msgstr "서버 목록에 자동으로 보고." #: src/settings_translation_file.cpp msgid "Autosave screen size" @@ -2345,38 +2597,41 @@ msgstr "스크린 크기 자동 저장" #: src/settings_translation_file.cpp msgid "Autoscaling mode" -msgstr "" +msgstr "자동 스케일링 모드" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "점프 키" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "오르기/내리기 에 사용되는 특수키" #: src/settings_translation_file.cpp msgid "Backward key" msgstr "뒤로 이동하는 키" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base ground level" -msgstr "물의 높이" +msgstr "기본 지면 수준" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base terrain height." -msgstr "기본 지형 높이" +msgstr "기본 지형 높이." #: src/settings_translation_file.cpp -msgid "Basic" -msgstr "기본" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Basic privileges" msgstr "기본 권한" #: src/settings_translation_file.cpp msgid "Beach noise" -msgstr "" +msgstr "해변 잡음" #: src/settings_translation_file.cpp msgid "Beach noise threshold" -msgstr "" +msgstr "해변 잡음 임계치" #: src/settings_translation_file.cpp msgid "Bilinear filtering" @@ -2387,54 +2642,50 @@ 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 +msgid "Biome noise" +msgstr "Biome 노이즈" + +#: src/settings_translation_file.cpp +msgid "Block send optimize distance" +msgstr "블록 전송 최적화 거리" + +#: src/settings_translation_file.cpp +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Biome noise" -msgstr "강 소리" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "전체 화면 모드에서 (일명 색 농도) 픽셀 당 비트." - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Block send optimize distance" -msgstr "최대 블록 전송 거리" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Bold and italic font path" -msgstr "고정 폭 글꼴 경로" +msgstr "굵은 기울임 꼴 글꼴 경로" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold and italic monospace font path" -msgstr "고정 폭 글꼴 경로" +msgstr "굵은 기울임 꼴 고정 폭 글꼴 경로" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold font path" -msgstr "글꼴 경로" +msgstr "굵은 글꼴 경로" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold monospace font path" -msgstr "고정 폭 글꼴 경로" +msgstr "굵은 고정 폭 글꼴 경로" #: src/settings_translation_file.cpp msgid "Build inside player" -msgstr "" +msgstr "내부 사용자 빌드" #: src/settings_translation_file.cpp msgid "Builtin" msgstr "기본 제공" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "범프맵핑" +#, fuzzy +msgid "Camera" +msgstr "카메라 변경" #: src/settings_translation_file.cpp msgid "" @@ -2443,6 +2694,11 @@ msgid "" "Increasing can reduce artifacting on weaker GPUs.\n" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" +"0에서 0.25 사이의 노드에서 카메라 '깎인 평면 근처'거리는 GLES 플랫폼에서만 작" +"동합니다. \n" +"대부분의 사용자는 이것을 변경할 필요가 없습니다.\n" +"값이 증가하면 약한 GPU에서 아티팩트를 줄일 수 있습니다. \n" +"0.1 = 기본값, 0.25 = 약한 태블릿에 적합한 값." #: src/settings_translation_file.cpp msgid "Camera smoothing" @@ -2457,9 +2713,8 @@ msgid "Camera update toggle key" msgstr "카메라 업데이트 토글 키" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cave noise" -msgstr "동굴 잡음 #1" +msgstr "동굴 잡음" #: src/settings_translation_file.cpp msgid "Cave noise #1" @@ -2474,93 +2729,87 @@ msgid "Cave width" msgstr "동굴 너비" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cave1 noise" -msgstr "동굴 잡음 #1" +msgstr "동굴1 잡음" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cave2 noise" -msgstr "동굴 잡음 #1" +msgstr "동굴2 잡음" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cavern limit" -msgstr "동굴 너비" +msgstr "동굴 제한" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cavern noise" -msgstr "동굴 잡음 #1" +msgstr "동굴 잡음" #: src/settings_translation_file.cpp msgid "Cavern taper" -msgstr "" +msgstr "동굴 테이퍼" #: src/settings_translation_file.cpp msgid "Cavern threshold" -msgstr "" +msgstr "동굴 임계치" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cavern upper limit" -msgstr "동굴 너비" +msgstr "동굴 상한선" #: 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 "" - -#: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +"빛 굴절 중심 범위 .\n" +"0.0은 최소 조명 수준이고 1.0은 최대 조명 수준입니다." #: src/settings_translation_file.cpp #, fuzzy +msgid "Chat command time message threshold" +msgstr "채팅 메세지 강제퇴장 임계값" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "채팅 명렁어" + +#: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "글꼴 크기" +msgstr "채팅 글자 크기" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "채팅" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "디버그 로그 수준" +msgstr "채팅 기록 수준" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message count limit" -msgstr "접속 시 status메시지" +msgstr "채팅 메세지 수 제한" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message format" -msgstr "접속 시 status메시지" +msgstr "채팅 메세지 포맷" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" -msgstr "" +msgstr "채팅 메세지 강제퇴장 임계값" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "채팅 메세지 최대 길이" #: src/settings_translation_file.cpp msgid "Chat toggle key" msgstr "채팅 스위치" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "채팅 명렁어" +#, fuzzy +msgid "Chat weblinks" +msgstr "채팅 보이기" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2575,10 +2824,15 @@ msgid "Cinematic mode key" msgstr "시네마틱 모드 스위치" #: src/settings_translation_file.cpp -#, fuzzy msgid "Clean transparent textures" msgstr "깨끗하고 투명한 텍스처" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "클라이언트" @@ -2592,13 +2846,17 @@ msgid "Client modding" msgstr "클라이언트 모딩" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client side modding restrictions" -msgstr "클라이언트 모딩" +msgstr "클라이언트 측 모딩 제한" #: src/settings_translation_file.cpp msgid "Client side node lookup range restriction" -msgstr "" +msgstr "클라이언트 측 노드 조회 범위 제한" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "클라이언트 모딩" #: src/settings_translation_file.cpp msgid "Climbing speed" @@ -2624,6 +2882,11 @@ msgstr "메뉴에 구름" msgid "Colored fog" msgstr "색깔있는 안개" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "색깔있는 안개" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2634,14 +2897,20 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" +"컨텐츠 저장소에서 쉼표로 구분된 숨겨진 플래그 목록입니다.\n" +"\"nonfree\"는 Free Software Foundation에서 정의한대로 '자유 소프트웨어'로 분" +"류되지 않는 패키지를 숨기는 데 사용할 수 있습니다,\n" +"콘텐츠 등급을 지정할 수도 있습니다.\n" +"이 플래그는 Minetest 버전과 독립적이므로. \n" +"https://content.minetest.net/help/content_flags/에서,\n" +"전체 목록을 참조하십시오." #: src/settings_translation_file.cpp -#, fuzzy 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 "" -"쉼표로 구분된 모드의 리스트는 HTTP API에 접근 할 수 있습니다.\n" +"쉼표로 구분된 모드의 리스트는 HTTP API에 접근 할 수 있습니다,\n" "인터넷에서 데이터를 다운로드 하거나 업로드 할 수 있습니다." #: src/settings_translation_file.cpp @@ -2649,11 +2918,30 @@ 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 "" +"mod 보안이 켜져있는 경우에도 안전하지 않은 기능에 액세스 할 수있는 쉼표로 구" +"분 된 신뢰 할 수 있는 모드의 목록입니다\n" +"(request_insecure_environment ()를 통해)." #: src/settings_translation_file.cpp msgid "Command key" msgstr "명령 키" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "유리를 연결" @@ -2664,7 +2952,7 @@ msgstr "외부 미디어 서버에 연결" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." -msgstr "" +msgstr "노드에서 지원하는 경우 유리를 연결합니다." #: src/settings_translation_file.cpp msgid "Console alpha" @@ -2679,40 +2967,51 @@ msgid "Console height" msgstr "콘솔 높이" #: src/settings_translation_file.cpp -msgid "ContentDB Flag Blacklist" +msgid "Content Repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "콘텐츠DB 블랙리스트 플래그" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "ContentDB URL" -msgstr "계속" +msgstr "ContentDB URL주소" #: src/settings_translation_file.cpp msgid "Continuous forward" -msgstr "" +msgstr "연속 전진" #: 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 "" +"연속 전진 이동, 자동 전진 키로 전환.\n" +"비활성화하려면 자동 앞으로 이동 키를 다시 누르거나 뒤로 이동합니다." #: src/settings_translation_file.cpp msgid "Controls" msgstr "컨트롤" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Controls length of day/night cycle.\n" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" "낮/밤 주기의 길이를 컨트롤.\n" -"예: 72 = 20 분, 360 = 4 분, 1 = 24 시간, 0 = 낮/밤/바뀌지 않고 그대로." +"예: \n" +"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 @@ -2729,6 +3028,9 @@ msgid "" "Value >= 10.0 completely disables generation of tunnels and avoids the\n" "intensive noise calculations." msgstr "" +"터널 너비를 제어하고 값이 작을수록 더 넓은 터널이 생성됩니다.\n" +"값> = 10.0은 터널 생성을 완전히 비활성화하고 집중적인 노이즈 계산을 \n" +"방지합니다." #: src/settings_translation_file.cpp msgid "Crash message" @@ -2743,7 +3045,10 @@ msgid "Crosshair alpha" msgstr "십자선 투명도" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "십자선 투명도 (불투명 함, 0과 255 사이)." #: src/settings_translation_file.cpp @@ -2751,8 +3056,10 @@ msgid "Crosshair color" msgstr "십자선 색" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "십자선 색 (빨, 초, 파)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" #: src/settings_translation_file.cpp msgid "DPI" @@ -2767,25 +3074,24 @@ msgid "Debug info toggle key" msgstr "디버그 정보 토글 키" #: src/settings_translation_file.cpp -#, fuzzy msgid "Debug log file size threshold" -msgstr "디버그 로그 수준" +msgstr "디버그 로그 파일 크기 임계치" #: src/settings_translation_file.cpp msgid "Debug log level" msgstr "디버그 로그 수준" +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + #: src/settings_translation_file.cpp msgid "Dec. volume key" msgstr "볼륨 낮추기 키" -#: 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 "" +msgstr "전용 서버 단계" #: src/settings_translation_file.cpp msgid "Default acceleration" @@ -2796,7 +3102,6 @@ msgid "Default game" msgstr "기본 게임" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Default game when creating a new world.\n" "This will be overridden when creating a world from the main menu." @@ -2817,31 +3122,31 @@ msgid "Default report format" msgstr "기본 보고서 형식" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "기본 게임" +msgstr "기본 스택 크기" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." -msgstr "" +msgstr "나무에 사과가 있는 영역 정의." #: src/settings_translation_file.cpp msgid "Defines areas with sandy beaches." -msgstr "" +msgstr "모래 해변이 있는 지역을 정의합니다." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" +msgstr "높은 지형의 분포와 절벽의 가파른 정도를 정의합니다." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain." -msgstr "" +msgstr "더 높은 지형의 분포를 정의합니다." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." @@ -2855,15 +3160,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"텍스처의 샘플링 단계를 정의합니다.\n" -"일반 맵에 부드럽게 높은 값을 나타냅니다." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2873,7 +3169,6 @@ msgid "Defines the depth of the river channel." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "블록에 최대 플레이어 전송 거리를 정의 합니다 (0 = 무제한)." @@ -2900,7 +3195,6 @@ msgid "Delay in sending blocks after building" msgstr "건축 후 블록 전송 지연" #: src/settings_translation_file.cpp -#, fuzzy msgid "Delay showing tooltips, stated in milliseconds." msgstr "도구 설명 표시 지연, 1000분의 1초." @@ -2909,12 +3203,10 @@ msgid "Deprecated Lua API handling" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Depth below which you'll find giant caverns." msgstr "큰 동굴을 발견할 수 있는 깊이." #: src/settings_translation_file.cpp -#, fuzzy msgid "Depth below which you'll find large caves." msgstr "큰 동굴을 발견할 수 있는 깊이." @@ -2940,6 +3232,15 @@ msgstr "블록 애니메이션 비동기화" #: src/settings_translation_file.cpp #, fuzzy +msgid "Developer Options" +msgstr "장식" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "오른쪽 키" + +#: src/settings_translation_file.cpp msgid "Digging particles" msgstr "입자 효과" @@ -2951,6 +3252,16 @@ msgstr "Anticheat를 사용 안함" msgid "Disallow empty passwords" msgstr "비밀번호 없으면 불가" +#: src/settings_translation_file.cpp +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 "도메인 서버의 이름은 서버리스트에 표시 됩니다." @@ -2968,7 +3279,6 @@ msgid "Drop item key" msgstr "아이템 드랍 키" #: src/settings_translation_file.cpp -#, fuzzy msgid "Dump the mapgen debug information." msgstr "Mapgen 디버그 정보를 덤프 합니다." @@ -2981,9 +3291,8 @@ msgid "Dungeon minimum Y" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Dungeon noise" -msgstr "강 소리" +msgstr "던전 잡음" #: src/settings_translation_file.cpp msgid "" @@ -2997,23 +3306,39 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +#, fuzzy +msgid "Enable creative mode for all players" msgstr "새로 만든 맵에서 creative모드를 활성화시킵니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable joysticks" -msgstr "조이스틱 적용" +msgstr "조이스틱 활성화" + +#: 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 "모드 보안 적용" +msgstr "모드 채널 지원 활성화." #: src/settings_translation_file.cpp msgid "Enable mod security" @@ -3027,22 +3352,16 @@ msgstr "플레이어는 데미지를 받고 죽을 수 있습니다." 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -3052,7 +3371,8 @@ msgid "" "expecting." msgstr "" "오래된 클라이언트 연결을 허락하지 않는것을 사용.\n" -"이전 클라이언트는 서버에서 당신이 기대하는 새로운 특징들을 지원하지 않는다면 " +"이전 클라이언트는 서버에서 당신이 기대하는 새로운 특징들을 지원하지 않는다" +"면 \n" "새로운 서버로 연결할 때 충돌하지 않을 것입니다." #: src/settings_translation_file.cpp @@ -3062,9 +3382,9 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" -"(만약 서버에서 제공한다면)원격 미디어 서버 사용 가능.\n" -"원격 서버들은 서버에 연결할 때 매우 빠르게 미디어를 다운로드 할 수 있도록 제" -"공합니다.(예: 텍스처)" +"원격 미디어 서버 사용 가능(만약 서버에서 제공한다면).\n" +"원격 서버들은 서버에 연결할 때 매우 빠르게 미디어를\n" +"다운로드 할 수 있도록 제공합니다.(예: 텍스처)" #: src/settings_translation_file.cpp msgid "" @@ -3081,14 +3401,13 @@ msgstr "" "예 : 0은 화면 흔들림 없음; 1.0은 노멀; 2.0은 더블." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Enable/disable running an IPv6 server.\n" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" -"IPv6 서버를 실행 활성화/비활성화. IPv6 서버는 IPv6 클라이언트 시스템 구성에 " -"따라 제한 될 수 있습니다.\n" +"IPv6 서버를 실행 활성화/비활성화.\n" +"IPv6 서버는 IPv6 클라이언트 시스템 구성에 따라 제한 될 수 있습니다.\n" "만약 Bind_address가 설정 된 경우 무시 됩니다." #: src/settings_translation_file.cpp @@ -3103,17 +3422,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "인벤토리 아이템의 애니메이션 적용." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"텍스처에 bumpmapping을 할 수 있습니다. Normalmaps는 텍스쳐 팩에서 받거나 자" -"동 생성될 필요가 있습니다.\n" -"쉐이더를 활성화 해야 합니다." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -3122,23 +3430,6 @@ msgstr "" msgid "Enables minimap." msgstr "미니맵 적용." -#: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"비행 노멀맵 생성 적용 (엠보스 효과).\n" -"Bumpmapping를 활성화 해야 합니다." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"시차 교합 맵핑 적용.\n" -"쉐이더를 활성화 해야 합니다." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3147,6 +3438,17 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "계곡 측면" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "엔진 프로 파일링 데이터 출력 간격" @@ -3155,12 +3457,6 @@ msgstr "엔진 프로 파일링 데이터 출력 간격" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3172,8 +3468,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "일시정지 메뉴에서 FPS" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "FPS when unfocused or paused" +msgstr "게임이 일시정지될때의 최대 FPS." #: src/settings_translation_file.cpp msgid "FSAA" @@ -3184,26 +3485,12 @@ msgid "Factor noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fall bobbing factor" msgstr "낙하 흔들림" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font path" -msgstr "yes" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "대체 글꼴 그림자" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "대체 글꼴 그림자 투명도" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "대체 글꼴 크기" +msgstr "대체 글꼴 경로" #: src/settings_translation_file.cpp msgid "Fast key" @@ -3224,11 +3511,11 @@ msgstr "빠른 이동" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"빠른 이동('use'키 사용).\n" -"서버에서는 \"fast\"권한이 요구됩니다." +"빠른 이동 ( \"특수\"키 사용).\n" +"이를 위해서는 서버에 대한 \"빠른\"권한이 필요합니다." #: src/settings_translation_file.cpp msgid "Field of view" @@ -3239,15 +3526,15 @@ msgid "Field of view in degrees." msgstr "각도에 대한 시야." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "File in client/serverlist/ that contains your favorite servers displayed in " "the\n" "Multiplayer Tab." -msgstr "클라이언트/서버리스트/멀티플레이어 탭에서 당신이 가장 좋아하는 서버" +msgstr "" +"멀티 플레이어 탭에 표시되는 즐겨 찾는 서버가 포함 된 \n" +"client / serverlist /의 파일입니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Filler depth" msgstr "강 깊이" @@ -3262,14 +3549,15 @@ msgstr "필름 형 톤 맵핑" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: 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." @@ -3288,39 +3576,32 @@ msgid "Fixed virtual joystick" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "Floatland의 산 밀집도" +msgstr "Floatland의 밀집도" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "Floatland의 산 높이" +msgstr "Floatland의 Y 최대값" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "Floatland의 산 높이" +msgstr "Floatland의 Y 최소값" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Floatland의 높이" +msgstr "Floatland 노이즈" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "Floatland의 산 밀집도" +msgstr "Floatland의 테이퍼 지수" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "Floatland의 산 밀집도" +msgstr "Floatland의 테이퍼링 거리" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "Floatland의 높이" +msgstr "Floatland의 물 높이" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3342,6 +3623,11 @@ msgstr "" 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 "" @@ -3363,15 +3649,15 @@ msgid "Font size" msgstr "글꼴 크기" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3380,6 +3666,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3408,22 +3705,18 @@ msgid "Formspec Full-Screen Background Opacity" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec default background color (R,G,B)." -msgstr "게임 내에서 채팅 콘솔 배경 색상 (빨,초,파)." +msgstr "게임 내에서 채팅 콘솔 배경 색상 (빨강, 초록, 파랑)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec default background opacity (between 0 and 255)." msgstr "게임 내에서 채팅 콘솔 배경 알파 (불투명 함, 0와 255 사이)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec full-screen background color (R,G,B)." -msgstr "게임 내에서 채팅 콘솔 배경 색상 (빨,초,파)." +msgstr "게임 내에서 채팅 콘솔 배경 색상 (빨강, 초록, 파랑)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec full-screen background opacity (between 0 and 255)." msgstr "게임 내에서 채팅 콘솔 배경 알파 (불투명 함, 0와 255 사이)." @@ -3443,11 +3736,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "FreeType fonts" -msgstr "Freetype 글꼴" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3472,10 +3760,6 @@ msgstr "" msgid "Full screen" msgstr "전체 화면" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "전체 화면 BPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "전체 화면 모드." @@ -3493,8 +3777,17 @@ msgid "GUI scaling filter txr2img" msgstr "GUI 크기 조정 필터 txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Normalmaps 생성" +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" @@ -3504,7 +3797,7 @@ msgstr "글로벌 콜백" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3523,29 +3816,41 @@ msgstr "" 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 "중력" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ground level" -msgstr "물의 높이" +msgstr "지면 수준" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ground noise" -msgstr "물의 높이" +msgstr "지면 노이즈" #: src/settings_translation_file.cpp -#, fuzzy msgid "HTTP mods" msgstr "HTTP 모드" #: src/settings_translation_file.cpp -msgid "HUD scale factor" +msgid "HUD" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "GUI 크기 조정" + #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD 토글 키" @@ -3553,8 +3858,8 @@ msgstr "HUD 토글 키" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3572,27 +3877,23 @@ msgid "Heat blend noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Heat noise" -msgstr "동굴 잡음 #1" +msgstr "용암 잡음" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "초기 창 크기의 높이 구성 요소입니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Height noise" -msgstr "오른쪽 창" +msgstr "높이 노이즈" #: src/settings_translation_file.cpp msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3602,24 +3903,20 @@ msgid "Hill threshold" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness1 noise" -msgstr "동굴 잡음 #1" +msgstr "언덕1 잡음" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness2 noise" -msgstr "동굴 잡음 #1" +msgstr "언덕2 잡음" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness3 noise" -msgstr "동굴 잡음 #1" +msgstr "언덕3 잡음" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness4 noise" -msgstr "동굴 잡음 #1" +msgstr "언덕4 잡음" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." @@ -3665,7 +3962,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Hotbar slot 12 key" -msgstr "" +msgstr "핫바 슬롯 키 12" #: src/settings_translation_file.cpp msgid "Hotbar slot 13 key" @@ -3780,9 +4077,8 @@ msgid "Hotbar slot 9 key" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "How deep to make rivers." -msgstr "얼마나 강을 깊게 만들건가요" +msgstr "제작할 강의 깊이." #: src/settings_translation_file.cpp msgid "" @@ -3793,14 +4089,21 @@ 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 "게곡을 얼마나 넓게 만들지" +msgstr "제작할 강의 너비." #: src/settings_translation_file.cpp msgid "Humidity blend noise" @@ -3830,8 +4133,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3854,10 +4156,18 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." -msgstr "활성화시, \"sneak\"키 대신 \"use\"키가 내려가는데 사용됩니다." +msgstr "" +"활성화시, \"sneak\"키 대신 \"특수\"키가 내려가는데 \n" +"사용됩니다." + +#: 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 "" @@ -3882,16 +4192,20 @@ 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 "적용할 경우, 새로운 플레이어는 빈 암호로 가입 할 수 없습니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "If enabled, you can place blocks at the position (feet + eye level) where " "you stand.\n" "This is helpful when working with nodeboxes in small areas." -msgstr "활성화시, 당신이 서 있는 자리에도 블록을 놓을 수 있습니다." +msgstr "" +"활성화시,\n" +"당신이 서 있는 자리에도 블록을 놓을 수 있습니다." #: src/settings_translation_file.cpp msgid "" @@ -3900,6 +4214,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3917,11 +4237,6 @@ msgid "Ignore world errors" msgstr "월드 에러 무시" #: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "인게임" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "게임 내에서 채팅 콘솔 배경 알파 (불투명 함, 0와 255 사이)." @@ -3930,14 +4245,12 @@ msgid "In-game chat console background color (R,G,B)." msgstr "게임 내에서 채팅 콘솔 배경 색상 (빨,초,파)." #: src/settings_translation_file.cpp -#, fuzzy msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." msgstr "게임 내에서 채팅 콘솔 배경 알파 (불투명 함, 0와 255 사이)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Inc. volume key" -msgstr "콘솔 키" +msgstr "볼륨 증가 키" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." @@ -3950,7 +4263,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3973,17 +4286,14 @@ msgstr "" 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." -msgstr "" +#, fuzzy +msgid "Interval of sending time of day to clients, stated in seconds." +msgstr "도구 설명 표시 지연, 1000분의 1초." #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -4002,19 +4312,16 @@ msgid "Invert vertical mouse movement." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "고정 폭 글꼴 경로" +msgstr "기울임꼴 경로" #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic monospace font path" -msgstr "고정 폭 글꼴 경로" +msgstr "고정 폭 기울임 글꼴 경로" #: src/settings_translation_file.cpp -#, fuzzy msgid "Item entity TTL" -msgstr "아이템의 TTL(Time To Live)" +msgstr "아이템의 TTL(Time To Live)" #: src/settings_translation_file.cpp msgid "Iterations" @@ -4036,6 +4343,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -4121,6 +4432,17 @@ msgstr "" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"점프키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4142,7 +4464,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for increasing the volume.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -4173,14 +4494,14 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player backward.\n" "Will also disable autoforward, when active.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"플레이어가 뒤쪽으로 움직이는 키입니다.\n" +"플레이어가 \n" +"뒤쪽으로 움직이는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" @@ -4215,7 +4536,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for muting the game.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -4268,6 +4588,16 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"점프키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3 참조" + +#: src/settings_translation_file.cpp +msgid "" "Key for selecting the 11th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4277,7 +4607,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 12th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -4288,354 +4617,322 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 13th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"13번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 14th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"14번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 15th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"15번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 16th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"16번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 17th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"17번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 18th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"18번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 19th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"19번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 20th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"20번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 21st hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"21번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 22nd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"22번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 23rd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"23번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 24th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"24번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 25th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"25번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 26th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"26번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 27th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"27번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 28th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"28번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 29th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"29번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 30th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"30번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 31st hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"31번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 32nd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"32번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the eighth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"8번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the fifth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"5번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the first hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"1번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the fourth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"4번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the next item in the hotbar.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"다음 아이템 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the ninth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"9번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the previous item in the hotbar.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"이전 아이템 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the second hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"2번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the seventh hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"7번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the sixth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"6번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the tenth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"10번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the third hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"인벤토리를 여는 키입니다.\n" +"3번째 hotbar 슬롯을 선택하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" @@ -4674,14 +4971,13 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling autoforward.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"자동으로 달리는 기능을 켜는 키입니다.\n" -"http://irrlicht.sourceforge.net/docu/namespaceirr." +"자동전진 토글에 대한 키입니다.\n" +"Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp @@ -4735,13 +5031,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling pitch move mode.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"자유시점 모드 스위치 키입니다.\n" +"피치 이동 모드 토글에 대한 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" @@ -4756,13 +5051,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of chat.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"채팅 스위치 키입니다.\n" +"채팅 디스플레이 토글 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" @@ -4777,13 +5071,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of fog.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"안개 스위치 키입니다.\n" +"안개 디스플레이 토글 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" @@ -4798,13 +5091,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of the large chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"채팅 스위치 키입니다.\n" +"채팅 콘솔 디스플레이 토글 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3 참조" @@ -4826,16 +5118,19 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3 참조" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key to use view zoom when possible.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"점프키입니다.\n" +"가능한 경우 시야 확대를 사용하는 키입니다.\n" "Http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4869,16 +5164,14 @@ msgid "Large cave proportion flooded" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Large chat console key" -msgstr "콘솔 키" +msgstr "큰 채팅 콘솔 키" #: src/settings_translation_file.cpp msgid "Leaves style" msgstr "나뭇잎 스타일" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Leaves style:\n" "- Fancy: all faces visible\n" @@ -4898,11 +5191,10 @@ 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 -#, fuzzy msgid "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." @@ -4911,15 +5203,18 @@ 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 @@ -4931,7 +5226,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4960,11 +5256,18 @@ 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" "Value is stored per-world." -msgstr "(0,0,0)으로부터 6방향으로 뻗어나갈 맵 크기" +msgstr "" +"(0, 0, 0)에서 모든 6 개 방향의 노드에서 맵 생성 제한.\n" +"mapgen 제한 내에 완전히 포함 된 맵 청크 만 생성됩니다.\n" +"값은 세계별로 저장됩니다." #: src/settings_translation_file.cpp msgid "" @@ -4992,7 +5295,6 @@ msgid "Liquid queue purge time" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid sinking" msgstr "하강 속도" @@ -5031,23 +5333,22 @@ msgstr "" msgid "Main menu script" msgstr "주 메뉴 스크립트" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "주 메뉴 스크립트" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" +msgstr "모든 액체를 불투명하게 만들기" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" -msgstr "모든 액체를 불투명하게 만들기" +msgid "Map Compression Level for Network Transfer" +msgstr "" #: src/settings_translation_file.cpp msgid "Map directory" @@ -5108,19 +5409,21 @@ msgstr "맵 생성 제한" msgid "Map save interval" msgstr "맵 저장 간격" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapblock mesh generation delay" -msgstr "맵 생성 제한" +msgstr "맵 블록 생성 지연" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "맵 생성 제한" +msgstr "Mapblock 메시 생성기의 MapBlock 캐시 크기 (MB)" #: src/settings_translation_file.cpp msgid "Mapblock unload timeout" @@ -5135,46 +5438,40 @@ msgid "Mapgen Carpathian specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat" -msgstr "Mapgen 이름" +msgstr "Mapgen 플랫" #: src/settings_translation_file.cpp msgid "Mapgen Flat specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal" -msgstr "Mapgen 이름" +msgstr "Mapgen 형태" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Mapgen 이름" +msgstr "Mapgen 형태 상세 플래그" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5" -msgstr "맵젠v5" +msgstr "맵젠 V5" #: src/settings_translation_file.cpp msgid "Mapgen V5 specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6" -msgstr "세계 생성기" +msgstr "맵젠 V6" #: src/settings_translation_file.cpp msgid "Mapgen V6 specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7" -msgstr "세계 생성기" +msgstr "맵젠 V7" #: src/settings_translation_file.cpp msgid "Mapgen V7 specific flags" @@ -5221,13 +5518,18 @@ msgid "Maximum FPS" msgstr "최대 FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +#, fuzzy +msgid "Maximum FPS when the window is not focused, or when the game is paused." msgstr "게임이 일시정지될때의 최대 FPS." #: src/settings_translation_file.cpp -msgid "Maximum forceloaded blocks" +msgid "Maximum distance to render shadows." msgstr "" +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "최대 강제 로딩 블럭" + #: src/settings_translation_file.cpp msgid "Maximum hotbar width" msgstr "최대 hotbar 폭" @@ -5269,6 +5571,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -5287,9 +5596,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum number of players that can be connected simultaneously." -msgstr "동시접속 할 수 있는 최대 인원수." +msgstr "동시접속 할 수 있는 최대 인원 수." #: src/settings_translation_file.cpp msgid "Maximum number of recent chat messages to show" @@ -5304,7 +5612,6 @@ msgid "Maximum objects per block" msgstr "블록 당 최대 개체" #: src/settings_translation_file.cpp -#, fuzzy 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." @@ -5313,7 +5620,6 @@ msgstr "" "hotbar의 오른쪽이나 왼쪽에 무언가를 나타낼 때 유용합니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum simultaneous block sends per client" msgstr "클라이언트 당 최대 동시 블록 전송" @@ -5328,18 +5634,23 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +#, fuzzy +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" "ms 에서 파일을 다운로드하면 (예 : 모드 다운로드) 최대 시간이 걸릴 수 있습니" "다." #: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "최대 사용자" +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" #: src/settings_translation_file.cpp -msgid "Menus" -msgstr "메뉴" +msgid "Maximum users" +msgstr "최대 사용자" #: src/settings_translation_file.cpp msgid "Mesh cache" @@ -5382,20 +5693,33 @@ msgid "Minimum limit of random number of small caves per mapchunk." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum texture size" -msgstr "필터 최소 텍스처 크기" +msgstr "최소 텍스처 크기" #: src/settings_translation_file.cpp msgid "Mipmapping" msgstr "밉매핑(Mipmapping)" +#: 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5406,6 +5730,11 @@ msgstr "고정 폭 글꼴 경로" msgid "Monospace font size" msgstr "고정 폭 글꼴 크기" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "고정 폭 글꼴 크기" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5419,9 +5748,8 @@ msgid "Mountain variation noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mountain zero level" -msgstr "물의 높이" +msgstr "산 0 수준" #: src/settings_translation_file.cpp msgid "Mouse sensitivity" @@ -5444,9 +5772,8 @@ msgstr "" "예 : 0은 화면 흔들림 없음; 1.0은 노말; 2.0은 더블." #: src/settings_translation_file.cpp -#, fuzzy msgid "Mute key" -msgstr "키 사용" +msgstr "음소거 키" #: src/settings_translation_file.cpp msgid "Mute sound" @@ -5479,16 +5806,17 @@ msgstr "서버이름은 플레이어가 서버 리스트에 들어갈 때 나타 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 "신규 사용자는 이 비밀번호를 입력해야 합니다." @@ -5501,6 +5829,11 @@ msgstr "노클립" msgid "Noclip key" msgstr "노클립 키" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Node 강조" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "Node 강조" @@ -5513,14 +5846,6 @@ msgstr "NodeTimer 간격" msgid "Noises" msgstr "소리" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Normalmaps 샘플링" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Normalmaps 강도" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5542,18 +5867,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "시차 교합 반복의 수" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "불투명한 액체" @@ -5563,11 +5880,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5576,41 +5888,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "일반적인 규모/2의 시차 교합 효과의 전반적인 바이어스." - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Overall scale of parallax occlusion effect." -msgstr "시차 교합 효과의 전체 규모" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "시차 교합" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "시차 교합 바이어스" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "시차 교합 반복" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion mode" -msgstr "시차 교합 모드" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "시차 교합 규모" +msgid "Optional override for chat weblink color." +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5634,17 +5917,13 @@ msgstr "텍스처 디렉터리 경로입니다. 모든 텍스처는 여기에서 #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5665,14 +5944,23 @@ msgid "Physics" msgstr "물리학" #: src/settings_translation_file.cpp -#, fuzzy msgid "Pitch move key" -msgstr "비행 키" +msgstr "피치 이동 키" #: src/settings_translation_file.cpp msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "비행 키" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "오른쪽 클릭 반복 간격" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5681,21 +5969,20 @@ msgstr "" "플레이어는 중력에 의해 영향을 받지 않고 날 수 있습니다.\n" "서버에서는 \"fly\" 권한을 필요로 합니다." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "플레이어 이름" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "플레이어 전송 거리" #: src/settings_translation_file.cpp -#, fuzzy msgid "Player versus player" msgstr "PVP" #: src/settings_translation_file.cpp #, fuzzy +msgid "Poisson filtering" +msgstr "이중 선형 필터링" + +#: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" "Note that the port field in the main menu overrides this setting." @@ -5710,12 +5997,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Prevent mods from doing insecure things like running shell commands." msgstr "shell 명령어 실행 같은 안전 하지 않은 것으로부터 모드를 보호합니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Print the engine's profiling data in regular intervals (in seconds).\n" "0 = disable. Useful for developers." @@ -5735,11 +6020,6 @@ msgstr "프로파일러" msgid "Profiler toggle key" msgstr "프로파일러 토글 키" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Profiling" -msgstr "프로 파일링" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5747,9 +6027,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5766,12 +6046,10 @@ msgstr "" "26보다 큰 수치들은 구름을 선명하게 만들고 모서리를 잘라낼 것입니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Raises terrain to make valleys around the rivers." msgstr "강 주변에 계곡을 만들기 위해 지형을 올립니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Random input" msgstr "임의 입력" @@ -5784,7 +6062,6 @@ msgid "Recent Chat Messages" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" msgstr "보고서 경로" @@ -5803,12 +6080,10 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Replaces the default main menu with a custom one." msgstr "기본 주 메뉴를 커스텀 메뉴로 바꿉니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Report path" msgstr "보고서 경로" @@ -5831,9 +6106,8 @@ msgid "Ridge mountain spread noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ridge noise" -msgstr "강 소리" +msgstr "능선 노이즈" #: src/settings_translation_file.cpp msgid "Ridge underwater noise" @@ -5848,41 +6122,30 @@ msgid "Right key" msgstr "오른쪽 키" #: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "오른쪽 클릭 반복 간격" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "River channel depth" msgstr "강 깊이" #: src/settings_translation_file.cpp -#, fuzzy msgid "River channel width" -msgstr "강 깊이" +msgstr "강 너비" #: src/settings_translation_file.cpp -#, fuzzy msgid "River depth" msgstr "강 깊이" #: src/settings_translation_file.cpp -#, fuzzy msgid "River noise" msgstr "강 소리" #: src/settings_translation_file.cpp -#, fuzzy msgid "River size" msgstr "강 크기" #: src/settings_translation_file.cpp -#, fuzzy msgid "River valley width" -msgstr "강 깊이" +msgstr "강 계곡 폭" #: src/settings_translation_file.cpp -#, fuzzy msgid "Rollback recording" msgstr "롤백 레코딩" @@ -5907,7 +6170,6 @@ msgid "Sandy beaches occur when np_beach exceeds this value." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Save the map received by the client on disk." msgstr "디스크에 클라이언트에서 받은 맵을 저장 합니다." @@ -5928,6 +6190,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "화면:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "화면 높이" @@ -5960,8 +6227,12 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Screenshots" +msgstr "스크린샷" + +#: src/settings_translation_file.cpp msgid "Seabed noise" -msgstr "동굴 잡음 #1" +msgstr "해저 노이즈" #: src/settings_translation_file.cpp msgid "Second of 4 2D noises that together define hill/mountain range height." @@ -5972,11 +6243,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 -#, fuzzy msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Http://www.sqlite.org/pragma.html#pragma_synchronous 참조" @@ -5993,7 +6259,6 @@ msgid "Selection box width" msgstr "선택 박스 너비" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Selects one of 18 fractal types.\n" "1 = 4D \"Roundy\" Mandelbrot set.\n" @@ -6036,8 +6301,19 @@ msgstr "" "18 = 4 D \"만델벌브\" 줄리아 집합." #: 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" @@ -6063,10 +6339,20 @@ msgstr "서버 포트" 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 "서버리스트 파일" @@ -6080,12 +6366,42 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"True로 설정하면 흔들리는 나뭇잎 효과가 적용됩니다.\n" +"쉐이더를 활성화 해야 합니다." + +#: src/settings_translation_file.cpp +msgid "" "Set to true to enable waving leaves.\n" "Requires shaders to be enabled." msgstr "" @@ -6093,16 +6409,14 @@ msgstr "" "쉐이더를 활성화 해야 합니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" "True로 설정하면 물결효과가 적용됩니다.\n" -"쉐이더를 활성화해야 합니다.." +"쉐이더를 활성화해야 합니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving plants.\n" "Requires shaders to be enabled." @@ -6110,12 +6424,18 @@ msgstr "" "True로 설정하면 흔들리는 식물 효과가 적용됩니다.\n" "쉐이더를 활성화 해야 합니다." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "쉐이더 경로" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" @@ -6124,21 +6444,36 @@ msgid "" msgstr "" "쉐이더는 확장된 시각 효과를 제공하고 몇몇 비디오 카드의 성능이 증가할 수도 있" "습니다.\n" -"이것은 OpenGL video backend에서만 직동합니다." +"이것은 OpenGL video backend에서만 \n" +"작동합니다." #: src/settings_translation_file.cpp #, fuzzy +msgid "Shadow filter quality" +msgstr "스크린샷 품질" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "최소 텍스처 크기" + +#: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " "drawn." msgstr "글꼴 그림자 오프셋, 만약 0 이면 그림자는 나타나지 않을 것입니다." #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "글꼴 그림자 오프셋, 만약 0 이면 그림자는 나타나지 않을 것입니다." +msgid "Shadow strength gamma" +msgstr "" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6149,10 +6484,22 @@ msgid "Show debug info" msgstr "디버그 정보 보기" #: src/settings_translation_file.cpp -#, fuzzy msgid "Show entity selection boxes" msgstr "개체 선택 상자 보기" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"언어 설정. 시스템 언어를 사용하려면 비워두세요.\n" +"설정 적용 후 재시작이 필요합니다." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "서버닫힘 메시지" @@ -6174,14 +6521,17 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Slope and fill work together to modify the heights." -msgstr "높이 수정을 위해 기울기와 채우기를 함께 작용합니다" +msgstr "높이 수정을 위해 기울기와 채우기를 함께 작용합니다." #: src/settings_translation_file.cpp msgid "Small cave maximum number" @@ -6204,7 +6554,6 @@ msgid "Smooth lighting" msgstr "부드러운 조명효과" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Smooths camera when looking around. Also called look or mouse smoothing.\n" "Useful for recording videos." @@ -6228,7 +6577,6 @@ msgid "Sneak key" msgstr "살금살금걷기 키" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sneaking speed" msgstr "걷는 속도" @@ -6236,20 +6584,15 @@ msgstr "걷는 속도" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "글꼴 그림자 투명도" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "사운드" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "살금살금걷기 키" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key for climbing/descending" -msgstr "오르기/내리기 에 사용되는 키입니다" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6265,6 +6608,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6281,23 +6632,17 @@ msgid "Steepness noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Step mountain size noise" -msgstr "지형 높이" +msgstr "계단식 산 높이" #: src/settings_translation_file.cpp msgid "Step mountain spread noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." msgstr "자동으로 생성되는 노멀맵의 강도." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "자동으로 생성되는 노멀맵의 강도." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6337,28 +6682,28 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy +msgid "Temporary Settings" +msgstr "설정" + +#: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "지형 높이" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain base noise" -msgstr "지형 높이" +msgstr "지형 기초 분산" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain height" msgstr "지형 높이" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain higher noise" -msgstr "지형 높이" +msgstr "지형 높이 분산" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain noise" -msgstr "지형 높이" +msgstr "지형 분산" #: src/settings_translation_file.cpp msgid "" @@ -6382,6 +6727,13 @@ msgstr "" msgid "Texture path" msgstr "텍스처 경로" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6396,6 +6748,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6403,9 +6759,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "The depth of dirt or other biome filler node." -msgstr "흙이나 다른 것의 깊이" +msgstr "흙이나 다른 것의 깊이." #: src/settings_translation_file.cpp msgid "" @@ -6439,8 +6794,8 @@ msgid "" "See /privs in game for a full list on your server and mod configuration." msgstr "" "새로운 유저가 자동으로 얻는 권한입니다.\n" -"게임에서 /privs를 입력하여 서버와 모드 환경설정의 전체 권한\n" -" 목록을 확인하세요." +"게임에서 /privs를 입력하여 서버와 모드 환경설정의 전체 권한 목록을 확인하세" +"요." #: src/settings_translation_file.cpp msgid "" @@ -6455,18 +6810,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6484,6 +6839,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6492,9 +6853,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6513,18 +6873,18 @@ msgid "Third of 4 2D noises that together define hill/mountain range height." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Time in seconds for item entity (dropped items) to live.\n" "Setting it to -1 disables the feature." -msgstr "드랍된 아이템이 살아 있는 시간입니다. -1을 입력하여 비활성화합니다." +msgstr "" +"드랍된 아이템이 살아 있는 시간입니다.\n" +"-1을 입력하여 비활성화합니다." #: src/settings_translation_file.cpp msgid "Time of day when a new world is started, in millihours (0-23999)." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Time send interval" msgstr "시간 전송 간격" @@ -6534,7 +6894,7 @@ msgstr "시간 속도" #: src/settings_translation_file.cpp #, fuzzy -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 "" "메모리에서 사용 하지 않는 맵 데이터를 제거하기 위해 클라이언트에 대한 시간 제" "한입니다." @@ -6550,20 +6910,30 @@ msgstr "" "이것은 node가 배치되거나 제거된 후 얼마나 오래 느려지는지를 결정합니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Toggle camera mode key" msgstr "카메라모드 스위치 키" #: src/settings_translation_file.cpp -#, fuzzy msgid "Tooltip delay" msgstr "도구 설명 지연" #: src/settings_translation_file.cpp -#, fuzzy 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 "" @@ -6573,7 +6943,6 @@ msgid "Trilinear filtering" msgstr "삼중 선형 필터링" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" @@ -6592,7 +6961,6 @@ msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "멀티 탭에 표시 된 서버 목록 URL입니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Undersampling" msgstr "좌표표집(Undersampling)" @@ -6606,7 +6974,6 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Unlimited player transfer distance" msgstr "무제한 플레이어 전송 거리" @@ -6631,7 +6998,6 @@ msgid "Use a cloud animation for the main menu background." msgstr "주 메뉴 배경에 구름 애니메이션을 사용 합니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Use anisotropic filtering when viewing at textures from an angle." msgstr "각도에 따라 텍스처를 볼 때 이방성 필터링을 사용 합니다." @@ -6641,42 +7007,51 @@ msgstr "이중 선형 필터링은 질감 스케일링을 할 때 사용 합니 #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + +#: src/settings_translation_file.cpp 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 "" #: src/settings_translation_file.cpp -#, fuzzy msgid "VSync" msgstr "수직동기화 V-Sync" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley depth" msgstr "계곡 깊이" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley fill" msgstr "계곡 채우기" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley profile" msgstr "계곡 측면" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley slope" msgstr "계곡 경사" @@ -6690,7 +7065,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Variation of number of caves." -msgstr "" +msgstr "숫자 의 마우스 설정." #: src/settings_translation_file.cpp msgid "" @@ -6709,7 +7084,6 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Varies steepness of cliffs." msgstr "산의 높이/경사를 조절." @@ -6726,16 +7100,12 @@ msgid "Video driver" msgstr "비디오 드라이버" #: src/settings_translation_file.cpp -#, fuzzy msgid "View bobbing factor" -msgstr "보기 만료" +msgstr "시야의 흔들리는 정도" #: src/settings_translation_file.cpp -#, fuzzy msgid "View distance in nodes." -msgstr "" -"node의 보여지는 거리\n" -"최소 = 20" +msgstr "node의 보여지는 거리(최소 = 20)." #: src/settings_translation_file.cpp msgid "View range decrease key" @@ -6754,7 +7124,7 @@ msgid "Viewing range" msgstr "시야 범위" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6762,7 +7132,6 @@ msgid "Volume" msgstr "볼륨" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." @@ -6800,7 +7169,6 @@ msgid "Water surface level of the world." msgstr "월드의 물 표면 높이." #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving Nodes" msgstr "움직이는 Node" @@ -6809,22 +7177,18 @@ msgid "Waving leaves" msgstr "흔들리는 나뭇잎 효과" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" -msgstr "움직이는 Node" +msgstr "물 움직임" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" msgstr "물결 높이" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" msgstr "물결 속도" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" msgstr "물결 길이" @@ -6834,14 +7198,19 @@ msgstr "흔들리는 식물 효과" #: src/settings_translation_file.cpp #, fuzzy +msgid "Weblink color" +msgstr "선택 박스 컬러" + +#: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" "Gui_scaling_filter이 true 이면 모든 GUI 이미지 소프트웨어에서 필터링 될 필요" -"가 있습니다. 하지만 일부 이미지는 바로 하드웨어에 생성됩니다. (e.g. render-" -"to-texture for nodes in inventory)." +"가 있습니다. \n" +"하지만 일부 이미지는 바로 하드웨어에 생성됩니다. \n" +"(e.g. render-to-texture for nodes in inventory)." #: src/settings_translation_file.cpp msgid "" @@ -6858,24 +7227,26 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" -"이중선형/삼중선형/이방성 필터를 사용할 때 저해상도 택스쳐는 희미하게 보일 수 " -"있습니다.so automatically upscale them with nearest-neighbor interpolation " -"to preserve crisp pixels. This sets the minimum texture size for the " -"upscaled textures; 값이 높을수록 선명하게 보입니다. 하지만 많은 메모리가 필요" -"합니다. Powers of 2 are recommended. Setting this higher than 1 may not have " -"a visible effect unless bilinear/trilinear/anisotropic filtering is enabled." +"이중선형/삼중선형/이방성 필터를 사용할 때 \n" +"저해상도 택스쳐는 희미하게 보일 수 있습니다.\n" +"so automatically upscale them with nearest-neighbor interpolation to " +"preserve crisp pixels. \n" +"This sets the minimum texture size for the upscaled textures; \n" +"값이 높을수록 선명하게 보입니다. \n" +"하지만 많은 메모리가 필요합니다. \n" +"Powers of 2 are recommended. \n" +"Setting this higher than 1 may not have a visible effect\n" +"unless bilinear/trilinear/anisotropic filtering is enabled." #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6910,6 +7281,15 @@ msgid "" "pause menu." 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)." @@ -6917,11 +7297,10 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "폭은 초기 창 크기로 구성되어 있습니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "Width of the selection box lines around nodes." msgstr "" "node 주위 “selectionbox'” or (if UTF-8 supported) “selectionbox’” 라인의 너비" @@ -6943,9 +7322,8 @@ msgstr "" "주 메뉴에서 시작 하는 경우 필요 하지 않습니다." #: src/settings_translation_file.cpp -#, fuzzy msgid "World start time" -msgstr "세계 이름" +msgstr "세계 시작 시간" #: src/settings_translation_file.cpp msgid "" @@ -6962,9 +7340,8 @@ msgid "World-aligned textures mode" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Y of flat ground." -msgstr "평평한 땅의 Y값" +msgstr "평평한 땅의 Y값." #: src/settings_translation_file.cpp msgid "" @@ -7008,69 +7385,355 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- 크리에이티브 모드: " -#~ msgid "Toggle Cinematic" -#~ msgstr "시네마틱 스위치" +#~ msgid "- Damage: " +#~ msgstr "- 데미지: " + +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." +#~ msgstr "" +#~ "0 = 경사 정보가 존재 (빠름).\n" +#~ "1 = 릴리프 매핑 (더 느리고 정확함)." + +#~ msgid "Address / Port" +#~ msgstr "주소/포트" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "싱글 플레이어 월드를 리셋하겠습니까?" + +#~ msgid "Back" +#~ msgstr "뒤로" + +#~ msgid "Basic" +#~ msgstr "기본" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "전체 화면 모드에서 (일명 색 농도) 픽셀 당 비트." + +#~ msgid "Bump Mapping" +#~ msgstr "범프 매핑" + +#~ msgid "Bumpmapping" +#~ msgstr "범프맵핑" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "메인 메뉴 UI 변경 :\n" +#~ "-전체 : 여러 싱글 플레이어 월드, 게임 선택, 텍스처 팩 선택기 등.\n" +#~ "-단순함 : 단일 플레이어 세계, 게임 또는 텍스처 팩 선택기가 없습니다. \n" +#~ "작은 화면에 필요할 수 있습니다." + +#~ msgid "Config mods" +#~ msgstr "모드 설정" + +#~ msgid "Configure" +#~ msgstr "환경설정" + +#~ msgid "Connect" +#~ msgstr "연결" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "액체의 하강 속도 제어." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "터널 너비를 조절, 작은 수치는 넓은 터널을 만듭니다." + +#~ msgid "Credits" +#~ msgstr "만든이" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "십자선 색 (빨, 초, 파)." + +#~ msgid "Damage enabled" +#~ msgstr "데미지 활성화" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "cURL에 대한 기본 제한 시간 (밀리 초 단위).\n" +#~ "cURL로 컴파일 된 경우에만 효과가 있습니다." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "텍스처의 샘플링 단계를 정의합니다.\n" +#~ "일반 맵에 부드럽게 높은 값을 나타냅니다." + +#~ msgid "Del. Favorite" +#~ msgstr "즐겨찾기 삭제" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "minetest.net에서 Minetest Game 같은 서브 게임을 다운로드하세요" + +#~ msgid "Download one from minetest.net" +#~ msgstr "minetest.net에서 다운로드 하세요" + +#, fuzzy +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "$1 를(을) 다운로드중입니다. 기다려주세요..." + +#~ msgid "Enable VBO" +#~ msgstr "VBO 적용" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "텍스처에 bumpmapping을 할 수 있습니다. \n" +#~ "Normalmaps는 텍스쳐 팩에서 받거나 자동 생성될 필요가 있습니다.\n" +#~ "쉐이더를 활성화 해야 합니다." + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "비행 노멀맵 생성 적용 (엠보스 효과).\n" +#~ "Bumpmapping를 활성화 해야 합니다." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "시차 교합 맵핑 적용.\n" +#~ "쉐이더를 활성화 해야 합니다." + +#~ msgid "Enter " +#~ msgstr "들어가기 " + +#~ msgid "FPS in pause menu" +#~ msgstr "일시정지 메뉴에서 FPS" + +#~ msgid "Fallback font shadow" +#~ msgstr "대체 글꼴 그림자" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "대체 글꼴 그림자 투명도" + +#~ msgid "Fallback font size" +#~ msgstr "대체 글꼴 크기" + +#~ msgid "Filtering" +#~ msgstr "필터링" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "글꼴 그림자 투명도 (불투명 함, 0과 255 사이)." + +#~ msgid "FreeType fonts" +#~ msgstr "Freetype 글꼴" + +#~ msgid "Full screen BPP" +#~ msgstr "전체 화면 BPP" + +#~ msgid "Game" +#~ msgstr "게임" + +#~ msgid "Gamma" +#~ msgstr "감마" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Normal maps 생성" + +#~ msgid "Generate normalmaps" +#~ msgstr "Normalmaps 생성" + +#~ msgid "In-Game" +#~ msgstr "인게임" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "모드 설치: 파일: \"$1\"" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Keybindings. (이 메뉴를 고정하려면 minetest.cof에서 stuff를 제거해야합니" +#~ "다.)" + +#, fuzzy +#~ msgid "Lava depth" +#~ msgstr "큰 동굴 깊이" + +#~ msgid "Main" +#~ msgstr "메인" + +#~ msgid "Main menu style" +#~ msgstr "주 메뉴 스크립트" + +#~ msgid "Menus" +#~ msgstr "메뉴" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "레이더 모드의 미니맵, 2배 확대" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "레이더 모드의 미니맵, 4배 확대" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "표면 모드의 미니맵, 2배 확대" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "표면 모드의 미니맵, 4배 확대" + +#~ msgid "Name / Password" +#~ msgstr "이름/비밀번호" + +#~ msgid "Name/Password" +#~ msgstr "이름/비밀번호" + +#~ msgid "No" +#~ msgstr "아니오" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Normalmaps 샘플링" + +#~ msgid "Normalmaps strength" +#~ msgstr "Normalmaps 강도" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "시차 교합 반복의 수." + +#~ msgid "Ok" +#~ msgstr "확인" + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "일반적인 규모/2의 시차 교합 효과의 전반적인 바이어스." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "시차 교합 효과의 전체 규모." + +#~ msgid "Parallax Occlusion" +#~ msgstr "시차 교합" + +#~ msgid "Parallax occlusion" +#~ msgstr "시차 교합" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "시차 교합 바이어스" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "시차 교합 반복" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "시차 교합 모드" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "시차 교합 규모" + +#, fuzzy +#~ msgid "Parallax occlusion strength" +#~ msgstr "시차 교합 강도" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "TrueTypeFont 또는 비트맵의 경로입니다." + +#~ msgid "Path to save screenshots at." +#~ msgstr "스크린샷 저장 경로입니다." + +#~ msgid "Player name" +#~ msgstr "플레이어 이름" + +#~ msgid "Profiling" +#~ msgstr "프로 파일링" + +#~ msgid "PvP enabled" +#~ msgstr "PvP 가능" + +#~ msgid "Reset singleplayer world" +#~ msgstr "싱글 플레이어 월드 초기화" #, fuzzy #~ msgid "Select Package File:" #~ msgstr "선택한 모드 파일:" +#~ msgid "Server / Singleplayer" +#~ msgstr "서버 / 싱글 플레이어" + +#~ msgid "Shadow limit" +#~ msgstr "그림자 제한" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "글꼴 그림자 오프셋, 만약 0 이면 그림자는 나타나지 않을 것입니다." + +#~ msgid "Special" +#~ msgstr "특별함" + +#~ msgid "Special key" +#~ msgstr "특수 키" + +#~ msgid "Start Singleplayer" +#~ msgstr "싱글 플레이어 시작" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "자동으로 생성되는 노멀맵의 강도." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "이 글꼴은 특정 언어에 사용 됩니다." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "쉐이더를 사용하려면 OpenGL 드라이버를 사용할 필요가 있습니다." + +#~ msgid "Toggle Cinematic" +#~ msgstr "시네마틱 스위치" + +#~ msgid "View" +#~ msgstr "보기" + #~ msgid "Waving Water" #~ msgstr "물결 효과" #~ msgid "Waving water" #~ msgstr "물결 효과" -#~ msgid "This font will be used for certain languages." -#~ msgstr "이 글꼴은 특정 언어에 사용 됩니다." +#~ msgid "Yes" +#~ msgstr "예" -#~ msgid "Shadow limit" -#~ msgstr "그림자 제한" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "TrueTypeFont 또는 비트맵의 경로입니다." +#, 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 "Lava depth" -#~ msgstr "큰 동굴 깊이" +#~ msgid "You died." +#~ msgstr "사망했습니다" -#~ msgid "Gamma" -#~ msgstr "감마" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "글꼴 그림자 투명도 (불투명 함, 0과 255 사이)." - -#~ msgid "Enable VBO" -#~ msgstr "VBO 적용" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "터널 너비를 조절, 작은 수치는 넓은 터널을 만듭니다." - -#~ msgid "Path to save screenshots at." -#~ msgstr "스크린샷 저장 경로입니다." - -#, fuzzy -#~ msgid "Parallax occlusion strength" -#~ msgstr "시차 교합 강도" - -#, fuzzy -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "$1 를(을) 다운로드중입니다. 기다려주세요..." - -#~ msgid "Back" -#~ msgstr "뒤로" - -#~ msgid "Ok" -#~ msgstr "확인" +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/ky/minetest.po b/po/ky/minetest.po index 1d4de9d90..5de3ad5f7 100644 --- a/po/ky/minetest.po +++ b/po/ky/minetest.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Kyrgyz (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\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: Kyrgyz <https://hosted.weblate.org/projects/minetest/minetest/" @@ -14,6 +14,47 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.10-dev\n" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "Команда" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Менюга чыгуу" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "Команда" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "Бир кишилик" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "Бир кишилик" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "Кайтадан жаралуу" @@ -23,10 +64,41 @@ msgstr "Кайтадан жаралуу" msgid "You died" msgstr "Сиз өлдүңүз." +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "Команда" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "Команда" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "" @@ -49,9 +121,30 @@ msgstr "Туташуу" msgid "The server has requested a reconnect:" msgstr "" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -66,7 +159,7 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" #: builtin/mainmenu/common.lua @@ -77,17 +170,26 @@ msgstr "" msgid "We support protocol versions between version $1 and $2." msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Жокко чыгаруу" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua #, fuzzy msgid "Dependencies:" msgstr "көз карандылыктары:" @@ -165,15 +267,55 @@ msgstr "Дүйнөнү тандаңыз:" msgid "enabled" msgstr "күйгүзүлгөн" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Жүктөлүүдө..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy msgid "Back to Main Menu" msgstr "Башкы меню" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "Оюн" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -189,7 +331,6 @@ msgid "Failed to download $1" msgstr "Дүйнөнү инициалдаштыруу катасы" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "Games" msgstr "Оюн" @@ -199,7 +340,18 @@ msgid "Install" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "" @@ -212,8 +364,23 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua @@ -229,7 +396,11 @@ msgid "Update" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -273,11 +444,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 @@ -296,10 +463,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 "" @@ -316,6 +479,14 @@ msgstr "" msgid "Increases humidity around rivers" msgstr "" +#: builtin/mainmenu/dlg_create_world.lua +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 "" @@ -416,10 +587,6 @@ msgstr "" 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 "Дүйнө аты" @@ -451,6 +618,38 @@ 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 +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 +msgid "Register" +msgstr "" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Кабыл алуу" @@ -483,6 +682,16 @@ 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 +#, fuzzy msgid "Disabled" msgstr "Баарын өчүрүү" @@ -508,7 +717,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -527,6 +736,10 @@ msgstr "" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "Select directory" @@ -537,7 +750,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 "" @@ -619,14 +832,6 @@ msgstr "" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" @@ -651,6 +856,57 @@ msgstr "Дүйнөнү инициалдаштыруу катасы" msgid "Unable to install a modpack as a $1" msgstr "Дүйнөнү инициалдаштыруу катасы" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Жүктөлүүдө..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "" @@ -693,26 +949,6 @@ msgstr "" msgid "Use Texture Pack" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Алкыштар" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "" @@ -722,14 +958,10 @@ msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Ырастоо" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Жаратуу режими" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Убалды күйгүзүү" @@ -746,10 +978,6 @@ msgstr "" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Аты/сырсөзү" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Жаңы" @@ -763,10 +991,15 @@ msgstr "" msgid "Play Game" msgstr "Оюнду баштоо/туташуу" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Дүйнөнү тандаңыз:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Дүйнөнү тандаңыз:" @@ -782,52 +1015,66 @@ msgstr "Оюн" #: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "Address / Port" +msgid "Address" msgstr "Дареги/порту" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Туташуу" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Тазалоо" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Creative mode" msgstr "Жаратуу режими" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "Damage enabled" -msgstr "күйгүзүлгөн" +msgid "Damage / PvP" +msgstr "Убалды күйгүзүү" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "Del. Favorite" +msgid "Favorites" msgstr "Тандалмалар:" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Favorite" -msgstr "Тандалмалар:" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" #: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Join Game" msgstr "Оюн" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Name / Password" -msgstr "Аты/сырсөзү" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "" + +#: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "PvP enabled" -msgstr "күйгүзүлгөн" +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" @@ -855,11 +1102,6 @@ msgstr "Ырастоолор" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Are you sure to reset your singleplayer world?" -msgstr "Бир кишилик" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -869,11 +1111,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "Экисызык чыпкалоосу" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Bump Mapping" -msgstr "Mip-текстуралоо" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp #, fuzzy msgid "Change Keys" @@ -884,13 +1121,29 @@ msgstr "Баскычтарды өзгөртүү" msgid "Connected Glass" msgstr "Туташуу" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Fancy Leaves" msgstr "Күңүрт суу" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -902,10 +1155,6 @@ msgstr "Mip-текстуралоо" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Жок" - #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "No Filter" @@ -940,20 +1189,11 @@ msgstr "Күңүрт суу" msgid "Opaque Water" msgstr "Күңүрт суу" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Particles" msgstr "Баарын күйгүзүү" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Reset singleplayer world" -msgstr "Бир кишилик" - #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Screen:" @@ -967,6 +1207,10 @@ msgstr "Ырастоолор" msgid "Shaders" msgstr "Көлөкөлөгүчтөр" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -985,17 +1229,13 @@ msgstr "Тегиз жарык" msgid "Texturing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp #, fuzzy msgid "Tone Mapping" msgstr "Mip-текстуралоо" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +msgid "Touch threshold (px):" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -1003,6 +1243,14 @@ msgstr "" msgid "Trilinear Filter" msgstr "Үчсызык чыпкалоосу" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Waving Leaves" @@ -1018,27 +1266,13 @@ msgstr "Кооз бактар" msgid "Waving Plants" msgstr "Кооз бактар" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ооба" - -#: builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Config mods" -msgstr "Ырастоо" - -#: builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Main" -msgstr "Башкы меню" - -#: builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Start Singleplayer" -msgstr "Бир кишилик" - #: src/client/client.cpp #, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Туташтыруу катасы (убактыңыз өтүп кеттиби?)" + +#: src/client/client.cpp src/client/game.cpp +#, fuzzy msgid "Connection timed out." msgstr "Туташтыруу катасы (убактыңыз өтүп кеттиби?)" @@ -1069,7 +1303,8 @@ msgid "Connection error (timed out?)" msgstr "Туташтыруу катасы (убактыңыз өтүп кеттиби?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Оюнду табуу же жүктөө мүмкүн эмес \"" #: src/client/clientlauncher.cpp @@ -1100,18 +1335,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1125,16 +1348,6 @@ msgstr "" msgid "- Address: " msgstr "Дареги/порту" -#: src/client/game.cpp -#, fuzzy -msgid "- Creative Mode: " -msgstr "Жаратуу режими" - -#: src/client/game.cpp -#, fuzzy -msgid "- Damage: " -msgstr "Убалды күйгүзүү" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1157,6 +1370,15 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Automatic forward disabled" @@ -1167,6 +1389,22 @@ msgstr "Алга" msgid "Automatic forward enabled" msgstr "Алга" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1176,6 +1414,10 @@ msgstr "" msgid "Camera update enabled" msgstr "күйгүзүлгөн" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Сырсөздү өзгөртүү" @@ -1190,6 +1432,10 @@ msgstr "Жаратуу режими" msgid "Cinematic mode enabled" msgstr "Жаратуу режими" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1198,6 +1444,10 @@ msgstr "" msgid "Connecting to server..." msgstr "Серверге туташтырылууда..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Улантуу" @@ -1210,13 +1460,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1232,6 +1482,11 @@ msgstr "" "- Чычкан дөңгөлөгү: буюмду тандоо\n" "- T: маек\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Клиент жаратылууда..." @@ -1277,6 +1532,11 @@ msgstr "" 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 "Менюга чыгуу" @@ -1359,32 +1619,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +#, fuzzy +msgid "Multiplayer" +msgstr "Бир кишилик" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1462,6 +1699,21 @@ msgstr "" msgid "Sound unmuted" msgstr "Үн көлөмү" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1533,10 +1785,6 @@ msgstr "Артка" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Тазалоо" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1788,22 +2036,31 @@ msgstr "" msgid "Zoom" msgstr "Масштаб" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Сырсөздөр дал келген жок!" - -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Дүйнөнү инициалдаштыруу катасы" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1811,7 +2068,7 @@ msgid "Proceed" msgstr "Улантуу" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1823,16 +2080,24 @@ msgstr "Алга" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Артка" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Change camera" msgstr "Баскычтарды өзгөртүү" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Маек" @@ -1886,7 +2151,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 @@ -1920,10 +2185,6 @@ msgstr "Тез сүрөт" msgid "Sneak" msgstr "Уурданып басуу" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Toggle HUD" @@ -1969,10 +2230,6 @@ msgstr "баскычты басыңыз" msgid "Change" msgstr "Өзгөртүү" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Сырсөздү аныктоо" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Жаңы сырсөз" @@ -1981,6 +2238,10 @@ msgstr "Жаңы сырсөз" msgid "Old Password" msgstr "Эски сырсөз" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Сырсөздөр дал келген жок!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Чыгуу" @@ -1991,15 +2252,10 @@ msgid "Muted" msgstr "баскычты басыңыз" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, 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 "" - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -2007,6 +2263,15 @@ msgstr "" msgid "LANG_CODE" msgstr "ky" +#: 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" @@ -2015,8 +2280,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -2043,12 +2308,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2138,6 +2397,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2156,6 +2419,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2201,6 +2468,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2211,6 +2482,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Дүйнө аты" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Кошумча" @@ -2225,7 +2501,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2294,6 +2570,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Automatic forward key" @@ -2315,6 +2595,15 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Секирүү" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Backward key" @@ -2328,10 +2617,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2355,7 +2640,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 @@ -2363,11 +2648,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2397,8 +2682,8 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Bumpmapping" -msgstr "Mip-текстуралоо" +msgid "Camera" +msgstr "Баскычтарды өзгөртүү" #: src/settings_translation_file.cpp msgid "" @@ -2471,15 +2756,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Команда" + #: src/settings_translation_file.cpp msgid "Chat font size" msgstr "" @@ -2516,9 +2800,8 @@ msgid "Chat toggle key" msgstr "Баскычтарды өзгөртүү" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Chatcommands" -msgstr "Команда" +msgid "Chat weblinks" +msgstr "" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2538,6 +2821,12 @@ msgstr "Жаратуу режими" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2558,6 +2847,10 @@ msgstr "" 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 "" @@ -2584,6 +2877,10 @@ msgstr "Башкы меню" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2612,6 +2909,22 @@ msgstr "" msgid "Command key" msgstr "Команда" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Connect glass" @@ -2641,10 +2954,18 @@ msgstr "Консоль" msgid "Console height" msgstr "Консоль" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2673,7 +2994,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 @@ -2705,7 +3028,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2713,7 +3038,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2738,11 +3065,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 @@ -2782,8 +3109,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2814,12 +3142,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2890,6 +3212,15 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "Оң меню" + #: src/settings_translation_file.cpp #, fuzzy msgid "Digging particles" @@ -2904,6 +3235,16 @@ msgstr "Бөлүкчөлөрдү күйгүзүү" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2948,18 +3289,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2976,22 +3334,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -3040,14 +3392,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -3057,18 +3401,6 @@ msgstr "" msgid "Enables minimap." msgstr "Убалды күйгүзүү" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3077,6 +3409,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -3085,12 +3427,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3102,7 +3438,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3121,18 +3461,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3151,7 +3479,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3185,15 +3513,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Filtering" -msgstr "Анизатропия чыпкалоосу" +msgid "Filtering and Antialiasing" +msgstr "" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3259,6 +3586,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3280,15 +3611,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3297,6 +3628,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3357,10 +3699,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3385,10 +3723,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3406,7 +3740,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3417,7 +3760,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3436,6 +3779,14 @@ msgstr "" 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 "" @@ -3453,7 +3804,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 @@ -3463,8 +3818,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3486,7 +3841,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3498,10 +3854,6 @@ msgstr "Оң Windows" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3697,10 +4049,17 @@ 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 "" @@ -3733,8 +4092,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3756,11 +4114,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3784,7 +4148,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 @@ -3801,6 +4167,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3817,11 +4189,6 @@ msgstr "" msgid "Ignore world errors" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "In-Game" -msgstr "Оюн" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -3850,7 +4217,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3873,16 +4240,12 @@ msgstr "" 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 @@ -3934,6 +4297,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -4014,6 +4381,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4113,6 +4487,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4486,6 +4867,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4544,7 +4929,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 @@ -4554,15 +4939,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 @@ -4574,7 +4962,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4601,6 +4990,11 @@ msgstr "" 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" @@ -4673,22 +5067,21 @@ msgstr "" msgid "Main menu script" msgstr "Башкы меню" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Башкы меню" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4750,6 +5143,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4855,7 +5252,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4903,6 +5304,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4957,18 +5365,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Menus" -msgstr "Меню" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -5018,12 +5429,24 @@ msgstr "" msgid "Mipmapping" msgstr "Mip-текстуралоо" +#: 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5034,6 +5457,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5101,16 +5528,16 @@ msgstr "" 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 "" @@ -5123,6 +5550,11 @@ msgstr "" 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 "" @@ -5135,14 +5567,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5164,18 +5588,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5185,11 +5601,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5198,38 +5609,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5252,17 +5637,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5292,13 +5673,18 @@ msgid "Pitch move mode" msgstr "" #: 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." +#, fuzzy +msgid "Place key" +msgstr "Жаратуу режими" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +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 @@ -5309,6 +5695,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Экисызык чыпкалоосу" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5343,10 +5734,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5354,9 +5741,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5449,10 +5836,6 @@ msgstr "" msgid "Right key" msgstr "Оң меню" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5523,6 +5906,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Тез сүрөт" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5552,6 +5940,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Тез сүрөт" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5564,10 +5957,6 @@ msgstr "" 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 "" @@ -5609,9 +5998,18 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Server / Singleplayer" +msgid "Server" +msgstr "Жалпылык серверлердин тизмеси:" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" msgstr "Бир кишилик" +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "" + #: src/settings_translation_file.cpp msgid "Server URL" msgstr "" @@ -5636,11 +6034,20 @@ msgstr "" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +msgid "Server/Env Performance" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "Жалпылык серверлердин тизмеси:" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "Жалпылык серверлердин тизмеси:" + #: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist file" @@ -5653,7 +6060,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5674,6 +6109,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Shader path" @@ -5687,6 +6129,23 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "Тез сүрөт" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5694,9 +6153,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5711,6 +6168,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5732,6 +6199,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5790,16 +6261,11 @@ msgid "Sneaking speed, in nodes per second." msgstr "" #: src/settings_translation_file.cpp -msgid "Sound" +msgid "Soft shadow radius" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Уурданып басуу" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" +msgid "Sound" msgstr "" #: src/settings_translation_file.cpp @@ -5817,6 +6283,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5844,10 +6318,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5885,6 +6355,11 @@ msgstr "" 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 "" @@ -5927,6 +6402,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5941,6 +6423,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5996,18 +6482,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6025,6 +6511,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6033,9 +6525,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6072,7 +6563,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 @@ -6095,6 +6586,18 @@ msgstr "" 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 "" @@ -6166,15 +6669,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6268,7 +6786,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6344,6 +6862,10 @@ msgstr "Кооз бактар" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6365,18 +6887,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6411,13 +6931,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6502,33 +7031,137 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#, fuzzy +#~ msgid "- Creative Mode: " +#~ msgstr "Жаратуу режими" #, fuzzy -#~ msgid "Toggle Cinematic" -#~ msgstr "Тез басууга которуу" +#~ msgid "- Damage: " +#~ msgstr "Убалды күйгүзүү" #, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Дүйнөнү тандаңыз:" +#~ msgid "Address / Port" +#~ msgstr "Дареги/порту" + +#, fuzzy +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Бир кишилик" + +#~ msgid "Back" +#~ msgstr "Артка" + +#, fuzzy +#~ msgid "Bump Mapping" +#~ msgstr "Mip-текстуралоо" + +#, fuzzy +#~ msgid "Bumpmapping" +#~ msgstr "Mip-текстуралоо" + +#, fuzzy +#~ msgid "Config mods" +#~ msgstr "Ырастоо" + +#~ msgid "Configure" +#~ msgstr "Ырастоо" + +#~ msgid "Connect" +#~ msgstr "Туташуу" + +#~ msgid "Credits" +#~ msgstr "Алкыштар" + +#, fuzzy +#~ msgid "Damage enabled" +#~ msgstr "күйгүзүлгөн" + +#, fuzzy +#~ msgid "Enable VBO" +#~ msgstr "Баарын күйгүзүү" #, fuzzy #~ msgid "Enables filmic tone mapping" #~ msgstr "Убалды күйгүзүү" #, fuzzy -#~ msgid "Enable VBO" -#~ msgstr "Баарын күйгүзүү" +#~ msgid "Filtering" +#~ msgstr "Анизатропия чыпкалоосу" -#~ msgid "Back" -#~ msgstr "Артка" +#~ msgid "Game" +#~ msgstr "Оюн" + +#, fuzzy +#~ msgid "In-Game" +#~ msgstr "Оюн" + +#, fuzzy +#~ msgid "Main" +#~ msgstr "Башкы меню" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Башкы меню" + +#, fuzzy +#~ msgid "Menus" +#~ msgstr "Меню" + +#, fuzzy +#~ msgid "Name / Password" +#~ msgstr "Аты/сырсөзү" + +#~ msgid "Name/Password" +#~ msgstr "Аты/сырсөзү" + +#~ msgid "No" +#~ msgstr "Жок" + +#, fuzzy +#~ msgid "PvP enabled" +#~ msgstr "күйгүзүлгөн" + +#, fuzzy +#~ msgid "Reset singleplayer world" +#~ msgstr "Бир кишилик" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Дүйнөнү тандаңыз:" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "Уурданып басуу" + +#, fuzzy +#~ msgid "Start Singleplayer" +#~ msgstr "Бир кишилик" + +#, fuzzy +#~ msgid "Toggle Cinematic" +#~ msgstr "Тез басууга которуу" + +#~ msgid "Yes" +#~ msgstr "Ооба" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Сиз өлдүңүз." + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/lt/minetest.po b/po/lt/minetest.po index c4c658629..041611ede 100644 --- a/po/lt/minetest.po +++ b/po/lt/minetest.po @@ -2,40 +2,108 @@ msgid "" msgstr "" "Project-Id-Version: Lithuanian (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-05-10 12:32+0000\n" -"Last-Translator: restcoser <restcoser.mail@gmail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2021-04-10 15:49+0000\n" +"Last-Translator: Kornelijus Tvarijanavičius <kornelitvari@protonmail.com>\n" "Language-Team: Lithuanian <https://hosted.weblate.org/projects/minetest/" "minetest/lt/>\n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " -"19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " -"1 : 2);\n" -"X-Generator: Weblate 4.1-dev\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"(n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 4.6-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "Komanda" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Grįžti į meniu" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "Komanda" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "Žaisti vienam" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "Žaisti vienam" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "Prisikelti" #: builtin/client/death_formspec.lua src/client/game.cpp -#, fuzzy msgid "You died" -msgstr "Jūs numirėte." +msgstr "Jūs numirėte" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "Komanda" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "Komanda" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" #: builtin/fstk/ui.lua -#, fuzzy -msgid "An error occurred in a Lua script:" -msgstr "Klaida įvyko Lua scenarijuje, tokiame kaip papildinys:" +msgid "<none available>" +msgstr "" + +#: builtin/fstk/ui.lua +msgid "An error occurred in a Lua script:" +msgstr "Įvyko klaida Lua skripte:" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred:" msgstr "Įvyko klaida:" @@ -51,9 +119,30 @@ msgstr "Prisijungti iš naujo" msgid "The server has requested a reconnect:" msgstr "Serveris paprašė prisijungti iš naujo:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Įkeliama..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Pasirinkite pasaulį:" + +#: 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. " @@ -68,10 +157,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Serveris palaiko protokolo versijas nuo $1 iki $2 " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Pabandykite dar kart įjungti viešą serverių sąrašą ir patikrinkite savo " -"interneto ryšį." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -79,30 +166,36 @@ msgstr "Mes palaikome tik $1 protokolo versiją." #: builtin/mainmenu/common.lua msgid "We support protocol versions between version $1 and $2." -msgstr "Mes palaikome protokolo versijas nuo $1 iki $2." +msgstr "Mes palaikome protokolo versijas tarp $1 ir $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Atsisakyti" +msgstr "Atšaukti" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -#, fuzzy +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" -msgstr "Priklauso:" +msgstr "Priklauso nuo:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Disable all" -msgstr "Išjungti papildinį" +msgstr "Išjungti visus papildinius" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Disable modpack" msgstr "Išjungti papildinį" @@ -111,17 +204,15 @@ msgid "Enable all" msgstr "Įjungti visus" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Enable modpack" -msgstr "Pervadinti papildinių paką:" +msgstr "Aktyvuoti papildinį" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"Nepavyko įjungti papildinio „$1“, nes jis turi neleistų rašmenų. Tik " +"Nepavyko įjungti papildinio „$1“, nes jis turi neleistinų rašmenų. Tik " "rašmenys [a-z0-9_] yra leidžiami." #: builtin/mainmenu/dlg_config_world.lua @@ -137,19 +228,16 @@ msgid "No (optional) dependencies" msgstr "" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No game description provided." -msgstr "Papildinio aprašymas nepateiktas" +msgstr "Nepateiktas žaidimo aprašymas." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "Priklauso:" +msgstr "Nėra būtinų priklausomybių" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No modpack description provided." -msgstr "Papildinio aprašymas nepateiktas" +msgstr "Nepateiktas papildinio aprašymas." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" @@ -172,31 +260,65 @@ msgstr "Pasaulis:" msgid "enabled" msgstr "įjungtas" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 atsiunčiama..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy +msgid "Already installed" +msgstr "Jau įdiegta" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" -msgstr "Pagrindinis meniu" +msgstr "Atgal į Pagrindinį Meniu" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Pagrindinis Žaidimas:" #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgstr "ContentDB nėra prieinama, kai Minetest sukompiliuojamas be cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Įkeliama..." +msgstr "Siunčiama..." #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Failed to download $1" -msgstr "Nepavyko įdiegti $1 į $2" +msgstr "Nepavyko parsiųsti $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Žaidimai" @@ -205,7 +327,22 @@ msgid "Install" msgstr "Įdiegti" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "Įdiegti" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "Inicijuojami mazgai" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "" +"Papildinio diegimas: nepalaikomas failo tipas „$1“ arba sugadintas archyvas" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Papildiniai" @@ -218,9 +355,25 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Ieškoti" +#, fuzzy +msgid "No updates" +msgstr "Atnaujinti" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy @@ -237,7 +390,11 @@ msgid "Update" msgstr "Atnaujinti" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -277,18 +434,13 @@ msgid "Create" msgstr "Sukurti" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Papildinio informacija:" +msgstr "Dekoracijos" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Atsisiųskite sub žaidimą, tokį kaip minetest_game, iš minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Atsisiųsti vieną iš minetest.net" +msgid "Development Test is meant for developers." +msgstr "Dėmesio: Minimalus kūrimo bandymas yra skirtas vystytojams." #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -306,10 +458,6 @@ msgstr "" msgid "Floatlands (experimental)" msgstr "" -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Žaidimas" - #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" msgstr "" @@ -326,6 +474,15 @@ msgstr "" msgid "Increases humidity around rivers" msgstr "" +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Įdiegti" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "" + #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" msgstr "" @@ -428,11 +585,6 @@ msgstr "" 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 "Dėmesio: Minimalus kūrimo bandymas yra skirtas vystytojams." - #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "Pasaulio pavadinimas" @@ -466,6 +618,38 @@ msgstr "Papildtvrk: netinkamas papildinio kelias „$1“" msgid "Delete World \"$1\"?" msgstr "Ištrinti pasaulį „$1“?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Patvirtinti slaptažodį" + +#: 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 "Naujas slaptažodis" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "Slaptažodžiai nesutampa!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Priimti" @@ -498,6 +682,16 @@ msgstr "Naršyti" #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy +msgid "Content: Games" +msgstr "Tęsti" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Tęsti" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Disabled" msgstr "Išjungti papildinį" @@ -523,7 +717,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -542,17 +736,19 @@ msgstr "" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Ieškoti" + #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Select directory" -msgstr "Pasirinkite papildinio failą:" +msgstr "Pasirinkite aplanką" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Select file" -msgstr "Pasirinkite papildinio failą:" +msgstr "Pasirinkite failą" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "" @@ -638,18 +834,6 @@ msgstr "" "Papildinio diegimas: nepavyksta rasti tinkamo aplanko pavadinimo papildinio " "paketui $1" -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"\n" -"Papildinio diegimas: nepalaikomas failo tipas „$1“, arba sugadintas archyvas" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: file: \"$1\"" -msgstr "Įdiegti papildinį: failas: „$1“" - #: builtin/mainmenu/pkgmgr.lua #, fuzzy msgid "Unable to find a valid mod or modpack" @@ -677,6 +861,59 @@ msgstr "Nepavyko įdiegti $1 į $2" msgid "Unable to install a modpack as a $1" msgstr "Nepavyko įdiegti $1 į $2" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Įkeliama..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Pabandykite dar kart įjungti viešą serverių sąrašą ir patikrinkite savo " +"interneto ryšį." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktyvūs pagalbininkai" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Pagrindiniai kūrėjai" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Pasirinkite aplanką" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Ankstesni bendradarbiai" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Ankstesni pagrindiniai kūrėjai" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "" @@ -687,9 +924,8 @@ msgid "Content" msgstr "Tęsti" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Disable Texture Pack" -msgstr "Pasirinkite tekstūros paketą:" +msgstr "Pasirinkite tekstūros paketą" #: builtin/mainmenu/tab_content.lua #, fuzzy @@ -724,26 +960,6 @@ msgstr "Pašalinti pasirinktą papildinį" msgid "Use Texture Pack" msgstr "Tekstūrų paketai" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktyvūs pagalbininkai" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Pagrindiniai kūrėjai" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Padėkos" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Ankstesni bendradarbiai" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Ankstesni pagrindiniai kūrėjai" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Paskelbti Serverį" @@ -753,14 +969,10 @@ msgid "Bind Address" msgstr "Susieti adresą" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigūruoti" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Kūrybinė veiksena" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Leisti sužeidimus" @@ -778,10 +990,6 @@ msgstr "Serveris" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Vardas/slaptažodis" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Naujas" @@ -795,10 +1003,15 @@ msgstr "Nesukurtas ar pasirinktas joks pasaulis!" msgid "Play Game" msgstr "Pradėti žaidimą" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Prievadas" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Pasirinkite pasaulį:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Pasirinkite pasaulį:" @@ -814,49 +1027,67 @@ msgstr "Slėpti vidinius" #: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "Address / Port" -msgstr "Adresas / Prievadas :" +msgid "Address" +msgstr "- Adresas: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Jungtis" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Išvalyti" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Kūrybinė veiksena" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Žalojimas įjungtas" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua #, fuzzy -msgid "Del. Favorite" +msgid "Damage / PvP" +msgstr "Leisti sužeidimus" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Mėgiami:" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Favorite" -msgstr "Mėgiami:" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" #: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Join Game" msgstr "Slėpti vidinius" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -#, fuzzy -msgid "Name / Password" -msgstr "Vardas / Slaptažodis :" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP įjungtas" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Paskelbti Serverį" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Pašalinti iš mėgiamų" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Server Description" +msgstr "Serverio prievadas" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -883,11 +1114,6 @@ msgstr "Nustatymai" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Are you sure to reset your singleplayer world?" -msgstr "Atstatyti vieno žaidėjo pasaulį" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -896,10 +1122,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "„Bilinear“ filtras" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Nustatyti klavišus" @@ -909,13 +1131,29 @@ msgstr "Nustatyti klavišus" msgid "Connected Glass" msgstr "Jungtis" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Fancy Leaves" msgstr "Nepermatomi lapai" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -926,10 +1164,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Ne" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" @@ -960,20 +1194,11 @@ msgstr "Nepermatomi lapai" msgid "Opaque Water" msgstr "Nepermatomas vanduo" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Paralaksinė okliuzija" - #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Particles" msgstr "Įjungti visus" -#: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Reset singleplayer world" -msgstr "Atstatyti vieno žaidėjo pasaulį" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "" @@ -986,6 +1211,10 @@ msgstr "Nustatymai" msgid "Shaders" msgstr "Šešėliavimai" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -1004,22 +1233,26 @@ msgstr "Apšvietimo efektai" msgid "Texturing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" - #: 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 "" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Waving Leaves" @@ -1034,23 +1267,12 @@ msgstr "Nepermatomi lapai" msgid "Waving Plants" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Taip" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Konfigūruoti papildinius" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Pagrindinis" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Atstatyti vieno žaidėjo pasaulį" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Ryšio klaida (baigėsi prijungimo laikas?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Baigėsi prijungimo laikas." @@ -1079,7 +1301,8 @@ msgid "Connection error (timed out?)" msgstr "Ryšio klaida (baigėsi prijungimo laikas?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Nepavyko rasti ar įkelti žaidimo „" #: src/client/clientlauncher.cpp @@ -1111,18 +1334,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "Pateiktas pasaulio kelias neegzistuoja: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1132,33 +1343,20 @@ msgstr "" "Patikrinkite debug.txt dėl papildomos informacijos." #: src/client/game.cpp -#, fuzzy msgid "- Address: " -msgstr "Susieti adresą" - -#: src/client/game.cpp -#, fuzzy -msgid "- Creative Mode: " -msgstr "Kūrybinė veiksena" - -#: src/client/game.cpp -#, fuzzy -msgid "- Damage: " -msgstr "Leisti sužeidimus" +msgstr "- Adresas: " #: src/client/game.cpp msgid "- Mode: " msgstr "" #: src/client/game.cpp -#, fuzzy msgid "- Port: " -msgstr "Prievadas" +msgstr "- Prievadas: " #: src/client/game.cpp -#, fuzzy msgid "- Public: " -msgstr "Viešas" +msgstr "- Viešas: " #. ~ PvP = Player versus Player #: src/client/game.cpp @@ -1166,9 +1364,18 @@ msgid "- PvP: " msgstr "" #: src/client/game.cpp -#, fuzzy msgid "- Server Name: " -msgstr "Serveris" +msgstr "- Serverio pavadinimas: " + +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Įvyko klaida:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" #: src/client/game.cpp #, fuzzy @@ -1180,6 +1387,22 @@ msgstr "Pirmyn" msgid "Automatic forward enabled" msgstr "Pirmyn" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1189,6 +1412,10 @@ msgstr "" msgid "Camera update enabled" msgstr "Žalojimas įjungtas" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Keisti slaptažodį" @@ -1203,6 +1430,11 @@ msgstr "Kūrybinė veiksena" msgid "Cinematic mode enabled" msgstr "Kūrybinė veiksena" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Žaisti tinkle(klientas)" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1211,6 +1443,10 @@ msgstr "" msgid "Connecting to server..." msgstr "Jungiamasi prie serverio..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Tęsti" @@ -1223,27 +1459,35 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" "Numatytas valdymas:\n" -"- WASD: judėti\n" -"- Tarpas: šokti/lipti\n" -"- Lyg2: leistis/eiti žemyn\n" -"- Q: išmesti elementą\n" -"- I: inventorius\n" +"- %s: judėti į priekį\n" +"- %s: judėti atgal\n" +"- %s: judėti į kairę\n" +"- %s: judėti į dešinę\n" +"- %s: šokti/lipti\n" +"- %s: leistis/eiti žemyn\n" +"- %s: išmesti daiktą\n" +"- %s: inventorius\n" "- Pelė: sukti/žiūrėti\n" "- Pelės kairys: kasti/smugiuoti\n" "- Pelės dešinys: padėti/naudoti\n" "- Pelės ratukas: pasirinkti elementą\n" -"- T: kalbėtis\n" +"- %s: kalbėtis\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" #: src/client/game.cpp msgid "Creating client..." @@ -1301,6 +1545,11 @@ msgstr "" msgid "Enabled unlimited viewing range" msgstr "" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Kuriamas klientas..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Grįžti į meniu" @@ -1357,9 +1606,8 @@ msgid "Game paused" msgstr "Žaidimo pavadinimas" #: src/client/game.cpp -#, fuzzy msgid "Hosting server" -msgstr "Kuriamas serveris...." +msgstr "Kuriamas serveris" #: src/client/game.cpp msgid "Item definitions..." @@ -1382,32 +1630,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +#, fuzzy +msgid "Multiplayer" +msgstr "Žaisti vienam" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1484,6 +1709,21 @@ msgstr "" msgid "Sound unmuted" msgstr "Garso lygis" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1555,10 +1795,6 @@ msgstr "Atgal" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Išvalyti" - #: src/client/keycode.cpp msgid "Control" msgstr "Valdymas" @@ -1812,22 +2048,31 @@ msgstr "X mygtukas 2" msgid "Zoom" msgstr "Pritraukti" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Slaptažodžiai nesutampa!" - -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Nepavyko parsiųsti $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1836,7 +2081,7 @@ msgstr "Vykdyti" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "„Naudoti“ = kopti žemyn" #: src/gui/guiKeyChangeMenu.cpp @@ -1848,16 +2093,24 @@ msgstr "Pirmyn" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Atgal" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Change camera" msgstr "Nustatyti klavišus" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Susirašinėti" @@ -1911,8 +2164,8 @@ msgid "Key already in use" msgstr "Klavišas jau naudojamas" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "Klavišai. (Jei šis meniu sugenda, pašalinkite įrašus iš minetest.conf)" +msgid "Keybindings." +msgstr "" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy @@ -1944,10 +2197,6 @@ msgstr "" msgid "Sneak" msgstr "Sėlinti" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Toggle HUD" @@ -1993,10 +2242,6 @@ msgstr "paspauskite klavišą" msgid "Change" msgstr "Pakeisti" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Patvirtinti slaptažodį" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Naujas slaptažodis" @@ -2005,6 +2250,10 @@ msgstr "Naujas slaptažodis" msgid "Old Password" msgstr "Senas slaptažodis" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Slaptažodžiai nesutampa!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Išeiti" @@ -2015,15 +2264,10 @@ msgid "Muted" msgstr "paspauskite klavišą" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +msgid "Sound Volume: %d%%" msgstr "Garso lygis: " -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Įvesti" - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -2031,6 +2275,15 @@ msgstr "Įvesti" msgid "LANG_CODE" msgstr "lt" +#: 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" @@ -2039,8 +2292,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -2067,12 +2320,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2162,6 +2409,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2180,6 +2431,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2225,6 +2480,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2235,6 +2494,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Pasaulio pavadinimas" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2249,7 +2513,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2273,9 +2537,8 @@ msgid "Announce server" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Announce to this serverlist." -msgstr "Paskelbti Serverį" +msgstr "Paskelbti tai serverių sąrašui" #: src/settings_translation_file.cpp msgid "Append item name" @@ -2318,6 +2581,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Automatic forward key" @@ -2339,6 +2606,15 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Pašokti" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Backward key" @@ -2352,10 +2628,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2378,7 +2650,7 @@ msgid "Bind address" msgstr "Ieškoma adreso..." #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +msgid "Biome API noise parameters" msgstr "" #: src/settings_translation_file.cpp @@ -2386,11 +2658,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2418,8 +2690,9 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "Nustatyti klavišus" #: src/settings_translation_file.cpp msgid "" @@ -2492,15 +2765,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Komanda" + #: src/settings_translation_file.cpp msgid "Chat font size" msgstr "" @@ -2537,9 +2809,8 @@ msgid "Chat toggle key" msgstr "Nustatyti klavišus" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Chatcommands" -msgstr "Komanda" +msgid "Chat weblinks" +msgstr "" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2559,6 +2830,12 @@ msgstr "Kūrybinė veiksena" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Žaisti tinkle(klientas)" @@ -2581,6 +2858,11 @@ msgstr "Žaisti tinkle(klientas)" msgid "Client side node lookup range restriction" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "Žaisti tinkle(klientas)" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "" @@ -2607,6 +2889,10 @@ msgstr "Pagrindinis meniu" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2635,15 +2921,30 @@ msgstr "" msgid "Command key" msgstr "Komanda" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Connect glass" msgstr "Jungtis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Connect to external media server" -msgstr "Jungiamasi prie serverio..." +msgstr "Prisijungti prie išorinio medijos serverio" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." @@ -2662,10 +2963,18 @@ msgstr "" msgid "Console height" msgstr "Nustatyti klavišus" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2694,7 +3003,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 @@ -2726,7 +3037,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2734,7 +3047,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2759,11 +3074,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 @@ -2805,8 +3120,9 @@ msgstr "keisti žaidimą" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2837,12 +3153,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2913,6 +3223,16 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Dekoracijos" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "Dešinėn" + #: src/settings_translation_file.cpp #, fuzzy msgid "Digging particles" @@ -2926,6 +3246,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2970,12 +3300,25 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" msgstr "" #: src/settings_translation_file.cpp @@ -2983,9 +3326,12 @@ msgid "Enable joysticks" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Enable joysticks. Requires a restart to take effect" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod channels support." -msgstr "Papildiniai internete" +msgstr "Įjungti papildinių kanalų palaikymą." #: src/settings_translation_file.cpp #, fuzzy @@ -3000,22 +3346,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -3064,34 +3404,13 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enables minimap." -msgstr "Leisti sužeidimus" - -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" +msgstr "Įjungia minimapą." #: src/settings_translation_file.cpp msgid "" @@ -3101,6 +3420,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -3109,12 +3438,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3126,7 +3449,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3145,18 +3472,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3175,7 +3490,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3209,13 +3524,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3282,6 +3597,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3303,15 +3622,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3320,6 +3639,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3380,10 +3710,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3408,10 +3734,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3429,7 +3751,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Žaidimai" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3440,7 +3771,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3459,6 +3790,14 @@ msgstr "" 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 "" @@ -3477,7 +3816,11 @@ msgid "HTTP mods" msgstr "Papildiniai" #: 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 @@ -3487,8 +3830,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3510,7 +3853,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3522,10 +3866,6 @@ msgstr "Dešinieji langai" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3721,10 +4061,17 @@ 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 "" @@ -3757,8 +4104,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3780,11 +4126,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3808,7 +4160,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 @@ -3825,6 +4179,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3841,11 +4201,6 @@ msgstr "" msgid "Ignore world errors" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "In-Game" -msgstr "Žaidimas" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -3874,7 +4229,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3897,16 +4252,12 @@ msgstr "" 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 @@ -3958,6 +4309,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -4038,6 +4393,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4137,6 +4499,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4510,6 +4879,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4568,7 +4941,7 @@ msgstr "Kairėn" 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 @@ -4578,15 +4951,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 @@ -4598,7 +4974,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4625,6 +5002,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Apšvietimo efektai" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4697,22 +5079,21 @@ msgstr "" msgid "Main menu script" msgstr "Pagrindinis meniu" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Pagrindinis meniu" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4774,6 +5155,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4888,7 +5273,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4936,6 +5325,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4990,18 +5386,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Menus" -msgstr "Meniu" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -5050,12 +5449,25 @@ msgstr "" 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 "Papildiniai internete" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5066,6 +5478,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5133,16 +5549,16 @@ msgstr "" 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 "" @@ -5155,6 +5571,11 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Apšvietimo efektai" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5167,14 +5588,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5196,18 +5609,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5217,11 +5622,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5230,39 +5630,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Optional override for chat weblink color." msgstr "" -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Paralaksinė okliuzija" - #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5285,17 +5658,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5325,13 +5694,18 @@ msgid "Pitch move mode" msgstr "" #: 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." +#, fuzzy +msgid "Place key" +msgstr "Kūrybinė veiksena" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +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 @@ -5342,6 +5716,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5376,10 +5754,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5387,9 +5761,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5480,10 +5854,6 @@ msgstr "" msgid "Right key" msgstr "Dešinėn" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5554,6 +5924,10 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5581,6 +5955,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Užlaikymas" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5593,10 +5972,6 @@ msgstr "" 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 "" @@ -5638,8 +6013,18 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Server / Singleplayer" -msgstr "Žaisti vienam" +msgid "Server" +msgstr "Serveris" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "Serveris" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Serverio prievadas" #: src/settings_translation_file.cpp #, fuzzy @@ -5670,11 +6055,21 @@ msgstr "Serverio prievadas" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Serverio prievadas" + #: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist URL" msgstr "Viešų serverių sąrašas" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "Viešų serverių sąrašas" + #: src/settings_translation_file.cpp #, fuzzy msgid "Serverlist file" @@ -5687,7 +6082,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5708,6 +6131,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Shader path" @@ -5721,6 +6151,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5728,9 +6174,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5745,6 +6189,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5766,6 +6220,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5824,16 +6282,11 @@ msgid "Sneaking speed, in nodes per second." msgstr "" #: src/settings_translation_file.cpp -msgid "Sound" +msgid "Soft shadow radius" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Nustatyti klavišus" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" +msgid "Sound" msgstr "" #: src/settings_translation_file.cpp @@ -5851,6 +6304,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5878,10 +6339,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5919,6 +6376,11 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Nustatymai" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -5961,6 +6423,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5975,6 +6444,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6030,18 +6503,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6059,6 +6532,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6067,9 +6546,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6106,7 +6584,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 @@ -6129,6 +6607,18 @@ msgstr "" 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 "" @@ -6199,15 +6689,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6301,7 +6806,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6375,6 +6880,10 @@ msgstr "Nepermatomi lapai" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6396,18 +6905,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6442,13 +6949,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6533,39 +7049,151 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- Kūrybinis režimas " -#~ msgid "Toggle Cinematic" -#~ msgstr "Įjungti kinematografinį" +#~ msgid "- Damage: " +#~ msgstr "- Sužeidimai: " + +#~ msgid "Address / Port" +#~ msgstr "Adresas / Prievadas" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Ar tikrai norite perkurti savo lokalų pasaulį?" + +#~ msgid "Back" +#~ msgstr "Atgal" + +#~ msgid "Config mods" +#~ msgstr "Konfigūruoti papildinius" + +#~ msgid "Configure" +#~ msgstr "Konfigūruoti" + +#~ msgid "Connect" +#~ msgstr "Jungtis" + +#~ msgid "Credits" +#~ msgstr "Padėkos" + +#~ msgid "Damage enabled" +#~ msgstr "Žalojimas įjungtas" #, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Pasirinkite papildinio failą:" +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Atsisiųskite sub žaidimą, tokį kaip minetest_game, iš minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Atsisiųsti vieną iš minetest.net" #, fuzzy -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Leisti sužeidimus" +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Atsiunčiama $1, prašome palaukti..." #, fuzzy #~ msgid "Enable VBO" #~ msgstr "Įjungti papildinį" #, fuzzy -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Atsiunčiama $1, prašome palaukti..." +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Leisti sužeidimus" -#~ msgid "Back" -#~ msgstr "Atgal" +#~ msgid "Enter " +#~ msgstr "Įvesti " + +#~ msgid "Game" +#~ msgstr "Žaidimas" + +#, fuzzy +#~ msgid "In-Game" +#~ msgstr "Žaidimas" + +#, fuzzy +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Įdiegti papildinį: failas: „$1“" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Klavišai. (Jei šis meniu sugenda, pašalinkite įrašus iš minetest.conf)" + +#~ msgid "Main" +#~ msgstr "Pagrindinis" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Pagrindinis meniu" + +#, fuzzy +#~ msgid "Menus" +#~ msgstr "Meniu" + +#~ msgid "Name / Password" +#~ msgstr "Vardas / Slaptažodis" + +#~ msgid "Name/Password" +#~ msgstr "Vardas/slaptažodis" + +#~ msgid "No" +#~ msgstr "Ne" #~ msgid "Ok" #~ msgstr "Gerai" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Paralaksinė okliuzija" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Paralaksinė okliuzija" + +#~ msgid "PvP enabled" +#~ msgstr "PvP įjungtas" + +#, fuzzy +#~ msgid "Reset singleplayer world" +#~ msgstr "Atstatyti vieno žaidėjo pasaulį" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Pasirinkite papildinio failą:" + +#, fuzzy +#~ msgid "Server / Singleplayer" +#~ msgstr "Žaisti vienam" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "Nustatyti klavišus" + +#~ msgid "Start Singleplayer" +#~ msgstr "Atstatyti vieno žaidėjo pasaulį" + +#~ msgid "Toggle Cinematic" +#~ msgstr "Įjungti kinematografinį" + +#~ msgid "Yes" +#~ msgstr "Taip" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Jūs numirėte" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/lv/minetest.po b/po/lv/minetest.po index 5e63284a3..b5aabb6d2 100644 --- a/po/lv/minetest.po +++ b/po/lv/minetest.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-04 16:41+0000\n" -"Last-Translator: Uko Koknevics <TheZeus121@gmail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-07-14 11:16+0000\n" +"Last-Translator: Cow Boy <cowboylv@tutanota.com>\n" "Language-Team: Latvian <https://hosted.weblate.org/projects/minetest/" "minetest/lv/>\n" "Language: lv\n" @@ -18,7 +18,47 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= " "19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 4.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Iziet uz izvēlni" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "Lokālā komanda" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "Viena spēlētāja režīms" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "Viena spēlētāja režīms" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -28,13 +68,44 @@ msgstr "Atdzīvoties" msgid "You died" msgstr "Jūs nomirāt" +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "Lokālā komanda" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "Lokālā komanda" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" -msgstr "Radās kļūme Lua skriptā:" +msgstr "Lua skriptā radās kļūme:" #: builtin/fstk/ui.lua msgid "An error occurred:" @@ -52,9 +123,30 @@ msgstr "Atjaunot savienojumu" msgid "The server has requested a reconnect:" msgstr "Serveris ir pieprasījis savienojuma atjaunošanu:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Ielāde..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Izvēlieties pasauli:" + +#: 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. " @@ -69,10 +161,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Serveris atbalsta protokola versijas starp $1 un $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Pamēģiniet atkārtoti ieslēgt publisko serveru sarakstu un pārbaudiet " -"interneta savienojumu." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -82,17 +172,26 @@ msgstr "Mēs atbalstam tikai protokola versiju $1." msgid "We support protocol versions between version $1 and $2." msgstr "Mēs atbalstam protokola versijas starp $1 un $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Atcelt" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Atkarības:" @@ -165,14 +264,55 @@ msgstr "Pasaule:" msgid "enabled" msgstr "iespējots" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Ielāde..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Visi papildinājumi" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Already installed" +msgstr "Šis taustiņš jau tiek izmantots" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Atpakaļ uz Galveno Izvēlni" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "Spēlēt (kā serveris)" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -187,7 +327,6 @@ msgid "Failed to download $1" msgstr "Neizdevās lejuplādēt $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Spēles" @@ -196,7 +335,21 @@ msgid "Install" msgstr "Instalēt" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "Instalēt" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "Neobligātās atkarības:" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "Instalācija: Neatbalstīts faila tips “$1” vai arī sabojāts arhīvs" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Modi" @@ -206,12 +359,28 @@ msgstr "Nevarēja iegūt papildinājumus" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" -msgstr "Nav resultātu" +msgstr "Nav rezultātu" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Meklēt" +#, fuzzy +msgid "No updates" +msgstr "Atjaunot" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -222,16 +391,21 @@ msgid "Uninstall" msgstr "Atinstalēt" #: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy msgid "Update" -msgstr "Atjaunot" +msgstr "Atjaunināt" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "Pasaule ar nosaukumu “$1” jau eksistē" +msgstr "Pasaule ar nosaukumu “$1” jau pastāv" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" @@ -267,17 +441,14 @@ msgid "Create" msgstr "Izveidot" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Informācija:" +msgstr "Dekorācijas" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Lejuplādējiet spēles, kā piemēram, “Minetest Game”, no minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Varat tās lejuplādēt no minetest.net" +#, fuzzy +msgid "Development Test is meant for developers." +msgstr "" +"Uzmanību: “Minimal development test” ir domāts priekš spēles izstrādātājiem." #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -295,10 +466,6 @@ msgstr "" msgid "Floatlands (experimental)" msgstr "" -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Spēle" - #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" msgstr "" @@ -315,6 +482,15 @@ msgstr "" msgid "Increases humidity around rivers" msgstr "" +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Instalēt" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "" + #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" msgstr "" @@ -414,12 +590,6 @@ msgstr "" 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 "" -"Uzmanību: “Minimal development test” ir domāts priekš spēles izstrādātājiem." - #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "Pasaules nosaukums" @@ -450,6 +620,38 @@ msgstr "pkgmgr: nepieejama atrašanās vieta “$1”" msgid "Delete World \"$1\"?" msgstr "Vai izdzēst pasauli “$1”?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Apstiprināt paroli" + +#: 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 "Vārds" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Parole" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "Paroles nesakrīt!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Reģistrēties un pievienoties" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Piekrist" @@ -483,6 +685,16 @@ msgid "Browse" msgstr "Pārlūkot" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Saturs" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Saturs" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Atspējots" @@ -507,7 +719,8 @@ msgid "Offset" msgstr "Nobīde" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Noturība" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -526,6 +739,10 @@ msgstr "Atiestatīt uz noklusējumu" msgid "Scale" msgstr "Mērogs" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Meklēšana" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Izvēlēties mapi" @@ -534,7 +751,7 @@ msgstr "Izvēlēties mapi" msgid "Select file" msgstr "Izvēlēties failu" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Rādīt tehniskos nosaukumus" @@ -615,14 +832,6 @@ msgstr "" "Moda instalācija: Neizdevās atrast derīgu mapes nosaukumu priekš modu " "komplekta “$1”" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Instalācija: Neatbalstīts faila tips “$1” vai arī sabojāts arhīvs" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Instalācija: fails: “$1”" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Neizdevās atrast derīgu modu vai modu komplektu" @@ -643,6 +852,60 @@ msgstr "Neizdevās instalēt modu kā $1" msgid "Unable to install a modpack as a $1" msgstr "Neizdevās instalēt modu komplektu kā $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Ielāde..." + +#: builtin/mainmenu/serverlistmgr.lua +#, fuzzy +msgid "Public server list is disabled" +msgstr "Klienta puses skriptēšana ir atspējota" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Pamēģiniet atkārtoti ieslēgt publisko serveru sarakstu un pārbaudiet " +"interneta savienojumu." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktīvie dalībnieki" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Pamata izstrādātāji" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Izvēlēties mapi" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Bijušie dalībnieki" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Bijušie pamata izstrādātāji" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Pārlūkot tiešsaistes saturu" @@ -683,26 +946,6 @@ msgstr "Atinstalēt papildinājumu" msgid "Use Texture Pack" msgstr "Iespējot tekstūru komplektu" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktīvie dalībnieki" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Pamata izstrādātāji" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Pateicības" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Bijušie dalībnieki" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Bijušie pamata izstrādātāji" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Paziņot par serveri" @@ -712,14 +955,10 @@ msgid "Bind Address" msgstr "Piesaistes adrese" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Iestatīt" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Radošais režīms" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Iespējot bojājumus" @@ -735,10 +974,6 @@ msgstr "Palaist serveri" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Vārds/Parole" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Jauns" @@ -751,10 +986,15 @@ msgstr "Pasaule nav ne izveidota, ne izvēlēta!" msgid "Play Game" msgstr "Spēlēt" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Ports" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Izvēlieties pasauli:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Izvēlieties pasauli:" @@ -768,45 +1008,67 @@ msgid "Start Game" msgstr "Sākt spēli" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adrese / Ports" +#, fuzzy +msgid "Address" +msgstr "- Adrese: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Pieslēgties" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Notīrīt" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Radošais režīms" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Bojājumi iespējoti" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "- Bojājumi: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Izdzēst no izlases" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Pievienot izlasei" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Pievienoties spēlei" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Vārds / Parole" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Pings" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP iespējots" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Paziņot par serveri" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Izdzēst no izlases" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Server Description" +msgstr "Servera ports" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -832,11 +1094,6 @@ msgstr "Visi iestatījumi" msgid "Antialiasing:" msgstr "Gludināšana:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" -"Vai esat pārliecināts, ka vēlaties atiestatīt savu viena spēlētāja pasauli?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Atcerēties ekrāna izmēru" @@ -845,10 +1102,6 @@ msgstr "Atcerēties ekrāna izmēru" msgid "Bilinear Filter" msgstr "Bilineārais filtrs" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "“Bump Mapping”" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Nomainīt kontroles" @@ -857,13 +1110,29 @@ msgstr "Nomainīt kontroles" msgid "Connected Glass" msgstr "Savienots stikls" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Skaistas lapas" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Izveidot normāl-kartes" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -873,10 +1142,6 @@ msgstr "“Mipmap”" msgid "Mipmap + Aniso. Filter" msgstr "“Mipmap” + anizotr. filtrs" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nē" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Bez filtra" @@ -905,30 +1170,27 @@ msgstr "Necaurredzamas lapas" msgid "Opaque Water" msgstr "Necaurredzams ūdens" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Tekstūru dziļums" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Daļiņas" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Atiestatīt viena spēlētāja pasauli" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Ekrāns:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "Iestatījumi" +msgstr "Uzstādījumi" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" msgstr "Šeideri" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "Šeideri (nepieejami)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Šeideri (nepieejami)" @@ -945,22 +1207,27 @@ msgstr "Gluds apgaismojums" msgid "Texturing:" msgstr "Teksturēšana:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Lai iespējotu šeiderus, jāizmanto OpenGL draiveris." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Toņu atbilstība" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "Pieskārienslieksnis: (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Trilineārais filtrs" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Viļņojošas lapas" @@ -973,23 +1240,12 @@ msgstr "Viļņojoši šķidrumi" msgid "Waving Plants" msgstr "Viļņojoši augi" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Jā" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Iestatīt modus" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Galvenā izvēlne" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Sākt viena spēlētāja spēli" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Savienojuma kļūme (noildze?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Savienojuma noildze." @@ -1018,7 +1274,8 @@ msgid "Connection error (timed out?)" msgstr "Savienojuma kļūme (noildze?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Nevarēja atrast vai ielādēt spēli \"" #: src/client/clientlauncher.cpp @@ -1049,18 +1306,6 @@ msgstr "Neizdevās atvērt iestatīto paroļu failu: " msgid "Provided world path doesn't exist: " msgstr "Sniegtā pasaules atrašanās vieta neeksistē: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1073,14 +1318,6 @@ msgstr "" msgid "- Address: " msgstr "- Adrese: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Radošais režīms: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Bojājumi: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Režīms: " @@ -1102,6 +1339,16 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "- Severa nosaukums: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Radās kļūme:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Automātiskā pārvietošanās izslēgta" @@ -1110,6 +1357,22 @@ msgstr "Automātiskā pārvietošanās izslēgta" msgid "Automatic forward enabled" msgstr "Automātiskā pārvietošanās ieslēgta" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Kameras atjaunošana atspējota" @@ -1118,6 +1381,10 @@ msgstr "Kameras atjaunošana atspējota" msgid "Camera update enabled" msgstr "Kameras atjaunošana iespējota" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Nomainīt paroli" @@ -1130,6 +1397,10 @@ msgstr "Kino režīms izslēgts" msgid "Cinematic mode enabled" msgstr "Kino režīms ieslēgts" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Klienta puses skriptēšana ir atspējota" @@ -1138,25 +1409,29 @@ msgstr "Klienta puses skriptēšana ir atspējota" msgid "Connecting to server..." msgstr "Savienojas ar serveri..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Turpināt" #: src/client/game.cpp -#, c-format +#, fuzzy, c-format msgid "" "Controls:\n" "- %s: move forwards\n" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1175,6 +1450,11 @@ msgstr "" "- Peles rullītis: izvēlēties priekšmetu\n" "- %s: čats\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Izveido klientu..." @@ -1232,6 +1512,11 @@ msgstr "Atspējots neierobežots redzamības diapazons" msgid "Enabled unlimited viewing range" msgstr "Iespējots neierobežots redzamības diapazons" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Izveido klientu..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Iziet uz izvēlni" @@ -1305,32 +1590,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "Minikarte šobrīd atspējota vai nu spēlei, vai modam" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Minikarte paslēpta" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Minikarte radara režīmā, palielinājums x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Minikarte radara režīmā, palielinājums x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Minikarte radara režīmā, palielinājums x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minikarte virsmas režīmā, palielinājums x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minikarte virsmas režīmā, palielinājums x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minikarte virsmas režīmā, palielinājums x4" +#, fuzzy +msgid "Multiplayer" +msgstr "Viena spēlētāja režīms" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1404,6 +1666,21 @@ msgstr "" msgid "Sound unmuted" msgstr "Skaņa ieslēgta" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1473,10 +1750,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Notīrīt" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1499,7 +1772,7 @@ msgstr "Execute" #: src/client/keycode.cpp msgid "Help" -msgstr "Help" +msgstr "Palīdzība" #: src/client/keycode.cpp msgid "Home" @@ -1724,36 +1997,41 @@ msgstr "X Poga 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Paroles nesakrīt!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minikarte paslēpta" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Reģistrēties un pievienoties" +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minikarte radara režīmā, palielinājums x1" -#: 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." +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minikarte virsmas režīmā, palielinājums x1" + +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap in texture mode" +msgstr "Minikarte virsmas režīmā, palielinājums x1" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Neizdevās lejuplādēt $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" -"Jūs tūlīt pievienosieties šim serverim ar vārdu \"%s\" pirmo reizi.\n" -"Ja Jūs turpināsiet, šajā serverī tiks izveidots jauns lietotājs ar jūsu " -"pierakstīšanās informāciju.\n" -"Lūdzu ievadiet savu paroli vēlreiz un nospiediet “Reģistrēties un " -"pievienoties”, lai apstiprinātu lietotāja izveidi, vai arī nospiediet " -"“Atcelt”, lai pārtrauktu šo darbību." #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Turpināt" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +#, fuzzy +msgid "\"Aux1\" = climb down" msgstr "“Speciālais” = kāpt lejā" #: src/gui/guiKeyChangeMenu.cpp @@ -1764,15 +2042,23 @@ msgstr "Auto-iešana" msgid "Automatic jumping" msgstr "Automātiskā lekšana" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Atmuguriski" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Mainīt kameru" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Čats" @@ -1825,10 +2111,8 @@ msgid "Key already in use" msgstr "Šis taustiņš jau tiek izmantots" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" -"Taustiņu iestatījumi. (Ja šī izvēlne salūzt, izdzēsiet iestatījumus no " -"minetest.conf)" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1858,10 +2142,6 @@ msgstr "Ekrānšāviņš" msgid "Sneak" msgstr "Lavīties" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Speciālais" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Spēles saskarne" @@ -1902,10 +2182,6 @@ msgstr "nospiediet pogu" msgid "Change" msgstr "Nomainīt" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Apstiprināt paroli" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Jaunā parole" @@ -1914,6 +2190,10 @@ msgstr "Jaunā parole" msgid "Old Password" msgstr "Vecā parole" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Paroles nesakrīt!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Iziet" @@ -1923,15 +2203,10 @@ msgid "Muted" msgstr "Apklusināts" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +msgid "Sound Volume: %d%%" msgstr "Skaņas skaļums: " -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Ievadiet " - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -1939,6 +2214,16 @@ msgstr "Ievadiet " msgid "LANG_CODE" msgstr "lv" +#: 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 "Lūdzu, izvēlieties vārdu!" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1947,8 +2232,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1975,12 +2260,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2069,6 +2348,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2087,6 +2370,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2132,6 +2419,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2142,6 +2433,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Pasaules nosaukums" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2156,7 +2452,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2224,6 +2520,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2244,6 +2544,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2256,10 +2564,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2281,7 +2585,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 @@ -2289,11 +2593,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2321,8 +2625,9 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "Mainīt kameru" #: src/settings_translation_file.cpp msgid "" @@ -2395,15 +2700,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Komanda" + #: src/settings_translation_file.cpp msgid "Chat font size" msgstr "" @@ -2437,8 +2741,9 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" +#, fuzzy +msgid "Chat weblinks" +msgstr "Čats parādīts" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2456,6 +2761,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2476,6 +2787,10 @@ msgstr "" 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 "" @@ -2500,6 +2815,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2527,6 +2846,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2551,10 +2886,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2581,7 +2924,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 @@ -2612,7 +2957,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2620,7 +2967,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2644,11 +2993,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 @@ -2687,8 +3036,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2719,12 +3069,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2795,6 +3139,15 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Dekorācijas" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "" @@ -2807,6 +3160,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2851,18 +3214,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2879,22 +3259,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2943,14 +3317,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2959,18 +3325,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2979,6 +3333,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2987,12 +3351,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3004,7 +3362,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3023,18 +3385,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3052,10 +3402,13 @@ msgid "Fast movement" msgstr "Ātrā pārvietošanās" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" +"Spēlētājs var lidot ignorējot gravitāciju.\n" +"Šim ir vajadzīga “fly” privilēģija servera pusē." #: src/settings_translation_file.cpp msgid "Field of view" @@ -3087,14 +3440,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "" +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "Gludināšana:" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3160,6 +3514,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3181,15 +3539,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3198,6 +3556,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3257,10 +3626,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3285,10 +3650,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3306,7 +3667,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Spēles" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3317,7 +3687,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3336,6 +3706,14 @@ msgstr "" 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 "" @@ -3353,9 +3731,14 @@ 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 "Spēles saskarne parādīta" + #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -3363,8 +3746,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3386,7 +3769,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3397,10 +3781,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3596,10 +3976,17 @@ 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 "" @@ -3632,8 +4019,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3655,11 +4041,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3685,7 +4077,9 @@ msgstr "" "spēlētāja skatīšanās virziena." #: 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 @@ -3704,6 +4098,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3720,10 +4120,6 @@ msgstr "" 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 "" @@ -3751,7 +4147,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3774,16 +4170,12 @@ msgstr "" 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 @@ -3834,6 +4226,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3913,6 +4309,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4012,6 +4415,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4385,6 +4795,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4441,7 +4855,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 @@ -4451,15 +4865,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 @@ -4471,7 +4888,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4498,6 +4916,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Gluds apgaismojums" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4569,21 +4992,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4645,6 +5068,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4750,7 +5177,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4798,6 +5229,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4852,17 +5290,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4911,12 +5353,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4927,6 +5381,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4993,16 +5451,16 @@ msgstr "" 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 "" @@ -5015,6 +5473,11 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Bloku izcelšana" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5027,14 +5490,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5056,18 +5511,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5077,11 +5524,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5090,38 +5532,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5144,17 +5560,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5182,6 +5594,14 @@ msgstr "" msgid "Pitch move mode" msgstr "Kustība uz augšu/leju pēc skatīšanās virziena" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5190,10 +5610,6 @@ msgstr "" "Spēlētājs var lidot ignorējot gravitāciju.\n" "Šim ir vajadzīga “fly” privilēģija servera pusē." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5202,6 +5618,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5236,10 +5656,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5247,9 +5663,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5339,10 +5755,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5412,6 +5824,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Ekrāns:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5439,6 +5856,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Ekrānšāviņš" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5451,10 +5873,6 @@ msgstr "" 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 "" @@ -5495,8 +5913,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" +#, fuzzy +msgid "Server" +msgstr "Palaist serveri" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "- Severa nosaukums: " + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Servera ports" #: src/settings_translation_file.cpp msgid "Server URL" @@ -5522,10 +5951,19 @@ msgstr "" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Servera ports" + #: 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 "" @@ -5537,7 +5975,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5558,6 +6024,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5570,6 +6043,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5577,9 +6066,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5594,6 +6081,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5615,6 +6112,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5669,18 +6170,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5696,6 +6193,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5723,10 +6228,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5764,6 +6265,11 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Uzstādījumi" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -5806,6 +6312,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5820,6 +6333,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5875,18 +6392,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5904,6 +6421,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5912,9 +6435,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5951,7 +6473,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 @@ -5974,6 +6496,18 @@ msgstr "" 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 "" @@ -6044,15 +6578,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6146,7 +6695,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6216,6 +6765,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6237,18 +6790,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6283,13 +6834,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6373,23 +6933,151 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- Radošais režīms: " + +#~ msgid "- Damage: " +#~ msgstr "- Bojājumi: " + +#~ msgid "Address / Port" +#~ msgstr "Adrese / Ports" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "" +#~ "Vai esat pārliecināts, ka vēlaties atiestatīt savu viena spēlētāja " +#~ "pasauli?" #~ msgid "Back" #~ msgstr "Atpakaļ" +#~ msgid "Bump Mapping" +#~ msgstr "“Bump Mapping”" + +#~ msgid "Config mods" +#~ msgstr "Iestatīt modus" + +#~ msgid "Configure" +#~ msgstr "Iestatīt" + +#~ msgid "Connect" +#~ msgstr "Pieslēgties" + +#~ msgid "Credits" +#~ msgstr "Pateicības" + +#~ msgid "Damage enabled" +#~ msgstr "Bojājumi iespējoti" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Lejuplādējiet spēles, kā piemēram, “Minetest Game”, no minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Varat tās lejuplādēt no minetest.net" + #~ msgid "Downloading and installing $1, please wait..." #~ msgstr "Lejuplādējas un instalējas $1, lūdzu uzgaidiet..." +#~ msgid "Enter " +#~ msgstr "Ievadiet " + +#~ msgid "Game" +#~ msgstr "Spēle" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Izveidot normāl-kartes" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Instalācija: fails: “$1”" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Taustiņu iestatījumi. (Ja šī izvēlne salūzt, izdzēsiet iestatījumus no " +#~ "minetest.conf)" + +#~ msgid "Main" +#~ msgstr "Galvenā izvēlne" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Minikarte radara režīmā, palielinājums x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minikarte radara režīmā, palielinājums x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minikarte virsmas režīmā, palielinājums x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minikarte virsmas režīmā, palielinājums x4" + +#~ msgid "Name / Password" +#~ msgstr "Vārds / Parole" + +#~ msgid "Name/Password" +#~ msgstr "Vārds/Parole" + +#~ msgid "No" +#~ msgstr "Nē" + #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Tekstūru dziļums" + +#~ msgid "PvP enabled" +#~ msgstr "PvP iespējots" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Atiestatīt viena spēlētāja pasauli" + +#~ msgid "Special" +#~ msgstr "Speciālais" + +#~ msgid "Start Singleplayer" +#~ msgstr "Sākt viena spēlētāja spēli" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Lai iespējotu šeiderus, jāizmanto OpenGL draiveris." + +#~ msgid "Yes" +#~ msgstr "Jā" + +#, 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 "" +#~ "Jūs tūlīt pievienosieties šim serverim ar vārdu \"%s\" pirmo reizi.\n" +#~ "Ja Jūs turpināsiet, šajā serverī tiks izveidots jauns lietotājs ar jūsu " +#~ "pierakstīšanās informāciju.\n" +#~ "Lūdzu ievadiet savu paroli vēlreiz un nospiediet “Reģistrēties un " +#~ "pievienoties”, lai apstiprinātu lietotāja izveidi, vai arī nospiediet " +#~ "“Atcelt”, lai pārtrauktu šo darbību." + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Jūs nomirāt" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/lo/minetest.po b/po/lzh/minetest.po similarity index 86% rename from po/lo/minetest.po rename to po/lzh/minetest.po index 731a7957d..eae0e2009 100644 --- a/po/lo/minetest.po +++ b/po/lzh/minetest.po @@ -1,31 +1,101 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# msgid "" msgstr "" -"Project-Id-Version: Lao (Minetest)\n" +"Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-01-11 18:26+0000\n" -"Last-Translator: rubenwardy <rubenwardy@gmail.com>\n" -"Language-Team: Lao <https://hosted.weblate.org/projects/minetest/minetest/lo/" -">\n" -"Language: lo\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-01-20 14:35+0000\n" +"Last-Translator: Gao Tiesuan <yepifoas@666email.com>\n" +"Language-Team: Chinese (Literary) <https://hosted.weblate.org/projects/" +"minetest/minetest/lzh/>\n" +"Language: lzh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.10.1\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.11-dev\n" -#: builtin/client/death_formspec.lua src/client/game.cpp -msgid "Respawn" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "空令。" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "令之传者: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." msgstr "" +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "复生" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" +msgstr "尔死矣" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" msgstr "" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "" @@ -46,8 +116,28 @@ msgstr "" msgid "The server has requested a reconnect:" msgstr "" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." +#: 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 @@ -63,7 +153,7 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" #: builtin/mainmenu/common.lua @@ -74,17 +164,26 @@ msgstr "" msgid "We support protocol versions between version $1 and $2." msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "" @@ -155,14 +254,52 @@ msgstr "" msgid "enabled" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -176,7 +313,6 @@ msgid "Failed to download $1" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "" @@ -185,7 +321,18 @@ msgid "Install" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "" @@ -198,8 +345,23 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua @@ -215,7 +377,11 @@ msgid "Update" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -259,11 +425,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 @@ -272,7 +434,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "平地" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" @@ -282,10 +444,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 "" @@ -302,6 +460,14 @@ msgstr "" msgid "Increases humidity around rivers" msgstr "" +#: builtin/mainmenu/dlg_create_world.lua +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 "" @@ -328,7 +494,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "泥流" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" @@ -348,7 +514,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Rivers" -msgstr "" +msgstr "川" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" @@ -387,7 +553,7 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "地表之蚀" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" @@ -401,10 +567,6 @@ msgstr "" 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 "" @@ -435,6 +597,36 @@ 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 +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 msgid "Accept" msgstr "" @@ -466,6 +658,14 @@ 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 "" @@ -490,7 +690,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -509,6 +709,10 @@ msgstr "" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "" @@ -517,7 +721,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 "" @@ -596,14 +800,6 @@ msgstr "" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" @@ -624,6 +820,56 @@ msgstr "" msgid "Unable to install a modpack as a $1" msgstr "" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "" @@ -664,26 +910,6 @@ msgstr "" msgid "Use Texture Pack" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "" @@ -693,14 +919,10 @@ msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "" @@ -716,10 +938,6 @@ msgstr "" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "" @@ -732,10 +950,14 @@ msgstr "" msgid "Play Game" msgstr "" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "" @@ -749,44 +971,60 @@ msgid "Start Game" msgstr "" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" +msgid "Address" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" msgstr "" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_online.lua +msgid "Login" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +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 @@ -813,10 +1051,6 @@ msgstr "" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -825,10 +1059,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "" @@ -837,12 +1067,28 @@ msgstr "" msgid "Connected Glass" msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -853,10 +1099,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" @@ -885,18 +1127,10 @@ msgstr "" msgid "Opaque Water" msgstr "" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "" @@ -909,6 +1143,10 @@ msgstr "" msgid "Shaders" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -925,22 +1163,26 @@ msgstr "" msgid "Texturing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" - #: 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 "" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "" @@ -953,23 +1195,11 @@ msgstr "" msgid "Waving Plants" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "" @@ -998,7 +1228,7 @@ msgid "Connection error (timed out?)" msgstr "" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +msgid "Could not find or load game: " msgstr "" #: src/client/clientlauncher.cpp @@ -1029,18 +1259,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1051,14 +1269,6 @@ msgstr "" msgid "- Address: " msgstr "" -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1080,6 +1290,15 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "" @@ -1088,6 +1307,22 @@ msgstr "" msgid "Automatic forward enabled" msgstr "" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1096,6 +1331,10 @@ msgstr "" msgid "Camera update enabled" msgstr "" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "" @@ -1108,6 +1347,10 @@ msgstr "" msgid "Cinematic mode enabled" msgstr "" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1116,6 +1359,10 @@ msgstr "" msgid "Connecting to server..." msgstr "" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "" @@ -1128,17 +1375,22 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "" @@ -1183,6 +1435,11 @@ msgstr "" 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 "" @@ -1256,31 +1513,7 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" +msgid "Multiplayer" msgstr "" #: src/client/game.cpp @@ -1341,7 +1574,7 @@ msgstr "" #: src/client/game.cpp msgid "Sound muted" -msgstr "" +msgstr "消音" #: src/client/game.cpp msgid "Sound system is disabled" @@ -1355,6 +1588,21 @@ msgstr "" msgid "Sound unmuted" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1424,10 +1672,6 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "" @@ -1675,22 +1919,30 @@ msgstr "" msgid "Zoom" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1698,7 +1950,7 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1709,15 +1961,23 @@ msgstr "" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "" @@ -1770,7 +2030,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 @@ -1801,10 +2061,6 @@ msgstr "" msgid "Sneak" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1845,10 +2101,6 @@ msgstr "" msgid "Change" msgstr "" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "" @@ -1857,6 +2109,10 @@ msgstr "" msgid "Old Password" msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "" @@ -1866,13 +2122,8 @@ msgid "Muted" msgstr "" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " +#, c-format +msgid "Sound Volume: %d%%" msgstr "" #. ~ DO NOT TRANSLATE THIS LITERALLY! @@ -1880,7 +2131,16 @@ msgstr "" #. language code (e.g. "de" for German). #: src/network/clientpackethandler.cpp src/script/lua_api/l_client.cpp msgid "LANG_CODE" -msgstr "lo" +msgstr "" + +#: 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 "" @@ -1890,8 +2150,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1918,12 +2178,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2012,6 +2266,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2030,6 +2288,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2075,6 +2337,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2085,6 +2351,10 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2099,7 +2369,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2167,6 +2437,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2187,6 +2461,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2199,10 +2481,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2224,7 +2502,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 @@ -2232,11 +2510,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2264,7 +2542,7 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" +msgid "Camera" msgstr "" #: src/settings_translation_file.cpp @@ -2338,13 +2616,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" msgstr "" #: src/settings_translation_file.cpp @@ -2380,7 +2656,7 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp @@ -2399,6 +2675,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2419,6 +2701,10 @@ msgstr "" 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 "" @@ -2443,6 +2729,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2470,6 +2760,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2494,10 +2800,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2524,7 +2838,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 @@ -2555,7 +2871,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2563,7 +2881,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2587,11 +2907,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 @@ -2630,8 +2950,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2662,12 +2983,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2738,6 +3053,14 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "" @@ -2750,6 +3073,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2794,18 +3127,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2822,22 +3172,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2886,14 +3230,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2902,18 +3238,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2922,6 +3246,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2930,12 +3264,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2947,7 +3275,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2966,18 +3298,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -2996,7 +3316,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3030,13 +3350,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3103,6 +3423,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3124,15 +3448,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3141,6 +3465,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3200,10 +3535,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3228,10 +3559,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3249,7 +3576,15 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gamepads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3260,7 +3595,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3279,6 +3614,14 @@ msgstr "" 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 "" @@ -3296,7 +3639,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 @@ -3306,8 +3653,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3329,7 +3676,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3340,10 +3688,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3539,10 +3883,17 @@ 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 "" @@ -3575,8 +3926,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3598,11 +3948,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3626,7 +3982,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 @@ -3643,6 +4001,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3659,10 +4023,6 @@ msgstr "" 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 "" @@ -3690,7 +4050,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3713,16 +4073,12 @@ msgstr "" 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 @@ -3773,6 +4129,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3852,6 +4212,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3951,6 +4318,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4324,6 +4698,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4380,7 +4758,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 @@ -4390,15 +4768,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 @@ -4410,7 +4791,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4437,6 +4819,10 @@ msgstr "" 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" @@ -4508,21 +4894,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4584,6 +4970,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4689,7 +5079,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4737,6 +5131,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4791,17 +5192,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4850,12 +5255,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4866,6 +5283,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4932,16 +5353,16 @@ msgstr "" 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 "" @@ -4954,6 +5375,10 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -4966,14 +5391,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -4995,18 +5412,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5016,11 +5425,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5029,38 +5433,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5083,17 +5461,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5122,13 +5496,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5139,6 +5517,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5173,10 +5555,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5184,9 +5562,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5276,10 +5654,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5349,6 +5723,10 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5376,6 +5754,10 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5388,10 +5770,6 @@ msgstr "" 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 "" @@ -5432,7 +5810,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" +msgid "Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Security" msgstr "" #: src/settings_translation_file.cpp @@ -5459,10 +5845,18 @@ msgstr "" 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 "" @@ -5474,7 +5868,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5495,6 +5917,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5507,6 +5936,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5514,9 +5959,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5531,6 +5974,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5552,6 +6005,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5606,18 +6063,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5633,6 +6086,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5660,10 +6121,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5701,6 +6158,10 @@ msgstr "" 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 "" @@ -5743,6 +6204,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5757,6 +6225,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5812,18 +6284,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5841,6 +6313,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5849,9 +6327,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5888,7 +6365,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 @@ -5911,6 +6388,18 @@ msgstr "" 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 "" @@ -5981,15 +6470,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6083,7 +6587,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6153,6 +6657,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6174,18 +6682,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6220,13 +6726,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6310,14 +6825,18 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" diff --git a/po/minetest.pot b/po/minetest.pot index 3f343389a..084a5ff30 100644 --- a/po/minetest.pot +++ b/po/minetest.pot @@ -8,15 +8,51 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\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: LANGUAGE <LL@li.org>\n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" msgstr "" @@ -25,10 +61,39 @@ msgstr "" msgid "Respawn" msgstr "" +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" msgstr "" @@ -49,14 +114,6 @@ msgstr "" msgid "An error occurred:" msgstr "" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "" - -#: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "" - #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " msgstr "" @@ -77,6 +134,34 @@ msgstr "" msgid "Protocol version mismatch. " msgstr "" +#: builtin/mainmenu/common.lua +msgid "Client Mods" +msgstr "" + +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +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 "Visit website" +msgstr "" + +#: builtin/mainmenu/common.lua +msgid "Later" +msgstr "" + +#: builtin/mainmenu/common.lua +msgid "Never" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua msgid "World:" msgstr "" @@ -89,6 +174,14 @@ msgstr "" msgid "No game description provided." msgstr "" +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Unsatisfied)" +msgstr "" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Enabled, has error)" +msgstr "" + #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "" @@ -105,7 +198,8 @@ msgstr "" msgid "Optional dependencies:" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "" @@ -118,13 +212,13 @@ msgstr "" msgid "Save" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "" @@ -167,12 +261,10 @@ msgid "All packages" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Mods" msgstr "" @@ -185,14 +277,83 @@ msgid "Failed to download $1" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" msgstr "" @@ -206,7 +367,7 @@ msgid "Downloading..." msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "Install" +msgid "Queued" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua @@ -218,7 +379,7 @@ msgid "Uninstall" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -230,11 +391,11 @@ msgid "Very large caverns deep in the underground" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Sea level rivers" +msgid "Rivers" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Rivers" +msgid "Sea level rivers" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -330,7 +491,7 @@ msgid "You have no games installed." msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" +msgid "Install a game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -379,14 +540,6 @@ msgstr "" msgid "Mapgen-specific flags" msgstr "" -#: builtin/mainmenu/dlg_create_world.lua -msgid "Warning: The Development Test is meant for developers." -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 "World name" msgstr "" @@ -400,8 +553,12 @@ msgstr "" msgid "Mapgen" msgstr "" -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" +#: builtin/mainmenu/dlg_create_world.lua +msgid "Development Test is meant for developers." +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -409,11 +566,11 @@ msgid "Create" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "A world named \"$1\" already exists" +msgid "No game selected" msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "No game selected" +msgid "A world named \"$1\" already exists" msgstr "" #: builtin/mainmenu/dlg_delete_content.lua @@ -438,6 +595,36 @@ msgstr "" msgid "Delete World \"$1\"?" msgstr "" +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +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 src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua +msgid "Missing name" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua +msgid "Passwords do not match" +msgstr "" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "" @@ -453,6 +640,14 @@ msgid "Rename Modpack:" 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 "" @@ -493,7 +688,7 @@ msgid "Octaves" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -563,6 +758,10 @@ msgstr "" msgid "Select file" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" msgstr "" @@ -575,7 +774,7 @@ msgstr "" msgid "Restore Default" msgstr "" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "" @@ -615,18 +814,60 @@ msgstr "" msgid "Unable to install a game as a $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "$1 mods" msgstr "" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "" + #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" msgstr "" @@ -667,32 +908,24 @@ msgstr "" msgid "Content" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" +msgid "Creative Mode" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Enable Damage" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" msgstr "" #: builtin/mainmenu/tab_local.lua @@ -703,18 +936,6 @@ msgstr "" msgid "Select World:" msgstr "" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Creative Mode" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Enable Damage" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Server" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Host Game" msgstr "" @@ -723,15 +944,11 @@ msgstr "" msgid "Announce Server" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Bind Address" msgstr "" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "" @@ -751,41 +968,53 @@ msgstr "" msgid "Start Game" msgstr "" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "" + #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" +msgid "Refresh" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_online.lua +msgid "Address" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Login" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Remove favorite" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" msgstr "" #: builtin/mainmenu/tab_online.lua @@ -853,15 +1082,23 @@ msgid "8x" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" +msgid "Very Low" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Yes" +msgid "Low" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "No" +msgid "Medium" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -892,24 +1129,16 @@ msgstr "" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Screen:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Autosave Screen Size" -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Shaders (unavailable)" +msgid "Shaders (experimental)" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" +msgid "Shaders (unavailable)" msgstr "" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp @@ -921,25 +1150,21 @@ msgid "All Settings" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +msgid "Touch threshold (px):" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave Screen Size" msgstr "" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Waving Liquids" msgstr "" @@ -953,27 +1178,27 @@ msgid "Waving Plants" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." +msgid "Dynamic shadows:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" +#: src/client/client.cpp src/client/game.cpp +msgid "Connection timed out." msgstr "" #: src/client/client.cpp -msgid "Connection timed out." +msgid "Connection aborted (protocol error?)." msgstr "" #: src/client/client.cpp @@ -1000,10 +1225,6 @@ msgstr "" msgid "Main Menu" msgstr "" -#: src/client/clientlauncher.cpp -msgid "Player name too long." -msgstr "" - #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" msgstr "" @@ -1016,6 +1237,10 @@ msgstr "" msgid "Please choose a name!" msgstr "" +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "" + #: src/client/clientlauncher.cpp msgid "No world selected and no address provided. Nothing to do." msgstr "" @@ -1025,25 +1250,13 @@ msgid "Provided world path doesn't exist: " msgstr "" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +msgid "Could not find or load game: " msgstr "" #: src/client/clientlauncher.cpp msgid "Invalid gamespec." msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "" - #: src/client/game.cpp msgid "Shutting down..." msgstr "" @@ -1052,18 +1265,59 @@ msgstr "" msgid "Creating server..." msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "" + #: src/client/game.cpp msgid "Resolving address..." msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Error creating client: %s" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Connecting to server..." msgstr "" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Item definitions..." msgstr "" @@ -1165,6 +1419,26 @@ msgstr "" msgid "Cinematic mode disabled" msgstr "" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward enabled" msgstr "" @@ -1173,34 +1447,6 @@ msgstr "" msgid "Automatic forward disabled" msgstr "" -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" msgstr "" @@ -1292,13 +1538,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1351,10 +1597,6 @@ msgstr "" msgid "- Port: " msgstr "" -#: src/client/game.cpp -msgid "Singleplayer" -msgstr "" - #: src/client/game.cpp msgid "On" msgstr "" @@ -1363,14 +1605,6 @@ msgstr "" msgid "Off" msgstr "" -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" - -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " @@ -1384,6 +1618,15 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "" + #: src/client/game.cpp msgid "" "\n" @@ -1443,10 +1686,6 @@ msgstr "" msgid "Tab" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Return" msgstr "" @@ -1678,22 +1917,30 @@ msgstr "" msgid "OEM Clear" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "" + +#: src/client/minimap.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." +msgid "Minimap in surface mode, Zoom x%d" msgstr "" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1701,11 +1948,11 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1733,7 +1980,7 @@ msgid "Backward" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "Special" +msgid "Aux1" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1800,7 +2047,7 @@ msgstr "" msgid "Autoforward" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "" @@ -1832,6 +2079,10 @@ msgstr "" msgid "Local command" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1852,16 +2103,17 @@ msgstr "" msgid "New Password" msgstr "" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" - #: src/gui/guiPasswordChange.cpp msgid "Change" msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, c-format +msgid "Sound Volume: %d%%" msgstr "" #: src/gui/guiVolumeChange.cpp @@ -1872,10 +2124,13 @@ msgstr "" msgid "Muted" msgstr "" -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " +#: 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 "" #. ~ DO NOT TRANSLATE THIS LITERALLY! @@ -1889,6 +2144,10 @@ msgstr "" msgid "Controls" msgstr "" +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" + #: src/settings_translation_file.cpp msgid "Build inside player" msgstr "" @@ -1900,47 +2159,6 @@ msgid "" "This is helpful when working with nodeboxes in small areas." msgstr "" -#: src/settings_translation_file.cpp -msgid "Flying" -msgstr "" - -#: 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 "Pitch move mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, makes move directions relative to the player's pitch when flying " -"or swimming." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast movement" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Fast movement (via the \"special\" key).\n" -"This requires the \"fast\" privilege on the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noclip" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled together with fly mode, player is able to fly through solid " -"nodes.\n" -"This requires the \"noclip\" privilege on the server." -msgstr "" - #: src/settings_translation_file.cpp msgid "Cinematic mode" msgstr "" @@ -1968,29 +2186,13 @@ msgid "Smooths rotation of camera in cinematic mode. 0 to disable." msgstr "" #: src/settings_translation_file.cpp -msgid "Invert mouse" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Invert vertical mouse movement." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity multiplier." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" +msgid "Aux1 key for climbing/descending" msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" @@ -2003,25 +2205,23 @@ msgid "Double-tapping the jump key toggles fly mode." msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" #: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" +msgid "Place repetition interval" msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -2039,21 +2239,27 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Random input" +msgid "Keyboard and Mouse" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable random user input (only used for testing)." +msgid "Invert mouse" msgstr "" #: src/settings_translation_file.cpp -msgid "Continuous forward" +msgid "Invert vertical mouse movement." msgstr "" #: 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." +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Touchscreen" msgstr "" #: src/settings_translation_file.cpp @@ -2075,808 +2281,18 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" #: src/settings_translation_file.cpp -msgid "Enable joysticks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick ID" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The identifier of the joystick to use" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick type" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The type of joystick" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick button repetition interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated events\n" -"when holding down a joystick button combination." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick frustum sensitivity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Forward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player forward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Backward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player backward.\n" -"Will also disable autoforward, when active.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Left key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player left.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Right key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player right.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Jump key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for jumping.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneak key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for sneaking.\n" -"Also used for climbing down and descending in water if aux1_descends is " -"disabled.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Inventory key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the inventory.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving fast in fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Command key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type local commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Range select key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling unlimited view range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fly key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling flying.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Pitch move key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling pitch move mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noclip key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling noclip mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar next key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the next item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar previous key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the previous item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mute key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for muting the game.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Inc. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatic forward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling autoforward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cinematic mode key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling cinematic mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling display of minimap.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for taking screenshots.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Drop item key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for dropping the currently selected item.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View zoom key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key to use view zoom when possible.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 1 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the first hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 2 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the second hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 3 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the third hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 4 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fourth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 5 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fifth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 6 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the sixth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 7 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the seventh hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 8 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the eighth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 9 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the ninth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 10 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the tenth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 11 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 11th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 12 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 12th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 13 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 13th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 14 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 14th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 15 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 15th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 16 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 16th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 17 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 17th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 18 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 18th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 19 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 19th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 20 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 20th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 21 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 21st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 22 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 22nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 23 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 23rd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 24 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 24th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 25 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 25th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 26 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 26th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 27 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 27th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 28 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 28th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 29 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 29th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 30 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 30th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 31 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 31st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 32 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 32nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "HUD toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the HUD.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of chat.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large chat console key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the large chat console.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of fog.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera update toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the camera update. Only used for development\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug info toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of debug info.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the profiler. Used for development.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Toggle camera mode key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for switching between first- and third-person camera.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range increase key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range decrease key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +msgid "Graphics and Audio" msgstr "" #: src/settings_translation_file.cpp @@ -2884,29 +2300,114 @@ msgid "Graphics" msgstr "" #: src/settings_translation_file.cpp -msgid "In-Game" +msgid "Screen" msgstr "" #: src/settings_translation_file.cpp -msgid "Basic" +msgid "Screen width" msgstr "" #: src/settings_translation_file.cpp -msgid "VBO" +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen height" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Enable vertex buffer objects.\n" -"This should greatly improve graphics performance." +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp -msgid "Fog" +msgid "Autosave screen size" msgstr "" #: src/settings_translation_file.cpp -msgid "Whether to fog out the end of the visible area." +msgid "Save window size automatically when modified." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Graphics Effects" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp @@ -2939,6 +2440,253 @@ msgid "" "Disable for speed or for different looks." msgstr "" +#: src/settings_translation_file.cpp +msgid "Tradeoffs for performance" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3d" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- crossview: Cross-eyed 3d\n" +"- pageflip: quadbuffer based 3d.\n" +"Note that the interlaced mode requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Camera" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Near plane" +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" +"Increasing can reduce artifacting on weaker GPUs.\n" +"0.1 = Default, 0.25 = Good value for weaker tablets." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"This only has significant effect on daylight and artificial\n" +"light, it has very little effect on natural night light." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + #: src/settings_translation_file.cpp msgid "Clouds" msgstr "" @@ -2956,23 +2704,7 @@ msgid "Use 3D cloud look instead of flat." msgstr "" #: src/settings_translation_file.cpp -msgid "Node highlighting" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Method used to highlight selected object." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Digging particles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Adds particles when digging a node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -2981,7 +2713,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" @@ -3017,9 +2749,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp @@ -3032,9 +2764,8 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -3045,21 +2776,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Undersampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Undersampling is similar to using a lower screen resolution, but it applies\n" -"to the game world only, keeping the GUI intact.\n" -"It should give a significant performance boost at the cost of less detailed " -"image.\n" -"Higher values result in a less detailed image." +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." msgstr "" #: src/settings_translation_file.cpp @@ -3070,16 +2793,6 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" -#: src/settings_translation_file.cpp -msgid "Shader path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to shader directory. If no path is defined, default location will be " -"used." -msgstr "" - #: src/settings_translation_file.cpp msgid "Filmic tone mapping" msgstr "" @@ -3092,94 +2805,30 @@ msgid "" "enhanced, highlights and shadows are gradually compressed." msgstr "" -#: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - #: src/settings_translation_file.cpp msgid "Waving Nodes" msgstr "" +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + #: src/settings_translation_file.cpp msgid "Waving liquids" msgstr "" @@ -3224,311 +2873,182 @@ msgid "" "Requires waving liquids to be enabled." msgstr "" -#: src/settings_translation_file.cpp -msgid "Waving leaves" -msgstr "" - #: src/settings_translation_file.cpp msgid "" -"Set to true to enable waving leaves.\n" +"Set to true to enable Shadow Mapping.\n" "Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp -msgid "Waving plants" +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Set to true to enable waving plants.\n" -"Requires shaders to be enabled." +"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 "" #: src/settings_translation_file.cpp -msgid "Advanced" +msgid "Shadow map max distance in nodes to render shadows" msgstr "" #: src/settings_translation_file.cpp -msgid "Arm inertia" +msgid "Maximum distance to render shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Arm inertia, gives a more realistic movement of\n" -"the arm when the camera moves." +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS" +msgid "Shadow map texture in 32 bits" msgstr "" #: 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." +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Pause on lost window focus" +msgid "Poisson filtering" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Open the pause menu when the window's focus is lost. Does not pause if a " -"formspec is\n" -"open." +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." msgstr "" #: src/settings_translation_file.cpp -msgid "Viewing range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View distance in nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Near plane" +msgid "Shadow filter quality" 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" -"Increasing can reduce artifacting on weaker GPUs.\n" -"0.1 = Default, 0.25 = Good value for weaker tablets." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp -msgid "Screen width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autosave screen size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save window size automatically when modified." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VSync" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical screen synchronization." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view in degrees." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve gamma" +msgid "Colored shadows" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Alters the light curve by applying 'gamma correction' to it.\n" -"Higher values make middle and lower light levels brighter.\n" -"Value '1.0' leaves the light curve unaltered.\n" -"This only has significant effect on daylight and artificial\n" -"light, it has very little effect on natural night light." +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." msgstr "" #: src/settings_translation_file.cpp -msgid "Light curve low gradient" +msgid "Map shadows update frames" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Gradient of light curve at minimum light level.\n" -"Controls the contrast of the lowest light levels." +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" msgstr "" #: src/settings_translation_file.cpp -msgid "Light curve high gradient" +msgid "Soft shadow radius" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Gradient of light curve at maximum light level.\n" -"Controls the contrast of the highest light levels." +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" msgstr "" #: src/settings_translation_file.cpp -msgid "Light curve boost" +msgid "Sky Body Orbit Tilt" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Strength of light curve boost.\n" -"The 3 'boost' parameters define a range of the light\n" -"curve that is boosted in brightness." +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" msgstr "" #: src/settings_translation_file.cpp -msgid "Light curve boost center" +msgid "Audio" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" msgstr "" #: 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." +"Volume of all sounds.\n" +"Requires the sound system to be enabled." msgstr "" #: src/settings_translation_file.cpp -msgid "Light curve boost spread" +msgid "Mute sound" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Spread of light curve boost range.\n" -"Controls the width of the range to be boosted.\n" -"Standard deviation of the light curve boost Gaussian." +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." msgstr "" #: src/settings_translation_file.cpp -msgid "Texture path" +msgid "User Interfaces" msgstr "" #: src/settings_translation_file.cpp -msgid "Path to texture directory. All textures are first searched from here." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Video driver" +msgid "Language" msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" -"A restart is required after changing this.\n" -"Note: On Android, stick with OGLES1 if unsure! App may fail to start " -"otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"Set the language. Leave empty to use the system language.\n" +"A restart is required after changing this." msgstr "" #: src/settings_translation_file.cpp -msgid "Cloud radius" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Radius of cloud area stated in number of 64 node cloud squares.\n" -"Values larger than 26 will start to produce sharp cutoffs at cloud area " -"corners." +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." msgstr "" #: src/settings_translation_file.cpp -msgid "View bobbing factor" +msgid "Inventory items animations" msgstr "" #: 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 "" - -#: src/settings_translation_file.cpp -msgid "Fall bobbing factor" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "3D mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"3D support.\n" -"Currently supported:\n" -"- none: no 3d output.\n" -"- anaglyph: cyan/magenta color 3d.\n" -"- interlaced: odd/even line based polarisation screen support.\n" -"- topbottom: split screen top/bottom.\n" -"- sidebyside: split screen side by side.\n" -"- crossview: Cross-eyed 3d\n" -"- pageflip: quadbuffer based 3d.\n" -"Note that the interlaced mode requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D mode parallax strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of 3D mode parallax." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgid "Enables animation of inventory items." msgstr "" #: src/settings_translation_file.cpp @@ -3547,246 +3067,6 @@ msgstr "" msgid "Formspec full-screen background color (R,G,B)." msgstr "" -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box border color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width of the selection box lines around nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Recent Chat Messages" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of recent chat messages to show" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum hotbar width" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mesh cache" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables caching of facedir rotated meshes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock mesh generation delay" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Size of the MapBlock cache of the mesh generator. Increasing this will\n" -"increase the cache hit %, reducing the data being copied from the main\n" -"thread, thus reducing jitter." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables minimap." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Round minimap" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shape of the minimap. Enabled = round, disabled = square." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap scan height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"True = 256\n" -"False = 128\n" -"Usable to make minimap smoother on slower machines." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Colored fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ambient occlusion gamma" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The strength (darkness) of node ambient-occlusion shading.\n" -"Lower is darker, Higher is lighter. The valid range of values for this\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Inventory items animations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables animation of inventory items." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog start" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Opaque liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "World-aligned textures mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Textures on a node may be aligned either to the node or to the world.\n" -"The former mode suits better things like machines, furniture, etc., while\n" -"the latter makes stairs and microblocks fit surroundings better.\n" -"However, as this possibility is new, thus may not be used by older servers,\n" -"this option allows enforcing it for certain node types. Note though that\n" -"that is considered EXPERIMENTAL and may not work properly." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autoscaling mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"World-aligned textures may be scaled to span several nodes. However,\n" -"the server may not send the scale you want, especially if you use\n" -"a specially-designed texture pack; with this option, the client tries\n" -"to determine the scale automatically basing on the texture size.\n" -"See also texture_min_size.\n" -"Warning: This option is EXPERIMENTAL!" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Show entity selection boxes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clouds in menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use a cloud animation for the main menu background." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Scale GUI by a user specified value.\n" -"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" -"This will smooth over some of the rough edges, and blend\n" -"pixels when scaling down, at the cost of blurring some\n" -"edge pixels when images are scaled by non-integer sizes." -msgstr "" - #: src/settings_translation_file.cpp msgid "GUI scaling filter" msgstr "" @@ -3827,145 +3107,93 @@ msgid "Append item name to tooltip." msgstr "" #: src/settings_translation_file.cpp -msgid "FreeType fonts" +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp -msgid "Font bold by default" +msgid "Recent Chat Messages" msgstr "" #: src/settings_translation_file.cpp -msgid "Font italic by default" +msgid "Maximum number of recent chat messages to show" msgstr "" #: src/settings_translation_file.cpp -msgid "Font shadow" +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " -"drawn." +"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 "" #: src/settings_translation_file.cpp -msgid "Font shadow alpha" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." msgstr "" #: src/settings_translation_file.cpp -msgid "Font size" +msgid "Weblink color" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Regular font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"The fallback font will be used if the font cannot be loaded." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font is used for e.g. the console and profiler screen." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font will be used for certain languages or if the default font is " -"unavailable." +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp @@ -3979,130 +3207,51 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Screenshot folder" +msgid "Content Repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The URL for the content repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" msgstr "" #: 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." +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" #: src/settings_translation_file.cpp -msgid "Screenshot format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Format of screenshots." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screenshot quality" +msgid "ContentDB Max Concurrent Downloads" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Screenshot quality. Only used for JPEG format.\n" -"1 means worst quality; 100 means best quality.\n" -"Use 0 for default quality." +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." msgstr "" #: src/settings_translation_file.cpp -msgid "DPI" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " -"screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable console window" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Windows systems only: Start Minetest with the command line window in the " -"background.\n" -"Contains the same information as the file debug.txt (default name)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables the sound system.\n" -"If disabled, this completely disables all sounds everywhere and the in-game\n" -"sound controls will be non-functional.\n" -"Changing this setting requires a restart." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Volume" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Volume of all sounds.\n" -"Requires the sound system to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mute sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to mute sounds. You can unmute sounds at any time, unless the\n" -"sound system is disabled (enable_sound=false).\n" -"In-game, you can toggle the mute state with the mute key or by using the\n" -"pause menu." +msgid "Client and Server" msgstr "" #: src/settings_translation_file.cpp msgid "Client" msgstr "" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Address to connect to.\n" -"Leave this blank to start a local server.\n" -"Note that the address field in the main menu overrides this setting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Remote port" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Prometheus listener address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" -"enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" -msgstr "" - #: src/settings_translation_file.cpp msgid "Saving map received from server" msgstr "" @@ -4111,28 +3260,6 @@ msgstr "" msgid "Save the map received by the client on disk." msgstr "" -#: src/settings_translation_file.cpp -msgid "Connect to external media server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable usage of remote media server (if provided by server).\n" -"Remote servers offer a significantly faster way to download media (e.g. " -"textures)\n" -"when connecting to the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client modding" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable Lua modding support on client.\n" -"This support is experimental and API can change." -msgstr "" - #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "" @@ -4142,65 +3269,32 @@ msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "" #: src/settings_translation_file.cpp -msgid "Serverlist file" +msgid "Enable split login/register" msgstr "" #: src/settings_translation_file.cpp msgid "" -"File in client/serverlist/ that contains your favorite servers displayed in " -"the\n" -"Multiplayer Tab." +"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 "Maximum size of the out chat queue" +msgid "Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Admin name" msgstr "" #: 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." +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." 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 "" - -#: src/settings_translation_file.cpp -msgid "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Timeout for client to remove unused map data from memory." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock limit" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Show debug info" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to show the client debug info (has the same effect as hitting F5)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server / Singleplayer" +msgid "Serverlist and MOTD" msgstr "" #: src/settings_translation_file.cpp @@ -4222,6 +3316,10 @@ msgid "" "serverlist." msgstr "" +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "" + #: src/settings_translation_file.cpp msgid "Domain name of server, to be displayed in the serverlist." msgstr "" @@ -4247,13 +3345,31 @@ msgid "Announce to this serverlist." msgstr "" #: src/settings_translation_file.cpp -msgid "Strip color codes" +msgid "Message of the day" msgstr "" #: 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" +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Networking" msgstr "" #: src/settings_translation_file.cpp @@ -4311,120 +3427,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum simultaneous block sends per client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of blocks that are simultaneously sent per client.\n" -"The maximum total count is calculated dynamically:\n" -"max_total = ceil((#clients + max_users) * per_client / 4)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"To reduce lag, block transfers are slowed down when a player is building " -"something.\n" -"This determines how long they are slowed down after placing or removing a " -"node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. packets per iteration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of packets sent per send step, if you have a slow connection\n" -"try reducing it, but don't reduce it to a number below double of targeted\n" -"client number." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default game" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Message of the day" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Message of the day displayed to players connecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of players that can be connected simultaneously." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map directory" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Item entity TTL" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Default stack size" -msgstr "" - -#: src/settings_translation_file.cpp -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 "" - -#: src/settings_translation_file.cpp -msgid "Damage" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable players getting damage and dying." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Creative" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fixed map seed" -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." +msgid "Server Security" msgstr "" #: src/settings_translation_file.cpp @@ -4435,6 +3438,16 @@ msgstr "" msgid "New users need to input this password." msgstr "" +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "" + #: src/settings_translation_file.cpp msgid "Default privileges" msgstr "" @@ -4453,56 +3466,6 @@ msgstr "" msgid "Privileges that players with basic_privs can grant" msgstr "" -#: src/settings_translation_file.cpp -msgid "Unlimited player transfer distance" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Player transfer distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player versus player" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to allow players to damage and kill each other." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mod channels" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod channels support." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Static spawnpoint" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If this is set, players will always (re)spawn at the given position." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disallow empty passwords" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, new players cannot join with an empty password." -msgstr "" - #: src/settings_translation_file.cpp msgid "Disable anticheat" msgstr "" @@ -4522,93 +3485,75 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Chat message format" +msgid "Client-side Modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Format of player chat messages. The following strings are valid " -"placeholders:\n" -"@name, @message, @timestamp (optional)" +"Restricts the access of certain client-side functions on servers.\n" +"Combine the byteflags below to restrict client-side features, or set to 0\n" +"for no restrictions:\n" +"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" +"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" +"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" +"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" +"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" #: src/settings_translation_file.cpp -msgid "Shutdown message" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crash message" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "A message to be displayed to all clients when the server crashes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ask to reconnect after crash" +msgid "Client side node lookup range restriction" msgstr "" #: 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." +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." msgstr "" #: src/settings_translation_file.cpp -msgid "Active object send range" +msgid "Strip color codes" msgstr "" #: src/settings_translation_file.cpp msgid "" -"From how far clients know about objects, stated in mapblocks (16 nodes).\n" -"\n" -"Setting this larger than active_block_range will also cause the server\n" -"to maintain active objects up to this distance in the direction the\n" -"player is looking. (This can avoid mobs suddenly disappearing from view)" +"Remove color codes from incoming chat messages\n" +"Use this to stop players from being able to use color in their messages" msgstr "" #: src/settings_translation_file.cpp -msgid "Active block range" +msgid "Chat message max length" msgstr "" #: src/settings_translation_file.cpp msgid "" -"The radius of the volume of blocks around every player that is subject to " -"the\n" -"active block stuff, stated in mapblocks (16 nodes).\n" -"In active blocks objects are loaded and ABMs run.\n" -"This is also the minimum range in which active objects (mobs) are " -"maintained.\n" -"This should be configured together with active_object_send_range_blocks." +"Set the maximum length of a chat message (in characters) sent by clients." msgstr "" #: src/settings_translation_file.cpp -msgid "Max block send distance" +msgid "Chat message count limit" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgid "Amount of messages a player may send per 10 seconds." msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum forceloaded blocks" +msgid "Chat message kick threshold" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum number of forceloaded mapblocks." +msgid "Kick players who sent more than X messages per 10 seconds." msgstr "" #: src/settings_translation_file.cpp -msgid "Time send interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." +msgid "Server Gameplay" msgstr "" #: src/settings_translation_file.cpp @@ -4631,35 +3576,24 @@ msgid "Time of day when a new world is started, in millihours (0-23999)." msgstr "" #: src/settings_translation_file.cpp -msgid "Map save interval" +msgid "Item entity TTL" msgstr "" #: src/settings_translation_file.cpp -msgid "Interval of saving important changes in the world, stated in seconds." +msgid "" +"Time in seconds for item entity (dropped items) to live.\n" +"Setting it to -1 disables the feature." msgstr "" #: src/settings_translation_file.cpp -msgid "Chat message max length" +msgid "Default stack size" msgstr "" #: src/settings_translation_file.cpp -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message count limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amount of messages a player may send per 10 seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message kick threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Kick players who sent more than X messages per 10 seconds." +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 "" #: src/settings_translation_file.cpp @@ -4741,7 +3675,9 @@ msgid "Liquid fluidity" msgstr "" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." +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 @@ -4759,7 +3695,9 @@ msgid "Liquid sinking" 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 @@ -4771,464 +3709,13 @@ msgid "Acceleration of gravity, in nodes per second per second." msgstr "" #: src/settings_translation_file.cpp -msgid "Deprecated Lua API handling" +msgid "Fixed map seed" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" -"- error: abort on usage of deprecated call (suggested for mod developers)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. clearobjects extra blocks" -msgstr "" - -#: src/settings_translation_file.cpp -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 "Unload unused server data" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How much the server will wait before unloading unused mapblocks.\n" -"Higher value is smoother, but will use more RAM." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum objects per block" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of statically stored objects in a block." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Synchronous SQLite" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dedicated server step" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of a server tick and the interval at which objects are generally " -"updated over\n" -"network." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active block management interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between active block management cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "ABM interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "NodeTimer interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between NodeTimer execution cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ignore world errors" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Liquid loop max" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max liquids processed per step." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid queue purge time" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time (in seconds) that the liquids queue may grow beyond processing\n" -"capacity until an attempt is made to decrease its size by dumping old queue\n" -"items. A value of 0 disables the functionality." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid update tick" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid update interval in seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Block send optimize distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"At this distance the server will aggressively optimize which blocks are sent " -"to\n" -"clients.\n" -"Small values potentially improve performance a lot, at the expense of " -"visible\n" -"rendering glitches (some blocks will not be rendered under water and in " -"caves,\n" -"as well as sometimes on land).\n" -"Setting this to a value greater than max_block_send_distance disables this\n" -"optimization.\n" -"Stated in mapblocks (16 nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server side occlusion culling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled the server will perform map block occlusion culling based on\n" -"on the eye position of the player. This can reduce the number of blocks\n" -"sent to the client 50-80%. The client will not longer receive most " -"invisible\n" -"so that the utility of noclip mode is reduced." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client side modding restrictions" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Restricts the access of certain client-side functions on servers.\n" -"Combine the byteflags below to restrict client-side features, or set to 0\n" -"for no restrictions:\n" -"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" -"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" -"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" -"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" -"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" -"csm_restriction_noderange)\n" -"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client side node lookup range restriction" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the CSM restriction for node range is enabled, get_node calls are " -"limited\n" -"to this distance from the player to the node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod security" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Prevent mods from doing insecure things like running shell commands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trusted mods" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "HTTP mods" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Load the game profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Load the game profiler to collect game profiling data.\n" -"Provides a /profiler command to access the compiled profile.\n" -"Useful for mod developers and server operators." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default report format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The default format in which profiles are being saved,\n" -"when calling `/profiler save [format]` without format." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Report path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The file path relative to your worldpath in which profiles will be saved to." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Entity methods" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument the methods of entities on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active Block Modifiers" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument the action function of Active Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Loading Block Modifiers" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument the action function of Loading Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Global callbacks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument global callback functions on registration.\n" -"(anything you pass to a minetest.register_*() function)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Builtin" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument builtin.\n" -"This is usually only needed by core/builtin contributors" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Have the profiler instrument itself:\n" -"* Instrument an empty function.\n" -"This estimates the overhead, that instrumentation is adding (+1 function " -"call).\n" -"* Instrument the sampler being used to update the statistics." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client and Server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the player.\n" -"When running a server, clients connecting with this name are admins.\n" -"When starting from the main menu, this is overridden." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Language" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Debug log level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Level of logging to be written to debug.txt:\n" -"- <nothing> (no logging)\n" -"- none (messages with no level)\n" -"- error\n" -"- warning\n" -"- action\n" -"- info\n" -"- verbose" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug log file size threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the file size of debug.txt exceeds the number of megabytes specified in\n" -"this setting when it is opened, the file is moved to debug.txt.1,\n" -"deleting an older debug.txt.1 if it exists.\n" -"debug.txt is only moved if this setting is positive." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat log level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimal level of logging to be written to chat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "IPv6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable IPv6 support (for both client and server).\n" -"Required for IPv6 connections to work at all." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL parallel limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Limits number of parallel HTTP requests. Affects:\n" -"- Media fetch if server uses remote_media setting.\n" -"- Serverlist download and server announcement.\n" -"- Downloads performed by main menu (e.g. mod manager).\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL file download timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu script" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Replaces the default main menu with a custom one." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Engine profiling data print interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Print the engine's profiling data in regular intervals (in seconds).\n" -"0 = disable. Useful for developers." +"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 "" #: src/settings_translation_file.cpp @@ -5276,11 +3763,11 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." 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 @@ -6230,6 +4717,927 @@ msgstr "" msgid "Valley slope" msgstr "" +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mod Security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mod channels" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable mod channels support." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mod Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Global callbacks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Builtin" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Transparency Sorting Distance" +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 "VBO" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font bold by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold and italic font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve low gradient" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to show the client debug info (has the same effect as hitting F5)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat command time message threshold" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Server/Env Performance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Interval of sending time of day to clients, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +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 "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between Active Block Modifier (ABM) execution cycles, stated " +"in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Length of time between NodeTimer execution cycles, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Block send optimize distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to\n" +"clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible\n" +"rendering glitches (some blocks will not be rendered under water and in " +"caves,\n" +"as well as sometimes on land).\n" +"Setting this to a value greater than max_block_send_distance disables this\n" +"optimization.\n" +"Stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + #: src/settings_translation_file.cpp msgid "Chunk size" msgstr "" @@ -6299,28 +5707,1134 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Online Content Repository" +msgid "cURL" msgstr "" #: src/settings_translation_file.cpp -msgid "ContentDB URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The URL for the content repository" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "ContentDB Flag Blacklist" +msgid "cURL interactive timeout" msgstr "" #: src/settings_translation_file.cpp msgid "" -"Comma-separated list of flags to hide in the content repository.\n" -"\"nonfree\" can be used to hide packages which do not qualify as 'free " -"software',\n" -"as defined by the Free Software Foundation.\n" -"You can also specify content ratings.\n" -"These flags are independent from Minetest versions,\n" -"so see a full list at https://content.minetest.net/help/content_flags/" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL file download timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Misc" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Display Density Scaling Factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +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 "Map directory" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Serverlist file" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gamepads" +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 "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Temporary Settings" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: 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 "Pitch move mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via the \"Aux1\" key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +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 "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" diff --git a/po/mr/minetest.po b/po/mr/minetest.po new file mode 100644 index 000000000..1c081085d --- /dev/null +++ b/po/mr/minetest.po @@ -0,0 +1,6865 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2021-06-10 14:35+0000\n" +"Last-Translator: Avyukt More <moreavyukt1@outlook.com>\n" +"Language-Team: Marathi <https://hosted.weblate.org/projects/minetest/" +"minetest/mr/>\n" +"Language: mr\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" +"X-Generator: Weblate 4.7-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "मुख्य पानावर परत जा" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "पुनर्जन्म" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "You died" +msgstr "तू मेलास" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + +#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp +msgid "OK" +msgstr "ठीक आहे" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + +#: builtin/fstk/ui.lua +msgid "An error occurred in a Lua script:" +msgstr "त्रुटी आढळली" + +#: builtin/fstk/ui.lua +msgid "An error occurred:" +msgstr "एक त्रुटी आली:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "मुख्य पान" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "पुन्हा सामील व्हा" + +#: builtin/fstk/ui.lua +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 +msgid "Protocol version mismatch. " +msgstr "सर्व्हरची आवृत्ती जुळत नाही " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "सर्व्हर फक्त आवृत्ती $1 वर कार्य करतो " + +#: builtin/mainmenu/common.lua +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 चे समर्थन करतो." + +#: builtin/mainmenu/common.lua +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_register.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp +#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp +msgid "Cancel" +msgstr "रद्द करा" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +msgstr "अवलंबित्व:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "सर्व काही थांबवा" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable modpack" +msgstr "मॉडपॅक वापरणे थांबवा" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "सर्व वापरा" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable modpack" +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 "मॉड \"$1\" वापरु नाही शकत... कारण त्या नावात चुकीचे अक्षरे आहेत." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Find More Mods" +msgstr "आणखी मॉड शोधा" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "मॉड:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No (optional) dependencies" +msgstr "अवलंबन नाही" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "वर्णन केलेले नाही." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No hard dependencies" +msgstr "अवलंबन नाही" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." +msgstr "वर्णन केलेले नाही." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No optional dependencies" +msgstr "कोणताही मॉड बदलणार नाही" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "बदलणारे मॉड:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "बदल जतन करा" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "जग:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "वापरा" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "$१ आधीच डाउन्लोआडेड आहे. आपण ते अधिलिखित करू इच्छिता?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 $2 करून" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 डाउनलोड होत आहे..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "सर्व संकुले" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "आधीच स्थापित" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Back to Main Menu" +msgstr "मुख्य पानावर परत जा" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "मुख्य खेळ:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "जेव्हा मिनटेस्ट सीआरएलशिवाय संकलित केले होते तेव्हा सामग्री डीबी उपलब्ध नाही" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Downloading..." +msgstr "डाउनलोड करत आहे..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Failed to download $1" +msgstr "$१ डाउनलोड करू नाही शकत" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Games" +msgstr "खेळ" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install" +msgstr "डाउनलोड" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "डाउनलोड $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "गहाळ अवलंबित्व डाउनलोड करा" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Mods" +msgstr "मॉड" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No packages could be retrieved" +msgstr "काहीच सापडत नाही" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No results" +msgstr "कोणतीही गोष्ट नाहीत" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No updates" +msgstr "अपडेट नाहीत" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "सापडले नाही" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "अधिलिखित" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "कृपया मुख्य खेळ योग्य आहे याची तपासणी करा." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "रांगेत लागले आहेत" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" +msgstr "टेक्सचर पॅक" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Uninstall" +msgstr "काढा" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update" +msgstr "अपडेट" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "सर्व अपडेट करा [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "अंतर्जाल शोधक वर माहिती काढा" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "\"$1\" नावाचे जग आधीच अस्तित्वात आहे" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Additional terrain" +msgstr "अतिरिक्त भूभाग" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Altitude chill" +msgstr "थंडी" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Altitude dry" +msgstr "कोरडे हवामान" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biome blending" +msgstr "हवामान आणि आपत्ती यांच्यात फरक" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biomes" +msgstr "भिन्न हवामान आणि आपत्ती" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caverns" +msgstr "खाण" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caves" +msgstr "गुहा" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "तयार करा" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "सजावट" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Development Test is meant for developers." +msgstr "चेतावणी: Development Test विकासकांसाठी आहे." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Dungeons" +msgstr "अंधारकोठडी" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "सपाट जमीन" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "हवेत उडणारे जमीन" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "हवेत उडणारे जमीन" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "समुद्र आणि भूमिगत भूभाग" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Hills" +msgstr "टेकड्या" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Humid rivers" +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 +msgid "Lakes" +msgstr "तलाव" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Low humidity and high heat causes shallow or dry rivers" +msgstr "कमी आर्द्रता आणि जास्त उष्णता यामुळे उथळ किंवा कोरड्या नद्या" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "नकाशा निर्माता" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "नकाशा जनरेटर ध्वज" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mapgen-specific flags" +msgstr "नकाशा जनरेटर विशिष्ट ध्वजांकित करा" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mountains" +msgstr "पर्वत" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mud flow" +msgstr "चिखल प्रवाह" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Network of tunnels and caves" +msgstr "बोगदे आणि गुहांच्ये जाळे" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No game selected" +msgstr "कोणताही खेळ निवडलेला नाही" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces heat with altitude" +msgstr "कमी उष्णता" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces humidity with altitude" +msgstr "कमी आर्द्रता" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Rivers" +msgstr "नद्या" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Sea level rivers" +msgstr "समुद्र पातळीवरील नद्या" + +#: builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" +msgstr "सीड" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Smooth transition between biomes" +msgstr "भिन्न हवामान आणि आपत्ती यांच्यात सपाट संक्रमण" + +#: builtin/mainmenu/dlg_create_world.lua +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 "भूप्रदेशावर दिसणारी रचना, विशेषत: झाडे" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert" +msgstr "समशीतोष्ण, वाळवंट" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle" +msgstr "समशीतोष्ण, वाळवंट, जंगल" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgstr "समशीतोष्ण वाळवंट, जंगल, टुंड्रा, तैगा" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Terrain surface erosion" +msgstr "जमीन पृष्ठभाग धूप" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Trees and jungle grass" +msgstr "झाडे आणि गवत" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Vary river depth" +msgstr "नद्यांची खोली बदलते" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Very large caverns deep in the underground" +msgstr "खोल खाण" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "जगाचे नाव" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no games installed." +msgstr "आपल्याकडे कोणताही खेळ नाही." + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "आपली खात्री आहे की आपण \"$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 "काढा" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: failed to delete \"$1\"" +msgstr "pkgmgr: \"$1\" नाही कडू शकत" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: invalid path \"$1\"" +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 +msgid "Accept" +msgstr "स्वीकारा" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "मॉडपॅक पुनर्नामित करा:" + +#: 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 "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "2D Noise" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +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 "थंबवा" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "वापरा" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Lacunarity" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Octaves" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" +msgstr "ऑफसेट" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Persistence" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "मोज" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "" + +#. ~ "absvalue" is a noise parameter flag. +#. It is short for "absolute value". +#. It can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "absvalue" +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 "" + +#. ~ "eased" is a noise parameter flag. +#. It is used to make the map smoother and +#. can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "eased" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 (Enabled)" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 mods" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Failed to install $1 to $2" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find real mod name for: $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find suitable folder name for modpack $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to find a valid mod or modpack" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a $1 as a texture pack" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a game as a $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a mod as a $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a modpack as a $1" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 +msgid "Browse online content" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Content" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Information:" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Installed Packages:" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "No package description available" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Rename" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Uninstall Package" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Use Texture Pack" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Creative Mode" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Enable Damage" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +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 +msgid "Play Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Start Game" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Address" +msgstr "" + +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Creative mode" +msgstr "" + +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Join Game" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "दमट नद्या" + +#: builtin/mainmenu/tab_online.lua +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 "" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "All Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave Screen Size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/client/game.cpp +msgid "Change Keys" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touch threshold (px):" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +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 "" + +#: src/client/client.cpp +msgid "Done!" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes..." +msgstr "" + +#: src/client/client.cpp +msgid "Loading textures..." +msgstr "" + +#: src/client/client.cpp +msgid "Rebuilding shaders..." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided password file failed to open: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "" + +#: src/client/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" + +#: src/client/game.cpp +msgid "- Address: " +msgstr "" + +#: src/client/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/client/game.cpp +msgid "- Port: " +msgstr "" + +#: src/client/game.cpp +msgid "- Public: " +msgstr "" + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/client/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "एक त्रुटी आली:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + +#: src/client/game.cpp +msgid "Automatic forward disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Automatic forward enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + +#: src/client/game.cpp +msgid "Change Password" +msgstr "" + +#: src/client/game.cpp +msgid "Cinematic mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + +#: src/client/game.cpp +msgid "Client side scripting is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Connecting to server..." +msgstr "" + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + +#: src/client/game.cpp +msgid "Continue" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + +#: src/client/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/client/game.cpp +msgid "Creating server..." +msgstr "" + +#: src/client/game.cpp +msgid "Debug info and profiler graph hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info shown" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info, profiler graph, and wireframe hidden" +msgstr "" + +#: src/client/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/client/game.cpp +msgid "Disabled unlimited viewing range" +msgstr "" + +#: src/client/game.cpp +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 "" + +#: src/client/game.cpp +msgid "Exit to OS" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Game info:" +msgstr "" + +#: src/client/game.cpp +msgid "Game paused" +msgstr "" + +#: src/client/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/client/game.cpp +msgid "Item definitions..." +msgstr "" + +#: src/client/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Media..." +msgstr "" + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Node definitions..." +msgstr "" + +#: src/client/game.cpp +msgid "Off" +msgstr "" + +#: src/client/game.cpp +msgid "On" +msgstr "" + +#: src/client/game.cpp +msgid "Pitch move mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Pitch move mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Profiler graph shown" +msgstr "" + +#: src/client/game.cpp +msgid "Remote server" +msgstr "" + +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "" + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "" + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at minimum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "ok" +msgstr "" + +#: src/client/gameui.cpp +msgid "Chat hidden" +msgstr "" + +#: src/client/gameui.cpp +msgid "Chat shown" +msgstr "" + +#: src/client/gameui.cpp +msgid "HUD hidden" +msgstr "" + +#: src/client/gameui.cpp +msgid "HUD shown" +msgstr "" + +#: src/client/gameui.cpp +msgid "Profiler hidden" +msgstr "" + +#: src/client/gameui.cpp +#, c-format +msgid "Profiler shown (page %d of %d)" +msgstr "" + +#: src/client/keycode.cpp +msgid "Apps" +msgstr "" + +#: src/client/keycode.cpp +msgid "Backspace" +msgstr "" + +#: src/client/keycode.cpp +msgid "Caps Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Down" +msgstr "" + +#: src/client/keycode.cpp +msgid "End" +msgstr "" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "" + +#. ~ Key name, common on Windows keyboards +#: src/client/keycode.cpp +msgid "Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Middle Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Num Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad *" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad +" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad -" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad /" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 0" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 2" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 3" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 4" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 5" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 6" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 7" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 8" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 9" +msgstr "" + +#: src/client/keycode.cpp +msgid "OEM Clear" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page down" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page up" +msgstr "" + +#: src/client/keycode.cpp +msgid "Pause" +msgstr "" + +#: src/client/keycode.cpp +msgid "Play" +msgstr "" + +#. ~ "Print screen" key +#: src/client/keycode.cpp +msgid "Print" +msgstr "" + +#: src/client/keycode.cpp +msgid "Return" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Windows" +msgstr "" + +#: src/client/keycode.cpp +msgid "Scroll Lock" +msgstr "" + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" +msgstr "" + +#: src/client/keycode.cpp +msgid "Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Sleep" +msgstr "" + +#: src/client/keycode.cpp +msgid "Snapshot" +msgstr "" + +#: src/client/keycode.cpp +msgid "Space" +msgstr "" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 2" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Zoom" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "$१ डाउनलोड करू नाही शकत" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "" + +#: src/gui/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "\"Aux1\" = climb down" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Autoforward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Automatic jumping" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Change camera" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Chat" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle HUD" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle chat log" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fog" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Change" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "New Password" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Old Password" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +msgid "Exit" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +msgid "Muted" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +#, c-format +msgid "Sound Volume: %d%%" +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). +#: src/network/clientpackethandler.cpp src/script/lua_api/l_client.cpp +msgid "LANG_CODE" +msgstr "" + +#: 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" +"If disabled, virtual joystick will center to first-touch's position." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"situations.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"Default is for a vertically-squashed shape suitable for\n" +"an island, set all 3 numbers equal for the raw shape." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of ridged mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of step mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of step mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that locates the river valleys and channels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"to be adjusted, as floatland tapering functions best when this noise has\n" +"a value range of approximately -2.0 to 2.0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise that determines number of dungeons per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- crossview: Cross-eyed 3d\n" +"- pageflip: quadbuffer based 3d.\n" +"Note that the interlaced mode requires shaders to be enabled." +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." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of queued blocks to emerge" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration of gravity, in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + +#: src/settings_translation_file.cpp +#, c-format +msgid "" +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" +"to be sure) creates a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "जगाचे नाव" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"This only has significant effect on daylight and artificial\n" +"light, it has very little effect on natural night light." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Always fly fast" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amount of messages a player may send per 10 seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce to this serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name to tooltip." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to\n" +"clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible\n" +"rendering glitches (some blocks will not be rendered under water and in " +"caves,\n" +"as well as sometimes on land).\n" +"Setting this to a value greater than max_block_send_distance disables this\n" +"optimization.\n" +"Stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome API noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Increasing can reduce artifacting on weaker GPUs.\n" +"0.1 = Default, 0.25 = Good value for weaker tablets." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat weblinks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples:\n" +"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls width of tunnels, a smaller value creates wider tunnels.\n" +"Value >= 10.0 completely disables generation of tunnels and avoids the\n" +"intensive noise calculations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain and steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the base ground level." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the depth of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river valley." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +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 "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +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 " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server.\n" +"Ignored if bind_address is set.\n" +"Needs enable_ipv6 to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"appearance of high dynamic range images. Mid-range contrast is slightly\n" +"enhanced, highlights and shadows are gradually compressed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Exponent of the floatland tapering. Alters the tapering behaviour.\n" +"Value = 1.0 creates a uniform, linear tapering.\n" +"Values > 1.0 create a smooth tapering suitable for the default separated\n" +"floatlands.\n" +"Values < 1.0 (for example 0.25) create a more defined surface level with\n" +"flatter lowlands, suitable for a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via the \"Aux1\" key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Filtering and Antialiasing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font bold by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal acceleration in air when jumping or falling,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration in fast mode,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration on ground or when climbing,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"If negative, liquid waves will move backwards.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +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 "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"increases processing load.\n" +"At iterations = 20 this mapgen has a similar load to mapgen V7." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +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 "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of liquid waves.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen Carpathian." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'terrain' enables the generation of non-fractal terrain:\n" +"ocean, islands and underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"to become shallower and occasionally dry.\n" +"'altitude_dry': Reduces humidity with altitude." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen v5." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'floatlands': Floating land masses in the atmosphere.\n" +"'caverns': Giant caves deep underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum liquid resistance. Controls deceleration when entering liquid at\n" +"high speed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of recent chat messages to show" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"Current mapgens in a highly unstable state:\n" +"- The optional floatlands of v7 (disabled by default)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Near plane" +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 "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"processes, especially in singleplayer and/or when running Lua code in\n" +"'on_generated'. For many users the optimum setting may be '1'." +msgstr "" + +#: src/settings_translation_file.cpp +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 "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Optional override for chat weblink color." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + +#: 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 transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Proportion of large caves that contain liquid." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Restricts the access of certain client-side functions on servers.\n" +"Combine the byteflags below to restrict client-side features, or set to 0\n" +"for no restrictions:\n" +"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" +"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" +"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" +"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" +"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridged mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River valley width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hill size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hills spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Selects one of 18 fractal types.\n" +"1 = 4D \"Roundy\" Mandelbrot set.\n" +"2 = 4D \"Roundy\" Julia set.\n" +"3 = 4D \"Squarry\" Mandelbrot set.\n" +"4 = 4D \"Squarry\" Julia set.\n" +"5 = 4D \"Mandy Cousin\" Mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" Julia set.\n" +"7 = 4D \"Variation\" Mandelbrot set.\n" +"8 = 4D \"Variation\" Julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" Mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" Julia set.\n" +"11 = 3D \"Christmas Tree\" Mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" Julia set.\n" +"13 = 3D \"Mandelbulb\" Mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" Julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" Mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" Julia set.\n" +"17 = 4D \"Mandelbulb\" Mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" Julia set." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server" +msgstr "दमट नद्या" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving liquids (like water).\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow strength gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).\n" +"WARNING!: There is no benefit, and there are several dangers, in\n" +"increasing this value above 5.\n" +"Reducing this value increases cave and dungeon density.\n" +"Altering this value is for special usage, leaving it unchanged is\n" +"recommended." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Surface level of optional water placed on a solid floatland layer.\n" +"Water is disabled by default and will only be placed if this value is set\n" +"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" +"upper tapering).\n" +"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" +"When enabling water placement the floatlands must be configured and tested\n" +"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" +"required value depending on 'mgv7_np_floatland'), to avoid\n" +"server-intensive extreme water flow and to avoid vast flooding of the\n" +"world surface below." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The URL for the content repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other biome filler node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The length in pixels it takes for touch screen interaction to start." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"Default is 1.0 (1/2 node).\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Third of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Time of day when a new world is started, in millihours (0-23999)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Virtual joystick triggers Aux1 button" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Volume of all sounds.\n" +"Requires the sound system to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"W coordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking and flying speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking, flying and climbing speed in fast mode, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"This is also used as the base node texture size for world-aligned\n" +"texture autoscaling." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." +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 "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "World start time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y of mountain density gradient zero level. Used to shift mountains " +"vertically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "minetest.net वरून Minetest Game डाउनलोड करा" + +#~ msgid "Download one from minetest.net" +#~ msgstr "minetest.net वरुन डाउनलोड करा" + +#~ msgid "Game" +#~ msgstr "खेळ" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "तू मेलास" diff --git a/po/ms/minetest.po b/po/ms/minetest.po index fb3989a3f..54529e0f6 100644 --- a/po/ms/minetest.po +++ b/po/ms/minetest.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: Malay (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-07-08 20:47+0000\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-07-24 09:25+0000\n" "Last-Translator: Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat " "Yasuyoshi <translation@mnh48.moe>\n" "Language-Team: Malay <https://hosted.weblate.org/projects/minetest/minetest/" @@ -13,20 +13,87 @@ 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.2-dev\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Padam baris gilir sembang keluar" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Perintah kosong." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Keluar ke menu utama" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Perintah tidak sah: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Perintah dikeluarkan: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Senaraikan pemain dalam talian" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Pemain dalam talian: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Baris gilir sembang keluar kini kosong." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Perintah ini dilumpuhkan oleh pelayan." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" -msgstr "Lahir semula" +msgstr "Jelma semula" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" msgstr "Anda telah meninggal" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Perintah tersedia:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Perintah tersedia: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Perintah tidak tersedia: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Dapatkan bantuan untuk perintah" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Gunakan '.help <perintah>' untuk dapatkan maklumat lanjut, atau '.help all' " +"untuk senaraikan kesemuanya." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <perintah>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "OK" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<tiada yang tersedia>" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Berlakunya ralat dalam skrip Lua:" @@ -45,11 +112,35 @@ msgstr "Sambung semula" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "Pelayan permainan meminta anda untuk menyambung semula:" +msgstr "Pelayan meminta anda untuk menyambung semula:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Sedang memuatkan..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "Versi $1 baharu kini tersedia" + +#: builtin/mainmenu/common.lua +msgid "Client Mods" +msgstr "Mods Klien" + +#: 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 "" +"Versi terpasang: $1\n" +"Versi baharu: $2\n" +"Lawati $3 untuk ketahui cara untuk mendapatkan versi terbaru dan kekal " +"dikemas kini dengan sifat dan pembaikan pepijat." + +#: builtin/mainmenu/common.lua +msgid "Later" +msgstr "Kemudian" + +#: builtin/mainmenu/common.lua +msgid "Never" +msgstr "Tidak Selamanya" #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " @@ -57,17 +148,15 @@ msgstr "Versi protokol tidak serasi. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "Pelayan permainan menguatkuasakan protokol versi $1. " +msgstr "Pelayan menguatkuasakan protokol versi $1. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " -msgstr "Pelayan permainan menyokong protokol versi $1 hingga $2. " +msgstr "Pelayan menyokong protokol versi $1 hingga $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "" -"Cuba aktifkan semula senarai pelayan awam dan periksa sambungan internet " -"anda." +msgid "Visit website" +msgstr "Lawati laman sesawang" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,17 +166,26 @@ msgstr "Kami hanya menyokong protokol versi $1." msgid "We support protocol versions between version $1 and $2." msgstr "Kami menyokong protokol versi $1 hingga $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Enabled, has error)" +msgstr "(Dibolehkan, ada ralat)" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Unsatisfied)" +msgstr "(Tidak dipenuhi)" + +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Kebergantungan:" @@ -160,14 +258,54 @@ msgstr "Dunia:" msgid "enabled" msgstr "Dibolehkan" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" sudah wujud. Adakah anda ingin tulis gantinya?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Kebergantungan $1 dan $2 akan dipasangkan." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 oleh $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 sedang muat turun,\n" +"$2 menunggu giliran" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 memuat turun..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 memerlukan kebergantungan yang tidak dijumpai." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 akan dipasangkan, dan kebergantungan $2 akan dilangkau." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Semua pakej" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Sudah dipasang" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Kembali ke Menu Utama" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Permainan Asas:" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "ContentDB tidak tersedia apabila Minetest dikompil tanpa cURL" @@ -181,7 +319,6 @@ msgid "Failed to download $1" msgstr "Gagal memuat turun $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Permainan" @@ -190,7 +327,18 @@ msgid "Install" msgstr "Pasang" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Pasang $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Pasang kebergantungan yang hilang" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Pasang: Jenis fail tidak disokong atau arkib rosak" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" @@ -203,9 +351,24 @@ msgid "No results" msgstr "Tiada hasil" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Cari" +msgid "No updates" +msgstr "Tiada kemas kini" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Tidak dijumpai" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Tulis ganti" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Sila semak dan pastikan permainan asas itu betul." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Menunggu giliran" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -220,8 +383,12 @@ msgid "Update" msgstr "Kemas kini" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Lihat" +msgid "Update All [$1]" +msgstr "Kemas Kini Semua [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Lihat maklumat lanjut dalam pelayar sesawang" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -264,12 +431,8 @@ msgid "Decorations" msgstr "Hiasan" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Muat turun permainan, contohnya Minetest Game, dari minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Muat turun satu dari minetest.net" +msgid "Development Test is meant for developers." +msgstr "Development Test hanyalah untuk kegunaan pembangun." #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -285,11 +448,7 @@ msgstr "Jisim bumi terapung atas langit" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "Tanah terapung (dalam ujikaji)" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Permainan" +msgstr "Tanah terapung (dalam uji kaji)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" @@ -307,6 +466,14 @@ msgstr "Sungai lembap" msgid "Increases humidity around rivers" msgstr "Tingkatkan kelembapan sekitar sungai" +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install a game" +msgstr "Pasang suatu permainan" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "Pasang permainan lain" + #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" msgstr "Tasik" @@ -408,10 +575,6 @@ msgstr "Kedalaman sungai berbagai" msgid "Very large caverns deep in the underground" msgstr "Gua gergasi yang sangat mendalam bawah tanah" -#: builtin/mainmenu/dlg_create_world.lua -msgid "Warning: The Development Test is meant for developers." -msgstr "Amaran: The Development Test hanyalah untuk kegunaan pembangun." - #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "Nama dunia" @@ -442,6 +605,36 @@ msgstr "pkgmgr: laluan tidak sah \"$1\"" msgid "Delete World \"$1\"?" msgstr "Padam Dunia \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Sahkan Kata Laluan" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "Menyertai $1" + +#: builtin/mainmenu/dlg_register.lua +msgid "Missing name" +msgstr "Nama tidak ditulis" + +#: 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 laluan" + +#: builtin/mainmenu/dlg_register.lua +msgid "Passwords do not match" +msgstr "Kata laluan tidak padan" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "Daftar" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Terima" @@ -475,6 +668,14 @@ msgid "Browse" msgstr "Layar" #: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Games" +msgstr "Kandungan: Permainan" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Mods" +msgstr "Kandungan: Mods" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Dilumpuhkan" @@ -499,7 +700,7 @@ msgid "Offset" msgstr "Ofset" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Penerusan" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -518,6 +719,10 @@ msgstr "Pulihkan Tetapan Asal" msgid "Scale" msgstr "Skala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Cari" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Pilih direktori" @@ -526,7 +731,7 @@ msgstr "Pilih direktori" msgid "Select file" msgstr "Pilih fail" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Tunjukkan nama teknikal" @@ -605,14 +810,6 @@ msgstr "Pasang Mods: Gagal mencari nama mods sebenar untuk: $1" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "Pasang Mods: tidak jumpa nama folder yang sesuai untuk pek mods $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Pasang: Jenis fail \"$1\" tidak disokong atau arkib rosak" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Pasang: fail: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Tidak jumpa mods atau pek mods yang sah" @@ -633,6 +830,60 @@ msgstr "Gagal memasang mods sebagai $1" msgid "Unable to install a modpack as a $1" msgstr "Gagal memasang pek mods sebagai $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Sedang memuatkan..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Senarai pelayan awam dilumpuhkan" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Cuba aktifkan semula senarai pelayan awam dan periksa sambungan internet " +"anda." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Perihal" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Penyumbang Aktif" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Pengemas gabung aktif:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Pembangun Teras" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Buka Direktori Data Pengguna" + +#: 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 "" +"Membuka direktori yang mengandungi dunia, permainan, mods, dan pek\n" +"tekstur yang disediakan oleh pengguna, dalam pengurus / pelayar fail." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Penyumbang Terdahulu" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Pembangun Teras Terdahulu" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "Kongsikan log nyahpepijat" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Layari kandungan dalam talian" @@ -673,26 +924,6 @@ msgstr "Nyahpasang Pakej" msgid "Use Texture Pack" msgstr "Guna Pek Tekstur" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Penyumbang Aktif" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Pembangun Teras" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Penghargaan" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Penyumbang Terdahulu" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Pembangun Teras Terdahulu" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Umumkan Pelayan" @@ -702,14 +933,10 @@ msgid "Bind Address" msgstr "Alamat Ikatan" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigurasi" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Mod Kreatif" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Boleh Cedera" @@ -725,10 +952,6 @@ msgstr "Hos Pelayan" msgid "Install games from ContentDB" msgstr "Pasangkan permainan daripada ContentDB" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nama/Kata laluan" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Buat Baru" @@ -741,10 +964,14 @@ msgstr "Tiada dunia dicipta atau dipilih!" msgid "Play Game" msgstr "Mula Main" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Pilih Mods" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Pilih Dunia:" @@ -758,45 +985,61 @@ msgid "Start Game" msgstr "Mulakan Permainan" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Alamat / Port" +msgid "Address" +msgstr "Alamat" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Sambung" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Padam" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Mod Kreatif" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Boleh Cedera" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Boleh cedera / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Padam Kegemaran" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "Kegemaran" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Pelayan Tidak Serasi" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Sertai Permainan" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nama / Kata laluan" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "Log Masuk" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Boleh Berlawan PvP" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Pelayan Awam" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Segarkan semula" + +#: builtin/mainmenu/tab_online.lua +msgid "Remove favorite" +msgstr "Buang kegemaran" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Keterangan Pelayan" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "(sokongan permainan diperlukan)" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -822,10 +1065,6 @@ msgstr "Semua Tetapan" msgid "Antialiasing:" msgstr "Antialias:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Adakah anda mahu set semula dunia pemain perseorangan?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Autosimpan Saiz Skrin" @@ -834,10 +1073,6 @@ msgstr "Autosimpan Saiz Skrin" msgid "Bilinear Filter" msgstr "Penapisan Bilinear" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Pemetaan Benggol" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Tukar Kekunci" @@ -846,13 +1081,29 @@ msgstr "Tukar Kekunci" msgid "Connected Glass" msgstr "Kaca Bersambungan" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Bayang dinamik" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "Bayang dinamik:" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Daun Beragam" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Jana Peta Normal" +msgid "High" +msgstr "Tinggi" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Rendah" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Sederhana" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -862,10 +1113,6 @@ msgstr "Peta Mip" msgid "Mipmap + Aniso. Filter" msgstr "Peta Mip + Penapisan Aniso" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Tidak" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Tiada Tapisan" @@ -894,18 +1141,10 @@ msgstr "Daun Legap" msgid "Opaque Water" msgstr "Air Legap" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Oklusi Paralaks" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partikel" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Set semula dunia pemain perseorangan" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Skrin:" @@ -918,6 +1157,10 @@ msgstr "Tetapan" msgid "Shaders" msgstr "Pembayang" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Pembayang (dalam uji kaji)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Pembayang (tidak tersedia)" @@ -934,22 +1177,26 @@ msgstr "Pencahayaan Lembut" msgid "Texturing:" msgstr "Jalinan:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Untuk membolehkan pembayang, pemacu OpenGL mesti digunakan." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Pemetaan Tona" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "Nilai Ambang Sentuhan: (px)" +msgid "Touch threshold (px):" +msgstr "Nilai ambang sentuhan (px):" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Penapisan Trilinear" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "Sangat Tinggi" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Sangat Rendah" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Daun Bergoyang" @@ -962,23 +1209,11 @@ msgstr "Cecair Bergelora" msgid "Waving Plants" msgstr "Tumbuhan Bergoyang" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ya" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Konfigurasi mods" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Utama" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Mula Main Seorang" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "Sambungan digugurkan (ralat protokol?)." + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Sambungan tamat tempoh." @@ -1007,8 +1242,8 @@ msgid "Connection error (timed out?)" msgstr "Ralat dalam penyambungan (tamat tempoh?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Tidak jumpa atau tidak boleh muatkan permainan \"" +msgid "Could not find or load game: " +msgstr "Tidak jumpa atau tidak boleh muatkan permainan: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1039,18 +1274,6 @@ msgstr "Fail kata laluan yang disediakan gagal dibuka: " msgid "Provided world path doesn't exist: " msgstr "Laluan dunia diberi tidak wujud: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1063,14 +1286,6 @@ msgstr "" msgid "- Address: " msgstr "- Alamat: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Mod Kreatif: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Boleh cedera: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Mod: " @@ -1092,6 +1307,15 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "- Nama Pelayan: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Telah berlakunya ralat penyirian:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Capaian dinafikan. Sebab: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Pergerakan automatik dilumpuhkan" @@ -1100,6 +1324,22 @@ msgstr "Pergerakan automatik dilumpuhkan" msgid "Automatic forward enabled" msgstr "Pergerakan automatik dibolehkan" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Batas blok disembunyikan" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Batas blok ditunjukkan untuk semua blok" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Batas blok ditunjukkan untuk blok semasa" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Batas blok ditunjukkan untuk blok berhampiran" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Kemas kini kamera dilumpuhkan" @@ -1108,6 +1348,10 @@ msgstr "Kemas kini kamera dilumpuhkan" msgid "Camera update enabled" msgstr "Kemas kini kamera dibolehkan" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Tidak boleh tunjuk batas blok (dilumpuhkan oleh mods atau permainan)" + #: src/client/game.cpp msgid "Change Password" msgstr "Tukar Kata Laluan" @@ -1120,6 +1364,10 @@ msgstr "Mod sinematik dilumpuhkan" msgid "Cinematic mode enabled" msgstr "Mod sinematik dibolehkan" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Klien dinyahsambung" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Skrip pihak klien dilumpuhkan" @@ -1128,6 +1376,10 @@ msgstr "Skrip pihak klien dilumpuhkan" msgid "Connecting to server..." msgstr "Sedang menyambung kepada pelayan..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Sambungan gagal untuk sebab yang tidak diketahui" + #: src/client/game.cpp msgid "Continue" msgstr "Teruskan" @@ -1140,31 +1392,36 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" -"Kawalan:\n" +"Controls:\n" "- %s: bergerak ke depan\n" "- %s: bergerak ke belakang\n" "- %s: bergerak ke kiri\n" "- %s: bergerak ke kanan\n" "- %s: lompat/naik atas\n" +"- %s: gali/ketuk\n" +"- %s: letak/guna\n" "- %s: selinap/turun bawah\n" "- %s: jatuhkan item\n" "- %s: inventori\n" "- Tetikus: pusing/lihat sekeliling\n" -"- Tetikus kiri: gali/ketuk\n" -"- Tetikus kanan: letak/guna\n" "- Roda tetikus: pilih item\n" "- %s: sembang\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Tidak mampu menyelesaikan alamat: %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "Sedang mencipta klien..." @@ -1221,6 +1478,11 @@ msgstr "Jarak pandang tanpa had dilumpuhkan" msgid "Enabled unlimited viewing range" msgstr "Jarak pandang tanpa had dibolehkan" +#: src/client/game.cpp +#, c-format +msgid "Error creating client: %s" +msgstr "Ralat dalam mencipta klien: %s" + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Keluar ke Menu" @@ -1296,32 +1558,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Peta mini dilumpuhkan oleh permainan atau mods" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Peta mini disembunyikan" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Peta mini dalam mod radar, Zum 1x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Peta mini dalam mod radar, Zum 2x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Peta mini dalam mod radar, Zum 4x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Peta mini dalam mod permukaan, Zum 1x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Peta mini dalam mod permukaan, Zum 2x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Peta mini dalam mod permukaan, Zum 4x" +msgid "Multiplayer" +msgstr "Pemain Ramai" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1395,6 +1633,21 @@ msgstr "Sistem bunyi tidak disokong di binaan ini" msgid "Sound unmuted" msgstr "Bunyi dinyahbisukan" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Kemungkinan pelayan menjalankan versi %s yang berlainan." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Tidak mampu sambung ke %s kerana IPv6 dilumpuhkan" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Tidak mampu dengar di %s kerana IPv6 dilumpuhkan" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1464,10 +1717,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Kunci Huruf Besar" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Padam" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1715,36 +1964,39 @@ msgstr "Butang X 2" msgid "Zoom" msgstr "Zum" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Kata laluan tidak padan!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Peta mini disembunyikan" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Daftar dan Sertai" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 sertai pelayan dengan nama \"%s\" untuk kali pertama.\n" -"Jika anda teruskan, akaun baru dengan maklumat anda akan dicipta di pelayan " -"ini.\n" -"Sila taip semula kata laluan anda dan klik 'Daftar dan Sertai' untuk sahkan " -"penciptaan akaun, atau klik 'Batal' untuk membatalkan." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Peta mini dalam mod radar, Zum x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Peta mini dalam mod permukaan, Zum x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Peta mini dalam mod tekstur" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Gagal buka laman sesawang" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Membuka laman sesawang" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Teruskan" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Istimewa\" = panjat turun" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = panjat turun" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1754,21 +2006,29 @@ msgstr "Autopergerakan" msgid "Automatic jumping" msgstr "Lompat automatik" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Ke Belakang" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Batas blok" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Tukar kamera" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Sembang" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" -msgstr "Arahan" +msgstr "Perintah" #: src/gui/guiKeyChangeMenu.cpp msgid "Console" @@ -1815,14 +2075,12 @@ msgid "Key already in use" msgstr "Kekunci telah digunakan untuk fungsi lain" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "" -"Ikatan kekunci. (Jika menu ini berselerak, padam sesetengah benda dari fail " -"minetest.conf)" +msgid "Keybindings." +msgstr "Ikatan kekunci." #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" -msgstr "Arahan tempatan" +msgstr "Perintah tempatan" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" @@ -1848,10 +2106,6 @@ msgstr "Tangkap layar" msgid "Sneak" msgstr "Selinap" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Istimewa" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Togol papar pandu (HUD)" @@ -1892,10 +2146,6 @@ msgstr "tekan kekunci" msgid "Change" msgstr "Tukar" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Sahkan Kata Laluan" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Kata Laluan Baru" @@ -1904,6 +2154,10 @@ msgstr "Kata Laluan Baru" msgid "Old Password" msgstr "Kata Laluan Lama" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Kata laluan tidak padan!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Keluar" @@ -1913,14 +2167,9 @@ msgid "Muted" msgstr "Dibisukan" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Kekuatan Bunyi: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Masukkan " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Kekuatan Bunyi: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1929,6 +2178,16 @@ msgstr "Masukkan " msgid "LANG_CODE" msgstr "ms" +#: src/network/clientpackethandler.cpp +msgid "" +"Name is not registered. To create an account on this server, click 'Register'" +msgstr "" +"Nama belum berdaftar. Untuk mencipta akaun di pelayan ini, klik 'Daftar'" + +#: src/network/clientpackethandler.cpp +msgid "Name is taken. Please choose another name" +msgstr "Nama sudah diambil. Sila pilih nama yang lain" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1940,12 +2199,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Guna kayu bedik maya untuk picu butang \"aux\".\n" -"Jika dibolehkan, kayu bedik maya juga akan menekan butang \"aux\" apabila " +"(Android) Guna kayu bedik maya untuk picu butang \"Aux1\".\n" +"Jika dibolehkan, kayu bedik maya juga akan menekan butang \"Aux1\" apabila " "berada di luar bulatan utama." #: src/settings_translation_file.cpp @@ -1961,10 +2220,10 @@ msgid "" msgstr "" "(X,Y,Z) Ofset fraktal dari pusat dunia dalam unit 'skala'.\n" "Boleh guna untuk pindahkan titik yang diingini ke (0, 0)\n" -"untuk cipta titik kelahiran yang sesuai, atau untuk\n" +"untuk cipta titik jelma yang sesuai, atau untuk\n" "membolehkan 'zum masuk' pada titik yang diinginkan\n" "dengan menaikkan 'skala'.\n" -"Nilai lalai disesuaikan untuk titik kelahiran sesuai untuk set Mandelbrot\n" +"Nilai lalai disesuaikan untuk titik jelma sesuai untuk set Mandelbrot\n" "dengan parameter lalai, ia mungkin perlu diubah untuk situasi yang lain.\n" "Julat kasarnya -2 sehingga 2. Darabkan dengan 'skala' untuk ofset dalam nod." @@ -1986,14 +2245,6 @@ msgstr "" "Nilai asal ialah untuk bentuk penyek menegak sesuai untuk pulau,\n" "tetapkan kesemua 3 nombor yang sama untuk bentuk mentah." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = oklusi paralaks dengan maklumat cerun (lebih cepat).\n" -"1 = pemetaan bentuk muka bumi (lebih lambat, lebih tepat)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "Hingar 2D yang mengawal bentuk/saiz gunung rabung." @@ -2090,15 +2341,20 @@ msgid "" msgstr "" "Sokongan 3D.\n" "Yang disokong pada masa ini:\n" -"- tiada: tiada output 3D.\n" -"- anaglif: 3D warna biru/merah.\n" -"- selang-seli: garis genap/ganjil berdasarkan sokongan skrin polarisasi.\n" -"- atas-bawah: pisah skrin atas/bawah.\n" -"- kiri-kanan: pisah skrin kiri/kanan.\n" -"- silang lihat: 3D mata bersilang\n" -"- selak halaman: 3D berasaskan penimbal kuad.\n" +"- none (tiada): untuk tiada output 3D.\n" +"- anaglyph (anaglif): 3D warna biru/merah.\n" +"- interlaced (selang-seli): garis genap/ganjil berdasarkan sokongan skrin " +"polarisasi.\n" +"- topbottom (atas-bawah): pisah skrin atas/bawah.\n" +"- sidebyside (kiri-kanan): pisah skrin kiri/kanan.\n" +"- crossview (silang lihat): 3D mata bersilang\n" +"- pageflip (selak halaman): 3D berasaskan penimbal kuad.\n" "Ambil perhatian bahawa mod selang-seli memerlukan pembayang." +#: 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" @@ -2119,13 +2375,17 @@ msgstr "Mesej yang akan dipaparkan dekat semua klien apabila pelayan ditutup." msgid "ABM interval" msgstr "Selang masa ABM" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "Peruntukan masa ABM" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "Had mutlak untuk blok dibarisgilirkan untuk timbul" +msgstr "Had mutlak untuk blok menunggu giliran untuk timbul" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "Pecutan dalam udara" +msgstr "Pecutan di udara" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." @@ -2154,7 +2414,7 @@ msgid "" "Note that the address field in the main menu overrides this setting." msgstr "" "Alamat untuk menyambung.\n" -"Biar kosong untuk memulakan pelayan permainan tempatan.\n" +"Biar kosong untuk memulakan pelayan tempatan.\n" "Ambil perhatian bahawa medan alamat dalam menu utama mengatasi tetapan ini." #: src/settings_translation_file.cpp @@ -2169,6 +2429,12 @@ msgstr "" "Laraskan konfigurasi DPI ke skrin anda (bukan X11/Android sahaja) cth. untuk " "skrin 4K." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Laraskan ketumpatan paparan yang dikesan, digunakan untuk menyesuaikan " +"elemen UI." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2185,6 +2451,10 @@ msgstr "" "tinggi\n" "bergantung kepada tetapan 'mgv7_np_floatland', sentiasa cuba untuk pastikan)." +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "Nama pentadbir" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Tetapan mendalam" @@ -2204,8 +2474,8 @@ msgstr "" "dan cahaya buatan, kesannya pada cahaya malam amat rendah." #: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "Sentiasa terbang dan bergerak pantas" +msgid "Always fly fast" +msgstr "Sentiasa terbang pantas" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -2225,11 +2495,11 @@ msgstr "Penapisan anisotropik" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "Mengumumkan pelayan permainan" +msgstr "Umumkan pelayan" #: src/settings_translation_file.cpp msgid "Announce to this serverlist." -msgstr "Mengumumkan ke senarai pelayan ini." +msgstr "Umumkan ke senarai pelayan ini." #: src/settings_translation_file.cpp msgid "Append item name" @@ -2276,13 +2546,18 @@ msgstr "" "Pada jarak ini, pelayan akan mengoptimumkan secara agresif blok yang mana\n" "akan dihantar kepada klien.\n" "Nilai lebih kecil berkemungkinan boleh meningkatkan prestasi dengan banyak,\n" -"dengan mengorbankan glic penerjemahan tampak (sesetengah blok tidak akan\n" -"diterjemah di bawah air dan dalam gua, kekadang turut berlaku atas daratan)." -"\n" -"Menetapkan nilai ini lebih bear daripada nilai max_block_send_distance akan\n" -"melumpuhkan pengoptimunan ini.\n" +"dengan mengorbankan glic kemas gabung tampak (sesetengah blok tidak akan\n" +"dikemas gabung di bawah air dan dalam gua, kekadang turut berlaku atas " +"daratan).\n" +"Menetapkan nilai ini lebih besar daripada nilai max_block_send_distance " +"akan\n" +"melumpuhkan pengoptimuman ini.\n" "Nyatakan dalam unit blokpeta (16 nod)." +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "Audio" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Kekunci autopergerakan" @@ -2303,6 +2578,14 @@ msgstr "Autosimpan saiz skrin" msgid "Autoscaling mode" msgstr "Mod skala automatik" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Kekunci Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Kekunci Aux1 untuk memanjat/menurun" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Kekunci ke belakang" @@ -2315,10 +2598,6 @@ msgstr "Aras tanah asas" msgid "Base terrain height." msgstr "Ketinggian rupa bumi asas." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Asas" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Keistimewaan asas" @@ -2340,21 +2619,21 @@ msgid "Bind address" msgstr "Alamat ikatan" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "Parameter suhu API biom dan hingar kelembapan" +msgid "Biome API noise parameters" +msgstr "Parameter hingar API biom" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Hingar biom" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bit per piksel (atau kedalaman warna) dalam mod skrin penuh." - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "Jarak optimum penghantaran blok" +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "Apungan" + #: src/settings_translation_file.cpp msgid "Bold and italic font path" msgstr "Laluan fon tebal dan italik" @@ -2380,8 +2659,8 @@ msgid "Builtin" msgstr "Terbina dalam" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Pemetaan timbul" +msgid "Camera" +msgstr "Kamera" #: src/settings_translation_file.cpp msgid "" @@ -2461,20 +2740,12 @@ msgstr "" "Di mana 0.0 ialah aras cahaya minimum, 1.0 ialah maksimum." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Mengubah antara muka menu utama:\n" -"- Penuh: Banyak dunia pemain perseorangan, pilihan permainan, pek " -"tekstur, dll.\n" -"- Mudah: Satu dunia pemain perseorangan, tiada pilihan permainan atau pek " -"tekstur.\n" -"Mungkin diperlukan untuk skrin yang lebih kecil." +msgid "Chat command time message threshold" +msgstr "Nilai ambang mesej masa perintah sembang" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Perintah sembang" #: src/settings_translation_file.cpp msgid "Chat font size" @@ -2509,8 +2780,8 @@ msgid "Chat toggle key" msgstr "Kekunci togol sembang" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Perintah sembang" +msgid "Chat weblinks" +msgstr "Pautan sesawang sembang" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2528,6 +2799,14 @@ msgstr "Kekunci mod sinematik" msgid "Clean transparent textures" msgstr "Bersihkan tekstur lut sinar" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Pautan sesawang boleh klik (klik-tengah atau Ctrl+klik-kiri) dibolehkan " +"dalam output konsol sembang." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Klien" @@ -2548,6 +2827,10 @@ msgstr "Sekatan mods pihak klien" msgid "Client side node lookup range restriction" msgstr "Sekatan jarak carian nod pihak klien" +#: src/settings_translation_file.cpp +msgid "Client-side Modding" +msgstr "Mods Pihak Klien" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Kelajuan memanjat" @@ -2572,6 +2855,10 @@ msgstr "Awan dalam menu" msgid "Colored fog" msgstr "Kabut berwarna" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Bayang berwarna" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2597,7 +2884,7 @@ 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 "" -"Senarai mods yang dibenarkan mengakses API HTTP dipisahkan dengan koma,\n" +"Senarai mods yang dibenarkan mencapai API HTTP dipisahkan dengan koma,\n" "ini membolehkan mereka memuat naik kepada atau muat turun daripada internet." #: src/settings_translation_file.cpp @@ -2606,13 +2893,37 @@ msgid "" "functions even when mod security is on (via request_insecure_environment())." msgstr "" "Senarai dipisahkan dengan koma untuk mods boleh dipercayai yang dibenarkan " -"mengakses\n" -"fungsi tidak selamat walaupun ketika keselamatan mods diaktifkan (melalui " +"mencapai fungsi\n" +"tidak selamat walaupun ketika keselamatan mods diaktifkan (melalui " "request_insecure_environment())." #: src/settings_translation_file.cpp msgid "Command key" -msgstr "Kekunci arahan" +msgstr "Kekunci perintah" + +#: src/settings_translation_file.cpp +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 "" +"Tahap pemampatan untuk digunakan apabila menyimpan blokpeta ke cakera.\n" +"-1 - guna tahap pemampatan lalai\n" +"0 - pemampatan paling sedikit, paling laju\n" +"9 - pemampatan paling banyak, paling lambat" + +#: src/settings_translation_file.cpp +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 "" +"Tahap pemampatan untuk digunakan apabila menghantar blokpeta kepada klien.\n" +"-1 - guna tahap pemampatan lalai\n" +"0 - pemampatan paling sedikit, paling laju\n" +"9 - pemampatan paling banyak, paling lambat" #: src/settings_translation_file.cpp msgid "Connect glass" @@ -2638,10 +2949,18 @@ msgstr "Warna konsol" msgid "Console height" msgstr "Ketinggian konsol" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "Repositori Kandungan" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "Senarai Hitam Bendera ContentDB" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Muat Turun Serempak Maksimum ContentDB" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "URL ContentDB" @@ -2675,8 +2994,12 @@ msgstr "" "tidak berubah." #: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "Mengawal kelajuan tenggelam dalam cecair." +msgid "" +"Controls sinking speed in liquid when idling. Negative values will cause\n" +"you to rise instead." +msgstr "" +"Mengawal kelajuan tenggelam dalam cecair ketika tidak berbuat apa-apa.\n" +"Nilai negatif akan menyebabkan anda timbul." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." @@ -2709,16 +3032,24 @@ msgid "Crosshair alpha" msgstr "Nilai alfa rerambut silang" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Nilai alfa rerambut silang (kelegapan, antara 0 dan 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Nilai alfa rerambut silang (kelegapan, antara 0 dan 255).\n" +"Nilai ini juga memberi kesan kepada rerambut silang objek." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Warna rerambut silang" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Warna bagi kursor rerambut silang (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Warna rerambut silang (R,G,B).\n" +"Juga mengawal warna rerambut silang objek" #: src/settings_translation_file.cpp msgid "DPI" @@ -2741,13 +3072,12 @@ msgid "Debug log level" msgstr "Tahap log nyahpepijat" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Kekunci perlahankan bunyi" +msgid "Debugging" +msgstr "Nyahpepijat" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" -"Kurangkan nilai untuk meningkatkan rintangan cecair terhadap pergerakan." +msgid "Dec. volume key" +msgstr "Kekunci perlahankan bunyi" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2787,11 +3117,13 @@ msgstr "Saiz tindanan lalai" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Had masa lalai untuk cURL, dinyatakan dalam milisaat.\n" -"Hanya berkesan jika dikompil dengan pilihan cURL." +"Mentakrifkan kualiti penapisan bayang.\n" +"Tetapan ini menyelakukan kesan bayang lembut dengan menggunakan\n" +"PCF atau cakera Poisson tetapi turut menggunakan lebih banyak sumber." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2822,14 +3154,6 @@ msgstr "Mentakrifkan struktur saluran sungai berskala besar." msgid "Defines location and terrain of optional hills and lakes." msgstr "Mentakrifkan kedudukan dan rupa bumi bukit dan tasik pilihan." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Mentakrifkan tahap persampelan tekstur.\n" -"Nilai lebih tinggi menghasilakn peta normal lebih lembut." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Mentakrifkan aras tanah asas." @@ -2891,8 +3215,8 @@ msgid "" "Description of server, to be displayed when players join and in the " "serverlist." msgstr "" -"Perihal pelayan permainan, untuk dipaparkan apabila pemain masuk dan juga " -"dalam senarai pelayan." +"Perihal pelayan, untuk dipaparkan apabila pemain masuk dan juga dalam " +"senarai pelayan." #: src/settings_translation_file.cpp msgid "Desert noise threshold" @@ -2910,6 +3234,14 @@ msgstr "" msgid "Desynchronize block animation" msgstr "Menyahsegerakkan animasi blok" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "Pilihan Pembangun" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Kekunci gali" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Partikel ketika menggali" @@ -2923,10 +3255,21 @@ msgid "Disallow empty passwords" msgstr "Menolak kata laluan kosong" #: src/settings_translation_file.cpp -msgid "Domain name of server, to be displayed in the serverlist." +msgid "Display Density Scaling Factor" +msgstr "Faktor Skala Ketumpatan Paparan" + +#: 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 "" -"Nama domain pelayan permainan, untuk dipaparkan dalam senarai pelayan " -"permainan." +"Jarak dalam nod ketika mana pengisihan kedalaman lut sinar dibolehkan\n" +"Gunakan ini untuk mengehadkan hentaman prestasi akibat pengisihan kedalaman " +"lut sinar" + +#: src/settings_translation_file.cpp +msgid "Domain name of server, to be displayed in the serverlist." +msgstr "Nama domain pelayan, untuk dipaparkan dalam senarai pelayan." #: src/settings_translation_file.cpp msgid "Double tap jump for fly" @@ -2971,20 +3314,43 @@ msgid "" "This support is experimental and API can change." msgstr "" "Membolehkan sokongan pembuatan mods Lua dekat klien.\n" -"Sokongan ini dalam ujikaji dan API boleh berubah." +"Sokongan ini dalam uji kaji dan API boleh berubah." + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Membolehkan penapisan cakera Poisson.\n" +"Jika dibenarkan, gunakan cakera Poisson untuk membuat \"bayang lembut\". " +"Jika tidak, gunakan penapisan PCF." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Membolehkan bayang berwarna. \n" +"Jika dibenarkan, nod lut cahaya mengeluarkan bayang berwarna. Fungsi ini " +"sangat berat." #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Membolehkan tetingkap konsol" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Membolehkan mod kreatif untuk peta baru dicipta." +msgid "Enable creative mode for all players" +msgstr "Membolehkan mod kreatif untuk semua pemain" #: src/settings_translation_file.cpp msgid "Enable joysticks" msgstr "Membolehkan kayu bedik" +#: src/settings_translation_file.cpp +msgid "Enable joysticks. Requires a restart to take effect" +msgstr "Membolehkan kayu bedik. Perlu dimulakan semula untuk mengambil kesan" + #: src/settings_translation_file.cpp msgid "Enable mod channels support." msgstr "Membolehkan sokongan saluran mods." @@ -3001,25 +3367,17 @@ msgstr "Membolehkan pemain menerima kecederaan dan mati." msgid "Enable random user input (only used for testing)." msgstr "Membolehkan input pengguna secara rawak (hanya untuk percubaan)." -#: src/settings_translation_file.cpp -msgid "Enable register confirmation" -msgstr "Bolehkan pengesahan pendaftaran" - -#: src/settings_translation_file.cpp -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" -"Membolehkan pengesahan pendaftaran apabila menyambung kepada pelayan.\n" -"Jika dilumpuhkan, akaun baru akan didaftarkan secara automatik." - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." msgstr "" "Membolehkan pencahayaan lembut dengan oklusi sekitar yang ringkas.\n" -"Lumpuhkannya untuk kelajuan atau untuk kelihatan berbeza." +"Lumpuhkannya untuk kelajuan atau untuk kelihatan berlainan." + +#: src/settings_translation_file.cpp +msgid "Enable split login/register" +msgstr "Membolehkan pemisahan log masuk/daftar" #: src/settings_translation_file.cpp msgid "" @@ -3090,18 +3448,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Membolehkan animasi item dalam inventori." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Membolehkan pemetaan timbul pada tekstur. Peta normal perlu disediakan oleh " -"pek\n" -"tekstur atau perlu dijana secara automatik.\n" -"Perlukan pembayang dibolehkan." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Membolehkan pengagregatan jejaring yang diputar di paksi Y (facedir)." @@ -3110,22 +3456,6 @@ msgstr "Membolehkan pengagregatan jejaring yang diputar di paksi Y (facedir)." msgid "Enables minimap." msgstr "Membolehkan peta mini." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Membolehkan penjanaan peta normal secara layang (Kesan cetak timbul).\n" -"Perlukan pemetaan timbul untuk dibolehkan." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Membolehkan pemetaan oklusi paralaks.\n" -"Memerlukan pembayang untuk dibolehkan." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3138,6 +3468,20 @@ msgstr "" "dan kawalan bunyi dalam permainan tidak akan berfungsi.\n" "Pengubahan tetapan ini memerlukan permulaan semula." +#: 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 "" +"Membolehkan keseimbangan yang mengurangkan muatan CPU atau meningkatkan " +"prestasi kemas gabung\n" +"dengan mengorbankan glic visual yang kecil yang tidak memberi kesan kepada " +"kebolehan bermain permainan." + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "Pembukah enjin" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Selang masa cetak data pemprofilan enjin" @@ -3146,14 +3490,6 @@ msgstr "Selang masa cetak data pemprofilan enjin" msgid "Entity methods" msgstr "Kaedah entiti" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Pilihan percubaan, mungkin menampakkan ruang yang nyata di\n" -"antara blok apabila ditetapkan dengan nombor lebih besar daripada 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3171,8 +3507,12 @@ msgstr "" "bahagian tanah yang lebih rata, sesuai untuk lapisan tanah terapung pejal." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS di menu jeda" +msgid "FPS" +msgstr "FPS" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "Bingkai per saat (FPS) apabila permainan hilang fokus atau dijedakan" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3190,18 +3530,6 @@ msgstr "Faktor apungan kejatuhan" msgid "Fallback font path" msgstr "Laluan fon berbalik" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Bayang fon berbalik" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Nilai alfa bayang fon berbalik" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Saiz fon berbalik" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Kekunci pergerakan pantas" @@ -3220,12 +3548,11 @@ msgstr "Pergerakan pantas" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Bergerak pantas (dengan kekunci \"istimewa\").\n" -"Ini memerlukan keistimewaan \"pergerakan pantas\" dalam pelayan permainan " -"tersebut." +"Bergerak pantas (dengan kekunci \"Aux1\").\n" +"Ini memerlukan keistimewaan \"pergerakan pantas\" di pelayan tersebut." #: src/settings_translation_file.cpp msgid "Field of view" @@ -3241,9 +3568,8 @@ msgid "" "the\n" "Multiplayer Tab." msgstr "" -"Fail dalam laluan client/serverlist/ yang mengandungi senarai pelayan " -"kegemaran\n" -"yang dipaparkan dalam Tab Pemain Ramai." +"Fail dalam laluan client/serverlist/ yang mengandungi senarai\n" +"pelayan kegemaran yang dipaparkan dalam Tab Pemain Ramai." #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3260,9 +3586,9 @@ msgstr "Pemetaan tona sinematik" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Tekstur yang ditapis boleh sebatikan nilai RGB dengan jiran yang lut sinar " "sepenuhnya,\n" @@ -3270,11 +3596,12 @@ msgstr "" "atau\n" "terang pada tekstur lut sinar. Guna penapisan ini untuk membersihkan tekstur " "tersebut\n" -"ketika ia sedang dimuatkan." +"ketika ia sedang dimuatkan. Ini dibolehkan secara automatik jika pemetaan " +"mip dibolehkan." #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Penapisan" +msgid "Filtering and Antialiasing" +msgstr "Tapisan dan Antialias" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3341,6 +3668,10 @@ msgstr "Mula Kabut" msgid "Fog toggle key" msgstr "Kekunci togol kabut" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "Fon" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "Fon tebal secara lalainya" @@ -3362,16 +3693,16 @@ msgid "Font size" msgstr "Saiz fon" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "Saiz fon bagi fon lalai dalan unit poin (pt)." +msgid "Font size divisible by" +msgstr "Saiz fon boleh dibahagikan dengan" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Saiz fon bagi fon berbalik dalam unit poin (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Saiz fon bagi fon lalai di mana 1 unit = 1 piksel pada 96 DPI" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "Saiz fon bagi fon monospace dalam unit poin (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Saiz fon bagi fon monospace di mana 1 unit = 1 piksel pada 96 DPI" #: src/settings_translation_file.cpp msgid "" @@ -3381,6 +3712,25 @@ msgstr "" "Saiz fon tulisan sembang baru-baru ini dan prom dalam unit titik (pt).\n" "Nilai 0 akan menggunakan saiz fon lalai." +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"Untuk fon gaya piksel yang tidak boleh disesuaikan dengan baik, tetapan ini " +"memastikan saiz fon\n" +"yang digunakan dengan fon ini akan sentiasa boleh dibahagikan dengan nilai " +"ini, dalam piksel.\n" +"Contohnya, sebuah fon piksel dengan tinggi 16 piksel patut tetapkan tetapan " +"ini menjadi 16, supaya\n" +"ia hanya guna saiz 16, 32, 48, dll., jadi jika mods meminta fon bersaiz 25 " +"maka ia akan dapat saiz 32." + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3444,11 +3794,7 @@ msgstr "Jenis fraktal" #: src/settings_translation_file.cpp msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "Bahagian daripada jarak boleh lihat di mana kabut mula dijana" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Fon FreeType" +msgstr "Bahagian daripada jarak boleh lihat di mana kabut mula dikemas gabung" #: src/settings_translation_file.cpp msgid "" @@ -3487,10 +3833,6 @@ msgstr "" msgid "Full screen" msgstr "Skrin penuh" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "BPP skrin penuh" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Mod skrin penuh." @@ -3508,8 +3850,16 @@ msgid "GUI scaling filter txr2img" msgstr "Penapis skala GUI txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Jana peta normal" +msgid "GUIs" +msgstr "GUI" + +#: src/settings_translation_file.cpp +msgid "Gamepads" +msgstr "Pad permainan" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "Umum" #: src/settings_translation_file.cpp msgid "Global callbacks" @@ -3519,10 +3869,10 @@ msgstr "Panggil balik sejagat" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Atribut penjanaan peta sejagat.\n" -"Dalam janapeta v6, bendera 'decorations' mengawal semua hiasan kecuali " +"Dalam Janapeta v6, bendera 'decorations' mengawal semua hiasan kecuali " "pokok\n" "dan rumput hutan, dalam janapeta lain pula bendera ini mengawal semua hiasan." @@ -3546,6 +3896,14 @@ msgstr "" msgid "Graphics" msgstr "Grafik" +#: src/settings_translation_file.cpp +msgid "Graphics Effects" +msgstr "Kesan Grafik" + +#: src/settings_translation_file.cpp +msgid "Graphics and Audio" +msgstr "Grafik dan Audio" + #: src/settings_translation_file.cpp msgid "Gravity" msgstr "Graviti" @@ -3563,8 +3921,12 @@ msgid "HTTP mods" msgstr "Mods HTTP" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "Faktor skala papar pandu (HUD)" +msgid "HUD" +msgstr "Papar Pandu (HUD)" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "Skala papar pandu (HUD)" #: src/settings_translation_file.cpp msgid "HUD toggle key" @@ -3573,16 +3935,15 @@ msgstr "Kekunci menogol papar pandu (HUD)" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Cara pengendalian panggilan API Lua yang terkecam:\n" -"- legacy: (cuba untuk) meniru tingkah laku yang lama (lalai untuk " -"terbitan).\n" -"- log: meniru dan menulis log runut balik kesemua panggilan terkecam " -"(lalai untuk nyahpepijat).\n" -"- error: gugurkan penggunaan panggilan terkecam (dicadangkan untuk " +"- none: Jangan log panggilan terkecam\n" +"- log: meniru dan menulis log runut balik bagi panggilan terkecam " +"(lalai).\n" +"- error: gugurkan penggunaan panggilan terkecam (digalakkan untuk " "pembangun mods)." #: src/settings_translation_file.cpp @@ -3608,8 +3969,9 @@ msgid "Heat noise" msgstr "Hingar haba" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Komponen tinggi saiz tetingkap awal." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "Komponen tinggi saiz tetingkap awal. Diabaikan dalam mod skrin penuh." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3619,10 +3981,6 @@ msgstr "Hingar ketinggian" msgid "Height select noise" msgstr "Hingar pilihan ketinggian" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Unit titik terapung (FPU) ketepatan tinggi" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Kecuraman bukit" @@ -3649,9 +4007,7 @@ msgstr "Hingar kebukitan4" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." -msgstr "" -"Laman utama pelayan permainan, untuk dipaparkan dalam senarai pelayan " -"permainan." +msgstr "Laman utama pelayan, untuk dipaparkan dalam senarai pelayan." #: src/settings_translation_file.cpp msgid "" @@ -3823,19 +4179,28 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" -"Secepat mana gelora cecair akan bergerak. Nilai tinggi = lebih laju.\n" +"Secepat mana gelora cecair akan bergerak. Nilai tinggi = lebih cepat.\n" "Jika nilai negatif, gelora cecair akan bergerak ke belakang.\n" "Memerlukan tetapan cecair bergelora dibolehkan." #: 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 "" "Berapa lama pelayan akan tunggu sebelum menyahmuat blokpeta yang tidak " -"digunakan.\n" +"digunakan, dinyatakan dalam saat.\n" "Nilai lebih tinggi lebih lembut, tetapi akan menggunakan lebih banyak 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 "" +"Berapa banyak anda diperlahankan ketika bergerak di dalam cecair.\n" +"Kurangkan nilai untuk meningkatkan rintangan cecair terhadap pergerakan." + #: src/settings_translation_file.cpp msgid "How wide to make rivers." msgstr "Keluasan pembuatan sungai." @@ -3871,11 +4236,10 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Jika dilumpuhkan, kekunci \"istimewa\" akan digunakan untuk terbang laju\n" +"Jika dilumpuhkan, kekunci \"Aux1\" akan digunakan untuk terbang laju\n" "sekiranya kedua-dua mod terbang dan mod pergerakan pantas dibolehkan." #: src/settings_translation_file.cpp @@ -3899,17 +4263,25 @@ msgid "" msgstr "" "Jika dibolehkan bersama mod terbang, pemain boleh terbang menerusi nod " "pepejal.\n" -"Ini memerlukan keistimewaan \"tembus blok\" dalam pelayan permainan tersebut." +"Ini memerlukan keistimewaan \"tembus blok\" dalam pelayan tersebut." #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Jika dibolehkan, kekunci \"istimewa\" akan digunakan untuk panjat ke bawah " -"dan\n" -"turun dalam mod terbang, menggantikan kekunci \"selinap\"." +"Jika dibolehkan, kekunci \"Aux1\" akan digunakan untuk panjat ke bawah dan\n" +"turun dalam mod terbang, menggantikan kekunci \"Selinap\"." + +#: 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 "" +"Jika dibolehkan, pendaftaran akaun dipisahkan dari log masuk dalam UI.\n" +"Jika dilumpuhkan, akaun baharu akan didaftarkan secara automatik ketika log " +"masuk." #: src/settings_translation_file.cpp msgid "" @@ -3942,10 +4314,12 @@ msgstr "" "apabila terbang atau berenang." #: 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 "" -"Jika dibolehkan, pemain-pemain baru tidak boleh masuk dengan kata laluan " -"yang kosong." +"Jika dibolehkan, pemain tidak boleh sertai tanpa kata laluan atau tukar " +"kepada kata laluan yang kosong." #: src/settings_translation_file.cpp msgid "" @@ -3966,6 +4340,16 @@ msgstr "" "Jika sekatan CSM untuk jarak nod dibolehkan, panggulan get_node akan\n" "dihadkan ke jarak ini daripada pemain kepada nod." +#: 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 "" +"Jika pelaksanaan sesuatu perintah sembang mengambil masa lebih lama daripada " +"yang\n" +"dinyatakan di sini dalam unit saat, tambah maklumat masa ke mesej perintah " +"sembang" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3981,21 +4365,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." msgstr "" -"Jika tetapan ini ditetapkan, pemain akan sentiasa dilahirkan (semula) dekat " +"Jika tetapan ini ditetapkan, pemain akan sentiasa jelma (semula) dekat " "kedudukan yang diberikan." #: src/settings_translation_file.cpp msgid "Ignore world errors" msgstr "Abaikan ralat 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 "" -"Nilai alfa latar belakang konsol sembang dalam permainan (kelehapan, antara " +"Nilai alfa latar belakang konsol sembang dalam permainan (kelegapan, antara " "0 dan 255)." #: src/settings_translation_file.cpp @@ -4025,7 +4405,7 @@ msgstr "" "Ini selalunya hanya diperlukan oleh penyumbang teras/terbina dalam" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "Memasang perintah sembang ketika pendaftaran." #: src/settings_translation_file.cpp @@ -4050,10 +4430,6 @@ msgstr "Memasang fungsi perbuatan Pengubah Blok Pemuatan ketika pendaftaran." msgid "Instrument the methods of entities on registration." msgstr "Memasang kaedah entiti ketika pendaftaran." -#: 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 "" @@ -4061,8 +4437,10 @@ msgstr "" "dalam unit saat." #: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." -msgstr "Selang di antara penghantaran maklumat masa pelayan kepada klien." +msgid "Interval of sending time of day to clients, stated in seconds." +msgstr "" +"Selang di antara penghantaran maklumat waktu dalam hari kepada klien, " +"dinyatakan dalam saat." #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -4116,6 +4494,10 @@ msgstr "ID Kayu Bedik" msgid "Joystick button repetition interval" msgstr "Selang masa pengulangan butang kayu bedik" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Zon mati kayu bedik" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Kepekaan frustum kayu bedik" @@ -4132,8 +4514,8 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" -"Set julia sahaja.\n" -"Komponen W tetapan hiperkompleks.\n" +"Set Julia sahaja.\n" +"Komponen W buat pemalar hiperkompleks.\n" "Mengubah bentuk fraktal.\n" "Tiada kesan terhadap fraktal 3D.\n" "Julat kasarnya -2 hingga 2." @@ -4145,8 +4527,8 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Set julia sahaja.\n" -"Komponen X tetapan hiperkompleks.\n" +"Set Julia sahaja.\n" +"Komponen X buat pemalar hiperkompleks.\n" "Mengubah bentuk fraktal.\n" "Julat kasarnya -2 hingga 2." @@ -4157,8 +4539,8 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Set julia sahaja.\n" -"Komponen Y tetapan hiperkompleks.\n" +"Set Julia sahaja.\n" +"Komponen Y buat pemalar hiperkompleks.\n" "Mengubah bentuk fraktal.\n" "Julat kasarnya -2 hingga 2." @@ -4169,26 +4551,26 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Set julia sahaja.\n" -"Komponen Z tetapan hiperkompleks.\n" +"Set Julia sahaja.\n" +"Komponen Z buat pemalar hiperkompleks.\n" "Mengubah bentuk fraktal.\n" "Julat kasarnya -2 hingga 2." #: src/settings_translation_file.cpp msgid "Julia w" -msgstr "W julia" +msgstr "W Julia" #: src/settings_translation_file.cpp msgid "Julia x" -msgstr "X julia" +msgstr "X Julia" #: src/settings_translation_file.cpp msgid "Julia y" -msgstr "Y julia" +msgstr "Y Julia" #: src/settings_translation_file.cpp msgid "Julia z" -msgstr "Z julia" +msgstr "Z Julia" #: src/settings_translation_file.cpp msgid "Jump key" @@ -4218,6 +4600,16 @@ msgstr "" "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk menggali.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4326,7 +4718,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Kekunci untuk membuka tetingkap sembang untuk menaip arahan.\n" +"Kekunci untuk membuka tetingkap sembang untuk menaip perintah.\n" "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4336,7 +4728,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Kekunci untuk membuka tetingkap sembang untuk menaip arahan tempatan.\n" +"Kekunci untuk membuka tetingkap sembang untuk menaip perintah tempatan.\n" "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4360,6 +4752,16 @@ msgstr "" "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kekunci untuk meletak.\n" +"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4895,6 +5297,10 @@ msgstr "" "Lihat http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "Keyboard and Mouse" +msgstr "Papan Kekunci dan Tetikus" + #: src/settings_translation_file.cpp msgid "Kick players who sent more than X messages per 10 seconds." msgstr "Tendang pemain yang menghantar mesej lebih daripada X setiap 10 saat." @@ -4943,7 +5349,7 @@ msgid "" "- Opaque: disable transparency" msgstr "" "Gaya daun:\n" -"- Beragam: semua susu kelihatan\n" +"- Beragam: semua sisi kelihatan\n" "- Ringkas: hanya sisi luar kelihatan, jika special_tiles yang ditentukan " "digunakan\n" "- Legap: melumpuhkan lut sinar" @@ -4956,11 +5362,11 @@ msgstr "Kekunci ke kiri" msgid "" "Length of a server tick and the interval at which objects are generally " "updated over\n" -"network." +"network, stated in seconds." msgstr "" "Panjang setiap detik pelayan dan selang masa ketika mana objek-objek " "selalunya\n" -"dikemaskini menerusi rangkaian." +"dikemaskini menerusi rangkaian, dinyatakan dalam saat." #: src/settings_translation_file.cpp msgid "" @@ -4971,16 +5377,23 @@ msgstr "" "Memerlukan tetapan cecair bergelora dibolehkan." #: src/settings_translation_file.cpp -msgid "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "Panjang masa di antara kitaran pelaksanaan Pengubah Blok Aktif (ABM)" +msgid "" +"Length of time between Active Block Modifier (ABM) execution cycles, stated " +"in seconds." +msgstr "" +"Panjang masa di antara kitaran pelaksanaan Pengubah Blok Aktif (ABM), " +"dinyatakan dalam saat." #: src/settings_translation_file.cpp -msgid "Length of time between NodeTimer execution cycles" -msgstr "Jumlah masa selangan di antara kitaran pelaksanaan NodeTimer" +msgid "Length of time between NodeTimer execution cycles, stated in seconds." +msgstr "" +"Panjang masa di antara kitaran pelaksanaan PemasaNod, dinyatakan dalam saat." #: src/settings_translation_file.cpp -msgid "Length of time between active block management cycles" -msgstr "Panjang masa di antara setiap kitaran pengurusan blok aktif" +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" +"Panjang masa di antara kitaran pengurusan blok aktif, dinyatakan dalam saat." #: src/settings_translation_file.cpp msgid "" @@ -4991,16 +5404,18 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" -"Tahap pengelogan untuk ditulis kepada fail debug.txt:\n" +"Tahap pengelogan untuk ditulis ke fail debug.txt:\n" "- <tidak ada apa-apa> (tidak mengelog)\n" -"- tiada (mesej tanpa tahap)\n" -"- ralat\n" -"- amaran\n" -"- perbuatan\n" -"- maklumat\n" -"- berjela-jela" +"- none: tiada (mesej tanpa tahap)\n" +"- error: ralat\n" +"- warning: amaran\n" +"- action: perbuatan\n" +"- info: maklumat\n" +"- verbose: berjela-jela\n" +"- trace: jejak" #: src/settings_translation_file.cpp msgid "Light curve boost" @@ -5026,6 +5441,10 @@ msgstr "Kecerunan tinggi lengkung cahaya" msgid "Light curve low gradient" msgstr "Kecerunan rendah lengkung cahaya" +#: src/settings_translation_file.cpp +msgid "Lighting" +msgstr "Pencahayaan" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -5090,7 +5509,7 @@ msgid "" "Useful for mod developers and server operators." msgstr "" "Memuatkan pembukah permainan untuk mengutip data pemprofilan permainan.\n" -"Menyediakan perintah /profiler untuk mengakses profil yang dikompil.\n" +"Menyediakan perintah /profiler untuk mencapai profil yang dikompil.\n" "Berguna untuk pembangun mods dan pengendali pelayan." #: src/settings_translation_file.cpp @@ -5109,10 +5528,6 @@ msgstr "Had Y bawah tanah terapung." msgid "Main menu script" msgstr "Skrip menu utama" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Gaya menu utama" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5120,15 +5535,18 @@ msgstr "" "Buatkan warna kabut dan langit bergantung kepada waktu (fajar/matahari " "terbenam) dan arah pandang." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"Membuatkan DirectX bekerja dengan LuaJIT. Lumpuhkan tetapan jika bermasalah." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Buatkan semua cecair menjadi legap" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Tahap Pemampatan Peta untuk Simpanan Cakera" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Tahap Pemampatan Peta untuk Pemindahan Rangkaian" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Direktori peta" @@ -5207,6 +5625,10 @@ msgstr "Had penjanaan peta" msgid "Map save interval" msgstr "Selang masa penyimpanan peta" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Bingkai kemas kini bayang peta" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Had blok peta" @@ -5312,8 +5734,14 @@ msgid "Maximum FPS" msgstr "FPS maksima" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Bingkai per saat (FPS) maksima apabila permainan dijedakan." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"Bingkai per saat (FPS) maksimum apabila tetingkap tidak difokuskan, atau " +"apabila permainan dijedakan." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Jarak maksimum untuk mengemas gabung bayang." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5351,14 +5779,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." -msgstr "Jumlah maksimum blok yang boleh dibaris gilirkan untuk dimuatkan." +msgstr "Jumlah maksimum blok yang boleh menunggu giliran untuk dimuatkan." #: 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 "" -"Jumlah maksimum blok untuk dibarisgilirkan untuk dijana.\n" +"Jumlah maksimum blok untuk menunggu giliran untuk dijana.\n" "Had ini dikuatkuasakan per pemain." #: src/settings_translation_file.cpp @@ -5366,9 +5794,19 @@ msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" -"Jumlah maksimum blok untuk dibarisgilirkan untuk dimuatkan daripada fail.\n" +"Jumlah maksimum blok untuk menunggu giliran untuk dimuatkan daripada fail.\n" "Had ini dikuatkuasakan per pemain." +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Jumlah maksimum muat turun serempak. Muat turun melebihi had ini akan " +"ditunggu giliran.\n" +"Ini mestilah lebih rendah dari curl_parallel_limit." + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "Jumlah maksimum blokpeta yang dipaksa muat." @@ -5378,7 +5816,7 @@ msgid "" "Maximum number of mapblocks for client to be kept in memory.\n" "Set to -1 for unlimited amount." msgstr "" -"Jumlah peta blok maksima yang klien boleh simpan dalam memori.\n" +"Jumlah blok peta maksimum yang klien boleh simpan dalam ingatan.\n" "Tetapkan kepada -1 untuk jumlah tanpa had." #: src/settings_translation_file.cpp @@ -5434,18 +5872,25 @@ msgstr "" "had." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Masa maksimum dalam unit ms untuk muat turun fail (cth. muat turun mods)." +"Masa maksimum yang dibenarkan untuk muat turun fail (cth. muat turun mods), " +"dalam unit milisaat." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Masa maksimum yang dibenarkan untuk permintaan saling tindak (cth. mengambil " +"senarai pelayan), dalam unit milisaat." #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "Had jumlah pengguna" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Menu" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "Cache jejaring" @@ -5494,13 +5939,25 @@ msgstr "Saiz tekstur minimum" msgid "Mipmapping" msgstr "Pemetaan Mip" +#: src/settings_translation_file.cpp +msgid "Misc" +msgstr "Lain-lain" + +#: src/settings_translation_file.cpp +msgid "Mod Profiler" +msgstr "Pembukah Mods" + +#: src/settings_translation_file.cpp +msgid "Mod Security" +msgstr "Keselamatan Mods" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "Saluran mods" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "Mengubah saiz elemen palang papar pandu (hudbar)." +msgid "Modifies the size of the HUD elements." +msgstr "Mengubah saiz elemen papar pandu (HUD)." #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5510,6 +5967,10 @@ msgstr "Laluan fon monospace" msgid "Monospace font size" msgstr "Saiz fon monospace" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Saiz fon monospace boleh dibahagikan dengan" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Hingar ketinggian gunung" @@ -5582,17 +6043,13 @@ msgstr "" msgid "" "Name of the server, to be displayed when players join and in the serverlist." msgstr "" -"Nama pelayan permainan, untuk dipaparkan apabila pemain masuk dan juga dalam " -"senarai pelayan." +"Nama pelayan, untuk dipaparkan apabila pemain masuk dan juga dalam senarai " +"pelayan." #: src/settings_translation_file.cpp msgid "Near plane" msgstr "Dekat satah" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Rangkaian" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5601,6 +6058,10 @@ msgstr "" "Port rangkaian untuk dengar (UDP).\n" "Nilai ini akan diatasi apabila memulakan pelayan dari menu utama." +#: src/settings_translation_file.cpp +msgid "Networking" +msgstr "Rangkaian" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "Pengguna baru mesti memasukkan kata laluan ini." @@ -5613,6 +6074,10 @@ msgstr "Tembus blok" msgid "Noclip key" msgstr "Kekunci tembus blok" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "Tonjolan Nod dan Entiti" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "Tonjolan nod" @@ -5625,17 +6090,9 @@ msgstr "Selang masa NodeTimer" msgid "Noises" msgstr "Hingar" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Persampelan peta normal" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Kekuatan peta normal" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" -msgstr "Jumlah jalur keluar" +msgstr "Jumlah jalur timbul" #: src/settings_translation_file.cpp msgid "" @@ -5668,21 +6125,13 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Jumlah blok-blok tambahan yang boleh dimuatkan oleh /clearobjects pada " "sesuatu masa.\n" -"Ini merupakan keseimbangan antara overhed urus niaga sqlite\n" -"dan penggunaan memori (Kebiasaannya, 4096=100MB)." - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Jumlah lelaran oklusi paralaks." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Repositori Kandungan Dalam Talian" +"Ini merupakan keseimbangan antara overhed urus niaga SQLite\n" +"dan penggunaan ingatan (4096=100MB, mengikut kebiasaan)." #: src/settings_translation_file.cpp msgid "Opaque liquids" @@ -5693,11 +6142,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "Kelegapan (alfa) bayang belakang fon lalai, nilai antara 0 dan 255." -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "Kelegapan (alfa) bayang belakang fon berbalik, nilai antara 0 dan 255." - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5708,46 +6152,16 @@ msgstr "" "Tidak jeda jika formspec dibuka." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" -"Pengaruh kesan oklusi paralaks pada keseluruhannya, kebiasaannya skala/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Skala keseluruhan kesan oklusi paralaks." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Oklusi paralaks" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Pengaruh oklusi paralaks" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Lelaran oklusi paralaks" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Mod oklusi paralaks" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Skala oklusi paralaks" +msgid "Optional override for chat weblink color." +msgstr "Pilihan mengatasi warna pautan sesawang di sembang." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" -"Laluan fon berbalik.\n" -"Jika tetapan “freetype” dibolehkan: Ia mestilah fon TrueType.\n" -"Jika tetapan “freetype” dilumpuhkan: Ia mestilah fon peta bit atau vektor " -"XML.\n" +"Laluan fon berbalik. Mestilah sebuah fon jenis TrueType.\n" "Fon ini akan digunakan bagi sesetengah bahasa atau jika fon lalai tidak " "tersedia." @@ -5773,29 +6187,19 @@ msgstr "Laluan ke direktori tekstur. Semua tekstur dicari dari sini dahulu." #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" -"Laluan fon lalai.\n" -"Jika tetapan “freetype” dibolehkan: Ia mestilah fon TrueType.\n" -"Jika tetapan “freetype” dilumpuhkan: Ia mestilah fon peta bit atau vektor " -"XML.\n" +"Laluan fon lalai. Mestilah sebuah fon jenis TrueType.\n" "Fon berbalik akan digunakan sekiranya fon ini tidak dapat dimuatkan." #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" -"Laluan fon monospace.\n" -"Jika tetapan “freetype” dibolehkan: Ia mestilah fon TrueType.\n" -"Jika tetapan “freetype” dilumpuhkan: Ia mestilah fon peta bit atau vektor " -"XML.\n" -"Fon ini digunakan untuk unsur spt. konsol dan skrin pembukah." +"Laluan fon monospace. Mestilah sebuah fon jenis TrueType.\n" +"Fon ini digunakan untuk perkara spt. konsol dan skrin pembukah." #: src/settings_translation_file.cpp msgid "Pause on lost window focus" @@ -5821,17 +6225,21 @@ msgstr "Kekunci pergerakan pic" msgid "Pitch move mode" msgstr "Mod pergerakan pic" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Kekunci letak" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Selang pengulangan perbuatan letak" + #: 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 "" "Pemain boleh terbang tanpa terkesan dengan graviti.\n" -"Ini memerlukan keistimewaan \"terbang\" dalam pelayan permainan tersebut." - -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Nama pemain" +"Ini memerlukan keistimewaan \"terbang\" dalam pelayan tersebut." #: src/settings_translation_file.cpp msgid "Player transfer distance" @@ -5841,6 +6249,10 @@ msgstr "Jarak pemindahan pemain" msgid "Player versus player" msgstr "Pemain lawan pemain" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Penapisan poisson" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5887,10 +6299,6 @@ msgstr "Pembukah" msgid "Profiler toggle key" msgstr "Kekunci togol pembukah" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Pemprofilan" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "Alamat pendengar Prometheus" @@ -5898,12 +6306,12 @@ msgstr "Alamat pendengar Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" "Alamat pendengar Prometheus.\n" -"Jika minetest dikompil dengan tetapan ENABLE_PROMETHEUS dibolehkan,\n" +"Jika Minetest dikompil dengan pilihan ENABLE_PROMETHEUS dibolehkan,\n" "membolehkan pendengar metrik untuk Prometheus pada alamat berkenaan.\n" "Metrik boleh diambil di http://127.0.0.1:30000/metrics" @@ -5979,7 +6387,7 @@ msgid "" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" -"Hadkan akses sesetengah fungsi pihak klien di pelayan.\n" +"Hadkan capaian sesetengah fungsi pihak klien di pelayan.\n" "Gabungkan bendera bait di bawah ini untuk mengehadkan ciri-ciri pihak klien, " "atau\n" "tetapkan kepada 0 untuk tiada had:\n" @@ -6011,10 +6419,6 @@ msgstr "Hingar saiz gunung rabung" msgid "Right key" msgstr "Kekunci ke kanan" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Selang pengulangan klik kanan" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Kedalaman saluran sungai" @@ -6073,7 +6477,7 @@ msgstr "Simpan saiz tetingkap secara automatik ketika diubah." #: src/settings_translation_file.cpp msgid "Saving map received from server" -msgstr "Simpan peta diterima dari pelayan permainan" +msgstr "Simpan peta diterima dari pelayan" #: src/settings_translation_file.cpp msgid "" @@ -6089,6 +6493,10 @@ msgstr "" "menyesuaiturunkan, namun ia akan mengaburkan sesetengah piksel\n" "di sisi apabila imej disesuaikan dengan saiz bukan integer." +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "Skrin" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Tinggi skrin" @@ -6119,6 +6527,10 @@ msgstr "" "1 maksudnya paling teruk; 100 maksudnya paling bagus.\n" "Gunakan 0 untuk kualiti lalai." +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "Tangkap layar" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "Hingar dasar laut" @@ -6133,10 +6545,6 @@ msgstr "" msgid "Second of two 3D noises that together define tunnels." msgstr "Hingar 3D kedua daripada dua yang mentakrifkan terowong." -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "Keselamatan" - #: src/settings_translation_file.cpp msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Lihat http://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6184,7 +6592,7 @@ msgstr "" "6 = Set Julia \"Sepupu Mandy\" 4D.\n" "7 = Set Mandelbrot \"Variasi\" 4D.\n" "8 = Set Julia \"Variasi\" 4D.\n" -"9 = Set Mandelbrot \"Mandelbrot/Mandelbar\" 3D.\n" +"9 = Set Mandelbrot jenis \"Mandelbrot/Mandelbar\" 3D.\n" "10 = Set Julia \"Mandelbrot/Mandelbar\" 3D.\n" "11 = Set Mandelbrot \"Pokok Krismas\" 3D.\n" "12 = Set Julia \"Pokok Krismas\" 3D.\n" @@ -6196,37 +6604,53 @@ msgstr "" "18 = Set Julia \"Mandelbulb\" 4D." #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Pelayan permainan / Pemain perseorangan" +msgid "Server" +msgstr "Pelayan" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "Gaya Main Pelayan" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "Keselamatan Pelayan" #: src/settings_translation_file.cpp msgid "Server URL" -msgstr "URL pelayan permainan" +msgstr "URL pelayan" #: src/settings_translation_file.cpp msgid "Server address" -msgstr "Alamat pelayan permainan" +msgstr "Alamat pelayan" #: src/settings_translation_file.cpp msgid "Server description" -msgstr "Perihal pelayan permainan" +msgstr "Perihal pelayan" #: src/settings_translation_file.cpp msgid "Server name" -msgstr "Nama pelayan permainan" +msgstr "Nama pelayan" #: src/settings_translation_file.cpp msgid "Server port" -msgstr "Port pelayan permainan" +msgstr "Port pelayan" #: src/settings_translation_file.cpp msgid "Server side occlusion culling" msgstr "Penakaian oklusi pihak pelayan" +#: src/settings_translation_file.cpp +msgid "Server/Env Performance" +msgstr "Prestasi Pelayan/Persekitaran" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL senarai pelayan" +#: src/settings_translation_file.cpp +msgid "Serverlist and MOTD" +msgstr "Senarai Pelayan dan Mesej Harian" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Fail senarai pelayan" @@ -6240,8 +6664,51 @@ msgstr "" "Sebuah mula semula diperlukan selepas menukar tetapan ini." #: src/settings_translation_file.cpp -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "Tetapkan panjang aksara maksimum mesej sembang dihantar oleh klien." +msgid "" +"Set the maximum length of a chat message (in characters) sent by clients." +msgstr "" +"Menetapkan panjang maksimum mesej sembang (dalam jumlah aksara) yang " +"dihantar oleh klien." + +#: src/settings_translation_file.cpp +msgid "" +"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 "" +"Menetapkan gama kekuatan bayang.\n" +"Melaraskan keamatan bayang dinamik dalam permainan.\n" +"Nilai lebih rendah untuk bayang lebih terang, nilai lebih tinggi untuk " +"bayang lebih gelap." + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"Menetapkan saiz jejari bayang lembut.\n" +"Nilai lebih rendah untuk bayang lebih tajam, nilai lebih tinggi untuk bayang " +"lebih lembut.\n" +"Nilai minimum: 1.0; nilai maksimum: 15.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Menetapkan kecondongan orbit Matahari/Bulan dalam unit darjah.\n" +"Nilai 0 untuk tidak condong / tiada orbit menegak.\n" +"Nilai minimum: 0.0; nilai maksimum: 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Tetapkan kepada \"true\" untuk membolehkan Pemetaan Bayang.\n" +"Memerlukan pembayang untuk dibolehkan." #: src/settings_translation_file.cpp msgid "" @@ -6256,17 +6723,27 @@ msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"Tetapkan ke \"true\" untuk membolehkan cecair bergelora (macam air).\n" -"Memerlukan pembayang dibolehkan." +"Tetapkan kepada \"true\" untuk membolehkan cecair bergelora (macam air).\n" +"Memerlukan pembayang untuk dibolehkan." #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving plants.\n" "Requires shaders to be enabled." msgstr "" -"Tetapkan ke \"true\" untuk membolehkan tumbuhan bergoyang.\n" +"Tetapkan kepada \"true\" untuk membolehkan tumbuhan bergoyang.\n" "Memerlukan pembayang untuk dibolehkan." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Menetapkan kualiti tekstur bayang kepada 32 bit.\n" +"Jika tetapkan kepada \"false\", tekstur 16 bit akan digunakan.\n" +"Tetapan ini boleh menyebabkan lebih banyak artifak pada bayang." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Laluan pembayang" @@ -6282,6 +6759,23 @@ msgstr "" "untuk sesetengah kad video.\n" "Namun ia hanya berfungsi dengan pembahagian belakang video OpenGL." +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "Kualiti penapisan bayang" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" +"Jarak maksimum peta bayang untuk mengemas gabung bayang, dalam unit nod" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "Tekstur peta bayang dalam 32 bit" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Saiz tekstur peta bayang" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6291,12 +6785,8 @@ msgstr "" "dilukis." #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"Ofset bayang fon berbalik (dalam unit piksel). Jika 0, maka bayang tidak " -"akan dilukis." +msgid "Shadow strength gamma" +msgstr "Gama kekuatan bayang" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6310,6 +6800,18 @@ msgstr "Tunjukkan maklumat nyahpepijat" msgid "Show entity selection boxes" msgstr "Tunjukkan kotak pemilihan entiti" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Tunjuk kotak pemilihan entiti\n" +"Anda perlu mulakan semula selepas mengubah tetapan ini." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Tunjuk latar belakang tag nama secara lalainya" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Mesej penutupan" @@ -6340,6 +6842,10 @@ msgstr "" "meningkatkan jumlah % hit cache, mengurangkan data yang perlu disalin\n" "daripada jalur utama, lalu mengurangkan ketaran." +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Kecondongan Orbit Badan Angkasa" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "Hirisan w" @@ -6400,18 +6906,14 @@ msgstr "Kelajuan menyelinap" msgid "Sneaking speed, in nodes per second." msgstr "Kelajuan menyelinap, dalam unit nod per saat." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Jejari bayang lembut" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Bunyi" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Kekunci istimewa" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Kekunci untuk memanjat/menurun" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6420,7 +6922,7 @@ msgid "" "Files that are not present will be fetched the usual way." msgstr "" "Menetapkan URL dari mana klien mengambil media, menggantikan UDP.\n" -"$filename mestilah boleh diakses daripada $remote_media$filename melalui\n" +"$filename mestilah boleh dicapai daripada $remote_media$filename melalui\n" "cURL (sudah tentu, remote_media mesti berakhir dengan tanda condong).\n" "Fail yang tidak wujud akan diambil dengan cara biasa." @@ -6434,6 +6936,18 @@ msgstr "" "Ambil perhatian bahawa mods atau permainan boleh tetapkan secara khusus " "tindanan untuk sesetengah (atau semua) item." +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Sebar kemas kini lengkap peta bayang merentasi jumlah bingkai yang diberi.\n" +"Nilai lebih tinggi mungkin membuatkan bayang lembap bertindak balas,\n" +"nilai lebih rendah akan memakan lebih banyak sumber.\n" +"Nilai minimum: 1; nilai maksimum: 16" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6446,7 +6960,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Static spawnpoint" -msgstr "Titik lahir statik" +msgstr "Titik jelma statik" #: src/settings_translation_file.cpp msgid "Steepness noise" @@ -6464,10 +6978,6 @@ msgstr "Hingar sebar gunung curam" msgid "Strength of 3D mode parallax." msgstr "Kekuatan paralaks mod 3D." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Kekuatan peta normal yang dijana." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6480,7 +6990,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Strict protocol checking" -msgstr "Pemeriksaan protokal ketat" +msgstr "Pemeriksaan protokol ketat" #: src/settings_translation_file.cpp msgid "Strip color codes" @@ -6525,6 +7035,10 @@ msgstr "SQLite segerak" msgid "Temperature variation for biomes." msgstr "Variasi suhu untuk biom." +#: src/settings_translation_file.cpp +msgid "Temporary Settings" +msgstr "Tetapan Sementara" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "Hingar rupa bumi alternatif" @@ -6563,7 +7077,7 @@ msgid "" msgstr "" "Nilai ambang hingar rupa bumi untuk tasik.\n" "Mengawal perkadaran untuk kawasan dunia dilitupi laut.\n" -"Laras menjadi 0.0 untuk perkadaran yang lebih besar." +"Laraskan kepada 0.0 untuk perkadaran yang lebih besar." #: src/settings_translation_file.cpp msgid "Terrain persistence noise" @@ -6573,6 +7087,16 @@ msgstr "Hingar penerusan rupa bumi" msgid "Texture path" msgstr "Laluan tekstur" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Saiz tekstur yang akan digunakan untuk mengemas gabung peta bayang.\n" +"Nilai ini mestilah hasil kuasa dua.\n" +"Nombor lebih besar mencipta bayang lebih baik tetapi ia juga lebih berat." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6590,12 +7114,16 @@ msgstr "" "pelayan lama,\n" "pilihan ini membolehkan pemaksaan ia untuk jenis nod tertentu. Ambil " "perhatian\n" -"bahawa ianya dianggap DALAM UJIKAJI dan mungkin tidak berfungsi dengan betul." +"bahawa ia dianggap DALAM UJI KAJI dan mungkin tidak berfungsi dengan betul." #: src/settings_translation_file.cpp msgid "The URL for the content repository" msgstr "URL untuk repositori kandungan" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "Zon mati bagi kayu bedik yang digunakan" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6638,7 +7166,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." -msgstr "Antaramuka rangkaian yang pelayan permainan dengar." +msgstr "Antaramuka rangkaian yang pelayan dengar." #: src/settings_translation_file.cpp msgid "" @@ -6659,7 +7187,7 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" -"Radius jilid blok di sekitar setiap pemain yang tertakluk kepada benda blok\n" +"Jejari jilid blok di sekitar setiap pemain yang tertakluk kepada benda blok\n" "aktif, dinyatakan dalam blokpeta (16 nod).\n" "Dalam blok aktif, objek dimuatkan dan ABM dijalankan.\n" "Ini juga jarak minimum di mana objek aktif (mob) dikekalkan.\n" @@ -6668,26 +7196,24 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Terjemahan bahagian belakang untuk Irrlicht.\n" +"Kemas gabung bahagian belakang.\n" "Anda perlu memulakan semula selepas mengubah tetapan ini.\n" -"Nota: Di Android, kekalkan dengan OGLES1 jika tidak pasti! Aplikasi mungkin " -"tidak\n" -"boleh dimulakan jika menggunakan tetapan lain. Di platform lain, OpenGL " -"disyorkan,\n" -"dan ia ialah satu-satunya pemacu yang mempunyai sokongan pembayang ketika " -"ini." +"Nota: Di Android, kekalkan dengan OGLES1 jika tidak pasti! Apl mungkin gagal " +"dimulakan jika ditukar.\n" +"Di platform lain, OpenGL digalakkan.\n" +"Pembayang disokong oleh OpenGL (komputer sahaja) dan OGLES2 (dalam uji kaji)" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "Kepekaan paksi kayu bedik untuk menggerakkan\n" "frustum penglihatan dalam permainan." @@ -6716,6 +7242,14 @@ msgstr "" "dibuat dengan membuang giliran item yang lama. Nilai 0 melumpuhkan fungsi " "ini." +#: 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 "" +"Peruntukan masa yang dibenarkan untuk ABM dilakukan di setiap langkah\n" +"(sebagai pecahan dari selang masa ABM)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6726,13 +7260,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"Jumlah masa dalam saat diambil untuk melakukan klik kanan yang berulang " -"apabila\n" -"pemain menekan butang tetikus kanan tanpa melepaskannya." +"Jumlah masa dalam saat diambil untuk meletakan nod yang berulang apabila\n" +"pemain menekan butang letak tanpa melepaskannya." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6758,7 +7290,8 @@ msgid "" "Time in seconds for item entity (dropped items) to live.\n" "Setting it to -1 disables the feature." msgstr "" -"Masa untuk entiti item (item yang dijatuhkan) terus hidup dalam unit saat.\n" +"Masa untuk entiti item (iaitu item yang dijatuhkan) terus hidup dalam unit " +"saat.\n" "Tetapkan kepada -1 untuk melumpuhkan sifat tersebut." #: src/settings_translation_file.cpp @@ -6775,8 +7308,10 @@ msgid "Time speed" msgstr "Kelajuan masa" #: src/settings_translation_file.cpp -msgid "Timeout for client to remove unused map data from memory." -msgstr "Had masa untuk klien membuang peta yang tidak digunakan dari memori." +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" +"Had masa untuk klien membuang data peta yang tidak digunakan dari ingatan, " +"dalam saat." #: src/settings_translation_file.cpp msgid "" @@ -6787,8 +7322,8 @@ msgid "" msgstr "" "Untuk mengurangkan lembapnya tindak balas, pemindahan blok diperlahankan " "apabila pemain membina sesuatu.\n" -"Tetapan ini menetapkan berapa lama ianya diperlahankan setelah meletakkan " -"atau mengalihkan sesebuah nod." +"Tetapan ini menetapkan berapa lama ia diperlahankan setelah meletakkan atau " +"mengalihkan sesebuah nod." #: src/settings_translation_file.cpp msgid "Toggle camera mode key" @@ -6802,6 +7337,18 @@ msgstr "Lengah tip alatan" msgid "Touch screen threshold" msgstr "Nilai ambang skrin sentuh" +#: src/settings_translation_file.cpp +msgid "Touchscreen" +msgstr "Skrin Sentuh" + +#: src/settings_translation_file.cpp +msgid "Tradeoffs for performance" +msgstr "Keseimbangan untuk prestasi" + +#: src/settings_translation_file.cpp +msgid "Transparency Sorting Distance" +msgstr "Jarak Pengisihan Lut Sinar" + #: src/settings_translation_file.cpp msgid "Trees noise" msgstr "Hingar pokok" @@ -6881,25 +7428,48 @@ msgstr "Gunakan penapisan bilinear apabila menyesuaikan tekstur." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" "Gunakan pemetaan mip untuk menyesuaikan tekstur. Boleh meningkatkan\n" -"sedikit prestasi, terutamanya apabila menggunakan pek tekstur berdefinisi\n" +"sedikit prestasi, terutamanya apabila menggunakan pek tekstur resolusi\n" "tinggi. Penyesuai-turun gama secara tepat tidak disokong." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Gunakan antialias pelbagai sampel (MSAA) untuk melembutkan sisi bongkah.\n" +"Algoritma ini melembutkan port pandangan 3D sambil mengekalkan ketajaman " +"imej,\n" +"tetapi ia tidak memberi kesan bahagian dalam sesuatu tekstur\n" +"(yang mana ia tampak lebih nyata dengan tekstur lutsinar).\n" +"Ruangan kosong akan kelihatan di antara nod apabila pembayang dilumpuhkan.\n" +"Jika ditetapkan ke 0, MSAA akan dilumpuhkan.\n" +"Anda perlu mulakan semula selepas mengubah pilihan ini." + #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." msgstr "Gunakan penapisan trilinear apabila menyesuaikan tekstur." +#: src/settings_translation_file.cpp +msgid "User Interfaces" +msgstr "Antara Muka Pengguna" + #: src/settings_translation_file.cpp msgid "VBO" msgstr "VBO" #: src/settings_translation_file.cpp msgid "VSync" -msgstr "VSync" +msgstr "Segerak Menegak" #: src/settings_translation_file.cpp msgid "Valley depth" @@ -6991,8 +7561,8 @@ msgid "Viewing range" msgstr "Jarak pandang" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Kayu bedik maya memicu butang aux" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Kayu bedik maya memicu butang Aux1" #: src/settings_translation_file.cpp msgid "Volume" @@ -7070,6 +7640,10 @@ msgstr "Panjang ombak cecair bergelora" msgid "Waving plants" msgstr "Tumbuhan bergoyang" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Warna pautan sesawang" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7080,7 +7654,7 @@ msgstr "" "semua\n" "imej GUI perlu ditapis dalam perisian, tetapi sesetengah imej dijana secara " "terus\n" -"ke perkakasan (contohnya, render-to-texture untuk nod dalam inventori)." +"ke perkakasan (contohnya, kemas-gabung-ke-tekstur untuk nod dalam inventori)." #: src/settings_translation_file.cpp msgid "" @@ -7104,35 +7678,33 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" "Apabila menggunakan tapisan bilinear/trilinear/anisotropik, tekstur " "resolusi\n" -"rendah boleh jadi kabur, jadi sesuai-naikkan mereka secara automatik dengan\n" -"sisipan jiran terdekat untuk memelihara piksel keras. Tetapan ini " -"menetapkan\n" -"saiz tekstur minima untuk tekstur penyesuai-naikkan; nilai lebih tinggi " -"tampak\n" -"lebih tajam, tetapi memerlukan memori yang lebih banyak. Nilai kuasa 2\n" -"disyorkan. Menetapkan nilai ini lebih tinggi dari 1 tidak akan menampakkan\n" -"kesan yang nyata melainkan tapisan bilinear/trilinear/anisotropik " +"rendah boleh jadi kabur, jadi sesuai-naikkannya secara automatik dengan " +"sisipan\n" +"jiran terdekat untuk memelihara piksel keras. Tetapan ini menetapkan saiz " +"tekstur\n" +"minimum untuk tekstur yang disesuai-naikkan; nilai lebih tinggi tampak " +"lebih\n" +"tajam, tetapi memerlukan ingatan yang lebih banyak. Nilai kuasa 2 " +"digalakkan.\n" +"Tetapan ini HANYA digunakan jika penapisan bilinear/trilinear/anisotropik " "dibolehkan.\n" -"Ini juga digunakan sebagai saiz tekstur nod asas untuk autopenyesuaian\n" -"tekstur jajaran dunia." +"Tetapan ini juga digunakan sebagai saiz tekstur nod asas untuk\n" +"penyesuaian automatik bagi tekstur jajaran dunia." #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Menetapkan sama ada fon FreeType digunakan, memerlukan sokongan Freetype\n" -"dikompil bersama. Jika dilumpuhkan, fon peta bit dan vektor XML akan " -"digunakan." +"Sama ada latar belakang tag nama patut ditunjukkan secara lalainya.\n" +"Mods masih boleh menetapkan latar belakang." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7160,12 +7732,12 @@ msgid "" msgstr "" "Tetapan sama ada untuk meminta klien menyambung semula selepas berlakunya " "keruntuhan (Lua).\n" -"Tetapkan kepada benar jika pelayan anda ditetapkan untuk mula semula secara " -"automatik." +"Tetapkan kepada \"true\" jika pelayan anda ditetapkan untuk mula semula " +"secara automatik." #: src/settings_translation_file.cpp msgid "Whether to fog out the end of the visible area." -msgstr "Sama ada hendak mengkabutkan penghujung kawasan yang kelihatan." +msgstr "Sama ada ingin papar kabut di penghujung kawasan yang kelihatan." #: src/settings_translation_file.cpp msgid "" @@ -7181,14 +7753,28 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether to show the client debug info (has the same effect as hitting F5)." +"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 "" -"Tetapkan sama ada hendak menunjukkan maklumat nyahpepijat (kesannya sama " -"seperti menekan butang F5)." +"Sama ada ingin tunjukkan nama teknikal.\n" +"Memberi kesan kepada mods dan pek tekstur dalam menu Kandungan dan Pilih " +"Mods,\n" +"dan juga nama tetapan dalam Semua Tetapan.\n" +"Dikawal oleh kotak pilihan dalam menu \"Semua tetapan\"." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Komponen lebar saiz tetingkap awal." +msgid "" +"Whether to show the client debug info (has the same effect as hitting F5)." +msgstr "" +"Sama ada ingin menunjukkan maklumat nyahpepijat (kesannya sama seperti " +"menekan butang F5)." + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "Komponen lebar saiz tetingkap awal. Diabaikan dalam mod skrin penuh." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7230,7 +7816,7 @@ msgstr "" "inginkan, terutamanya jika anda gunakan pek tekstur yang direka secara\n" "khusus; dengan pilihan ini, klien akan cuba untuk menentukan skala secara\n" "automatik berdasarkan saiz tekstur. Juga lihat texture_min_size.\n" -"Amaran: Pilihan ini DALAM UJIKAJI!" +"Amaran: Pilihan ini DALAM UJI KAJI!" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" @@ -7290,133 +7876,37 @@ msgstr "Aras Y untuk rupa bumi lebih rendah dan dasar laut." msgid "Y-level of seabed." msgstr "Aras Y untuk dasar laut." +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "cURL" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "Had masa muat turun fail cURL" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "Had masa saling tindak cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Had cURL selari" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Had masa cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "- Mod Kreatif: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Togol Sinematik" - -#~ msgid "Select Package File:" -#~ msgstr "Pilih Fail Pakej:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Had Y pengatas lava dalam gua besar." - -#~ msgid "Waving Water" -#~ msgstr "Air Bergelora" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "" -#~ "Sama ada kurungan bawah tanah kadang-kala terlunjur daripada rupa bumi." - -#~ msgid "Projecting dungeons" -#~ msgstr "Kurungan bawah tanah melunjur" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Aras Y di mana bayang tanah terapung diperluaskan." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "Aras Y untuk titik tengah tanah terapung dan permukaan tasik." - -#~ msgid "Waving water" -#~ msgstr "Air bergelora" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variasi ketinggian bukit dan kedalaman tasik rupa bumi lembut tanah " -#~ "terapung." +#~ msgid "- Damage: " +#~ msgstr "- Boleh cedera: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Ketinggian maksimum biasa, di atas dan bawah titik tengah, untuk gunung " -#~ "tanah terapung." +#~ "0 = oklusi paralaks dengan maklumat cerun (lebih cepat).\n" +#~ "1 = pemetaan bentuk muka bumi (lebih lambat, lebih tepat)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Fon ini akan digunakan untuk sesetengah bahasa." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Kekuatan tolakan tengah lengkung cahaya." - -#~ msgid "Shadow limit" -#~ msgstr "Had bayang" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Laluan ke fon TrueType atau peta bit." - -#~ msgid "Lightness sharpness" -#~ msgstr "Ketajaman pencahayaan" - -#~ msgid "Lava depth" -#~ msgstr "Kedalaman lava" - -#~ msgid "IPv6 support." -#~ msgstr "Sokongan IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gama" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Nilai alfa bayang fon (kelegapan, antara 0 dan 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Ketinggian gunung tanah terapung" - -#~ msgid "Floatland base height noise" -#~ msgstr "Hingar ketinggian asas tanah terapung" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Membolehkan pemetaan tona sinematik" - -#~ msgid "Enable VBO" -#~ msgstr "Membolehkan VBO" - -#~ msgid "" -#~ "Deprecated, define and locate cave liquids using biome definitions " -#~ "instead.\n" -#~ "Y of upper limit of lava in large caves." -#~ msgstr "" -#~ "Tetapan terkecam, mentakrifkan dan menetapkan cecair gua menggunakan " -#~ "pentakrifan biom menggantikan cara asal.\n" -#~ "Had Y atasan lava di gua-gua besar." - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Mentakrifkan kawasan rupa bumi lembut tanah terapung.\n" -#~ "Tanag terapung lembut berlaku apabila hingar > 0." - -#~ msgid "Darkness sharpness" -#~ msgstr "Ketajaman kegelapan" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Mengawal lebar terowong, nilai lebih kecil mencipta terowong lebih lebar." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Mengawal ketumpatan rupa bumi tanah terapung bergunung.\n" -#~ "Nilainya ialah ofset yang menambah kepada nilai hingar 'mgv7_np_mountain'." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Titik tengah tolakan-tengah lengkung cahaya." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Ubah cara tanah terapung jenis gunung menirus di atas dan bawah titik " -#~ "tengah." +#~ msgid "Address / Port" +#~ msgstr "Alamat / Port" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7427,20 +7917,461 @@ msgstr "Had masa cURL" #~ "cerah.\n" #~ "Tetapan ini hanya untuk klien dan diabaikan oleh pelayan permainan." -#~ msgid "Path to save screenshots at." -#~ msgstr "Laluan untuk simpan tangkap layar." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Ubah cara tanah terapung jenis gunung menirus di atas dan bawah titik " +#~ "tengah." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Kekuatan oklusi paralaks" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Had baris hilir keluar pada cakera" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Sedang muat turun dan memasang $1, sila tunggu..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Adakah anda mahu set semula dunia pemain perseorangan?" #~ msgid "Back" #~ msgstr "Backspace" +#~ msgid "Basic" +#~ msgstr "Asas" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Bit per piksel (atau kedalaman warna) dalam mod skrin penuh." + +#~ msgid "Bump Mapping" +#~ msgstr "Pemetaan Bertompok" + +#~ msgid "Bumpmapping" +#~ msgstr "Pemetaan bertompok" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Titik tengah tolakan-tengah lengkung cahaya." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Mengubah antara muka menu utama:\n" +#~ "- Penuh: Banyak dunia pemain perseorangan, pilihan permainan, pek " +#~ "tekstur, dll.\n" +#~ "- Mudah: Satu dunia pemain perseorangan, tiada pilihan permainan atau " +#~ "pek tekstur.\n" +#~ "Mungkin diperlukan untuk skrin yang lebih kecil." + +#~ msgid "Config mods" +#~ msgstr "Konfigurasi mods" + +#~ msgid "Configure" +#~ msgstr "Konfigurasi" + +#~ msgid "Connect" +#~ msgstr "Sambung" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Mengawal kelajuan tenggelam dalam cecair." + +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Mengawal ketumpatan rupa bumi tanah terapung bergunung.\n" +#~ "Nilainya ialah ofset yang menambah kepada nilai hingar 'mgv7_np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Mengawal lebar terowong, nilai lebih kecil mencipta terowong lebih lebar." + +#~ msgid "Credits" +#~ msgstr "Penghargaan" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Warna bagi kursor rerambut silang (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Boleh Cedera" + +#~ msgid "Darkness sharpness" +#~ msgstr "Ketajaman kegelapan" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Had masa lalai untuk cURL, dinyatakan dalam milisaat.\n" +#~ "Hanya berkesan jika dikompil dengan pilihan cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Mentakrifkan kawasan rupa bumi lembut tanah terapung.\n" +#~ "Tanag terapung lembut berlaku apabila hingar > 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Mentakrifkan tahap persampelan tekstur.\n" +#~ "Nilai lebih tinggi menghasilkan peta normal lebih lembut." + +#~ msgid "Del. Favorite" +#~ msgstr "Padam Kegemaran" + +#~ msgid "" +#~ "Deprecated, define and locate cave liquids using biome definitions " +#~ "instead.\n" +#~ "Y of upper limit of lava in large caves." +#~ msgstr "" +#~ "Tetapan terkecam, mentakrifkan dan menetapkan cecair gua menggunakan " +#~ "pentakrifan biom menggantikan cara asal.\n" +#~ "Had Y atasan lava di gua-gua besar." + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Muat turun permainan, contohnya Minetest Game, dari minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Muat turun satu dari minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Sedang muat turun dan memasang $1, sila tunggu..." + +#~ msgid "Enable VBO" +#~ msgstr "Membolehkan VBO" + +#~ msgid "Enable register confirmation" +#~ msgstr "Bolehkan pengesahan pendaftaran" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Membolehkan pemetaan bertompok pada tekstur. Peta normal perlu disediakan " +#~ "oleh pek\n" +#~ "tekstur atau perlu dijana secara automatik.\n" +#~ "Perlukan pembayang dibolehkan." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Membolehkan pemetaan tona sinematik" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Membolehkan penjanaan peta normal secara layang (Kesan cetak timbul).\n" +#~ "Perlukan pemetaan bertompok untuk dibolehkan." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Membolehkan pemetaan oklusi paralaks.\n" +#~ "Memerlukan pembayang untuk dibolehkan." + +#~ msgid "Enter " +#~ msgstr "Masukkan " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Pilihan percubaan, mungkin menampakkan ruang yang nyata di\n" +#~ "antara blok apabila ditetapkan dengan nombor lebih besar daripada 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS di menu jeda" + +#~ msgid "Fallback font shadow" +#~ msgstr "Bayang fon berbalik" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Nilai alfa bayang fon berbalik" + +#~ msgid "Fallback font size" +#~ msgstr "Saiz fon berbalik" + +#~ msgid "Filtering" +#~ msgstr "Penapisan" + +#~ msgid "Floatland base height noise" +#~ msgstr "Hingar ketinggian asas tanah terapung" + +#~ msgid "Floatland mountain height" +#~ msgstr "Ketinggian gunung tanah terapung" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Nilai alfa bayang fon (kelegapan, antara 0 dan 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Saiz fon bagi fon berbalik dalam unit titik (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Fon FreeType" + +#~ msgid "Full screen BPP" +#~ msgstr "BPP skrin penuh" + +#~ msgid "Game" +#~ msgstr "Permainan" + +#~ msgid "Gamma" +#~ msgstr "Gama" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Jana Peta Normal" + +#~ msgid "Generate normalmaps" +#~ msgstr "Jana peta normal" + +#~ msgid "HUD scale factor" +#~ msgstr "Faktor skala papar pandu (HUD)" + +#~ msgid "High-precision FPU" +#~ msgstr "Unit titik terapung (FPU) ketepatan tinggi" + +#~ msgid "IPv6 support." +#~ msgstr "Sokongan IPv6." + +#~ msgid "In-Game" +#~ msgstr "Dalam Permainan" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Pasang: fail: \"$1\"" + +#~ msgid "Instrumentation" +#~ msgstr "Instrumentasi" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Ikatan kekunci. (Jika menu ini berselerak, buang sesetengah benda dari " +#~ "fail minetest.conf)" + +#~ msgid "Lava depth" +#~ msgstr "Kedalaman lava" + +#~ msgid "Lightness sharpness" +#~ msgstr "Ketajaman pencahayaan" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Had baris hilir keluar pada cakera" + +#~ msgid "Main" +#~ msgstr "Utama" + +#~ msgid "Main menu style" +#~ msgstr "Gaya menu utama" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "Membuatkan DirectX bekerja dengan LuaJIT. Lumpuhkan tetapan jika " +#~ "bermasalah." + +#~ msgid "Menus" +#~ msgstr "Menu" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Peta mini dalam mod radar, Zum 2x" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Peta mini dalam mod radar, Zum 4x" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Peta mini dalam mod permukaan, Zum 2x" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Peta mini dalam mod permukaan, Zum 4x" + +#~ msgid "Name / Password" +#~ msgstr "Nama / Kata laluan" + +#~ msgid "Name/Password" +#~ msgstr "Nama/Kata laluan" + +#~ msgid "No" +#~ msgstr "Tidak" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Persampelan peta normal" + +#~ msgid "Normalmaps strength" +#~ msgstr "Kekuatan peta normal" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Jumlah lelaran oklusi paralaks." + #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Kelegapan (alfa) bayang belakang fon berbalik, nilai antara 0 dan 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "" +#~ "Pengaruh kesan oklusi paralaks pada keseluruhannya, kebiasaannya skala/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Skala keseluruhan kesan oklusi paralaks." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Oklusi Paralaks" + +#~ msgid "Parallax occlusion" +#~ msgstr "Oklusi paralaks" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Pengaruh oklusi paralaks" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Lelaran oklusi paralaks" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Mod oklusi paralaks" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Skala oklusi paralaks" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Kekuatan oklusi paralaks" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Laluan ke fon TrueType atau peta bit." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Laluan untuk simpan tangkap layar." + +#~ msgid "Player name" +#~ msgstr "Nama pemain" + +#~ msgid "Profiling" +#~ msgstr "Pemprofilan" + +#~ msgid "Projecting dungeons" +#~ msgstr "Kurungan bawah tanah melunjur" + +#~ msgid "PvP enabled" +#~ msgstr "Boleh Berlawan PvP" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Set semula dunia pemain perseorangan" + +#~ msgid "Select Package File:" +#~ msgstr "Pilih Fail Pakej:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Pelayan / Pemain perseorangan" + +#~ msgid "" +#~ "Set the shadow update time.\n" +#~ "Lower value means shadows and map updates faster, but it consume more " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "Menetapkan masa kemas kini bayang.\n" +#~ "Nilai lebih rendah untuk kemas kini peta dan bayang lebih laju, tetapi " +#~ "menggunakan lebih banyak sumber.\n" +#~ "Nilai minimum 0.001 saat dan nilai maksimum 0.2 saat" + +#~ msgid "Shadow limit" +#~ msgstr "Had bayang" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Ofset bayang fon berbalik (dalam unit piksel). Jika 0, maka bayang tidak " +#~ "akan dilukis." + +#~ msgid "Special" +#~ msgstr "Istimewa" + +#~ msgid "Special key" +#~ msgstr "Kekunci istimewa" + +#~ msgid "Start Singleplayer" +#~ msgstr "Mula Main Seorang" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Kekuatan peta normal yang dijana." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Kekuatan tolakan tengah lengkung cahaya." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Fon ini akan digunakan untuk sesetengah bahasa." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Untuk membolehkan pembayang, pemacu OpenGL mesti digunakan." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Togol Sinematik" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Ketinggian maksimum biasa, di atas dan bawah titik tengah, untuk gunung " +#~ "tanah terapung." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variasi ketinggian bukit dan kedalaman tasik rupa bumi lembut tanah " +#~ "terapung." + +#~ msgid "View" +#~ msgstr "Lihat" + +#~ msgid "Waving Water" +#~ msgstr "Air Bergelora" + +#~ msgid "Waving water" +#~ msgstr "Air bergelora" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Menetapkan sama ada fon FreeType digunakan, memerlukan sokongan Freetype\n" +#~ "dikompil bersama. Jika dilumpuhkan, fon peta bit dan vektor XML akan " +#~ "digunakan." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "" +#~ "Sama ada kurungan bawah tanah kadang-kala terlunjur daripada rupa bumi." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Had Y pengatas lava dalam gua besar." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "Aras Y untuk titik tengah tanah terapung dan permukaan tasik." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Aras Y di mana bayang tanah terapung diperluaskan." + +#~ 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 sertai pelayan dengan nama \"%s\" untuk kali pertama.\n" +#~ "Jika anda teruskan, akaun baru dengan maklumat anda akan dicipta di " +#~ "pelayan ini.\n" +#~ "Sila taip semula kata laluan anda dan klik 'Daftar dan Sertai' untuk " +#~ "sahkan penciptaan akaun, atau klik 'Batal' untuk membatalkan." + +#~ msgid "You died." +#~ msgstr "Anda telah meninggal." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/ms_Arab/minetest.po b/po/ms_Arab/minetest.po index e7e4c7167..39cbfc81b 100644 --- a/po/ms_Arab/minetest.po +++ b/po/ms_Arab/minetest.po @@ -7,10 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-07-08 20:47+0000\n" -"Last-Translator: Yaya - Nurul Azeera Hidayah @ Muhammad Nur Hidayat " -"Yasuyoshi <translation@mnh48.moe>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-05-19 18:13+0000\n" +"Last-Translator: Niskala Airaha <niskala5570@gmail.com>\n" "Language-Team: Malay (Jawi) <https://hosted.weblate.org/projects/minetest/" "minetest/ms_Arab/>\n" "Language: ms_Arab\n" @@ -18,31 +17,91 @@ 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.2-dev\n" +"X-Generator: Weblate 4.13-dev\n" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Clear the out chat queue" +msgstr "ساٴيز مکسيموم باريس ݢيلير کلوار سيمبڠ" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "کلوار کمينو" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "ارهن تمڤتن" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "ڤماٴين ڤرسأورڠن" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "ڤماٴين ڤرسأورڠن" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "لاهير سمولا" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" msgstr "اندا تله منيڠݢل" -#: builtin/client/death_formspec.lua src/client/game.cpp -msgid "Respawn" -msgstr "لاهير سمولا" +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "ارهن تمڤتن" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "ارهن تمڤتن" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "OK" #: builtin/fstk/ui.lua -msgid "The server has requested a reconnect:" -msgstr "ڤلاين ڤرماءينن ممينت اندا اونتوق مڽمبوڠ سمولا:" - -#: builtin/fstk/ui.lua -msgid "Reconnect" -msgstr "سمبوڠ سمولا" - -#: builtin/fstk/ui.lua -msgid "Main menu" -msgstr "مينو اوتام" +msgid "<none available>" +msgstr "" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -52,45 +111,117 @@ msgstr "برلاکوڽ رالت دالم سکريڤ Lua:" msgid "An error occurred:" msgstr "تله برلاکوڽ رالت:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "سدڠ ممواتکن..." +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "مينو اوتام" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "سمبوڠ سمولا" + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" +msgstr "ڤلاين ڤرماٴينن ممينت اندا اونتوق مڽمبوڠ سمولا:" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "چوب اکتيفکن سمولا سناراي ڤلاين عوام فان ڤريقسا سمبوڠن اينترنيت اندا." +msgid "A new $1 version is available" +msgstr "" #: builtin/mainmenu/common.lua -msgid "Server supports protocol versions between $1 and $2. " -msgstr "ڤلاين ڤرماءينن مڽوکوڠ ڤروتوکول ۏرسي $1 هيڠݢ $2. " +#, 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 "ۏرسي ڤروتوکول تيدق سراسي. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "ڤلاين ڤرماءينن مڠواتکواساکن ڤروتوکول ۏرسي $1. " +msgstr "ڤلاين ڤرماٴينن مڠواتکواساکن ڤروتوکول ۏرسي $1. " #: builtin/mainmenu/common.lua -msgid "We support protocol versions between version $1 and $2." -msgstr "کامي مڽوکوڠ ڤروتوکول ۏرسي $1 هيڠݢ $2." +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." #: builtin/mainmenu/common.lua -msgid "Protocol version mismatch. " -msgstr "ۏرسي ڤروتوکول تيدق سراسي. " +msgid "We support protocol versions between version $1 and $2." +msgstr "کامي مڽوکوڠ ڤروتوکول ۏرسي $1 هيڠݢ $2." #: builtin/mainmenu/dlg_config_world.lua -msgid "World:" -msgstr "دنيا:" +msgid "(Enabled, has error)" +msgstr "" #: builtin/mainmenu/dlg_config_world.lua -msgid "No modpack description provided." -msgstr "تيادا ڤريهل ڤيک مودس ترسديا." +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_register.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp +#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp +msgid "Cancel" +msgstr "بطل" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +msgstr "کبرݢنتوڠن:" #: builtin/mainmenu/dlg_config_world.lua -msgid "No game description provided." -msgstr "تيادا ڤريهل ڤرماءينن ترسديا." +msgid "Disable all" +msgstr "لومڤوهکن سموا" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable modpack" +msgstr "لومڤوهکن ڤيک مودس" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "ممبوليهکن سموا" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable modpack" +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 "" +"ݢاݢل اونتوق ممبوليهکن مودس \"$1\" کران اي مڠندوڠي اکسارا يڠ تيدق دبنرکن. هاڽ " +"اکسارا [a-z0-9_] سهاج يڠ دبنرکن." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Find More Mods" +msgstr "چاري مودس لاٴين" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -100,175 +231,245 @@ msgstr "مودس:" msgid "No (optional) dependencies" msgstr "تيادا کبرݢنتوڠن (ڤيليهن)" +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "تيادا ڤريهل ڤرماٴينن ترسديا." + #: builtin/mainmenu/dlg_config_world.lua msgid "No hard dependencies" msgstr "تيادا کبرݢنتوڠن واجب" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -msgid "Optional dependencies:" -msgstr "کبرݢنتوڠن ڤيليهن:" - -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -msgid "Dependencies:" -msgstr "کبرݢنتوڠن:" +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." +msgstr "تيادا ڤريهل ڤيک مودس ترسديا." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" msgstr "تيادا کبرݢنتوڠن ڤيليهن" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "کبرݢنتوڠن ڤيليهن:" + #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp msgid "Save" msgstr "سيمڤن" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua -#: builtin/mainmenu/dlg_delete_content.lua -#: builtin/mainmenu/dlg_delete_world.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 -msgid "Cancel" -msgstr "باتل" - #: builtin/mainmenu/dlg_config_world.lua -msgid "Find More Mods" -msgstr "چاري مودس لاءين" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Disable modpack" -msgstr "لومڤوهکن ڤيک مودس" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Enable modpack" -msgstr "بوليهکن ڤيک مودس" +msgid "World:" +msgstr "دنيا:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" msgstr "دبوليهکن" -#: builtin/mainmenu/dlg_config_world.lua -msgid "Disable all" -msgstr "لومڤوهکن سموا" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Enable all" -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." +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" msgstr "" -"ݢاݢل اونتوق ممبوليهکن مودس \"$1\" کران اي مڠندوڠي اکسارا يڠ تيدق دبنرکن. هاڽ " -"اکسارا [a-z0-9_] سهاج يڠ دبنرکن." #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "سيستم ContentDB تيدق ترسديا اڤابيلا Minetest دکومڤيل تنڤ cURL" +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "مموات تورون..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "سموا ڤاکيج" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Games" -msgstr "ڤرماءينن" - -#: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Mods" -msgstr "مودس" - -#: builtin/mainmenu/dlg_contentstore.lua -msgid "Texture packs" -msgstr "ڤيک تيکستور" - -#: builtin/mainmenu/dlg_contentstore.lua -msgid "Failed to download $1" -msgstr "ݢاݢل مموات تورون $1" - -#: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "چاري" +#, fuzzy +msgid "Already installed" +msgstr "ککونچي تله دݢوناکن اونتوق فوڠسي لاٴين" #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "کمبالي کمينو اوتام" #: builtin/mainmenu/dlg_contentstore.lua -msgid "No results" -msgstr "تيادا حاصيل" +#, fuzzy +msgid "Base Game:" +msgstr "هوس ڤرماٴينن" #: builtin/mainmenu/dlg_contentstore.lua -msgid "No packages could be retrieved" -msgstr "تيادا ڤاکيج يڠ بوليه دامبيل" +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "سيستم ContentDB تيدق ترسديا اڤابيلا Minetest دکومڤيل تنڤ cURL" #: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." msgstr "مموات تورون..." +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Failed to download $1" +msgstr "ݢاݢل مموات تورون $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Games" +msgstr "ڤرماٴينن" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Install" msgstr "ڤاسڠ" #: builtin/mainmenu/dlg_contentstore.lua -msgid "Update" +#, fuzzy +msgid "Install $1" +msgstr "ڤاسڠ" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "کبرݢنتوڠن ڤيليهن:" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "ڤاسڠ: جنيس فايل \"$1\" تيدق دسوکوڠ اتاو ارکيب روسق" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Mods" +msgstr "مودس" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No packages could be retrieved" +msgstr "تيادا ڤاکيج يڠ بوليه دامبيل" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No results" +msgstr "تيادا حاصيل" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "No updates" msgstr "کمس کيني" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Not found" +msgstr "بيسوکن بوڽي" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" +msgstr "ڤيک تيکستور" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" msgstr "ڽهڤاسڠ" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "ليهت" +msgid "Update" +msgstr "کمس کيني" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "" #: builtin/mainmenu/dlg_create_world.lua -msgid "Caverns" -msgstr "ݢوا بسر" +msgid "A world named \"$1\" already exists" +msgstr "دنيا برنام \"$1\" تله وجود" #: builtin/mainmenu/dlg_create_world.lua -msgid "Very large caverns deep in the underground" -msgstr "ݢوا ݢرݢاسي يڠ ساڠت مندالم باواه تانه" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Sea level rivers" -msgstr "سوڠاي ارس لاءوت" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Rivers" -msgstr "سوڠاي" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Mountains" -msgstr "ݢونوڠ" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Floatlands (experimental)" -msgstr "تانه تراڤوڠ (دالم اوجيکاجي)" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Floating landmasses in the sky" -msgstr "جيسيم بومي تراڤوڠ اتس لاڠيت" +msgid "Additional terrain" +msgstr "روڤ بومي تمبهن" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" msgstr "کديڠينن التيتود" -#: builtin/mainmenu/dlg_create_world.lua -msgid "Reduces heat with altitude" -msgstr "کورڠکن هاب مڠيکوت التيتود" - #: builtin/mainmenu/dlg_create_world.lua msgid "Altitude dry" msgstr "ککريڠن التيتود" #: builtin/mainmenu/dlg_create_world.lua -msgid "Reduces humidity with altitude" -msgstr "کورڠکن کلمبڤن مڠيکوت التيتود" +msgid "Biome blending" +msgstr "ڤڽباتين بيوم" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biomes" +msgstr "بيوم" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caverns" +msgstr "ݢوا بسر" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caves" +msgstr "ݢوا" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "چيڤت" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "هياسن" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Development Test is meant for developers." +msgstr "امرن: The Development Test هاڽله اونتوق کݢوناٴن ڤمباڠون." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Dungeons" +msgstr "کوروڠن باواه تانه" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "روڤ بومي رات" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "جيسيم بومي تراڤوڠ اتس لاڠيت" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "تانه تراڤوڠ (دالم اوجيکاجي)" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "جان روڤ بومي بوکن-فراکتل: لاٴوتن دان باواه تانه" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Hills" +msgstr "بوکيت" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" @@ -279,76 +480,74 @@ msgid "Increases humidity around rivers" msgstr "تيڠکتکن کلمبڤن سکيتر سوڠاي" #: builtin/mainmenu/dlg_create_world.lua -msgid "Vary river depth" -msgstr "کدالمن سوڠاي برباݢاي" +#, fuzzy +msgid "Install a game" +msgstr "ڤاسڠ" #: builtin/mainmenu/dlg_create_world.lua -msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "کلمبڤن رنده دان هاب تيڠݢي مڽببکن سوڠاي چيتيق اتاو کريڠ" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Hills" -msgstr "بوکيت" +msgid "Install another game" +msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" msgstr "تاسيق" #: builtin/mainmenu/dlg_create_world.lua -msgid "Additional terrain" -msgstr "روڤ بومي تمبهن" +msgid "Low humidity and high heat causes shallow or dry rivers" +msgstr "کلمبڤن رنده دان هاب تيڠݢي مڽببکن سوڠاي چيتيق اتاو کريڠ" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "جاناٴن ڤتا" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "بنديرا جان ڤتا" #: builtin/mainmenu/dlg_create_world.lua -msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "جان روڤ بومي بوکن-فراکتل: لاءوتن دان باواه تانه" +msgid "Mapgen-specific flags" +msgstr "بنديرا خصوص جان ڤتا" #: builtin/mainmenu/dlg_create_world.lua -msgid "Trees and jungle grass" -msgstr "ڤوکوق دان رومڤوت هوتن" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Flat terrain" -msgstr "روڤ بومي رات" +msgid "Mountains" +msgstr "ݢونوڠ" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" msgstr "اليرن لومڤور" #: builtin/mainmenu/dlg_create_world.lua -msgid "Terrain surface erosion" -msgstr "هاکيسن ڤرموکاءن روڤ بومي" +msgid "Network of tunnels and caves" +msgstr "جاريڠن تروووڠ دان ݢوا" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "اقليم سدرهان⹁ ݢورون⹁ هوتن⹁ توندرا⹁ تايݢ" +msgid "No game selected" +msgstr "تيادا ڤرماٴينن دڤيليه" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle" -msgstr "اقليم سدرهان⹁ ݢورون⹁ هوتن" +msgid "Reduces heat with altitude" +msgstr "کورڠکن هاب مڠيکوت التيتود" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert" -msgstr "اقليم سدرهان⹁ ݢورون" +msgid "Reduces humidity with altitude" +msgstr "کورڠکن کلمبڤن مڠيکوت التيتود" #: builtin/mainmenu/dlg_create_world.lua -msgid "You have no games installed." -msgstr "اندا تيدق مماسڠ سبارڠ ڤرماءينن." +msgid "Rivers" +msgstr "سوڠاي" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "موات تورون ساتو دري minetest.net" +msgid "Sea level rivers" +msgstr "سوڠاي ارس لاٴوت" #: builtin/mainmenu/dlg_create_world.lua -msgid "Caves" -msgstr "ݢوا" +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" +msgstr "بنيه" #: builtin/mainmenu/dlg_create_world.lua -msgid "Dungeons" -msgstr "کوروڠن باواه تانه" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Decorations" -msgstr "هياسن" +msgid "Smooth transition between biomes" +msgstr "ڤراليهن لمبوت دانتارا بيوم" #: builtin/mainmenu/dlg_create_world.lua msgid "" @@ -363,65 +562,40 @@ msgid "Structures appearing on the terrain, typically trees and plants" msgstr "ستروکتور يڠ مونچول اتس روڤ بومي⹁ بياساڽ ڤوکوق دان تومبوهن" #: builtin/mainmenu/dlg_create_world.lua -msgid "Network of tunnels and caves" -msgstr "جاريڠن تروووڠ دان ݢوا" +msgid "Temperate, Desert" +msgstr "اقليم سدرهان⹁ ݢورون" #: builtin/mainmenu/dlg_create_world.lua -msgid "Biomes" -msgstr "بيوم" +msgid "Temperate, Desert, Jungle" +msgstr "اقليم سدرهان⹁ ݢورون⹁ هوتن" #: builtin/mainmenu/dlg_create_world.lua -msgid "Biome blending" -msgstr "ڤڽباتين بيوم" +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgstr "اقليم سدرهان⹁ ݢورون⹁ هوتن⹁ توندرا⹁ تايݢ" #: builtin/mainmenu/dlg_create_world.lua -msgid "Smooth transition between biomes" -msgstr "ڤراليهن لمبوت دانتارا بيوم" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Mapgen flags" -msgstr "بنديرا جان ڤتا" +msgid "Terrain surface erosion" +msgstr "هاکيسن ڤرموکاٴن روڤ بومي" #: builtin/mainmenu/dlg_create_world.lua -msgid "Mapgen-specific flags" -msgstr "بنديرا خصوص جان ڤتا" +msgid "Trees and jungle grass" +msgstr "ڤوکوق دان رومڤوت هوتن" #: builtin/mainmenu/dlg_create_world.lua -msgid "Warning: The Development Test is meant for developers." -msgstr "امرن: The Development Test هاڽله اونتوق کݢوناءن ڤمباڠون." +msgid "Vary river depth" +msgstr "کدالمن سوڠاي برباݢاي" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "موات تورون ڤرماءينن⹁ چونتوهڽ Minetest Game⹁ دري minetest.net" +msgid "Very large caverns deep in the underground" +msgstr "ݢوا ݢرݢاسي يڠ ساڠت مندالم باواه تانه" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "نام دنيا" #: builtin/mainmenu/dlg_create_world.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Seed" -msgstr "بنيه" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Mapgen" -msgstr "جاناءن ڤتا" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "ڤرماءينن" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Create" -msgstr "چيڤت" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "A world named \"$1\" already exists" -msgstr "دنيا برنام \"$1\" تله وجود" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "No game selected" -msgstr "تيادا ڤرماءينن دڤيليه" +msgid "You have no games installed." +msgstr "اندا تيدق مماسڠ سبارڠ ڤرماٴينن." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" @@ -445,69 +619,181 @@ 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 +#, 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 "تريما" +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "نامکن سمولا ڤيک مودس:" + #: 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.conf ميليقڽ يڠ اکن " -"مڠاتسي سبارڠ ڤناماءن سمولا دسين." - -#: builtin/mainmenu/dlg_rename_modpack.lua -msgid "Rename Modpack:" -msgstr "نامکن سمولا ڤيک مودس:" +"ڤيک مودس اين ممڤوڽاٴي نام خصوص دبريکن دالم فايل modpack.conf ميليقڽ يڠ اکن " +"مڠاتسي سبارڠ ڤناماٴن سمولا دسين." #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Disabled" -msgstr "دلومڤوهکن" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Enabled" -msgstr "دبوليهکن" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Browse" -msgstr "لاير" - -#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp -msgid "Offset" -msgstr "اوفسيت" - -#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp -msgid "Scale" -msgstr "سکال" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "X spread" -msgstr "سيبرن X" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Y spread" -msgstr "سيبرن Y" +msgid "(No description of setting given)" +msgstr "(تيادا ڤريهل اونتوق تتڤن يڠ دبري)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "2D Noise" msgstr "هيڠر 2D" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Z spread" -msgstr "سيبرن Z" +msgid "< Back to Settings page" +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 "دلومڤوهکن" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "ايديت" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "دبوليهکن" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Lacunarity" +msgstr "لاکوناريتي" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Octaves" msgstr "اوکتف" +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" +msgstr "اوفسيت" + #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "ڤنروسن" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Lacunarity" -msgstr "لاکوناريتي" +msgid "Please enter a valid integer." +msgstr "سيلا ماسوقکن اينتيݢر يڠ صح." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "سيلا ماسوقکن نومبور يڠ صح." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "ڤوليهکن تتڤن اصل" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "سکال" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "چاري" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "ڤيليه ديريکتوري" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "ڤيليه فايل" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "تونجوقکن نام تيکنيکل" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "نيلاي مستيله سکورڠ-کورڠڽ $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "نيلاي مستيله تيدق لبيه درڤد $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "سيبرن X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "سيبرن Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "Z" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "سيبرن Z" + +#. ~ "absvalue" is a noise parameter flag. +#. It is short for "absolute value". +#. It can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "absvalue" +msgstr "نيلاي مطلق" #. ~ "defaults" is a noise parameter flag. #. It describes the default processing options @@ -524,125 +810,123 @@ msgstr "لالاي" msgid "eased" msgstr "تومڤول" -#. ~ "absvalue" is a noise parameter flag. -#. It is short for "absolute value". -#. It can be enabled in noise settings in -#. main menu -> "All Settings". -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "absvalue" -msgstr "نيلاي مطلق" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "X" -msgstr "X" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Y" -msgstr "Y" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Z" -msgstr "Z" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "(No description of setting given)" -msgstr "(تيادا ڤريهل اونتوق تتڤن يڠ دبري)" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Please enter a valid integer." -msgstr "سيلا ماسوقکن اينتيݢر يڠ صح." - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be at least $1." -msgstr "نيلاي مستيله سکورڠ-کورڠڽ $1." - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must not be larger than $1." -msgstr "نيلاي مستيله تيدق لبيه درڤد $1." - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Please enter a valid number." -msgstr "سيلا ماسوقکن نومبور يڠ صح." - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Select directory" -msgstr "ڤيليه ديريکتوري" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Select file" -msgstr "ڤيليه فايل" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "< Back to Settings page" -msgstr "< کمبالي کهلامن تتڤن" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Edit" -msgstr "ايديت" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Restore Default" -msgstr "ڤوليهکن تتڤن اصل" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Show technical names" -msgstr "تونجوقکن نام تيکنيکل" - #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" msgstr "$1 (دبوليهکن)" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a $1 as a texture pack" -msgstr "ݢاݢل مماسڠ $1 سباݢاي ڤيک تيکستور" +msgid "$1 mods" +msgstr "$1 مودس" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" msgstr "ݢاݢل مماسڠ $1 ڤد $2" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to find a valid mod or modpack" -msgstr "تيدق جومڤ مودس اتاو ڤيک مودس يڠ صح" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a modpack as a $1" -msgstr "ݢاݢل مماسڠ ڤيک مودس سباݢاي $1" +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 "تيدق جومڤ مودس اتاو ڤيک مودس يڠ صح" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a $1 as a texture pack" +msgstr "ݢاݢل مماسڠ $1 سباݢاي ڤيک تيکستور" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a game as a $1" +msgstr "ݢاݢل مماسڠ ڤرماٴينن سباݢاي $1" + #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" msgstr "ݢاݢل مماسڠ مودس سباݢاي $1" #: builtin/mainmenu/pkgmgr.lua -msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "ڤاسڠ مودس: ݢاݢل منچاري نام مودس سبنر اونتوق: $1" +msgid "Unable to install a modpack as a $1" +msgstr "ݢاݢل مماسڠ ڤيک مودس سباݢاي $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a game as a $1" -msgstr "ݢاݢل مماسڠ ڤرماءينن سباݢاي $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "سدڠ ممواتکن..." -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "ڤاسڠ: فايل: \"$1\"" +#: builtin/mainmenu/serverlistmgr.lua +#, fuzzy +msgid "Public server list is disabled" +msgstr "سکريڤ ڤيهق کليئن دلومڤوهکن" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "ڤاسڠ: جنيس فايل \"$1\" تيدق دسوکوڠ اتاو ارکيب روسق" +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "چوب اکتيفکن سمولا سناراي ڤلاين عوام فان ڤريقسا سمبوڠن اينترنيت اندا." -#: builtin/mainmenu/pkgmgr.lua -msgid "$1 mods" -msgstr "$1 مودس" +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "ڤڽومبڠ اکتيف" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "جارق ڤڠهنترن اوبجيک اکتيف" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "ڤمباڠون تراس" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "ڤڽومبڠ تردهولو" + +#: builtin/mainmenu/tab_about.lua +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 "لايري کندوڠن دالم تالين" + +#: builtin/mainmenu/tab_content.lua +msgid "Content" +msgstr "کندوڠن" + +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "لومڤوهکن ڤيک تيکستور" + +#: builtin/mainmenu/tab_content.lua +msgid "Information:" +msgstr "معلومت:" #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" msgstr "ڤاکيج دڤاسڠ:" #: builtin/mainmenu/tab_content.lua -msgid "Browse online content" -msgstr "لايري کندوڠن دالم تالين" +msgid "No dependencies." +msgstr "تيادا کبرݢنتوڠن." #: builtin/mainmenu/tab_content.lua msgid "No package description available" @@ -652,207 +936,146 @@ msgstr "تيادا ڤريهل ڤاکيج ترسديا" msgid "Rename" msgstr "نامکن سمولا" -#: builtin/mainmenu/tab_content.lua -msgid "No dependencies." -msgstr "تيادا کبرݢنتوڠن." - -#: builtin/mainmenu/tab_content.lua -msgid "Disable Texture Pack" -msgstr "لومڤوهکن ڤيک تيکستور" - -#: builtin/mainmenu/tab_content.lua -msgid "Use Texture Pack" -msgstr "ݢونا ڤيک تيکستور" - -#: builtin/mainmenu/tab_content.lua -msgid "Information:" -msgstr "معلومت:" - #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" msgstr "ڽهڤاسڠ ڤاکيج" #: builtin/mainmenu/tab_content.lua -msgid "Content" -msgstr "کندوڠن" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "ڤڠهرݢاءن" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "ڤمباڠون تراس" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "ڤڽومبڠ اکتيف" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "ڤمباڠون تراس تردهولو" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "ڤڽومبڠ تردهولو" - -#: builtin/mainmenu/tab_local.lua -msgid "Install games from ContentDB" -msgstr "ڤاسڠکن ڤرماءينن درڤد ContentDB" - -#: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "کونفيݢوراسي" - -#: builtin/mainmenu/tab_local.lua -msgid "New" -msgstr "بوات بارو" - -#: builtin/mainmenu/tab_local.lua -msgid "Select World:" -msgstr "ڤيليه دنيا:" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Creative Mode" -msgstr "مود کرياتيف" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Enable Damage" -msgstr "بوليه چدرا" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Server" -msgstr "هوس ڤلاين" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Game" -msgstr "هوس ڤرماءينن" +msgid "Use Texture Pack" +msgstr "ݢونا ڤيک تيکستور" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "اومومکن ڤلاين" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "نام\\کات لالوان" - #: builtin/mainmenu/tab_local.lua msgid "Bind Address" msgstr "علامت ايکتن" #: builtin/mainmenu/tab_local.lua -msgid "Port" -msgstr "ڤورت" +msgid "Creative Mode" +msgstr "مود کرياتيف" #: builtin/mainmenu/tab_local.lua -msgid "Server Port" -msgstr "ڤورت ڤلاين" +msgid "Enable Damage" +msgstr "بوليه چدرا" #: builtin/mainmenu/tab_local.lua -msgid "Play Game" -msgstr "مولا ماءين" +msgid "Host Game" +msgstr "هوس ڤرماٴينن" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "هوس ڤلاين" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +msgstr "ڤاسڠکن ڤرماٴينن درڤد ContentDB" + +#: 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 +msgid "Play Game" +msgstr "مولا ماٴين" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "ڤورت" + +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "ڤيليه دنيا:" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "ڤيليه دنيا:" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "ڤورت ڤلاين" + #: builtin/mainmenu/tab_local.lua msgid "Start Game" -msgstr "مولاکن ڤرماءينن" +msgstr "مولاکن ڤرماٴينن" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "علامت \\ ڤورت" +#, fuzzy +msgid "Address" +msgstr "- علامت: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "نام \\ کات لالوان" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "ڤادم" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "سمبوڠ" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "ڤادم کݢمرن" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "کݢمرن" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Ping" -msgstr "ڤيڠ" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "مود کرياتيف" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" msgstr "بوليه چدرا" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "بوليه برلاوان PvP" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" +msgstr "کݢمرن" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" #: builtin/mainmenu/tab_online.lua msgid "Join Game" -msgstr "سرتاءي ڤرماءينن" +msgstr "سرتاٴي ڤرماٴينن" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "ڤيڠ" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "اومومکن ڤلاين" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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 "Opaque Leaves" -msgstr "داون لݢڤ" - -#: builtin/mainmenu/tab_settings.lua -msgid "Simple Leaves" -msgstr "داون ريڠکس" - -#: builtin/mainmenu/tab_settings.lua -msgid "Fancy Leaves" -msgstr "داون براݢم" - -#: builtin/mainmenu/tab_settings.lua -msgid "Node Outlining" -msgstr "کرڠک نود" - -#: builtin/mainmenu/tab_settings.lua -msgid "Node Highlighting" -msgstr "تونجولن نود" - -#: builtin/mainmenu/tab_settings.lua -msgid "None" -msgstr "تيادا" - -#: builtin/mainmenu/tab_settings.lua -msgid "No Filter" -msgstr "تيادا تاڤيسن" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bilinear Filter" -msgstr "ڤناڤيسن بيلينيار" - -#: builtin/mainmenu/tab_settings.lua -msgid "Trilinear Filter" -msgstr "ڤناڤيسن تريلينيار" - -#: builtin/mainmenu/tab_settings.lua -msgid "No Mipmap" -msgstr "تيادا ڤتا ميڤ" - -#: builtin/mainmenu/tab_settings.lua -msgid "Mipmap" -msgstr "ڤتا ميڤ" - -#: builtin/mainmenu/tab_settings.lua -msgid "Mipmap + Aniso. Filter" -msgstr "ڤتا ميڤ + ڤناڤيسن انيسو" +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" msgstr "2x" +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "اوان 3D" + #: builtin/mainmenu/tab_settings.lua msgid "4x" msgstr "4x" @@ -862,129 +1085,182 @@ msgid "8x" msgstr "8x" #: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "اداکه اندا ماهو سيت سمولا دنيا ڤماءين ڤرساورڠن؟" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "ياء" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "تيدق" - -#: builtin/mainmenu/tab_settings.lua -msgid "Smooth Lighting" -msgstr "ڤنچهاياءن لمبوت" - -#: builtin/mainmenu/tab_settings.lua -msgid "Particles" -msgstr "ڤرتيکل" - -#: builtin/mainmenu/tab_settings.lua -msgid "3D Clouds" -msgstr "اوان 3D" - -#: builtin/mainmenu/tab_settings.lua -msgid "Opaque Water" -msgstr "اءير لݢڤ" - -#: builtin/mainmenu/tab_settings.lua -msgid "Connected Glass" -msgstr "کاچ برسمبوڠن" - -#: builtin/mainmenu/tab_settings.lua -msgid "Texturing:" -msgstr "جالينن:" +msgid "All Settings" +msgstr "سموا تتڤن" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" msgstr "انتيالياس:" -#: builtin/mainmenu/tab_settings.lua -msgid "Screen:" -msgstr "سکرين:" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" -msgstr "اءوتوسيمڤن سايز سکرين" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Shaders" -msgstr "ڤمبايڠ" +msgstr "اٴوتوسيمڤن ساٴيز سکرين" #: builtin/mainmenu/tab_settings.lua -msgid "Shaders (unavailable)" -msgstr "ڤمبايڠ (تيدق ترسديا)" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "سيت سمولا دنيا ڤماءين ڤرساورڠن" +msgid "Bilinear Filter" +msgstr "ڤناڤيسن بيلينيار" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "توکر ککونچي" #: builtin/mainmenu/tab_settings.lua -msgid "All Settings" -msgstr "سموا تتڤن" - -#: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "نيلاي امبڠ سنتوهن: (px)" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "ڤمتاءن بيڠݢول" +msgid "Connected Glass" +msgstr "کاچ برسمبوڠن" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Tone Mapping" -msgstr "ڤمتاءن تونا" +#, fuzzy +msgid "Dynamic shadows" +msgstr "بايڠ فون" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "جان ڤتا نورمل" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "اوکلوسي ڤارالکس" +#, fuzzy +msgid "Dynamic shadows:" +msgstr "بايڠ فون" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Liquids" -msgstr "چچاءير برݢلورا" +msgid "Fancy Leaves" +msgstr "داون براݢم" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Leaves" -msgstr "داءون برݢويڠ" +msgid "High" +msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Plants" -msgstr "تومبوهن برݢويڠ" +msgid "Low" +msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "اونتوق ممبوليهکن ڤمبايڠ⹁ ڤماچو OpenGL مستي دݢوناکن." +msgid "Medium" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "ڤتا ميڤ" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "ڤتا ميڤ + ڤناڤيسن انيسو" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "تيادا تاڤيسن" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "تيادا ڤتا ميڤ" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "تونجولن نود" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "کرڠک نود" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "تيادا" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "داون لݢڤ" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "اٴير لݢڤ" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "ڤرتيکل" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "سکرين:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" msgstr "تتڤن" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "مولا ماءين ساورڠ" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "ڤمبايڠ" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "کونفيݢوراسي مودس" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "تانه تراڤوڠ (دالم اوجيکاجي)" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "اوتام" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "ڤمبايڠ (تيدق ترسديا)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "داون ريڠکس" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "ڤنچهاياٴن لمبوت" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "جالينن:" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "ڤمتاٴن تونا" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Touch threshold (px):" +msgstr "نيلاي امبڠ سنتوهن: (px)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "ڤناڤيسن تريلينيار" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "داٴون برݢويڠ" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "چچاٴير برݢلورا" + +#: builtin/mainmenu/tab_settings.lua +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 "سمبوڠن تامت تيمڤوه." +#: src/client/client.cpp +msgid "Done!" +msgstr "سلساي!" + +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "مڠاولکن نود" + +#: src/client/client.cpp +msgid "Initializing nodes..." +msgstr "سدڠ مڠاولکن نود..." + #: src/client/client.cpp msgid "Loading textures..." msgstr "سدڠ ممواتکن تيکستور..." @@ -993,254 +1269,109 @@ msgstr "سدڠ ممواتکن تيکستور..." msgid "Rebuilding shaders..." msgstr "سدڠ ممبينا سمولا ڤمبايڠ..." -#: src/client/client.cpp -msgid "Initializing nodes..." -msgstr "سدڠ مڠاولکن نود..." +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "رالت دالم ڤڽمبوڠن (تامت تيمڤوه؟)" -#: src/client/client.cpp -msgid "Initializing nodes" -msgstr "مڠاولکن نود" +#: src/client/clientlauncher.cpp +#, fuzzy +msgid "Could not find or load game: " +msgstr "تيدق جومڤ اتاو تيدق بوليه مواتکن ڤرماٴينن \"" -#: src/client/client.cpp -msgid "Done!" -msgstr "سلساي!" +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "سڤيسيفيکاسي ڤرماٴينن تيدق صح." #: src/client/clientlauncher.cpp msgid "Main Menu" msgstr "مينو اوتام" +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "تيادا دنيا دڤيليه اتاو تيادا علامت دبري. تيادا اڤ بوليه دلاکوکن." + #: src/client/clientlauncher.cpp msgid "Player name too long." -msgstr "نام ڤماءين ترلالو ڤنجڠ." - -#: src/client/clientlauncher.cpp -msgid "Connection error (timed out?)" -msgstr "رالت دالم ڤڽمبوڠن (تامت تيمڤوه؟)" - -#: src/client/clientlauncher.cpp -msgid "Provided password file failed to open: " -msgstr "فايل کات لالوان يڠ دسدياکن ݢاݢل دبوک: " +msgstr "نام ڤماٴين ترلالو ڤنجڠ." #: src/client/clientlauncher.cpp msgid "Please choose a name!" msgstr "سيلا ڤيليه سواتو نام!" #: src/client/clientlauncher.cpp -msgid "No world selected and no address provided. Nothing to do." -msgstr "تيادا دنيا دڤيليه اتاو تيادا علامت دبري. تيادا اڤ بوليه دلاکوکن." +msgid "Provided password file failed to open: " +msgstr "فايل کات لالوان يڠ دسدياکن ݢاݢل دبوک: " #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "لالوان دنيا دبري تيدق وجود: " -#: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "تيدق جومڤ اتاو تيدق بوليه مواتکن ڤرماءينن \"" - -#: src/client/clientlauncher.cpp -msgid "Invalid gamespec." -msgstr "سڤيسيفيکاسي ڤرماءينن تيدق صح." - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" +#: src/client/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" +"\n" +"ڤريقسا فايل debug.txt اونتوق معلومت لنجوت." #: src/client/game.cpp -msgid "Shutting down..." -msgstr "سدڠ منوتوڤ..." +msgid "- Address: " +msgstr "- علامت: " #: src/client/game.cpp -msgid "Creating server..." -msgstr "سدڠ منچيڤت ڤلاين..." +msgid "- Mode: " +msgstr "- مود: " #: src/client/game.cpp -msgid "Creating client..." -msgstr "سدڠ منچيڤت کليئن..." +msgid "- Port: " +msgstr "- ڤورت: " #: src/client/game.cpp -msgid "Resolving address..." -msgstr "سدڠ مڽلسايکن علامت..." +msgid "- Public: " +msgstr "- عوام: " + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +msgid "- PvP: " +msgstr "- PvP: " #: src/client/game.cpp -msgid "Connecting to server..." -msgstr "سدڠ مڽمبوڠ کڤد ڤلاين..." +msgid "- Server Name: " +msgstr "- نام ڤلاين: " #: src/client/game.cpp -msgid "Item definitions..." -msgstr "سدڠ منتعريفکن ايتم..." - -#: src/client/game.cpp -msgid "Node definitions..." -msgstr "سدڠ منتعريفکن نود..." - -#: src/client/game.cpp -msgid "Media..." -msgstr "سدڠ ممواتکن ميديا..." - -#: src/client/game.cpp -msgid "KiB/s" -msgstr "KiB/s" - -#: src/client/game.cpp -msgid "MiB/s" -msgstr "MiB/s" - -#: src/client/game.cpp -msgid "Client side scripting is disabled" -msgstr "سکريڤ ڤيهق کليئن دلومڤوهکن" - -#: src/client/game.cpp -msgid "Sound muted" -msgstr "بوڽي دبيسوکن" - -#: src/client/game.cpp -msgid "Sound unmuted" -msgstr "بوڽي دڽهبيسوکن" - -#: src/client/game.cpp -msgid "Sound system is disabled" -msgstr "سيستم بوڽي دلومڤوهکن" +#, fuzzy +msgid "A serialization error occurred:" +msgstr "تله برلاکوڽ رالت:" #: src/client/game.cpp #, c-format -msgid "Volume changed to %d%%" -msgstr "ککواتن بوڽي داوبه کڤد %d%%" - -#: src/client/game.cpp -msgid "Sound system is not supported on this build" -msgstr "سيستم بوڽي تيدق دسوکوڠ دبيناءن اين" - -#: src/client/game.cpp -msgid "ok" -msgstr "اوکي" - -#: src/client/game.cpp -msgid "Fly mode enabled" -msgstr "مود تربڠ دبوليهکن" - -#: src/client/game.cpp -msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "مود تربڠ دبوليهکن (نوت: تيادا کأيستيميواءن 'تربڠ')" - -#: src/client/game.cpp -msgid "Fly mode disabled" -msgstr "مود تربڠ دلومڤوهکن" - -#: src/client/game.cpp -msgid "Pitch move mode enabled" -msgstr "مود ڤرݢرقن ڤيچ دبوليهکن" - -#: src/client/game.cpp -msgid "Pitch move mode disabled" -msgstr "مود ڤرݢرقن ڤيچ دلومڤوهکن" - -#: src/client/game.cpp -msgid "Fast mode enabled" -msgstr "مود ڤرݢرقن ڤنتس دبوليهکن" - -#: src/client/game.cpp -msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "مود ڤرݢرقن ڤنتس دبوليهکن (نوت: تيادا کأيستيميواءن 'ڤرݢرقن ڤنتس')" - -#: src/client/game.cpp -msgid "Fast mode disabled" -msgstr "مود ڤرݢرقن ڤنتس دلومڤوهکن" - -#: src/client/game.cpp -msgid "Noclip mode enabled" -msgstr "مود تمبوس بلوک دبوليهکن" - -#: src/client/game.cpp -msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "مود تمبوس بلوک دبوليهکن (نوت: تيادا کأيستيميواءن 'تمبوس بلوک')" - -#: src/client/game.cpp -msgid "Noclip mode disabled" -msgstr "مود تمبوس بلوک دلومڤوهکن" - -#: src/client/game.cpp -msgid "Cinematic mode enabled" -msgstr "مود سينماتيک دبوليهکن" - -#: src/client/game.cpp -msgid "Cinematic mode disabled" -msgstr "مود سينماتيک دلومڤوهکن" - -#: src/client/game.cpp -msgid "Automatic forward enabled" -msgstr "ڤرݢرقن اءوتوماتيک دبوليهکن" +msgid "Access denied. Reason: %s" +msgstr "" #: src/client/game.cpp msgid "Automatic forward disabled" -msgstr "ڤرݢرقن اءوتوماتيک دلومڤوهکن" +msgstr "ڤرݢرقن اٴوتوماتيک دلومڤوهکن" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "ڤتا ميني دالم مود ڤرموکاءن⹁ زوم 1x" +msgid "Automatic forward enabled" +msgstr "ڤرݢرقن اٴوتوماتيک دبوليهکن" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "ڤتا ميني دالم مود ڤرموکاءن⹁ زوم 2x" +msgid "Block bounds hidden" +msgstr "" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "ڤتا ميني دالم مود ڤرموکاءن⹁ زوم 4x" +msgid "Block bounds shown for all blocks" +msgstr "" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "ڤتا ميني دالم مود رادر⹁ زوم 1x" +msgid "Block bounds shown for current block" +msgstr "" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "ڤتا ميني دالم مود رادر⹁ زوم 2x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "ڤتا ميني دالم مود رادر⹁ زوم 4x" - -#: src/client/game.cpp -msgid "Minimap hidden" -msgstr "ڤتا ميني دسمبوڽيکن" - -#: src/client/game.cpp -msgid "Minimap currently disabled by game or mod" -msgstr "ڤتا ميني دلومڤوهکن اوليه ڤرماءينن اتاو مودس" - -#: src/client/game.cpp -msgid "Fog disabled" -msgstr "کابوت دلومڤوهکن" - -#: src/client/game.cpp -msgid "Fog enabled" -msgstr "کابوت دبوليهکن" - -#: src/client/game.cpp -msgid "Debug info shown" -msgstr "معلومت ڽهڤڤيجت دتونجوقکن" - -#: src/client/game.cpp -msgid "Profiler graph shown" -msgstr "ݢراف ڤمبوکه دتونجوقکن" - -#: src/client/game.cpp -msgid "Wireframe shown" -msgstr "رڠک داواي دتونجوقکن" - -#: src/client/game.cpp -msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "معلومت ڽهڤڤيجت⹁ ݢراف ڤمبوکه⹁ دان رڠک داواي دسمبوڽيکن" - -#: src/client/game.cpp -msgid "Debug info and profiler graph hidden" -msgstr "معلومت ڽهڤڤيجت دان ݢراف ڤمبوکه دسمبوڽيکن" +msgid "Block bounds shown for nearby blocks" +msgstr "" #: src/client/game.cpp msgid "Camera update disabled" @@ -1251,31 +1382,99 @@ msgid "Camera update enabled" msgstr "کمس کيني کاميرا دبوليهکن" #: src/client/game.cpp -#, c-format -msgid "Viewing range is at maximum: %d" -msgstr "جارق ڤندڠ براد دتاهڤ مکسيموم: %d" +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + +#: src/client/game.cpp +msgid "Change Password" +msgstr "توکر کات لالوان" + +#: src/client/game.cpp +msgid "Cinematic mode disabled" +msgstr "مود سينماتيک دلومڤوهکن" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "مود سينماتيک دبوليهکن" + +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "مودس کليئن" + +#: src/client/game.cpp +msgid "Client side scripting is disabled" +msgstr "سکريڤ ڤيهق کليئن دلومڤوهکن" + +#: src/client/game.cpp +msgid "Connecting to server..." +msgstr "سدڠ مڽمبوڠ کڤد ڤلاين..." + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + +#: src/client/game.cpp +msgid "Continue" +msgstr "تروسکن" + +#: src/client/game.cpp +#, fuzzy, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- 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" +"- تتيکوس: ڤوسيڠ\\ليهت سکليليڠ\n" +"- تتيکوس کيري: ݢالي\\کتوق\n" +"- تتيکوس کانن: لتق\\ݢونا\n" +"- رودا تتيکوس: ڤيليه ايتم\n" +"- %s: سيمبڠ\n" #: src/client/game.cpp #, c-format -msgid "Viewing range changed to %d" -msgstr "جارق ڤندڠ دتوکر ک%d" +msgid "Couldn't resolve address: %s" +msgstr "" #: src/client/game.cpp -#, c-format -msgid "Viewing range is at minimum: %d" -msgstr "جارق ڤندڠ براد دتاهڤ مينيموم: %d" +msgid "Creating client..." +msgstr "سدڠ منچيڤت کليئن..." #: src/client/game.cpp -msgid "Enabled unlimited viewing range" -msgstr "جارق ڤندڠ تنڤ حد دبوليهکن" +msgid "Creating server..." +msgstr "سدڠ منچيڤت ڤلاين..." #: src/client/game.cpp -msgid "Disabled unlimited viewing range" -msgstr "جارق ڤندڠ تنڤ حد دلومڤوهکن" +msgid "Debug info and profiler graph hidden" +msgstr "معلومت ڽهڤڤيجت دان ݢراف ڤمبوکه دسمبوڽيکن" #: src/client/game.cpp -msgid "Zoom currently disabled by game or mod" -msgstr "زوم سدڠ دلومڤوهکن اوليه ڤرماءينن اتاو مودس" +msgid "Debug info shown" +msgstr "معلومت ڽهڤڤيجت دتونجوقکن" + +#: src/client/game.cpp +msgid "Debug info, profiler graph, and wireframe hidden" +msgstr "معلومت ڽهڤڤيجت⹁ ݢراف ڤمبوکه⹁ دان رڠک داواي دسمبوڽيکن" #: src/client/game.cpp msgid "" @@ -1306,53 +1505,17 @@ msgstr "" " --> لتق ساتو ايتم دري تيندنن کدالم سلوت\n" #: src/client/game.cpp -#, c-format -msgid "" -"Controls:\n" -"- %s: move forwards\n" -"- %s: move backwards\n" -"- %s: move left\n" -"- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" -"- %s: drop item\n" -"- %s: inventory\n" -"- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" -"- 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" -"- تتيکوس: ڤوسيڠ\\ليهت سکليليڠ\n" -"- تتيکوس کيري: ݢالي\\کتوق\n" -"- تتيکوس کانن: لتق\\ݢونا\n" -"- رودا تتيکوس: ڤيليه ايتم\n" -"- %s: سيمبڠ\n" +msgid "Disabled unlimited viewing range" +msgstr "جارق ڤندڠ تنڤ حد دلومڤوهکن" #: src/client/game.cpp -msgid "Continue" -msgstr "تروسکن" +msgid "Enabled unlimited viewing range" +msgstr "جارق ڤندڠ تنڤ حد دبوليهکن" #: src/client/game.cpp -msgid "Change Password" -msgstr "توکر کات لالوان" - -#: src/client/game.cpp -msgid "Game paused" -msgstr "ڤرماءينن دجيداکن" - -#: src/client/game.cpp -msgid "Sound Volume" -msgstr "ککواتن بوڽي" +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "سدڠ منچيڤت کليئن..." #: src/client/game.cpp msgid "Exit to Menu" @@ -1360,224 +1523,341 @@ msgstr "کلوار کمينو" #: src/client/game.cpp msgid "Exit to OS" -msgstr "کلوار تروس ڤرماءينن" +msgstr "کلوار تروس ڤرماٴينن" + +#: src/client/game.cpp +msgid "Fast mode disabled" +msgstr "مود ڤرݢرقن ڤنتس دلومڤوهکن" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "مود ڤرݢرقن ڤنتس دبوليهکن" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "مود ڤرݢرقن ڤنتس دبوليهکن (نوت: تيادا کأيستيميواٴن 'ڤرݢرقن ڤنتس')" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "مود تربڠ دلومڤوهکن" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "مود تربڠ دبوليهکن" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "مود تربڠ دبوليهکن (نوت: تيادا کأيستيميواٴن 'تربڠ')" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "کابوت دلومڤوهکن" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "کابوت دبوليهکن" #: src/client/game.cpp msgid "Game info:" -msgstr "معلومت ڤرماءينن:" +msgstr "معلومت ڤرماٴينن:" #: src/client/game.cpp -msgid "- Mode: " -msgstr "- مود: " - -#: src/client/game.cpp -msgid "Remote server" -msgstr "ڤلاين جارق جاءوه" - -#: src/client/game.cpp -msgid "- Address: " -msgstr "- علامت: " +msgid "Game paused" +msgstr "ڤرماٴينن دجيداکن" #: src/client/game.cpp msgid "Hosting server" msgstr "مڠهوس ڤلاين" #: src/client/game.cpp -msgid "- Port: " -msgstr "- ڤورت: " +msgid "Item definitions..." +msgstr "سدڠ منتعريفکن ايتم..." #: src/client/game.cpp -msgid "Singleplayer" -msgstr "ڤماءين ڤرسأورڠن" +msgid "KiB/s" +msgstr "KiB/s" #: src/client/game.cpp -msgid "On" -msgstr "بوک" +msgid "Media..." +msgstr "سدڠ ممواتکن ميديا..." + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "MiB/s" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "ڤتا ميني دلومڤوهکن اوليه ڤرماٴينن اتاو مودس" + +#: src/client/game.cpp +#, fuzzy +msgid "Multiplayer" +msgstr "ڤماٴين ڤرسأورڠن" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "مود تمبوس بلوک دلومڤوهکن" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "مود تمبوس بلوک دبوليهکن" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" +msgstr "مود تمبوس بلوک دبوليهکن (نوت: تيادا کأيستيميواٴن 'تمبوس بلوک')" + +#: src/client/game.cpp +msgid "Node definitions..." +msgstr "سدڠ منتعريفکن نود..." #: src/client/game.cpp msgid "Off" msgstr "توتوڤ" #: src/client/game.cpp -msgid "- Damage: " -msgstr "- بوليه چدرا " +msgid "On" +msgstr "بوک" #: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- مود کرياتيف: " - -#. ~ PvP = Player versus Player -#: src/client/game.cpp -msgid "- PvP: " -msgstr "- PvP: " +msgid "Pitch move mode disabled" +msgstr "مود ڤرݢرقن ڤيچ دلومڤوهکن" #: src/client/game.cpp -msgid "- Public: " -msgstr "- عوام: " +msgid "Pitch move mode enabled" +msgstr "مود ڤرݢرقن ڤيچ دبوليهکن" #: src/client/game.cpp -msgid "- Server Name: " -msgstr "- نام ڤلاين: " +msgid "Profiler graph shown" +msgstr "ݢراف ڤمبوکه دتونجوقکن" #: src/client/game.cpp -msgid "" -"\n" -"Check debug.txt for details." +msgid "Remote server" +msgstr "ڤلاين جارق جاٴوه" + +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "سدڠ مڽلسايکن علامت..." + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "سدڠ منوتوڤ..." + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "ڤماٴين ڤرسأورڠن" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "ککواتن بوڽي" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "بوڽي دبيسوکن" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "سيستم بوڽي دلومڤوهکن" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "سيستم بوڽي تيدق دسوکوڠ دبيناٴن اين" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "بوڽي دڽهبيسوکن" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." msgstr "" -"\n" -"ڤريقسا فايل debug.txt اونتوق معلومت لنجوت." -#: src/client/gameui.cpp -msgid "Chat shown" -msgstr "سيمبڠ دتونجوقکن" +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "جارق ڤندڠ دتوکر ک%d" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +msgstr "جارق ڤندڠ براد دتاهڤ مکسيموم: %d" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at minimum: %d" +msgstr "جارق ڤندڠ براد دتاهڤ مينيموم: %d" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "ککواتن بوڽي داوبه کڤد %d%%" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "رڠک داواي دتونجوقکن" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "زوم سدڠ دلومڤوهکن اوليه ڤرماٴينن اتاو مودس" + +#: src/client/game.cpp +msgid "ok" +msgstr "اوکي" #: src/client/gameui.cpp msgid "Chat hidden" msgstr "سيمبڠ دسمبوڽيکن" #: src/client/gameui.cpp -msgid "HUD shown" -msgstr "ڤاڤر ڤندو (HUD) دتونجوقکن" +msgid "Chat shown" +msgstr "سيمبڠ دتونجوقکن" #: src/client/gameui.cpp msgid "HUD hidden" msgstr "ڤاڤر ڤندو (HUD) دسمبوڽيکن" #: src/client/gameui.cpp -#, c-format -msgid "Profiler shown (page %d of %d)" -msgstr "ڤمبوکه دتونجوقکن (هلامن %d دري %d)" +msgid "HUD shown" +msgstr "ڤاڤر ڤندو (HUD) دتونجوقکن" #: src/client/gameui.cpp msgid "Profiler hidden" msgstr "ڤمبوکه دسمبوڽيکن" -#: src/client/keycode.cpp -msgid "Left Button" -msgstr "بوتڠ کيري" +#: src/client/gameui.cpp +#, c-format +msgid "Profiler shown (page %d of %d)" +msgstr "ڤمبوکه دتونجوقکن (هلامن %d دري %d)" #: src/client/keycode.cpp -msgid "Right Button" -msgstr "بوتڠ کانن" - -#: src/client/keycode.cpp -msgid "Middle Button" -msgstr "بوتڠ تڠه" - -#: src/client/keycode.cpp -msgid "X Button 1" -msgstr "بوتڠ X نومبور 1" - -#: src/client/keycode.cpp -msgid "X Button 2" -msgstr "بوتڠ X نومبور 2" +msgid "Apps" +msgstr "اڤليکاسي" #: src/client/keycode.cpp msgid "Backspace" msgstr "Backspace" #: src/client/keycode.cpp -msgid "Tab" -msgstr "Tab" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "ڤادم" - -#: src/client/keycode.cpp -msgid "Return" -msgstr "Enter" - -#: src/client/keycode.cpp -msgid "Shift" -msgstr "Shift" +msgid "Caps Lock" +msgstr "کونچي حروف بسر" #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" +#: src/client/keycode.cpp +msgid "Down" +msgstr "باواه" + +#: src/client/keycode.cpp +msgid "End" +msgstr "End" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "ڤادم EOF" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "لاکوکن" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "بنتوان" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "Home" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "IME - تريما" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "IME - توکر" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "IME - کلوار" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "IME - توکر مود" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "IME - تيدقتوکر" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "Insert" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "ککيري" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "بوتڠ کيري" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "Ctrl کيري" + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "مينو کيري" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "Shift کيري" + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "Windows کيري" + #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp msgid "Menu" msgstr "Menu" #: src/client/keycode.cpp -msgid "Pause" -msgstr "Pause" +msgid "Middle Button" +msgstr "بوتڠ تڠه" #: src/client/keycode.cpp -msgid "Caps Lock" -msgstr "کونچي حروف بسر" +msgid "Num Lock" +msgstr "کونچي اڠک" #: src/client/keycode.cpp -msgid "Space" -msgstr "سلاڠ" +msgid "Numpad *" +msgstr "ڤد اڠک *" #: src/client/keycode.cpp -msgid "Page up" -msgstr "Page up" +msgid "Numpad +" +msgstr "ڤد اڠک +" #: src/client/keycode.cpp -msgid "Page down" -msgstr "Page down" +msgid "Numpad -" +msgstr "ڤد اڠک -" #: src/client/keycode.cpp -msgid "End" -msgstr "End" +msgid "Numpad ." +msgstr "ڤد اڠک ." #: src/client/keycode.cpp -msgid "Home" -msgstr "Home" - -#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -msgid "Left" -msgstr "ککيري" - -#: src/client/keycode.cpp -msgid "Up" -msgstr "اتس" - -#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -msgid "Right" -msgstr "ککانن" - -#: src/client/keycode.cpp -msgid "Down" -msgstr "باواه" - -#. ~ Key name -#: src/client/keycode.cpp -msgid "Select" -msgstr "Select" - -#. ~ "Print screen" key -#: src/client/keycode.cpp -msgid "Print" -msgstr "Print Screen" - -#: src/client/keycode.cpp -msgid "Execute" -msgstr "لاکوکن" - -#: src/client/keycode.cpp -msgid "Snapshot" -msgstr "تڠکڤ ݢمبر سکرين" - -#: src/client/keycode.cpp -msgid "Insert" -msgstr "Insert" - -#: src/client/keycode.cpp -msgid "Help" -msgstr "بنتوان" - -#: src/client/keycode.cpp -msgid "Left Windows" -msgstr "Windows کيري" - -#: src/client/keycode.cpp -msgid "Right Windows" -msgstr "Windows کانن" +msgid "Numpad /" +msgstr "ڤد اڠک /" #: src/client/keycode.cpp msgid "Numpad 0" @@ -1620,260 +1900,248 @@ msgid "Numpad 9" msgstr "ڤد اڠک 9" #: src/client/keycode.cpp -msgid "Numpad *" -msgstr "ڤد اڠک *" +msgid "OEM Clear" +msgstr "ڤادم OEM" #: src/client/keycode.cpp -msgid "Numpad +" -msgstr "ڤد اڠک +" +msgid "Page down" +msgstr "Page down" #: src/client/keycode.cpp -msgid "Numpad ." -msgstr "ڤد اڠک ." +msgid "Page up" +msgstr "Page up" #: src/client/keycode.cpp -msgid "Numpad -" -msgstr "ڤد اڠک -" +msgid "Pause" +msgstr "Pause" #: src/client/keycode.cpp -msgid "Numpad /" -msgstr "ڤد اڠک /" +msgid "Play" +msgstr "مولا ماٴين" + +#. ~ "Print screen" key +#: src/client/keycode.cpp +msgid "Print" +msgstr "Print Screen" #: src/client/keycode.cpp -msgid "Num Lock" -msgstr "کونچي اڠک" +msgid "Return" +msgstr "Enter" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" +msgstr "ککانن" #: src/client/keycode.cpp -msgid "Scroll Lock" -msgstr "کونچي تاتل" - -#: src/client/keycode.cpp -msgid "Left Shift" -msgstr "Shift کيري" - -#: src/client/keycode.cpp -msgid "Right Shift" -msgstr "Shift کانن" - -#: src/client/keycode.cpp -msgid "Left Control" -msgstr "Ctrl کيري" +msgid "Right Button" +msgstr "بوتڠ کانن" #: src/client/keycode.cpp msgid "Right Control" msgstr "Ctrl کانن" -#: src/client/keycode.cpp -msgid "Left Menu" -msgstr "مينو کيري" - #: src/client/keycode.cpp msgid "Right Menu" msgstr "مينو کانن" #: src/client/keycode.cpp -msgid "IME Escape" -msgstr "IME - کلوار" +msgid "Right Shift" +msgstr "Shift کانن" #: src/client/keycode.cpp -msgid "IME Convert" -msgstr "IME - توکر" +msgid "Right Windows" +msgstr "Windows کانن" #: src/client/keycode.cpp -msgid "IME Nonconvert" -msgstr "IME - تيدقتوکر" +msgid "Scroll Lock" +msgstr "کونچي تاتل" + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" +msgstr "Select" #: src/client/keycode.cpp -msgid "IME Accept" -msgstr "IME - تريما" - -#: src/client/keycode.cpp -msgid "IME Mode Change" -msgstr "IME - توکر مود" - -#: src/client/keycode.cpp -msgid "Apps" -msgstr "اڤليکاسي" +msgid "Shift" +msgstr "Shift" #: src/client/keycode.cpp msgid "Sleep" msgstr "تيدور" #: src/client/keycode.cpp -msgid "Erase EOF" -msgstr "ڤادم EOF" +msgid "Snapshot" +msgstr "تڠکڤ ݢمبر سکرين" #: src/client/keycode.cpp -msgid "Play" -msgstr "مولا ماءين" +msgid "Space" +msgstr "سلاڠ" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "Tab" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "اتس" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "بوتڠ X نومبور 1" + +#: src/client/keycode.cpp +msgid "X Button 2" +msgstr "بوتڠ X نومبور 2" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" msgstr "زوم" -#: src/client/keycode.cpp -msgid "OEM Clear" -msgstr "ڤادم OEM" +#: src/client/minimap.cpp +msgid "Minimap hidden" +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." +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "ڤتا ميني دالم مود رادر⹁ زوم 1x" + +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "ڤتا ميني دالم مود ڤرموکاٴن⹁ زوم 1x" + +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap in texture mode" +msgstr "سايز تيکستور مينيموم" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "ݢاݢل مموات تورون $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" -"اندا اکن سرتاءي ڤلاين دڠن نام \"%s\" اونتوق کالي ڤرتام.\n" -"جيک اندا تروسکن⹁ اکاءون بهارو دڠن معلومت اندا اکن دچيڤت دڤلاين اين.\n" -"سيلا تايڤ سمولا کات لالوان اندا دان کليک 'دفتر دان سرتاءي' اونتوق صحکن " -"ڤنچيڤتاءن اکاءون⹁ اتاو کليک 'باتل' اونتوق ممباتلکن." - -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "دفتر دان سرتاءي" - -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "کات لالوان تيدق ڤادن!" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "تروسکن" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "" -"ايکتن ککونچي. (جيک مينو اين برسليرق⹁ ڤادم سستڠه بندا دري فايل minetest.conf)" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +#, fuzzy +msgid "\"Aux1\" = climb down" msgstr "\"ايستيميوا\" = ڤنجت تورون" #: src/gui/guiKeyChangeMenu.cpp -msgid "Double tap \"jump\" to toggle fly" -msgstr "تکن دوا کالي \"لومڤت\" اونتوق منوݢول تربڠ" +msgid "Autoforward" +msgstr "أوتوڤرݢرقن" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" msgstr "لومڤت أوتوماتيک" #: src/gui/guiKeyChangeMenu.cpp -msgid "Key already in use" -msgstr "ککونچي تله دݢوناکن اونتوق فوڠسي لاءين" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "press key" -msgstr "تکن ککونچي" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Forward" -msgstr "کدڤن" +msgid "Aux1" +msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "کبلاکڠ" #: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "ايستيميوا" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Jump" -msgstr "لومڤت" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Sneak" -msgstr "سلينڤ" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Drop" -msgstr "جاتوهکن" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inventory" -msgstr "اينۏينتوري" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Prev. item" -msgstr "ايتم سبلومڽ" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Next item" -msgstr "ايتم ستروسڽ" +msgid "Block bounds" +msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "توکر کاميرا" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle minimap" -msgstr "توݢول ڤتا ميني" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle fly" -msgstr "توݢول تربڠ" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle pitchmove" -msgstr "توݢول ڤرݢرقن منچورم" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle fast" -msgstr "توݢول ڤرݢرقن ڤنتس" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle noclip" -msgstr "توݢول تمبوس بلوک" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Mute" -msgstr "بيسو" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Dec. volume" -msgstr "ڤرلاهنکن بوڽي" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inc. volume" -msgstr "کواتکن بوڽي" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Autoforward" -msgstr "أوتوڤرݢرقن" - -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "سيمبڠ" -#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp -msgid "Screenshot" -msgstr "تڠکڤ لاير" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Range select" -msgstr "جارق ڤميليهن" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Dec. range" -msgstr "کورڠکن جارق" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inc. range" -msgstr "ناءيقکن جارق" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Console" -msgstr "کونسول" - #: src/gui/guiKeyChangeMenu.cpp msgid "Command" msgstr "ارهن" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "کونسول" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "کورڠکن جارق" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "ڤرلاهنکن بوڽي" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "تکن دوا کالي \"لومڤت\" اونتوق منوݢول تربڠ" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "جاتوهکن" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "کدڤن" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "ناٴيقکن جارق" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "کواتکن بوڽي" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "اينۏينتوري" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "لومڤت" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "ککونچي تله دݢوناکن اونتوق فوڠسي لاٴين" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" msgstr "ارهن تمڤتن" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "بيسو" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "ايتم ستروسڽ" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "ايتم سبلومڽ" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "جارق ڤميليهن" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "تڠکڤ لاير" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "سلينڤ" + #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "توݢول ڤاڤر ڤندو (HUD)" @@ -1882,29 +2150,49 @@ msgstr "توݢول ڤاڤر ڤندو (HUD)" msgid "Toggle chat log" msgstr "توݢول لوݢ سيمبڠ" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "توݢول ڤرݢرقن ڤنتس" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "توݢول تربڠ" + #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" msgstr "توݢول کابوت" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "توݢول ڤتا ميني" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "توݢول تمبوس بلوک" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "توݢول ڤرݢرقن منچورم" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "تکن ککونچي" + #: src/gui/guiPasswordChange.cpp -msgid "Old Password" -msgstr "کات لالوان لام" +msgid "Change" +msgstr "توکر" #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "کات لالوان بارو" #: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "صحکن کات لالوان" +msgid "Old Password" +msgstr "کات لالوان لام" #: src/gui/guiPasswordChange.cpp -msgid "Change" -msgstr "توکر" - -#: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "ککواتن بوڽي: " +msgid "Passwords do not match!" +msgstr "کات لالوان تيدق ڤادن!" #: src/gui/guiVolumeChange.cpp msgid "Exit" @@ -1914,11 +2202,10 @@ msgstr "کلوار" msgid "Muted" msgstr "دبيسوکن" -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "ماسوقکن " +#: src/gui/guiVolumeChange.cpp +#, fuzzy, c-format +msgid "Sound Volume: %d%%" +msgstr "ککواتن بوڽي: " #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1927,212 +2214,15 @@ msgstr "ماسوقکن " msgid "LANG_CODE" msgstr "ms_Arab" -#: src/settings_translation_file.cpp -msgid "Controls" -msgstr "کاولن" - -#: src/settings_translation_file.cpp -msgid "Build inside player" -msgstr "بينا دالم ڤماءين" - -#: src/settings_translation_file.cpp +#: src/network/clientpackethandler.cpp msgid "" -"If enabled, you can place blocks at the position (feet + eye level) where " -"you stand.\n" -"This is helpful when working with nodeboxes in small areas." +"Name is not registered. To create an account on this server, click 'Register'" msgstr "" -"جيک دبوليهکن⹁ اندا بوليه ملتق بلوک دکدودوقن برديري (کاکي + ارس مات).\n" -"اين ساڠت برݢونا اڤابيلا بکرجا دڠن کوتق نود دکاوسن يڠ کچيل." -#: src/settings_translation_file.cpp -msgid "Flying" -msgstr "تربڠ" - -#: 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 "" -"ڤماءين بوليه تربڠ تنڤ ترکسن دڠن ݢراۏيتي.\n" -"اين ممرلوکن کأيستيميواءن \"تربڠ\" دالم ڤلاين ڤرماءينن ترسبوت." - -#: src/settings_translation_file.cpp -msgid "Pitch move mode" -msgstr "مود ڤرݢرقن ڤيچ" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, makes move directions relative to the player's pitch when flying " -"or swimming." -msgstr "" -"جيک دبوليهکن⹁ اي ممبواتکن اره ڤرݢرقن ريلاتيف دڠن ڤيچ ڤماءين اڤابيلا تربڠ " -"اتاو برنڠ." - -#: src/settings_translation_file.cpp -msgid "Fast movement" -msgstr "ڤرݢرقن ڤنتس" - -#: src/settings_translation_file.cpp -msgid "" -"Fast movement (via the \"special\" key).\n" -"This requires the \"fast\" privilege on the server." -msgstr "" -"برݢرق ڤنتس (دڠن ککونچي \"ايستيميوا\").\n" -"اين ممرلوکن کأيستيميواءن \"ڤرݢرقن ڤنتس\" دالم ڤلاين ڤرماءينن ترسبوت." - -#: src/settings_translation_file.cpp -msgid "Noclip" -msgstr "تمبوس بلوک" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled together with fly mode, player is able to fly through solid " -"nodes.\n" -"This requires the \"noclip\" privilege on the server." -msgstr "" -"جيک دبوليهکن برسام مود تربڠ⹁ ڤماءين بوليه تربڠ منروسي نود ڤڤجل.\n" -"اين ممرلوکن کأيستيميواءن \"تمبوس بلوک\" دالم ڤلاين ڤرماءينن ترسبوت." - -#: src/settings_translation_file.cpp -msgid "Cinematic mode" -msgstr "مود سينماتيک" - -#: src/settings_translation_file.cpp -msgid "" -"Smooths camera when looking around. Also called look or mouse smoothing.\n" -"Useful for recording videos." -msgstr "" -"ملمبوتکن کاميرا اڤابيلا مليهت سکليليڠ. جوݢ دکنلي سباݢاي ڤلمبوتن ڤڠليهتن اتاو " -"ڤلمبوتن تتيکوس.\n" -"برݢونا اونتوق مراکم ۏيديو." - -#: src/settings_translation_file.cpp -msgid "Camera smoothing" -msgstr "ڤلمبوتن کاميرا" - -#: src/settings_translation_file.cpp -msgid "Smooths rotation of camera. 0 to disable." -msgstr "ملمبوتکن ڤموترن کاميرا. سيت سباݢاي 0 اونتوق ملومڤوهکنڽ." - -#: src/settings_translation_file.cpp -msgid "Camera smoothing in cinematic mode" -msgstr "ڤلمبوتن کاميرا دالم مود سينماتيک" - -#: src/settings_translation_file.cpp -msgid "Smooths rotation of camera in cinematic mode. 0 to disable." -msgstr "" -"ملمبوتکن ڤموترن کاميرا دالم مود سينماتيک. سيت سباݢاي 0 اونتوق ملومڤوهکنڽ." - -#: src/settings_translation_file.cpp -msgid "Invert mouse" -msgstr "تتيکوس سوڠسڠ" - -#: src/settings_translation_file.cpp -msgid "Invert vertical mouse movement." -msgstr "مڽوڠسڠکن ڤرݢرقن تتيکوس منݢق." - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity" -msgstr "کڤيکاءن تتيکوس" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity multiplier." -msgstr "ڤندارب کڤيکاءن تتيکوس." - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "ککونچي اونتوق ممنجت\\منورون" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" -"descending." -msgstr "" -"جيک دبوليهکن⹁ ککونچي \"ايستيميوا\" اکن دݢوناکن اونتوق ڤنجت کباوه دان\n" -"تورون دالم مود تربڠ⹁ مڠݢنتيکن ککونچي \"سلينڤ\"." - -#: src/settings_translation_file.cpp -msgid "Double tap jump for fly" -msgstr "تکن \"لومڤت\" دوا کالي اونتوق تربڠ" - -#: src/settings_translation_file.cpp -msgid "Double-tapping the jump key toggles fly mode." -msgstr "تکن بوتڠ \"لومڤت\" سچارا چڤت دوا کالي اونتوق منوݢول مود تربڠ." - -#: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "سنتياس تربڠ دان برݢرق ڤنتس" - -#: src/settings_translation_file.cpp -msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" -"enabled." -msgstr "" -"جيک دلومڤوهکن⹁ ککونچي \"ايستيميوا\" اکن دݢوناکن اونتوق تربڠ لاجو\n" -"سکيراڽ کدوا-دوا مود تربڠ دان مود ڤرݢرقن ڤنتس دبوليهکن." - -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "سلڠ ڤڠاولڠن کليک کانن" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." -msgstr "" -"جومله ماس دالم ساءت دامبيل اونتوق ملاکوکن کليک کانن يڠ براولڠ اڤابيلا\n" -"ڤماءين منکن بوتڠ تتيکوس کانن تنڤ ملڤسکنڽ." - -#: src/settings_translation_file.cpp -msgid "Automatically jump up single-node obstacles." -msgstr "لومڤت هالڠن ساتو-نود سچارا أوروماتيک." - -#: src/settings_translation_file.cpp -msgid "Safe digging and placing" -msgstr "ڤڠݢالين دان ڤلتقن سلامت" - -#: 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 "" -"منچݢه ݢالي دان ڤلتقن درڤد براولڠ کتيک تروس منکن بوتڠ تتيکوس.\n" -"بوليهکن تتڤن اين اڤابيلا اندا ݢالي اتاو لتق سچارا تيدق سڠاج ترلالو کرڤ." - -#: src/settings_translation_file.cpp -msgid "Random input" -msgstr "اينڤوت راوق" - -#: src/settings_translation_file.cpp -msgid "Enable random user input (only used for testing)." -msgstr "ممبوليهکن اينڤوت ڤڠݢونا سچارا راوق (هاڽ اونتوق ڤرچوباءن)." - -#: src/settings_translation_file.cpp -msgid "Continuous forward" -msgstr "کدڤن برتروسن" - -#: 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 "" -"ڤرݢرقن کدڤن برتروسن⹁ دتوݢول اوليه ککونچي أوتوڤرݢرقن.\n" -"تکن ککونچي أوتوڤرݢرقن لاݢي اتاو ڤرݢرقن کبلاکڠ اونتوق ملومڤوهکنڽ." - -#: src/settings_translation_file.cpp -msgid "Touch screen threshold" -msgstr "نيلاي امبڠ سکرين سنتوه" - -#: src/settings_translation_file.cpp -msgid "The length in pixels it takes for touch screen interaction to start." -msgstr "ڤنجڠ دالم ڤيکسيل اونتوق ممولاکن اينتراکسي سکرين سنتوه." - -#: src/settings_translation_file.cpp -msgid "Fixed virtual joystick" -msgstr "کايو بديق ماي تتڤ" +#: src/network/clientpackethandler.cpp +#, fuzzy +msgid "Name is taken. Please choose another name" +msgstr "سيلا ڤيليه سواتو نام!" #: src/settings_translation_file.cpp msgid "" @@ -2144,1604 +2234,119 @@ msgstr "" "سنتوهن ڤرتام." #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "کايو بديق ماي مميچو بوتڠ aux" - -#: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) ݢوناکن کايو بديق ماي اونتوق ڤيچو بوتڠ \"aux\".\n" "جيک دبوليهکن⹁ کايو بديق ماي جوݢ اکن منکن بوتڠ \"aux\" اڤابيلا براد دلوار " "بولتن اوتام." -#: src/settings_translation_file.cpp -msgid "Enable joysticks" -msgstr "ممبوليهکن کايو بديق" - -#: src/settings_translation_file.cpp -msgid "Joystick ID" -msgstr "ID کايو بديق" - -#: src/settings_translation_file.cpp -msgid "The identifier of the joystick to use" -msgstr "ڤڠنل ڤستي کايو بديق يڠ دݢوناکن" - -#: src/settings_translation_file.cpp -msgid "Joystick type" -msgstr "جنيس کايو بديق" - -#: src/settings_translation_file.cpp -msgid "The type of joystick" -msgstr "جنيس کايو بديق" - -#: src/settings_translation_file.cpp -msgid "Joystick button repetition interval" -msgstr "سلڠ ماس ڤڠاولڠن بوتڠ کايو بديق" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated events\n" -"when holding down a joystick button combination." -msgstr "" -"سلڠ ماس دالم ساءت⹁ دامبيل انتارا ڤريستيوا يڠ براولڠن\n" -"اڤابيلا منکن کومبيناسي بوتڠ کايو بديق." - -#: src/settings_translation_file.cpp -msgid "Joystick frustum sensitivity" -msgstr "کڤيکاءن فروستوم کايو بديق" - -#: src/settings_translation_file.cpp -msgid "" -"The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." -msgstr "" -"کڤيکاءن ڤکسي کايو بديق اونتوق مڠݢرقکن\n" -"فروستوم ڤڠليهتن دالم ڤرماءينن." - -#: src/settings_translation_file.cpp -msgid "Forward key" -msgstr "ککونچي کدڤن" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player forward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مڠݢرقکن ڤماءين کدڤن.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Backward key" -msgstr "ککونچي کبلاکڠ" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player backward.\n" -"Will also disable autoforward, when active.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مڠݢرقکن ڤماءين کبلاکڠ.\n" -"جوݢ اکن ملومڤوهکن أوتوڤرݢرقن⹁ اڤابيلا اکتيف.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Left key" -msgstr "ککونچي ککيري" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player left.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مڠݢرقکن ڤماءين ککيري.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Right key" -msgstr "ککومچي ککانن" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player right.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مڠݢرقکن ڤماءين ککانن.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Jump key" -msgstr "ککونچي لومڤت" - -#: src/settings_translation_file.cpp -msgid "" -"Key for jumping.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق ملومڤت.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Sneak key" -msgstr "ککونچي سلينڤ" - -#: src/settings_translation_file.cpp -msgid "" -"Key for sneaking.\n" -"Also used for climbing down and descending in water if aux1_descends is " -"disabled.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مڽلينڤ.\n" -"جوݢ دݢوناکن اونتوق تورون باواه کتيک ممنجت دان دالم اءير جيک تتڤن " -"aux1_descends دلومڤوهکن.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Inventory key" -msgstr "ککونچي اينۏينتوري" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the inventory.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق ممبوک اينۏينتوري.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "ککونچي ايستيميوا" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving fast in fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق برݢرق ڤنتس دالم مود ڤرݢرقن ڤنتس.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Chat key" -msgstr "ککونچي سيمبڠ" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق ممبوک تتيڠکڤ سيمبڠ.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Command key" -msgstr "ککونچي ارهن" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق ممبوک تتيڠکڤ سيمبڠ اونتوق مناءيڤ ارهن.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type local commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق ممبوک تتيڠکڤ سيمبڠ اونتوق مناءيڤ ارهن تمڤتن.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Range select key" -msgstr "ککونچي جارق ڤميليهن" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling unlimited view range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول جارق ڤندڠن تيادا حد.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Fly key" -msgstr "ککونچي تربڠ" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling flying.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول مود تربڠ.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Pitch move key" -msgstr "ککونچي ڤرݢرقن ڤيچ" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling pitch move mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول مود ڤرݢرقن ڤيچ.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Fast key" -msgstr "ککونچي ڤرݢرقن ڤنتس" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول مود ڤرݢرقن ڤنتس.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Noclip key" -msgstr "ککونچي تمبوس بلوک" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling noclip mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول مود تمبوس بلوک.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar next key" -msgstr "ککونچي ايتم ستروسڽ دالم هوتبر" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the next item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه ايتم ستروسڽ ددالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar previous key" -msgstr "ککونچي ايتم سبلومڽ دالم هوتبر" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the previous item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه بارڠ سبلومڽ دهوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Mute key" -msgstr "ککونچي بيسو" - -#: src/settings_translation_file.cpp -msgid "" -"Key for muting the game.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق ممبيسوکن ڤرماءينن.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Inc. volume key" -msgstr "ککونچي کواتکن بوڽي" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مڠواتکن بوڽي.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "ککونچي ڤرلاهنکن بوڽي" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق ممڤرلاهنکن بوڽي.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Automatic forward key" -msgstr "ککونچي أوتوڤرݢرقن" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling autoforward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول أوتوڤرݢرقن.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Cinematic mode key" -msgstr "ککونچي مود سينماتيک" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling cinematic mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول مود سينماتيک.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Minimap key" -msgstr "ککونچي ڤتا ميني" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling display of minimap.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول ڤاڤرن ڤتا ميني.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "" -"Key for taking screenshots.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منڠکڤ ݢمبر لاير.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Drop item key" -msgstr "ککونچي جاتوهکن ايتم" - -#: src/settings_translation_file.cpp -msgid "" -"Key for dropping the currently selected item.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منجاتوهکن ايتم يڠ سدڠ دڤيليه.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "View zoom key" -msgstr "ککونچي زوم ڤندڠن" - -#: src/settings_translation_file.cpp -msgid "" -"Key to use view zoom when possible.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مڠݢوناکن ڤندڠن زوم اڤابيلا دبنرکن.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 1 key" -msgstr "ککونچي سلوت هوتبر 1" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the first hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ڤرتام دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 2 key" -msgstr "ککونچي سلوت هوتبر 2" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the second hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-2 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 3 key" -msgstr "ککونچي سلوت هوتبر 3" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the third hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-3 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 4 key" -msgstr "ککونچي سلوت هوتبر 4" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fourth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-4 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 5 key" -msgstr "ککونچي سلوت هوتبر 5" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fifth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-5 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 6 key" -msgstr "ککونچي سلوت هوتبر 6" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the sixth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-6 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 7 key" -msgstr "ککونچي سلوت هوتبر 7" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the seventh hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-7 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 8 key" -msgstr "ککونچي سلوت هوتبر 8" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the eighth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-8 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 9 key" -msgstr "ککونچي سلوت هوتبر 9" - #: src/settings_translation_file.cpp msgid "" -"Key for selecting the ninth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-9 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 10 key" -msgstr "ککونچي سلوت هوتبر 10" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the tenth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-10 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 11 key" -msgstr "ککونچي سلوت هوتبر 11" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 11th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-11 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 12 key" -msgstr "ککونچي سلوت هوتبر 12" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 12th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-12 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 13 key" -msgstr "ککونچي سلوت هوتبر 13" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 13th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-13 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 14 key" -msgstr "ککونچي سلوت هوتبر 14" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 14th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-14 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 15 key" -msgstr "ککونچي سلوت هوتبر 15" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 15th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-15 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 16 key" -msgstr "ککونچي سلوت هوتبر 16" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 16th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-16 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 17 key" -msgstr "ککونچي سلوت هوتبر 17" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 17th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-17 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 18 key" -msgstr "ککونچي سلوت هوتبر 18" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 18th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-18 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 19 key" -msgstr "ککونچي سلوت هوتبر 19" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 19th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-19 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 20 key" -msgstr "ککونچي سلوت هوتبر 20" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 20th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-20 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 21 key" -msgstr "ککونچي سلوت هوتبر 21" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 21st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-21 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 22 key" -msgstr "ککونچي سلوت هوتبر 22" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 22nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-22 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 23 key" -msgstr "ککونچي سلوت هوتبر 23" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 23rd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-23 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 24 key" -msgstr "ککونچي سلوت هوتبر 24" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 24th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-24 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 25 key" -msgstr "ککونچي سلوت هوتبر 25" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 25th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-25 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 26 key" -msgstr "ککونچي سلوت هوتبر 26" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 26th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-26 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 27 key" -msgstr "ککونچي سلوت هوتبر 27" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 27th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-27 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 28 key" -msgstr "ککونچي سلوت هوتبر 28" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 28th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-28 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 29 key" -msgstr "ککونچي سلوت هوتبر 29" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 29th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-29 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 30 key" -msgstr "ککونچي سلوت هوتبر 30" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 30th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-30 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 31 key" -msgstr "ککونچي سلوت هوتبر 31" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 31st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-31 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 32 key" -msgstr "ککونچي سلوت هوتبر 32" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 32nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق مميليه سلوت ک-32 دالم هوتبر.\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "HUD toggle key" -msgstr "ککونچي منوݢول ڤاڤر ڤندو (HUD)" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the HUD.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" -"ککونچي اونتوق منوݢول ڤاڤر ڤندو (HUD).\n" -"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" - -#: src/settings_translation_file.cpp -msgid "Chat toggle key" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"situations.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"(X,Y,Z) اوفسيت فراکتل دري ڤوست دنيا دالم اونيت 'سکال'.\n" +"بوليه ݢونا اونتوق ڤيندهکن تيتيق يڠ دايڠيني ک(0, 0)\n" +"اونتوق چيڤت تيتيق کلاهيرن يڠ سسواي⹁ اتاو اونتوق\n" +"ممبوليهکن 'زوم ماسوق' ڤد تيتيق يڠ دايڠينکن\n" +"دڠن مناٴيقکن 'سکال'.\n" +"نيلاي لالاي دسسوايکن اونتوق تيتيق کلاهيرن سسواي اونتوق سيت Mandelbrot\n" +"دڠن ڤاراميتر لالاي⹁ اي موڠکين ڤرلو داوبه اونتوق سيتواسي يڠ لاٴين.\n" +"جولت کاسرڽ -2 سهيڠݢ 2. داربکن دڠن 'سکال' اونتوق اوفسيت دالم نود." #: src/settings_translation_file.cpp msgid "" -"Key for toggling the display of chat.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large chat console key" +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"Default is for a vertically-squashed shape suitable for\n" +"an island, set all 3 numbers equal for the raw shape." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the large chat console.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" #: src/settings_translation_file.cpp -msgid "Fog toggle key" +msgid "2D noise that controls the shape/size of rolling hills." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of fog.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera update toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the camera update. Only used for development\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug info toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of debug info.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the profiler. Used for development.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" +msgid "2D noise that controls the shape/size of step mountains." msgstr "" #: src/settings_translation_file.cpp -msgid "Toggle camera mode key" +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Key for switching between first- and third-person camera.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range increase key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range decrease key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Graphics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VBO" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable vertex buffer objects.\n" -"This should greatly improve graphics performance." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to fog out the end of the visible area." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Leaves style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Leaves style:\n" -"- Fancy: all faces visible\n" -"- Simple: only outer faces, if defined special_tiles are used\n" -"- Opaque: disable transparency" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Connect glass" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Connects glass if supported by node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Smooth lighting" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable smooth lighting with simple ambient occlusion.\n" -"Disable for speed or for different looks." +msgid "2D noise that controls the size/occurrence of rolling hills." msgstr "" #: src/settings_translation_file.cpp -msgid "Clouds" +msgid "2D noise that controls the size/occurrence of step mountain ranges." msgstr "" #: src/settings_translation_file.cpp -msgid "Clouds are a client side effect." +msgid "2D noise that locates the river valleys and channels." msgstr "" #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use 3D cloud look instead of flat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Node highlighting" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Method used to highlight selected object." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Digging particles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Adds particles when digging a node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mipmapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" -"especially when using a high resolution texture pack.\n" -"Gamma correct downscaling is not supported." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Anisotropic filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use anisotropic filtering when viewing at textures from an angle." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bilinear filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use bilinear filtering when scaling textures." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trilinear filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use trilinear filtering when scaling textures." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clean transparent textures" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum texture size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" -"can be blurred, so automatically upscale them with nearest-neighbor\n" -"interpolation to preserve crisp pixels. This sets the minimum texture size\n" -"for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" -"This is also used as the base node texture size for world-aligned\n" -"texture autoscaling." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FSAA" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Undersampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Undersampling is similar to using a lower screen resolution, but it applies\n" -"to the game world only, keeping the GUI intact.\n" -"It should give a significant performance boost at the cost of less detailed " -"image.\n" -"Higher values result in a less detailed image." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shaders allow advanced visual effects and may increase performance on some " -"video\n" -"cards.\n" -"This only works with the OpenGL video backend." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shader path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to shader directory. If no path is defined, default location will be " -"used." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filmic tone mapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" -"Simulates the tone curve of photographic film and how this approximates the\n" -"appearance of high dynamic range images. Mid-range contrast is slightly\n" -"enhanced, highlights and shadows are gradually compressed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving Nodes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving liquids (like water).\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wave height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The maximum height of the surface of waving liquids.\n" -"4.0 = Wave height is two nodes.\n" -"0.0 = Wave doesn't move at all.\n" -"Default is 1.0 (1/2 node).\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wavelength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of liquid waves.\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wave speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How fast liquid waves will move. Higher = faster.\n" -"If negative, liquid waves will move backwards.\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving leaves" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving leaves.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving plants" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving plants.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Advanced" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Arm inertia" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Arm inertia, gives a more realistic movement of\n" -"the arm when the camera moves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Pause on lost window focus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Open the pause menu when the window's focus is lost. Does not pause if a " -"formspec is\n" -"open." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Viewing range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View distance in nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Near plane" -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" -"Increasing can reduce artifacting on weaker GPUs.\n" -"0.1 = Default, 0.25 = Good value for weaker tablets." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autosave screen size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save window size automatically when modified." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VSync" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical screen synchronization." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view in degrees." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve gamma" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Alters the light curve by applying 'gamma correction' to it.\n" -"Higher values make middle and lower light levels brighter.\n" -"Value '1.0' leaves the light curve unaltered.\n" -"This only has significant effect on daylight and artificial\n" -"light, it has very little effect on natural night light." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve low gradient" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Gradient of light curve at minimum light level.\n" -"Controls the contrast of the lowest light levels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve high gradient" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Gradient of light curve at maximum light level.\n" -"Controls the contrast of the highest light levels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Strength of light curve boost.\n" -"The 3 'boost' parameters define a range of the light\n" -"curve that is boosted in brightness." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost center" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost spread" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Spread of light curve boost range.\n" -"Controls the width of the range to be boosted.\n" -"Standard deviation of the light curve boost Gaussian." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Texture path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Path to texture directory. All textures are first searched from here." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Video driver" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The rendering back-end for Irrlicht.\n" -"A restart is required after changing this.\n" -"Note: On Android, stick with OGLES1 if unsure! App may fail to start " -"otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cloud radius" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Radius of cloud area stated in number of 64 node cloud squares.\n" -"Values larger than 26 will start to produce sharp cutoffs at cloud area " -"corners." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View bobbing factor" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Fall bobbing factor" -msgstr "" - -#: 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 "" +msgstr "اون 3D" #: src/settings_translation_file.cpp msgid "3D mode" +msgstr "مود 3D" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "ککواتن ڤارالکس مود 3D" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"to be adjusted, as floatland tapering functions best when this noise has\n" +"a value range of approximately -2.0 to 2.0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise that determines number of dungeons per mapchunk." msgstr "" #: src/settings_translation_file.cpp @@ -3757,927 +2362,19 @@ msgid "" "- pageflip: quadbuffer based 3d.\n" "Note that the interlaced mode requires shaders to be enabled." msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D mode parallax strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of 3D mode parallax." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Full-Screen Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec full-screen background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Full-Screen Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec full-screen background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box border color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width of the selection box lines around nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Recent Chat Messages" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of recent chat messages to show" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum hotbar width" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "فکتور سکالا ڤاڤر ڤندو (HUD)" - -#: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "مڠاوبه سايز ايليمن ڤالڠ ڤاڤر ڤندو (hudbar)." - -#: src/settings_translation_file.cpp -msgid "Mesh cache" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables caching of facedir rotated meshes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock mesh generation delay" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Size of the MapBlock cache of the mesh generator. Increasing this will\n" -"increase the cache hit %, reducing the data being copied from the main\n" -"thread, thus reducing jitter." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables minimap." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Round minimap" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shape of the minimap. Enabled = round, disabled = square." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap scan height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"True = 256\n" -"False = 128\n" -"Usable to make minimap smoother on slower machines." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Colored fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ambient occlusion gamma" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The strength (darkness) of node ambient-occlusion shading.\n" -"Lower is darker, Higher is lighter. The valid range of values for this\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Inventory items animations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables animation of inventory items." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog start" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Opaque liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "World-aligned textures mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Textures on a node may be aligned either to the node or to the world.\n" -"The former mode suits better things like machines, furniture, etc., while\n" -"the latter makes stairs and microblocks fit surroundings better.\n" -"However, as this possibility is new, thus may not be used by older servers,\n" -"this option allows enforcing it for certain node types. Note though that\n" -"that is considered EXPERIMENTAL and may not work properly." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autoscaling mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"World-aligned textures may be scaled to span several nodes. However,\n" -"the server may not send the scale you want, especially if you use\n" -"a specially-designed texture pack; with this option, the client tries\n" -"to determine the scale automatically basing on the texture size.\n" -"See also texture_min_size.\n" -"Warning: This option is EXPERIMENTAL!" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Show entity selection boxes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clouds in menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use a cloud animation for the main menu background." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Scale GUI by a user specified value.\n" -"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" -"This will smooth over some of the rough edges, and blend\n" -"pixels when scaling down, at the cost of blurring some\n" -"edge pixels when images are scaled by non-integer sizes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling filter" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When gui_scaling_filter is true, all GUI images need to be\n" -"filtered in software, but some images are generated directly\n" -"to hardware (e.g. render-to-texture for nodes in inventory)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling filter txr2img" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When gui_scaling_filter_txr2img is true, copy those images\n" -"from hardware to software for scaling. When false, fall back\n" -"to the old scaling method, for video drivers that don't\n" -"properly support downloading textures back from hardware." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Tooltip delay" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay showing tooltips, stated in milliseconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Append item name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Append item name to tooltip." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font bold by default" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font italic by default" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " -"drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Regular font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"The fallback font will be used if the font cannot be loaded." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font is used for e.g. the console and profiler screen." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font will be used for certain languages or if the default font is " -"unavailable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat font size" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Screenshot folder" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Screenshot format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Format of screenshots." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screenshot quality" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Screenshot quality. Only used for JPEG format.\n" -"1 means worst quality; 100 means best quality.\n" -"Use 0 for default quality." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "DPI" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " -"screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable console window" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Windows systems only: Start Minetest with the command line window in the " -"background.\n" -"Contains the same information as the file debug.txt (default name)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables the sound system.\n" -"If disabled, this completely disables all sounds everywhere and the in-game\n" -"sound controls will be non-functional.\n" -"Changing this setting requires a restart." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Volume" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Volume of all sounds.\n" -"Requires the sound system to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mute sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to mute sounds. You can unmute sounds at any time, unless the\n" -"sound system is disabled (enable_sound=false).\n" -"In-game, you can toggle the mute state with the mute key or by using the\n" -"pause menu." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Address to connect to.\n" -"Leave this blank to start a local server.\n" -"Note that the address field in the main menu overrides this setting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Remote port" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Prometheus listener address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" -"enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Saving map received from server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save the map received by the client on disk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Connect to external media server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable usage of remote media server (if provided by server).\n" -"Remote servers offer a significantly faster way to download media (e.g. " -"textures)\n" -"when connecting to the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client modding" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable Lua modding support on client.\n" -"This support is experimental and API can change." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Serverlist URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "URL to the server list displayed in the Multiplayer Tab." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Serverlist file" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"File in client/serverlist/ that contains your favorite servers displayed in " -"the\n" -"Multiplayer Tab." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum size of the out chat queue" -msgstr "" - -#: 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 "" - -#: 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 "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Timeout for client to remove unused map data from memory." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock limit" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Show debug info" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to show the client debug info (has the same effect as hitting F5)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the server, to be displayed when players join and in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server description" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Description of server, to be displayed when players join and in the " -"serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Domain name of server, to be displayed in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Homepage of server, to be displayed in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Announce server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatically report to the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Announce to this serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strip color codes" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Server port" -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 "Bind address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The network interface that the server listens on." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strict protocol checking" -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 " -"connecting\n" -"to new servers, but they may not support all new features that you are " -"expecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Remote media" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Specifies URL from which client fetches media instead of using UDP.\n" -"$filename should be accessible from $remote_media$filename via cURL\n" -"(obviously, remote_media should end with a slash).\n" -"Files that are not present will be fetched the usual way." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "IPv6 server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable/disable running an IPv6 server.\n" -"Ignored if bind_address is set.\n" -"Needs enable_ipv6 to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum simultaneous block sends per client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of blocks that are simultaneously sent per client.\n" -"The maximum total count is calculated dynamically:\n" -"max_total = ceil((#clients + max_users) * per_client / 4)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"To reduce lag, block transfers are slowed down when a player is building " -"something.\n" -"This determines how long they are slowed down after placing or removing a " -"node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. packets per iteration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of packets sent per send step, if you have a slow connection\n" -"try reducing it, but don't reduce it to a number below double of targeted\n" -"client number." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default game" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Message of the day" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Message of the day displayed to players connecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of players that can be connected simultaneously." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map directory" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Item entity TTL" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Default stack size" -msgstr "" - -#: src/settings_translation_file.cpp -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 "" - -#: src/settings_translation_file.cpp -msgid "Damage" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable players getting damage and dying." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Creative" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fixed map seed" +"سوکوڠن 3D.\n" +"يڠ دسوکوڠ ڤد ماس اين:\n" +"- تيادا: تيادا اٴوتڤوت 3D.\n" +"- اناݢليف: 3D ورنا بيرو\\موره.\n" +"- سلڠ-سلي: ݢاريس ݢنڤ\\ݢنجيل برداسرکن سوکوڠن سکرين ڤولاريساسي.\n" +"- اتس-باوه: ڤيسه سکرين اتس\\باوه.\n" +"- کيري-کانن: ڤيسه سکرين کيري\\کانن.\n" +"- سيلڠ ليهت: 3D مات برسيلڠ\n" +"- سيلق هلامن: 3D براساسکن ڤنيمبل کواد.\n" +"امبيل ڤرهاتين بهاوا مود سلڠ-سلي ممرلوکن ڤمبايڠ." + +#: src/settings_translation_file.cpp +msgid "3d" msgstr "" #: src/settings_translation_file.cpp @@ -4685,408 +2382,39 @@ 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 "" - -#: src/settings_translation_file.cpp -msgid "Default password" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "New users need to input this password." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default privileges" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Basic privileges" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Privileges that players with basic_privs can grant" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Unlimited player transfer distance" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Player transfer distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player versus player" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to allow players to damage and kill each other." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mod channels" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod channels support." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Static spawnpoint" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If this is set, players will always (re)spawn at the given position." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disallow empty passwords" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, new players cannot join with an empty password." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disable anticheat" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rollback recording" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, actions are recorded for rollback.\n" -"This option is only read when server starts." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Format of player chat messages. The following strings are valid " -"placeholders:\n" -"@name, @message, @timestamp (optional)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shutdown message" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crash message" -msgstr "" +"بنيه ڤتا يڠ دڤيليه اونتوق ڤتا بارو⹁ بيارکن کوسوڠ اونتوق بنيه راوق.\n" +"تيدق دݢوناڤاکاي سکيراڽ منچيڤتا دنيا بارو ملالوٴي مينو اوتام." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." +msgstr "ميسيج يڠ اکن دڤاڤرکن کڤد سموا کليئن اڤابيلا ڤلاين رونتوه." + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "ميسيج يڠ اکن دڤاڤرکن دکت سموا کليئن اڤابيلا ڤلاين دتوتوڤ." + +#: src/settings_translation_file.cpp +msgid "ABM interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Ask to reconnect after crash" +msgid "ABM time budget" msgstr "" #: 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 "" - -#: src/settings_translation_file.cpp -msgid "Active object send range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far clients know about objects, stated in mapblocks (16 nodes).\n" -"\n" -"Setting this larger than active_block_range will also cause the server\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Active block range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The radius of the volume of blocks around every player that is subject to " -"the\n" -"active block stuff, stated in mapblocks (16 nodes).\n" -"In active blocks objects are loaded and ABMs run.\n" -"This is also the minimum range in which active objects (mobs) are " -"maintained.\n" -"This should be configured together with active_object_send_range_blocks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max block send distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum forceloaded blocks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of forceloaded mapblocks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time send interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls length of day/night cycle.\n" -"Examples:\n" -"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "World start time" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time of day when a new world is started, in millihours (0-23999)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map save interval" -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 "Chat message max length" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message count limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amount of messages a player may send per 10 seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message kick threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Kick players who sent more than X messages per 10 seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Physics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default acceleration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal and vertical acceleration on ground or when climbing,\n" -"in nodes per second per second." +msgid "Absolute limit of queued blocks to emerge" msgstr "" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal acceleration in air when jumping or falling,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast mode acceleration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal and vertical acceleration in fast mode,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking and flying speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneaking speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneaking speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast mode speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking, flying and climbing speed in fast mode, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Climbing speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical climbing speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Jumping speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid fluidity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid fluidity smoothing" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum liquid resistance. Controls deceleration when entering liquid at\n" -"high speed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid sinking" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Gravity" -msgstr "" +msgstr "ڤچوتن دأودارا" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." msgstr "" #: src/settings_translation_file.cpp -msgid "Deprecated Lua API handling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" -"- error: abort on usage of deprecated call (suggested for mod developers)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. clearobjects extra blocks" -msgstr "" - -#: src/settings_translation_file.cpp -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 "Unload unused server data" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How much the server will wait before unloading unused mapblocks.\n" -"Higher value is smoother, but will use more RAM." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum objects per block" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of statically stored objects in a block." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Synchronous SQLite" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dedicated server step" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of a server tick and the interval at which objects are generally " -"updated over\n" -"network." +msgid "Active Block Modifiers" msgstr "" #: src/settings_translation_file.cpp @@ -5094,66 +2422,129 @@ msgid "Active block management interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Length of time between active block management cycles" -msgstr "" +msgid "Active block range" +msgstr "جارق بلوک اکتيف" #: src/settings_translation_file.cpp -msgid "ABM interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "NodeTimer interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between NodeTimer execution cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ignore world errors" -msgstr "" +msgid "Active object send range" +msgstr "جارق ڤڠهنترن اوبجيک اکتيف" #: 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." +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." msgstr "" +"علامت اونتوق مڽمبوڠ.\n" +"بيار کوسوڠ اونتوق ممولاکن ڤلاين ڤرماٴينن تمڤتن.\n" +"امبيل ڤرهاتيان بهاوا ميدن علامت دالم مينو اوتام مڠاتسي تتڤن اين." #: src/settings_translation_file.cpp -msgid "Liquid loop max" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max liquids processed per step." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid queue purge time" -msgstr "" +msgid "Adds particles when digging a node." +msgstr "منمبه ڤرتيکل اڤابيلا مڠݢالي نود." #: src/settings_translation_file.cpp msgid "" -"The time (in seconds) that the liquids queue may grow beyond processing\n" -"capacity until an attempt is made to decrease its size by dumping old queue\n" -"items. A value of 0 disables the functionality." +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" +"لارسکن کونفيݢوراسي DPI کسکرين اندا (بوکن X11/Android سهاج) چونتوه اونتوق " +"سکرين 4K." + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." msgstr "" #: src/settings_translation_file.cpp -msgid "Liquid update tick" +#, c-format +msgid "" +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" +"to be sure) creates a solid floatland layer." msgstr "" #: src/settings_translation_file.cpp -msgid "Liquid update interval in seconds." +#, fuzzy +msgid "Admin name" +msgstr "تمبه نام ايتم" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "تتڤن مندالم" + +#: src/settings_translation_file.cpp +msgid "" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"This only has significant effect on daylight and artificial\n" +"light, it has very little effect on natural night light." +msgstr "" +"اوبه لڠکوڠ چهاي دڠن مڠناکن 'ڤمبتولن ݢام'.\n" +"نيلاي تيڠݢي بواتکن اساس چهاي تڠه دان رنده لبيه تراڠ.\n" +"نيلاي '1.0' اکن بيارکن لڠکوڠ چهاي اصل تيدق براوبه.\n" +"تتڤن اين هاڽ ممبري کسن مندالم ڤد چهاي ماتاهاري\n" +"دان چهاي بواتن⹁ کسنڽ ڤد چهاي مالم امت رنده." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Always fly fast" +msgstr "سنتياس تربڠ دان برݢرق ڤنتس" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "ݢام اوکلوسي سکيتر" + +#: src/settings_translation_file.cpp +msgid "Amount of messages a player may send per 10 seconds." +msgstr "جومله ميسيج ڤماٴين بوليه هنتر ستياڤ 10 ساٴت." + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys." msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Anisotropic filtering" +msgstr "ڤناڤيسن انيسوتروڤيک" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "عمومکن ڤلاين" + +#: src/settings_translation_file.cpp +msgid "Announce to this serverlist." +msgstr "عمومکن کسناراي ڤلاين اين." + +#: src/settings_translation_file.cpp +msgid "Append item name" +msgstr "تمبه نام ايتم" + +#: src/settings_translation_file.cpp +msgid "Append item name to tooltip." +msgstr "تمبه نام ايتم کتيڤ التن." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" msgstr "" +#: src/settings_translation_file.cpp +msgid "Arm inertia" +msgstr "اينرسيا لڠن" + +#: src/settings_translation_file.cpp +msgid "" +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." +msgstr "" +"اينرسيا لڠن⹁ ممبريکن ڤرݢرقن لڠن يڠ\n" +"لبيه رياليستيک اڤابيلا کاميرا دݢرقکن." + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "مينتا سمبوڠ سمولا سلڤس کرونتوهن" + #: src/settings_translation_file.cpp msgid "" "At this distance the server will aggressively optimize which blocks are sent " @@ -5170,9 +2561,1606 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server side occlusion culling" +msgid "Audio" msgstr "" +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "ککونچي أوتوڤرݢرقن" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "لومڤت هالڠن ساتو-نود سچارا أوروماتيک." + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "ملاڤورکن کڤد سناراي ڤلاين سچارا اٴوتوماتيک." + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "أوتوسيمڤن سايز سکرين" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "مود سکال أوتوماتيک" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "ککونچي لومڤت" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "ککونچي اونتوق ممنجت\\منورون" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "ککونچي کبلاکڠ" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "کأيستيميواٴن اساس" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "ڤناڤيسن بيلينيار" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "علامت ايکتن" + +#: src/settings_translation_file.cpp +msgid "Biome API noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +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 "لالوان فون تبل دان ايتاليک" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "لالوان فون monospace تبل دان ايتاليک" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "لالوان فون تبل" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "لالوان فون monospace تبل" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "بينا دالم ڤماٴين" + +#: src/settings_translation_file.cpp +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" +"Increasing can reduce artifacting on weaker GPUs.\n" +"0.1 = Default, 0.25 = Good value for weaker tablets." +msgstr "" +"جارق کاميرا 'برهمڤيرن ساته کتيڤن' دالم نيلاي نود⹁ انتارا 0 دان 0.5.\n" +"هاڽ برکسن دڤلاتفورم GLES. کباڽقن ڤڠݢونا تيدق ڤرلو مڠاوبه نيلاي اين.\n" +"مناٴيقکن نيلاي بوليه کورڠکن ارتيفک ڤد GPU يڠ لبيه لمه.\n" +"0.1 = اصل⹁ 0.25 = نيلاي باݢوس اونتوق تابليت يڠ لبيه لمه." + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "ڤلمبوتن کاميرا" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "ڤلمبوتن کاميرا دالم مود سينماتيک" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "ککونچي توݢول کمس کيني کاميرا" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +msgstr "" + +#: 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 "" +"ڤرتڠهن جولت تولقن لڠکوڠ چهاي.\n" +"دمان 0.0 اياله ارس چهاي مينيموم⹁ 1.0 اياله مکسيموم." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat command time message threshold" +msgstr "نيلاي امبڠ تندڠ ميسيج سيمبڠ" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "ارهن" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "سايز فون سيمبڠ" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "ککونچي سيمبڠ" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "حد کيراٴن ميسيج سيمبڠ" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "فورمت ميسيج سيمبڠ" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "نيلاي امبڠ تندڠ ميسيج سيمبڠ" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "ڤنجڠ مکسيموم ميسيج سيمبڠ" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "ککونچي توݢول سيمبڠ" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat weblinks" +msgstr "سيمبڠ دتونجوقکن" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "مود سينماتيک" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "ککونچي مود سينماتيک" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "برسيهکن تيکستور لوت سينر" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "کليئن" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "مودس کليئن" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "ججاري اون" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "اون" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "اون ايت ايفيک ڤد ڤيهق کليئن." + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "اون دالم مينو" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "کابوت برورنا" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "کابوت برورنا" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "ککونچي ارهن" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "سمبوڠ کاچ" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "سمبوڠ کڤلاين ميديا لوارن" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "سمبوڠکن کاچ جيک دسوکوڠ اوليه نود." + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "نيلاي الڤا کونسول" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "ورنا کونسول" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "کتيڠݢين کونسول" + +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "کدڤن برتروسن" + +#: 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 "" +"ڤرݢرقن کدڤن برتروسن⹁ دتوݢول اوليه ککونچي أوتوڤرݢرقن.\n" +"تکن ککونچي أوتوڤرݢرقن لاݢي اتاو ڤرݢرقن کبلاکڠ اونتوق ملومڤوهکنڽ." + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "کاولن" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples:\n" +"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." +msgstr "" +"مڠاول ڤنجڠ کيترن سياڠ\\مالم.\n" +"چونتوهڽ:\n" +"72 اونتوق 20 مينيت⹁ 360 اونتوق 4 مينيت⹁ 1 اونتوق 24 جم⹁ 0 اونتوق " +"سياڠ\\مالم\\لاٴين٢ ککل تيدق بروبه." + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls width of tunnels, a smaller value creates wider tunnels.\n" +"Value >= 10.0 completely disables generation of tunnels and avoids the\n" +"intensive noise calculations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "ميسيج کرونتوهن" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "کرياتيف" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "نيلاي الفا ررمبوت سيلڠ" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "نيلاي الفا ررمبوت سيلڠ (کلݢڤن⹁ انتارا 0 دان 255)." + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "ورنا ررمبوت سيلڠ" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "DPI" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "بوليه چدرا" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "ککونچي توݢول معلومت ڽهڤڤيجت" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "ککونچي ڤرلاهنکن بوڽي" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "ڤچوتن لالاي" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "ڤرماٴينن لالاي" + +#: 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 "" +"ڤرماٴينن لالاي يڠ اکن دݢوناکن کتيک منچيڤتا دنيا بارو.\n" +"تتڤن اين اکن دأتسي اڤابيلا ممبوات دنيا دري مينو اوتام." + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "کات لالوان لالاي" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "کأيستيميواٴن لالاي" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "ساٴيز تيندنن لالاي" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain and steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the base ground level." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the depth of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" +"منتعريفکن جارق مکسيموم اونتوق ڤميندهن ڤماٴين دالم اونيت بلوک (0 = تيادا حد)." + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river valley." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: 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 "" +"لڠه ماس دانتارا کمسکيني ججاريڠ دکت کليئن دالم اونيت ميليساٴت (ms). مناٴيقکن " +"نيلاي\n" +"اين اکن مڠورڠکن کادر کمسکيني ججاريڠ⹁ لالو مڠورڠکن کترن دکت کليئن يڠ لبيه " +"ڤرلاهن." + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "لڠه ڤڠهنترن بلوک سلڤس ڤمبيناٴن" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "جومله لڠه اونتوق منونجوقکن تيڤ التن⹁ دڽاتاکن دالم ميليساٴت." + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" +"ڤريهل ڤلاين ڤرماٴينن⹁ اونتوق دڤاڤرکن اڤابيلا ڤماٴين ماسوق دان جوݢ دالم " +"سناراٴي ڤلاين." + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "مڽهسݢرقکن انيماسي بلوک" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "هياسن" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "ککومچي ککانن" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "ڤرتيکل کتيک مڠݢالي" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "ملومڤوهکن انتيتيڤو" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "منولق کات لالوان کوسوڠ" + +#: src/settings_translation_file.cpp +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 "نام دوماٴين ڤلاين ڤرماٴينن⹁ اونتوق دڤاڤرکن دالم سناراي ڤلاين ڤرماٴينن." + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "تکن \"لومڤت\" دوا کالي اونتوق تربڠ" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "تکن بوتڠ \"لومڤت\" سچارا چڤت دوا کالي اونتوق منوݢول مود تربڠ." + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "ککونچي جاتوهکن ايتم" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" +"ممبوليهکن سوکوڠن ڤمبواتن مودس Lua دکت کليئن.\n" +"سوکوڠن اين دالم اوجيکاجي دان API بوليه براوبه." + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "ممبوليهکن تتيڠکڤ کونسول" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Enable creative mode for all players" +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 "ممبوليهکن سوکوڠن سالوران مودس." + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "ممبوليهکن ڤماٴين منريما کچدراٴن دان ماتي." + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "ممبوليهکن اينڤوت ڤڠݢونا سچارا راوق (هاڽ اونتوق ڤرچوباٴن)." + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +msgstr "" +"ممبوليهکن ڤنچهاياٴن لمبوت دڠن اوکلوسي سکيتر يڠ ريڠکس.\n" +"لومڤوهکنڽ اونتوق کلاجوان اتاو اونتوق کليهتن بربيذا." + +#: 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 " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" +"بوليهکن تتڤن اونتوق ملارڠ کليئن لام درڤد مڽمبوڠ.\n" +"کليئن لام ماسيه سسواي دݢوناکن جک مريک تيدق رونتوه (کريش) اڤابيلا چوبا اونتوق " +"مڽمبوڠ کڤلاين بهارو⹁\n" +"تتاڤي مريک موڠکين تيدق ممڤو مڽوکوڠ سموا صيفت بهارو يڠ اندا سڠکاکن." + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" +"ممبوليهکن ڤڠݢوناٴن ڤلاين ميديا جارق جاٴوه (جک دبريکن اوليه ڤلاين).\n" +"ڤلاين جارق جاٴوه مناورکن چارا لبيه چڤت اونتوق موات تورون ميديا (چونتوه " +"تيکستور)\n" +"اڤابيلا مڽمبوڠ کڤلاين ڤرماٴينن." + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" +"ممبوليهکن اوبجيک ڤنيمبل بوچو.\n" +"اي ڤاتوت منيڠکتکن ڤريستاسي ݢرافيک دڠن باڽق." + +#: 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 "" +"ڤندارب اونتوق ڤڠاڤوڠن ڤندڠن.\n" +"چونتوهڽ: 0 اونتوق تيادا اڤوڠن⁏ 1.0 اونتوق بياسا⁏ 2.0 اونتوق دوا کالي ݢندا." + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server.\n" +"Ignored if bind_address is set.\n" +"Needs enable_ipv6 to be enabled." +msgstr "" +"ممبوليهکن\\ملومڤوهکن ڤنجالنن ڤلاين IPv6.\n" +"دأبايکن جک تتڤن bind_address دتتڤکن.\n" +"ممرلوکن تتڤن enable_ipv6 دبوليهکن." + +#: src/settings_translation_file.cpp +msgid "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"appearance of high dynamic range images. Mid-range contrast is slightly\n" +"enhanced, highlights and shadows are gradually compressed." +msgstr "" +"ممبوليهکن ڤمتاٴن تونا سينماتيک 'Uncharted 2' (انچرتد ثو) اوليه Hable " +"(هيبل).\n" +"مڽلاکوکن لڠکوڠ تونا فيلم فوتوݢرافي دان چارا اي مڠاڠݢرکن ڤنمڤيلن ايميج جارق\n" +"ديناميک تيڠݢي. بيذا جلس ڤرتڠهن جولت دتيڠکتکن سديکيت⹁ تونجولن دان بايڠن\n" +"دممڤتکن سچارا برانسور." + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "ممبوليهکن انيماسي ايتم دالم اينۏينتوري." + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "ممبوليهکن ڤڠاݢريݢتن ججاريڠ يڠ دڤوتر دڤکسي Y ايايت (facedir)." + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "ممبوليهکن ڤتا ميني." + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" +"ممبوليهکن سيستم بوڽي.\n" +"جک دلومڤوهکن⹁ اي اکن ملومڤوهکن کسموا بوڽي دسموا تمڤت\n" +"دان کاولن بوڽي دالم ڤرماٴينن تيدق اکن برفوڠسي.\n" +"ڤڠوبهن تتڤن اين ممرلوکن ڤرمولاٴن سمولا." + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Exponent of the floatland tapering. Alters the tapering behaviour.\n" +"Value = 1.0 creates a uniform, linear tapering.\n" +"Values > 1.0 create a smooth tapering suitable for the default separated\n" +"floatlands.\n" +"Values < 1.0 (for example 0.25) create a more defined surface level with\n" +"flatter lowlands, suitable for a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "FPS when unfocused or paused" +msgstr "بيڠکاي ڤر ساٴت (FPS) مکسيما اڤابيلا ڤرماٴينن دجيداکن." + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "FSAA" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "فکتور اڤوڠن کجاتوهن" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "لالوان فون برباليق" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "ککونچي ڤرݢرقن ڤنتس" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "ڤرݢرقن ڤنتس" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Fast movement (via the \"Aux1\" key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" +"برݢرق ڤنتس (دڠن ککونچي \"ايستيميوا\").\n" +"اين ممرلوکن کأيستيميواٴن \"ڤرݢرقن ڤنتس\" دالم ڤلاين ترسبوت." + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "ميدن ڤندڠ" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "ميدن ڤندڠ دالم درجه سودوت." + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" +"فاٴيل دالم لالوان client/serverlist/ يڠ مڠندوڠي سناراي\n" +"ڤلاين کݢمرن يڠ دڤاڤرکن دالم تب ڤماٴين راماي." + +#: src/settings_translation_file.cpp +msgid "Filler depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "ڤمتاٴن تونا سينماتيک" + +#: 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 "" +"تيکستور يڠ دتاڤيس بوليه سباتيکن نيلاي RGB دڠن جيرن يڠ لوت سينر سڤنوهڽ⹁\n" +"يڠ مان ڤڠاوڤتيموم PNG سريڠ ابايکن⹁ کادڠکال مڽببکن سيسي ݢلڤ اتاو تراڠ ڤد\n" +"تيکستور لوت سينر. ݢونا ڤناڤيسن اين اونتوق ممبرسيهکن تيکستور ترسبوت کتيک\n" +"اي سدڠ دمواتکن." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "انتيالياس:" + +#: src/settings_translation_file.cpp +msgid "First of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "بنيه ڤتا تتڤ" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "کايو بديق ماي تتڤ" + +#: src/settings_translation_file.cpp +msgid "Floatland density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "ککونچي تربڠ" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "تربڠ" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "کابوت" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "مولا کابوت" + +#: src/settings_translation_file.cpp +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 "فون تبل سچارا لالايڽ" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "فون ايتاليک سچارا لالايڽ" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "بايڠ فون" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "نيلاي الفا بايڠ فون" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "سايز فون" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "سايز فون باݢي فون لالاي دالم اونيت تيتيق (pt)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "سايز فون باݢي فون monospace دالم اونيت تيتيق (pt)." + +#: 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 "" +"سايز فون توليسن سيمبڠ بارو٢ اين دان ڤروم دالم اونيت تيتيق (pt).\n" +"نيلاي 0 اکن مڠݢوناکن سايز فون لالاي." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" +"فورمت ميسيج سيمبڠ ڤماٴين. رينتيتن بريکوت اياله ڤمݢڠ تمڤت يڠ صح:\n" +"@name (اونتوق نام)⹁ @message (اونتوق ميسيج)⹁ @timestamp (ڤيليهن⹁ اونتوق چوڤ " +"ماس)" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "فورمت يڠ دݢوناکن اونتوق تڠکڤ لاير." + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "ورنا لاتر بلاکڠ لالاي فورمسڤيک" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "کلݢڤن لاتر بلاکڠ لالاي فورمسڤيک" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "ورنا لاتر بلاکڠ سکرين-ڤنوه فورمسڤيک" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "کلݢڤن لاتر بلاکڠ سکرين-ڤنوه فورمسڤيک" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +msgstr "ورنا لاتر بلاکڠ اصل فورمسڤيک (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "کلݢڤن اصل لاتر بلاکڠ فورمسڤيک (انتارا 0 دان 255)." + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background color (R,G,B)." +msgstr "ورنا لاتر بلاکڠ سکرين-ڤنوه فورمسڤيک (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background opacity (between 0 and 255)." +msgstr "کلݢڤن لاتر بلاکڠ سکرين-ڤنوه فورمسڤيک (انتارا 0 دان 255)." + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "ککونچي کدڤن" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "بهاݢين درڤد جارق بوليه ليهت دمان کابوت مولا دجان" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" +"سجاٴوه ماناکه بلوک٢ دهنتر کڤد کليئن⹁ دڽاتاکن دالم اونيت بلوکڤتا (16 نود)." + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" +"درڤد جارق کليئن داڤت تاهو تنتڠ اوبجيک⹁ دڽاتاکن دالم بلوکڤتا (16 نود).\n" +"\n" +"منتڤکن نيلاي اين لبيه تيڠݢي درڤد جارق بلوک اکتيف (active_block_range) جوݢ\n" +"اکن مڽببکن ڤلاين اونتوق مڠکلکن اوبجيک اکتيف سهيڠݢ کجارق اين\n" +"دالم اره ڤندڠن ڤماٴين. (اين بوليه ايلقکن موب تيبا٢ هيلڠ دري ڤندڠن)" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "سکرين ڤنوه" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "مود سکرين ڤنوه." + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "سکال GUI" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "ڤناڤيس سکال GUI" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter txr2img" +msgstr "ڤناڤيس سکال GUI جنيس 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" +"کچرونن لڠکوڠ چهاي ڤد تاهڤ چهاي مکسيموم.\n" +"مڠاول بيذا جلس تاهڤ چهاي ترتيڠݢي." + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" +"کچرونن لڠکوڠ چهاي ڤد تاهڤ چهاي مينيموم.\n" +"مڠاول بيذا جلس تاهڤ چهاي ترنده." + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "سکال GUI" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "ککونچي منوݢول ڤاڤر ڤندو (HUD)" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "کومڤونن تيڠݢي سايز تتيڠکڤ اول." + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "لامن اوتام ڤلاين ڤرماٴينن⹁ اونتوق دڤاڤرکن دالم سناراي ڤلاين ڤرماٴينن." + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal acceleration in air when jumping or falling,\n" +"in nodes per second per second." +msgstr "" +"ڤچوتن منداتر دأودارا اڤابيلا ملومڤت اتاو جاتوه⹁\n" +"دالم اونيت نود ڤر ساٴت ڤر ساٴت." + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration in fast mode,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration on ground or when climbing,\n" +"in nodes per second per second." +msgstr "" +"ڤچوتن منداتر دان منݢق اتس تانه اتاو کتيک ممنجت⹁\n" +"دالم اونيت نود ڤر ساٴت ڤر ساٴت." + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "ککونچي ايتم ستروسڽ دالم هوتبر" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "ککونچي ايتم سبلومڽ دالم هوتبر" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "ککونچي سلوت هوتبر 1" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "ککونچي سلوت هوتبر 10" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "ککونچي سلوت هوتبر 11" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "ککونچي سلوت هوتبر 12" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "ککونچي سلوت هوتبر 13" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "ککونچي سلوت هوتبر 14" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "ککونچي سلوت هوتبر 15" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "ککونچي سلوت هوتبر 16" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "ککونچي سلوت هوتبر 17" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "ککونچي سلوت هوتبر 18" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "ککونچي سلوت هوتبر 19" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "ککونچي سلوت هوتبر 2" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "ککونچي سلوت هوتبر 20" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "ککونچي سلوت هوتبر 21" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "ککونچي سلوت هوتبر 22" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "ککونچي سلوت هوتبر 23" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "ککونچي سلوت هوتبر 24" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "ککونچي سلوت هوتبر 25" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "ککونچي سلوت هوتبر 26" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "ککونچي سلوت هوتبر 27" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "ککونچي سلوت هوتبر 28" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "ککونچي سلوت هوتبر 29" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "ککونچي سلوت هوتبر 3" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "ککونچي سلوت هوتبر 30" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "ککونچي سلوت هوتبر 31" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "ککونچي سلوت هوتبر 32" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "ککونچي سلوت هوتبر 4" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "ککونچي سلوت هوتبر 5" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "ککونچي سلوت هوتبر 6" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "ککونچي سلوت هوتبر 7" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "ککونچي سلوت هوتبر 8" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "ککونچي سلوت هوتبر 9" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"If negative, liquid waves will move backwards.\n" +"Requires waving liquids to be enabled." +msgstr "" +"سچڤت مان ݢلورا چچاٴير اکن برݢرق. نيلاي تيڠݢي = لبيه چڤت.\n" +"جيک نيلاي نيݢاتيف⹁ ݢلورا چچاٴير اکن برݢرق کبلاکڠ.\n" +"ممرلوکن تتڤن چچاٴير برݢلورا دبوليهکن." + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "ڤلاين 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 "" +"جيک بيڠکاي ڤر ساٴت (FPS) اکن ناٴيق لبيه تيڠݢي درڤد نيلاي اين⹁\n" +"حدکن اي دڠن تيدورکنڽ سوڤايا تيدق بازيرکن کواسا CPU دڠن سيا٢." + +#: 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 "" +"جيک دلومڤوهکن⹁ ککونچي \"ايستيميوا\" اکن دݢوناکن اونتوق تربڠ لاجو\n" +"سکيراڽ کدوا-دوا مود تربڠ دان مود ڤرݢرقن ڤنتس دبوليهکن." + #: src/settings_translation_file.cpp msgid "" "If enabled the server will perform map block occlusion culling based on\n" @@ -5183,7 +4171,1998 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Client side modding restrictions" +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" +"جيک دبوليهکن برسام مود تربڠ⹁ ڤماٴين بوليه تربڠ منروسي نود ڤڤجل.\n" +"اين ممرلوکن کأيستيميواٴن \"تمبوس بلوک\" دالم ڤلاين ترسبوت." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +msgstr "" +"جيک دبوليهکن⹁ ککونچي \"ايستيميوا\" اکن دݢوناکن اونتوق ڤنجت کباوه دان\n" +"تورون دالم مود تربڠ⹁ مڠݢنتيکن ککونچي \"سلينڤ\"." + +#: 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." +msgstr "" +"جک دبوليهکن⹁ سموا تيندقن اکن دراکم اونتوق ݢولوڠ باليق.\n" +"ڤيليهن اين هاڽ دباچ کتيک ڤلاين برمولا." + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "جک دبوليهکن⹁ اي اکن ملومڤوهکن ڤنچݢهن ڤنيڤوان دالم ڤماٴين راماي." + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" +"جيک دبوليهکن⹁ اي ممبواتکن اره ڤرݢرقن ريلاتيف دڠن ڤيچ ڤماٴين اڤابيلا تربڠ " +"اتاو برنڠ." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "جک دبوليهکن⹁ ڤماٴين٢ بارو تيدق بوليه ماسوق دڠن کات لالوان يڠ کوسوڠ." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" +"جيک دبوليهکن⹁ اندا بوليه ملتق بلوک دکدودوقن برديري (کاکي + ارس مات).\n" +"اين ساڠت برݢونا اڤابيلا بکرجا دڠن کوتق نود دکاوسن يڠ کچيل." + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" +"جک تتڤن اين دتتڤکن⹁ ڤماٴين اکن سنتياسا دلاهيرکن (سمولا) دکت کدودوقن يڠ " +"دبريکن." + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" +"نيلاي الفا لاتر بلاکڠ کونسول سيمبڠ دالم ڤرماٴينن (کلݢڤن⹁ انتارا 0 دان 255)." + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "ورنا لاتر بلاکڠ کونسول سيمبڠ دالم ڤرماٴينن (R,G,B)." + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" +"نيلاي کتيڠݢين کونسول سيمبڠ دالم ڤرماٴينن⹁ انتارا 0.1 (10%) دان 1.0 (100%)." + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "ککونچي کواتکن بوڽي" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Interval of saving important changes in the world, stated in seconds." +msgstr "" +"سلڠ ماس دأنتارا ڤڽيمڤنن ڤروبهن ڤنتيڠ دالم دنيا⹁ دڽاتاکن دالم اونيت ساٴت." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Interval of sending time of day to clients, stated in seconds." +msgstr "سلڠ دأنتارا ڤڠهنترن معلومت ماس ڤلاين کڤد کليئن." + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "انيماسي ايتم اينۏينتوري" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "ککونچي اينۏينتوري" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "تتيکوس سوڠسڠ" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "مڽوڠسڠکن ڤرݢرقن تتيکوس منݢق." + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "لالوان فون ايتاليک" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "لالوان فون monospace ايتاليک" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "TTL اينتيتي ايتم" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"increases processing load.\n" +"At iterations = 20 this mapgen has a similar load to mapgen V7." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "ID کايو بديق" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "سلڠ ماس ڤڠاولڠن بوتڠ کايو بديق" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "جنيس کايو بديق" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "کڤيکاٴن فروستوم کايو بديق" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "جنيس کايو بديق" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "ککونچي لومڤت" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مڠورڠکن جارق ڤندڠ.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ممڤرلاهنکن بوڽي.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ملومڤت.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منجاتوهکن ايتم يڠ سدڠ دڤيليه.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منمبه جارق ڤندڠ.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مڠواتکن بوڽي.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ملومڤت.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق برݢرق ڤنتس دالم مود ڤرݢرقن ڤنتس.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مڠݢرقکن ڤماٴين کبلاکڠ.\n" +"جوݢ اکن ملومڤوهکن أوتوڤرݢرقن⹁ اڤابيلا اکتيف.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مڠݢرقکن ڤماٴين کدڤن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مڠݢرقکن ڤماٴين ککيري.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مڠݢرقکن ڤماٴين ککانن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ممبيسوکن ڤرماٴينن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ممبوک تتيڠکڤ سيمبڠ اونتوق مناٴيڤ ارهن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ممبوک تتيڠکڤ سيمبڠ اونتوق مناٴيڤ ارهن تمڤتن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ممبوک تتيڠکڤ سيمبڠ.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ممبوک اينۏينتوري.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق ملومڤت.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-11 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-12 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-13 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-14 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-15 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-16 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-17 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-18 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-19 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-20 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-21 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-22 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-23 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-24 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-25 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-26 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-27 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-28 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-29 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-30 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-31 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-32 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-8 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-5 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ڤرتام دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-4 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه ايتم ستروسڽ ددالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-9 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه بارڠ سبلومڽ دهوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-2 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-7 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-6 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-10 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مميليه سلوت ک-3 دالم هوتبر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مڽلينڤ.\n" +"جوݢ دݢوناکن اونتوق تورون باواه کتيک ممنجت دان دالم اٴير جيک تتڤن " +"aux1_descends دلومڤوهکن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق برتوکر انتارا کاميرا اورڠ ڤرتام دان کتيݢ.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منڠکڤ ݢمبر لاير.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول أوتوڤرݢرقن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول مود سينماتيک.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول ڤاڤرن ڤتا ميني.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول مود ڤرݢرقن ڤنتس.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول مود تربڠ.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول مود تمبوس بلوک.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول مود ڤرݢرقن ڤيچ.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول ڤڠمسکينين کاميرا. هاڽ دݢوناکن اونتوق ڤمباڠونن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول ڤاڤرن سيمبڠ.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول ڤاڤرن معلومت ڽهڤڤيجت.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول ڤاڤرن کابوت.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول ڤاڤر ڤندو (HUD).\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول ڤاڤرن کونسول سيمبڠ بسر.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول ڤمبوکه. دݢوناکن اونتوق ڤمباڠونن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق منوݢول جارق ڤندڠن تيادا حد.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"ککونچي اونتوق مڠݢوناکن ڤندڠن زوم اڤابيلا دبنرکن.\n" +"ليهت http://irrlicht.sourceforge.net/docu/namespaceirr." +"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 "تندڠ ڤماٴين يڠ مڠهنتر ميسيج لبيه درڤد X ستياڤ 10 ساٴت." + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "ککونچي کونسول سيمبڠ بسر" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "ݢاي داٴون" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" +"ݢاي داٴون:\n" +"- براݢم: سموا سيسي کليهتن\n" +"- ريڠکس: هاڽ سيسي لوار کليهتن⹁ جيک special_tiles يڠ دتنتوکن دݢوناکن\n" +"- لݢڤ: ملومڤوهکن لوت سينر" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "ککونچي ککيري" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of liquid waves.\n" +"Requires waving liquids to be enabled." +msgstr "" +"ڤنجڠ ݢلورا چچاٴير.\n" +"ممرلوکن تتڤن چچاٴير برݢلورا دبوليهکن." + +#: src/settings_translation_file.cpp +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "تولقن لڠکوڠ چهاي" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "تيتيق تڠه تولقن لڠکوڠ چهاي" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "سيبرن تولقن لڠکوڠ چهاي" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "ݢام لڠکوڠ چهاي" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "کچرونن تيڠݢي لڠکوڠ چهاي" + +#: src/settings_translation_file.cpp +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" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" +"بواتکن ورنا کابوت دان لاڠيت برݢنتوڠ کڤد وقتو (فجر\\ماتاهاري) دان اره ڤندڠ." + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "بواتکن سموا چچاٴير منجادي لݢڤ" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "ديريکتوري ڤتا" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen Carpathian." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'terrain' enables the generation of non-fractal terrain:\n" +"ocean, islands and underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"to become shallower and occasionally dry.\n" +"'altitude_dry': Reduces humidity with altitude." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen v5." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'floatlands': Floating land masses in the atmosphere.\n" +"'caverns': Giant caves deep underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "سلڠ ماس ڤڽيمڤنن ڤتا" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "حد بلوک ڤتا" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "لڠه ماس ڤنجاناٴن ججاريڠ بلوک ڤتا" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "" +"ساٴيز کيش بلوکڤتا اونتوق ڤنجان ججاريڠ بلوکڤتا دالم اونيت ميݢاباٴيت (MB)" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "حد ماس ڽهموات بلوک ڤتا" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "جارق مکسيموم ڤڠهنترن بلوک" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "بيڠکيسن مکسيما ستياڤ للرن" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "FPS مکسيما" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "بيڠکاي ڤر ساٴت (FPS) مکسيما اڤابيلا ڤرماٴينن دجيداکن." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "جومله مکسيموم بلوک يڠ دڤقسا موات" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "ليبر هوتبر مکسيما" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum liquid resistance. Controls deceleration when entering liquid at\n" +"high speed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" +"جومله بلوک مکسيموم يڠ دهنتر سرنتق ڤر کليئن.\n" +"جومله مکسيموم دکيرا سچارا ديناميک:\n" +"جومله_مکس = بولت_ناٴيق((#کليئن + ڤڠݢونا_مکس) * ڤر_کليئن \\ 4 )" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "جومله مکسيموم بلوکڤتا يڠ دڤقسا موات." + +#: 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" +"تتڤکن کڤد -1 اونتوق جومله تنڤ حد." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" +"جومله مکسيما بيڠکيسن يڠ دهنتر ڤد ستياڤ لڠکه ڤڠهنترن⹁\n" +"جک اندا ممڤوڽاٴي سمبوڠن يڠ ڤرلاهن ماک چوبا کورڠکنڽ⹁\n" +"نامون جاڠن کورڠکن کڤد نيلاي دباوه ݢندا دوا جومله کليئن ساسرن." + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "حد جومله ڤماٴين مکسيموم يڠ بوليه مڽمبوڠ سرنتق." + +#: src/settings_translation_file.cpp +msgid "Maximum number of recent chat messages to show" +msgstr "جومله مکسيموم ميسيج سيمبڠ تربارو اونتوق دتونجوقکن" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: 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 "" +"ڤرکادرن مکسيما اونتوق تتيڠکڤ سماس يڠ دݢوناکن اونتوق هوتبر.\n" +"برݢونا جيک اد سسواتو يڠ اکن دڤاڤرکن دسبله کانن اتاو کيري هوتبر." + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "جومله بلوک مکسيموم يڠ دهنتر سرنتق کڤد ستياڤ کليئن" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "ساٴيز مکسيموم باريس ݢيلير کلوار سيمبڠ" + +#: 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 "" +"ساٴيز مکسيموم باريس ݢيلير کلوار سيمبڠ.\n" +"0 اونتوق لومڤوهکن باريس ݢيلير دان -1 اونتوق بواتکن ساٴيز باريس ݢيلير تيادا " +"حد." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "حد جومله ڤڠݢونا" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "کيش ججاريڠ" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "ميسيج هاري اين" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "ميسيج هاري اين يڠ اکن دڤاڤرکن کڤد ڤماٴين يڠ مڽمبوڠ." + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "قاعده يڠ دݢوناکن اونتوق منونجولکن اوبجيک دڤيليه." + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "ڤتا ميني" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "ککونچي ڤتا ميني" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "کتيڠݢين ايمبسن ڤتا ميني" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +msgstr "سايز تيکستور مينيموم" + +#: src/settings_translation_file.cpp +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 "سالوران مودس" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Modifies the size of the HUD elements." +msgstr "مڠاوبه سايز ايليمن ڤالڠ ڤاڤر ڤندو (hudbar)." + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "لالوان فون monospace" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "سايز فون monospace" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "سايز فون monospace" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "کڤيکاٴن تتيکوس" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "ڤندارب کڤيکاٴن تتيکوس." + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: 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 "" +"ڤندارب اونتوق اڤوڠن تيمبول تڠݢلم.\n" +"چونتوهڽ: 0 اونتوق تيادا اڤوڠن⁏ 1.0 اونتوق بياسا⁏ 2.0 اونتوق دوا کالي ݢندا." + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "ککونچي بيسو" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "بيسوکن بوڽي" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"Current mapgens in a highly unstable state:\n" +"- The optional floatlands of v7 (disabled by default)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" +"نام ڤلاين ڤرماٴينن⹁ اونتوق دڤاڤرکن اڤابيلا ڤماٴين ماسوق دان جوݢ دالم سناراي " +"ڤلاين." + +#: src/settings_translation_file.cpp +msgid "Near plane" +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 "" +"ڤورت رڠکاين اونتوق دڠر (UDP).\n" +"نيلاي اين اکن دأتسي اڤابيلا ممولاکن ڤلاين دري مينو اوتام." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "رڠکاين" + +#: src/settings_translation_file.cpp +msgid "New users need to input this password." +msgstr "ڤڠݢونا بارو مستي مماسوقکن کات لالوان اين." + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "تمبوس بلوک" + +#: src/settings_translation_file.cpp +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 "تونجولن نود" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"processes, especially in singleplayer and/or when running Lua code in\n" +"'on_generated'. For many users the optimum setting may be '1'." +msgstr "" + +#: src/settings_translation_file.cpp +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 "Opaque liquids" +msgstr "چچاٴير لݢڤ" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "کلݢڤن (الفا) بايڠ بلاکڠ فون لالاي⹁ نيلاي انتارا 0 دان 225." + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" +"بوک مينو جيدا اڤابيلا فوکوس تتيڠکڤ هيلڠ.\n" +"تيدق جيدا جيک فورمسڤيک دبوک." + +#: src/settings_translation_file.cpp +msgid "Optional override for chat weblink color." +msgstr "" + +#: 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 "" +"لالوان فون برباليق.\n" +"جيک تتڤن “freetype” دبوليهکن: اي مستيله فون TrueType.\n" +"جيک تتڤن “freetype” دلومڤوهکن: اي مستيله فون ڤتا بيت اتاو ۏيکتور XML.\n" +"فون اين اکن دݢوناکن باݢي سستڠه بهاس اتاو جيک فون لالاي تيدق ترسديا." + +#: 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 "" +"لالوان اونتوق سيمڤن تڠکڤن لاير. وليه جادي لالوان مطلق اتاو ريلاتيف.\n" +"فولدر اکن دچيڤتا سکيراڽ اي بلوم وجود." + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" +"لالوان کديريکتوري ڤمبايڠ. جيک تيادا لالوان دتعريفکن⹁ لوکاسي لالاي اکن " +"دݢوناکن." + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "لالوان کديريکتوري تيکستور. سموا تيکستور دچاري دري سيني داهولو." + +#: 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 "" +"لالوان فون لالاي.\n" +"جيک تتڤن “freetype” دبوليهکن: اي مستيله فون TrueType.\n" +"جيک تتڤن “freetype” دلومڤوهکن: اي مستيله فون ڤتا بيت اتاو ۏيکتور XML.\n" +"فون برباليق اکن دݢوناکن سکيراڽ فون اين تيدق داڤت دمواتکن." + +#: 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 "" +"لالوان فون monospace.\n" +"جيک تتڤن “freetype” دبوليهکن: اي مستيله فون TrueType.\n" +"جيک تتڤن “freetype” دلومڤوهکن: اي مستيله فون ڤتا بيت اتاو ۏيکتور XML.\n" +"فون اين دݢوناکن اونتوق عنصور سڤرتي کونسول دان سکرين ڤمبوکه." + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "جيدا کتيک هيلڠ فوکوس تتيڠکڤ" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "ايکوت فيزيک" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "ککونچي ڤرݢرقن ڤيچ" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "مود ڤرݢرقن ڤيچ" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "ککونچي تربڠ" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "سلڠ ڤڠاولڠن کليک کانن" + +#: 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 "" +"ڤماٴين بوليه تربڠ تنڤ ترکسن دڠن ݢراۏيتي.\n" +"اين ممرلوکن کأيستيميواٴن \"تربڠ\" دالم ڤلاين ترسبوت." + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "جارق وميندهن ڤماٴين" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "ڤماٴين لاون ڤماٴين" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "ڤناڤيسن بيلينيار" + +#: 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 "" +"ڤورت اونتوق مڽمبوڠ (UDP).\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 "" +"منچݢه ݢالي دان ڤلتقن درڤد براولڠ کتيک تروس منکن بوتڠ تتيکوس.\n" +"بوليهکن تتڤن اين اڤابيلا اندا ݢالي اتاو لتق سچارا تيدق سڠاج ترلالو کرڤ." + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" +"کأيستيميواٴن٢ يڠ بوليه دبريکن اوليه ڤماين يڠ ممڤوڽاٴي کأيستيميواٴن " +"basic_privs" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "ککونچي توݢول ڤمبوکه" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "علامت ڤندڠر Prometheus" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" +"علامت ڤندڠر Prometheus.\n" +"جک minetest دکومڤيل دڠن تتڤن ENABLE_PROMETHEUS دبوليهکن,\n" +"ممبوليهکن ڤندڠر ميتريک اونتوق Prometheus ڤد علامت برکناٴن.\n" +"ميتريک بوليه دأمبيل د http://127.0.0.1:30000/metrics" + +#: src/settings_translation_file.cpp +msgid "Proportion of large caves that contain liquid." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" +"ججاري کلواسن اون دڽاتاکن دالم جومله 64 نود ڤيتق اون.\n" +"نيلاي لبيه دري 26 اکن مولا مڠهاسيلکن ڤموتوڠن تاجم دسودوت کاوسن اون." + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "اينڤوت راوق" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "ککونچي جارق ڤميليهن" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "ميسيج سيمبڠ ترکيني" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "لالوان فون بياسا" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "ميديا جارق جاٴوه" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "ڤورت جارق جاٴوه" + +#: 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 "" +"بواڠ کود ورنا درڤد ميسيج سيمبڠ منداتڠ\n" +"ݢوناکن اين اونتوق هنتيکن ڤماٴين درڤد مڠݢوناکن ورنا دالم ميسيج مريک" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" msgstr "" #: src/settings_translation_file.cpp @@ -5201,812 +6180,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Client side node lookup range restriction" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the CSM restriction for node range is enabled, get_node calls are " -"limited\n" -"to this distance from the player to the node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod security" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Prevent mods from doing insecure things like running shell commands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trusted mods" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "HTTP mods" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Load the game profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Load the game profiler to collect game profiling data.\n" -"Provides a /profiler command to access the compiled profile.\n" -"Useful for mod developers and server operators." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default report format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The default format in which profiles are being saved,\n" -"when calling `/profiler save [format]` without format." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Report path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The file path relative to your worldpath in which profiles will be saved to." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Entity methods" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument the methods of entities on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active Block Modifiers" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument the action function of Active Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Loading Block Modifiers" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument the action function of Loading Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Global callbacks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument global callback functions on registration.\n" -"(anything you pass to a minetest.register_*() function)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Builtin" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument builtin.\n" -"This is usually only needed by core/builtin contributors" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Have the profiler instrument itself:\n" -"* Instrument an empty function.\n" -"This estimates the overhead, that instrumentation is adding (+1 function " -"call).\n" -"* Instrument the sampler being used to update the statistics." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client and Server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the player.\n" -"When running a server, clients connecting with this name are admins.\n" -"When starting from the main menu, this is overridden." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Language" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Debug log level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Level of logging to be written to debug.txt:\n" -"- <nothing> (no logging)\n" -"- none (messages with no level)\n" -"- error\n" -"- warning\n" -"- action\n" -"- info\n" -"- verbose" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug log file size threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the file size of debug.txt exceeds the number of megabytes specified in\n" -"this setting when it is opened, the file is moved to debug.txt.1,\n" -"deleting an older debug.txt.1 if it exists.\n" -"debug.txt is only moved if this setting is positive." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat log level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimal level of logging to be written to chat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "IPv6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable IPv6 support (for both client and server).\n" -"Required for IPv6 connections to work at all." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL parallel limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Limits number of parallel HTTP requests. Affects:\n" -"- Media fetch if server uses remote_media setting.\n" -"- Serverlist download and server announcement.\n" -"- Downloads performed by main menu (e.g. mod manager).\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL file download timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu script" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Replaces the default main menu with a custom one." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Engine profiling data print interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Print the engine's profiling data in regular intervals (in seconds).\n" -"0 = disable. Useful for developers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of map generator to be used when creating a new world.\n" -"Creating a world in the main menu will override this.\n" -"Current mapgens in a highly unstable state:\n" -"- The optional floatlands of v7 (disabled by default)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Water level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Water surface level of the world." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max block generate distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far blocks are generated for clients, stated in mapblocks (16 " -"nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation limit" -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" -"Value is stored per-world." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Global map generation attributes.\n" -"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Heat noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Temperature variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Heat blend noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small-scale temperature variation for blending biomes on borders." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity blend noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small-scale humidity variation for blending biomes on borders." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V5" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V5 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation attributes specific to Mapgen v5." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls width of tunnels, a smaller value creates wider tunnels.\n" -"Value >= 10.0 completely disables generation of tunnels and avoids the\n" -"intensive noise calculations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y of upper limit of large caves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small cave minimum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small cave maximum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave minimum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave maximum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave proportion flooded" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Proportion of large caves that contain liquid." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of cavern upper limit." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern taper" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-distance over which caverns expand to full size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines full size of caverns, smaller values create larger caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon minimum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lower Y limit of dungeons." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon maximum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Upper Y limit of dungeons." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noises" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filler depth noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of biome filler depth." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Factor noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Variation of terrain vertical scale.\n" -"When noise is < -0.55 terrain is near-flat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of average terrain surface." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave1 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "First of two 3D noises that together define tunnels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave2 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Second of two 3D noises that together define tunnels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining giant caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ground noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V6 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen v6.\n" -"The 'snowbiomes' flag enables the new 5 biome system.\n" -"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" -"the 'jungles' flag is ignored." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Desert noise threshold" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Beach noise threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sandy beaches occur when np_beach exceeds this value." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain base noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of lower terrain and seabed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain higher noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of higher terrain that creates cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Steepness noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Varies steepness of cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height select noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines distribution of higher terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mud noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Varies depth of biome surface nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Beach noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines areas with sandy beaches." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of number of caves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trees noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines tree areas and tree density." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Apple trees noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines areas where trees have apples." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V7" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V7 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen v7.\n" -"'ridges': Rivers.\n" -"'floatlands': Floating land masses in the atmosphere.\n" -"'caverns': Giant caves deep underground." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain zero level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Y of mountain density gradient zero level. Used to shift mountains " -"vertically." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland minimum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lower Y limit of floatlands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland maximum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Upper Y limit of floatlands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland tapering distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Y-distance over which floatlands taper from full density to nothing.\n" -"Tapering starts at this distance from the Y limit.\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Floatland taper exponent" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Exponent of the floatland tapering. Alters the tapering behaviour.\n" -"Value = 1.0 creates a uniform, linear tapering.\n" -"Values > 1.0 create a smooth tapering suitable for the default separated\n" -"floatlands.\n" -"Values < 1.0 (for example 0.25) create a more defined surface level with\n" -"flatter lowlands, suitable for a solid floatland layer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland density" -msgstr "" - -#: src/settings_translation_file.cpp -#, c-format -msgid "" -"Adjusts the density of the floatland layer.\n" -"Increase value to increase density. Can be positive or negative.\n" -"Value = 0.0: 50% of volume is floatland.\n" -"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" -"to be sure) creates a solid floatland layer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland water level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Surface level of optional water placed on a solid floatland layer.\n" -"Water is disabled by default and will only be placed if this value is set\n" -"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" -"upper tapering).\n" -"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" -"When enabling water placement the floatlands must be configured and tested\n" -"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" -"required value depending on 'mgv7_np_floatland'), to avoid\n" -"server-intensive extreme water flow and to avoid vast flooding of the\n" -"world surface below." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain alternative noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain persistence noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Varies roughness of terrain.\n" -"Defines the 'persistence' value for terrain_base and terrain_alt noises." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain height noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of maximum mountain height (in nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridge underwater noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines large-scale river channel structure." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"3D noise defining mountain structure and height.\n" -"Also defines structure of floatland mountain terrain." +msgid "Ridge mountain spread noise" msgstr "" #: src/settings_translation_file.cpp @@ -6014,127 +6188,7 @@ msgid "Ridge noise" msgstr "" #: src/settings_translation_file.cpp -msgid "3D noise defining structure of river canyon walls." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"3D noise defining structure of floatlands.\n" -"If altered from the default, the noise 'scale' (0.7 by default) may need\n" -"to be adjusted, as floatland tapering functions best when this noise has\n" -"a value range of approximately -2.0 to 2.0." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Carpathian" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Carpathian specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Base ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the base ground level." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River channel width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the width of the river channel." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River channel depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the depth of the river channel." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River valley width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the width of the river valley." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness1 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "First of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness2 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Second of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness3 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Third of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness4 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fourth of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rolling hills spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridge mountain spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Step mountain spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rolling hill size noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of rolling hills." +msgid "Ridge underwater noise" msgstr "" #: src/settings_translation_file.cpp @@ -6142,15 +6196,19 @@ msgid "Ridged mountain size noise" msgstr "" #: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of ridged mountains." +msgid "Right key" +msgstr "ککومچي ککانن" + +#: src/settings_translation_file.cpp +msgid "River channel depth" msgstr "" #: src/settings_translation_file.cpp -msgid "Step mountain size noise" +msgid "River channel width" msgstr "" #: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of step mountains." +msgid "River depth" msgstr "" #: src/settings_translation_file.cpp @@ -6158,103 +6216,130 @@ msgid "River noise" msgstr "" #: src/settings_translation_file.cpp -msgid "2D noise that locates the river valleys and channels." +msgid "River size" msgstr "" #: src/settings_translation_file.cpp -msgid "Mountain variation noise" +msgid "River valley width" msgstr "" #: src/settings_translation_file.cpp -msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgid "Rollback recording" +msgstr "راکمن ݢولوڠ باليق" + +#: src/settings_translation_file.cpp +msgid "Rolling hill size noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen Flat" +msgid "Rolling hills spread noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen Flat specific flags" +msgid "Round minimap" +msgstr "ڤتا ميني بولت" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "ڤڠݢالين دان ڤلتقن سلامت" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." msgstr "" +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "سيمڤن ڤتا يڠ دتريما اوليه کليئن دالم چکرا." + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "سيمڤن سايز تتيڠکڤ سچارا أوتوماتيک کتيک داوبه." + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "سيمڤن ڤتا دتريما دري ڤلاين ڤرماٴينن" + #: 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." +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." msgstr "" +"مڽسوايکن GUI دڠن نيلاي دتنتوکن اوليه ڤڠݢونا.\n" +"ݢوناکن ڤناڤيس انتيألياس جيرن تردکت اونتوق مڽسوايکن GUI.\n" +"اين ممبوليهکن سيسي تاجم دلمبوتکن⹁ دان سباتيکن ڤيکسل اڤابيلا\n" +"مڽسوايتورونکن⹁ نامون اي اکن مڠابورکن سستڠه ڤيکسل دسيسي\n" +"اڤابيلا ايميج دسسوايکن دڠن سايز بوکن اينتيݢر." #: src/settings_translation_file.cpp -msgid "Ground level" -msgstr "" +#, fuzzy +msgid "Screen" +msgstr "سکرين:" #: src/settings_translation_file.cpp -msgid "Y of flat ground." -msgstr "" +msgid "Screen height" +msgstr "تيڠݢي سکرين" #: src/settings_translation_file.cpp -msgid "Lake threshold" -msgstr "" +msgid "Screen width" +msgstr "ليبر سکرين" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "فولدر تڠکڤ لاير" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "فورمت تڠکڤ لاير" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "کواليتي تڠکڤ لاير" #: src/settings_translation_file.cpp msgid "" -"Terrain noise threshold for lakes.\n" -"Controls proportion of world area covered by lakes.\n" -"Adjust towards 0.0 for a larger proportion." +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" +"کواليتي تڠکڤ لاير. هاڽ دݢوناکن اونتوق فورمت JPEG.\n" +"1 مقصودڽ ڤاليڠ تروق⁏ 100 مقصودڽ ڤاليڠ باݢوس.\n" +"ݢوناکن 0 اونتوق کواليتي لالاي." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "تڠکڤ لاير" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Lake steepness" +msgid "Second of 4 2D noises that together define hill/mountain range height." msgstr "" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." +msgid "Second of two 3D noises that together define tunnels." msgstr "" #: src/settings_translation_file.cpp -msgid "Hill threshold" +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Terrain noise threshold for hills.\n" -"Controls proportion of world area covered by hills.\n" -"Adjust towards 0.0 for a larger proportion." -msgstr "" +msgid "Selection box border color (R,G,B)." +msgstr "ورنا سمڤادن کوتق ڤميليهن (R,G,B)." #: src/settings_translation_file.cpp -msgid "Hill steepness" -msgstr "" +msgid "Selection box color" +msgstr "ورنا کوتق ڤميليهن" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines location and terrain of optional hills and lakes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Fractal specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen Fractal.\n" -"'terrain' enables the generation of non-fractal terrain:\n" -"ocean, islands and underground." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fractal type" -msgstr "" +msgid "Selection box width" +msgstr "ليبر کوتق ڤميليهن" #: src/settings_translation_file.cpp msgid "" @@ -6280,218 +6365,205 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Iterations" +#, 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" +msgstr "URL ڤلاين" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "علامت ڤلاين" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "ڤريهل ڤلاين ڤرماٴينن" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "نام ڤلاين ڤرماٴينن" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "ڤورت ڤلاين" + +#: src/settings_translation_file.cpp +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 "فاٴيل سناراي ڤلاين" + +#: 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 "" + +#: src/settings_translation_file.cpp +#, 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Iterations of the recursive function.\n" -"Increasing this increases the amount of fine detail, but also\n" -"increases processing load.\n" -"At iterations = 20 this mapgen has a similar load to mapgen V7." +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" msgstr "" #: src/settings_translation_file.cpp msgid "" -"(X,Y,Z) scale of fractal in nodes.\n" -"Actual fractal size will be 2 to 3 times larger.\n" -"These numbers can be made very large, the fractal does\n" -"not have to fit inside the world.\n" -"Increase these to 'zoom' into the detail of the fractal.\n" -"Default is for a vertically-squashed shape suitable for\n" -"an island, set all 3 numbers equal for the raw shape." +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"تتڤکن کڤد \"true\" اونتوق ممبوليهکن داٴون برݢويڠ.\n" +"ممرلوکن ڤمبايڠ اونتوق دبوليهکن." + #: src/settings_translation_file.cpp msgid "" -"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" -"Can be used to move a desired point to (0, 0) to create a\n" -"suitable spawn point, or to allow 'zooming in' on a desired\n" -"point by increasing 'scale'.\n" -"The default is tuned for a suitable spawn point for Mandelbrot\n" -"sets with default parameters, it may need altering in other\n" -"situations.\n" -"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Slice w" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." msgstr "" +"تتڤکن کڤد \"true\" اونتوق ممبوليهکن داٴون برݢويڠ.\n" +"ممرلوکن ڤمبايڠ اونتوق دبوليهکن." #: src/settings_translation_file.cpp msgid "" -"W coordinate of the generated 3D slice of a 4D fractal.\n" -"Determines which 3D slice of the 4D shape is generated.\n" -"Alters the shape of the fractal.\n" -"Has no effect on 3D fractals.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia x" +"Set to true to enable waving liquids (like water).\n" +"Requires shaders to be enabled." msgstr "" +"تتڤکن کڤد \"true\" اونتوق ممبوليهکن چچاٴير برݢلورا (ماچم اٴير).\n" +"ممرلوکن ڤمبايڠ اونتوق دبوليهکن." #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"X component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia y" +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." msgstr "" +"تتڤکن کڤد \"true\" اونتوق ممبوليهکن تومبوهن برݢويڠ.\n" +"ممرلوکن ڤمبايڠ اونتوق دبوليهکن." #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"Y component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." msgstr "" #: src/settings_translation_file.cpp -msgid "Julia z" -msgstr "" +msgid "Shader path" +msgstr "لالوان ڤمبايڠ" #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"Z component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"cards.\n" +"This only works with the OpenGL video backend." +msgstr "" +"ڤمبايڠ ممبوليهکن کسن ۏيسوال مندالم دان بوليه منيڠکتکن\n" +"ڤريستاسي اونتوق سستڠه کد ۏيديو.\n" +"نامون اي هاڽ برفوڠسي دڠن ڤمبهاݢين بلاکڠ ۏيديو OpenGL." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "کواليتي تڠکڤ لاير" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" msgstr "" #: src/settings_translation_file.cpp -msgid "Julia w" +msgid "Shadow map texture in 32 bits" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "سايز تيکستور مينيموم" + #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"W component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Has no effect on 3D fractals.\n" -"Range roughly -2 to 2." +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" +"اوفسيت بايڠ فون لالاي (دالم اونيت ڤيکسل). جيک 0⹁ ماک بايڠ تيدق اکن دلوکيس." + +#: src/settings_translation_file.cpp +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp -msgid "Seabed noise" -msgstr "" +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "بنتوق ڤتا ميني. دبوليهکن = بولت⹁ دلومڤوهکن = ڤيتق." #: src/settings_translation_file.cpp -msgid "Y-level of seabed." -msgstr "" +msgid "Show debug info" +msgstr "تونجوقکن معلومت ڽهڤڤيجت" #: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys specific flags" -msgstr "" +msgid "Show entity selection boxes" +msgstr "تونجوقکن کوتق ڤميليهن اينتيتي" #: src/settings_translation_file.cpp msgid "" -"Map generation attributes specific to Mapgen Valleys.\n" -"'altitude_chill': Reduces heat with altitude.\n" -"'humid_rivers': Increases humidity around rivers.\n" -"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" -"to become shallower and occasionally dry.\n" -"'altitude_dry': Reduces humidity with altitude." +"Show entity selection boxes\n" +"A restart is required after changing this." msgstr "" #: src/settings_translation_file.cpp -msgid "" -"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" -"enabled. Also the vertical distance over which humidity drops by 10 if\n" -"'altitude_dry' is enabled." -msgstr "" +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "فون تبل سچارا لالايڽ" #: src/settings_translation_file.cpp -msgid "Depth below which you'll find large caves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern upper limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Depth below which you'll find giant caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "How deep to make rivers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "How wide to make rivers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave noise #1" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave noise #2" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filler depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The depth of dirt or other biome filler node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Base terrain height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Raises terrain to make valleys around the rivers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley fill" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Slope and fill work together to modify the heights." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley profile" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amplifies the valleys." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley slope" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chunk size" -msgstr "" +msgid "Shutdown message" +msgstr "ميسيج ڤنوتوڤن" #: src/settings_translation_file.cpp msgid "" @@ -6504,82 +6576,1249 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Mapgen debug" +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" +"ساٴيز کيش بلوکڤتا اونتوق ڤنجان ججاريڠ. مناٴيقکن نيلاي اين\n" +"اکن منيڠکتکن جومله % هيت کيش⹁ مڠورڠکن داتا يڠ ڤرلو دسالين\n" +"درڤد جالور اوتام⹁ لالو مڠورڠکن کترن." + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" msgstr "" #: src/settings_translation_file.cpp -msgid "Dump the mapgen debug information." +msgid "Slice w" msgstr "" #: src/settings_translation_file.cpp -msgid "Absolute limit of queued blocks to emerge" +msgid "Slope and fill work together to modify the heights." msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum number of blocks that can be queued for loading." +msgid "Small cave maximum number" msgstr "" #: src/settings_translation_file.cpp -msgid "Per-player limit of queued blocks load from disk" +msgid "Small cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "ڤنچهاياٴن لمبوت" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" +"ملمبوتکن کاميرا اڤابيلا مليهت سکليليڠ. جوݢ دکنلي سباݢاي ڤلمبوتن ڤڠليهتن اتاو " +"ڤلمبوتن تتيکوس.\n" +"برݢونا اونتوق مراکم ۏيديو." + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" +"ملمبوتکن ڤموترن کاميرا دالم مود سينماتيک. سيت سباݢاي 0 اونتوق ملومڤوهکنڽ." + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "ملمبوتکن ڤموترن کاميرا. سيت سباݢاي 0 اونتوق ملومڤوهکنڽ." + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "ککونچي سلينڤ" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "نيلاي الفا بايڠ فون" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "بوڽي" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" +"منتڤکن URL دري مان کليئن مڠمبيل ميديا⹁ مڠݢنتيکن UDP.\n" +"$filename مستيله بوليه دأکسيس درڤد $remote_media$filename ملالوٴي\n" +"cURL (سوده تنتو⹁ remote_media مستي براخير دڠن تندا چوندوڠ).\n" +"فاٴيل يڠ تيدق وجود اکن دأمبيل دڠن چارا بياسا." + +#: src/settings_translation_file.cpp +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 "" +"منتڤکن ساٴيز تيندنن لالاي باݢي نود⹁ ايتم دان التن.\n" +"امبيل ڤرهاتيان بهاوا مودس اتاو ڤرماٴينن بوليه تتڤکن سچارا خصوص تيندنن اونتوق " +"سستڠه (اتاو سموا) ايتم." + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" msgstr "" #: 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." +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" +"سيبر جولت تولقن لڠکوڠ چهاي.\n" +"مڠاول ليبر جولت اونتوق دتولق.\n" +"سيسيهن ڤياواي Gauss (ݢاٴوس) تولقن لڠکوڠ چهاي." + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "تيتيق لاهير ستاتيک" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Per-player limit of queued blocks to generate" +msgid "Step mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "ککواتن ڤارالکس مود 3D." + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" +"ککواتن تولقن چهاي.\n" +"تيݢ ڤاراميتر 'تولقن' منتعريفکن جولت لڠکوڠ\n" +"چهاي يڠ دتولق دالم ڤنچهاياٴن." + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "ڤمريقساٴن ڤروتوکول کتت" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "بواڠ کود ورنا" + +#: src/settings_translation_file.cpp +msgid "" +"Surface level of optional water placed on a solid floatland layer.\n" +"Water is disabled by default and will only be placed if this value is set\n" +"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" +"upper tapering).\n" +"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" +"When enabling water placement the floatlands must be configured and tested\n" +"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" +"required value depending on 'mgv7_np_floatland'), to avoid\n" +"server-intensive extreme water flow and to avoid vast flooding of the\n" +"world surface below." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" msgstr "" #: 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 "" - -#: src/settings_translation_file.cpp -msgid "Number of emerge threads" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Number of emerge threads to use.\n" -"Value 0:\n" -"- Automatic selection. The number of emerge threads will be\n" -"- 'number of processors - 2', with a lower limit of 1.\n" -"Any other value:\n" -"- Specifies the number of emerge threads, with a lower limit of 1.\n" -"WARNING: Increasing the number of emerge threads increases engine mapgen\n" -"speed, but this may harm game performance by interfering with other\n" -"processes, especially in singleplayer and/or when running Lua code in\n" -"'on_generated'. For many users the optimum setting may be '1'." +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." msgstr "" #: src/settings_translation_file.cpp -msgid "Online Content Repository" +msgid "Terrain persistence noise" msgstr "" #: src/settings_translation_file.cpp -msgid "ContentDB URL" +msgid "Texture path" +msgstr "لالوان تيکستور" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." +msgstr "" +"تيکستور ڤد نود بوليه دجاجرکن سام اد کڤد نود اتاو دنيا.\n" +"مود ڤرتام لبيه سسواي اونتوق بندا ماچم ميسين⹁ ڤرابوت⹁ دان لاٴين٢⹁ ماناکال\n" +"مود کدوا ممبواتکن تڠݢ دان بلوک ميکرو لبيه سسواي دڠن ڤرسکيترنڽ.\n" +"نامون بݢيتو⹁ کران اين چيري بارو⹁ ماک اي موڠکين تيدق دݢوناکن دڤلاين لام⹁\n" +"ڤيليهن اين ممبوليهکن ڤمقساٴن اي اونتوق جنيس نود ترتنتو. امبيل ڤرهاتين\n" +"بهاوا اياڽ داڠݢڤ دالم اوجيکاجي دان موڠکين تيدق برفوڠسي دڠن بتول." + #: src/settings_translation_file.cpp msgid "The URL for the content repository" msgstr "" #: src/settings_translation_file.cpp -msgid "ContentDB Flag Blacklist" +#, fuzzy +msgid "The dead zone of the joystick" +msgstr "ڤڠنل ڤستي کايو بديق يڠ دݢوناکن" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other biome filler node." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Comma-separated list of flags to hide in the content repository.\n" -"\"nonfree\" can be used to hide packages which do not qualify as 'free " -"software',\n" -"as defined by the Free Software Foundation.\n" -"You can also specify content ratings.\n" -"These flags are independent from Minetest versions,\n" -"so see a full list at https://content.minetest.net/help/content_flags/" +"The file path relative to your worldpath in which profiles will be saved to." msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "ڤڠنل ڤستي کايو بديق يڠ دݢوناکن" + +#: src/settings_translation_file.cpp +msgid "The length in pixels it takes for touch screen interaction to start." +msgstr "ڤنجڠ دالم ڤيکسيل اونتوق ممولاکن اينتراکسي سکرين سنتوه." + +#: src/settings_translation_file.cpp +msgid "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"Default is 1.0 (1/2 node).\n" +"Requires waving liquids to be enabled." +msgstr "" +"تيڠݢي مکسيموم ڤرموکاٴن چچاٴير برݢلورا.\n" +"4.0 = تيڠݢي ݢلورا اياله دوا نود.\n" +"0.0 = ݢلورا تيدق برݢرق لڠسوڠ.\n" +"نيلاي اصلڽ 1.0 (1/2 نود).\n" +"ممرلوکن تتڤن چچاٴير برݢلورا دبوليهکن." + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "انتاراموک رڠکاين يڠ ڤلاين دڠر." + +#: 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 "" +"کأيستيميواٴن يڠ ڤڠݢونا٢ بارو داڤت سچارا اٴوتوماتيک.\n" +"ليهت /privs دالم ڤرماٴينن اونتوق سناراي ڤنوه کأيستيميواٴن ڤلاين دان " +"کونفيݢوراسي مودس." + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" +"راديوس جيليد بلوک دسکيتر ستياڤ ڤماٴين يڠ ترتعلوق کڤد\n" +"بندا بلوک اکتيف⹁ دڽاتاکن دالم بلوکڤتا (16 نود).\n" +"دالم بلوک اکتيف⹁ اوبجيک دمواتکن دان ABM دجالنکن.\n" +"اين جوݢ جارق مينيموم دمان اوبجيک اکتيف (موب) دککلکن.\n" +"اين ڤرلو دتتڤکن برسام نيلاي بلوک جارق ڤڠهنترن اوبجيک اکتيف " +"(active_object_send_range_blocks)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" +"ترجمهن بهاݢين بلاکڠ اونتوق Irrlicht.\n" +"اندا ڤرلو ممولاکن سمولا سلڤس مڠاوبه تتڤن اين.\n" +"نوت: دAndroid⹁ ککلکن دڠن OGLES1 جيک تيدق ڤستي! اڤليکاسي موڠکين تيدق\n" +"بوليه دمولاکن جيک مڠݢوناکن تتڤن لاٴين. دڤلاتفورم لاٴين⹁ OpenGL دشورکن⹁\n" +"دان اي اياله ساتو-ساتوڽ ڤماچو يڠ ممڤوڽاٴي سوکوڠن ڤمبايڠ کتيک اين." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" +"کڤيکاٴن ڤکسي کايو بديق اونتوق مڠݢرقکن\n" +"فروستوم ڤڠليهتن دالم ڤرماٴينن." + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" +"ککواتن (کݢلڤن) ڤمبايڠ نود اوکلوسي-سکيتر.\n" +"لبيه رنده لبيه ݢلڤ⹁ لبيه تيڠݢي لبيه تراڠ. نيلاي يڠ صح\n" +"اونتوق تتڤن اين هاڽله دري 0.25 هيڠݢ 4.0. جيک نيلاي\n" +"دلوار جولت⹁ اي اکن دتتڤکن کڤد نيلاي صح يڠ تردکت." + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" +"سلڠ ماس دالم ساٴت⹁ دامبيل انتارا ڤريستيوا يڠ براولڠن\n" +"اڤابيلا منکن کومبيناسي بوتڠ کايو بديق." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" +"جومله ماس دالم ساٴت دامبيل اونتوق ملاکوکن کليک کانن يڠ براولڠ اڤابيلا\n" +"ڤماٴين منکن بوتڠ تتيکوس کانن تنڤ ملڤسکنڽ." + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "جنيس کايو بديق" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Third of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: 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 "" +"ماس اونتوق اينتيتي ايتم (ايتم يڠ دجاتوهکن) تروس هيدوڤ دالم اونيت ساٴت.\n" +"تتڤکن کڤد -1 اونتوق ملومڤوهکن صيفت ترسبوت." + +#: src/settings_translation_file.cpp +msgid "Time of day when a new world is started, in millihours (0-23999)." +msgstr "وقتو دالم هاري اڤابيلا دنيا بارو دمولاکن⹁ دالم ميليجم (0-23999)." + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "سلڠ ڤڠهنترن ماس" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "کلاجوان ماس" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "حد ماس اونتوق کليئن ممبواڠ ڤتا يڠ تيدق دݢوناکن دري ميموري." + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" +"اونتوق مڠورڠکن لمبڤڽ تيندق بالس⹁ ڤميندهن بلوک دڤرلاهنکن اڤابيلا ڤماٴين " +"ممبينا سسوات.\n" +"تتڤن اين منتڤکن براڤ لام اياڽ دڤرلاهنکن ستله ملتقکن اتاٴو مڠاليهکن سسبواه " +"نود." + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "ککونچي توݢول مود کاميرا" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "لڠه تيڤ التن" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "ڤناڤيسن تريلينيار" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" +"True = 256\n" +"False = 128\n" +"بوليه دݢوناکن اونتوق ملنچرکن ڤتا ميني ڤد ميسين يڠ ڤرلاهن." + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "URL کڤد سناراي ڤلاين يڠ دڤاڤرکن دالم تب ڤرماٴينن راماي." + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "ڤنسمڤلن ڤڠورڠن" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" +"ڤنسمڤلن ڤڠورڠن سروڤ سڤرتي مڠݢوناکن ريسولوسي سکرين رنده⹁\n" +"تتاڤي اي هاڽ داڤليکاسيکن کڤد دنيا ڤرماٴينن سهاج⹁ تيدق مڠاوبه GUI.\n" +"اي بوليه منيڠکتکن ڤريستاسي دڠن مڠوربنکن ڤراينچين ايميج.\n" +"نيلاي لبيه تيڠݢي ممبواتکن ايميج يڠ کورڠ ڤراينچين." + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "جارق ڤميندهن ڤماٴين تنڤ حد" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "ݢونا ڤاڤرن اون 3D مڠݢنتيکن اون رات." + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "ݢوناکن انيماسي اون سباݢاي لاتر بلاکڠ مينو اوتام." + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "ݢوناکن ڤناڤيسن انيسوتروڤيک اڤابيلا مليهت تيکستور دري سواتو سودوت." + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "ݢوناکن ڤناڤيسن بيلينيار اڤابيلا مڽسوايکن تيکستور." + +#: 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 "" +"ݢوناکن ڤمتاٴن ميڤ اونتوق مڽسوايکن تيکستور. بوليه منيڠکتکن\n" +"سديکيت ڤريستاسي⹁ تراوتاماڽ اڤابيلا مڠݢوناکن ڤيک تيکستور\n" +"برديفينيسي تيڠݢي. ڤڽسواي-تورون ݢام سچار تڤت تيدق دسوکوڠ." + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + +#: src/settings_translation_file.cpp +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" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "VSync" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "ڤڽݢرقن منݢق سکرين." + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "ڤماچو ۏيديو" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "فکتور اڤوڠن ڤندڠ" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "جارق ڤندڠ دالم اونيت نود." + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "ککونچي مڠورڠ جارق ڤندڠ" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "ککونچي منمبه جارق ڤندڠ" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "ککونچي زوم ڤندڠن" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "جارق ڤندڠ" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Virtual joystick triggers Aux1 button" +msgstr "کايو بديق ماي مميچو بوتڠ aux" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "کقواتن بوڽي" + +#: src/settings_translation_file.cpp +msgid "" +"Volume of all sounds.\n" +"Requires the sound system to be enabled." +msgstr "" +"کقواتن سموا بوڽي.\n" +"ممرلوکن سيستم بوڽي دبوليهکن." + +#: src/settings_translation_file.cpp +msgid "" +"W coordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking and flying speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking, flying and climbing speed in fast mode, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "نود برݢويڠ" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "داٴون برݢويڠ" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "چچاٴير برݢلورا" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "کتيڠݢين اومبق چچاٴير برݢلورا" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "کلاجوان اومبق چچاٴير برݢلورا" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "ڤنجڠ اومبق چچاٴير برݢلورا" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "تومبوهن برݢويڠ" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "ورنا کوتق ڤميليهن" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" +"اڤابيلا ڤناڤيس سکال GUI ايايتgui_scaling_filter دتتڤکن کڤد \"true\"⹁ سموا\n" +"ايميج GUI ڤرلو دتاڤيس دالم ڤرايسين⹁ تتاڤي سستڠه ايميج دجان سچارا تروس\n" +"کڤرکاکسن (چونتوهڽ⹁ ڤنرجمهن-ک-تيکستور اونتوق نود دالم اينۏينتوري)." + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" +"اڤابيلا gui_scaling_filter_txr2img دتتڤکن کڤد \"true\"⹁ سالين سمولا کسموا\n" +"ايميج ترسبوت دري ڤرکاکسن کڤرايسين اونتوق دسسوايکن. سکيراڽ دتتڤکن کڤد\n" +"\"false\"⹁ برباليق کڤد قاعده ڤڽسواين يڠ لام⹁ اونتوق ڤماچو ۏيديو يڠ تيدق " +"ممڤو\n" +"مڽوکوڠ دڠن سمڤورنا فوڠسي موات تورون سمولا تيکستور درڤد ڤرکاکسن." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"This is also used as the base node texture size for world-aligned\n" +"texture autoscaling." +msgstr "" +"اڤابيلا مڠݢوناکن تاڤيسن بيلينيار\\تريلينيار\\انيسوتروڤيک⹁ تيکستور\n" +"ريسولوسي رنده بوليه جادي کابور⹁ جادي سسواي-ناٴيقکن مريک\n" +"سچارا أوتوماتيک دڠن سيسيڤن جيرن تردکت اونتوق ممليهارا ڤيکسل\n" +"کراس. تتڤن اين منتڤکن سايز تيکستور مينيما اونتوق تيکستور\n" +"ڤڽسواي-ناٴيقکن⁏ نيلاي لبيه تيڠݢي تمڤق لبيه تاجم⹁ تتاڤي ممرلوکن\n" +"ميموري يڠ لبيه باڽق. نيلاي کواسا 2 دشورکن. منتڤکن نيلاي اين لبيه\n" +"تيڠݢي دري 1 تيدق اکن منمڤقکن کسن يڠ ڽات ملاٴينکن تاڤيسن\n" +"بيلينيار\\تريلينيار\\انيسوتروڤيک دبوليهکن. اين جوݢ دݢوناکن سباݢاي\n" +"سايز تيکستور نود اساس اونتوق أوتوڤڽسواين تيکستور جاجرن دنيا." + +#: src/settings_translation_file.cpp +msgid "" +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "سام اد انيماسي تيکستور نود ڤرلو دڽهسݢرقکن ڤد ستياڤ بلوک ڤتا." + +#: 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 "" +"تتڤکن سام اد ڤماٴين دتونجوقکن کڤد کليئن تنڤا حد جارق.\n" +"تتڤن اين ترکچم⹁ ݢوناکن تتڤن player_transfer_distance سباݢاي ݢنتي." + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" +"منتڤکن سام اد ايڠين ممبنرکن ڤماٴين اونتوق منچدراکن دان ممبونوه ساتو سام " +"لاٴين." + +#: 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 "" +"تتڤن سام اد اونتوق ممينتا مڽمبوڠ سمولا سلڤس برلاکوڽ کرونتوهن (Lua).\n" +"تتڤکن کڤد \"true\" جک ڤلاين اندا دتتڤکن اونتوق مولا سمولا سچارا اٴوتوماتيک." + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "سام اد اندا هندق مڠکابوتکن ڤڠهوجوڠ کاوسن يڠ کليهتن." + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." +msgstr "" +"سام اد ايڠين ممبيسوکن بوڽي. اندا بوليه مڽهبيسو ڤد بيلا٢\n" +"ماس⹁ ملاٴينکن سيستم بوڽي دلومڤوهکن (enable_sound=false).\n" +"دالم ڤرماٴينن⹁ اندا بوليه منوݢول کأداٴن بيسو مڠݢوناکن ککونچي\n" +"بيسو اتاو مڠݢوناکن مينو جيدا." + +#: 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)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "کومڤونن ليبر سايز تتيڠکڤ اول." + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "ليبر ݢاريسن کوتق ڤميليهن سکليليڠ نود." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" +"سيستم Windows سهاج: مولاکن Minetest دڠن تتيڠکڤ ݢاريس ڤرينة دکت لاتر بلاکڠ.\n" +"مڠندوڠي معلومت يڠ سام سڤرتي فاٴيل debug.txt (نام لالاي)." + +#: 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 "" +"ديريکتوري دنيا (سموا بندا دالم دنيا دسيمڤن دسيني).\n" +"تيدق دڤرلوکن جک برمولا دري مينو اوتام." + +#: src/settings_translation_file.cpp +msgid "World start time" +msgstr "ماس مولا دنيا" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" +"تيکستور جاجرن دنيا بوليه دسسوايکن اونتوق منجڠکاو ببراڤ نود.\n" +"نامون بݢيتو⹁ ڤلاين موڠکين تيدق داڤت مڠهنتر سکال يڠ اندا\n" +"ايڠينکن⹁ تراوتاماڽ جيک اندا ݢوناکن ڤيک تيکستور يڠ دريک سچارا\n" +"خصوص⁏ دڠن ڤيليهن اين⹁ کليئن اکن چوبا اونتوق مننتوکن سکال سچارا\n" +"أوتوماتيک برداسرکن سايز تيکستور. جوݢ ليهت texture_min_size.\n" +"امرن: ڤيليهن اين دالم اوجيکاجي!" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "مود تيکستور جاجرن دنيا" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y of mountain density gradient zero level. Used to shift mountains " +"vertically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#~ msgid "- Creative Mode: " +#~ msgstr "- مود کرياتيف: " + +#~ msgid "- Damage: " +#~ msgstr "- بوليه چدرا " + +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." +#~ msgstr "" +#~ "0 = اوکلوسي ڤارالکس دڠن معلومت چرون (لبيه چڤت).\n" +#~ "1 = ڤمتاٴن بنتوق موک بومي (لبيه لمبت⹁ لبيه تڤت)." + +#~ msgid "Address / Port" +#~ msgstr "علامت \\ ڤورت" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "اداکه اندا ماهو سيت سمولا دنيا ڤماٴين ڤرساورڠن؟" + +#~ msgid "Basic" +#~ msgstr "اساس" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "بيت ڤر ڤيکسيل (اتاو کدالمن ورنا) دالم مود سکرين ڤنوه." + +#~ msgid "Bump Mapping" +#~ msgstr "ڤمتاٴن برتومڤوق" + +#~ msgid "Bumpmapping" +#~ msgstr "ڤمتاٴن برتومڤوق" + +#~ msgid "Config mods" +#~ msgstr "کونفيݢوراسي مودس" + +#~ msgid "Configure" +#~ msgstr "کونفيݢوراسي" + +#~ msgid "Connect" +#~ msgstr "سمبوڠ" + +#~ msgid "Credits" +#~ msgstr "ڤڠهرݢاٴن" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "ورنا باݢي کورسور ررمبوت سيلڠ (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "بوليه چدرا" + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "منتعريفکن تاهڤ ڤرسمڤلن تيکستور.\n" +#~ "نيلاي لبيه تيڠݢي مڠحاصيلکن ڤتا نورمل لبيه لمبوت." + +#~ 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 "Enable register confirmation" +#~ msgstr "بوليهکن ڤڠصحن ڤندفترن" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "ممبوليهکن ڤمتاٴن برتومڤوق ڤد تيکستور. ڤتا نورمل ڤرلو دسدياکن\n" +#~ "اوليه ڤيک تيکستور اتاو ڤرلو دجان سچارا أوتوماتيک.\n" +#~ "ڤرلوکن ڤمبايڠ دبوليهکن." + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "ممبوليهکن ڤنجاناٴن ڤتا نورمل سچارا لايڠ (کسن چيتق تيمبول).\n" +#~ "ڤرلوکن ڤمتاٴن برتومڤوق اونتوق دبوليهکن." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "ممبوليهکن ڤمتاٴن اوکلوسي ڤارالکس.\n" +#~ "ممرلوکن ڤمبايڠ اونتوق دبوليهکن." + +#~ msgid "Enter " +#~ msgstr "ماسوقکن " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "ڤيليهن ڤرچوباٴن⹁ موڠکين منمڤقکن رواڠ ڽات دانتارا\n" +#~ "بلوک اڤابيلا دتتڤکن دڠن نومبور لبيه بسر درڤد 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS دمينو جيدا" + +#~ msgid "Fallback font shadow" +#~ msgstr "بايڠ فون برباليق" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "نيلاي الفا بايڠ فون برباليق" + +#~ msgid "Fallback font size" +#~ msgstr "سايز فون برباليق" + +#~ msgid "Filtering" +#~ msgstr "ڤناڤيسن" + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "سايز فون باݢي فون برباليق دالم اونيت تيتيق (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "فون FreeType" + +#~ msgid "Full screen BPP" +#~ msgstr "BPP سکرين ڤنوه" + +#~ msgid "Game" +#~ msgstr "ڤرماٴينن" + +#~ msgid "Generate Normal Maps" +#~ msgstr "جان ڤتا نورمل" + +#~ msgid "Generate normalmaps" +#~ msgstr "جان ڤتا نورمل" + +#~ msgid "HUD scale factor" +#~ msgstr "فکتور سکالا ڤاڤر ڤندو (HUD)" + +#~ msgid "In-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" +#~ msgstr "اوتام" + +#~ msgid "Menus" +#~ msgstr "مينو" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "ڤتا ميني دالم مود رادر⹁ زوم 2x" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "ڤتا ميني دالم مود رادر⹁ زوم 4x" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "ڤتا ميني دالم مود ڤرموکاٴن⹁ زوم 2x" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "ڤتا ميني دالم مود ڤرموکاٴن⹁ زوم 4x" + +#~ msgid "Name / Password" +#~ msgstr "نام \\ کات لالوان" + +#~ msgid "Name/Password" +#~ msgstr "نام\\کات لالوان" + +#~ msgid "No" +#~ msgstr "تيدق" + +#~ msgid "Normalmaps sampling" +#~ msgstr "ڤرسمڤلن ڤتا نورمل" + +#~ msgid "Normalmaps strength" +#~ msgstr "ککواتن ڤتا نورمل" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "جومله للرن اوکلوسي ڤارالکس." + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "کلݢڤن (الفا) بايڠ بلاکڠ فون برباليق⹁ نيلاي انتارا 0 دان 225." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "ڤڠاروه کسن اوکلوسي ڤارالکس ڤد کسلوروهنڽ⹁ کبياساٴنڽ سکال\\2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "سکال کسلوروهن کسن اوکلوسي ڤارالکس." + +#~ msgid "Parallax Occlusion" +#~ msgstr "اوکلوسي ڤارالکس" + +#~ msgid "Parallax occlusion" +#~ msgstr "اوکلوسي ڤارالکس" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "ڤڠاروه اوکلوسي ڤارالکس" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "للرن اوکلوسي ڤارالکس" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "مود اوکلوسي ڤارالکس" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "سکال اوکلوسي ڤارالکس" + +#~ msgid "PvP enabled" +#~ msgstr "بوليه برلاوان PvP" + +#~ msgid "Reset singleplayer world" +#~ msgstr "سيت سمولا دنيا ڤماٴين ڤرساورڠن" + +#~ msgid "Server / Singleplayer" +#~ msgstr "ڤلاين ڤرماٴينن \\ ڤماٴين ڤرسأورڠن" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "اوفسيت بايڠ فون برباليق (دالم اونيت ڤيکسل). جيک 0⹁ ماک بايڠ تيدق اکن " +#~ "دلوکيس." + +#~ msgid "Special" +#~ msgstr "ايستيميوا" + +#~ msgid "Special key" +#~ msgstr "ککونچي ايستيميوا" + +#~ msgid "Start Singleplayer" +#~ msgstr "مولا ماٴين ساورڠ" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "ککواتن ڤتا نورمل يڠ دجان." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "اونتوق ممبوليهکن ڤمبايڠ⹁ ڤماچو OpenGL مستي دݢوناکن." + +#~ msgid "View" +#~ msgstr "ليهت" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "منتڤکن سام اد فون FreeType دݢوناکن⹁ ممرلوکن سوکوڠن Freetype\n" +#~ "دکومڤيل برسام. جيک دلومڤوهکن⹁ فون ڤتا بيت دان ۏيکتور XML اکن دݢوناکن." + +#~ 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 "اندا تله منيڠݢل" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/nb/minetest.po b/po/nb/minetest.po index ed5bab6db..db8baaf4d 100644 --- a/po/nb/minetest.po +++ b/po/nb/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Norwegian Bokmål (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-18 13:41+0000\n" -"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-06-11 17:19+0000\n" +"Last-Translator: Kenneth LNOR <kennethlnor@gmail.com>\n" "Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/" "minetest/minetest/nb_NO/>\n" "Language: nb\n" @@ -12,7 +12,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.1.1-dev\n" +"X-Generator: Weblate 4.13-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Nullstill meldingskøen" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Tom kommando." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Avslutt til hovedmeny" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Ugyldig kommando: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Avgitt kommando: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "List opp påkoblede spillere" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Påkoblede spillere: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Utgående meldingskø er nå tømt." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Denne kommandoen er utkoblet av tjeneren." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,9 +58,40 @@ msgstr "Gjenoppstå" msgid "You died" msgstr "Du døde" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Tilgjengelige kommandoer:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Tilgjengelige kommandoer: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Ikke tilgjengelig kommando: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Få hjelp med kommandoer" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Bruk «.help <kommando>» for å få mer informasjon, eller «.help all» for å " +"liste opp alt." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <kommando>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<ingen tilgjengelig>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -46,9 +113,30 @@ msgstr "Koble til på nytt" msgid "The server has requested a reconnect:" msgstr "Tjeneren har bedt om ny tilkobling:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Laster..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Velg endringer" + +#: 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. " @@ -63,10 +151,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Tjener støtter protokollversjoner mellom $1 og $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Prøv å aktivere offentlig tjenerliste på nytt og sjekk Internettforbindelsen " -"din." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,27 +162,36 @@ msgstr "Vi støtter kun protokollversjon $1." msgid "We support protocol versions between version $1 and $2." msgstr "Vi støtter protokollversjoner mellom versjon $1 og $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Avbryt" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" -msgstr "Avhengigheter:" +msgstr "Pakker:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable all" -msgstr "Fjern alt" +msgstr "Deaktivere alle" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "Koble ut modpakke" +msgstr "Deaktiver modpakke" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -104,19 +199,19 @@ msgstr "Aktiver alle" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" -msgstr "Aktiver modpakken" +msgstr "Aktiver modpakke" #: 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 "" -"Kunne ikke aktivere modden «$1» fordi den inneholder ugyldige tegn. Kun " -"tegnene [a-z0-9_] er tillatt." +"Kunne ikke aktivere modden \"$1\" inneholder ugyldige tegn. Kun tegnene [a-" +"z0-9_] er tillatt." #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Finn Flere Mods" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -124,13 +219,14 @@ msgstr "Mod:" #: builtin/mainmenu/dlg_config_world.lua msgid "No (optional) dependencies" -msgstr "Kan gjerne bruke" +msgstr "Ingen (valgfrie) pakker" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." msgstr "Mangler spillbeskrivelse." #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy msgid "No hard dependencies" msgstr "Krever ingen andre modder" @@ -139,13 +235,12 @@ msgid "No modpack description provided." msgstr "Ingen modpakke-beskrivelse tilgjengelig." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No optional dependencies" -msgstr "Valgfrie avhengigheter:" +msgstr "Ingen valgfrie pakker" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" -msgstr "Valgfrie avhengigheter:" +msgstr "Valgfrie behov:" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp @@ -160,38 +255,87 @@ msgstr "Verden:" msgid "enabled" msgstr "aktivert" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "«$1» eksisterer allerede. Ønsker du å skrive over den?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 og $2 pakker blir installert." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 av $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 laster ned,\n" +"$2 i kø" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 laster ned..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 påkrevd pakke manglet." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 blir installert, and $2 pakker blir hoppet over." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Alle pakker" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Allerede installert" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Tilbake til hovedmeny" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Grunnspill:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB er ikke tilgjengelig når Minetest kompileres uten cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Laster..." +msgstr "Laster ned..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" -msgstr "Klarte ikke laste ned $1" +msgstr "Kunne ikke laste ned $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Spill" #: builtin/mainmenu/dlg_contentstore.lua msgid "Install" -msgstr "Installer" +msgstr "Installere" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "Installere $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Installasjon mangler pakker" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Installasjon: Ikke-støttet filtype eller ødelagt pakke" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Mods" msgstr "Modder" @@ -201,12 +345,27 @@ msgstr "Kunne ikke hente pakker" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" -msgstr "Resultatløst" +msgstr "Ingen resultater" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Søk" +msgid "No updates" +msgstr "Ingen oppdateringer" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Ikke funnet" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Overskriv" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Vennligst sjekk at grunnspillet er riktig." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Satt i kø" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -214,15 +373,19 @@ msgstr "Teksturpakker" #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" -msgstr "Avinstaller" +msgstr "Avinstallere" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "Oppdater" +msgstr "Oppdatere" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Oppdatere Alle [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Se mer informasjon i nettleseren" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -230,99 +393,93 @@ msgstr "En verden med navn \"$1\" eksisterer allerede" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Ytterligere terreng" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "Temperaturen synker med stigende høyde" +msgstr "Høydekjøling" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Temperaturen synker med stigende høyde" +msgstr "Høyde tørke" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Biotoplyd" +msgstr "Biom blanding" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Biotoplyd" +msgstr "Biomer" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Grottelyd" +msgstr "Grotter" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Oktaver" +msgstr "Huler" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Opprett" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Informasjon:" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Last ned et spill, for eksempel Minetest Game, fra minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Last ned en fra minetest.net" +msgstr "Dekorasjoner" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Development Test is meant for developers." +msgstr "Advarsel: Utviklingstesten er tiltenkt utviklere." + +#: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "Grottelyd" +msgstr "Fangehull" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Flatt terreng" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "" +msgstr "Flytende landmasser på himmelen" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Spill" +msgstr "Flytlandene (eksperimentelt)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Generer ikke-fraktalt terreng: Hav og underjordisk" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Bakker" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Humid rivers" -msgstr "Videodriver" +msgstr "Fuktige elver" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" +msgstr "Øker fuktigheten rundt elver" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Installere $1" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "Innsjøer" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgstr "Lav fuktighet og høy varme fører til små eller tørre elver" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -330,110 +487,104 @@ msgstr "Mapgen" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "" +msgstr "Mapgen-flagg" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Mapgen" +msgstr "Mapgen-spesifikke flagg" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "Fjell" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Gjørmeflyt" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Nettverk av tuneller og huler" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" -msgstr "Intet spill valgt" +msgstr "Ingen spill valgt" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Reduserer varmen med høyden" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Reduserer fuktigheten med høyden" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Elvestørrelse" +msgstr "Elver" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Havnivå Elver" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Seed" -msgstr "Seed" +msgstr "Frø" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Glatt overgang mellom biotoper" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Strukturer som vises i terrenget (ingen effekt på trær og jungelgress skapt " +"av v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Strukturer som dukker opp i terrenget, typisk trær og planter" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Temperert, ørken" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Temperert, ørken, jungel" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Temperert, Ørken, Jungel, Tundra, Taiga" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "Terrengoverflate Erosjon" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Trær og jungelgress" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Vary river depth" -msgstr "Elvedybde" +msgstr "Varier elvedybden" #: 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 "Advarsel: Den minimale utviklingstesten er tiltenkt utviklere." +msgstr "Svært store huler dypt i undergrunnen" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" -msgstr "Navnet på verdenen" +msgstr "Navn på verden" #: builtin/mainmenu/dlg_create_world.lua msgid "You have no games installed." -msgstr "Du har ikke noen spill installert." +msgstr "Du har ingen spill installert." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "Er du sikker at du vil slette \"$1\"?" +msgstr "Er du sikker på at du vil slette \"$1\"?" #: builtin/mainmenu/dlg_delete_content.lua #: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua @@ -443,15 +594,47 @@ msgstr "Slett" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: failed to delete \"$1\"" -msgstr "pkgmgr: Klarte ikke å slette \"$1\"" +msgstr "pkgmgr: mislyktes i å slette \"$1\"" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: invalid path \"$1\"" -msgstr "pkgmgr: Feil sti \"$1\"" +msgstr "pkgmgr: ugyldig sti \"$1\"" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "Slett verdenen \"$1\"?" +msgstr "Slett verden \"$1\"?" + +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Bekreft passord" + +#: 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 "Navn" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Passord" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "Passordene samsvarer ikke!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Registrer og logg inn" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" @@ -459,19 +642,19 @@ msgstr "Godta" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Gi et nytt navn til modpaken:" +msgstr "Gi Modpakke nytt navn:" #: 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 "" -"Denne modpaken har et forhåndsdefinert navn i modpack.conf som vil " -"overskrive et eventuelt nytt navn." +"Denne modpakken har et gitt navn i modpack.conf som vil overstyre enhver " +"omdøping." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" -msgstr "(Ingen beskrivelse av gitt)" +msgstr "(Ingen beskrivelse av innstillingen)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "2D Noise" @@ -479,13 +662,23 @@ msgstr "2D-støy" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "< Tilbake til instillinger" +msgstr "< Tilbake til innstillinger" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" -msgstr "See gjennom" +msgstr "Bla gjennom" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Innhold" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Innhold" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Deaktivert" @@ -507,19 +700,19 @@ msgstr "Oktaver" #: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Offset" -msgstr "Forskyvning" +msgstr "Offset" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" -msgstr "Bestandighet" +msgid "Persistence" +msgstr "Standhaftighet" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." -msgstr "Vennligst angi et gyldig heltall." +msgstr "Vennligst skriv inn et gyldig heltall." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." -msgstr "Vennligst angi et gydlig tall." +msgstr "Vennligst oppgi et gyldig nummer." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" @@ -529,6 +722,10 @@ msgstr "Gjenopprette standard" msgid "Scale" msgstr "Skala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Søk" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Velg mappe" @@ -537,13 +734,13 @@ msgstr "Velg mappe" msgid "Select file" msgstr "Velg 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 navn" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must be at least $1." -msgstr "Verdien må vøre minst $1." +msgstr "Verdien må være minst $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must not be larger than $1." @@ -606,44 +803,91 @@ msgstr "$1 mods" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" -msgstr "Klarte ikke å installere $1 til $2" +msgstr "Kunne ikke installere $1 til $2" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "Installer mod: Klarte ikke å finne riktig mod-navn for: $1" +msgstr "Installer Mod: Kan ikke finne ekte modnavn for: $1" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" -msgstr "Installer mod: Klarte ikke finne egnet mappenavn for mod-pakke $1" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Installasjon: Ikke-støttet filtype \"$1\" eller ødelagt arkiv" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Installasjon: fil \"$1\"" +msgstr "Install Mod: Kan ikke finne passende mappenavn for modpack $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" -msgstr "Klarte ikke finne en gyldig mod eller modpakke" +msgstr "Kan ikke finne en gyldig mod eller modpakke" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a $1 as a texture pack" -msgstr "Klarte ikke å installere $1 som teksturpakke" +msgstr "Kan ikke installere en $1 som en teksturpakke" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a game as a $1" -msgstr "Klarte ikke å installere et spill som $1" +msgstr "Kan ikke installere et spill som en $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" -msgstr "Klarte ikke å installere mod som en $1" +msgstr "Kan ikke installere en mod som en $1" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a modpack as a $1" -msgstr "Klarte ikke å installere en modpakke som $1" +msgstr "Kan ikke installere en modpack som en $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Laster inn..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Offentlig serverliste er deaktivert" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Prøv å aktivere offentlig serverliste og sjekk Internett-tilkoblingen din." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Om" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktive bidragsytere" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "Aktiv grafisk tegner:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Kjerneutviklere" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Velg mappe" + +#: 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 "" +"Åpner katalogen som inneholder brukerleverte verdener, spill, mods,\n" +"og teksturpakker i en filbehandler/utforsker." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Tidligere bidragsytere" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Tidligere kjerneutviklere" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Share debug log" +msgstr "Vis feilsøkingsinfo" #: builtin/mainmenu/tab_content.lua msgid "Browse online content" @@ -655,7 +899,7 @@ msgstr "Innhold" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" -msgstr "Slå av teksturpakke" +msgstr "Deaktiver Teksturpakke" #: builtin/mainmenu/tab_content.lua msgid "Information:" @@ -667,7 +911,7 @@ msgstr "Installerte pakker:" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." -msgstr "Ingen avhengigheter." +msgstr "Ingen datapakker." #: builtin/mainmenu/tab_content.lua msgid "No package description available" @@ -685,49 +929,25 @@ msgstr "Avinstaller pakke" msgid "Use Texture Pack" msgstr "Bruk teksturpakke" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktive bidragsytere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Kjerneutviklere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Bidragsytere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Tidligere bidragsytere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Tidligere kjerneutviklere" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "Annonseringstjener" +msgstr "Kunngjør Server" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" -msgstr "Bindingsadresse" +msgstr "Tildel Adresse" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Sett opp" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Kreativt modus" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" -msgstr "Skru på skade" +msgstr "Aktiver skade" #: builtin/mainmenu/tab_local.lua msgid "Host Game" -msgstr "Vær vert for spill" +msgstr "Spill Tjener" #: builtin/mainmenu/tab_local.lua msgid "Host Server" @@ -735,11 +955,7 @@ msgstr "Vertstjener" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Navn/passord" +msgstr "Installer spill fra ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -753,10 +969,14 @@ msgstr "Ingen verden opprettet eller valgt!" msgid "Play Game" msgstr "Spill" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Velg endringer" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Velg verden:" @@ -770,45 +990,64 @@ msgid "Start Game" msgstr "Start spill" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adresse / port" +msgid "Address" +msgstr "Adresse" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Koble til" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Tøm" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Kreativ modus" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Skade aktivert" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "Skade" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Slett favoritt" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favoritter" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favoritt" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Inkompatible servere" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Ta del i spill" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Navn / passord" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Latens" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Alle mot alle er på" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Offentlige servere" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Oppdater" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Eksterne media" + +#: 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" @@ -834,10 +1073,6 @@ msgstr "Alle innstillinger" msgid "Antialiasing:" msgstr "Kantutjevning:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Er du sikker på at du ønsker å tilbakestille din enkeltspiller-verden?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Lagre skjermstørrelse automatisk" @@ -846,10 +1081,6 @@ msgstr "Lagre skjermstørrelse automatisk" msgid "Bilinear Filter" msgstr "Bilineært filter" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Teksturtilføyning" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Endre taster" @@ -858,13 +1089,30 @@ msgstr "Endre taster" msgid "Connected Glass" msgstr "Forbundet glass" -#: builtin/mainmenu/tab_settings.lua -msgid "Fancy Leaves" -msgstr "Forseggjorte blader" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dynamiske skygger" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Generer normale kart" +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Dynamiske skygger: " + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "Stilfulle Blader" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "Høy" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Lav" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Medium" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -874,13 +1122,9 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + anisotropisk filter" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nei" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" -msgstr "Inget filter" +msgstr "Ingen filter" #: builtin/mainmenu/tab_settings.lua msgid "No Mipmap" @@ -900,24 +1144,16 @@ msgstr "Ingen" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" -msgstr "Diffuse løv" +msgstr "Ugjennomsiktige blader" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" -msgstr "Diffust vann" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallakse Okklusjon" +msgstr "Ugjennomsiktig vann" #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partikler" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Tilbakestill enkeltspillerverden" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Skjerm:" @@ -928,43 +1164,53 @@ msgstr "Innstillinger" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" -msgstr "Skygger" +msgstr "Shaders" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shaders (eksperimentelt)" #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" -msgstr "Skyggelegging (ikke tilgjenglig)" +msgstr "Shaders (ikke tilgjengelig)" #: builtin/mainmenu/tab_settings.lua msgid "Simple Leaves" -msgstr "Enkle løv" +msgstr "Enkle Blader" #: builtin/mainmenu/tab_settings.lua msgid "Smooth Lighting" -msgstr "Gjevn belysning" +msgstr "Jevn belysning" #: builtin/mainmenu/tab_settings.lua msgid "Texturing:" msgstr "Teksturering:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "For å skru på skyggeleging, må man bruke OpenGL-driveren." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" -msgstr "Nyanseoversettelse (tone mapping)" +msgstr "Tonemapping" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "Trykkterskel: (px)" +#, fuzzy +msgid "Touch threshold (px):" +msgstr "Berøringsterskel: (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" -msgstr "Trilineært filter" +msgstr "Tri-lineært filter" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Ultrahøy" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Veldig lav" #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" -msgstr "Bølgende blader" +msgstr "Viftende blader" #: builtin/mainmenu/tab_settings.lua msgid "Waving Liquids" @@ -972,27 +1218,16 @@ msgstr "Skvulpende væsker" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" -msgstr "Bølgende planter" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ja" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Sett opp modder" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Hovedmeny" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Start enkeltspiller" +msgstr "Viftende planter" #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Tilkoblingsfeil (tidsavbrudd?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." -msgstr "Forbindelsen løp ut på tid." +msgstr "Tilkoblingen ble tidsavbrutt." #: src/client/client.cpp msgid "Done!" @@ -1000,27 +1235,27 @@ msgstr "Ferdig!" #: src/client/client.cpp msgid "Initializing nodes" -msgstr "Setter opp noder" +msgstr "Initialisering av noder" #: src/client/client.cpp msgid "Initializing nodes..." -msgstr "Setter opp noder..." +msgstr "Initialiserer noder..." #: src/client/client.cpp msgid "Loading textures..." -msgstr "Laster teksturer…" +msgstr "Laster inn teksturer..." #: src/client/client.cpp msgid "Rebuilding shaders..." -msgstr "Gjenoppbygger skyggeleggere…" +msgstr "Gjenoppbygger shaders..." #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" msgstr "Tilkoblingsfeil (tidsavbrudd?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Klarte ikke finne eller laste inn spill «" +msgid "Could not find or load game: " +msgstr "Kunne ikke finne eller laste inn spillet: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1032,36 +1267,24 @@ msgstr "Hovedmeny" #: src/client/clientlauncher.cpp msgid "No world selected and no address provided. Nothing to do." -msgstr "Intet å gjøre. Ingen verden valgt og ingen adresse oppgitt." +msgstr "Ingen verden valgt og ingen adresse oppgitt. Ingenting å gjøre." #: src/client/clientlauncher.cpp msgid "Player name too long." -msgstr "Spillernavnet er for lagt." +msgstr "Spillernavn for langt." #: src/client/clientlauncher.cpp msgid "Please choose a name!" -msgstr "Velg et navn!" +msgstr "Vennligst velg et navn!" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " -msgstr "Passordfilen kunne ikke åpnes: " +msgstr "Den oppgitte passordfilen kunne ikke åpnes: " #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Angitt sti til verdenen finnes ikke: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1074,14 +1297,6 @@ msgstr "" msgid "- Address: " msgstr "- Adresse: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Kreativ modus: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Skade: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Modus: " @@ -1103,6 +1318,16 @@ msgstr "- Alle mot alle (PvP): " msgid "- Server Name: " msgstr "- Tjenernavn: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Det oppstod en feil:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Ingen tilgang. På grunn av: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Automatisk forover slått av" @@ -1111,6 +1336,22 @@ msgstr "Automatisk forover slått av" msgid "Automatic forward enabled" msgstr "Automatisk forover slått på" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Block bounds gjemt" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Block bounds vist for alle blokker" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Block bounds vist for gjeldende blokk" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Block bounds vist for nærliggende blokker" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Kameraoppdatering slått av" @@ -1119,6 +1360,11 @@ msgstr "Kameraoppdatering slått av" msgid "Camera update enabled" msgstr "Kameraoppdatering slått på" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Kan ikke vise block bounds (trenger 'basic_debug' tillatelser)" + #: src/client/game.cpp msgid "Change Password" msgstr "Endre passord" @@ -1131,14 +1377,22 @@ msgstr "Filmatisk modus avskrudd" msgid "Cinematic mode enabled" msgstr "Filmatisk modus påskrudd" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Klienten koblet fra" + #: src/client/game.cpp msgid "Client side scripting is disabled" -msgstr "Skripting er slått av på klientside" +msgstr "Skripting på klientsiden er deaktivert" #: src/client/game.cpp msgid "Connecting to server..." msgstr "Kobler til tjener…" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Tilkoblingen mislyktes av ukjent årsak" + #: src/client/game.cpp msgid "Continue" msgstr "Fortsett" @@ -1151,30 +1405,35 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" -"Controls:\n" +"Kontroller:\n" "- %s: flytt forover\n" "- %s: flytt bakover\n" "- %s: flytt mot venstre\n" "- %s: flytt mot høyre\n" -"- %s: hopp/klatre\n" -"- %s: snik/bøy deg ned\n" -"- %s: slipp tingen\n" +"- %s: hopp/klatre oppover\n" +"- %s: grav/slå\n" +"- %s: plasser/bruk\n" +"- %s: snik/klatre nedover\n" +"- %s: slipp ting\n" "- %s: inventar\n" "- Mus: snu/se\n" -"- Mus venstre: grav/slå\n" -"- Mus høyre: plasser/bruk\n" -"- Mus hjul: velg ting\n" -"- %s: nettprat\n" +"- Musehjul: velg ting\n" +"- %s: chat\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Kunne ikke løse adressen: %s" #: src/client/game.cpp msgid "Creating client..." @@ -1186,15 +1445,15 @@ msgstr "Oppretter tjener…" #: src/client/game.cpp msgid "Debug info and profiler graph hidden" -msgstr "Skjuler feilsøkingsinfo og profilgraf" +msgstr "Feilsøkingsinformasjon og profileringsgraf er skjult" #: src/client/game.cpp msgid "Debug info shown" -msgstr "Viser feilsøkingsinfo" +msgstr "Feilsøkingsinformasjon vises" #: src/client/game.cpp msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "" +msgstr "Feilsøkingsinformasjon, profileringsgraf og wireframe skjult" #: src/client/game.cpp msgid "" @@ -1226,11 +1485,16 @@ msgstr "" #: src/client/game.cpp msgid "Disabled unlimited viewing range" -msgstr "Ubegrenset synsrekkevidde avslått" +msgstr "Ubegrenset visningsområde deaktivert" #: src/client/game.cpp msgid "Enabled unlimited viewing range" -msgstr "Ubegrenset synsrekkevidde påslått" +msgstr "Ubegrenset synsrekkevidde aktivert" + +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Oppretter klient…" #: src/client/game.cpp msgid "Exit to Menu" @@ -1242,35 +1506,35 @@ msgstr "Avslutt til operativsystem" #: src/client/game.cpp msgid "Fast mode disabled" -msgstr "Rask forflytning av" +msgstr "Rask modus deaktivert" #: src/client/game.cpp msgid "Fast mode enabled" -msgstr "Rask forflytning på" +msgstr "Hurtigmodus aktivert" #: src/client/game.cpp msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "" +msgstr "Hurtigmodus aktivert (merk: ingen \"rask\"-rettigheter)" #: src/client/game.cpp msgid "Fly mode disabled" -msgstr "Flymodus av" +msgstr "Flymodus deaktivert" #: src/client/game.cpp msgid "Fly mode enabled" -msgstr "Flymodus på" +msgstr "Flymodus aktivert" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "" +msgstr "Flymodus aktivert (merk: ingen 'fly'-privilegium)" #: src/client/game.cpp msgid "Fog disabled" -msgstr "Tåke av" +msgstr "Tåke deaktivert" #: src/client/game.cpp msgid "Fog enabled" -msgstr "Tåke på" +msgstr "Tåke aktivert" #: src/client/game.cpp msgid "Game info:" @@ -1278,7 +1542,7 @@ msgstr "Spillinfo:" #: src/client/game.cpp msgid "Game paused" -msgstr "Spill pauset" +msgstr "Spillet er satt på pause" #: src/client/game.cpp msgid "Hosting server" @@ -1302,47 +1566,23 @@ msgstr "MiB/s" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "" +msgstr "Minimap er for øyeblikket deaktivert av spill eller mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Skjuler minikart" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +msgstr "Flerspiller" #: src/client/game.cpp msgid "Noclip mode disabled" -msgstr "" +msgstr "Noclip-modus deaktivert" #: src/client/game.cpp msgid "Noclip mode enabled" -msgstr "Kan gå gjennom vegger" +msgstr "Noclip-modus aktivert" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "" +msgstr "Noclip-modus aktivert (merk: ingen \"noclip\"-rettigheter)" #: src/client/game.cpp msgid "Node definitions..." @@ -1358,27 +1598,27 @@ msgstr "På" #: src/client/game.cpp msgid "Pitch move mode disabled" -msgstr "Tonehøydeforandringsmodus avskrudd" +msgstr "Pitch flyttemodus deaktivert" #: src/client/game.cpp msgid "Pitch move mode enabled" -msgstr "" +msgstr "Pitch flyttemodus aktivert" #: src/client/game.cpp msgid "Profiler graph shown" -msgstr "" +msgstr "Profil graf vises" #: src/client/game.cpp msgid "Remote server" -msgstr "Tjener annensteds hen" +msgstr "Ekstern server" #: src/client/game.cpp msgid "Resolving address..." -msgstr "Fortolker adresse…" +msgstr "Løser adresse ..." #: src/client/game.cpp msgid "Shutting down..." -msgstr "Slås av…" +msgstr "Slår av..." #: src/client/game.cpp msgid "Singleplayer" @@ -1394,43 +1634,58 @@ msgstr "Lyd av" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Lydsystemet er deaktivert" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Lydsystem støttes ikke på denne versjonen" #: src/client/game.cpp msgid "Sound unmuted" -msgstr "Lyd på" +msgstr "Lyden er på" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Serveren kjører sannsynligvis en annen versjon av %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Kan ikke koble til %s fordi IPv6 er deaktivert" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Kan ikke lytte på %s fordi IPv6 er deaktivert" #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" -msgstr "Synsrekkevidde endret til %d%%" +msgstr "Visningsområde endret til %d" #: src/client/game.cpp #, c-format msgid "Viewing range is at maximum: %d" -msgstr "Synsrekkevidde er så lang det går an: %d" +msgstr "Visningsområdet er maksimalt: %d" #: src/client/game.cpp #, c-format msgid "Viewing range is at minimum: %d" -msgstr "Synsrekkevidde er så kort det går an: %d" +msgstr "Visningsområdet er minimum: %d" #: src/client/game.cpp #, c-format msgid "Volume changed to %d%%" -msgstr "Lydstyrke endret til %d%%" +msgstr "Volumet endret til %d%%" #: src/client/game.cpp msgid "Wireframe shown" -msgstr "" +msgstr "Kantlinjer vises" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "" +msgstr "Zoom er for øyeblikket deaktivert av spill eller mod" #: src/client/game.cpp msgid "ok" @@ -1446,20 +1701,20 @@ msgstr "Viser chat" #: src/client/gameui.cpp msgid "HUD hidden" -msgstr "" +msgstr "HUD skjult" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "" +msgstr "HUD vist" #: src/client/gameui.cpp msgid "Profiler hidden" -msgstr "" +msgstr "Profiler skjult" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" +msgstr "Profiler vises (side %d av %d)" #: src/client/keycode.cpp msgid "Apps" @@ -1473,10 +1728,6 @@ msgstr "Tilbaketast" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Tøm" - #: src/client/keycode.cpp msgid "Control" msgstr "Kontroll" @@ -1491,7 +1742,7 @@ msgstr "End" #: src/client/keycode.cpp msgid "Erase EOF" -msgstr "" +msgstr "Slett EOF" #: src/client/keycode.cpp msgid "Execute" @@ -1724,28 +1975,32 @@ msgstr "X knapp 2" msgid "Zoom" msgstr "Forstørrelse" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Passordene samsvarer ikke!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Skjuler minikart" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registrer og logg inn" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Klarte ikke laste ned $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" -"Dette er første gang du kobler deg til serveren «\"%s».\n" -"Om du fortsetter, vil det opprettes en ny konto med ditt navn og passord på " -"denne serveren.\n" -"Vennligst skriv inn et passord og klikk på «Registrer meg og bli med» for å " -"bekrefte opprettelse av konto, eller klikk « Avbryt» for å avbryte." #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" @@ -1753,8 +2008,8 @@ msgstr "Fortsett" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy -msgid "\"Special\" = climb down" -msgstr "«bruk» = klatre ned" +msgid "\"Aux1\" = climb down" +msgstr "«Spesial» = klatre ned" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1764,15 +2019,23 @@ msgstr "Automatisk fremover" msgid "Automatic jumping" msgstr "Automatisk hopping" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Tilbake" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Endre visning" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Chatte" @@ -1825,10 +2088,8 @@ msgid "Key already in use" msgstr "Tast allerede i bruk" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" -"Tastaturtilknytninger. (Hvis dette byr på problemer, fjern ting fra minetest." -"conf)" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1858,10 +2119,6 @@ msgstr "Skjermdump" msgid "Sneak" msgstr "Snike" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Spesial" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "HUD (hurtigtilgang) av/på" @@ -1902,10 +2159,6 @@ msgstr "trykk tast" msgid "Change" msgstr "Endre" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Bekreft passord" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Nytt passord" @@ -1914,6 +2167,10 @@ msgstr "Nytt passord" msgid "Old Password" msgstr "Gammelt passord" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Passordene samsvarer ikke!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Avslutt" @@ -1923,14 +2180,9 @@ msgid "Muted" msgstr "Av" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Lydstyrke: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Enter " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Lydstyrke: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1939,6 +2191,16 @@ msgstr "Enter " msgid "LANG_CODE" msgstr "nb" +#: 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 "Vennligst velg et navn!" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1949,9 +2211,10 @@ msgstr "" "første berøring." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Bruk virtuell styrepinne til å utløse \"aux\"-knapp.\n" @@ -1998,12 +2261,6 @@ msgstr "" "Standardverdien gir en form som er sammenpresset\n" "i høyden og egner seg til øy. Angi tre like tall for grunnformen." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "2D-støytall som styrer form og størrelse på høydedrag." @@ -2042,7 +2299,7 @@ msgstr "3D-modus" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" -msgstr "" +msgstr "Parallaksestyrke i 3D-modus" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2106,6 +2363,10 @@ msgstr "" "- pageflip: Quadbuffer-basert 3d.\n" "Vær klar over at interlace-modus krever at skyggelegging er påslått." +#: 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" @@ -2126,6 +2387,10 @@ msgstr "Melding som vises alle klienter når serveren slås av." msgid "ABM interval" msgstr "ABM-intervall" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2178,6 +2443,10 @@ msgstr "" "Justér skjermens DPI-innstilling (ikke for X11/kun Android), f. eks. for 4k-" "skjermer." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2188,6 +2457,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Legg til elementnavn" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Avansert" @@ -2207,7 +2481,8 @@ msgstr "" "belysning - det har lite å si for naturlig nattelys." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Alltid flymodus og rask forflytning" #: src/settings_translation_file.cpp @@ -2260,7 +2535,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" -msgstr "Spør om å koble til igjen etter kræsj" +msgstr "Spør om å koble til igjen etter krasj" #: src/settings_translation_file.cpp msgid "" @@ -2285,6 +2560,10 @@ msgstr "" "for å slå av denne optimaliseringen.\n" "Målenheten er «mapblocks» (en enhet på 16x16 blokker)." +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Tast for automatisk fremoverbevegelse" @@ -2305,6 +2584,16 @@ msgstr "Lagre skjermstørrelse automatisk" msgid "Autoscaling mode" msgstr "Autoskaleringsmodus" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Hoppetast" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "Spesialtast for klatring/nedklatring" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Rettetast" @@ -2317,10 +2606,6 @@ msgstr "Bakkens grunnivå" msgid "Base terrain height." msgstr "Terrengets grunnhøyde." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Grunnleggende" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Enkle rettigheter" @@ -2342,21 +2627,22 @@ msgid "Bind address" msgstr "Bindingsadresse" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +#, fuzzy +msgid "Biome API noise parameters" msgstr "Temperatur- og fuktighetsparametre for biotop-APIet" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Biotoplyd" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Biter per piksel (dvs. fargedybde) i fullskjermsmodus." - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "Avstand for optimalizering av mapblocksending" +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "" + #: src/settings_translation_file.cpp msgid "Bold and italic font path" msgstr "Filsti for fet og kursivert skrifttype" @@ -2382,8 +2668,9 @@ msgid "Builtin" msgstr "Innebygd" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Teksturpåføring (bump mapping)" +#, fuzzy +msgid "Camera" +msgstr "Endre visning" #: src/settings_translation_file.cpp #, fuzzy @@ -2463,20 +2750,14 @@ msgstr "" "der 0.0 er minimumsnivået for lysstyrke mens 1.0 er maksimumsnivået." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Endrer hovedmenyens brukergrensesnitt (UI):\n" -"- Fullstendig: Flere enkeltspillerverdener, valg av spill, " -"teksturpakkevalg, osv.\n" -"- Enkel: Én enkeltspillerverden, ingen valg av spill eller teksturpakke. " -"Kan være\n" -"nødvendig på mindre skjermer." +#, fuzzy +msgid "Chat command time message threshold" +msgstr "Terskel for utvisning fra chat" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Sludrekommandoer" #: src/settings_translation_file.cpp #, fuzzy @@ -2513,8 +2794,9 @@ msgid "Chat toggle key" msgstr "Tast for veksling av sludring" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Sludrekommandoer" +#, fuzzy +msgid "Chat weblinks" +msgstr "Viser chat" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2532,6 +2814,12 @@ msgstr "Tast for filmatisk tilstand" msgid "Clean transparent textures" msgstr "Rene, gjennomsiktige teksturer" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Klient" @@ -2552,6 +2840,11 @@ msgstr "Moddebegrensninger på brukers side" msgid "Client side node lookup range restriction" msgstr "Omfangsbegrensning av blokkoppslag hos klienten" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "Brukermodding" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Klatrehastighet" @@ -2576,6 +2869,11 @@ msgstr "Skyer i meny" msgid "Colored fog" msgstr "Farget tåke" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "Farget tåke" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2614,6 +2912,22 @@ msgstr "" msgid "Command key" msgstr "Tast for chat og kommandoer" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Forbind glass" @@ -2638,10 +2952,18 @@ msgstr "Konsollfarge" msgid "Console height" msgstr "Konsollhøyde" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "ContentDBs svarteliste" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "ContentDB-URL" @@ -2675,8 +2997,10 @@ msgstr "" "uendret." #: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "Bestemmer synkehastigheten i væsker." +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." @@ -2695,7 +3019,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Crash message" -msgstr "Kræsjmelding" +msgstr "Krasjmelding" #: src/settings_translation_file.cpp msgid "Creative" @@ -2706,16 +3030,22 @@ msgid "Crosshair alpha" msgstr "Trådkors-alpha" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Trådkors-alpha (ugjennomsiktighet, mellom 0 og 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Trådkors-alpha (ugjennomsiktighet, mellom 0 og 255).\n" +"Kontrollerer også objektets trådkorsfarge." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Trådkorsfarge" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Trådkorsfarge (R, G, B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" #: src/settings_translation_file.cpp msgid "DPI" @@ -2738,12 +3068,12 @@ msgid "Debug log level" msgstr "Loggingsnivå for feilsøking" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Tast for senking av lydstyrke" +msgid "Debugging" +msgstr "" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "Reduksjon av denne verdien øker bevegelsesmotstanden i væsker." +msgid "Dec. volume key" +msgstr "Tast for senking av lydstyrke" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2782,8 +3112,9 @@ msgstr "Forvalgt spill" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2814,12 +3145,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp #, fuzzy msgid "Defines the base ground level." @@ -2891,6 +3216,16 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Dekorasjoner" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "Høyre tast" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Gravepartikler" @@ -2903,6 +3238,16 @@ msgstr "Skru av antijuksing" msgid "Disallow empty passwords" msgstr "Ikke tillatt tomme passord" +#: src/settings_translation_file.cpp +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 "Domenenavn for tjener, som vist i tjenerlisten." @@ -2948,18 +3293,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Skru på konsollvindu" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Skru på kreativt modusfor nye opprettede kart." +msgid "Enable creative mode for all players" +msgstr "Aktiver kreativt modus for alle spillere" #: src/settings_translation_file.cpp msgid "Enable joysticks" msgstr "Bruk 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 "" @@ -2976,24 +3338,16 @@ msgstr "" msgid "Enable random user input (only used for testing)." msgstr "" -#: src/settings_translation_file.cpp -msgid "Enable register confirmation" -msgstr "Skru på registerbekreftelse" - -#: src/settings_translation_file.cpp -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" -"Skru på registerbekreftelse ved tilkobling til tjener.\n" -"Hvis avskrudd, vil en ny konto registres automatisk." - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -3042,14 +3396,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -3058,18 +3404,6 @@ msgstr "" msgid "Enables minimap." msgstr "Aktiverer minikart." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3078,6 +3412,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -3086,12 +3430,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3103,12 +3441,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" msgstr "" +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "Maks FPS når spillet ikke har fokus eller er pauset" + #: src/settings_translation_file.cpp msgid "FSAA" -msgstr "" +msgstr "FSAA" #: src/settings_translation_file.cpp msgid "Factor noise" @@ -3122,18 +3464,6 @@ msgstr "" msgid "Fallback font path" msgstr "Filsti for reserveskrifttype" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Tilbakefallsskriftsskygge" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Tilbakefallsskriftstørrelse" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Hurtigtast" @@ -3152,7 +3482,7 @@ msgstr "Rask bevegelse" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3188,14 +3518,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filtrering" +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "Kantutjevning:" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3266,6 +3597,11 @@ msgstr "Tåkegrense" msgid "Fog toggle key" msgstr "Tåkevekslingstast" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font" +msgstr "Skriftstørrelse" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "Fet skrifttype som forvalg" @@ -3287,15 +3623,15 @@ msgid "Font size" msgstr "Skriftstørrelse" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3304,6 +3640,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3363,10 +3710,6 @@ msgstr "Fraktaltype" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "FreeType-skrifttyper" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3391,10 +3734,6 @@ msgstr "" msgid "Full screen" msgstr "Fullskjerm" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Fullskjermsmodus." @@ -3412,7 +3751,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Spill" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3423,7 +3771,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3442,6 +3790,16 @@ msgstr "" msgid "Graphics" msgstr "Grafikk" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Graphics Effects" +msgstr "Grafikk" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Graphics and Audio" +msgstr "Grafikk" + #: src/settings_translation_file.cpp msgid "Gravity" msgstr "Tyngdekraft" @@ -3459,9 +3817,14 @@ 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 vist" + #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -3469,8 +3832,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3492,7 +3855,8 @@ msgid "Heat noise" msgstr "Varmestøy" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3503,10 +3867,6 @@ msgstr "Høydelyd" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Bratthet for ås" @@ -3702,10 +4062,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 +#, fuzzy +msgid "" +"How much you are slowed down when moving inside a liquid.\n" +"Decrease this to increase liquid resistance to movement." +msgstr "Reduksjon av denne verdien øker bevegelsesmotstanden i væsker." + #: src/settings_translation_file.cpp msgid "How wide to make rivers." msgstr "" @@ -3738,8 +4106,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3761,11 +4128,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" +#: 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 "" +"Skru på registerbekreftelse ved tilkobling til tjener.\n" +"Hvis avskrudd, vil en ny konto registres automatisk." + #: src/settings_translation_file.cpp msgid "" "If enabled, actions are recorded for rollback.\n" @@ -3789,7 +4165,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 @@ -3806,6 +4184,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3822,10 +4206,6 @@ msgstr "" msgid "Ignore world errors" msgstr "" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "I-spillet" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -3853,7 +4233,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3876,16 +4256,12 @@ msgstr "" msgid "Instrument the methods of entities on registration." msgstr "" -#: 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 "" #: 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 @@ -3919,7 +4295,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Iterations" -msgstr "" +msgstr "Ringer" #: src/settings_translation_file.cpp msgid "" @@ -3937,14 +4313,18 @@ msgstr "Spillstikke-ID" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "Spillstikketype" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Joystick type" -msgstr "Spillstikketype" +msgstr "Kontrollertype" #: src/settings_translation_file.cpp msgid "" @@ -4023,6 +4403,17 @@ msgstr "" "Se http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast for hopping.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4074,14 +4465,14 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player backward.\n" "Will also disable autoforward, when active.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tast for hurtig gange i raskt modus.\n" +"Tast for å bevege spilleren bakover\n" +"Vil også koble ut automatisk foroverbevegelse, hvis aktiv.\n" "Se http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4150,6 +4541,17 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tast for hopping.\n" +"Se http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4646,6 +5048,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4660,7 +5066,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Language" -msgstr "" +msgstr "Språk" #: src/settings_translation_file.cpp msgid "Large cave depth" @@ -4706,7 +5112,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 "" #: src/settings_translation_file.cpp @@ -4719,15 +5125,18 @@ msgstr "" "Krever at dybdeskapere er aktivert." #: 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 @@ -4739,7 +5148,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4766,6 +5176,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Jevn belysning" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4839,22 +5254,21 @@ msgstr "Y-verdi for store grotters øvre grense." msgid "Main menu script" msgstr "Skript for hovedmeny" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Hovedmeny" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4916,6 +5330,10 @@ msgstr "" msgid "Map save interval" msgstr "Lagringsintervall for kart" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -5027,9 +5445,14 @@ msgid "Maximum FPS" msgstr "Maks FPS («frames» - bilder per sekund)" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +#, fuzzy +msgid "Maximum FPS when the window is not focused, or when the game is paused." msgstr "Maks FPS når spillet står i pause." +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" msgstr "" @@ -5075,6 +5498,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -5131,17 +5561,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "Maks antall brukere" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Menyer" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -5190,12 +5624,25 @@ msgstr "" 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 "Sikkerhet" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5206,6 +5653,11 @@ msgstr "Filsti for monospace skrifttype" msgid "Monospace font size" msgstr "Størrelse for monospace skrifttype" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "Størrelse for monospace skrifttype" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5272,16 +5724,17 @@ msgstr "" 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 "Nettverk" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "" @@ -5294,6 +5747,11 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Knutepunktsframheving" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5306,14 +5764,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5335,18 +5785,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5356,11 +5798,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5369,38 +5806,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5423,17 +5834,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5462,16 +5869,21 @@ msgstr "Flygingstast" msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Flygingstast" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + #: 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 "Spillernavn" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5480,6 +5892,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Bilineær filtrering" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5514,10 +5931,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5525,9 +5938,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5618,10 +6031,6 @@ msgstr "" msgid "Right key" msgstr "Høyre tast" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Elveleiedybde" @@ -5691,6 +6100,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Skjerm:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Skjermhøyde" @@ -5705,11 +6119,11 @@ msgstr "Mappe for skjermdumper" #: src/settings_translation_file.cpp msgid "Screenshot format" -msgstr "" +msgstr "Skjermklippformat" #: src/settings_translation_file.cpp msgid "Screenshot quality" -msgstr "" +msgstr "Skjermklippkvalitet" #: src/settings_translation_file.cpp msgid "" @@ -5718,6 +6132,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Skjermdump" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5730,10 +6149,6 @@ msgstr "" msgid "Second of two 3D noises that together define tunnels." msgstr "" -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "Sikkerhet" - #: src/settings_translation_file.cpp msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Se https://www.sqlite.org/pragma.html#pragma_synchronous" @@ -5772,10 +6187,40 @@ msgid "" "17 = 4D \"Mandelbulb\" Mandelbrot set.\n" "18 = 4D \"Mandelbulb\" Julia set." msgstr "" +"Velger en av 18 fraktaltyper.\n" +"1 = 4D «Rund» Mandelbrot-mengde.\n" +"2 = 4D «Rund» Julia-mengde.\n" +"3 = 4D «Firkantet» Mandelbrot-mengde.\n" +"4 = 4D «Firkantet» Julia-mengde.\n" +"5 = 4D «Mandy Cousin» Mandelbrot-mengde.\n" +"6 = 4D «Mandy Cousin» Julia-mengde.\n" +"7 = 4D «Variasjon» Mandelbrot-mengde.\n" +"8 = 4D «Variasjon» Julia-mengde.\n" +"9 = 3D «Mandelbrot/Mandelbar» Mandelbrot-mengde.\n" +"10 = 3D «Mandelbrot/Mandelbar» Julia-mengde.\n" +"11 = 3D «Juletre» Mandelbrot-mengde.\n" +"12 = 3D «Juletre» Julia-mengde.\n" +"13 = 3D «Mandelbulb» Mandelbrot-mengde.\n" +"14 = 3D «Mandelbulb» Julia-mengde.\n" +"15 = 3D «Cosine Mandelbulb» Mandelbrot-mengde.\n" +"16 = 3D «Cosine Mandelbulb» Julia-mengde.\n" +"17 = 4D «Mandelbulb» Mandelbrot-mengde.\n" +"18 = 4D «Mandelbulb» Julia-mengde." #: 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" @@ -5802,10 +6247,20 @@ msgstr "Serverport" msgid "Server side occlusion culling" msgstr "Ikke-synlige blokker blir ikke sendt videre av serveren" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Tjenerport" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "Serverliste-URL" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "Serverliste-URL" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Serverlistefil" @@ -5820,8 +6275,39 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "Angi maksimalt antall tegn i chatmelding sendt av klienter." +msgid "" +"Set the maximum length of a chat message (in characters) sent by clients." +msgstr "Angi maksimalt antall tegn i tekstmelding sendt av klienter." + +#: src/settings_translation_file.cpp +msgid "" +"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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Angi som sann for å slå på bladrasling.\n" +"Krever at skyggelegging er påslått." #: src/settings_translation_file.cpp msgid "" @@ -5847,6 +6333,13 @@ msgstr "" "Angi som sann for å slå på plantesvaiing.\n" "Krever at skyggelegging er aktivert." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5859,6 +6352,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5866,9 +6375,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5883,6 +6390,20 @@ msgstr "Vis feilsøkingsinfo" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Angi språk. La stå tom for å bruke operativsystemets språk.\n" +"Krever omstart etter endring." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "Fet skrifttype som forvalg" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Beskjed ved avslutning" @@ -5904,6 +6425,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5959,18 +6484,15 @@ msgstr "Hoppehastighet" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Skriftskygge" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Lyd" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Spesialtast" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Spesialtast for klatring/nedklatring" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5990,6 +6512,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6021,10 +6551,6 @@ msgstr "Spredningsstøy for bratt fjell" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6062,6 +6588,11 @@ msgstr "Synkron SQLite" msgid "Temperature variation for biomes." msgstr "Temperaturvariasjon for biomer." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Innstillinger" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -6105,6 +6636,13 @@ msgstr "" msgid "Texture path" msgstr "Filsti for teksturer" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6119,6 +6657,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6179,18 +6721,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6208,6 +6750,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6216,9 +6764,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6255,7 +6802,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 @@ -6279,6 +6826,19 @@ msgstr "" msgid "Touch screen threshold" msgstr "Strandlydsterskel" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Touchscreen" +msgstr "Strandlydsterskel" + +#: 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 "" @@ -6353,22 +6913,37 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" #: src/settings_translation_file.cpp msgid "VSync" -msgstr "" +msgstr "VSync" #: src/settings_translation_file.cpp msgid "Valley depth" @@ -6455,7 +7030,7 @@ msgid "Viewing range" msgstr "Synsrekkevidde" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6531,6 +7106,11 @@ msgstr "Bølgende vann" msgid "Waving plants" msgstr "Plantesvaiing" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Farge på utvalgsfelt" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6552,18 +7132,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6598,14 +7176,24 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" +"Bredde-delen av vindusstørrelsen ved oppstart. Ignoreres i fullskjerm-modus." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -6642,14 +7230,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" -msgstr "" +msgstr "Verdensjusterte teksturer-modus" #: src/settings_translation_file.cpp msgid "Y of flat ground." msgstr "Y-koordinat for flatt land." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Y of mountain density gradient zero level. Used to shift mountains " "vertically." @@ -6693,44 +7280,234 @@ msgstr "Y-nivå for nedre terreng og sjøbunn." msgid "Y-level of seabed." msgstr "Y-nivå for havbunn." +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "Tidsutløp for filnedlasting med cURL" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "cURL-tidsgrense" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Maksimal parallellisering i cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL-tidsgrense" +#~ msgid "- Creative Mode: " +#~ msgstr "- Kreativ modus: " + +#~ msgid "- Damage: " +#~ msgstr "- Skade: " + +#~ msgid "Address / Port" +#~ msgstr "Adresse / port" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "" +#~ "Er du sikker på at du ønsker å tilbakestille din enkeltspiller-verden?" + +#~ msgid "Back" +#~ msgstr "Tilbake" + +#~ msgid "Basic" +#~ msgstr "Grunnleggende" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Biter per piksel (dvs. fargedybde) i fullskjermsmodus." + +#~ msgid "Bump Mapping" +#~ msgstr "Teksturtilføyning" + +#~ msgid "Bumpmapping" +#~ msgstr "Teksturpåføring (bump mapping)" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Endrer hovedmenyens brukergrensesnitt (UI):\n" +#~ "- Fullstendig: Flere enkeltspillerverdener, valg av spill, " +#~ "teksturpakkevalg, osv.\n" +#~ "- Enkel: Én enkeltspillerverden, ingen valg av spill eller " +#~ "teksturpakke. Kan være\n" +#~ "nødvendig på mindre skjermer." + +#~ msgid "Config mods" +#~ msgstr "Sett opp modder" + +#~ msgid "Configure" +#~ msgstr "Sett opp" + +#~ msgid "Connect" +#~ msgstr "Koble til" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Bestemmer synkehastigheten i væsker." + +#~ msgid "Credits" +#~ msgstr "Bidragsytere" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Trådkorsfarge (R, G, B)." + +#~ msgid "Damage enabled" +#~ msgstr "Skade aktivert" + +#~ msgid "Del. Favorite" +#~ msgstr "Slett favoritt" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Last ned et spill, for eksempel Minetest Game, fra minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Last ned fra minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Laster ned og installerer $1, vent…" + +#~ msgid "Enable VBO" +#~ msgstr "Aktiver VBO" + +#~ msgid "Enable register confirmation" +#~ msgstr "Skru på registerbekreftelse" + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Aktiver filmatisk toneoversettelse" + +#~ msgid "Enter " +#~ msgstr "Enter " + +#~ msgid "Fallback font shadow" +#~ msgstr "Tilbakefallsskriftsskygge" + +#~ msgid "Fallback font size" +#~ msgstr "Tilbakefallsskriftstørrelse" + +#~ msgid "Filtering" +#~ msgstr "Filtrering" + +#~ msgid "FreeType fonts" +#~ msgstr "FreeType-skrifttyper" + +#~ msgid "Game" +#~ msgstr "Spill" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Generer normale kart" + +#~ msgid "IPv6 support." +#~ msgstr "IPv6-støtte." + +#~ msgid "In-Game" +#~ msgstr "I-spillet" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Installasjon: fil \"$1\"" + +#~ msgid "Instrumentation" +#~ msgstr "Instrumentering" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Tastaturtilknytninger. (Hvis dette byr på problemer, fjern ting fra " +#~ "minetest.conf)" + +#~ msgid "Main" +#~ msgstr "Hovedmeny" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Hovedmeny" + +#~ msgid "Menus" +#~ msgstr "Menyer" + +#~ msgid "Name / Password" +#~ msgstr "Navn / passord" + +#~ msgid "Name/Password" +#~ msgstr "Navn/passord" + +#~ msgid "No" +#~ msgstr "Nei" + +#~ msgid "Ok" +#~ msgstr "Okei" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallakse Okklusjon" + +#~ msgid "Path to save screenshots at." +#~ msgstr "Filsti til lagring av skjermdumper." + +#~ msgid "Player name" +#~ msgstr "Spillernavn" + +#~ msgid "Profiling" +#~ msgstr "Profilering" + +#~ msgid "PvP enabled" +#~ msgstr "Alle mot alle er på" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Tilbakestill enkeltspillerverden" #~ msgid "Select Package File:" #~ msgstr "Velg pakkefil:" +#~ msgid "Server / Singleplayer" +#~ msgstr "Server/alene" + +#~ msgid "Special" +#~ msgstr "Spesial" + +#~ msgid "Special key" +#~ msgstr "Spesialtast" + +#~ msgid "Start Singleplayer" +#~ msgstr "Start enkeltspiller" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "OpenGL-driveren må brukes for å aktivere skyggelegging." + +#~ msgid "View" +#~ msgstr "Vis" + #~ msgid "Y of upper limit of lava in large caves." #~ msgstr "Y-verdi for øvre grense for lava i store grotter." #~ msgid "Y-level to which floatland shadows extend." #~ msgstr "Hvilket Y-nivå som skyggen til luftøyer når." -#~ msgid "IPv6 support." -#~ msgstr "IPv6-støtte." +#~ msgid "Yes" +#~ msgstr "Ja" -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Aktiver filmatisk toneoversettelse" +#, 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 "" +#~ "Dette er første gang du kobler deg til serveren «\"%s».\n" +#~ "Om du fortsetter, vil det opprettes en ny konto med ditt navn og passord " +#~ "på denne serveren.\n" +#~ "Vennligst skriv inn et passord og klikk på «Registrer meg og bli med» for " +#~ "å bekrefte opprettelse av konto, eller klikk « Avbryt» for å avbryte." -#~ msgid "Enable VBO" -#~ msgstr "Aktiver VBO" +#~ msgid "You died." +#~ msgstr "Du døde." -#~ msgid "Path to save screenshots at." -#~ msgstr "Filsti til lagring av skjermdumper." - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Laster ned og installerer $1, vent…" - -#~ msgid "Back" -#~ msgstr "Tilbake" - -#~ msgid "Ok" -#~ msgstr "Okei" +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/nl/minetest.po b/po/nl/minetest.po index c4d3da53a..958f1d14e 100644 --- a/po/nl/minetest.po +++ b/po/nl/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Dutch (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\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: 2021-12-29 20:51+0000\n" +"Last-Translator: Gert-dev <qnyasgjhapqyuhoibr@kiabws.com>\n" "Language-Team: Dutch <https://hosted.weblate.org/projects/minetest/minetest/" "nl/>\n" "Language: nl\n" @@ -12,7 +12,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.10.1\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Wachtrij voor uitgezonden berichten legen" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Instructie voor legen." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Terug naar hoofd menu" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Ongeldige instructie " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Opgegeven instructie: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Online spelers weergeven" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Online spelers: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "De wachtrij voor uitgezonden berichten is nu leeg." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Deze instructie is uitgeschakeld door de server." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +58,41 @@ msgstr "Herboren worden" msgid "You died" msgstr "Je bent gestorven" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Beschikbare instructies:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Beschikbare instructies: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Instructie niet beschikbaar: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Krijg hulp voor instructies" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Gebruik '.help <cmd>' om meer informatie te verkrijgen, of '.help all' om " +"alles weer te geven." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <commando>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "Oke" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<geen beschikbaar>" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Er is een fout opgetreden in een Lua script:" @@ -46,9 +113,30 @@ msgstr "Opnieuw verbinding maken" msgid "The server has requested a reconnect:" msgstr "De server heeft gevraagd opnieuw verbinding te maken:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Laden..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Selecteer 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. " @@ -63,10 +151,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "De server ondersteunt protocol versies tussen $1 en $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Probeer de publieke serverlijst opnieuw in te schakelen en controleer de " -"internet verbinding." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +162,26 @@ msgstr "Wij ondersteunen enkel protocol versie $1." msgid "We support protocol versions between version $1 and $2." msgstr "Wij ondersteunen protocol versies $1 tot en met $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Annuleer" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Afhankelijkheden:" @@ -159,14 +254,55 @@ msgstr "Wereld:" msgid "enabled" msgstr "aangeschakeld" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" bestaat al. Wilt u het overschrijven ?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Afhankelijkheden $1 en $2 zullen geïnstalleerd worden." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 door $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 is aan het downloaden,\n" +"$2 is ingepland" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 is aan het downloaden..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 benodigde afhankelijkheden werden niet gevonden." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" +"$1 zal worden geïnstalleerd, en $2 afhankelijkheden worden overgeslagen." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Alle pakketten" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Reeds geïnstalleerd" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Terug naar hoofdmenu" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Basis Spel:" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -181,7 +317,6 @@ msgid "Failed to download $1" msgstr "Installeren van mod $1 is mislukt" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Spellen" @@ -190,7 +325,18 @@ msgid "Install" msgstr "Installeren" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Installeer $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Installeer ontbrekende afhankelijkheden" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Installeren: Niet ondersteund bestandstype of defect archief" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" @@ -203,9 +349,24 @@ msgid "No results" msgstr "Geen resultaten" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Zoeken" +msgid "No updates" +msgstr "Geen updates" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Niet gevonden" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Overschrijven" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Controleer of het basis spel correct is, aub." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Ingepland" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -220,8 +381,12 @@ msgid "Update" msgstr "Update" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Allemaal bijwerken [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Bekijk meer informatie in een webbrowser" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -229,102 +394,96 @@ msgstr "Een wereld met de naam \"$1\" bestaat al" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Extra terrein" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -#, fuzzy msgid "Altitude chill" -msgstr "Temperatuurverschil vanwege hoogte" +msgstr "Temperatuurdaling vanwege hoogte" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Temperatuurverschil vanwege hoogte" +msgstr "Vochtigheidsverschil vanwege hoogte" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Biome-ruis" +msgstr "Vegetatie mix" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Biome-ruis" +msgstr "Vegetaties" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Grot ruis" +msgstr "Grotten" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Octaven" +msgstr "Grotten" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Maak aan" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Per soort" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Download een subspel, zoals Minetest Game, van minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Laad er een van minetest.net" +msgstr "Decoraties" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Development Test is meant for developers." +msgstr "" +"Waarschuwing: Het minimale ontwikkellaars-test-spel is bedoeld voor " +"ontwikkelaars." + +#: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "Kerker ruis" +msgstr "Kerkers" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Vlak terrein" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floating landmasses in the sky" -msgstr "Drijvend gebergte dichtheid" +msgstr "Zwevende gebergtes" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floatlands (experimental)" -msgstr "Waterniveau" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Spel" +msgstr "Zwevende eilanden (experimenteel)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Een niet-fractaal terrein genereren: Oceanen en ondergrond" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Heuvels" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Humid rivers" -msgstr "Video driver" +msgstr "Irrigerende rivier" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" +msgstr "Verhoogt de luchtvochtigheid rond rivieren" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Installeer $1" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "Meren" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" msgstr "" +"Lage luchtvochtigheid en hoge hitte zorgen voor ondiepe of droge rivieren" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -335,22 +494,20 @@ msgid "Mapgen flags" msgstr "Wereldgenerator vlaggen" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Vlaggen" +msgstr "Mapgeneratie-specifieke vlaggen" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mountains" -msgstr "Bergen ruis" +msgstr "Bergen" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Modderstroom" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Netwerk van tunnels en grotten" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -358,20 +515,19 @@ msgstr "Geen spel geselecteerd" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Verminderen van hitte met hoogte" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Vermindert de luchtvochtigheid met hoogte" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Grootte van rivieren" +msgstr "Rivieren" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Rivieren op zeeniveau" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -380,54 +536,47 @@ msgstr "Kiemgetal" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Zachte overgang tussen vegetatiezones" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Structuren verschijnen op het terrein (geen effect op bomen en jungle gras " +"gemaakt door v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Structuren verschijnen op het terrein, voornamelijk bomen en planten" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Gematigd, Woestijn" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Gematigd, Woestijn, Oerwoud" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Gematigd, Woestijn, Oerwoud, Toendra, Taiga" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Terrain surface erosion" -msgstr "Terrein hoogte" +msgstr "Terreinoppervlakte erosie" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Bomen en oerwoudgras" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Vary river depth" -msgstr "Diepte van rivieren" +msgstr "Wisselende rivierdiepte" #: 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 "" -"Waarschuwing: Het minimale ontwikkellaars-test-spel is bedoeld voor " -"ontwikkelaars." +msgstr "Zeer grote en diepe grotten" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -459,6 +608,39 @@ msgstr "pkgmgr: ongeldig pad voor mod \"$1\"" msgid "Delete World \"$1\"?" msgstr "Verwijder wereld \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Herhaal wachtwoord" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Missing name" +msgstr "Wereldgenerator" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Name" +msgstr "Naam" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Wachtwoord" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "De wachtwoorden zijn niet gelijk!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Registreer en doe mee" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Accepteren" @@ -492,6 +674,16 @@ msgid "Browse" msgstr "Bladeren" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Inhoud" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Inhoud" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Uitgeschakeld" @@ -516,7 +708,7 @@ msgid "Offset" msgstr "afstand" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Persistentie" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -535,6 +727,10 @@ msgstr "Herstel de Standaardwaarde" msgid "Scale" msgstr "Schaal" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Zoeken" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Selecteer map" @@ -543,7 +739,7 @@ msgstr "Selecteer map" msgid "Select file" msgstr "Selecteer bestand" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Technische namen weergeven" @@ -623,14 +819,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" "Mod installeren: kan geen geschikte map naam vinden voor mod verzameling $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Installeren: niet ondersteund bestandstype \"$1\" of defect archief" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Installeer: bestand: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Niet mogelijk om geschikte map-naam vinden voor modverzameling $1" @@ -651,6 +839,61 @@ msgstr "Installeren van mod $1 in $2 is mislukt" msgid "Unable to install a modpack as a $1" msgstr "Installeren van mod verzameling $1 in $2 is mislukt" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Laden..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Publieke serverlijst is uitgeschakeld" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Probeer de publieke serverlijst opnieuw in te schakelen en controleer de " +"internet verbinding." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Over" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Andere actieve ontwikkelaars" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Actieve renderer:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Hoofdontwikkelaars" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Open de gebruikersdatamap" + +#: 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 "" +"Open de map die de door de gebruiker aangeleverde werelden, spellen, mods\n" +"en textuur pakketten bevat in een bestandsbeheer toepassing / verkenner." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Vroegere ontwikkelaars" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Vroegere hoofdontwikkelaars" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Share debug log" +msgstr "Toon debug informatie" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Content op internet bekijken" @@ -691,26 +934,6 @@ msgstr "Pakket verwijderen" msgid "Use Texture Pack" msgstr "Gebruik textuurverzamelingen" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Andere actieve ontwikkelaars" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Hoofdontwikkelaars" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Credits" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Vroegere ontwikkelaars" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Vroegere hoofdontwikkelaars" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Server aanmelden bij de server-lijst" @@ -720,14 +943,10 @@ msgid "Bind Address" msgstr "Lokaal server-adres" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Instellingen" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Creatieve modus" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Verwondingen inschakelen" @@ -741,11 +960,7 @@ msgstr "Server Hosten" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Naam / Wachtwoord" +msgstr "Installeer spellen van ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -757,12 +972,16 @@ msgstr "Geen wereldnaam opgegeven of geen wereld aangemaakt!" #: builtin/mainmenu/tab_local.lua msgid "Play Game" -msgstr "Spel Spelen" +msgstr "Spel Starten" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Poort" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Selecteer Mods" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Selecteer Wereld:" @@ -776,45 +995,62 @@ msgid "Start Game" msgstr "Start spel" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Server adres / Poort" +msgid "Address" +msgstr "Adres" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Verbinden" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Wissen" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Creatieve modus" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Verwondingen ingeschakeld" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Schade / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Verwijder Favoriete" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "Favorieten" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Incompatibele Servers" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Join spel" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Naam / Wachtwoord" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Spelergevechten ingeschakeld" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Publieke Servers" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Verversen" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Poort van externe server" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Omschrijving van de Server" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -840,21 +1076,13 @@ msgstr "Alle Instellingen" msgid "Antialiasing:" msgstr "Antialiasing:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Weet je zeker dat je je wereld wilt resetten?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Schermafmetingen automatisch bewaren" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "Bilineaire Filtering" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bumpmapping" +msgstr "Bilineair filteren" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" @@ -864,13 +1092,30 @@ msgstr "Toetsen aanpassen" msgid "Connected Glass" msgstr "Verbonden Glas" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dynamische schaduwen" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Dynamische schaduwen: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Mooie bladeren" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Genereer normale werelden" +msgid "High" +msgstr "Hoog" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Laag" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Gemiddeld" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -880,10 +1125,6 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Anisotropisch filteren" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nee" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Geen Filter" @@ -912,18 +1153,10 @@ msgstr "Ondoorzichtige bladeren" msgid "Opaque Water" msgstr "Ondoorzichtig water" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax occlusie" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Effectdeeltjes" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Reset Singleplayer wereld" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Scherm:" @@ -936,6 +1169,10 @@ msgstr "Instellingen" msgid "Shaders" msgstr "Shaders" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shaders (experimenteel)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Shaders (niet beschikbaar)" @@ -952,21 +1189,27 @@ msgstr "Vloeiende verlichting" msgid "Texturing:" msgstr "Textuur:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Om schaduwen mogelijk te maken moet OpenGL worden gebruikt." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Tone-mapping" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "Toetsgrenswaarde: (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" -msgstr "Tri-Lineare Filtering" +msgstr "Trilineair filteren" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Zeer Hoog" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Zeer Laag" #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" @@ -980,23 +1223,12 @@ msgstr "Golvende Vloeistoffen" msgid "Waving Plants" msgstr "Bewegende planten" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ja" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Mods configureren" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Hoofdmenu" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Start Singleplayer" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Fout bij verbinden (time out?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Time-out bij opzetten verbinding." @@ -1025,8 +1257,8 @@ msgid "Connection error (timed out?)" msgstr "Fout bij verbinden (time out?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Kan het spel niet laden of niet vinden \"" +msgid "Could not find or load game: " +msgstr "Kan het spel niet vinden of laden: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1056,18 +1288,6 @@ msgstr "Opgegeven wachtwoordbestand kan niet worden geopend: " msgid "Provided world path doesn't exist: " msgstr "Het gespecificeerde wereld-pad bestaat niet: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1080,14 +1300,6 @@ msgstr "" msgid "- Address: " msgstr "- Adres: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Creatieve Modus: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Verwondingen: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Mode(creatief/overleving): " @@ -1109,6 +1321,15 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "- Server Naam: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Er is een serialisatie-fout opgetreden:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Toegang geweigerd. Reden: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Automatisch vooruit uitgeschakeld" @@ -1117,6 +1338,22 @@ msgstr "Automatisch vooruit uitgeschakeld" msgid "Automatic forward enabled" msgstr "Automatisch vooruit ingeschakeld" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Blokgrenzen verborgen" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Blokgrenzen getoond voor alle blokken" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Blokgrenzen getoond voor huidige blok" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Blokgrenzen getoond voor nabije blokken" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Camera-update uitgeschakeld" @@ -1125,6 +1362,11 @@ msgstr "Camera-update uitgeschakeld" msgid "Camera update enabled" msgstr "Camera-update ingeschakeld" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Kan blokgrenzen niet tonen (privilege 'basic_debug' is nodig)" + #: src/client/game.cpp msgid "Change Password" msgstr "Verander wachtwoord" @@ -1137,6 +1379,10 @@ msgstr "Filmische modus uitgeschakeld" msgid "Cinematic mode enabled" msgstr "Filmische modus ingeschakeld" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Gebruiker heeft verbinding verbroken" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Client-side scripting is uitgeschakeld" @@ -1145,6 +1391,10 @@ msgstr "Client-side scripting is uitgeschakeld" msgid "Connecting to server..." msgstr "Verbinding met de server wordt gemaakt..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Verbinding mislukt om onbekende reden" + #: src/client/game.cpp msgid "Continue" msgstr "Verder spelen" @@ -1157,13 +1407,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1173,15 +1423,20 @@ msgstr "" "-%s: ga naar links \n" "-%s: ga naar rechts \n" "-%s: springen / klimmen \n" +"-%s: graaf/duw\n" +"-%s: plaats/gebruik \n" "-%s: sluip / ga naar beneden \n" "-%s: drop item \n" "-%s: inventaris \n" "- Muis: draaien / kijken \n" -"- Muis links: graven / stoten \n" -"- Muis rechts: plaats / gebruik \n" "- Muiswiel: item selecteren \n" "-%s: chat\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Adres kon niet opgezocht worden: %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "Gebruiker aanmaken..." @@ -1238,6 +1493,11 @@ msgstr "Oneindige kijkafstand uitgezet" msgid "Enabled unlimited viewing range" msgstr "Oneindige kijkafstand aangezet" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Gebruiker aanmaken..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Terug naar menu" @@ -1311,32 +1571,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Mini-kaart momenteel uitgeschakeld door spel of mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Mini-kaart verborgen" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Mini-kaart in radar modus, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Mini-kaart in radar modus, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Mini-kaart in radar modus, Zoom x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minimap in oppervlaktemodus, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minimap in oppervlaktemodus, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minimap in oppervlaktemodus, Zoom x4" +msgid "Multiplayer" +msgstr "Multiplayer" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1400,16 +1636,31 @@ msgstr "Geluid gedempt" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Systeemgeluiden zijn uitgeschakeld" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Geluidssysteem is niet ondersteund in deze versie" #: src/client/game.cpp msgid "Sound unmuted" msgstr "Geluid niet gedempt" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "De server gebruikt waarschijnlijk een andere versie van %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Kon niet verbinden met %s omdat IPv6 uitgeschakeld werd" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Kon niet luisteren naar %s omdat IPv6 uitgeschakeld werd" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1431,7 +1682,6 @@ msgid "Volume changed to %d%%" msgstr "Volume gewijzigd naar %d%%" #: src/client/game.cpp -#, fuzzy msgid "Wireframe shown" msgstr "Draadframe weergegeven" @@ -1473,7 +1723,6 @@ msgid "Apps" msgstr "Menu" #: src/client/keycode.cpp -#, fuzzy msgid "Backspace" msgstr "Terug" @@ -1481,10 +1730,6 @@ msgstr "Terug" msgid "Caps Lock" msgstr "Hoofdletter vergrendeling" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Wissen" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1576,11 +1821,11 @@ msgstr "Num Lock" #: src/client/keycode.cpp msgid "Numpad *" -msgstr "Numpad *" +msgstr "Numeriek pad *" #: src/client/keycode.cpp msgid "Numpad +" -msgstr "Numpad +" +msgstr "Numeriek pad +" #: src/client/keycode.cpp msgid "Numpad -" @@ -1588,7 +1833,7 @@ msgstr "Numpad -" #: src/client/keycode.cpp msgid "Numpad ." -msgstr "Numpad ." +msgstr "Numeriek pad ." #: src/client/keycode.cpp msgid "Numpad /" @@ -1732,38 +1977,39 @@ msgstr "X knop 2" msgid "Zoom" msgstr "Zoomen" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "De wachtwoorden zijn niet gelijk!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Mini-kaart verborgen" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registreer en doe mee" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" -"U staat op het punt om voor het eerst lid te worden van deze server met de " -"naam \"%s\". \n" -"Als u doorgaat, wordt op deze server een nieuw account gemaakt met uw " -"inloggegevens. \n" -"Voer uw wachtwoord opnieuw in en klik op 'Registreren en aanmelden' om het " -"aanmaken van een account te bevestigen, of klik op 'Annuleren' om af te " -"breken." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Mini-kaart in radar modus, Zoom x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimap in oppervlaktemodus, Zoom x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimap textuur modus" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Openen van webpagina mislukt" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Website openen" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Doorgaan" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Speciaal\" = naar beneden klimmen" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = naar beneden klimmen" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1773,15 +2019,23 @@ msgstr "Automatisch Vooruit" msgid "Automatic jumping" msgstr "Automatisch springen" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Achteruit" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Blok grenzen" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Camera veranderen" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Chatten" @@ -1834,10 +2088,8 @@ msgid "Key already in use" msgstr "Toets is al in gebruik" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" -"Sneltoetsen. (Als dit menu stuk gaat, verwijder dan instellingen uit " -"minetest.conf)" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1867,10 +2119,6 @@ msgstr "Screenshot" msgid "Sneak" msgstr "Sluipen" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Speciaal" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Schakel HUD in/uit" @@ -1911,10 +2159,6 @@ msgstr "druk op toets" msgid "Change" msgstr "Veranderen" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Herhaal wachtwoord" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Nieuw wachtwoord" @@ -1923,6 +2167,10 @@ msgstr "Nieuw wachtwoord" msgid "Old Password" msgstr "Huidig wachtwoord" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "De wachtwoorden zijn niet gelijk!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Terug" @@ -1932,14 +2180,9 @@ msgid "Muted" msgstr "Gedempt" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Geluidsvolume: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Enter " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Geluidsvolume: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1948,6 +2191,16 @@ msgstr "Enter " msgid "LANG_CODE" msgstr "nl" +#: 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 "Kies alsjeblieft een naam!" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1959,12 +2212,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Gebruik virtuele joystick om de \"aux\" -knop te activeren. \n" -"Indien ingeschakeld, zal de virtuele joystick ook op de \"aux\" -knop tikken " +"(Android) Gebruik virtuele joystick om de \"aux\"-knop te activeren.\n" +"Indien ingeschakeld, zal de virtuele joystick ook op de \"aux\"-knop tikken " "wanneer deze buiten de hoofdcirkel is." #: src/settings_translation_file.cpp @@ -2006,14 +2259,6 @@ msgstr "" "Standaard is voor een verticaal geplette vorm geschikt voor \n" "een eiland, stel alle 3 getallen gelijk voor de ruwe vorm." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax occlusie met helling-informatie (sneller).\n" -"1 = 'reliëf mapping' (lanzamer, nauwkeuriger)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "2D-ruis die de vorm/grootte van geribbelde bergen bepaalt." @@ -2052,21 +2297,21 @@ msgid "3D mode" msgstr "3D modus" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Sterkte van normal-maps" +msgstr "Sterkte van parallax in 3D modus" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "3D geluid voor grote holtes." +msgstr "3D ruis voor grote holtes." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" -"3D geluid voor gebergte of hoge toppen.\n" -"Ook voor luchtdrijvende bergen." +"3D ruis voor het definiëren van de structuur en de hoogte van gebergtes of " +"hoge toppen.\n" +"Ook voor de structuur van bergachtig terrein om zwevende eilanden." #: src/settings_translation_file.cpp msgid "" @@ -2075,10 +2320,16 @@ 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 ruis om de vorm van de zwevende eilanden te bepalen.\n" +"Als de standaardwaarde wordt gewijzigd, dan moet de waarde van de " +"geluidsschaal,\n" +"standaard ingesteld op 0.7 gewijzigd worden, aangezien de afschuinings-" +"functies van de zwevende eilanden\n" +"het beste werkt met een waarde tussen -2.0 en 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." -msgstr "3D geluid voor wanden van diepe rivier kloof." +msgstr "3D ruis voor wanden van diepe rivier kloof." #: src/settings_translation_file.cpp msgid "3D noise defining terrain." @@ -2117,6 +2368,10 @@ msgstr "" "- pageflip: 3D met vier buffers ('quad buffer').\n" "Merk op dat de geïnterlinieerde modus vereist dat shaders zijn ingeschakeld." +#: 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" @@ -2138,12 +2393,14 @@ msgstr "" "afgesloten wordt." #: src/settings_translation_file.cpp -#, fuzzy msgid "ABM interval" -msgstr "Interval voor opslaan wereld" +msgstr "Interval voor ABM's" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "ABM tijd budget" #: src/settings_translation_file.cpp -#, fuzzy msgid "Absolute limit of queued blocks to emerge" msgstr "Maximaal aantal 'emerge' blokken in de wachtrij" @@ -2193,6 +2450,12 @@ msgstr "" "Pas de dpi-configuratie aan op uw scherm (alleen niet X11 / Android), b.v. " "voor 4k-schermen." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Pas de gedetecteerde weergavedichtheid aan, gebruikt om elementen uit de " +"gebruikersinterface te schalen." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2202,6 +2465,18 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Past de densiteit van de zwevende eilanden aan.\n" +"De densiteit verhoogt als de waarde verhoogt. Kan positief of negatief " +"zijn.\n" +"Waarde = 0,0 : 50% van het volume is een zwevend eiland.\n" +"Waarde = 2.0 : een laag van massieve zwevende eilanden\n" +"(kan ook hoger zijn, afhankelijk van 'mgv7_np_floatland', altijd testen om " +"zeker te zijn)." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Voeg itemnaam toe" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2222,7 +2497,8 @@ msgstr "" "licht, heeft het weinig effect op natuurlijk nachtlicht." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Zet 'snel' altijd aan bij 'vliegen'" #: src/settings_translation_file.cpp @@ -2239,7 +2515,7 @@ msgstr "Versterkt de valleien." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" -msgstr "Anisotropische filtering" +msgstr "Anisotropisch filteren" #: src/settings_translation_file.cpp msgid "Announce server" @@ -2304,6 +2580,10 @@ msgstr "" "optimalisatie. \n" "Vermeld in mapblocks (16 blokken)." +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Automatisch Vooruit toets" @@ -2324,6 +2604,14 @@ msgstr "Scherm afmetingen automatisch bewaren" msgid "Autoscaling mode" msgstr "Automatische schaalmodus" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1-toets" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Aux1-toets voor klimmen/afdalen" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Achteruit" @@ -2336,10 +2624,6 @@ msgstr "Basis grondniveau" msgid "Base terrain height." msgstr "Basis terrein hoogte." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Basis" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Basis rechten" @@ -2354,14 +2638,15 @@ msgstr "Strand geluid grenswaarde" #: src/settings_translation_file.cpp msgid "Bilinear filtering" -msgstr "Bi-Lineaire filtering" +msgstr "Bilineair filteren" #: src/settings_translation_file.cpp msgid "Bind address" msgstr "Lokaal server-adres" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +#, fuzzy +msgid "Biome API noise parameters" msgstr "Biome API parameters voor temperatuur- en vochtigheidsruis" #: src/settings_translation_file.cpp @@ -2369,13 +2654,12 @@ msgid "Biome noise" msgstr "Biome-ruis" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Aantal bits per pixel (oftewel: kleurdiepte) in full-screen modus." +msgid "Block send optimize distance" +msgstr "Blok verzend optimalisatie afstand" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Block send optimize distance" -msgstr "Blok verzend optimaliseren afstand" +msgid "Bobbing" +msgstr "" #: src/settings_translation_file.cpp msgid "Bold and italic font path" @@ -2402,8 +2686,9 @@ msgid "Builtin" msgstr "Ingebouwd" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bumpmapping" +#, fuzzy +msgid "Camera" +msgstr "Camera veranderen" #: src/settings_translation_file.cpp msgid "" @@ -2483,34 +2768,24 @@ msgstr "" "Waar 0,0 het minimale lichtniveau is, is 1,0 het maximale lichtniveau." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Verandert de gebruikersinterface van het hoofdmenu: \n" -"- Volledig: meerdere werelden voor één speler, spelkeuze, de kiezer van " -"textuurpak, etc. \n" -"- Eenvoudig: één wereld voor één speler, geen game- of texture pack-kiezers. " -"Kan zijn \n" -"noodzakelijk voor kleinere schermen." +msgid "Chat command time message threshold" +msgstr "Tijdsdrempel voor berichten chatcommando's" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Chatcommando's" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "Lettergrootte" +msgstr "Chat lettergrootte" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Chat-toets" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Debug logniveau" +msgstr "Chat debug logniveau" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2533,8 +2808,8 @@ msgid "Chat toggle key" msgstr "Toets voor tonen/verbergen chat" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Chat-commando's" +msgid "Chat weblinks" +msgstr "Weblinks chat" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2552,6 +2827,14 @@ msgstr "Cinematic modus aan/uit toets" msgid "Clean transparent textures" msgstr "Schone transparante texturen" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Aanklikbare weblinks (middelklik of ctrl+linkermuisklik) ingeschakedl in " +"console-uitvoer chat." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Cliënt" @@ -2561,9 +2844,8 @@ msgid "Client and Server" msgstr "Cliënt en server" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client modding" -msgstr "Cliënt modding" +msgstr "Cliënt personalisatie (modding)" #: src/settings_translation_file.cpp msgid "Client side modding restrictions" @@ -2573,6 +2855,11 @@ msgstr "Aanpassingen aan clientzijde" msgid "Client side node lookup range restriction" msgstr "Clientzijde blok opzoekbereikbeperking" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "Cliënt personalisatie (modding)" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Klimsnelheid" @@ -2597,6 +2884,10 @@ msgstr "Wolken in het menu" msgid "Colored fog" msgstr "Gekleurde mist" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Gekleurde schaduwen" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2631,15 +2922,38 @@ 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 "" -"Lijst van vertrouwde mods die onveilige functies mogen gebruiken,\n" -"zelfs wanneer mod-beveiliging aan staat (via " -"request_insecure_environment()).\n" -"Gescheiden door komma's." +"Komma gescheiden lijst van vertrouwde mods die onveilige functies mogen " +"gebruiken,\n" +"zelfs wanneer mod-beveiliging aan staat (via request_insecure_environment())." #: src/settings_translation_file.cpp msgid "Command key" msgstr "Commando-toets" +#: src/settings_translation_file.cpp +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 "" +"Compressieniveau bij bewaren mapblokken op harde schijf.\n" +"-1 - standaardcompressieniveau\n" +"0 - minste compressie, snelst\n" +"9 - meeste compressie, traagst" + +#: src/settings_translation_file.cpp +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 "" +"Compressieniveau bij versturen mapblokken naar cliënt.\n" +"-1 - standaardcompressieniveau\n" +"0 - minste compressie, snelst\n" +"9 - meeste compressie, traagst" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Verbind glas" @@ -2667,8 +2981,16 @@ msgstr "Hoogte console" #: src/settings_translation_file.cpp #, fuzzy +msgid "Content Repository" +msgstr "Online inhoud repository" + +#: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" -msgstr "ContentDB markeert zwarte lijst" +msgstr "ContentDB optie: verborgen pakketten lijst" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB Maximum Gelijktijdige Downloads" #: src/settings_translation_file.cpp msgid "ContentDB URL" @@ -2703,8 +3025,10 @@ msgstr "" "blijft." #: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "Regelt de zinksnelheid in vloeistof." +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." @@ -2739,16 +3063,24 @@ msgid "Crosshair alpha" msgstr "Draadkruis-alphawaarde" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Draadkruis-alphawaarde. (ondoorzichtigheid; tussen 0 en 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Alfawaarde crosshair (ondoorzichtigheid, tussen 0 en 255).\n" +"Ook van toepassing op de crosshair voor objecten." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Draadkruis-kleur" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Draadkruis-kleur (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Draadkruis kleur (R,G,B).\n" +"Controleert ook het object draadkruis kleur" #: src/settings_translation_file.cpp msgid "DPI" @@ -2771,12 +3103,12 @@ msgid "Debug log level" msgstr "Debug logniveau" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Volume verlagen toets" +msgid "Debugging" +msgstr "" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "Verlaag dit om de vloeistofweerstand te vergroten." +msgid "Dec. volume key" +msgstr "Volume verlagen toets" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2811,17 +3143,18 @@ msgid "Default report format" msgstr "Standaardformaat voor rapport-bestanden" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Standaardspel" +msgstr "Standaard voorwerpenstapel grootte" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Standaard time-out voor cURL, in milliseconden.\n" -"Wordt alleen gebruikt indien gecompileerd met cURL ingebouwd." +"Definieer kwaliteit schaduwfiltering\n" +"Dit simuleert zachte schaduwen d.m.v. een PCF of Poisson-schijf\n" +"maar is ook gebruiksintensiever." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2852,14 +3185,6 @@ msgstr "Bepaalt de grootschalige rivierkanaal structuren." msgid "Defines location and terrain of optional hills and lakes." msgstr "Bepaalt de plaats van bijkomende heuvels en vijvers." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Bemonsterings-interval voor texturen.\n" -"Een hogere waarde geeft vloeiender normal maps." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Definieert het basisgrondniveau." @@ -2872,8 +3197,7 @@ msgstr "Definieert de diepte van het rivierkanaal." msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" "Maximale afstand (in blokken van 16 nodes) waarbinnen andere spelers " -"zichtbaar zijn\n" -"(0 = oneindig ver)." +"zichtbaar zijn (0 = oneindig ver)." #: src/settings_translation_file.cpp msgid "Defines the width of the river channel." @@ -2940,6 +3264,15 @@ msgstr "" msgid "Desynchronize block animation" msgstr "Textuur-animaties niet synchroniseren" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Decoraties" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Toets voor graven" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Graaf deeltjes" @@ -2952,6 +3285,16 @@ msgstr "Valsspeelbescherming uitschakelen" msgid "Disallow empty passwords" msgstr "Lege wachtwoorden niet toestaan" +#: src/settings_translation_file.cpp +msgid "Display Density Scaling Factor" +msgstr "Weergavedichtheid-schaalfactor" + +#: 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 "Domeinnaam van de server; wordt getoond in de serverlijst." @@ -2982,7 +3325,7 @@ msgstr "Dungeon minimaal Y" #: src/settings_translation_file.cpp msgid "Dungeon noise" -msgstr "Kerker ruis" +msgstr "Lawaai in kerkers" #: src/settings_translation_file.cpp msgid "" @@ -3000,18 +3343,41 @@ msgstr "" "Schakel Lua modding ondersteuning op cliënt in.\n" "Deze ondersteuning is experimenteel en de API kan wijzigen." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Filteren d.m.v. Poisson-schijf inschakelen.\n" +"Indien ingeschakeld, wordt een Poisson-schijf gebruikt om zachte schaduwen " +"te genereren. In het andere geval wordt PCF-filteren toegepast." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Gekleurde schaduwen inschakelen.\n" +"Indien ingeschakeld werpen doorzichtige nodes gekleurde schaduwen af. Dit is " +"arbeidsintensief." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Schakel het console venster in" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Schakel creatieve modus in voor nieuwe kaarten." +msgid "Enable creative mode for all players" +msgstr "Schakel creatieve modus in voor alle spelers" #: src/settings_translation_file.cpp msgid "Enable joysticks" msgstr "Schakel joysticks in" +#: 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 "Ondersteuning voor mod-kanalen inschakelen." @@ -3028,18 +3394,6 @@ msgstr "Schakel verwondingen en sterven van spelers aan." msgid "Enable random user input (only used for testing)." msgstr "Schakel willkeurige invoer aan (enkel voor testen)." -#: src/settings_translation_file.cpp -msgid "Enable register confirmation" -msgstr "Registerbevestiging inschakelen" - -#: src/settings_translation_file.cpp -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" -"Schakel registerbevestiging in wanneer u verbinding maakt met de server. \n" -"Indien uitgeschakeld, wordt een nieuw account automatisch geregistreerd." - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" @@ -3048,6 +3402,10 @@ msgstr "" "Vloeiende verlichting met eenvoudige ambient occlusion aanschakelen.\n" "Schakel dit uit voor minder vertraging, of voor een ander visueel effect." +#: 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" @@ -3059,8 +3417,7 @@ msgstr "" "Zet dit aan om verbindingen van oudere cliënten te weigeren.\n" "Oudere cliënten zijn compatibel, in de zin dat ze niet crashen als ze " "verbinding \n" -"maken met nieuwere servers, maar ze ondersteunen wellicht niet alle " -"nieuwere\n" +"maken met nieuwere servers, maar ze ondersteunen wellicht niet alle nieuwere " "mogelijkheden." #: src/settings_translation_file.cpp @@ -3121,18 +3478,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Schakelt animatie van inventaris items aan." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Bumpmapping aanzetten voor texturen. Normalmaps moeten al in de texture pack " -"zitten\n" -"of ze moeten automatisch gegenereerd worden.\n" -"Schaduwen moeten aanstaan." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Schakelt caching van facedir geroteerde meshes." @@ -3141,22 +3486,6 @@ msgstr "Schakelt caching van facedir geroteerde meshes." msgid "Enables minimap." msgstr "Schakelt de mini-kaart in." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Schakelt het genereren van normal maps in (emboss effect).\n" -"Dit vereist dat bumpmapping ook aan staat." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Schakelt parallax occlusie mappen in.\n" -"Dit vereist dat shaders ook aanstaan." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3169,6 +3498,17 @@ msgstr "" "volledig uitgeschakeld geluidsbesturingen zullen niet functioneel zijn. \n" "Het wijzigen van deze instelling vereist een herstart." +#: 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 "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "Vallei-profiel" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Profilergegevens print interval" @@ -3177,14 +3517,6 @@ msgstr "Profilergegevens print interval" msgid "Entity methods" msgstr "Entiteit-functies" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Experimentele optie. Kan bij een waarde groter dan 0 zichtbare\n" -"ruimtes tussen blokken tot gevolg hebben." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3194,10 +3526,21 @@ 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 "" +"Exponent voor de afschuining van het zwevende eiland. Wijzigt de " +"afschuining.\n" +"Waarde = 1.0 maakt een uniforme, rechte afschuining.\n" +"Waarde > 1.0 maakt een vloeiende afschuining voor standaard gescheiden\n" +"zwevende eilanden.\n" +"Waarde < 1.0 (bijvoorbeeld 0.25) maakt een meer uitgesproken oppervlak met \n" +"platte laaglanden, geschikt voor een solide zwevende eilanden laag." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS in het pauze-menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS als het spel gepauzeerd of niet gefocussed is" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3215,18 +3558,6 @@ msgstr "Val dobberende factor" msgid "Fallback font path" msgstr "Terugvallettertype" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Terugval-font schaduw" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Terugval-font schaduw alphawaarde" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Terugval-fontgrootte" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Snel toets" @@ -3245,11 +3576,11 @@ msgstr "Snelle modus" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Snelle beweging (via de \"speciale\" toets). \n" -"Dit vereist het \"snelle\" recht op de server." +"Snelle beweging (via de \"Aux1\"-toets).\n" +"Dit vereist het recht \"snel bewegen\" op de server." #: src/settings_translation_file.cpp msgid "Field of view" @@ -3282,32 +3613,33 @@ msgid "Filmic tone mapping" msgstr "Filmisch tone-mapping" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" -"Gefilterde texturen kunnen RGB-waarden vermengen met transparante buren,\n" -"die door PNG-optimalisators vaak verwijderd worden. Dit kan donkere of " -"lichte\n" -"randen bij transparante texturen tot gevolg hebben.\n" -"Gebruik dit filter om dat tijdens het laden van texturen te herstellen." - -#: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filters" +"Gefilterde texturen kunnen RGB-waarden mengen met die van volledig\n" +"transparante buren, die door PNG-optimalisatoren vaak verwijderd worden,\n" +"wat vaak voor donkere of lichtere randen bij transparante texturen zorgt.\n" +"Gebruik een filter om dat tijdens het laden van texturen te herstellen. Dit " +"wordt\n" +"automatisch ingeschakeld als mipmapping aan staat." #: src/settings_translation_file.cpp #, 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." -msgstr "Eerste van 2 3D geluiden voor tunnels." +msgstr "" +"Eerste van vier 2D geluiden die samen de hoogte van een heuvel of berg " +"bepalen." #: src/settings_translation_file.cpp -#, fuzzy msgid "First of two 3D noises that together define tunnels." -msgstr "Eerste van 2 3D geluiden voor tunnels." +msgstr "Eerste van twee 3D geluiden voor tunnels." #: src/settings_translation_file.cpp msgid "Fixed map seed" @@ -3318,39 +3650,32 @@ msgid "Fixed virtual joystick" msgstr "Vaste virtuele joystick" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "Drijvend gebergte dichtheid" +msgstr "Drijvend gebergte densiteit" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "Dungeon maximaal Y" +msgstr "Maximaal Y-waarde van zwevende eilanden" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "Dungeon minimaal Y" +msgstr "Minimum Y-waarde van zwevende eilanden" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Drijvend land basis ruis" +msgstr "Zwevende eilanden geluid" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "Drijvend gebergte dichtheid" +msgstr "Zwevend eiland vormfactor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "Drijvend land basis ruis" +msgstr "Zwevend eiland afschuinings-afstand" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "Waterniveau" +msgstr "Waterniveau van zwevend eiland" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3365,14 +3690,18 @@ msgid "Fog" msgstr "Mist" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fog start" -msgstr "Nevel aanvang" +msgstr "Begin van de nevel of mist" #: src/settings_translation_file.cpp msgid "Fog toggle key" msgstr "Mist aan/uitschakelen toets" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font" +msgstr "Lettergrootte" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "Standaard vetgedrukt" @@ -3394,15 +3723,17 @@ msgid "Font size" msgstr "Lettergrootte" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "Lettergrootte van het standaardlettertype in punt (pt)." #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Lettergrootte van het fallback-lettertype in punt (pt)." - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +#, fuzzy +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "Lettergrootte van het monospace-lettertype in punt (pt)." #: src/settings_translation_file.cpp @@ -3410,6 +3741,19 @@ msgid "" "Font size of the recent chat text and chat prompt in point (pt).\n" "Value 0 will use the default font size." msgstr "" +"Tekstgrootte van de chatgeschiedenis en chat prompt in punten (pt).\n" +"Waarde 0 zal de standaard tekstgrootte gebruiken." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -3442,23 +3786,19 @@ msgid "Formspec Full-Screen Background Opacity" msgstr "Formspec Achtergronddekking op volledig scherm" #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec default background color (R,G,B)." msgstr "Chat console achtergrondkleur (R,G,B)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec default background opacity (between 0 and 255)." msgstr "" "Chat console achtergrond alphawaarde (ondoorzichtigheid, tussen 0 en 255)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec full-screen background color (R,G,B)." msgstr "Chat console achtergrondkleur (R,G,B)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Formspec full-screen background opacity (between 0 and 255)." msgstr "" "Chat console achtergrond alphawaarde (ondoorzichtigheid, tussen 0 en 255)." @@ -3468,9 +3808,9 @@ msgid "Forward key" msgstr "Vooruit toets" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fourth of 4 2D noises that together define hill/mountain range height." -msgstr "Eerste van 2 3D geluiden voor tunnels." +msgstr "" +"Vierde van vier 3D geluiden die de hoogte van heuvels en bergen bepalen." #: src/settings_translation_file.cpp msgid "Fractal type" @@ -3480,11 +3820,6 @@ msgstr "Fractaal type" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Fractie van de zichtbare afstand vanaf waar de nevel wordt getoond" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "FreeType fonts" -msgstr "Freetype lettertypes" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3520,10 +3855,6 @@ msgstr "" msgid "Full screen" msgstr "Volledig scherm" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "BPP bij volledig scherm" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Volledig scherm modus." @@ -3541,28 +3872,33 @@ msgid "GUI scaling filter txr2img" msgstr "GUI schalingsfilter: txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Genereer normaalmappen" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Spellen" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" #: src/settings_translation_file.cpp msgid "Global callbacks" msgstr "Algemene callbacks" #: 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 junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" -"Algemene wereldgenerator instellingen.\n" -"De vlag 'decorations' bepaalt de aanwezigheid van alle decoraties, behalve\n" -"bij generator v6,\n" -"waar de aanwezigheid van bomen en oerwoud-gras er niet\n" -"door beïnvloed wordt.\n" -"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-" -"waarde.\n" -"Zet \"no\" voor een vlag om hem expliciet uit te zetten." +"Algemene wereldgeneratorinstellingen.\n" +"In Mapgen v6 beïnvloedt de vlag \"decorations\" alle decoraties behalve " +"bomen.\n" +"en junglegras. In alle andere generatoren beïnvloedt deze vlag alle " +"decoraties." #: src/settings_translation_file.cpp msgid "" @@ -3584,48 +3920,58 @@ msgstr "" msgid "Graphics" msgstr "Grafisch" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Graphics Effects" +msgstr "Grafisch" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Graphics and Audio" +msgstr "Grafisch" + #: src/settings_translation_file.cpp msgid "Gravity" msgstr "Zwaartekracht" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ground level" msgstr "Grondniveau" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ground noise" -msgstr "Modder ruis" +msgstr "Aarde/Modder geluid" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "HTTP Mods" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "HTTP mods" -msgstr "HTTP Modules" - -#: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "HUD schaal factor" +msgid "HUD scaling" +msgstr "GUI schaalfactor" #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD aan/uitschakelen toets" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"Behandeling van verouderde lua api aanroepen:\n" -"- legacy: (probeer) het oude gedrag na te bootsen\n" -" (standaard voor een 'release' versie).\n" -"- log: boots het oude gedrag na, en log een backtrace van de aanroep\n" -" (standaard voor een 'debug' versie).\n" -"- error: stop de server bij gebruik van een verouderde aanroep\n" -" (aanbevolen voor mod ontwikkelaars)." +"Behandeling van verouderde Lua API aanroepen:\n" +"- none: log geen verouderde aanroepen\n" +"- log: boots het oude gedrag na, en log een backtrace van de aanroep " +"(standaard voor een 'debug' versie).\n" +"- error: stop de server bij gebruik van een verouderde aanroep " +"(aanbevolen voor mod ontwikkelaars)." #: src/settings_translation_file.cpp msgid "" @@ -3642,69 +3988,57 @@ msgstr "" "* Profileer de code die de statistieken ververst." #: src/settings_translation_file.cpp -#, fuzzy msgid "Heat blend noise" -msgstr "Wereldgenerator landschapstemperatuurovergangen" +msgstr "Geluid van landschapstemperatuurovergangen" #: src/settings_translation_file.cpp -#, fuzzy msgid "Heat noise" -msgstr "Grot ruispatroon #1" +msgstr "Hitte geluid" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Aanvangshoogte van het venster." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Hoogtecomponent van de initiële grootte van het venster. Wordt genegeerd in " +"fullscreen-modus." #: src/settings_translation_file.cpp -#, fuzzy msgid "Height noise" -msgstr "Rechter Windowstoets" +msgstr "Hoogtegeluid" #: src/settings_translation_file.cpp -#, fuzzy msgid "Height select noise" -msgstr "Hoogte-selectie ruisparameters" +msgstr "Hoogte-selectie geluid" #: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Hoge-nauwkeurigheid FPU" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Hill steepness" msgstr "Steilheid van de heuvels" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hill threshold" msgstr "Heuvel-grenswaarde" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness1 noise" -msgstr "Steilte ruis" +msgstr "Heuvelsteilte ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness2 noise" -msgstr "Steilte ruis" +msgstr "Heuvelachtigheid2 ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness3 noise" -msgstr "Steilte ruis" +msgstr "Heuvelachtigheid3 ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hilliness4 noise" -msgstr "Steilte ruis" +msgstr "Heuvelachtigheid4 ruis" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Home-pagina van de server. Wordt getoond in de serverlijst." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." @@ -3713,7 +4047,6 @@ msgstr "" "in knooppunten per seconde per seconde." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Horizontal and vertical acceleration in fast mode,\n" "in nodes per second per second." @@ -3722,7 +4055,6 @@ msgstr "" "in knooppunten per seconde per seconde." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Horizontal and vertical acceleration on ground or when climbing,\n" "in nodes per second per second." @@ -3739,164 +4071,132 @@ msgid "Hotbar previous key" msgstr "Toets voor vorig gebruikte tool" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 1 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 1 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 10 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 10 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 11 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 11 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 12 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 12 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 13 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 13 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 14 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 14 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 15 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 15 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 16 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 16 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 17 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 17 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 18 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 18 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 19 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 19 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 2 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 2 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 20 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 20 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 21 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 21 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 22 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 22 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 23 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 23 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 24 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 24 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 25 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 25 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 26 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 26 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 27 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 27 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 28 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 28 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 29 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 29 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 3 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 3 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 30 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 30 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 31 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 31 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 32 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 32 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 4 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 4 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 5 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 5 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 6 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 6 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 7 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 7 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 8 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 8 van gebruikte tools" #: src/settings_translation_file.cpp -#, fuzzy msgid "Hotbar slot 9 key" -msgstr "Toets voor volgend gebruikte tool" +msgstr "Toets voor slot 9 van gebruikte tools" #: src/settings_translation_file.cpp msgid "How deep to make rivers." @@ -3913,14 +4213,23 @@ msgstr "" "Vereist dat golvende vloeistoffen zijn ingeschakeld." #: 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 "" "De tijd die de server wacht voordat een ongebruikt mapblok vergeten wordt.\n" "Een hogere waarde zorgt voor een vloeiender spelervaring, maar kost meer " "geheugen." +#: 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 "Verlaag dit om de vloeistofweerstand te vergroten." + #: src/settings_translation_file.cpp msgid "How wide to make rivers." msgstr "Breedte van rivieren." @@ -3954,15 +4263,12 @@ msgstr "" "kracht verspild wordt zonder dat het toegevoegde waarde heeft." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Indien uitgeschakeld, dan wordt met de \"gebruiken\" toets snel gevlogen " -"wanneer\n" -"de \"vliegen\" en de \"snel\" modus aanstaan." +"Indien uitgeschakeld wordt de \"Aux1\"-toets gebruikt om snel te vliegen\n" +"als modi \"vliegen\" en \"snel\" beide aan staan." #: src/settings_translation_file.cpp msgid "" @@ -3990,14 +4296,23 @@ msgstr "" "Dit vereist het \"noclip\" voorrecht op de server." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Indien aangeschakeld, dan wordt de \"gebruiken\" toets gebruikt voor\n" -"omlaagklimmen en dalen i.p.v. de \"sluipen\" toets." +"Indien ingeschakeld wordt de \"Aux1\"-toets gebruikt i.p.v. de \"Sneak\"-" +"toets om\n" +"omlaag te klimmen en af te dalen." + +#: 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 "" +"Schakel registerbevestiging in wanneer u verbinding maakt met de server. \n" +"Indien uitgeschakeld, wordt een nieuw account automatisch geregistreerd." #: src/settings_translation_file.cpp msgid "" @@ -4030,7 +4345,10 @@ msgstr "" "van de speler tijdens het vliegen of zwemmen." #: 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 "" "Spelers kunnen zich niet aanmelden zonder wachtwoord indien aangeschakeld." @@ -4054,6 +4372,14 @@ msgstr "" "beperkt \n" "tot deze afstand van de speler tot het blok." +#: 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 "" +"Als het uitvoeren van een chatcommando langer duurt dan de opgegeven tijd\n" +"in seconden, voeg dan tijdsinformatie toe aan het bijhorende bericht" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -4077,10 +4403,6 @@ msgstr "" msgid "Ignore world errors" msgstr "Wereldfouten negeren" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "Spel" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -4091,15 +4413,13 @@ msgid "In-game chat console background color (R,G,B)." msgstr "Chat console achtergrondkleur (R,G,B)." #: src/settings_translation_file.cpp -#, fuzzy msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." msgstr "" "Chat console achtergrond alphawaarde (ondoorzichtigheid, tussen 0 en 255)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Inc. volume key" -msgstr "Console-toets" +msgstr "Verhoog volume toets" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." @@ -4112,11 +4432,11 @@ msgid "" msgstr "" "Profileer 'builtin'.\n" "Dit is normaal enkel nuttig voor gebruik door ontwikkelaars van\n" -"het 'builtin'-gedeelte van de server" +"het core/builtin-gedeelte van de server" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "Profileer chat-commando's bij het registreren." +msgid "Instrument chat commands on registration." +msgstr "Profileer chatcommando's bij het registreren." #: src/settings_translation_file.cpp msgid "" @@ -4140,10 +4460,6 @@ msgstr "Profileer de acties van LBMs bij het registreren." msgid "Instrument the methods of entities on registration." msgstr "Profileer de acties van objecten bij het registreren." -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "Per soort" - #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." msgstr "" @@ -4151,7 +4467,8 @@ msgstr "" "seconden." #: 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 voor het sturen van de kloktijd naar cliënten." #: src/settings_translation_file.cpp @@ -4171,23 +4488,20 @@ msgid "Invert vertical mouse movement." msgstr "Vertikale muisbeweging omkeren." #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "Vaste-breedte font pad" +msgstr "Cursief font pad" #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic monospace font path" -msgstr "Vaste-breedte font pad" +msgstr "Cursief vaste-breedte font pad" #: src/settings_translation_file.cpp msgid "Item entity TTL" msgstr "Bestaansduur van objecten" #: src/settings_translation_file.cpp -#, fuzzy msgid "Iterations" -msgstr "Per soort" +msgstr "Iteraties" #: src/settings_translation_file.cpp msgid "" @@ -4211,17 +4525,19 @@ msgstr "Stuurknuppel ID" msgid "Joystick button repetition interval" msgstr "Joystick-knop herhalingsinterval" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Dode zone Joystick" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Joystick frustrum gevoeligheid" #: src/settings_translation_file.cpp -#, fuzzy msgid "Joystick type" -msgstr "Stuurknuppel Type" +msgstr "Joystick type" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "W component of hypercomplex constant.\n" @@ -4229,60 +4545,61 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" -"Juliaverzameling: W-waarde van de 4D vorm. Heeft geen effect voor 3D-" -"fractals.\n" +"Alleen de Julia verzameling: \n" +"W-waarde van de 4D vorm. \n" +"Verandert de vorm van de fractal.\n" +"Heeft geen effect voor 3D-fractals.\n" "Bereik is ongeveer -2 tot 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "X component of hypercomplex constant.\n" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Juliaverzameling: X-waarde van de vorm.\n" +"Allen de Julia verzameling: \n" +"X-waarde van de 4D vorm.\n" +"Verandert de vorm van de fractal.\n" "Bereik is ongeveer -2 tot 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "Y component of hypercomplex constant.\n" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Juliaverzameling: Y-waarde van de vorm.\n" +"Alleen de Julia verzameling: \n" +"Y-waarde van de 4D vorm.\n" +"Verandert de vorm van de fractal.\n" "Bereik is ongeveer -2 tot 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Julia set only.\n" "Z component of hypercomplex constant.\n" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Juliaverzameling: Z-waarde van de vorm.\n" +"Alleen de Julia verzameling: \n" +"Z-waarde van de 4D vorm.\n" +"Verandert de vorm van de fractal.\n" "Bereik is ongeveer -2 tot 2." #: src/settings_translation_file.cpp -#, fuzzy msgid "Julia w" msgstr "Julia w" #: src/settings_translation_file.cpp -#, fuzzy msgid "Julia x" msgstr "Julia x" #: src/settings_translation_file.cpp -#, fuzzy msgid "Julia y" msgstr "Julia y" #: src/settings_translation_file.cpp -#, fuzzy msgid "Julia z" msgstr "Julia z" @@ -4314,6 +4631,16 @@ msgstr "" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets voor graven.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4341,8 +4668,7 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om het volume te verhogen.\n" -"Zie\n" -"http://irrlicht.sourceforge.net/docu/namespaceirr." +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp @@ -4366,7 +4692,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for moving the player backward.\n" "Will also disable autoforward, when active.\n" @@ -4374,6 +4699,7 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Toets om de speler achteruit te bewegen.\n" +"Zal ook het automatisch voortbewegen deactiveren, indien actief.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4428,13 +4754,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for opening the chat window to type local commands.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het chat-window te openen om commando's te typen.\n" +"Toets om het chat-window te openen om lokale commando's te typen.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4459,288 +4784,272 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Toets voor plaatsen.\n" +"Zie http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 11de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 12th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 12de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 13th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 13de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 14th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 14de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 15th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 15de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 16th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 16de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 17th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 17de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 18th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 18de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 19th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 19de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 20th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 20ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 21st hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 21ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 22nd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 22ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 23rd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 23ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 24th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 24ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 25th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 25ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 26th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 26ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 27th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 27ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 28th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 28ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 29th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 29ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 30th hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 30ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 31st hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 32ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the 32nd hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 32ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the eighth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 8ste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the fifth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de vijfde positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the first hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de eerste positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the fourth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het vorige item in de hotbar te selecteren.\n" +"Toets om de vierde positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4755,13 +5064,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the ninth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de negende positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4776,57 +5084,52 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the second hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de tweede positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the seventh hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de zevende positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the sixth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de zesde positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the tenth hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de 10de positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for selecting the third hotbar slot.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het volgende item in de hotbar te selecteren.\n" +"Toets om de derde positie in de hotbar te selecteren.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4865,7 +5168,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling autoforward.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -4926,13 +5228,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling pitch move mode.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om 'noclip' modus aan/uit te schakelen.\n" +"Toets om 'pitch move' modus aan/uit te schakelen.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4948,7 +5249,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of chat.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -4969,7 +5269,6 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of fog.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." @@ -4990,13 +5289,12 @@ msgstr "" "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Key for toggling the display of the large chat console.\n" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Toets om het tonen van chatberichten aan/uit te schakelen.\n" +"Toets om het tonen van de grote chat weergave aan/uit te schakelen.\n" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -5031,6 +5329,10 @@ msgstr "" "Zie http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -5041,7 +5343,6 @@ msgid "Lake steepness" msgstr "Steilheid van meren" #: src/settings_translation_file.cpp -#, fuzzy msgid "Lake threshold" msgstr "Meren-grenswaarde" @@ -5066,9 +5367,8 @@ msgid "Large cave proportion flooded" msgstr "Grote grotaandeel overstroomd" #: src/settings_translation_file.cpp -#, fuzzy msgid "Large chat console key" -msgstr "Console-toets" +msgstr "Grote chatconsole-toets" #: src/settings_translation_file.cpp msgid "Leaves style" @@ -5096,36 +5396,40 @@ msgstr "Toets voor links" msgid "" "Length of a server tick and the interval at which objects are generally " "updated over\n" -"network." +"network, stated in seconds." msgstr "" -"Lengte van server stap, en interval waarin objecten via het netwerk ververst " -"worden." +"Lengte van server stap, en interval waarin objecten via het netwerk\n" +"ververst worden." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." msgstr "" -"Bewegende bladeren staan aan indien 'true'.Dit vereist dat 'shaders' ook " -"aanstaan." +"Lengte van vloeibare golven.\n" +"Dit vereist dat 'golfvloeistoffen' ook aanstaan." #: 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 "" "Tijdsinterval waarmee actieve blokken wijzigers (ABMs) geactiveerd worden" #: 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 "Tijdsinterval waarmee node timerd geactiveerd worden" #: src/settings_translation_file.cpp #, fuzzy -msgid "Length of time between active block management cycles" -msgstr "Tijd tussen ABM cycli" +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "Tijd tussen actieve blok beheer(ABM) cycli" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- <nothing> (no logging)\n" @@ -5134,7 +5438,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "Hoeveelheid logging die geschreven wordt naar debug.txt:\n" "- <leeg> (geen logging)\n" @@ -5169,6 +5474,11 @@ msgstr "Lichtcurve hoog verloop" msgid "Light curve low gradient" msgstr "Lichtcurve laag verloop" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Vloeiende verlichting" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -5211,7 +5521,6 @@ msgid "Liquid queue purge time" msgstr "Inkortingstijd vloeistof-wachtrij" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid sinking" msgstr "Zinksnelheid in vloeistof" @@ -5247,19 +5556,13 @@ msgid "Lower Y limit of dungeons." msgstr "Onderste Y-limiet van kerkers." #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "Onderste Y-limiet van kerkers." +msgstr "Onderste Y-limiet van zwevende eilanden." #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "Hoofdmenu script" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Hoofdmenu script" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5267,15 +5570,18 @@ msgstr "" "Mist en hemelkleur afhankelijk van tijd van de dag (zonsopkomst/ondergang) " "en kijkrichting." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"Maakt dat DirectX werkt met LuaJIT. Schakel dit uit als het problemen geeft." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Maak alle vloeistoffen ondoorzichtig" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Map compressie niveau voor het bewaren op de harde schijf" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Map compressie niveau voor netwerk transfert" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Wereld map" @@ -5285,29 +5591,22 @@ msgid "Map generation attributes specific to Mapgen Carpathian." msgstr "Wereldgeneratieattributen specifiek aan Mapgen Carpathian." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." msgstr "" "Wereldgenerator instellingen specifiek voor generator 'flat' (vlak).\n" -"Verspreide meren en heuvels kunnen toegevoegd worden.\n" -"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-" -"waarde.\n" -"Zet \"no\" voor een vlag om hem expliciet uit te zetten." +"Verspreide meren en heuvels kunnen toegevoegd worden." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Fractal.\n" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" -"Wereldgenerator instellingen specifiek voor generator 'flat' (vlak).\n" -"Verspreide meren en heuvels kunnen toegevoegd worden.\n" -"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-" -"waarde.\n" -"Zet \"no\" voor een vlag om hem expliciet uit te zetten." +"Wereldgenerator instellingen specifiek voor generator 'fractal'.\n" +"\"terrein\" activeert de generatie van niet-fractale terreinen:\n" +"oceanen, eilanden en ondergrondse ruimtes." #: src/settings_translation_file.cpp msgid "" @@ -5330,7 +5629,6 @@ msgid "Map generation attributes specific to Mapgen v5." msgstr "Wereldgenerator instellingen specifiek voor Mapgen V5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" @@ -5338,23 +5636,22 @@ msgid "" "the 'jungles' flag is ignored." msgstr "" "Wereldgenerator instellingen specifiek voor generator v6.\n" +"De sneeuwgebieden optie, activeert de nieuwe 5 vegetaties systeem.\n" "Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt\n" -"de \"jungles\" vlag genegeerd.\n" -"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-" -"waarde.\n" -"Zet \"no\" voor een vlag om hem expliciet uit te zetten." +"de \"jungles\" optie genegeerd." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Kenmerken voor het genereren van kaarten die specifiek zijn voor Mapgen " -"v7. \n" -"'richels' maakt de rivieren mogelijk." +"Wereldgenerator instellingen specifiek voor generator v7.\n" +"'ridges': dit zijn uithollingen in het landschap die rivieren mogelijk " +"maken.\n" +"'floatlands': dit zijn zwevende landmassa's in de atmosfeer.\n" +"'caverns': grote grotten diep onder de grond." #: src/settings_translation_file.cpp msgid "Map generation limit" @@ -5364,17 +5661,19 @@ msgstr "Wereld-grens" msgid "Map save interval" msgstr "Interval voor opslaan wereld" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Aantal frames voor bijwerken schaduwmap" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Max aantal wereldblokken" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapblock mesh generation delay" -msgstr "Wereld-grens" +msgstr "Mapblock maas generatie vertraging" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapblock mesh generator's MapBlock cache size in MB" msgstr "Mapblock maas generator's MapBlock cache grootte in MB" @@ -5383,73 +5682,60 @@ msgid "Mapblock unload timeout" msgstr "Wereldblok vergeet-tijd" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Carpathian" -msgstr "Fractal wereldgenerator" +msgstr "wereldgenerator Karpaten" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Carpathian specific flags" -msgstr "Vlaggen" +msgstr "Wereldgenerator Karpaten specifieke opties" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat" -msgstr "Vlakke Wereldgenerator" +msgstr "Wereldgenerator vlak terrein" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat specific flags" -msgstr "Vlaggen" +msgstr "Wereldgenerator vlak terrein specifieke opties" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal" -msgstr "Fractal wereldgenerator" +msgstr "Wereldgenerator Fractal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Vlaggen" +msgstr "Wereldgenerator Fractal specifieke opties" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5" msgstr "Wereldgenerator v5" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5 specific flags" -msgstr "Vlaggen" +msgstr "Wereldgenerator v5 specifieke opties" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6" msgstr "Wereldgenerator v6" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6 specific flags" -msgstr "Mapgen v6 Vlaggen" +msgstr "Wereldgenerator v6 specifieke opties" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7" msgstr "Wereldgenerator v7" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7 specific flags" -msgstr "Mapgen v7 vlaggen" +msgstr "Wereldgenerator v7 specifieke opties" #: src/settings_translation_file.cpp msgid "Mapgen Valleys" msgstr "Valleien Wereldgenerator" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Valleys specific flags" -msgstr "Vlaggen" +msgstr "Weredgenerator valleien specifieke opties" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -5470,8 +5756,8 @@ msgstr "Maximale afstand voor te versturen blokken" #: src/settings_translation_file.cpp msgid "Max liquids processed per step." msgstr "" -"Maximaal aantal vloeistof-nodes te verwerken (dwz verspreiden)\n" -"per server-stap." +"Maximaal aantal vloeistof-nodes te verwerken (dwz verspreiden) per server-" +"stap." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" @@ -5486,8 +5772,14 @@ msgid "Maximum FPS" msgstr "Maximum FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Maximum FPS als het spel gepauzeerd is." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"Maximum FPS als het venster niet gefocussed is, of wanneer het spel " +"gepauzeerd is." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Maximumafstand bij renderen schaduwen." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5529,22 +5821,31 @@ msgid "Maximum number of blocks that can be queued for loading." msgstr "Maximaal aantal blokken in de wachtrij voor laden/genereren." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "This limit is enforced per player." msgstr "" "Maximaal aantal blokken in de wachtrij om gegenereerd te worden.\n" -"Laat leeg om een geschikt aantal automatisch te laten berekenen." +"Deze limiet is opgelegd per speler." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" -"Maximaal aantal blokken in de wachtrij om van disk geladen te worden.\n" -"Laat leeg om een geschikt aantal automatisch te laten berekenen." +"Maximaal aantal blokken in de wachtrij om van een bestand/harde schijf " +"geladen te worden.\n" +"Deze limiet is opgelegd per speler." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Maximaal aantal gelijktijdige downloads. Downloads die deze limiet " +"overschrijden zullen in de wachtrij geplaats worden.\n" +"Deze instelling zou lager moeten zijn dan curl_parallel_limit." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." @@ -5613,19 +5914,25 @@ msgstr "" "'0' om de wachtrij uit te schakelen en '-1' om de wachtrij oneindig te maken." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Maximale duur voor een download van een bestand (bijv. een mod). In " +"Maximale duur voor het downloaden van een bestand (bv. een mod), in " "milliseconden." +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Maximale duur voor het afhandelen van een interactieve aanvraag (bv. ophalen " +"serverlijst), in milliseconden." + #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "Maximaal aantal gebruikers" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Menu's" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "Cache voor meshes" @@ -5647,7 +5954,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "Minimaal aantal loggegevens in de chat weergeven." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5670,21 +5977,34 @@ msgid "Minimum limit of random number of small caves per mapchunk." msgstr "Minimale limiet van willekeurig aantal kleine grotten per mapchunk." #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum texture size" -msgstr "Minimale textuur-grootte voor filters" +msgstr "Minimale textuur-grootte" #: src/settings_translation_file.cpp msgid "Mipmapping" msgstr "Mip-Mapping" +#: 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 "Veiligheid" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "Mod-kanalen" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "Veranderd de grootte van de HUDbar elementen." +msgid "Modifies the size of the HUD elements." +msgstr "Verandert de grootte van de HUD-elementen." #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5696,17 +6016,20 @@ msgstr "Vaste-breedte font grootte" #: src/settings_translation_file.cpp #, fuzzy +msgid "Monospace font size divisible by" +msgstr "Vaste-breedte font grootte" + +#: src/settings_translation_file.cpp msgid "Mountain height noise" -msgstr "Heuvel-hoogte ruisparameters" +msgstr "Berg-hoogte ruis" #: src/settings_translation_file.cpp msgid "Mountain noise" msgstr "Bergen ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mountain variation noise" -msgstr "Heuvel-hoogte ruisparameters" +msgstr "Berg-hoogte ruisvariatie" #: src/settings_translation_file.cpp msgid "Mountain zero level" @@ -5778,10 +6101,6 @@ msgstr "" msgid "Near plane" msgstr "Dichtbij vliegtuig" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Netwerk" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5790,6 +6109,11 @@ msgstr "" "Netwerkpoort van de server (UDP).\n" "Bij starten vanuit het hoofdmenu kan een andere poort opgegeven worden." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "Netwerk" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "Nieuwe spelers dienen dit wachtwoord op te geven." @@ -5802,6 +6126,11 @@ msgstr "Noclip" msgid "Noclip key" msgstr "Noclip-toets" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Node licht op" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "Geselecteerde node indicatie" @@ -5814,20 +6143,11 @@ msgstr "Interval voor node-timers" msgid "Noises" msgstr "Ruis" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Normal-maps bemonstering" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Sterkte van normal-maps" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Aantal 'emerge' threads" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Number of emerge threads to use.\n" "Value 0:\n" @@ -5861,23 +6181,12 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" -"Aantal extra blokken (van 16x16x16 nodes) dat door het commando '/" -"clearobjects'\n" -"tegelijk geladen mag worden.\n" -"Dit aantal is een compromis tussen snelheid enerzijds (vanwege de overhead " -"van een sqlite\n" -"transactie), en geheugengebruik anderzijds (4096 = ca. 100MB)." - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Aantal parallax occlusie iteraties." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Online inhoud repository" +"Aantal extra blokken dat '/clearobjects' tegelijk mag laden.\n" +"Dit is een compromis tussen overhead van SQLite-transacties en\n" +"geheugengebruik (als vuistregel is 4096 gelijk aan 100 MB)." #: src/settings_translation_file.cpp msgid "Opaque liquids" @@ -5890,13 +6199,6 @@ msgstr "" "Ondoorzichtigheid (alpha) van de schaduw achter het standaardlettertype, " "tussen 0 en 255." -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" -"Ondoorzichtigheid (alpha) van de schaduw achter het fallback-lettertype, " -"tussen 0 en 255." - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5907,40 +6209,13 @@ msgstr "" "een formspec geopend is." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" -"Algemene afwijking van het parallax occlusie effect. Normaal: schaal/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Algemene schaal van het parallax occlusie effect." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Parallax occlusie" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Parallax occlusie afwijking" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Parallax occlusie iteraties" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Parallax occlusie modus" +msgid "Optional override for chat weblink color." +msgstr "Optionele overschrijving van de kleur van weblinks in chat." #: src/settings_translation_file.cpp #, fuzzy -msgid "Parallax occlusion scale" -msgstr "Parallax occlusie schaal" - -#: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5957,6 +6232,9 @@ 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 "" +"Pad waar screenshots moeten bewaard worden. Kan een absoluut of relatief pad " +"zijn.\n" +"De map zal aangemaakt worden als ze nog niet bestaat." #: src/settings_translation_file.cpp msgid "" @@ -5972,10 +6250,9 @@ msgstr "" "Pad van de texturen-map. Naar texturen wordt gezocht beginnend bij deze map." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" "Pad naar het standaardlettertype. \n" @@ -5987,10 +6264,9 @@ msgstr "" "geladen." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" "Pad naar het monospace-lettertype. \n" @@ -6007,25 +6283,32 @@ msgstr "Pauzeer als venster focus verliest" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" msgstr "" +"Per speler limiet van gevraagde blokken om te laden van de harde schijf" #: src/settings_translation_file.cpp -#, fuzzy msgid "Per-player limit of queued blocks to generate" -msgstr "Emerge-wachtrij voor genereren" +msgstr "Per speler limiet van de \"te genereren blokken\"-wachtrij" #: src/settings_translation_file.cpp msgid "Physics" msgstr "Fysica" #: src/settings_translation_file.cpp -#, fuzzy msgid "Pitch move key" -msgstr "Vliegen toets" +msgstr "Vrij vliegen toets" #: src/settings_translation_file.cpp msgid "Pitch move mode" msgstr "Pitch beweeg modus" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Plaats toets" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Plaats (Rechts-klik) herhalingsinterval" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -6034,18 +6317,17 @@ msgstr "" "Speler kan vliegen, zonder invloed van de zwaartekracht.\n" "De speler moet wel in het bezit zijn van het \"vliegen\" voorrecht." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Spelernaam" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Speler verplaatsingsafstand" #: src/settings_translation_file.cpp -#, fuzzy msgid "Player versus player" -msgstr "Speler-gevechten" +msgstr "Speler tegen speler" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Poisson-filteren" #: src/settings_translation_file.cpp msgid "" @@ -6070,13 +6352,12 @@ msgstr "" "Voorkom dat mods onveilige commando's uitvoeren, zoals shell commando's." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Print the engine's profiling data in regular intervals (in seconds).\n" "0 = disable. Useful for developers." msgstr "" -"Interval waarmee profiler-gegevens geprint worden. 0 = uitzetten. Dit is " -"nuttig voor ontwikkelaars." +"Interval waarmee profiler-gegevens geprint worden. \n" +"0 = uitzetten. Dit is nuttig voor ontwikkelaars." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" @@ -6090,21 +6371,21 @@ msgstr "Profiler" msgid "Profiler toggle key" msgstr "Profiler aan/uit toets" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Profileren" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" -msgstr "" +msgstr "Adres om te luisteren naar Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"Adres om te luisteren naar Prometheus.\n" +"Indien Minetest gecompileerd werd met de optie ENABLE_PROMETHEUS,\n" +"dan zal dit adres gebruikt worden om naar Prometheus te luisteren.\n" +"Meetwaarden kunnen opgehaald worden op http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." @@ -6136,9 +6417,8 @@ msgid "Recent Chat Messages" msgstr "Recente chatberichten" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "Rapport pad" +msgstr "Standaard lettertype pad" #: src/settings_translation_file.cpp msgid "Remote media" @@ -6192,34 +6472,26 @@ msgstr "" "READ_PLAYERINFO: 32 (deactiveer get_player_names call client-side)" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ridge mountain spread noise" -msgstr "Onderwater richel ruis" +msgstr "\"Berg richel verspreiding\" ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ridge noise" -msgstr "Rivier ruis parameters" +msgstr "Bergtoppen ruis" #: src/settings_translation_file.cpp msgid "Ridge underwater noise" msgstr "Onderwater richel ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ridged mountain size noise" -msgstr "Onderwater richel ruis" +msgstr "Bergtoppen grootte ruis" #: src/settings_translation_file.cpp msgid "Right key" msgstr "Toets voor rechts" #: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Rechts-klik herhalingsinterval" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "River channel depth" msgstr "Diepte van rivieren" @@ -6228,24 +6500,20 @@ msgid "River channel width" msgstr "Breedte van rivieren" #: src/settings_translation_file.cpp -#, fuzzy msgid "River depth" msgstr "Diepte van rivieren" #: src/settings_translation_file.cpp -#, fuzzy msgid "River noise" -msgstr "Rivier ruis parameters" +msgstr "Rivier ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "River size" msgstr "Grootte van rivieren" #: src/settings_translation_file.cpp -#, fuzzy msgid "River valley width" -msgstr "Diepte van rivieren" +msgstr "Breedte van vallei waar een rivier stroomt" #: src/settings_translation_file.cpp msgid "Rollback recording" @@ -6284,7 +6552,6 @@ msgid "Saving map received from server" msgstr "Lokaal bewaren van de server-wereld" #: 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" @@ -6292,12 +6559,17 @@ msgid "" "pixels when scaling down, at the cost of blurring some\n" "edge pixels when images are scaled by non-integer sizes." msgstr "" -"Schaal de GUI met een bepaalde factor.\n" +"Schaal de GUI met een door de gebruiker bepaalde factor.\n" "Er wordt een dichtste-buur-anti-alias filter gebruikt om de GUI te schalen.\n" "Bij verkleinen worden sommige randen minder duidelijk, en worden\n" "pixels samengevoegd. Pixels bij randen kunnen vager worden als\n" "een niet-gehele schaalfactor gebruikt wordt." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Scherm:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Schermhoogte" @@ -6328,26 +6600,25 @@ msgstr "" "Van 1 (slechtst) tot 100 (best).\n" "0 = een redelijke standaardwaarde." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Screenshot" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "Zeebodem ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Second of 4 2D noises that together define hill/mountain range height." -msgstr "Tweede van 2 3d geluiden voor tunnels." +msgstr "" +"Tweede van vier 2D geluiden die samen een heuvel/bergketen grootte bepalen." #: src/settings_translation_file.cpp -#, fuzzy msgid "Second of two 3D noises that together define tunnels." -msgstr "Tweede van 2 3d geluiden voor tunnels." +msgstr "Tweede van twee 3D geluiden die samen tunnels definiëren." #: src/settings_translation_file.cpp -msgid "Security" -msgstr "Veiligheid" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Zie http://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6364,7 +6635,6 @@ msgid "Selection box width" msgstr "Breedte van selectie-randen" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Selects one of 18 fractal types.\n" "1 = 4D \"Roundy\" Mandelbrot set.\n" @@ -6386,7 +6656,7 @@ msgid "" "17 = 4D \"Mandelbulb\" Mandelbrot set.\n" "18 = 4D \"Mandelbulb\" Julia set." msgstr "" -"Keuze uit 18 fractals op basis van 9 formules.\n" +"Selecteert één van de 18 fractaal types:\n" "1 = 4D \"Roundy\" mandelbrot verzameling.\n" "2 = 4D \"Roundy\" julia verzameling.\n" "3 = 4D \"Squarry\" mandelbrot verzameling.\n" @@ -6407,8 +6677,19 @@ msgstr "" "18 = 4D \"Mandelbulb\" julia verzameling." #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Server / Singleplayer" +#, fuzzy +msgid "Server" +msgstr "Server URL" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "Naam van de server" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Omschrijving van de Server" #: src/settings_translation_file.cpp msgid "Server URL" @@ -6434,10 +6715,20 @@ msgstr "Netwerkpoort van de server" msgid "Server side occlusion culling" msgstr "Door server worden onzichtbare nodes niet doorgegeven" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Server Poort" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL van de publieke serverlijst" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "URL van de publieke serverlijst" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Bestand met publieke serverlijst" @@ -6451,41 +6742,90 @@ msgstr "" "Een herstart is noodzakelijk om de nieuwe taal te activeren." #: 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 "Maximaal aantal tekens voor chatberichten van gebruikers instellen." #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Set to true to enable waving leaves.\n" -"Requires shaders to be enabled." +"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 "" -"Bewegende bladeren staan aan indien 'true'.Dit vereist dat 'shaders' ook " -"aanstaan." +"Schaduwsterkte instellen.\n" +"Een lagere waarde betekent lichtere schaduwen, een hogere waarde donkerdere " +"schaduwen." #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"Radiusgrootte zachte schaduwen instellen.\n" +"Lagere waarden betekenen scherpere schaduwen, hogere waarden zachtere.\n" +"Minimumwaarde: 1.0; maximumwaarde: 10.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Tilt van baan zon/maan in graden instellen:\n" +"Een waarde van 0 betekent geen tilt / verticale baan.\n" +"Minimumwaarde: 0.0; maximumwaarde: 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Schakel in om schaduwmapping in te schakelen.\n" +"Dit vereist dat 'shaders' ook aan staan." + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" +"Bewegende bladeren staan aan indien 'true'.\n" +"Dit vereist dat 'shaders' ook aanstaan." + +#: src/settings_translation_file.cpp +msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"Golvend water staat aan indien 'true'Dit vereist dat 'shaders' ook aanstaan." +"Golvend water staat aan indien 'true'.\n" +"Dit vereist dat 'shaders' ook aanstaan." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving plants.\n" "Requires shaders to be enabled." msgstr "" -"Bewegende planten staan aan indien 'true'Dit vereist dat 'shaders' ook " -"aanstaan." +"Bewegende planten staan aan indien 'true'.\n" +"Dit vereist dat 'shaders' ook aanstaan." + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Schaduwtextuurkwaliteit op 32-bits zetten.\n" +"Indien uitgeschakeld worden 16-bits texturen gebruikt,\n" +"wat voor meer ruis in schaduwen kan zorgen." #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Shader pad" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Shaders allow advanced visual effects and may increase performance on some " "video\n" @@ -6497,18 +6837,33 @@ msgstr "" "Alleen mogelijk met OpenGL." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Shadow filter quality" +msgstr "Kwaliteit schaduwfilter" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Maximumafstand in nodes om schaduwen schaduwmap op te renderen" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "32-bits-schaduwmaptexturen" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Textuurgrootte schaduwmap" + +#: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " "drawn." -msgstr "Fontschaduw afstand. Indien 0, dan wordt geen schaduw getekend." +msgstr "" +"Fontschaduw afstand (in beeldpunten). Indien 0, dan wordt geen schaduw " +"getekend." #: src/settings_translation_file.cpp #, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Fontschaduw afstand. Indien 0, dan wordt geen schaduw getekend." +msgid "Shadow strength gamma" +msgstr "Schaduwsterkte" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6522,6 +6877,18 @@ msgstr "Toon debug informatie" msgid "Show entity selection boxes" msgstr "Toon selectie-box voor objecten" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Toon selectievakjes voor entiteiten\n" +"Een herstart is noodzakelijk om de wijziging te activeren." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Standaard achtergronden naam-tags tonen" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Afsluitbericht van server" @@ -6555,9 +6922,12 @@ msgstr "" "wordt gekopieerd waardoor flikkeren verminderd." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Sky Body Orbit Tilt" +msgstr "Tilt baan hemellichaam" + +#: src/settings_translation_file.cpp msgid "Slice w" -msgstr "Slice w" +msgstr "Doorsnede w" #: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights." @@ -6613,20 +6983,14 @@ msgstr "Sluipsnelheid" msgid "Sneaking speed, in nodes per second." msgstr "Sluipsnelheid, in blokken per seconde." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Radius zachte schaduwen" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Geluid" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Sluipen toets" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key for climbing/descending" -msgstr "Gebruik de 'gebruiken'-toets voor klimmen en dalen" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6646,6 +7010,22 @@ msgid "" "Note that mods or games may explicitly set a stack for certain (or all) " "items." msgstr "" +"Bepaalt de standaard stack grootte van nodes, items en tools.\n" +"Merk op dat mods of spellen expliciet een stack kunnen maken voor sommige " +"(of alle) items." + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Verspeid een volledige update van de schaduwmap over het opgegeven aantal " +"frames.\n" +"Hogere waarden kunnen schaduwen \"laggy\" maken, lagere\n" +"waarden kosten meer moeite.\n" +"Minimumwaarde: 1; maximumwaarde: 16" #: src/settings_translation_file.cpp msgid "" @@ -6666,23 +7046,16 @@ msgid "Steepness noise" msgstr "Steilte ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Step mountain size noise" -msgstr "Bergen ruis" +msgstr "Trap-Bergen grootte ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Step mountain spread noise" -msgstr "Bergen ruis" +msgstr "Trap-Bergen verspreiding ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." -msgstr "Sterkte van de parallax." - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Sterkte van de normal-maps." +msgstr "Sterkte van de 3D modus parallax." #: src/settings_translation_file.cpp msgid "" @@ -6715,6 +7088,22 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"Oppervlaktehoogte van optioneel water, geplaatst op een vaste laag van een " +"zwevend eiland.\n" +"Water is standaard uitgeschakeld en zal enkel gemaakt worden als deze waarde " +"is gezet op \n" +"een waarde groter dan 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (het " +"begin van de\n" +"bovenste afschuining).\n" +"***WAARSCHUWING, MOGELIJK GEVAAR VOOR WERELDEN EN SERVER PERFORMANTIE***:\n" +"Als er water geplaatst wordt op zwevende eilanden, dan moet dit " +"geconfigureerd en getest worden,\n" +"dat het een vaste laag betreft met de instelling 'mgv7_floatland_density' op " +"2.0 (of andere waarde\n" +"afhankelijk van de waarde 'mgv7_np_floatland'), om te vermijden \n" +"dat er server-intensieve water verplaatsingen zijn en om ervoor te zorgen " +"dat het wereld oppervlak \n" +"eronder niet overstroomt." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6726,28 +7115,28 @@ msgstr "Temperatuurvariatie voor biomen." #: src/settings_translation_file.cpp #, fuzzy +msgid "Temporary Settings" +msgstr "Instellingen" + +#: src/settings_translation_file.cpp msgid "Terrain alternative noise" -msgstr "Terrain_alt ruis" +msgstr "Terrein alteratieve ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain base noise" -msgstr "Terrein hoogte" +msgstr "Terrein basis ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain height" msgstr "Terrein hoogte" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain higher noise" -msgstr "Terrein hoogte" +msgstr "Terrein hoger ruis" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain noise" -msgstr "Terrein hoogte" +msgstr "Terrein ruis" #: src/settings_translation_file.cpp msgid "" @@ -6777,6 +7166,16 @@ msgstr "Terrein persistentie ruis" msgid "Texture path" msgstr "Textuur pad" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Grootte textuur om de schaduwmap op te renderen.\n" +"Dit moet een macht van twee zijn.\n" +"Grotere numbers zorgen voor betere schaduwen maar kosten ook meer moeite." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6801,6 +7200,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "De URL voor de inhoudsrepository" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "De dode zone van de joystick" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6857,7 +7260,6 @@ msgstr "" "van beschikbare voorrechten op de server." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The radius of the volume of blocks around every player that is subject to " "the\n" @@ -6873,31 +7275,32 @@ msgstr "" "In actieve blokken worden objecten geladen en ABM's uitgevoerd. \n" "Dit is ook het minimumbereik waarin actieve objecten (mobs) worden " "onderhouden. \n" -"Dit moet samen met active_object_range worden geconfigureerd." +"Dit moet samen met active_object_send_range_blocks worden geconfigureerd." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"De rendering back-end voor Irrlicht. \n" -"Na het wijzigen hiervan is een herstart vereist. \n" -"Opmerking: op Android, blijf bij OGLES1 als je het niet zeker weet! Anders " -"start de app mogelijk niet. \n" -"Op andere platforms wordt OpenGL aanbevolen en het is de enige driver met \n" -"shader-ondersteuning momenteel." +"Back-end om mee te renderen.\n" +"Een herstart is vereist om dit definitief te wijzigen.\n" +"Opmerking: Op Android, blijf bij OGLES1 als je het niet zeker weet! Anders " +"start de app mogelijk niet.\n" +"Op andere platformen wordt OpenGL aanbevolen.\n" +"Zowel OpenGL (alleen op desktop) als OGLES2 (experimenteel) ondersteunen " +"shaders" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" -"De gevoeligheid van de assen van de joystick voor het bewegen van de " -"frustrum in het spel." +"De gevoeligheid van de assen van de joystick bij\n" +"het bewegen van de camera-frustum in het spel." #: src/settings_translation_file.cpp msgid "" @@ -6922,22 +7325,29 @@ msgstr "" "items\n" "uit de rij verwijderd. Gebruik 0 om dit uit te zetten." +#: 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 "" +"Het tijdsbudget dat toegestaan wordt aan ABM's om elke stap uit te voeren\n" +"(als een deel van het ABM interval)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" "when holding down a joystick button combination." msgstr "" -"De tijd in seconden tussen herhaalde klikken als de joystick-knop ingedrukt " -"gehouden wordt." +"De tijd in seconden tussen herhaalde klikken als de joystick-knop\n" +" ingedrukt gehouden wordt." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"De tijd in seconden tussen herhaalde rechts-klikken als de rechter muisknop\n" +"De tijd in seconden tussen herhaalde rechts-klikken als de plaats knop " +"(rechter muisknop)\n" "ingedrukt gehouden wordt." #: src/settings_translation_file.cpp @@ -6957,9 +7367,10 @@ msgstr "" "'altitude_dry' is ingeschakeld." #: src/settings_translation_file.cpp -#, fuzzy msgid "Third of 4 2D noises that together define hill/mountain range height." -msgstr "Eerste van 2 3D geluiden voor tunnels." +msgstr "" +"Derde van vier 2D geluiden die samen voor heuvel/bergketens hoogte " +"definiëren." #: src/settings_translation_file.cpp msgid "" @@ -6983,7 +7394,8 @@ msgid "Time speed" msgstr "Tijdsnelheid" #: 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 "" "Tijdsduur waarna de cliënt ongebruikte wereldgegevens uit het geheugen " "verwijdert." @@ -7009,9 +7421,21 @@ msgid "Tooltip delay" msgstr "Tooltip tijdsduur" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touch screen threshold" -msgstr "Strand geluid grenswaarde" +msgstr "Gevoeligheid van het aanraakscherm" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Touchscreen" +msgstr "Gevoeligheid van het aanraakscherm" + +#: 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" @@ -7019,17 +7443,16 @@ msgstr "Bomen ruis" #: src/settings_translation_file.cpp msgid "Trilinear filtering" -msgstr "Tri-Lineare Filtering" +msgstr "Trilineair filteren" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" "Usable to make minimap smoother on slower machines." msgstr "" -"Aan = 256\n" -"Uit = 128\n" +"True = 256\n" +"False = 128\n" "Gebruik dit om de mini-kaart sneller te maken op langzamere machines." #: src/settings_translation_file.cpp @@ -7045,7 +7468,6 @@ msgid "Undersampling" msgstr "Rendering" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Undersampling is similar to using a lower screen resolution, but it applies\n" "to the game world only, keeping the GUI intact.\n" @@ -7056,8 +7478,9 @@ msgstr "" "Onderbemonstering is gelijkaardig aan het gebruik van een lagere " "schermresolutie,\n" "maar het behelst enkel de spel wereld. De GUI resolutie blijft intact.\n" -"Dit zou een gewichtige prestatie verbetering moeten geven ten koste van een " -"verminderde detailweergave." +"Dit zou een duidelijke prestatie verbetering moeten geven ten koste van een " +"verminderde detailweergave.\n" +"Hogere waarden resulteren in een minder gedetailleerd beeld." #: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" @@ -7072,9 +7495,8 @@ msgid "Upper Y limit of dungeons." msgstr "Bovenste Y-limiet van kerkers." #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "Bovenste Y-limiet van kerkers." +msgstr "Bovenste Y-limiet van zwevende eilanden." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -7086,53 +7508,70 @@ msgstr "Toon wolken in de achtergrond van het hoofdmenu." #: src/settings_translation_file.cpp msgid "Use anisotropic filtering when viewing at textures from an angle." -msgstr "Gebruik anisotropische filtering voor texturen getoond onder een hoek." +msgstr "Gebruik anisotropisch filteren voor texturen getoond onder een hoek." #: src/settings_translation_file.cpp msgid "Use bilinear filtering when scaling textures." -msgstr "Gebruik bi-lineaire filtering bij het schalen van texturen." +msgstr "Gebruik bilineair filteren bij het schalen van texturen." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" -"Gebruik mip-mapping om texturen te schalen. Kan de prestaties enigszins " -"verbeteren, \n" -"vooral bij gebruik van een textuurpakket met hoge resolutie. \n" +"Mipmapping gebruiken om texturen te schalen. Kan performantie lichtjes\n" +"verbeteren, vooral in combinatie met textuurpakketten van hoge resolutie.\n" "Gamma-correcte verkleining wordt niet ondersteund." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Gebruik multi-sample anti-aliasing (MSAA) om de randen van de blokken glad " +"te maken.\n" +"Dit algoritme maakt de 3D viewport glad en houdt intussen het beeld scherp,\n" +"zonder de binnenkant van de texturen te wijzigen\n" +"(wat erg opvalt bij transparante texturen)\n" +"Zichtbare ruimtes verschijnen tussen nodes als de shaders uitgezet zijn.\n" +"Als de waarde op 0 staat, is MSAA uitgeschakeld.\n" +"Een herstart is nodig om deze wijziging te laten functioneren." + #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." -msgstr "Gebruik tri-lineaire filtering om texturen te schalen." +msgstr "Gebruik trilineair filteren om texturen te schalen." + +#: src/settings_translation_file.cpp +msgid "User Interfaces" +msgstr "" #: src/settings_translation_file.cpp msgid "VBO" msgstr "VBO" #: src/settings_translation_file.cpp -#, fuzzy msgid "VSync" -msgstr "V-Sync" +msgstr "Vertikale synchronisatie (VSync)" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley depth" msgstr "Vallei-diepte" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley fill" msgstr "Vallei-vulling" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley profile" msgstr "Vallei-profiel" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley slope" msgstr "Vallei-helling" @@ -7169,9 +7608,8 @@ msgstr "" "Definieert de 'persistence' waarde voor terrain_base en terrain_alt ruis." #: src/settings_translation_file.cpp -#, fuzzy msgid "Varies steepness of cliffs." -msgstr "Bepaalt steilheid/hoogte van heuvels." +msgstr "Bepaalt steilheid/hoogte van kliffen." #: src/settings_translation_file.cpp msgid "Vertical climbing speed, in nodes per second." @@ -7186,9 +7624,8 @@ msgid "Video driver" msgstr "Video driver" #: src/settings_translation_file.cpp -#, fuzzy msgid "View bobbing factor" -msgstr "Loopbeweging" +msgstr "Loopbeweging factor" #: src/settings_translation_file.cpp msgid "View distance in nodes." @@ -7211,24 +7648,22 @@ msgid "Viewing range" msgstr "Zichtafstand" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Virtuele joystick activeert aux-knop" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Virtuele joystick activeert Aux1-toets" #: src/settings_translation_file.cpp msgid "Volume" msgstr "Geluidsniveau" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" -"Schakelt parallax occlusie mappen in.\n" -"Dit vereist dat shaders ook aanstaan." +"Volume van alle geluiden.\n" +"Dit vereist dat het geluidssysteem aanstaat." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "W coordinate of the generated 3D slice of a 4D fractal.\n" "Determines which 3D slice of the 4D shape is generated.\n" @@ -7238,6 +7673,7 @@ msgid "" msgstr "" "W-coördinaat van de 3D doorsnede van de 4D vorm.\n" "Bepaalt welke 3D-doorsnelde van de 4D-vorm gegenereerd wordt.\n" +"Verandert de vorm van de fractal.\n" "Heeft geen effect voor 3D-fractals.\n" "Bereik is ongeveer -2 tot 2." @@ -7270,29 +7706,29 @@ msgid "Waving leaves" msgstr "Bewegende bladeren" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" -msgstr "Bewegende nodes" +msgstr "Bewegende vloeistoffen" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "Golfhoogte van water" +msgstr "Golfhoogte van water/vloeistoffen" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" -msgstr "Golfsnelheid van water" +msgstr "Golfsnelheid van water/vloeistoffen" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" -msgstr "Golflengte van water" +msgstr "Golflengte van water/vloeistoffen" #: src/settings_translation_file.cpp msgid "Waving plants" msgstr "Bewegende planten" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Kleur weblinks" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7318,37 +7754,33 @@ msgstr "" "terug naar het werkgeheugen." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" -"Als bi-lineaire, tri-lineaire of anisotropische filters gebruikt worden, " -"dan\n" -"kunnen lage-resolutie texturen vaag worden. Verhoog hun resolutie dmv\n" -"naaste-buur-interpolatie zodat de scherpte behouden blijft. Deze optie\n" -"bepaalt de minimale textuurgroote na het verhogen van de resolutie. Hogere\n" -"waarden geven een scherper beeld, maar kosten meer geheugen. Het is " -"aanbevolen\n" -"machten van 2 te gebruiken. Een waarde groter dan 1 heeft wellicht geen " -"zichtbaar\n" -"effect indien bi-lineaire, tri-lineaire of anisotropische filtering niet aan " -"staan." +"Bij gebruik bilineair/trilineair/anisotropisch filteren kunnen texturen van\n" +"lage resolutie vaag worden; verhoog daardoor hun resolutie d.m.v.\n" +"\"naaste-buur-interpolatie\" om ze scherper te houden. Deze optie bepaalt\n" +"de minimale textuurgrootte na het omhoog schalen; hogere waarden geven\n" +"scherper beeld, maar kosten meer geheugen. Het is aanbevolen machten van\n" +"2 te gebruiken. Deze optie heeft enkel effect als bilineair, trilineair of\n" +"anisotropisch filteren aan staan.\n" +"Deze optie geldt ook als textuurgrootte van basisnodes voor\n" +"automatisch en met de wereld gealigneerd omhoog schalen van texturen." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." -msgstr "Gebruik freetype fonts. Dit vereist dat freetype ingecompileerd is." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" +"Of achtergronden van naam-tags standaard getoond moeten worden.\n" +"Mods kunnen alsnog een achtergrond instellen." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7380,19 +7812,27 @@ msgstr "" "Maak het einde van het zichtbereik mistig, zodat het einde niet opvalt." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Whether to mute sounds. You can unmute sounds at any time, unless the\n" "sound system is disabled (enable_sound=false).\n" "In-game, you can toggle the mute state with the mute key or by using the\n" "pause menu." msgstr "" -"Of geluiden moeten worden gedempt. U kunt het dempen van geluiden op elk " -"moment opheffen, tenzij de \n" +"Of geluiden moeten worden gedempt. Je kan het dempen van geluiden op elk " +"moment opheffen, tenzij het \n" "geluidssysteem is uitgeschakeld (enable_sound = false). \n" -"In de game kun je de mute-status wijzigen met de mute-toets of door de te " -"gebruiken \n" -"pauzemenu." +"Tijdens het spel kan je de mute-status wijzigen met de mute-toets of door " +"het pauzemenu \n" +"te gebruiken." + +#: 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 "" @@ -7402,13 +7842,16 @@ msgstr "" "toets)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Aanvangsbreedte van het venster." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Breedtecomponent van de initiële grootte van het venster. Wordt genegeerd in " +"fullscreen-modus." #: src/settings_translation_file.cpp -#, fuzzy msgid "Width of the selection box lines around nodes." -msgstr "Breedte van de lijnen om een geselecteerde node." +msgstr "" +"Breedte van de selectie-lijnen die getekend worden rond een geselecteerde " +"node." #: src/settings_translation_file.cpp msgid "" @@ -7430,9 +7873,8 @@ msgstr "" "gestart." #: src/settings_translation_file.cpp -#, fuzzy msgid "World start time" -msgstr "Wereld naam" +msgstr "Wereld starttijd" #: src/settings_translation_file.cpp msgid "" @@ -7469,9 +7911,8 @@ msgstr "" "bergen verticaal te verschuiven." #: src/settings_translation_file.cpp -#, fuzzy msgid "Y of upper limit of large caves." -msgstr "Minimale diepte van grote semi-willekeurige grotten." +msgstr "bovenste limiet Y-waarde van grote grotten." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." @@ -7484,6 +7925,13 @@ 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 "" +"Y-afstand over dewelke de zwevende eilanden veranderen van volledige " +"densiteit naar niets.\n" +"De verandering start op deze afstand van de Y limiet.\n" +"Voor een solide zwevend eiland, bepaalt deze waarde de hoogte van de heuvels/" +"bergen.\n" +"Deze waarde moet lager zijn of gelijk aan de helft van de afstand tussen de " +"Y limieten." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." @@ -7494,122 +7942,48 @@ msgid "Y-level of cavern upper limit." msgstr "Y-niveau van hoogste limiet voor grotten." #: src/settings_translation_file.cpp -#, fuzzy msgid "Y-level of higher terrain that creates cliffs." -msgstr "Y-niveau van lager terrein en vijver bodems." +msgstr "Y-niveau van hoger terrein dat kliffen genereert." #: src/settings_translation_file.cpp -#, fuzzy msgid "Y-level of lower terrain and seabed." -msgstr "Y-niveau van lager terrein en vijver bodems." +msgstr "Y-niveau van lager terrein en vijver/zee bodems." #: src/settings_translation_file.cpp msgid "Y-level of seabed." msgstr "Y-niveau van zee bodem." +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "timeout voor cURL download" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "cURL interactieve time-out" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Maximaal parallellisme in cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL time-out" +#~ msgid "- Creative Mode: " +#~ msgstr "- Creatieve Modus: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Cinematic modus aan/uit" - -#, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Selecteer Modbestand:" - -#, fuzzy -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Minimale diepte van grote semi-willekeurige grotten." - -#~ msgid "Waving Water" -#~ msgstr "Golvend water" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Y-niveau tot waar de schaduw van drijvend land reikt." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "Y-niveau van drijvend land middelpunt en vijver oppervlak." - -#~ msgid "Waving water" -#~ msgstr "Golvend water" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variatie van de heuvel hoogte en vijver diepte op drijvend egaal terrein." - -#, fuzzy -#~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." -#~ msgstr "" -#~ "Typisch maximum hoogte, boven en onder het middelpunt van drijvend berg " -#~ "terrein." - -#~ msgid "This font will be used for certain languages." -#~ msgstr "Dit font wordt gebruikt voor bepaalde talen." - -#~ msgid "Shadow limit" -#~ msgstr "Schaduw limiet" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Pad van TrueType font of bitmap." - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "Diepte van grote grotten" - -#~ msgid "IPv6 support." -#~ msgstr "IPv6 ondersteuning." - -#, fuzzy -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Fontschaduw alphawaarde (ondoorzichtigheid, tussen 0 en 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Drijvend gebergte hoogte" - -#~ msgid "Floatland base height noise" -#~ msgstr "Drijvend land basis hoogte ruis" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Schakelt filmisch tone-mapping in" - -#~ msgid "Enable VBO" -#~ msgstr "VBO aanzetten" +#~ msgid "- Damage: " +#~ msgstr "- Verwondingen: " #~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Bepaalt gebieden van drijvend glijdend terrein.\n" -#~ "Drijvend glijdend terrein ontstaat wanneer ruis > 0." +#~ "0 = parallax occlusie met helling-informatie (sneller).\n" +#~ "1 = 'reliëf mapping' (lanzamer, nauwkeuriger)." -#, fuzzy -#~ msgid "Darkness sharpness" -#~ msgstr "Steilheid Van de meren" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Bepaalt breedte van tunnels, een kleinere waarde maakt bredere tunnels." - -#, fuzzy -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Bepaalt de dichtheid van drijvende bergen.\n" -#~ "Dit wordt bijgevoegd bij de 'np_mountain' ruis waarde." +#~ msgid "Address / Port" +#~ msgstr "Server adres / Poort" #, fuzzy #~ msgid "" @@ -7621,20 +7995,430 @@ msgstr "cURL time-out" #~ "Deze instelling wordt enkel gebruikt door de cliënt, en wordt genegeerd " #~ "door de server." -#~ msgid "Path to save screenshots at." -#~ msgstr "Pad waar screenshots bewaard worden." - -#~ msgid "Parallax occlusion strength" -#~ msgstr "Parallax occlusie sterkte" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Emerge-wachtrij voor lezen" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "$1 wordt gedownload, een ogenblik geduld alstublieft..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Weet je zeker dat je jouw wereld wilt resetten?" #~ msgid "Back" #~ msgstr "Terug" +#~ msgid "Basic" +#~ msgstr "Basis" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Aantal bits per pixel (oftewel: kleurdiepte) in full-screen modus." + +#~ msgid "Bump Mapping" +#~ msgstr "Bumpmapping" + +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmapping" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Verandert de gebruikersinterface van het hoofdmenu: \n" +#~ "- Volledig: meerdere werelden voor één speler, spelkeuze, de kiezer van " +#~ "textuurpak, etc. \n" +#~ "- Eenvoudig: één wereld voor één speler, geen game- of texture pack-" +#~ "kiezers. Kan zijn \n" +#~ "noodzakelijk voor kleinere schermen." + +#~ msgid "Config mods" +#~ msgstr "Mods configureren" + +#~ msgid "Configure" +#~ msgstr "Instellingen" + +#~ msgid "Connect" +#~ msgstr "Verbinden" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Regelt de zinksnelheid in vloeistof." + +#, fuzzy +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Bepaalt de dichtheid van drijvende bergen.\n" +#~ "Dit wordt bijgevoegd bij de 'np_mountain' ruis waarde." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Bepaalt breedte van tunnels, een kleinere waarde maakt bredere tunnels." + +#~ msgid "Credits" +#~ msgstr "Credits" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Draadkruis-kleur (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Verwondingen ingeschakeld" + +#, fuzzy +#~ msgid "Darkness sharpness" +#~ msgstr "Steilheid Van de meren" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Standaard time-out voor cURL, in milliseconden.\n" +#~ "Wordt alleen gebruikt indien gecompileerd met cURL ingebouwd." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Bepaalt gebieden van drijvend glijdend terrein.\n" +#~ "Drijvend glijdend terrein ontstaat wanneer ruis > 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Bemonsterings-interval voor texturen.\n" +#~ "Een hogere waarde geeft vloeiender normal maps." + +#~ msgid "Del. Favorite" +#~ msgstr "Verwijder Favoriete" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Download een subspel, zoals Minetest Game, van minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Laad er een van minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "$1 wordt gedownload, een ogenblik geduld alstublieft..." + +#~ msgid "Enable VBO" +#~ msgstr "VBO aanzetten" + +#~ msgid "Enable register confirmation" +#~ msgstr "Registerbevestiging inschakelen" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Bumpmapping aanzetten voor texturen. Normalmaps moeten al in de texture " +#~ "pack zitten\n" +#~ "of ze moeten automatisch gegenereerd worden.\n" +#~ "Schaduwen moeten aanstaan." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Schakelt filmisch tone-mapping in" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Schakelt het genereren van normal maps in (emboss effect).\n" +#~ "Dit vereist dat bumpmapping ook aan staat." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Schakelt parallax occlusie mappen in.\n" +#~ "Dit vereist dat shaders ook aanstaan." + +#~ msgid "Enter " +#~ msgstr "Enter " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Experimentele optie. Kan bij een waarde groter dan 0 zichtbare\n" +#~ "ruimtes tussen blokken tot gevolg hebben." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS in het pauze-menu" + +#~ msgid "Fallback font shadow" +#~ msgstr "Terugval-font schaduw" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Terugval-font schaduw alphawaarde" + +#~ msgid "Fallback font size" +#~ msgstr "Terugval-fontgrootte" + +#~ msgid "Filtering" +#~ msgstr "Filters" + +#~ msgid "Floatland base height noise" +#~ msgstr "Drijvend land basis hoogte ruis" + +#~ msgid "Floatland mountain height" +#~ msgstr "Drijvend gebergte hoogte" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Fontschaduw alphawaarde (ondoorzichtigheid, tussen 0 en 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Lettergrootte van het fallback-lettertype in punt (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Freetype lettertypes" + +#~ msgid "Full screen BPP" +#~ msgstr "BPP bij volledig scherm" + +#~ msgid "Game" +#~ msgstr "Spel" + +#, fuzzy +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Genereer normale werelden" + +#~ msgid "Generate normalmaps" +#~ msgstr "Genereer normaalmappen" + +#~ msgid "HUD scale factor" +#~ msgstr "HUD schaal factor" + +#~ msgid "High-precision FPU" +#~ msgstr "Hoge-nauwkeurigheid FPU" + +#~ msgid "IPv6 support." +#~ msgstr "IPv6 ondersteuning." + +#~ msgid "In-Game" +#~ msgstr "Spel" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Installeer: bestand: \"$1\"" + +#~ msgid "Instrumentation" +#~ msgstr "Per soort" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Sneltoetsen. (Als dit menu stuk gaat, verwijder dan instellingen uit " +#~ "minetest.conf)" + +#, fuzzy +#~ msgid "Lava depth" +#~ msgstr "Diepte van grote grotten" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Emerge-wachtrij voor lezen" + +#~ msgid "Main" +#~ msgstr "Hoofdmenu" + +#~ msgid "Main menu style" +#~ msgstr "Hoofdmenu stijl" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "Maakt dat DirectX werkt met LuaJIT. Schakel dit uit als het problemen " +#~ "geeft." + +#~ msgid "Menus" +#~ msgstr "Menu's" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Mini-kaart in radar modus, Zoom x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Mini-kaart in radar modus, Zoom x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minimap in oppervlaktemodus, Zoom x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minimap in oppervlaktemodus, Zoom x4" + +#~ msgid "Name / Password" +#~ msgstr "Naam / Wachtwoord" + +#~ msgid "Name/Password" +#~ msgstr "Naam / Wachtwoord" + +#~ msgid "No" +#~ msgstr "Nee" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Normal-maps bemonstering" + +#~ msgid "Normalmaps strength" +#~ msgstr "Sterkte van normal-maps" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Aantal parallax occlusie iteraties." + #~ msgid "Ok" #~ msgstr "Oké" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Ondoorzichtigheid (alpha) van de schaduw achter het fallback-lettertype, " +#~ "tussen 0 en 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "" +#~ "Algemene afwijking van het parallax occlusie effect. Normaal: schaal/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Algemene schaal van het parallax occlusie effect." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax occlusie" + +#~ msgid "Parallax occlusion" +#~ msgstr "Parallax occlusie" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Parallax occlusie afwijking" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Parallax occlusie iteraties" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Parallax occlusie modus" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Parallax occlusie schaal" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Parallax occlusie sterkte" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Pad van TrueType font of bitmap." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Pad waar screenshots bewaard worden." + +#~ msgid "Player name" +#~ msgstr "Spelernaam" + +#~ msgid "Profiling" +#~ msgstr "Profileren" + +#~ msgid "PvP enabled" +#~ msgstr "Spelergevechten ingeschakeld" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Reset Singleplayer wereld" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Selecteer Modbestand:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Server / Singleplayer" + +#~ msgid "Shadow limit" +#~ msgstr "Schaduw limiet" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Fontschaduw afstand van het standaard lettertype (in beeldpunten). Indien " +#~ "0, dan wordt geen schaduw getekend." + +#~ msgid "Special" +#~ msgstr "Speciaal" + +#~ msgid "Special key" +#~ msgstr "Speciaal ( Aux ) toets" + +#~ msgid "Start Singleplayer" +#~ msgstr "Start Singleplayer" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Sterkte van de normal-maps." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Dit font wordt gebruikt voor bepaalde talen." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Om schaduwen mogelijk te maken moet OpenGL worden gebruikt." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Cinematic modus aan/uit" + +#, fuzzy +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Typisch maximum hoogte, boven en onder het middelpunt van drijvend berg " +#~ "terrein." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variatie van de heuvel hoogte en vijver diepte op drijvend egaal terrein." + +#~ msgid "View" +#~ msgstr "Bekijk" + +#~ msgid "Waving Water" +#~ msgstr "Golvend water" + +#~ msgid "Waving water" +#~ msgstr "Golvend water" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Gebruik freetype lettertypes, dit vereist dat freetype lettertype " +#~ "ondersteuning ingecompileerd is.\n" +#~ "Indien uitgeschakeld, zullen bitmap en XML verctor lettertypes gebruikt " +#~ "worden." + +#, fuzzy +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Minimale diepte van grote semi-willekeurige grotten." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "Y-niveau van drijvend land middelpunt en vijver oppervlak." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Y-niveau tot waar de schaduw van drijvend land reikt." + +#~ 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 "" +#~ "U staat op het punt om voor het eerst lid te worden van deze server met " +#~ "de naam \"%s\". \n" +#~ "Als u doorgaat, wordt op deze server een nieuw account gemaakt met uw " +#~ "inloggegevens. \n" +#~ "Voer uw wachtwoord opnieuw in en klik op 'Registreren en aanmelden' om " +#~ "het aanmaken van een account te bevestigen, of klik op 'Annuleren' om af " +#~ "te breken." + +#~ msgid "You died." +#~ msgstr "Je bent gestorven." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/nn/minetest.po b/po/nn/minetest.po index 9a0b036d3..d3e8a59dd 100644 --- a/po/nn/minetest.po +++ b/po/nn/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Norwegian Nynorsk (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-03-31 10:14+0000\n" -"Last-Translator: sfan5 <sfan5@live.de>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-07-16 23:20+0000\n" +"Last-Translator: Tor Egil Hoftun Kvæstad <toregilhk@hotmail.com>\n" "Language-Team: Norwegian Nynorsk <https://hosted.weblate.org/projects/" "minetest/minetest/nn/>\n" "Language: nn\n" @@ -12,7 +12,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.0-dev\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Tom kommando." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Gå ut til hovudmeny" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Ugyldig kommando: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Gitt kommando: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "List opp spelarar som er online" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Spelarar som er online: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,14 +58,44 @@ msgstr "Du har kome at" msgid "You died" msgstr "Du døydde" -#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp -msgid "OK" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Tilgjengelege kommandoar:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Tilgjengelege kommandoar: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Kommandoen er ikkje tilgjengeleg: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Få hjelp med kommandoar" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Nytt '.help <kommando>' for å få meir informasjon, eller '.help all' for å " +"liste opp alt." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" msgstr "" +#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp +msgid "OK" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<ingen tilgjengeleg>" + #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred in a Lua script:" -msgstr "Ein feil har skjedd med eit Lua manus, slik som ein mod:" +msgstr "Ein feil oppstod i eit LUA-skript:" #: builtin/fstk/ui.lua msgid "An error occurred:" @@ -41,15 +107,36 @@ msgstr "Hovudmeny" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "Kople attende sambandet" +msgstr "Kople til igjen" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "Tenarmaskinen ber om å få forbindelsen attende:" +msgstr "Tenaren har førespurt å kople til igjen:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Laster ned..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Vel modifikasjonar" + +#: 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. " @@ -57,98 +144,102 @@ msgstr "Protkoll versjon bommert. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " -msgstr "Tenarmaskinen krevjar protokoll versjon $1. " +msgstr "Tenaren krev protokoll versjon $1. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " -msgstr "Tenarmaskinen støttar protokoll versjonar mellom $1 og $2. " +msgstr "Tenaren støtter protokollversjonar mellom $1 og $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Forsøkje å kople attende den offentlege tenarmaskin-lista og sjekk sambands " -"koplingen." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." -msgstr "Vi støttar berre protokoll versjon $1." +msgstr "Me støtter berre protokoll versjon $1." #: builtin/mainmenu/common.lua msgid "We support protocol versions between version $1 and $2." -msgstr "Vi støttar protokoll versjonar mellom $1 og $2." +msgstr "Me støtter protokollversjonar mellom $1 og $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Avbryt" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Avhengigheiter:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable all" -msgstr "Deaktiver allt" +msgstr "Deaktiver alt" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "Deaktivere modifikasjons-pakka" +msgstr "Deaktiver modifikasjonspakken" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "Aktiver allt" +msgstr "Aktiver alt" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" -msgstr "Aktiver modifikasjons-pakka" +msgstr "Aktiver modifikasjonspakken" #: 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 "" -"Fåfengt å aktivere modifikasjon \"$1\" sia den innehald ugyldige teikn. " -"Berre teikna [a-z0-9_] e tillaten." +"Klarte ikkje å aktivere modifikasjon «$1», då den inneheld ugyldige teikn. " +"Berre teikna [a-z0-9_] er tillatne." #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Finn fleire modifikasjonar" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Modifikasjon:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No (optional) dependencies" -msgstr "Valgbare avhengigheiter:" +msgstr "Ingen (valfrie) avhengigheiter" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." msgstr "Ikkje nokon spill skildring e sørgja for." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "Ikkje nokon avhengigheiter." +msgstr "Ingen obligatoriske avhengigheiter" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." msgstr "Ikkje noko modifikasjons-pakke skildring e sørgja for." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No optional dependencies" -msgstr "Valgbare avhengigheiter:" +msgstr "Ingen valfrie avhengigheiter" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" -msgstr "Valgbare avhengigheiter:" +msgstr "Valfrie avhengigheiter:" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp @@ -157,35 +248,73 @@ msgstr "Lagre" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" -msgstr "Verda:" +msgstr "Verd:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" -msgstr "Aktivert" +msgstr "aktivert" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "«$1» eksisterer allereie. Vil du overskrive den?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 og $2 avhengigheiter vil verte installerte." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 lastar ned,\n" +"$2 i kø" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 lastar ned …" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 obligatoriske avhengigheiter vart ikkje funne." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 vil verte installert, og $2 avhengigheiter vil verte hoppa over." #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Alle pakker" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Allereie installert" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Attende til hovudmeny" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Basisspel:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB er ikkje tilgjengeleg når Minetest vart kompilert utan cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Laster ned..." +msgstr "Lastar ned …" #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" -msgstr "Fåfengt å laste ned $1" +msgstr "Klarte ikkje å laste ned $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Spel" @@ -194,22 +323,48 @@ msgid "Install" msgstr "Installer" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Installer $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Installer manglande avhengigheiter" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Installasjon: Filtypen er ikkje støtta, eller arkivet er korrupt" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" -msgstr "Modder" +msgstr "Modifikasjonar" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" -msgstr "Ikkje nokon pakkar kunne bli henta" +msgstr "Ingen pakkar kunne verte henta" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" -msgstr "Ikkje noko resultat" +msgstr "Ingen resultat" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Søk" +msgid "No updates" +msgstr "Ingen oppdateringar" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Ikkje funnen" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Overskriv" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Ver venleg å sjekke at basisspelet er korrekt." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "I kø" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -224,16 +379,20 @@ msgid "Update" msgstr "Oppdater" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Oppdater alt [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Sjå meir informasjon i ein nettlesar" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "Ein verd med namnet \"$1\" finns allereie" +msgstr "Ein verd med namnet «$1» eksisterer allereie" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Ytterlegare terreng" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" @@ -245,37 +404,32 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Biome blending" -msgstr "" +msgstr "Biomblanding" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" -msgstr "" +msgstr "Biom" #: builtin/mainmenu/dlg_create_world.lua msgid "Caverns" -msgstr "" +msgstr "Holer" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Oktaver" +msgstr "Hòler" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Skap" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Informasjon:" +msgstr "Dekorasjonar" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Last ned eit spel, sånn som Minetest spellet, ifrå minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Last eit ned på minetest.net" +#, fuzzy +msgid "Development Test is meant for developers." +msgstr "Åtvaring: Utviklingstesten er meint for utviklarar." #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -283,27 +437,23 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Flatt terreng" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "" +msgstr "Svevande landmassar på himmelen" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Spel" +msgstr "Flyteland (eksperimentell)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Generer ikkjefraktalterreng: Hav og undergrunn" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Haugar" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" @@ -311,15 +461,24 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" +msgstr "Aukar fuktigheita rundt elver" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Installer $1" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "Sjøar" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgstr "Låg fuktigheit og høg temperatur fører til grunne eller tørre elver" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -335,15 +494,15 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "Fjell" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Leireflyt" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Nettverk av tunellar og holer" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -359,11 +518,11 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Rivers" -msgstr "" +msgstr "Elver" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Elver på havnivå" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -386,36 +545,31 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Temperert, Ørken" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Temperert, Ørken, Jungel" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Temperert, Ørken, Jungel, Tundra, Taiga" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "Overflateerosjon på terreng" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Tre og jungelgras" #: builtin/mainmenu/dlg_create_world.lua msgid "Vary river depth" -msgstr "" +msgstr "Varier elvedjupne" #: 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 "Åtvaring: Den minimale utviklings-testen e meint for utviklare." +msgstr "Svært store holer djupt i undergrunnen" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -427,7 +581,7 @@ msgstr "Du har ikkje installert noko spel." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "Er du sikker på at du har lyst til å slette \"$1\"?" +msgstr "Er du sikker på at du vil slette «$1»?" #: builtin/mainmenu/dlg_delete_content.lua #: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua @@ -437,23 +591,55 @@ msgstr "Slett" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: failed to delete \"$1\"" -msgstr "pkgmgr: sletting av \"$1\" gjekk ikkje" +msgstr "pkgmgr: klarte ikkje å slette «$1»" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: invalid path \"$1\"" -msgstr "pkgmgr: ugyldig rute \"$1\"" +msgstr "pkgmgr: ugyldig sti «$1»" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "Slett verd \"$1\"?" +msgstr "Slett verd «$1»?" + +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Bekreft passord" + +#: 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 "Namn" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Passord" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "Passorda passar ikkje!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Registrer og bli med" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" -msgstr "Akseptér" +msgstr "Aksepter" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Omdøp Modpakka:" +msgstr "Døyp om modifikasjonspakken:" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "" @@ -469,17 +655,27 @@ msgstr "(Ikkje nokon skildring gjeven)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "2D Noise" -msgstr "To-dimensjonal lyd" +msgstr "2D-støy" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "< Attende til instillinger" +msgstr "< Tilbake til innstillingssida" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" msgstr "Bla gjennom" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Innhald" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Innhald" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Deaktivert" @@ -504,7 +700,8 @@ msgid "Offset" msgstr "Forskyvning" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Persistens" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -523,25 +720,29 @@ msgstr "Reetabler det normale" msgid "Scale" msgstr "Skala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Søk" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" -msgstr "Velje ein mappe" +msgstr "Vel katalog" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select file" -msgstr "Velje eit dokument" +msgstr "Vel 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 namn" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must be at least $1." -msgstr "Verdien må i det minste være $1." +msgstr "Verdien må minst vere $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must not be larger than $1." -msgstr "Verdien må ikkje være høgare enn $1." +msgstr "Verdien må ikkje vere større enn $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X" @@ -580,7 +781,7 @@ msgstr "Absolutt verdi" #. for noise settings in main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "defaults" -msgstr "Standard" +msgstr "standardar" #. ~ "eased" is a noise parameter flag. #. It is used to make the map smoother and @@ -596,35 +797,27 @@ msgstr "$1 (Aktivert)" #: builtin/mainmenu/pkgmgr.lua msgid "$1 mods" -msgstr "$1 modder" +msgstr "$1 modifikasjonar" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" -msgstr "Funka ikkje å installere $1 til $2" +msgstr "Klarte ikkje å installere $1 til $2" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" msgstr "" -"Installer modifikasjon: Funka ikkje å finne eit ekte modifikasjons namn for: " -"$1" +"Installer modifikasjon: Klarte ikkje å finne det reelle modifikasjonsnamnet " +"for: $1" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -"Installer Modifikasjon: Funka ikkje å finne ein passande for modpakke $1" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"Installer: Ikkje-støtta dokument type \"$1\" eller så funker ikkje arkivet" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Installer: dokument: \"$1\"" +"Installer modifikasjon: Klarte ikkje å finne ein passande katalog for " +"modifikasjonspakke $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" -msgstr "Funka ikkje å finne ein gyldig modifikasjon eller mod-pakke" +msgstr "Klarte ikkje å finne ein gyldig modifikasjon eller modifikasjonspakke" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a $1 as a texture pack" @@ -642,6 +835,59 @@ msgstr "Funka ikkje å installere modifikasjon som ein $1" msgid "Unable to install a modpack as a $1" msgstr "Funka ikkje å installere mod-pakka som ein $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Lastar …" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Den offentlege tenarlista er slått av" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Freist å slå på igjen den offentlege tenarlista, og sjekk Internett-" +"tilkoplinga di." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Om" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktive bidragsytarar" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Kjerne-utviklarar" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Velje ein mappe" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Tidlegare bidragsytarar" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Tidlegare kjerne-utviklarar" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Bla i nett-innhald" @@ -652,7 +898,7 @@ msgstr "Innhald" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" -msgstr "Deaktivér tekstur pakke" +msgstr "Deaktiver teksturpakke" #: builtin/mainmenu/tab_content.lua msgid "Information:" @@ -660,15 +906,15 @@ msgstr "Informasjon:" #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" -msgstr "Installer pakker:" +msgstr "Installerte pakker:" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." -msgstr "Ikkje nokon avhengigheiter." +msgstr "Ingen avhengigheiter." #: builtin/mainmenu/tab_content.lua msgid "No package description available" -msgstr "Ikkje nokon pakke skildring tilgjengelig" +msgstr "Inga pakkeskildring tilgjengeleg" #: builtin/mainmenu/tab_content.lua msgid "Rename" @@ -680,27 +926,7 @@ msgstr "Avinstallér pakka" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" -msgstr "Bruk tekstur pakke" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktive bidragere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Kjerne-utviklere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Medvirkende" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Førre bidragere" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Førre kjerne-utviklere" +msgstr "Bruk teksturpakke" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" @@ -711,32 +937,26 @@ msgid "Bind Address" msgstr "Blind stad" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigurér" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Kreativ stode" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Aktivér skading" #: builtin/mainmenu/tab_local.lua +#, fuzzy msgid "Host Game" msgstr "Bli husvert" #: builtin/mainmenu/tab_local.lua +#, fuzzy msgid "Host Server" msgstr "Bli tenarmaskin's vert" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Namn/passord" +msgstr "Installer spel frå ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -744,68 +964,89 @@ msgstr "Ny" #: builtin/mainmenu/tab_local.lua msgid "No world created or selected!" -msgstr "Ikkje noko verd skapt eller valgt!" +msgstr "Inga verd skapt eller valt!" #: builtin/mainmenu/tab_local.lua msgid "Play Game" msgstr "Ha i gang spel" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Vel modifikasjonar" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Vel verd:" #: builtin/mainmenu/tab_local.lua msgid "Server Port" -msgstr "Tenarmaskin port" +msgstr "Tenarport" #: builtin/mainmenu/tab_local.lua msgid "Start Game" msgstr "Start spel" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Stad/port" +msgid "Address" +msgstr "Adresse" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Kople i hop" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Rydd til side" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Kreativ stode" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Skade aktivert" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Skade / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Slett Favoritt" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favorittar" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favoritt" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Inkompatible tenarar" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Bli med i spel" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Namn/Passord" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Spelar mot spelar aktivert" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Offentlege tenarar" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Oppdater" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Slett Favoritt" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Tenarbeskriving" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -825,17 +1066,14 @@ msgstr "8x" #: builtin/mainmenu/tab_settings.lua msgid "All Settings" -msgstr "Alle instillinger" +msgstr "Alle innstillingar" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" msgstr "Kantutjemning:" #: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Er du sikker på at du vill tilbakestille enkel-spelar verd?" - -#: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Autosave Screen Size" msgstr "Automatisk sjerm størrelse" @@ -843,10 +1081,6 @@ msgstr "Automatisk sjerm størrelse" msgid "Bilinear Filter" msgstr "Bi-lineært filtréring" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Dunke kartlegging" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Endre nykeler" @@ -855,13 +1089,30 @@ msgstr "Endre nykeler" msgid "Connected Glass" msgstr "Kopla i hop glass" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dynamiske skuggar" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Dynamiske skuggar: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Fancy blader" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Generér normale kart" +msgid "High" +msgstr "Høg" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Låg" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Medium" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -871,10 +1122,6 @@ msgstr "Mipkart" msgid "Mipmap + Aniso. Filter" msgstr "Mipkart + Aniso. filter" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nei" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Inga filter" @@ -884,10 +1131,12 @@ msgid "No Mipmap" msgstr "Ingen Mipkart" #: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Node Highlighting" msgstr "Knute-fremheving" #: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Node Outlining" msgstr "Knute-utlinjing" @@ -903,31 +1152,30 @@ msgstr "Ugjennomsiktige blader" msgid "Opaque Water" msgstr "Ugjennomsiktig vatn" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parralax okklusjon" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" -msgstr "Partikkler" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Tilbakegå enkelspelar verd" +msgstr "Partiklar" #: builtin/mainmenu/tab_settings.lua msgid "Screen:" -msgstr "Sjerm:" +msgstr "Skjerm:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "Instillinger" +msgstr "Innstillingar" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +#, fuzzy msgid "Shaders" msgstr "Dybdeskaper" #: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "Dybdeskaper (ikkje tilgjengelig)" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Shaders (unavailable)" msgstr "Dybdeskaper (ikkje tilgjengelig)" @@ -943,16 +1191,14 @@ msgstr "Jevn belysning" msgid "Texturing:" msgstr "Teksturering:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "For å aktivere skumrings-effekt så må OpenGL driveren være i bruk." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +#, fuzzy msgid "Tone Mapping" msgstr "Tone kartlegging" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "Berøringsterskel: (px)" #: builtin/mainmenu/tab_settings.lua @@ -960,35 +1206,32 @@ msgid "Trilinear Filter" msgstr "Tri-lineær filtréring" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Leaves" -msgstr "Raslende lauv" +#, fuzzy +msgid "Very High" +msgstr "Svært høg" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Svært låg" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "Vaiande lauv" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Waving Liquids" -msgstr "Raslende lauv" +msgstr "Bølgjande væsker" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" -msgstr "Raslende planter" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ja" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Konfigurer modifikasjoner" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Hovud" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Start enkeltspelar oppleving" +msgstr "Vaiande planter" #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Tilkoplingsfeil (Tidsavbrot?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Nett-kopling er brutt." @@ -1002,23 +1245,24 @@ msgstr "Førebur noder" #: src/client/client.cpp msgid "Initializing nodes..." -msgstr "Førebur node..." +msgstr "Førebur nodar …" #: src/client/client.cpp msgid "Loading textures..." -msgstr "Lastar teksturar..." +msgstr "Lastar teksturar …" #: src/client/client.cpp +#, fuzzy msgid "Rebuilding shaders..." msgstr "Gjennbygger dybdeskaper..." #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "Kopling gikk galen (Tidsavbrott?)" +msgstr "Tilkoplingsfeil (Tidsavbrot?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Kunne ikkje finne eller ha i gang spelet \"" +msgid "Could not find or load game: " +msgstr "Kunne ikkje finne eller laste spel: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1029,8 +1273,9 @@ msgid "Main Menu" msgstr "Hovudmeny" #: src/client/clientlauncher.cpp +#, fuzzy msgid "No world selected and no address provided. Nothing to do." -msgstr "Ingen verd valgt og ikkje nokon adresse valg. Ikkje noko å gjere." +msgstr "Inga verd er vald og ikkje nokon adresse valg. Ikkje noko å gjere." #: src/client/clientlauncher.cpp msgid "Player name too long." @@ -1038,28 +1283,18 @@ msgstr "Spelarnamn for langt." #: src/client/clientlauncher.cpp msgid "Please choose a name!" -msgstr "Ver vennleg og velje eit anna namn!" +msgstr "Ver venleg å velje eit namn!" #: src/client/clientlauncher.cpp +#, fuzzy msgid "Provided password file failed to open: " msgstr "Passord dokumentet du ga går ikkje an å åpne: " #: src/client/clientlauncher.cpp +#, fuzzy msgid "Provided world path doesn't exist: " msgstr "Verds-ruta du ga finnes ikkje: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1072,14 +1307,6 @@ msgstr "" msgid "- Address: " msgstr "- Adresse: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Gude løyving: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Skade: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- modus: " @@ -1099,7 +1326,16 @@ msgstr "- Spelar mot spelar (PvP): " #: src/client/game.cpp msgid "- Server Name: " -msgstr "- Tenarmaskin namn: " +msgstr "- Tenarnamn: " + +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Ein serialiseringsfeil har oppstått:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" #: src/client/game.cpp msgid "Automatic forward disabled" @@ -1109,6 +1345,22 @@ msgstr "Automatiske framsteg er avtatt" msgid "Automatic forward enabled" msgstr "Automatiske framsteg er i gang" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Kamera oppdatering er deaktivert" @@ -1117,6 +1369,10 @@ msgstr "Kamera oppdatering er deaktivert" msgid "Camera update enabled" msgstr "Kamera oppdatering er aktivert" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Byt kodeord" @@ -1129,6 +1385,10 @@ msgstr "Filmatisk modus er avtatt" msgid "Cinematic mode enabled" msgstr "Filmatisk modus er i gang" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Klienten kopla frå" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Klient side-skildring er av" @@ -1137,9 +1397,13 @@ msgstr "Klient side-skildring er av" msgid "Connecting to server..." msgstr "Kopler til tenarmaskin..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Tilkoplinga feila av ein ukjent grunn" + #: src/client/game.cpp msgid "Continue" -msgstr "Fortsetja" +msgstr "Fortset" #: src/client/game.cpp #, c-format @@ -1149,30 +1413,35 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" "Styring:\n" -"- %s: Framsteg\n" -"- %s: Baksteg\n" -"- %s: Sidesteg mot venstre\n" -"- %s: Sidesteg mot høyre\n" -"- %s: hopp/klatre\n" -"- %s: snike seg rundt/bøye seg\n" -"- %s: slipp gjennstand\n" +"- %s: gå framover\n" +"- %s: gå bakover\n" +"- %s: gå mot venstre\n" +"- %s: gå mot høgre\n" +"- %s: hopp/klatre opp\n" +"- %s: grav/slå\n" +"- %s: plasser/nytt\n" +"- %s: snik/klatre ned\n" +"- %s: slepp ting\n" "- %s: inventar\n" -"- Datamus: snu seg/sjå rundt\n" -"- Datamus, venstre klikk: grave/slå\n" -"- Datamus, høgre klikk: plassér/bruk\n" -"- Datamus, skrolle-hjul: select item\n" -"- %s: skravlerør\n" +"- Mus: snu deg/sjå\n" +"- Musehjul: vel ting\n" +"- %s: nettprat\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" #: src/client/game.cpp msgid "Creating client..." @@ -1230,6 +1499,11 @@ msgstr "Ubergensa utsiktsrekkjevidd har avtatt" msgid "Enabled unlimited viewing range" msgstr "Ubergensa utsiktsrekkjevidd er i gang" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Skapar klient..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Gå ut til meny" @@ -1303,32 +1577,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Minikart er for tiden deaktivert tå spelet eller ein modifikasjon" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Minikart er gøymt" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Minikart i radar modus, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Minikart i radarmodus, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Minikart i radarmodus, Zoom x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minikart i overflate modus, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minikart i overflate modus, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minikart i overflate modus, Zoom x4" +msgid "Multiplayer" +msgstr "Fleirspelar" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1393,16 +1643,31 @@ msgstr "Lyd e dempa" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Lydsystemet er slått av" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Lydsystemet er ikkje støtta på denne builden" #: src/client/game.cpp msgid "Sound unmuted" msgstr "Lyd e ikkje dempa lengre" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Tenaren køyrer sannsynlegvis ein annan versjon av %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Kunne ikkje kople til %s fordi IPv6 er slått av" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Kunne ikkje lytte på %s fordi IPv6 er slått av" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1472,10 +1737,6 @@ msgstr "Attende" msgid "Caps Lock" msgstr "Kapital-tegn på/av knapp" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Rydd til side" - #: src/client/keycode.cpp msgid "Control" msgstr "Styring" @@ -1723,35 +1984,40 @@ msgstr "X Knapp 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Passorda passar ikkje!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minikart er gøymt" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registrer og bli med" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minikart i radarmodus, Zoom x%d" -#: src/gui/guiConfirmRegistration.cpp -#, fuzzy, 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 "" -"Du er i gang med å hoppe inn i ein tenarmaskin ved %1$s med namnet \"%2$s\" " -"for fyrste gong. Om du går videre, ein ny brukar med dine detaljer vill bli " -"skapt på tenarmaskinen.\n" -"Ver vennleg og skriv passordet, klikk registrer og trykk \"bli med\" for at " -"kontoen skal bli registrert eller klikk avbryt for å ikkje gjere det." +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minikart i overflatemodus, Zoom x%d" + +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap in texture mode" +msgstr "Minikart i overflate modus, Zoom x1" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Klarte ikkje å opne nettside" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Opnar nettside" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Fortset" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +#, fuzzy +msgid "\"Aux1\" = climb down" msgstr "\"Spesiell\" = klatre ned" #: src/gui/guiKeyChangeMenu.cpp @@ -1762,15 +2028,23 @@ msgstr "Automatiske framsteg" msgid "Automatic jumping" msgstr "Automatiske hopp" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Bakover" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Byt kamera" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Skravlerør" @@ -1823,10 +2097,8 @@ msgid "Key already in use" msgstr "Knapp er allereie i bruk" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" -"Knappebindinger. (Om denne menyen går galen, ta bort tinga fra \"minetest." -"conf\")" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1856,10 +2128,6 @@ msgstr "Skjermbilde" msgid "Sneak" msgstr "Sniking" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Spesial" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Slå av/på HUD" @@ -1901,10 +2169,6 @@ msgstr "berør knapp" msgid "Change" msgstr "Byt" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Bekreft passord" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Nytt passord" @@ -1913,6 +2177,10 @@ msgstr "Nytt passord" msgid "Old Password" msgstr "Gammalt passord" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Passorda passar ikkje!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Avslutt" @@ -1922,14 +2190,9 @@ msgid "Muted" msgstr "Målbindt" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Lydstyrke: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Gå " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Lydstyrke: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1938,6 +2201,16 @@ msgstr "Gå " msgid "LANG_CODE" msgstr "nn-NO" +#: 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 "Ver venleg å velje eit namn!" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1946,8 +2219,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1974,12 +2247,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2010,11 +2277,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" +msgstr "3D-skyer" #: src/settings_translation_file.cpp msgid "3D mode" -msgstr "" +msgstr "3D-modus" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" @@ -2022,13 +2289,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "" +msgstr "3D-støy som definerer gigantiske holer." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" +"3D-støy som definerer fjellstruktur og -høgde.\n" +"Definerer og strukturen på fjellterreng for flyteland." #: src/settings_translation_file.cpp msgid "" @@ -2044,7 +2313,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "3D noise defining terrain." -msgstr "" +msgstr "3D-støy som definerer terreng." #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." @@ -2068,6 +2337,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2076,31 +2349,36 @@ msgstr "" #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "Ein beskjed som skal visast til alle klientane når tenaren kræsjar." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." msgstr "" +"Ein beskjed som skal visast til alle klientane når tenaren vert slått av." #: src/settings_translation_file.cpp msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "Akselerasjon i luft" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "Gravitasjonsakselerasjon, i nodar per sekund per sekund." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "Aktive blokkmodifikatorar" #: src/settings_translation_file.cpp msgid "Active block management interval" @@ -2120,6 +2398,9 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"Adresse å kople til.\n" +"La dette vere tomt for å starte ein lokal tenar.\n" +"Merk at adressefeltet i hovudmenyen overkøyrer denne innstillinga." #: src/settings_translation_file.cpp msgid "Adds particles when digging a node." @@ -2130,6 +2411,14 @@ msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" +"Juster dpi-konfigurasjonen for din skjem (kun system utan X11/Android), f." +"eks. for 4K-skjermar." + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Juster den oppdaga skjermtettheita, vert nytta for å skalere " +"brukargrensesnittelement." #: src/settings_translation_file.cpp #, c-format @@ -2141,9 +2430,14 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Verdsnamn" + #: src/settings_translation_file.cpp msgid "Advanced" -msgstr "" +msgstr "Avansert" #: src/settings_translation_file.cpp msgid "" @@ -2155,7 +2449,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2164,11 +2458,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "Antal meldingar ein spelar kan sende per 10 sekund." #: src/settings_translation_file.cpp msgid "Amplifies the valleys." -msgstr "" +msgstr "Forsterkar dalane." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" @@ -2176,11 +2470,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "" +msgstr "Annonser tenar" #: src/settings_translation_file.cpp msgid "Announce to this serverlist." -msgstr "" +msgstr "Annonser til denne tenarlista." #: src/settings_translation_file.cpp msgid "Append item name" @@ -2196,17 +2490,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Arm inertia" -msgstr "" +msgstr "Armtreigheit" #: src/settings_translation_file.cpp msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" +"Armtreigheit gir meir realistisk armbevegingar\n" +"når kameraet flyttar seg." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" -msgstr "" +msgstr "Spør om å kople til igjen etter eit kræsj" #: src/settings_translation_file.cpp msgid "" @@ -2224,28 +2520,40 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Automatic forward key" +msgid "Audio" msgstr "" +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "Automatisk framoverknapp" + #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." msgstr "" #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." -msgstr "" +msgstr "Rapporter automatisk til tenarlista." #: src/settings_translation_file.cpp msgid "Autosave screen size" -msgstr "" +msgstr "Lagre skjermstørrelsen automatisk" #: src/settings_translation_file.cpp msgid "Autoscaling mode" +msgstr "Autoskaleringsmodus" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" msgstr "" #: src/settings_translation_file.cpp msgid "Backward key" -msgstr "" +msgstr "Bakoverknapp" #: src/settings_translation_file.cpp msgid "Base ground level" @@ -2255,13 +2563,9 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" -msgstr "" +msgstr "Basisprivilegium" #: src/settings_translation_file.cpp msgid "Beach noise" @@ -2277,10 +2581,10 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Bind address" -msgstr "" +msgstr "Bind adresse" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +msgid "Biome API noise parameters" msgstr "" #: src/settings_translation_file.cpp @@ -2288,11 +2592,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2317,11 +2621,12 @@ msgstr "Bygg intern spelar" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "Innebygd" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "Byt kamera" #: src/settings_translation_file.cpp msgid "" @@ -2357,7 +2662,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "Hòlebreidde" #: src/settings_translation_file.cpp msgid "Cave1 noise" @@ -2394,26 +2699,24 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Chatkommandoar" + #: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "" +msgstr "Tekststørrelse for nettprat" #: src/settings_translation_file.cpp msgid "Chat key" -msgstr "" +msgstr "Nettpratstast" #: src/settings_translation_file.cpp msgid "Chat log level" -msgstr "" +msgstr "Loggnivå for chat" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2429,15 +2732,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "Maksimal lengde på chattemeldingar" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "" +msgstr "Knapp for å slå chatten av/på" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" +msgid "Chat weblinks" +msgstr "Nettlenker i chatten" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2456,12 +2759,18 @@ msgid "Clean transparent textures" msgstr "" #: src/settings_translation_file.cpp -msgid "Client" +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." msgstr "" +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "Klient" + #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "Klient og tenar" #: src/settings_translation_file.cpp msgid "Client modding" @@ -2476,28 +2785,36 @@ msgid "Client side node lookup range restriction" msgstr "" #: src/settings_translation_file.cpp -msgid "Climbing speed" +msgid "Client-side Modding" msgstr "" +#: src/settings_translation_file.cpp +msgid "Climbing speed" +msgstr "Klatrefart" + #: src/settings_translation_file.cpp msgid "Cloud radius" -msgstr "" +msgstr "Skyradius" #: src/settings_translation_file.cpp msgid "Clouds" -msgstr "" +msgstr "Skyer" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." -msgstr "" +msgstr "Skyer er ei effekt på klientsida." #: src/settings_translation_file.cpp msgid "Clouds in menu" -msgstr "" +msgstr "Skyer i meny" #: src/settings_translation_file.cpp msgid "Colored fog" -msgstr "" +msgstr "Farga tåke" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Farga skuggar" #: src/settings_translation_file.cpp msgid "" @@ -2524,15 +2841,31 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Command key" +msgstr "Kommandoknapp" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" #: src/settings_translation_file.cpp msgid "Connect glass" -msgstr "" +msgstr "Kople saman glas" #: src/settings_translation_file.cpp msgid "Connect to external media server" -msgstr "" +msgstr "Kople til ekstern mediatenar" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." @@ -2540,23 +2873,31 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Console alpha" -msgstr "" +msgstr "Konsollgjennomsiktigheit" #: src/settings_translation_file.cpp msgid "Console color" -msgstr "" +msgstr "Konsollfarge" #: src/settings_translation_file.cpp msgid "Console height" +msgstr "Konsollhøgde" + +#: src/settings_translation_file.cpp +msgid "Content Repository" msgstr "" #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Største antal samtidige nedlastingar frå ContentDB" + #: src/settings_translation_file.cpp msgid "ContentDB URL" -msgstr "" +msgstr "URL til ContentDB" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -2578,9 +2919,14 @@ msgid "" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" +"Kontrollerer lengda på dag/natt-syklusen.\n" +"Eksempel:\n" +"72 = 20 min., 360 = 4 min., 1 = 24 timar, 0 = dag/natt/anna forblir uendra." #: 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 @@ -2600,18 +2946,20 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Crash message" -msgstr "" +msgstr "Kræsjmelding" #: src/settings_translation_file.cpp msgid "Creative" -msgstr "" +msgstr "Kreativ" #: src/settings_translation_file.cpp msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2619,20 +2967,22 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: src/settings_translation_file.cpp msgid "Damage" -msgstr "" +msgstr "Skade" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "" +msgstr "Knapp for å slå debuggingsinformasjon av/på" #: src/settings_translation_file.cpp msgid "Debug log file size threshold" @@ -2643,11 +2993,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 @@ -2656,29 +3006,31 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Default acceleration" -msgstr "" +msgstr "Standard akselerasjon" #: src/settings_translation_file.cpp msgid "Default game" -msgstr "" +msgstr "Standard spel" #: 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 "" +"Standard spel når du lagar ei ny verd.\n" +"Dette vil verte overstyrt når du lagar ei verd frå hovudmenyen." #: src/settings_translation_file.cpp msgid "Default password" -msgstr "" +msgstr "Standard passord" #: src/settings_translation_file.cpp msgid "Default privileges" -msgstr "" +msgstr "Standard privilegium" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "Standard rapportformat" #: src/settings_translation_file.cpp msgid "Default stack size" @@ -2686,17 +3038,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." -msgstr "" +msgstr "Definerer område der tre har eple." #: src/settings_translation_file.cpp msgid "Defines areas with sandy beaches." -msgstr "" +msgstr "Definerer område med sandstrender." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain and steepness of cliffs." @@ -2704,7 +3057,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain." -msgstr "" +msgstr "Definerer distribusjonen av høgare terreng." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." @@ -2718,19 +3071,13 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" #: src/settings_translation_file.cpp msgid "Defines the depth of the river channel." -msgstr "" +msgstr "Definerer djupna til elvekanalen." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." @@ -2794,6 +3141,15 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Dekorasjonar" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "" @@ -2806,6 +3162,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2850,18 +3216,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2878,22 +3261,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2942,14 +3319,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2958,18 +3327,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2978,6 +3335,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2986,12 +3353,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3003,7 +3364,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3022,18 +3387,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3052,7 +3405,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3086,14 +3439,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "" +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "Kantutjemning:" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3159,6 +3513,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3180,15 +3538,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3197,6 +3555,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3256,10 +3625,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3284,10 +3649,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3305,7 +3666,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Spel" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3316,7 +3686,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3335,6 +3705,14 @@ msgstr "" 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 "" @@ -3352,9 +3730,14 @@ 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 er vist" + #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -3362,8 +3745,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3385,7 +3768,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3396,10 +3780,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3595,10 +3975,17 @@ 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 "" @@ -3631,8 +4018,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3654,11 +4040,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3682,7 +4074,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 @@ -3699,6 +4093,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3715,10 +4115,6 @@ msgstr "" 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 "" @@ -3746,7 +4142,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3769,16 +4165,12 @@ msgstr "" 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 @@ -3829,6 +4221,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3908,6 +4304,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4007,6 +4410,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4380,6 +4790,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4436,7 +4850,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 @@ -4446,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 @@ -4466,7 +4883,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4493,6 +4911,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Jevn belysning" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4564,21 +4987,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4640,6 +5063,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4745,7 +5172,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4793,6 +5224,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4847,17 +5285,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4906,12 +5348,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4922,6 +5376,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4988,16 +5446,16 @@ msgstr "" 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 "" @@ -5010,6 +5468,11 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Knute-fremheving" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5022,14 +5485,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5051,18 +5506,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5072,11 +5519,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5085,38 +5527,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5139,17 +5555,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5178,13 +5590,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5195,6 +5611,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5229,10 +5649,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5240,9 +5656,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5332,10 +5748,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5405,6 +5817,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Skjerm:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5432,6 +5849,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Skjermbilde" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5444,10 +5866,6 @@ msgstr "" 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 "" @@ -5488,8 +5906,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" +#, fuzzy +msgid "Server" +msgstr "Bli tenarmaskin's vert" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "- Tenarnamn: " + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Tenarbeskriving" #: src/settings_translation_file.cpp msgid "Server URL" @@ -5515,10 +5944,19 @@ msgstr "" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Tenarport" + #: 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 "" @@ -5530,7 +5968,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5551,6 +6017,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5563,6 +6036,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5570,9 +6059,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5587,6 +6074,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5608,6 +6105,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5662,18 +6163,15 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Skyradius" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5689,6 +6187,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5716,10 +6222,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5757,6 +6259,11 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Innstillingar" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -5799,6 +6306,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5813,6 +6327,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5868,18 +6386,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5897,6 +6415,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5905,9 +6429,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5944,7 +6467,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 @@ -5967,6 +6490,18 @@ msgstr "" 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 "" @@ -6037,15 +6572,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6139,7 +6689,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6213,6 +6763,10 @@ msgstr "Bølgete vatn" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6234,18 +6788,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6280,13 +6832,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6370,29 +6931,162 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#, fuzzy +#~ msgid "- Creative Mode: " +#~ msgstr "- Gude løyving: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Slå på/av kameramodus" +#~ msgid "- Damage: " +#~ msgstr "- Skade: " -#~ msgid "Select Package File:" -#~ msgstr "Velje eit pakke dokument:" +#~ msgid "Address / Port" +#~ msgstr "Adresse / port" -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Henter og installerer $1, ver vennleg og vent..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Er du sikker på at du vill tilbakestille enkel-spelar verd?" #~ msgid "Back" #~ msgstr "Attende" +#~ msgid "Basic" +#~ msgstr "Basis" + +#~ msgid "Bump Mapping" +#~ msgstr "Dunke kartlegging" + +#~ msgid "Config mods" +#~ msgstr "Konfigurer modifikasjoner" + +#~ msgid "Configure" +#~ msgstr "Konfigurér" + +#~ msgid "Connect" +#~ msgstr "Kople i hop" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Kontrollerer kor raskt ting synk i væske." + +#~ msgid "Credits" +#~ msgstr "Medvirkende" + +#~ msgid "Damage enabled" +#~ msgstr "Skade aktivert" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Last ned eit spel, slik som Minetest-spelet, frå minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Last ned eit frå minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Henter og installerer $1, ver vennleg og vent..." + +#~ msgid "Enter " +#~ msgstr "Gå " + +#~ msgid "Game" +#~ msgstr "Spel" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Generér normale kart" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Installer: fil: «$1»" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Knappebindinger. (Om denne menyen går galen, ta bort tinga fra \"minetest." +#~ "conf\")" + +#~ msgid "Main" +#~ msgstr "Hovud" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Minikart i radarmodus, Zoom x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minikart i radarmodus, Zoom x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minikart i overflate modus, Zoom x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minikart i overflate modus, Zoom x4" + +#~ msgid "Name / Password" +#~ msgstr "Namn/Passord" + +#~ msgid "Name/Password" +#~ msgstr "Namn/passord" + +#~ msgid "No" +#~ msgstr "Nei" + #~ msgid "Ok" #~ msgstr "OK" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parralax okklusjon" + +#~ msgid "PvP enabled" +#~ msgstr "Spelar mot spelar aktivert" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Tilbakegå enkelspelar verd" + +#~ msgid "Select Package File:" +#~ msgstr "Velje eit pakke dokument:" + +#~ msgid "Special" +#~ msgstr "Spesial" + +#~ msgid "Start Singleplayer" +#~ msgstr "Start enkeltspelar oppleving" + +#, fuzzy +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "For å aktivere skumrings-effekt så må OpenGL driveren være i bruk." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Slå på/av kameramodus" + +#~ msgid "Yes" +#~ msgstr "Ja" + +#, fuzzy, 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 "" +#~ "Du er i gang med å hoppe inn i ein tenarmaskin ved %1$s med namnet " +#~ "\"%2$s\" for fyrste gong. Om du går videre, ein ny brukar med dine " +#~ "detaljer vill bli skapt på tenarmaskinen.\n" +#~ "Ver vennleg og skriv passordet, klikk registrer og trykk \"bli med\" for " +#~ "at kontoen skal bli registrert eller klikk avbryt for å ikkje gjere det." + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Du døydde" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/oc/minetest.po b/po/oc/minetest.po new file mode 100644 index 000000000..1450730a4 --- /dev/null +++ b/po/oc/minetest.po @@ -0,0 +1,6859 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-07-31 17:28+0000\n" +"Last-Translator: Walter Bulbazor <prbulbazor@protonmail.com>\n" +"Language-Team: Occitan <https://hosted.weblate.org/projects/minetest/" +"minetest/oc/>\n" +"Language: oc\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" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Panar la sortida de messatges" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Comanda voeida." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Quitar au menú principau" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Comanda pas valida: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Comanda mandada: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Listar los jogaires en linha" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Jogaires en linha: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "La sortida de messatges es avora voeida." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Aquesta comanda es pas activada per lo servidor." + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "Tornar" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "You died" +msgstr "Setz mòrt·as" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Comandas disponiblas:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Comandas disponiblas: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Comanda pas disponibla: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Ajuda per las comandas" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Utilizatz '.help <cmd>' per aver mai d'informacions, o '.help all' per tot " +"listar." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <cmd>]" + +#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp +msgid "OK" +msgstr "D'accòrdi" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<pas res disponible>" + +#: builtin/fstk/ui.lua +msgid "An error occurred in a Lua script:" +msgstr "Se presenta una error dins un escrípt Lua:" + +#: builtin/fstk/ui.lua +msgid "An error occurred:" +msgstr "Se presenta una error:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Menú principau" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "Tornar Conectar" + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" +msgstr "Lo servidor demandèt de se tornar conectar:" + +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "Una novèla $1 version es disponible" + +#: builtin/mainmenu/common.lua +msgid "Client Mods" +msgstr "Mòds dau 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 installada: $1\n" +"Version novèla: $2\n" +"Vos chau visitar $3 per sabèr cossí tenèr la novèla version e gardar una " +"version mesa a jorn per los foncionalitats e las reparacions de bugs." + +#: builtin/mainmenu/common.lua +msgid "Later" +msgstr "Mai Tard" + +#: builtin/mainmenu/common.lua +msgid "Never" +msgstr "Pas Jamai" + +#: builtin/mainmenu/common.lua +msgid "Protocol version mismatch. " +msgstr "La version dau protocòl correspònda pas. " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "Lo servidor impausa la version $1 dau protocòl. " + +#: builtin/mainmenu/common.lua +msgid "Server supports protocol versions between $1 and $2. " +msgstr "Lo servidor pòt suportar de versions dau protocòl entre $1 e $2. " + +#: builtin/mainmenu/common.lua +msgid "Visit website" +msgstr "Visitar le sit" + +#: builtin/mainmenu/common.lua +msgid "We only support protocol version $1." +msgstr "Suportem mas la version $1 dau protocòl." + +#: builtin/mainmenu/common.lua +msgid "We support protocol versions between version $1 and $2." +msgstr "Suportem de versions dau protocòl entre $1 e $2." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Enabled, has error)" +msgstr "(Activat, a una error)" + +#: 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_register.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp +#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp +msgid "Cancel" +msgstr "Annular" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +msgstr "Dependéncias:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Tot desactivar" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable modpack" +msgstr "Desactivar lo mòdpack" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "Tot activar" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable modpack" +msgstr "Activar lo mòdpack" + +#: 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 "" +"Error per l'activacion dau mòd \"$1\" per çò qu'a de caractèrs pas " +"autorizats. Mas los caractèrs [a-z0-9_] son autorizats." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Find More Mods" +msgstr "Charchar Mai de Mòds" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Mòd:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No (optional) dependencies" +msgstr "Pas de dependéncias (optionalas)" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "Lo juòc ten pas de descripcion provesida." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No hard dependencies" +msgstr "Pas de dependéncias" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." +msgstr "Lo mòdpack ten pas de descripcion provesida." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No optional dependencies" +msgstr "Pas de dependéncias optionalas" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "Dependéncias optionalas:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Sauvar" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Monde:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "activat" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" exista dejà. Voletz l'espotir?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Las dependéncias $1 e $2 van s'installar." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 per $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 en descharjament,\n" +"$2 en espeita" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "Descharjament de $1..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "Las dependéncias que fasàn besonh per $1 pòdan pas se trobar." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 sera installat, e las dependéncias de $2 seràn ignoradas." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "Tot los paquets" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Dejá installat" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Back to Main Menu" +msgstr "Tornar au Menú Principau" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Juòc de Basa:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB es pas disponible quand Minetest es compilat sens cURL" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Downloading..." +msgstr "Descharjament..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Failed to download $1" +msgstr "Error per lo descharjament de $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Games" +msgstr "Juòcs" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install" +msgstr "Installar" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "Installar $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Installar las dependéncias mancantas" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Installacion: Tipe de fichèir pas supportat o archiva cassada" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Mods" +msgstr "Mòds" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No packages could be retrieved" +msgstr "Pas ges de paquets poguèron èstre quèrre" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No results" +msgstr "Pas de resultats" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No updates" +msgstr "Pas de mesas a jorn" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Pas trobat" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Espotir" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Verifiatz que lo juòc de basa es corrèct." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "En espeita" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" +msgstr "Pacs de textura" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Uninstall" +msgstr "Desinstallar" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update" +msgstr "Mesa a jorn" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "Tot metre a jorn [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Agachar mai d'informacions dins un navegador wèb" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "Un monde sona \"$1\" exista dejà" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Additional terrain" +msgstr "Tarren en mai" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Altitude chill" +msgstr "Freid de nautor" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Altitude dry" +msgstr "Nautor sècha" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biome blending" +msgstr "Mesclar de biòm" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biomes" +msgstr "Biòms" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caverns" +msgstr "Caunas" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caves" +msgstr "Cavas" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "Crear" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "Decoracions" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Development Test is meant for developers." +msgstr "Test de Desvelopament es per los desvelopair·e·a·s." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Dungeons" +msgstr "Donjons" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "Tarren plat" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "Massas de tarren que flotàn dins lo ciau" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "Tarrens flotejants (experimentau)" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "Generar un tarren pas fractau: Oceans e sostarrens" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Hills" +msgstr "Montèls" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Humid rivers" +msgstr "Ribèiras mostas" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Increases humidity around rivers" +msgstr "Aumente la mostor a l'entorn de ribèiras" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install a game" +msgstr "Installar un juòc" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "Installar un autre juòc" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Lakes" +msgstr "Lacs" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Low humidity and high heat causes shallow or dry rivers" +msgstr "" +"Mostor bassa e chalor elevada fan venir las ribèiras pas plòndas e sèchas" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "Generator de tarrens" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "Drapèls de generator de tarren" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mapgen-specific flags" +msgstr "Drapèls specifics dau generator de tarren" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mountains" +msgstr "Montanhas" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mud flow" +msgstr "Rajada de gadòlha" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Network of tunnels and caves" +msgstr "Ret de tunèls e de gròtas" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No game selected" +msgstr "Pas de juòc selectionat" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces heat with altitude" +msgstr "Redusa la chalor embei l'altitud" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces humidity with altitude" +msgstr "Redusa la mostor embei l'altitud" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Rivers" +msgstr "Ribèiras" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Sea level rivers" +msgstr "Ribèiras au nivèl de la mar" + +#: builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" +msgstr "Grana" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Smooth transition between biomes" +msgstr "Transicion doça entre los biòms" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "" +"Structures appearing on the terrain (no effect on trees and jungle grass " +"created by v6)" +msgstr "" +"Estructuras aparéisson per le tarren (pas d'efèit per los aubres e l'èrba de " +"jungla creats per la v6)" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Structures appearing on the terrain, typically trees and plants" +msgstr "Estructuras aparéisson per le tarren, en generau d'aubres e de plantas" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert" +msgstr "Temperat, Desertic" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle" +msgstr "Temperat, Desertic, Jungla" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgstr "Temperat, Desertic, Jungla, Tondra, Taïga" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Terrain surface erosion" +msgstr "Erosia de la surfàcia dau tarren" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Trees and jungle grass" +msgstr "Aubres e èrba de jungla" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Vary river depth" +msgstr "Variar la plondor de la ribèira" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Very large caverns deep in the underground" +msgstr "Mai grandas caunas plondorosas dins lo sostarren" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "Nom dau monde" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no games installed." +msgstr "Avètz pas ges de juòc installat." + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "Sètz surat de vaudre suprimar \"$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 "Suprimar" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: failed to delete \"$1\"" +msgstr "pkgmgr: error per suprimar \"$1\"" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: invalid path \"$1\"" +msgstr "pkgmgr: chamin \"$1\" pas valide" + +#: builtin/mainmenu/dlg_delete_world.lua +msgid "Delete World \"$1\"?" +msgstr "Suprimar lo Monde \"$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 +msgid "Accept" +msgstr "Acceptar" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "Tornar sonar lo Mòdpack:" + +#: 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 "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "(Pas de descripcion o de paramètre bailat)" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "2D Noise" +msgstr "Brut 2D" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +msgstr "< Tornar a la Paja de Paramètres" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Browse" +msgstr "Navegar" + +#: 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 "Desactivat" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "Modifiar" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "Activat" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Lacunarity" +msgstr "Lacunaritada" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Octaves" +msgstr "Octavas" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" +msgstr "Descalatge" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Persistence" +msgstr "Persisténcia" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "Bailatz un nombre entèir valide." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "Bailatz un nombre valide." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "Tornar per defaut" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "Eschala" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Charchar" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "Seleccionar un repertòre" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "Seleccionar un fichèir" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "Mostrar los noms tecnics" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "Chau que la valor siáge au mens $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "Chau pas que la valor siáge mai granda que $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "Escart X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "Escart Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "Z" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "Escart Z" + +#. ~ "absvalue" is a noise parameter flag. +#. It is short for "absolute value". +#. It can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "absvalue" +msgstr "valor absoluda" + +#. ~ "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 "defaut" + +#. ~ "eased" is a noise parameter flag. +#. It is used to make the map smoother and +#. can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "eased" +msgstr "polit" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 (Enabled)" +msgstr "$1 (Activat)" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 mods" +msgstr "$1 mòds" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Failed to install $1 to $2" +msgstr "Error per installar $1 vès $2" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find real mod name for: $1" +msgstr "Installar un Mòd: Pas possible de trobar lo nom reau dau mòd per: $1" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find suitable folder name for modpack $1" +msgstr "" +"Installar un Mòd: Pas possible de trobar un nom de dorsèir convenant per lo " +"mòdpack $1" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to find a valid mod or modpack" +msgstr "Se pòt pas trobar un mòd o un mòdpack valide" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a $1 as a texture pack" +msgstr "Se pòt pas installar $1 coma un pack de texturas" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a game as a $1" +msgstr "Se pòt pas installar un juòc coma un $1" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a mod as a $1" +msgstr "Se pòt pas installar un mòd coma un $1" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a modpack as a $1" +msgstr "Se pòt pas installar un mòdpack coma un $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Charjament..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "La lista de servidors publics es pas activada" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Essatjatz de tornar activar la lista de servidors e verifiatz vòstra " +"connexion d'internet." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "A prepaus" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Collaboradors Actius" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Developaires Principaus" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Ancians Collaboradors" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Ancians Developaires Principaus" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Browse online content" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Content" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Information:" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Installed Packages:" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "No package description available" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Rename" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Uninstall Package" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Use Texture Pack" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Creative Mode" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Enable Damage" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +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 +msgid "Play Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Start Game" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Address" +msgstr "" + +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Creative mode" +msgstr "" + +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Join Game" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +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 "" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "All Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave Screen Size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/client/game.cpp +msgid "Change Keys" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "Shaders" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touch threshold (px):" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +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 "" + +#: src/client/client.cpp +msgid "Done!" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes..." +msgstr "" + +#: src/client/client.cpp +msgid "Loading textures..." +msgstr "" + +#: src/client/client.cpp +msgid "Rebuilding shaders..." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided password file failed to open: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "" + +#: src/client/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" + +#: src/client/game.cpp +msgid "- Address: " +msgstr "" + +#: src/client/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/client/game.cpp +msgid "- Port: " +msgstr "" + +#: src/client/game.cpp +msgid "- Public: " +msgstr "" + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/client/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + +#: src/client/game.cpp +msgid "Automatic forward disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Automatic forward enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + +#: src/client/game.cpp +msgid "Change Password" +msgstr "" + +#: src/client/game.cpp +msgid "Cinematic mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + +#: src/client/game.cpp +msgid "Client side scripting is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Connecting to server..." +msgstr "" + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + +#: src/client/game.cpp +msgid "Continue" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + +#: src/client/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/client/game.cpp +msgid "Creating server..." +msgstr "" + +#: src/client/game.cpp +msgid "Debug info and profiler graph hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info shown" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info, profiler graph, and wireframe hidden" +msgstr "" + +#: src/client/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/client/game.cpp +msgid "Disabled unlimited viewing range" +msgstr "" + +#: src/client/game.cpp +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 "" + +#: src/client/game.cpp +msgid "Exit to OS" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Game info:" +msgstr "" + +#: src/client/game.cpp +msgid "Game paused" +msgstr "" + +#: src/client/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/client/game.cpp +msgid "Item definitions..." +msgstr "" + +#: src/client/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Media..." +msgstr "" + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Node definitions..." +msgstr "" + +#: src/client/game.cpp +msgid "Off" +msgstr "" + +#: src/client/game.cpp +msgid "On" +msgstr "" + +#: src/client/game.cpp +msgid "Pitch move mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Pitch move mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Profiler graph shown" +msgstr "" + +#: src/client/game.cpp +msgid "Remote server" +msgstr "" + +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "" + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "" + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at minimum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "ok" +msgstr "" + +#: src/client/gameui.cpp +msgid "Chat hidden" +msgstr "" + +#: src/client/gameui.cpp +msgid "Chat shown" +msgstr "" + +#: src/client/gameui.cpp +msgid "HUD hidden" +msgstr "" + +#: src/client/gameui.cpp +msgid "HUD shown" +msgstr "" + +#: src/client/gameui.cpp +msgid "Profiler hidden" +msgstr "" + +#: src/client/gameui.cpp +#, c-format +msgid "Profiler shown (page %d of %d)" +msgstr "" + +#: src/client/keycode.cpp +msgid "Apps" +msgstr "" + +#: src/client/keycode.cpp +msgid "Backspace" +msgstr "" + +#: src/client/keycode.cpp +msgid "Caps Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Down" +msgstr "" + +#: src/client/keycode.cpp +msgid "End" +msgstr "" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "" + +#. ~ Key name, common on Windows keyboards +#: src/client/keycode.cpp +msgid "Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Middle Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Num Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad *" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad +" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad -" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad /" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 0" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 2" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 3" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 4" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 5" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 6" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 7" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 8" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 9" +msgstr "" + +#: src/client/keycode.cpp +msgid "OEM Clear" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page down" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page up" +msgstr "" + +#: src/client/keycode.cpp +msgid "Pause" +msgstr "" + +#: src/client/keycode.cpp +msgid "Play" +msgstr "" + +#. ~ "Print screen" key +#: src/client/keycode.cpp +msgid "Print" +msgstr "" + +#: src/client/keycode.cpp +msgid "Return" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Windows" +msgstr "" + +#: src/client/keycode.cpp +msgid "Scroll Lock" +msgstr "" + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" +msgstr "" + +#: src/client/keycode.cpp +msgid "Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Sleep" +msgstr "" + +#: src/client/keycode.cpp +msgid "Snapshot" +msgstr "" + +#: src/client/keycode.cpp +msgid "Space" +msgstr "" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 2" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Zoom" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "" + +#: src/gui/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "\"Aux1\" = climb down" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Autoforward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Automatic jumping" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Change camera" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Chat" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle HUD" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle chat log" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fog" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Change" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "New Password" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Old Password" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +msgid "Exit" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +msgid "Muted" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +#, c-format +msgid "Sound Volume: %d%%" +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). +#: src/network/clientpackethandler.cpp src/script/lua_api/l_client.cpp +msgid "LANG_CODE" +msgstr "" + +#: 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" +"If disabled, virtual joystick will center to first-touch's position." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"situations.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"Default is for a vertically-squashed shape suitable for\n" +"an island, set all 3 numbers equal for the raw shape." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of ridged mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of step mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of step mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that locates the river valleys and channels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"to be adjusted, as floatland tapering functions best when this noise has\n" +"a value range of approximately -2.0 to 2.0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise that determines number of dungeons per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- crossview: Cross-eyed 3d\n" +"- pageflip: quadbuffer based 3d.\n" +"Note that the interlaced mode requires shaders to be enabled." +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." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of queued blocks to emerge" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration of gravity, in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + +#: src/settings_translation_file.cpp +#, c-format +msgid "" +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" +"to be sure) creates a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"This only has significant effect on daylight and artificial\n" +"light, it has very little effect on natural night light." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Always fly fast" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amount of messages a player may send per 10 seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce to this serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name to tooltip." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to\n" +"clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible\n" +"rendering glitches (some blocks will not be rendered under water and in " +"caves,\n" +"as well as sometimes on land).\n" +"Setting this to a value greater than max_block_send_distance disables this\n" +"optimization.\n" +"Stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome API noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Increasing can reduce artifacting on weaker GPUs.\n" +"0.1 = Default, 0.25 = Good value for weaker tablets." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat weblinks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples:\n" +"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls width of tunnels, a smaller value creates wider tunnels.\n" +"Value >= 10.0 completely disables generation of tunnels and avoids the\n" +"intensive noise calculations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain and steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the base ground level." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the depth of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river valley." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +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 "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +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 " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server.\n" +"Ignored if bind_address is set.\n" +"Needs enable_ipv6 to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"appearance of high dynamic range images. Mid-range contrast is slightly\n" +"enhanced, highlights and shadows are gradually compressed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Exponent of the floatland tapering. Alters the tapering behaviour.\n" +"Value = 1.0 creates a uniform, linear tapering.\n" +"Values > 1.0 create a smooth tapering suitable for the default separated\n" +"floatlands.\n" +"Values < 1.0 (for example 0.25) create a more defined surface level with\n" +"flatter lowlands, suitable for a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via the \"Aux1\" key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Filtering and Antialiasing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font bold by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal acceleration in air when jumping or falling,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration in fast mode,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration on ground or when climbing,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"If negative, liquid waves will move backwards.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +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 "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"increases processing load.\n" +"At iterations = 20 this mapgen has a similar load to mapgen V7." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +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 "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of liquid waves.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen Carpathian." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'terrain' enables the generation of non-fractal terrain:\n" +"ocean, islands and underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"to become shallower and occasionally dry.\n" +"'altitude_dry': Reduces humidity with altitude." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen v5." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'floatlands': Floating land masses in the atmosphere.\n" +"'caverns': Giant caves deep underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum liquid resistance. Controls deceleration when entering liquid at\n" +"high speed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of recent chat messages to show" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"Current mapgens in a highly unstable state:\n" +"- The optional floatlands of v7 (disabled by default)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Near plane" +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 "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"processes, especially in singleplayer and/or when running Lua code in\n" +"'on_generated'. For many users the optimum setting may be '1'." +msgstr "" + +#: src/settings_translation_file.cpp +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 "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Optional override for chat weblink color." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + +#: 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 transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Proportion of large caves that contain liquid." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Restricts the access of certain client-side functions on servers.\n" +"Combine the byteflags below to restrict client-side features, or set to 0\n" +"for no restrictions:\n" +"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" +"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" +"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" +"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" +"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridged mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River valley width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hill size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hills spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Selects one of 18 fractal types.\n" +"1 = 4D \"Roundy\" Mandelbrot set.\n" +"2 = 4D \"Roundy\" Julia set.\n" +"3 = 4D \"Squarry\" Mandelbrot set.\n" +"4 = 4D \"Squarry\" Julia set.\n" +"5 = 4D \"Mandy Cousin\" Mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" Julia set.\n" +"7 = 4D \"Variation\" Mandelbrot set.\n" +"8 = 4D \"Variation\" Julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" Mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" Julia set.\n" +"11 = 3D \"Christmas Tree\" Mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" Julia set.\n" +"13 = 3D \"Mandelbulb\" Mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" Julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" Mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" Julia set.\n" +"17 = 4D \"Mandelbulb\" Mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" Julia set." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving liquids (like water).\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow strength gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).\n" +"WARNING!: There is no benefit, and there are several dangers, in\n" +"increasing this value above 5.\n" +"Reducing this value increases cave and dungeon density.\n" +"Altering this value is for special usage, leaving it unchanged is\n" +"recommended." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Surface level of optional water placed on a solid floatland layer.\n" +"Water is disabled by default and will only be placed if this value is set\n" +"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" +"upper tapering).\n" +"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" +"When enabling water placement the floatlands must be configured and tested\n" +"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" +"required value depending on 'mgv7_np_floatland'), to avoid\n" +"server-intensive extreme water flow and to avoid vast flooding of the\n" +"world surface below." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The URL for the content repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other biome filler node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The length in pixels it takes for touch screen interaction to start." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"Default is 1.0 (1/2 node).\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Third of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Time of day when a new world is started, in millihours (0-23999)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Virtual joystick triggers Aux1 button" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Volume of all sounds.\n" +"Requires the sound system to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"W coordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking and flying speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking, flying and climbing speed in fast mode, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"This is also used as the base node texture size for world-aligned\n" +"texture autoscaling." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." +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 "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "World start time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y of mountain density gradient zero level. Used to shift mountains " +"vertically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" diff --git a/po/pl/minetest.po b/po/pl/minetest.po index 015692182..39c570424 100644 --- a/po/pl/minetest.po +++ b/po/pl/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Polish (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-09 12:14+0000\n" -"Last-Translator: Mikołaj Zaremba <mikolajzaremba03@gmail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-03-18 02:57+0000\n" +"Last-Translator: Jakub Z <mrkubax10@onet.pl>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/minetest/minetest/" "pl/>\n" "Language: pl\n" @@ -13,7 +13,43 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.1-dev\n" +"X-Generator: Weblate 4.12-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Wyczyść kolejkę wiadomości czatu" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Pusta komenda." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Wyjście do menu" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Błędna komenda: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Wydana komenda: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Lista graczy online" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Gracze online: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Kolejka czatu jest teraz pusta." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Ta komenda jest dezaktywowana przez serwer." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -23,9 +59,40 @@ msgstr "Wróć do gry" msgid "You died" msgstr "Umarłeś" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Dostępne komendy:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Dostępne komendy: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Polecenie nie jest dostępne: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Uzyskaj pomoc dotyczącą poleceń" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Użyj '.help <cmd>', aby uzyskać więcej informacji lub '.help all', aby " +"wyświetlić wszystko." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[wszystko | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<niedostępne>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -47,9 +114,30 @@ msgstr "Połącz ponownie" msgid "The server has requested a reconnect:" msgstr "Serwer zażądał ponownego połączenia:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Ładowanie..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Wybierz 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. " @@ -64,10 +152,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Serwer wspiera protokoły w wersjach od $1 do $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Spróbuj ponownie włączyć publiczną listę serwerów i sprawdź swoje połączenie " -"z siecią Internet." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,17 +163,26 @@ msgstr "Wspieramy wyłącznie protokół w wersji $1." msgid "We support protocol versions between version $1 and $2." msgstr "Wspieramy protokoły w wersji od $1 do $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Anuluj" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Zależności:" @@ -117,7 +212,7 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Znajdź Więcej Modów" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -141,7 +236,7 @@ msgstr "Brak dostępnych informacji o modzie." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" -msgstr "Brak dodatkowych zależności." +msgstr "Brak dodatkowych zależności" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" @@ -160,29 +255,67 @@ msgstr "Świat:" msgid "enabled" msgstr "włączone" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" aktualnie istnieje. Czy chcesz go nadpisać?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Zależności $1 i $2 będą zainstalowane." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 przez $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 pobierany,\n" +"$2 w kolejce" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "Pobieranie $1..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 wymaga zależności, które nie zostały znalezione." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 zostanie zainstalowany, a zależności $2 zostaną pominięte." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Wszystkie zasoby" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Już zainstalowany" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Powrót do menu głównego" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Gra podstawowa:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB nie jest dostępne gdy Minetest był zbudowany bez cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Ładowanie..." +msgstr "Pobieranie..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" msgstr "Pobieranie $1 do $2 nie powiodło się :(" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Gry" @@ -191,9 +324,20 @@ msgid "Install" msgstr "Instaluj" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Zainstaluj $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Zainstaluj brakujące zależności" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Instalacja: nieznany typ pliku lub uszkodzone archiwum" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" -msgstr "Mody" +msgstr "Modyfikacje" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" @@ -204,9 +348,24 @@ msgid "No results" msgstr "Brak Wyników" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Szukaj" +msgid "No updates" +msgstr "Brak aktualizacji" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Nie znaleziono" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Nadpisz" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Proszę sprawdzić, czy gra podstawowa jest poprawnie zainstalowana." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "W kolejce" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -218,11 +377,15 @@ msgstr "Odinstaluj" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "Aktualizacja" +msgstr "Aktualizuj" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Zaktualizuj wszystko [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Pokaż więcej informacji w przeglądarce" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -230,102 +393,95 @@ msgstr "Istnieje już świat o nazwie \"$1\"" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Dodatkowy teren" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -#, fuzzy msgid "Altitude chill" msgstr "Wysokość mrozu" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Wysokość mrozu" +msgstr "Wysokość suchości" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Szum biomu" +msgstr "Mieszanie biomów" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Szum biomu" +msgstr "Biomy" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Szum jaskini #1" +msgstr "jaskinie" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Oktawy" +msgstr "Jaskinie" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Utwórz" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Iteracje" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Pobierz tryb gry, taki jak Minetest Game, z minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Ściągnij taką z minetest.net" +msgstr "Dekoracje" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Development Test is meant for developers." +msgstr "Ostrzeżenie: The Development Test jest przeznaczony dla programistów." + +#: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "Minimalna wartość Y lochu" +msgstr "Lochy" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Płaski teren" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floating landmasses in the sky" -msgstr "Gęstość gór na latających wyspach" +msgstr "Masywy lądowe unoszące się na niebie" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floatlands (experimental)" -msgstr "Poziom wznoszonego terenu" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Gra" +msgstr "Latające wyspy (eksperymentalne)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Generuj niefraktalny teren: oceany i podziemia" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Wzgórza" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Humid rivers" -msgstr "Sterownik graficzny" +msgstr "Wilgotne rzeki" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" +msgstr "Zwiększa wilgotność wokół rzek" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Zainstaluj $1" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "Jeziora" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" msgstr "" +"Niska wilgotność i wysoka temperatura wpływa na niski stan rzek lub ich " +"wysychanie" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -336,22 +492,20 @@ msgid "Mapgen flags" msgstr "Flagi generatora mapy" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Generator mapy flat flagi" +msgstr "Flagi specyficzne dla Mapgena" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mountains" -msgstr "Szum góry" +msgstr "Góry" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Strumień błota" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Sieć jaskiń i korytarzy" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -359,20 +513,19 @@ msgstr "Nie wybrano gry" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Redukuje ciepło wraz z wysokością" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Spadek wilgotności wraz ze wzrostem wysokości" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Rozmiar rzeki" +msgstr "Rzeki" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Rzeki na poziomie morza" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -381,53 +534,47 @@ msgstr "Ziarno losowości" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Płynne przejście między biomami" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Struktury pojawiające się na terenie (brak wpływu na drzewa i trawę w " +"dżungli stworzone przez v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Struktury pojawiające się na terenie, zazwyczaj drzewa i rośliny" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Umiarkowany, Pustynny" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Umiarkowany, Pustynia, Dżungla" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Umiarkowany, Pustynia, Dżungla, Tundra, Tajga" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Terrain surface erosion" -msgstr "Szum podłoża" +msgstr "Erozja powierzchni terenu" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Drzewa i trawa w dżungli" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Vary river depth" -msgstr "Głębokość rzeki" +msgstr "Zmienna głębokość rzeki" #: 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 "" -"Uwaga: Minimal development test jest przeznaczony tylko dla developerów." +msgstr "Bardzo duże jaskinie głęboko w podziemiach" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -459,6 +606,39 @@ msgstr "Modmgr: nieprawidłowy katalog \"$1\"" msgid "Delete World \"$1\"?" msgstr "Usunąć świat \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Potwierdź hasło" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Missing name" +msgstr "Nazwa generatora mapy" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Name" +msgstr "Nazwa" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Hasło" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "Hasła nie są jednakowe!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Zarejestruj się i dołącz" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Zaakceptuj" @@ -492,6 +672,16 @@ msgid "Browse" msgstr "Przeglądaj" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Zawartość" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Zawartość" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Wyłączone" @@ -516,7 +706,7 @@ msgid "Offset" msgstr "Margines" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Trwałość" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -535,6 +725,10 @@ msgstr "Przywróć domyślne" msgid "Scale" msgstr "Skaluj" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Wyszukaj" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Wybierz katalog" @@ -543,7 +737,7 @@ msgstr "Wybierz katalog" msgid "Select file" msgstr "Wybierz plik" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Pokaż nazwy techniczne" @@ -623,14 +817,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" "Instalacja moda: nie można znaleźć odpowiedniego folderu dla paczki modów $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Instalacja moda: nieznany typ pliku \"$1\" lub uszkodzone archiwum" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Zainstaluj mod: plik: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Nie można znaleźć prawidłowego moda lub paczki modów" @@ -651,6 +837,62 @@ msgstr "Nie moźna zainstalować moda jako $1" msgid "Unable to install a modpack as a $1" msgstr "Nie można zainstalować paczki modów jako $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Ładowanie..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Lista serwerów publicznych jest wyłączona" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Spróbuj ponownie włączyć publiczną listę serwerów i sprawdź swoje połączenie " +"z siecią Internet." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "O" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktywni współautorzy" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Aktywny moduł renderowania:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Twórcy" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Otwórz katalog danych użytkownika" + +#: 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 "" +"Otwiera katalog, który zawiera światy, gry, mody i tekstury dostarczone " +"przez użytkownika\n" +"oraz pakiety tekstur w menedżerze plików / eksploratorze." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Byli współautorzy" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Poprzedni Główni Deweloperzy" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Share debug log" +msgstr "Pokaż informacje debugowania" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Przeglądaj zawartość online" @@ -691,26 +933,6 @@ msgstr "Usuń modyfikację" msgid "Use Texture Pack" msgstr "Użyj paczki tekstur" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktywni współautorzy" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Twórcy" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Autorzy" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Byli współautorzy" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Poprzedni Główni Deweloperzy" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Rozgłoś serwer" @@ -720,14 +942,10 @@ msgid "Bind Address" msgstr "Adres" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Ustaw" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Tryb kreatywny" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Włącz obrażenia" @@ -741,11 +959,7 @@ msgstr "Udostępnij serwer" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nazwa gracza/Hasło" +msgstr "Instaluj gry z ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -759,10 +973,14 @@ msgstr "Nie wybrano bądź nie utworzono świata!" msgid "Play Game" msgstr "Graj" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Wybierz Mody" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Wybierz świat:" @@ -776,45 +994,62 @@ msgid "Start Game" msgstr "Rozpocznij grę" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adres / Port" +msgid "Address" +msgstr "Adres" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Połącz" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Delete" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Tryb kreatywny" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Obrażenia włączone" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Obrażenia / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Usuń ulubiony" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "Ulubione" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Niekompatybilne serwery" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Dołącz do gry" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nazwa gracza / Hasło" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP włączone" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Publiczne serwery" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Odśwież" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Port zdalny" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Opis serwera" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -840,10 +1075,6 @@ msgstr "Wszystkie ustawienia" msgid "Antialiasing:" msgstr "Antyaliasing:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Jesteś pewny że chcesz zresetować świat singleplayer?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Automatyczny zapis rozmiaru okienka" @@ -852,10 +1083,6 @@ msgstr "Automatyczny zapis rozmiaru okienka" msgid "Bilinear Filter" msgstr "Filtrowanie dwuliniowe" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Mapowanie wypukłości" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Zmień klawisze" @@ -864,13 +1091,30 @@ msgstr "Zmień klawisze" msgid "Connected Glass" msgstr "Szkło połączone" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Cienie dynamiczne" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Cienie dynamiczne: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Ozdobne liście" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Generuj normalne mapy" +msgid "High" +msgstr "Wysokie" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Niskie" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Średnie" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -880,10 +1124,6 @@ msgstr "Mipmapy" msgid "Mipmap + Aniso. Filter" msgstr "Mipmapy i Filtr anizotropowe" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nie" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Filtrowanie wyłączone" @@ -912,18 +1152,10 @@ msgstr "Nieprzejrzyste liście" msgid "Opaque Water" msgstr "Nieprzejrzysta Woda" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Mapowanie paralaksy" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Włącz Efekty Cząsteczkowe" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Resetuj świat pojedynczego gracza" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Ekran:" @@ -936,6 +1168,10 @@ msgstr "Ustawienia" msgid "Shaders" msgstr "Shadery" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shadery (eksperymentalne)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Shadery (Nie dostępne)" @@ -952,22 +1188,28 @@ msgstr "Płynne oświetlenie" msgid "Texturing:" msgstr "Teksturowanie:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Sterownik OpenGL jest wymagany aby włączyć shadery." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Tone Mapping" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "Próg dotyku (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Filtrowanie trójliniowe" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Bardzo wysokie" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Bardzo niskie" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Falujące liście" @@ -980,23 +1222,12 @@ msgstr "Fale (Ciecze)" msgid "Waving Plants" msgstr "Falujące rośliny" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Tak" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Ustawienia modów" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Menu główne" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Tryb jednoosobowy" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Błąd połączenia (brak odpowiedzi?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Upłynął czas połączenia." @@ -1025,8 +1256,8 @@ msgid "Connection error (timed out?)" msgstr "Błąd połączenia (brak odpowiedzi?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Nie można znaleźć lub wczytać trybu gry \"" +msgid "Could not find or load game: " +msgstr "Nie można znaleźć lub załadować gry: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1056,18 +1287,6 @@ msgstr "Nie udało się otworzyć dostarczonego pliku z hasłem " msgid "Provided world path doesn't exist: " msgstr "Podana ścieżka świata nie istnieje: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1080,14 +1299,6 @@ msgstr "" msgid "- Address: " msgstr "Adres " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "Tryb kreatywny " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Obrażenia: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Tryb: " @@ -1109,6 +1320,15 @@ msgstr "Gracz przeciwko graczowi: " msgid "- Server Name: " msgstr "- Nazwa serwera: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Wystąpił błąd serializacji:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Odmowa dostępu. Powód: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Automatyczne chodzenie do przodu wyłączone" @@ -1117,6 +1337,22 @@ msgstr "Automatyczne chodzenie do przodu wyłączone" msgid "Automatic forward enabled" msgstr "Automatyczne chodzenie do przodu włączone" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Ukryte granice bloków" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Granice bloków pokazane dla wszystkich bloków" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Granice bloku wyświetlane dla bieżącego bloku" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Granice bloków pokazane dla pobliskich bloków" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Aktualizowanie kamery wyłączone" @@ -1125,6 +1361,12 @@ msgstr "Aktualizowanie kamery wyłączone" msgid "Camera update enabled" msgstr "Aktualizowanie kamery włączone" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" +"Nie można wyświetlić granic bloków (wymagane uprawnienie 'basic_debug')" + #: src/client/game.cpp msgid "Change Password" msgstr "Zmień hasło" @@ -1137,6 +1379,10 @@ msgstr "Tryb kinowy wyłączony" msgid "Cinematic mode enabled" msgstr "Tryb kinowy włączony" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Klient został rozłączony" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Skryptowanie po stronie klienta jest wyłączone" @@ -1145,6 +1391,10 @@ msgstr "Skryptowanie po stronie klienta jest wyłączone" msgid "Connecting to server..." msgstr "Łączenie z serwerem..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Połączenie nie powiodło się z nieznanego powodu" + #: src/client/game.cpp msgid "Continue" msgstr "Kontynuuj" @@ -1157,30 +1407,35 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" -"Sterowanie:↵\n" -"- %s: idź do przodu↵\n" -"- %s: idź do tyłu↵\n" -"- %s: idź w lewo↵\n" -"- %s: idź w prawo↵\n" -"- %s: skocz/wspinaj się↵\n" -"- %s: skradaj się/idź do dołu↵\n" -"- %s: upuść przedmiot↵\n" -"- %s: otwórz ekwipunek↵\n" -"- Mysz: obróć się/patrz↵\n" -"- Lewy przycisk myszy: kop/uderz↵\n" -"- Prawy przycisk myszy: postaw/użyj↵\n" -"- Rolka myszy: wybierz przedmiot↵\n" -"- %s: czatuj↵\n" +"Sterowanie:\n" +"- %s: idź do przodu\n" +"- %s: przesuń się do tyłu\n" +"- %s: przesuń się w lewo\n" +"- %s: przesuń w prawo\n" +"- %s: skok/wspinaj się\n" +"- %s: kopanie/cios\n" +"- %s: połóż/użyj\n" +"- %s: skradanie się/schodzenie w dół\n" +"- %s: upuść przedmiot\n" +"- %s: ekwipunek\n" +"- Mysz: obróć / spójrz\n" +"- Kółko myszy: wybierz element\n" +"- %s: czat\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Nie można rozwiązać adresu: %s" #: src/client/game.cpp msgid "Creating client..." @@ -1238,6 +1493,11 @@ msgstr "Wyłączono nieskończony zasięg widoczności" msgid "Enabled unlimited viewing range" msgstr "Włączono nieskończony zasięg widoczności" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Tworzenie klienta..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Wyjście do menu" @@ -1311,32 +1571,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Minimapa aktualnie wyłączona przez grę lub mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Minimapa ukryta" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Minimapa w trybie radaru, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Minimapa w trybie radaru, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Minimapa w trybie radaru, Zoom x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minimapa w trybie powierzchniowym, powiększenie x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minimapa w trybie powierzchniowym, powiększenie x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minimapa w trybie powierzchniowym, powiększenie x4" +msgid "Multiplayer" +msgstr "Gra wieloosobowa" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1400,16 +1636,31 @@ msgstr "Głośność wyciszona" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "System dźwiękowy jest wyłączony" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "System dźwiękowy nie jest obsługiwany w tej kompilacji" #: src/client/game.cpp msgid "Sound unmuted" msgstr "Głośność włączona ponownie" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Serwer prawdopodobnie pracuje na innej wersji %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Nie można połączyć się z %s, ponieważ IPv6 jest wyłączony" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Nie można nasłuchiwać na %s, ponieważ IPv6 jest wyłączony" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1479,10 +1730,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Klawisz Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Delete" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1730,36 +1977,39 @@ msgstr "Przycisk X 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Hasła nie są jednakowe!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimapa ukryta" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Zarejestruj się i dołącz" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" -"Próbujesz wejść na serwer \"%s\" o nazwie \"%2$s2\" po raz pierwszy . Jeśli " -"zdecydujesz się kontynuować na serwerze zostanie utworzone nowe konto z " -"Twoim danymi.\n" -"Wpisz ponownie hasło i wciśnij \"Zarejestruj się i Dołącz\" aby potwierdzić " -"utworzenie konta lub wciśnij \"Anuluj\" aby przerwać ten proces." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimapa w trybie radaru, Zoom x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimapa w trybie powierzchniowym, powiększenie x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimapa w trybie teksturowym" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Nie udało się otworzyć strony internetowej" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Otwieram stronę internetową" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Kontynuuj" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Specjalny\" = wspinaj się" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = schodź" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1769,15 +2019,23 @@ msgstr "Automatyczne chodzenie do przodu" msgid "Automatic jumping" msgstr "Automatyczne skoki" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Tył" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Granice bloków" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Zmień kamerę" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Czat" @@ -1830,10 +2088,8 @@ msgid "Key already in use" msgstr "Klawisz już zdefiniowany" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" -"Zdefiniowane klawisze. (Jeżeli to menu nie działa, usuń skonfigurowane " -"klawisze z pliku minetest.conf)" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1863,10 +2119,6 @@ msgstr "Zrzut ekranu" msgid "Sneak" msgstr "Skradanie" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Specialne" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Przełącz HUD" @@ -1896,9 +2148,8 @@ msgid "Toggle noclip" msgstr "Przełącz tryb noclip" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle pitchmove" -msgstr "Przełącz historię czatu" +msgstr "Przełączanie przemieszczania" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" @@ -1908,10 +2159,6 @@ msgstr "naciśnij klawisz" msgid "Change" msgstr "Zmień" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Potwierdź hasło" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Nowe hasło" @@ -1920,6 +2167,10 @@ msgstr "Nowe hasło" msgid "Old Password" msgstr "Stare hasło" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Hasła nie są jednakowe!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Wyjście" @@ -1929,14 +2180,9 @@ msgid "Muted" msgstr "Wyciszony" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Głośność: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Enter " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Głośność: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1945,6 +2191,16 @@ msgstr "Enter " msgid "LANG_CODE" msgstr "pl" +#: 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 "Wybierz nazwę!" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1956,16 +2212,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Użyj wirtualnego joysticka, aby zaaktywować przycisk \"aux\".\n" -"Gdy włączone, wirtualny joystick również naciśnie przycisk \"aux\", gdy " -"znajduje się poza głównym okręgiem." +"(Android) Użyj wirtualnego joysticka, aby aktywować przycisk \"Aux1\".\n" +"Gdy jest włączone to wirtualny joystick również naciśnie przycisk \"Aux1\", " +"gdy znajduje się poza głównym okręgiem." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" "Can be used to move a desired point to (0, 0) to create a\n" @@ -1976,13 +2231,15 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" -"(X, Y, Z) margines fraktalu od centrum świata w jednostkach \"skali\".\n" -"Używany by przesunąć odpowiednie miejsce do punktu spawnu podłoża blisko " -"punktu (0, 0).\n" -"Domyślny jest odpowiedni dla zbiorów Mandelbrota, lecz wymaga edycji dla " -"zbiorów Julii.\n" -"Zakres w przybliżeniu -2 do 2. Pomnożony przez \"skalę\" dla marginesu na " -"węzłech." +"(X,Y,Z) przesunięcie fraktala od środka świata w jednostkach „skali”.\n" +"Może być użyty do przeniesienia żądanego punktu do (0, 0), aby utworzyć a\n" +"odpowiedni punkt odradzania, lub aby umożliwić „przybliżenie” na żądanym " +"miejscu\n" +"punkt, zwiększając „skalę”.\n" +"Domyślnie ustawiony jest odpowiedni punkt odradzania dla Mandelbrota\n" +"zestawy z domyślnymi parametrami, może wymagać zmiany w innych\n" +"sytuacje.\n" +"Zakres mniej więcej -2 do 2. Pomnóż przez „skalę” dla przesunięcia w węzłach." #: src/settings_translation_file.cpp msgid "" @@ -2003,14 +2260,6 @@ msgstr "" "odpowiedniego \n" "dla wyspy, ustaw 3 wartości równe, aby uzyskać surowy kształt." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax occlusion z informacją nachylenia (szybsze).\n" -"1 = relief mapping (wolniejsze, bardziej dokładne)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "Szum 2D który wpływa na kształt/rozmiar łańcuchów górskich." @@ -2036,9 +2285,8 @@ msgid "2D noise that controls the size/occurrence of step mountain ranges." msgstr "Szum 2D, który wpływa na rozmiar/ występowanie stepów górskich." #: src/settings_translation_file.cpp -#, fuzzy msgid "2D noise that locates the river valleys and channels." -msgstr "Szum 2D, który wpływa na kształt/rozmiar zaokrąglonych wzgórz." +msgstr "Szum 2D lokalizuje doliny i kanały rzeczne." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2049,9 +2297,8 @@ msgid "3D mode" msgstr "Modele 3D" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Siła map normlanych" +msgstr "Siła paralaksy w trybie 3D" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2072,6 +2319,11 @@ msgid "" "to be adjusted, as floatland tapering functions best when this noise has\n" "a value range of approximately -2.0 to 2.0." msgstr "" +"Szum 3D określający strukturę terenów pływających.\n" +"Jeśli wartość domyślna zostanie zmieniona, konieczne będzie dostosowanie " +"\"skali\" szumu (domyślnie 0,7), \n" +"ponieważ zwężanie terenów pływających działa najlepiej, \n" +"gdy wartość szumu jest z zakresu od około -2,0 do 2,0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2086,7 +2338,6 @@ msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." msgstr "Szum 3D dla nawisów skalnych, klifów, itp. Zwykle mało zróżnicowany." #: src/settings_translation_file.cpp -#, fuzzy msgid "3D noise that determines number of dungeons per mapchunk." msgstr "Szum 3D, który wpływa na liczbę lochów na jeden mapchunk." @@ -2114,6 +2365,10 @@ msgstr "" "- pageflip: 3D bazujące na quadbuffer.\n" "Zauważ, że tryb interlaced wymaga włączenia shaderów." +#: 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" @@ -2134,23 +2389,24 @@ msgstr "" "wyłączony." #: src/settings_translation_file.cpp -#, fuzzy msgid "ABM interval" -msgstr "Interwał zapisu mapy" +msgstr "Interwał ABM" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "Budżet czasowy ABM" #: src/settings_translation_file.cpp -#, fuzzy msgid "Absolute limit of queued blocks to emerge" -msgstr "Bezwzględny limit kolejki" +msgstr "Bezwzględny limit kolejki pojawiających się bloków" #: src/settings_translation_file.cpp msgid "Acceleration in air" msgstr "Przyspieszenie w powietrzu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Acceleration of gravity, in nodes per second per second." -msgstr "Przyśpieszenie grawitacyjne, w blokach na sekundę." +msgstr "Przyśpieszenie grawitacyjne, w blokach na sekundę do kwadratu." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" @@ -2190,6 +2446,11 @@ msgstr "" "Ustaw konfiguracje DPI dla twojego ekranu (nie X11/Tylko Android) np. dla " "ekranów 4k." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Dostosuj wykrytą gęstość wyświetlania, używaną do skalowania elementów UI." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2199,6 +2460,17 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Dostosowuje gęstość warstwy pływających wysp.\n" +"Aby zwiększyć gęstość, ustaw wyższą wartość. Może być dodatnia lub ujemna.\n" +"Wartość = 0,0: 50% objętości to pływająca wyspa.\n" +"Wartość = 2,0 (może być wyższa w zależności od 'mgv7_np_floatland', aby mieć " +"pewność,\n" +"zawsze sprawdzaj) tworzy stałą warstwę pływającej wyspy." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Dołącz nazwę przedmiotu" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2219,7 +2491,8 @@ msgstr "" "światło nocne podlega zmianie w minimalnym stopniu." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Zawsze lataj oraz poruszaj się szybko" #: src/settings_translation_file.cpp @@ -2243,7 +2516,6 @@ msgid "Announce server" msgstr "Rozgłoś serwer" #: src/settings_translation_file.cpp -#, fuzzy msgid "Announce to this serverlist." msgstr "Rozgłoś listę serwerów." @@ -2289,27 +2561,29 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" -"Z tej odległości serwer mocno zoptymalizuje, które bloki są wysłane do " +"W tej odległości serwer agresywnie zoptymalizuje, które bloki są wysyłane " +"do\n" "klientów.\n" -"Małe wartości mogą bardzo poprawić działanie, kosztem widocznego " -"renderowania glitchy.\n" -"(Niektóre bloki nie będą wygenerowane pod wodą ani w jaskiniach, jak również " -"na lądzie.\n" -"Zmiana wartości na wyższą niż max_block_send_distance wyłącza tą " -"optymalizację.\n" -"Zapisane w blokach mapy (16 bloków)." +"Małe wartości potencjalnie znacznie poprawiają wydajność, kosztem " +"widocznych\n" +"trzaski renderowania (niektóre bloki nie będą renderowane pod wodą i w " +"jaskiniach,\n" +"jak również czasami na lądzie).\n" +"Ustawienie tego na wartość większą niż max_block_send_distance wyłącza to\n" +"optymalizacja.\n" +"Podane w mapblocks (16 węzłów)." + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Automatic forward key" msgstr "Klawisz automatycznego poruszania się do przodu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Automatically jump up single-node obstacles." -msgstr "" -"Automatycznie przeskakuj jedno-blokowe przeszkody.\n" -"type: bool" +msgstr "Automatycznie przeskakuj jedno-blokowe przeszkody." #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." @@ -2323,6 +2597,14 @@ msgstr "Automatyczny zapis rozmiaru okienka" msgid "Autoscaling mode" msgstr "Tryb automatycznego skalowania" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Klawisz Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Klawisz Aux1 używany do wspinania/schodzenia" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Wstecz" @@ -2335,10 +2617,6 @@ msgstr "Poziom ziemi" msgid "Base terrain height." msgstr "Bazowa wysokość terenu." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Podstawowy" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Podstawowe uprawnienia" @@ -2360,40 +2638,37 @@ msgid "Bind address" msgstr "Sprawdzanie adresu" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +#, fuzzy +msgid "Biome API noise parameters" msgstr "Parametry hałasu temperatury i wilgotności API Biome" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Szum biomu" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bity na piksel (głębia koloru) w trybie pełnoekranowym." - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "Dystans optymalizacji wysyłanych bloków" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Bobbing" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bold and italic font path" -msgstr "Ścieżka czcionki typu Monospace" +msgstr "Ścieżka pogrubionej czcionki oraz kursywy" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold and italic monospace font path" -msgstr "Ścieżka czcionki typu Monospace" +msgstr "Ścieżka czcionki o stałej szerokości i pogrubionej kursywą" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold font path" -msgstr "Ścieżka czcionki" +msgstr "Ścieżka fontu pogrubionego" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold monospace font path" -msgstr "Ścieżka czcionki typu Monospace" +msgstr "Pogrubiona ścieżka czcionki o stałej szerokości" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2404,19 +2679,21 @@ msgid "Builtin" msgstr "Wbudowany" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Mapowanie wypukłości" +#, fuzzy +msgid "Camera" +msgstr "Zmień kamerę" #: 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" "Increasing can reduce artifacting on weaker GPUs.\n" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" -"Dystans kamery obok samolotu w węzłach, pomiędzy 0 i 0.5\n" -"Większość użytkowników nie będzie potrzebowała tego zmieniać.\n" +"Odległość kamery „w pobliżu płaszczyzny przycinania” w węzłach, od 0 do " +"0.25\n" +"Działa tylko na platformie GLES. Większość użytkowników nie będzie " +"potrzebowała tego zmieniać.\n" "Zwiększenie może zmniejszyć występowanie artefaktów na słabszych kartach " "graficznych.\n" "0.1 = Domyślnie, 0.25 = Dobra wartość dla słabszych tabletów." @@ -2474,33 +2751,26 @@ msgid "Cavern threshold" msgstr "Próg groty" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cavern upper limit" -msgstr "Szerokość jaskini" +msgstr "Górna granica jaskiń" #: 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 "" +"Środek zakresu wzmocnienia krzywej światła.\n" +"0.0 to minimalny poziom światła, 1.0 to maksymalny poziom światła." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Zmienia interfejs użytkownika menu głównego:\n" -"- Pełny: Wiele światów jednoosobowych, wybór gry, wybór paczki tekstur, " -"itd.\n" -"- Prosty: Jeden świat jednoosobowy, brak wyboru gry lub paczki tekstur. " -"Może być konieczny dla mniejszych ekranów." +msgid "Chat command time message threshold" +msgstr "Próg wiadomości czasu polecenia czatu" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Komendy czatu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" msgstr "Rozmiar czcionki" @@ -2509,19 +2779,16 @@ msgid "Chat key" msgstr "Klawisz czatu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Poziom logowania debugowania" +msgstr "Poziom dziennika czatu" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message count limit" -msgstr "Komunikat o stanie połączenia" +msgstr "Limit liczby wiadomości na czacie" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message format" -msgstr "Maksymalna długość wiadomości na czacie" +msgstr "Format wiadomości czatu" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" @@ -2536,8 +2803,8 @@ msgid "Chat toggle key" msgstr "Klawisz przełączania czatu" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Komenda" +msgid "Chat weblinks" +msgstr "Chat widoczny" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2555,6 +2822,14 @@ msgstr "Klawisz trybu Cinematic" msgid "Clean transparent textures" msgstr "Czyste przeźroczyste tekstury" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Klikalne łącza internetowe (kliknięcie środkowym przyciskiem lub Ctrl+lewy " +"przycisk myszy) włączone w danych wyjściowych konsoli czatu." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Klient" @@ -2568,14 +2843,17 @@ msgid "Client modding" msgstr "Modyfikacja klienta" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client side modding restrictions" -msgstr "Modyfikacja klienta" +msgstr "Ograniczenia modowania po stronie klienta" + +#: src/settings_translation_file.cpp +msgid "Client side node lookup range restriction" +msgstr "Ograniczenie zakresu wyszukiwania węzłów po stronie klienta" #: src/settings_translation_file.cpp #, fuzzy -msgid "Client side node lookup range restriction" -msgstr "Ograniczenie zasięgu widoczności bloków Client side" +msgid "Client-side Modding" +msgstr "Modyfikacja klienta" #: src/settings_translation_file.cpp msgid "Climbing speed" @@ -2601,6 +2879,10 @@ msgstr "Chmury w menu" msgid "Colored fog" msgstr "Kolorowa mgła" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Kolorowe cienie" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2611,6 +2893,13 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" +"Lista oddzielonych przecinkami flag do ukrycia w repozytorium treści.\n" +"„niewolne” może służyć do ukrywania pakietów, które nie kwalifikują się jako " +"„wolne oprogramowanie”,\n" +"zgodnie z definicją Free Software Foundation.\n" +"Możesz także określić oceny treści.\n" +"Te flagi są niezależne od wersji Minetest,\n" +"więc zobacz pełną listę na https://content.minetest.net/help/content_flags/" #: src/settings_translation_file.cpp msgid "" @@ -2632,6 +2921,31 @@ msgstr "" msgid "Command key" msgstr "Klawisz komend" +#: src/settings_translation_file.cpp +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 "" +"Poziom kompresji jaki ma być stosowany przy zapisie bloków mapy na dysk.\n" +"-1 - użyj domyślnego poziomu kompresji\n" +"0 - najmniejsza kompresja, najszybciej\n" +"9 - najlepsza kompresja, najwolniej" + +#: src/settings_translation_file.cpp +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 "" +"Poziom kompresji jaki ma być użyty podczas wysyłania bloków mapy do " +"klienta.\n" +"-1 - użyj domyślnego poziomu kompresji\n" +"0 - najmniejsza kompresja, najszybciej\n" +"9 - najlepsza kompresja, najwolniej" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Połączone szkło" @@ -2658,13 +2972,21 @@ msgstr "Wysokość konsoli" #: src/settings_translation_file.cpp #, fuzzy +msgid "Content Repository" +msgstr "Repozytorium Zawartości z Sieci" + +#: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "Flaga czarnej listy ContentDB" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Maksymalna liczba jednoczesnych pobrań ContentDB" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" -msgstr "Zawartość" +msgstr "Adres URL ContentDB" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -2691,14 +3013,15 @@ msgid "" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" -"Kontrola długości cyklu dnia i nocy.\n" -"Przykłady: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = dzień/noc/cokolwiek " -"zostaje niezmienione." +"Reguluje długość cyklu dzień/noc.\n" +"Przykłady:\n" +"72 = 20min, 360 = 4min, 1 = 24h, 0 = dzień/noc/wszystko pozostaje bez zmian." #: src/settings_translation_file.cpp -#, fuzzy -msgid "Controls sinking speed in liquid." -msgstr "Wpływa na prędkość zanurzania w płynie." +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." @@ -2709,11 +3032,15 @@ msgid "Controls steepness/height of hills." msgstr "Kontroluje stromość/wysokość gór." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Controls width of tunnels, a smaller value creates wider tunnels.\n" "Value >= 10.0 completely disables generation of tunnels and avoids the\n" "intensive noise calculations." msgstr "" +"Wpływa na szerokość tuneli, mniejsza wartość tworzy szersze tunele.\n" +"Wartość >= 10,0 całkowicie wyłącza tworzenie tuneli i pozwala na uniknięcie\n" +"intensywnych obliczeń hałasu." #: src/settings_translation_file.cpp msgid "Crash message" @@ -2728,16 +3055,25 @@ msgid "Crosshair alpha" msgstr "Kanał alfa celownika" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Kanał alfa celownika (pomiędzy 0 a 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Kanał alfa celownika (pomiędzy 0 a 255).\n" +"Wpływa również na kolor celownika obiektów." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Kolor celownika" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Kolor celownika (R,G,B)." +#, fuzzy +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Kolor celownika (R, G,B).\n" +"Wpływa również na kolor celownika" #: src/settings_translation_file.cpp msgid "DPI" @@ -2754,20 +3090,19 @@ msgstr "Klawisz przełączania informacji debugowania" #: src/settings_translation_file.cpp #, fuzzy msgid "Debug log file size threshold" -msgstr "Próg szumu pustyni" +msgstr "Próg rozmiaru pliku dziennika debugowania" #: src/settings_translation_file.cpp msgid "Debug log level" msgstr "Poziom logowania debugowania" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Klawisz zmniejszania głośności" +msgid "Debugging" +msgstr "" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Decrease this to increase liquid resistance to movement." -msgstr "Zmniejsz wartość, aby zwiększyć opór ruchu w cieczy." +msgid "Dec. volume key" +msgstr "Klawisz zmniejszania głośności" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2804,15 +3139,18 @@ msgstr "Domyślny format raportu" #: src/settings_translation_file.cpp #, fuzzy msgid "Default stack size" -msgstr "Domyślna gra" +msgstr "Domyślny rozmiar stosu" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Domyślny limit czasu dla cURL, w milisekundach.\n" -"Ma znaczenie tylko gdy skompilowane z cURL." +"Określa jakość filtrowania cieni\n" +"Symuluje to efekt miękkich cieni, stosując dysk PCF lub poisson\n" +"ale także zużywa więcej zasobów." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2825,12 +3163,12 @@ msgstr "Określa obszary z piaszczystymi plażami." #: src/settings_translation_file.cpp #, fuzzy msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "Określa obszary wyższych terenów oraz wpływa na stromość klifów." +msgstr "Określa rozmieszczenie wyższego terenu i stromość klifów." #: src/settings_translation_file.cpp #, fuzzy msgid "Defines distribution of higher terrain." -msgstr "Określa obszary 'terrain_higher' (szczyt wzgórza)." +msgstr "Określa rozmieszczenie wyższych terenów." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." @@ -2844,23 +3182,15 @@ msgstr "Określa strukturę kanałów rzecznych." msgid "Defines location and terrain of optional hills and lakes." msgstr "Określa położenie oraz teren z dodatkowymi górami i jeziorami." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Definiuje krok próbkowania tekstury.\n" -"Wyższa wartość reprezentuje łagodniejszą mapę normalnych." - #: src/settings_translation_file.cpp #, fuzzy msgid "Defines the base ground level." -msgstr "Określa obszary drzewiaste oraz ich gęstość." +msgstr "Określa podstawowy poziom podłoża." #: src/settings_translation_file.cpp #, fuzzy msgid "Defines the depth of the river channel." -msgstr "Określa obszary drzewiaste oraz ich gęstość." +msgstr "Określa głębokość kanałów rzecznych." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." @@ -2871,12 +3201,11 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "Defines the width of the river channel." -msgstr "Określa strukturę kanałów rzecznych." +msgstr "Określa szerokość kanałów rzecznych." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river valley." -msgstr "Określa obszary na których drzewa mają jabłka." +msgstr "Określa szerokość doliny rzecznej." #: src/settings_translation_file.cpp msgid "Defines tree areas and tree density." @@ -2924,18 +3253,27 @@ msgid "Desert noise threshold" msgstr "Próg szumu pustyni" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Deserts occur when np_biome exceeds this value.\n" "When the 'snowbiomes' flag is enabled, this is ignored." msgstr "" "Pustynie pojawią się gdy np_biome przekroczy tą wartość.\n" -"Kiedy nowy system biomu jest odblokowany, ta wartość jest ignorowana." +"Kiedy flaga 'snowbiomes' jest włączona, ta wartość jest ignorowana." #: src/settings_translation_file.cpp msgid "Desynchronize block animation" msgstr "Odsynchronizuj animację bloków" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Dekoracje" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "Klawisz kopania" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Włącz efekty cząsteczkowe" @@ -2948,6 +3286,17 @@ msgstr "Wyłącz anticheat" msgid "Disallow empty passwords" msgstr "Nie zezwalaj na puste hasła" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Display Density Scaling Factor" +msgstr "Wyświetl współczynnik skalowania gęstości" + +#: 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 "Serwer DNS, wyświetlany na liście serwerów." @@ -2979,13 +3328,15 @@ msgstr "Minimalna wartość Y lochu" #: src/settings_translation_file.cpp #, fuzzy msgid "Dungeon noise" -msgstr "Minimalna wartość Y lochu" +msgstr "Hałas lochu" #: src/settings_translation_file.cpp msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" +"Włącz protokół sieciowy IPv6 (dla gry oraz dla jej serwera).\n" +"Wymagane dla połączeń z protokołem sieciowym IPv6." #: src/settings_translation_file.cpp msgid "" @@ -2995,18 +3346,44 @@ msgstr "" "Odblokuj wsparcie modyfikacji Lua.\n" "To wsparcie jest eksperymentalne i API może ulec zmianie." +#: 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 "" +"Włącz filtrowanie dysku poisson.\n" +"Jeśli włączone, to używa dysku poisson do \"miękkich cieni\". W przeciwnym " +"razie używa filtrowania PCF." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Włącza kolorowe cienie. \n" +"Na rzeczywistych półprzezroczystych węzłach rzuca kolorowe cienie. To " +"kosztowne." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Odblokuj okno konsoli" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Zezwól na tryb kreatywny dla nowo powstałych map." +#, fuzzy +msgid "Enable creative mode for all players" +msgstr "Zezwól na tryb kreatywny dla wszystkich graczy" #: src/settings_translation_file.cpp msgid "Enable joysticks" msgstr "Włącz 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 "Włącz wsparcie kanałów z modami." @@ -3023,17 +3400,6 @@ msgstr "Włącz obrażenia i umieranie graczy." msgid "Enable random user input (only used for testing)." msgstr "Włącz losowe wejście użytkownika (tylko dla testowania)." -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Enable register confirmation" -msgstr "Włącz potwierdzanie rejestracji" - -#: 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" @@ -3042,6 +3408,10 @@ msgstr "" "Włącz gładkie oświetlenie z prostym efektem ambient occlusion.\n" "Wyłącz dla szybkości lub wyglądu." +#: 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" @@ -3069,10 +3439,13 @@ msgstr "" "jeżeli następuje połączenie z serwerem." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Enable vertex buffer objects.\n" "This should greatly improve graphics performance." msgstr "" +"Uaktywnij \"vertex buffer objects\". \n" +"Powinno to znacznie polepszyć wydajność karty graficznej." #: src/settings_translation_file.cpp msgid "" @@ -3089,34 +3462,30 @@ msgid "" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" -"Przełącza pracę serwera w trybie IPv6. Serwer IPv6 może być ograniczony\n" -"tylko dla klientów IPv6, w zależności od konfiguracji systemu.\n" -"Ignorowane jeżeli bind_address jest ustawiony." +"Włącza/wyłącza uruchamianie serwera IPv6.\n" +"Ignorowane jeśli ustawiony jest bind_address.\n" +"Wymaga włączenia enable_ipv6." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Enables Hable's 'Uncharted 2' filmic tone mapping.\n" "Simulates the tone curve of photographic film and how this approximates the\n" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" +"Umożliwia Hable's 'Uncharted 2' filmowe mapowanie tonów.\n" +"Symuluje krzywą tonalną kliszy fotograficznej i sposób, w jaki przybliża " +"ona\n" +"wygląd obrazów o wysokim zakresie dynamiki. Kontrast w średnim zakresie jest " +"lekko wzmocniony\n" +"Wzmocnienie kontrastu w średnich zakresach, stopniowa kompresja świateł i " +"cieni." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." msgstr "Włącz animację inwentarza przedmiotów." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Włącza mapowanie wypukłości dla tekstur. Mapy normalnych muszą być dodane w " -"paczce tekstur\n" -"lub muszą być automatycznie wygenerowane.\n" -"Wymaga włączonych shaderów." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Włącza cachowanie facedir obracanych meshów." @@ -3126,28 +3495,32 @@ msgid "Enables minimap." msgstr "Włącz minimapę." #: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Włącza generację map normalnych w locie (efekt płaskorzeźby).\n" -"Wymaga włączenia mapowania wypukłości." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Włącza mapowanie paralaksy.\n" -"Wymaga włączenia shaderów." - -#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Enables the sound system.\n" "If disabled, this completely disables all sounds everywhere and the in-game\n" "sound controls will be non-functional.\n" "Changing this setting requires a restart." msgstr "" +"Włącza dźwięk.\n" +"Jeśli wyłączone, całkowicie wyłącza wszystkie dźwięki wszędzie oraz " +"sterowanie dźwiękiem \n" +"w grze nie będzie działać.\n" +"Zmiana tego ustawienia wymaga ponownego uruchomienia." + +#: 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 "" +"Umożliwia kompromisy, które zmniejszają obciążenie procesora lub zwiększają " +"wydajność renderowania\n" +"kosztem drobnych usterek wizualnych, które nie wpływają na grywalność gry." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "Profilowanie doliny" #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" @@ -3158,14 +3531,7 @@ msgid "Entity methods" msgstr "Metody bytów" #: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Eksperymentalna opcja, może powodować widoczne przestrzenie\n" -"pomiędzy blokami kiedy ustawiona powyżej 0." - -#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" "Value = 1.0 creates a uniform, linear tapering.\n" @@ -3174,10 +3540,22 @@ msgid "" "Values < 1.0 (for example 0.25) create a more defined surface level with\n" "flatter lowlands, suitable for a solid floatland layer." msgstr "" +"Wykładnik zwężenia pływającej wyspy. Zmienia zachowanie zwężenia.\n" +"Wartość = 1.0 tworzy jednolite, liniowe zwężenie.\n" +"Wartości > 1.0 tworzą gładkie zwężenie odpowiednie dla domyślnie " +"odseparowanych\n" +"floatlands.\n" +"Wartości < 1.0 (np. 0.25) tworzą bardziej zdefiniowany poziom powierzchni z\n" +"płaskimi nizinami, odpowiednimi dla jednolitej warstwy pływających wysp." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS podczas pauzy w menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "FPS when unfocused or paused" +msgstr "Maksymalny FPS gdy gra spauzowana" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3194,19 +3572,7 @@ msgstr "Współczynnik spadku drgań" #: src/settings_translation_file.cpp #, fuzzy msgid "Fallback font path" -msgstr "Zastępcza czcionka" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Zastępczy cień czcionki" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Zastępcza przeźroczystość cienia czcionki" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Zastępczy rozmiar czcionki" +msgstr "Ścieżka czcionki zastępczej" #: src/settings_translation_file.cpp msgid "Fast key" @@ -3226,11 +3592,11 @@ msgstr "Szybkie poruszanie" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "Szybki ruch (za pomocą przycisku „specjalnego”).\n" -"Wymaga to uprawnienia „fast” na serwerze." +"Wymaga to uprawnienia „fast” na serwerze." #: src/settings_translation_file.cpp msgid "Field of view" @@ -3246,8 +3612,9 @@ msgid "" "the\n" "Multiplayer Tab." msgstr "" -"Plik w kliencie (lista serwerów) który zawiera ulubione ulubione serwery " -"wyświetlane w zakładce Multiplayer." +"Plik w kliencie (lista serwerów), który zawiera ulubione serwery " +"wyświetlane \n" +"w zakładce Trybu wieloosobowego." #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3265,20 +3632,22 @@ msgstr "Mapowanie Filmic tone" #, fuzzy msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Filtrowanie tekstur może wymieszać wartości RGB piksela z w pełni " "przeźroczystymi sąsiadami,\n" "które optymalizatory PNG najczęściej odrzucają, co czasem powoduje " "ciemniejsze lub jaśniejsze\n" -"krawędzie w przeźroczystych teksturach. Zastosuj ten filtr aby wyczyścić to " +"krawędzie w przeźroczystych teksturach. Zastosuj ten filtr aby wyczyścić " +"to \n" "w czasie ładowania tekstur." #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filtrowanie anizotropowe" +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "Antyaliasing:" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3300,37 +3669,37 @@ msgstr "Ustaw wirtualny joystick" #: src/settings_translation_file.cpp #, fuzzy msgid "Floatland density" -msgstr "Gęstość gór na latających wyspach" +msgstr "Gęstość latających wysp" #: src/settings_translation_file.cpp #, fuzzy msgid "Floatland maximum Y" -msgstr "Maksymalna wartość Y lochu" +msgstr "Maksymalna wartość Y latających wysp" #: src/settings_translation_file.cpp #, fuzzy msgid "Floatland minimum Y" -msgstr "Minimalna wartość Y lochu" +msgstr "Minimalna wartość Y latających wysp" #: src/settings_translation_file.cpp #, fuzzy msgid "Floatland noise" -msgstr "Podstawowy szum wznoszącego się terenu" +msgstr "Szum latających wysp" #: src/settings_translation_file.cpp #, fuzzy msgid "Floatland taper exponent" -msgstr "Gęstość gór na latających wyspach" +msgstr "Wykładnik zbieżności latających wysp" #: src/settings_translation_file.cpp #, fuzzy msgid "Floatland tapering distance" -msgstr "Podstawowy szum wznoszącego się terenu" +msgstr "Odległość zwężania latających wysp" #: src/settings_translation_file.cpp #, fuzzy msgid "Floatland water level" -msgstr "Poziom wznoszonego terenu" +msgstr "Poziom wody pływającej wyspy" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3345,7 +3714,6 @@ msgid "Fog" msgstr "Mgła" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fog start" msgstr "Początek mgły" @@ -3354,12 +3722,19 @@ msgid "Fog toggle key" msgstr "Klawisz przełączania mgły" #: src/settings_translation_file.cpp -msgid "Font bold by default" -msgstr "" +#, fuzzy +msgid "Font" +msgstr "Rozmiar czcionki" #: src/settings_translation_file.cpp +#, fuzzy +msgid "Font bold by default" +msgstr "Domyślnie pogrubiona czcionka" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Font italic by default" -msgstr "" +msgstr "Domyślnie kursywa czcionki" #: src/settings_translation_file.cpp msgid "Font shadow" @@ -3374,22 +3749,46 @@ msgid "Font size" msgstr "Rozmiar czcionki" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" +#, fuzzy +msgid "Font size divisible by" +msgstr "Rozmiar czcionki podzielny przez" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" +"Rozmiar czcionki domyślnej czcionki, gdzie 1 jednostka = 1 piksel przy 96 DPI" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" +"Rozmiar czcionki o stałej szerokości, gdzie 1 jednostka = 1 piksel przy 96 " +"DPI" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Font size of the recent chat text and chat prompt in point (pt).\n" "Value 0 will use the default font size." msgstr "" +"Rozmiar czcionki tekstu ostatniej rozmowy i monitu rozmowy w punktach (pt).\n" +"Wartość 0 spowoduje użycie domyślnego rozmiaru czcionki." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"W przypadku czcionek pikselowych, które nie skalują się dobrze, zapewnia to, " +"że ich rozmiary używanych\n" +"z nią będą zawsze podzielne przez tę wartość w pikselach. Na przykład,\n" +"czcionka pikselowa o wysokości 16 pikseli powinna mieć ustawioną tą wartość " +"na 16, więc zawsze będzie tylko\n" +"rozmiar 16, 32, 48, itd., więc mod żądający rozmiaru 25 otrzyma 32." #: src/settings_translation_file.cpp #, fuzzy @@ -3460,11 +3859,6 @@ msgstr "Typ fraktalny" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Część widocznej odległości w której mgła zaczyna się renderować" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "FreeType fonts" -msgstr "Czcionki Freetype" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3488,15 +3882,19 @@ 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 "" +"Maksymalna odległość z której klienci wiedzą o obiektach, podawanych w " +"blokach map (16 węzłów).\n" +"\n" +"Ustawienie wartości większej niż active_block_range spowoduje również, że " +"serwer\n" +"będzie utrzymywał aktywne obiekty do tej odległości w kierunku w\n" +"którym patrzy gracz. (Dzięki temu można uniknąć nagłego zniknięcia mobów z " +"pola widzenia)" #: src/settings_translation_file.cpp msgid "Full screen" msgstr "Pełny ekran" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Głębia koloru w trybie pełnoekranowym" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Tryb pełnoekranowy." @@ -3514,8 +3912,17 @@ msgid "GUI scaling filter txr2img" msgstr "Filtr skalowania GUI txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Generuj mapy normalnych" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Gry" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" #: src/settings_translation_file.cpp msgid "Global callbacks" @@ -3526,34 +3933,46 @@ msgstr "Globalne wywołania zwrotne" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Globalne właściwości generowania map.\n" -"W generatorze map v6 flaga \"decorations\" kontroluje wszystkie dekoracje\n" -"z wyjątkiem drzew i trawy dżungli. we wszystkich innych generatorach flaga\n" -"ta kontroluje wszystkie dekoracje.\n" -"Flagi, które nie są wymienione w ciągu flagi nie są modyfikowane z " -"domyślnych.\n" -"Flagi rozpoczynające się od \"no\" są stosowane aby jawnie ją wyłączyć." +"W generatorze map v6 flaga \"decorations\" kontroluje wszystkie dekoracje z " +"wyjątkiem drzew \n" +"i trawy dżungli. we wszystkich innych generatorach flaga ta kontroluje " +"wszystkie dekoracje." #: src/settings_translation_file.cpp #, fuzzy msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." -msgstr "Gradient krzywej światła w maksymalnej pozycji." +msgstr "" +"Gradient krzywej światła w maksymalnej pozycji.\n" +"Wpływa na kontrast najwyższych poziomów jasności." #: src/settings_translation_file.cpp #, fuzzy msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." -msgstr "Gradient krzywej światła w minimalnej pozycji." +msgstr "" +"Gradient krzywej światła w minimalnej pozycji.\n" +"Wpływa na kontrast najniższych poziomów jasności." #: src/settings_translation_file.cpp 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 "Grawitacja" @@ -3565,16 +3984,21 @@ msgstr "Poziom ziemi" #: src/settings_translation_file.cpp #, fuzzy msgid "Ground noise" -msgstr "Szum błota" +msgstr "Szum ziemi" #: src/settings_translation_file.cpp #, fuzzy msgid "HTTP mods" -msgstr "Mody" +msgstr "Adres HTTP modów" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "Współczynnik skalowania HUD" +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "Skalowanie GUI" #: src/settings_translation_file.cpp msgid "HUD toggle key" @@ -3584,15 +4008,15 @@ msgstr "Klawisz przełączania HUD" #, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"Obsługa przestarzałych wywołań lua api:\n" -"- legacy: (próbuje) naśladuje stare zachowanie (domyślne dla wydań).\n" -"- log: naśladuje i loguje przestarzałe wywołania (domyślne dla wersji " -"debug).\n" -"- error: przerywa kiedy zostanie użyte przestarzałe api (sugerowane dla " +"Obsługa przestarzałych wywołań API Lua:\n" +"- brak: nie rejestruje przestarzałych wywołań\n" +"- log: naśladuje i rejestruje backtrace zdeprecjonowanego wywołania " +"(domyślnie).\n" +"- błąd: przerwij przy użyciu przestarzałego wywołania (sugerowane dla " "twórców modów)." #: src/settings_translation_file.cpp @@ -3617,8 +4041,11 @@ msgid "Heat noise" msgstr "Szum gorąca" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Wysokość początkowego rozmiaru okna." +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Wysokość początkowego rozmiaru okna. Ignorowana w trybie pełnoekranowym." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3628,10 +4055,6 @@ msgstr "Szum wysokości" msgid "Height select noise" msgstr "Rożnorodność wysokości" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "FPU Wysokiej precyzji" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Stromość zbocza" @@ -3643,35 +4066,34 @@ msgstr "Granica zbocza" #: src/settings_translation_file.cpp #, fuzzy msgid "Hilliness1 noise" -msgstr "Dźwięk stromości" +msgstr "Hałas górzystości1" #: src/settings_translation_file.cpp #, fuzzy msgid "Hilliness2 noise" -msgstr "Dźwięk stromości" +msgstr "Hałas górzystości2" #: src/settings_translation_file.cpp #, fuzzy msgid "Hilliness3 noise" -msgstr "Dźwięk stromości" +msgstr "Hałas górzystości3" #: src/settings_translation_file.cpp #, fuzzy msgid "Hilliness4 noise" -msgstr "Dźwięk stromości" +msgstr "Hałas górzystości4" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." msgstr "Główna strona serwera, wyświetlana na liście serwerów." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" "Przyśpieszenie poziome podczas skoku lub upadku,\n" -"w blokach na sekundę." +"w blokach na sekundę do kwadratu." #: src/settings_translation_file.cpp #, fuzzy @@ -3680,7 +4102,7 @@ msgid "" "in nodes per second per second." msgstr "" "Poziome i pionowe przyśpieszenie w trybie szybkim,\n" -"w blokach na sekundę." +"w blokach na sekundę do kwadratu." #: src/settings_translation_file.cpp #, fuzzy @@ -3689,7 +4111,7 @@ msgid "" "in nodes per second per second." msgstr "" "Poziome i pionowe przyśpieszenie na ziemi lub podczas wchodzenia,\n" -"w blokach na sekunde." +"w blokach na sekundę do kwadratu." #: src/settings_translation_file.cpp msgid "Hotbar next key" @@ -3702,72 +4124,72 @@ msgstr "Poprzedni klawisz paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 1 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 1 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 10 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 10 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 11 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 11 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 12 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 12 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 13 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 13 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 14 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 14 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 15 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 15 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 16 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 16 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 17 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 17 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 18 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 18 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 19 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 19 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 2 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 2 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 20 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 20 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "Hotbar slot 21 key" -msgstr "Następny klawisz paska działań" +msgstr "Przycisk 21 miejsca paska działań" #: src/settings_translation_file.cpp #, fuzzy @@ -3862,27 +4284,40 @@ msgstr "Następny klawisz paska działań" #: src/settings_translation_file.cpp #, fuzzy msgid "How deep to make rivers." -msgstr "Jak głębokie robić rzeki" +msgstr "Jak głębokie tworzyć rzeki." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "How fast liquid waves will move. Higher = faster.\n" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"Jak szybko fale cieczy będą się poruszać. Wyższa = szybciej.\n" +"Wartość ujemna, fale cieczy będą poruszać się do tyłu.\n" +"Wymaga włączenia falowania cieczy." #: 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 długo serwer będzie czekać do zwolnienia nieużywanych bloków mapy.\n" "Wyższa wartość jest łagodniejsza ale używa więcej pamięci 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 "Zmniejsz wartość, aby zwiększyć opór ruchu w cieczy." + #: src/settings_translation_file.cpp #, fuzzy msgid "How wide to make rivers." -msgstr "Jak szerokie są rzeki" +msgstr "Jak szerokie są rzeki." #: src/settings_translation_file.cpp msgid "Humidity blend noise" @@ -3913,16 +4348,16 @@ msgstr "" "nie marnuj mocy CPU bez znaczących korzyści." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Jeśli wyłączone to klawisz \"używania\" jest wykorzystany aby latać szybko " -"oraz przy włączonym trybie szybkiego poruszania." +"Jeśli wyłączone to klawisz \"Aux1\" jest wykorzystany aby latać szybko jeśli " +"tryb szybkiego poruszania oraz latania jest\n" +"włączony." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "If enabled the server will perform map block occlusion culling based on\n" "on the eye position of the player. This can reduce the number of blocks\n" @@ -3931,10 +4366,11 @@ msgid "" "so that the utility of noclip mode is reduced." msgstr "" "Jeśli opcja jest włączona to serwer spowoduje zamknięcie usuwania bloków " -"mapy na podstawie pozycji gracza.\n" -"Zredukuje to o 50-80% liczbę bloków wysyłanych na serwer.\n" -"Klient już nie będzie widział większości ukrytych bloków, tak więc zostanie " -"ograniczona przydatność trybu noclip." +"mapy na podstawie \n" +"pozycji gracza. Zredukuje to o 50-80% liczbę bloków \n" +"wysyłanych na serwer. Klient już nie będzie widział większości ukrytych " +"bloków, \n" +"tak więc zostanie ograniczona przydatność trybu noclip." #: src/settings_translation_file.cpp msgid "" @@ -3949,12 +4385,22 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Jeżeli włączone, klawisz \"użycia\" zamiast klawiszu \"skradania\" będzie " -"użyty do schodzenia w dół i opadania." +"Jeżeli włączone, klawisz \"użycia\" zamiast klawisza \"skradania\" będzie " +"użyty do schodzenia w dół i \n" +"opadania." + +#: 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 "" +"Włącz potwierdzanie rejestracji podczas łączenia się z serwerem.\n" +"Jeśli wyłączone, to nowe konto zostanie zarejestrowane automatycznie." #: src/settings_translation_file.cpp msgid "" @@ -3987,7 +4433,10 @@ msgstr "" "zależy do nachylenia gracza." #: 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 "Jeśli włączone, nowi gracze nie mogą dołączyć do gry z pustym hasłem." #: src/settings_translation_file.cpp @@ -4000,19 +4449,40 @@ msgstr "" "Pomocne gdy pracujesz na małych powierzchniach." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "If the CSM restriction for node range is enabled, get_node calls are " "limited\n" "to this distance from the player to the node." msgstr "" +"Jeśli ograniczenie CSM dla zasięgu węzła jest włączone, wywołania get_node " +"są ograniczone\n" +"do tej odległości od gracza do węzła." #: src/settings_translation_file.cpp +#, fuzzy +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 "" +"Jeśli wykonanie polecenia czatu trwa dłużej niż określony czas w sekundach, " +"dodaj informację o czasie do komunikatu polecenia czatu w\n" +"sekundach" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" "this setting when it is opened, the file is moved to debug.txt.1,\n" "deleting an older debug.txt.1 if it exists.\n" "debug.txt is only moved if this setting is positive." msgstr "" +"Jeśli rozmiar pliku debug.txt przekroczy liczbę megabajtów określoną w tym " +"ustawieniu, plik zostanie przeniesiony do pliku debug.txt.1.\n" +"w tym ustawieniu, plik jest przenoszony do debug.txt.1,\n" +"usuwając starszy debug.txt.1, jeśli taki istnieje.\n" +"debug.txt jest przenoszony tylko wtedy, gdy wartość tego ustawienia jest " +"dodatnia." #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." @@ -4022,10 +4492,6 @@ msgstr "Jeśli ustawione, gracze zawsze będą się pojawiać w zadanej pozycji msgid "Ignore world errors" msgstr "Ignoruj błędy świata" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "Gra" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "Kanał alfa konsoli w grze (od 0 do 255)." @@ -4045,7 +4511,8 @@ msgstr "Klawisz zwiększania głośności" #: src/settings_translation_file.cpp #, fuzzy msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "Początkowa prędkość pionowa podczas skoku, w blokach na sekundę." +msgstr "" +"Początkowa prędkość pionowa podczas skoku, w blokach na sekundę do kwadratu." #: src/settings_translation_file.cpp #, fuzzy @@ -4057,16 +4524,18 @@ msgstr "" "Najczęściej potrzebny tylko dla osób pracujących nad jądrem" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Instrument poleceń czatu przy rejestracji." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Instrument global callback functions on registration.\n" "(anything you pass to a minetest.register_*() function)" msgstr "" -"Poinstruuj globalne funkcje zwrotne przy rejestracji (wszystko co prześlesz " -"do funkcji minetest.register_*() )" +"Poinstruuj globalne funkcje zwrotne przy rejestracji \n" +"(wszystko co prześlesz do funkcji minetest.register_*() )" #: src/settings_translation_file.cpp msgid "" @@ -4084,17 +4553,13 @@ msgstr "" msgid "Instrument the methods of entities on registration." msgstr "Poinstruuj metody jednostkowe przy rejestracji." -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Instrumentation" -msgstr "Instrukcja" - #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." msgstr "Interwał zapisywania ważnych zmian w świecie, w sekundach." #: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." +#, fuzzy +msgid "Interval of sending time of day to clients, stated in seconds." msgstr "Interwał wysyłania czasu gry do klientów." #: src/settings_translation_file.cpp @@ -4132,12 +4597,17 @@ msgid "Iterations" msgstr "Iteracje" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Iterations of the recursive function.\n" "Increasing this increases the amount of fine detail, but also\n" "increases processing load.\n" "At iterations = 20 this mapgen has a similar load to mapgen V7." msgstr "" +"Iteracje funkcji rekursywnej.\n" +"Zwiększenie tej wartości zwiększa ilość drobnych szczegółów, ale również\n" +"zwiększa obciążenie przetwarzania.\n" +"Przy iteracjach = 20 ten mapgen ma podobne obciążenie jak mapgen V7." #: src/settings_translation_file.cpp msgid "Joystick ID" @@ -4147,6 +4617,11 @@ msgstr "Identyfikator Joystick-a" msgid "Joystick button repetition interval" msgstr "Interwał powtarzania przycisku joysticka" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "Typ Joysticka" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Czułość drgania joysticka" @@ -4165,8 +4640,9 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" -"Wyłącznie dla Zbioru Julii: komponent W stałej hiperzespolonej, która " -"determinuje kształt Julii.\n" +"Wyłącznie dla Zbioru Julii: \n" +"komponent W stałej hiperzespolonej, \n" +"która determinuje fraktali.\n" "Nie ma wpływu na fraktale trójwymiarowe.\n" "Zakres to w przybliżeniu -2 do 2." @@ -4178,8 +4654,9 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Wyłącznie dla Zbioru Julii: komponent X stałej hiperzespolonej, która " -"determinuje kształt Julii.\n" +"Wyłącznie dla Zbioru Julii: \n" +"komponent X stałej hiperzespolonej, \n" +"która determinuje kształt fraktali.\n" "Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp @@ -4190,8 +4667,8 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Wyłącznie dla Zbioru Julii: komponent Y stałej hiperzespolonej, która " -"determinuje kształt Julii.\n" +"Wyłącznie dla Zbioru Julii: komponent Y stałej hiperzespolonej, \n" +"która determinuje kształt fraktali.\n" "Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp @@ -4202,8 +4679,9 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" -"Wyłącznie dla Zbioru Julii: komponent Z stałej hiperzespolonej, która " -"determinuje kształt Julii.\n" +"Wyłącznie dla Zbioru Julii: \n" +"komponent Z stałej hiperzespolonej, \n" +"która determinuje kształt fraktali.\n" "Zakres to w przybliżeniu -2 do 2." #: src/settings_translation_file.cpp @@ -4250,6 +4728,17 @@ msgstr "" "Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz skakania.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4309,6 +4798,7 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Klawisz poruszania się wstecz.\n" +"Gdy jest aktywny to wyłącza również automatyczne chodzenie do przodu.\n" "Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4393,6 +4883,17 @@ msgstr "" "Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Klawisz skakania.\n" +"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -4964,6 +5465,10 @@ msgstr "" "Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "Keyboard and Mouse" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Kick players who sent more than X messages per 10 seconds." @@ -4987,16 +5492,19 @@ msgid "Large cave depth" msgstr "Głębia dużej jaskini" #: src/settings_translation_file.cpp +#, fuzzy msgid "Large cave maximum number" -msgstr "" +msgstr "Maksymalna liczba dużych jaskiń" #: src/settings_translation_file.cpp +#, fuzzy msgid "Large cave minimum number" -msgstr "" +msgstr "Minimalna liczba dużych jaskiń" #: src/settings_translation_file.cpp +#, fuzzy msgid "Large cave proportion flooded" -msgstr "" +msgstr "Duża część jaskini zalana" #: src/settings_translation_file.cpp msgid "Large chat console key" @@ -5027,10 +5535,11 @@ msgstr "W lewo" msgid "" "Length of a server tick and the interval at which objects are generally " "updated over\n" -"network." +"network, stated in seconds." msgstr "" "Długość interwału czasowego serwera w trakcie którego obiekty są ogólnie " -"aktualizowane przez sieć." +"aktualizowane \n" +"przez sieć." #: src/settings_translation_file.cpp #, fuzzy @@ -5043,17 +5552,21 @@ 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 "Długość czasu pomiędzy wykonywanymi cyklami 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 "Długość czasu pomiędzy wykonywanymi cyklami NodeTimer" #: src/settings_translation_file.cpp #, fuzzy -msgid "Length of time between active block management cycles" -msgstr "Czas pomiędzy cyklami zarządzania aktywnymi blokami." +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "Czas pomiędzy cyklami zarządzania aktywnymi blokami" #: src/settings_translation_file.cpp #, fuzzy @@ -5065,7 +5578,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "Poziom logowania zapisywany do pliku debug.txt:\n" "- <nic> (brak logowania)\n" @@ -5082,9 +5596,8 @@ msgid "Light curve boost" msgstr "Przyśpieszenie środkowe krzywej światła" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost center" -msgstr "Centrum środkowego przyśpieszenia krzywej światła" +msgstr "Centrum środkowego przyśpieszenia krzywej światła" #: src/settings_translation_file.cpp #, fuzzy @@ -5102,9 +5615,13 @@ msgid "Light curve high gradient" msgstr "Przyśpieszenie środkowe krzywej światła" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve low gradient" -msgstr "Centrum środkowego przyśpieszenia krzywej światła" +msgstr "Centrum środkowego przyśpieszenia krzywej światła" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Płynne oświetlenie" #: src/settings_translation_file.cpp msgid "" @@ -5191,11 +5708,6 @@ msgstr "Zmniejsz limit Y dla lochów." msgid "Main menu script" msgstr "Skrypt głównego menu" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Skrypt głównego menu" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5203,14 +5715,20 @@ msgstr "" "Ustawia mgłę i kolor nieba zależny od pory dnia (świt/zachód słońca) oraz " "kierunku patrzenia." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "Sprawia, że DirectX działa z LuaJIT. Wyłącz jeśli występują kłopoty." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Zmienia ciecze w nieprzeźroczyste" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map Compression Level for Disk Storage" +msgstr "Poziom kompresji mapy dla pamięci masowej dysku" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map Compression Level for Network Transfer" +msgstr "Poziom kompresji map dla transferu sieciowego" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Katalog map" @@ -5221,16 +5739,12 @@ msgid "Map generation attributes specific to Mapgen Carpathian." msgstr "Właściwości generowania mapy określające Mapgen Carpathian." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." msgstr "" "Specyficzne cechy dla Mapgen płaskiego terenu.\n" -"Do płaskiego świata mogą być dodane przypadkowe jeziora i wzgórza.\n" -"Oznakowania nie będące określonymi w ciągu oznakowań nie są zmieniane z " -"domyślnych.\n" -"Oznakowania zaczynające się od 'no' używane są do ich blokowania." +"Do płaskiego świata mogą być dodane przypadkowe jeziora i wzgórza." #: src/settings_translation_file.cpp #, fuzzy @@ -5240,9 +5754,11 @@ msgid "" "ocean, islands and underground." msgstr "" "Właściwości generowania mapy określające Mapgen v7.\n" -"\"grzbiety\" aktywują rzeki." +"\"grzbiety\" aktywują tworzenie niefraktalnego terenu:\n" +"oceanu, wysp oraz podziemi." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Map generation attributes specific to Mapgen Valleys.\n" "'altitude_chill': Reduces heat with altitude.\n" @@ -5251,6 +5767,13 @@ msgid "" "to become shallower and occasionally dry.\n" "'altitude_dry': Reduces humidity with altitude." msgstr "" +"Atrybuty generowania mapy specyficzne dla dolin Mapgen.\n" +"'altitude_chill': Zmniejsza ciepło wraz z wysokością nad poziomem morza.\n" +"'humid_rivers': Zwiększa wilgotność wokół rzek.\n" +"'vary_river_depth': Jeżeli włączone, niska wilgotność i wysoka temperatura " +"powoduje, że rzeki\n" +"stają się płytsze i czasami wysychają.\n" +"'altitude_dry': Zmniejsza wilgotność wraz z wysokością." #: src/settings_translation_file.cpp #, fuzzy @@ -5258,31 +5781,29 @@ msgid "Map generation attributes specific to Mapgen v5." msgstr "Właściwości generowania mapy określające Mapgen v5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" "When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" "the 'jungles' flag is ignored." msgstr "" -"Globalne właściwości generowania map.\n" -"W generatorze map v6 flaga \"decorations\" kontroluje wszystkie dekoracje\n" -"z wyjątkiem drzew i trawy dżungli. we wszystkich innych generatorach flaga\n" -"ta kontroluje wszystkie dekoracje.\n" -"Flagi, które nie są wymienione w ciągu flagi nie są modyfikowane z " -"domyślnych.\n" -"Flagi rozpoczynające się od \"no\" są stosowane aby jawnie ją wyłączyć." +"Atrybuty generowania map specyficzne dla Generatora map v6.\n" +"Flaga „biomów śnieżnych” włącza nowy system 5 biomów.\n" +"Gdy flaga „biomy śnieżne” jest włączona, dżungle są automatycznie włączane " +"i\n" +"flaga „dżungli” jest ignorowana." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Właściwości generowania mapy określające Mapgen v7.\n" -"\"grzbiety\" aktywują rzeki." +"Atrybuty generowania map specyficzne dla Generatora map v7.\n" +"'grzbiety”: rzeki.\n" +"'latające wyspy': unoszące się w atmosferze masy lądowe.\n" +"'jaskinie': Gigantyczne jaskinie głęboko pod ziemią." #: src/settings_translation_file.cpp msgid "Map generation limit" @@ -5292,6 +5813,11 @@ msgstr "Limit generacji mapy" msgid "Map save interval" msgstr "Interwał zapisu mapy" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Interwał czasowy aktualizacji cieczy" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Limit bloków mapy" @@ -5411,9 +5937,15 @@ msgid "Maximum FPS" msgstr "Maksymalny FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +#, fuzzy +msgid "Maximum FPS when the window is not focused, or when the game is paused." msgstr "Maksymalny FPS gdy gra spauzowana." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Maximum distance to render shadows." +msgstr "Maksymalna odległość do renderowania cieni." + #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" msgstr "Maksymalna ilość bloków załadowanych w sposób wymuszony" @@ -5424,12 +5956,14 @@ msgid "Maximum hotbar width" msgstr "Maksymalna długość hotbar" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" +msgstr "Maksymalny limit losowej liczby dużych jaskiń na mapchunk." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "" +msgstr "Maksymalny limit losowej liczby małych jaskiń na mapchunk." #: src/settings_translation_file.cpp #, fuzzy @@ -5441,11 +5975,15 @@ msgstr "" "z dużą prędkością." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of blocks that are simultaneously sent per client.\n" "The maximum total count is calculated dynamically:\n" "max_total = ceil((#clients + max_users) * per_client / 4)" msgstr "" +"Maksymalna ilość bloków, które są jednocześnie wysyłane na jednego klienta.\n" +"Maksymalna łączna liczba jest obliczana dynamicznie:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." @@ -5470,6 +6008,17 @@ msgstr "" "Maksymalna liczba bloków do skolejkowania które mają być wczytane z pliku.\n" "Pozostaw puste a odpowiednia liczba zostanie dobrana automatycznie." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Maksymalna liczba jednocześnie pobieranych plików. Pobieranie przekraczające " +"ten limit zostanie umieszczone w kolejce.\n" +"Powinien być niższy niż curl_parallel_limit." + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "Maksymalna ilość, wczytanych wymuszeniem, bloków mapy." @@ -5488,10 +6037,11 @@ msgid "" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" -"Maksymalna liczba pakietów przesyłanych podczas kroku, jeżeli masz wolne " -"łącze\n" -"spróbuj zredukować to, ale nie redukuj jej poniżej podwojonej liczby " -"klientów." +"Maksymalna liczba pakietów wysyłanych na krok wysyłania, jeśli masz wolne " +"połączenie\n" +"spróbuj go zmniejszyć, ale nie zmniejszaj go do liczby poniżej podwójnej " +"liczby docelowej\n" +"numer klienta." #: src/settings_translation_file.cpp #, fuzzy @@ -5499,9 +6049,8 @@ msgid "Maximum number of players that can be connected simultaneously." msgstr "Maksymalna liczba graczy, która może się jednocześnie połączyć." #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum number of recent chat messages to show" -msgstr "Maksymalna ilość, wczytanych wymuszeniem, bloków mapy." +msgstr "Maksymalna liczba ostatnich wiadomości czatu do wyświetlenia" #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." @@ -5536,17 +6085,25 @@ msgstr "" "Wartość 0, wyłącza kolejkę, -1 to nieograniczony rozmiar kolejki." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +#, fuzzy +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "Maksymalny czas na pobranie pliku (np.: moda) w ms." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Maksymalny czas, jaki może zająć interaktywne żądanie (np. pobranie listy z " +"serwera), podany w milisekundach." + #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "Maksymalna ilość użytkowników" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Menu" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "Pamięć podręczna siatki" @@ -5564,8 +6121,9 @@ msgid "Method used to highlight selected object." msgstr "Metoda użyta do podświetlenia wybranego obiektu." #: src/settings_translation_file.cpp +#, fuzzy msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "Minimalny poziom logowania, który ma być zapisywany na czacie." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5585,8 +6143,9 @@ msgid "Minimum limit of random number of large caves per mapchunk." msgstr "Szum 3D, który wpływa na liczbę lochów na jeden mapchunk." #: src/settings_translation_file.cpp +#, fuzzy msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "" +msgstr "Minimalny limit losowej liczby małych jaskiń na mapchunk." #: src/settings_translation_file.cpp #, fuzzy @@ -5597,12 +6156,27 @@ msgstr "Minimalna wielkość tekstury dla filtrów" msgid "Mipmapping" msgstr "Mip-Mappowanie" +#: 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 "Bezpieczeństwo" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "Kanały modów" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +#, fuzzy +msgid "Modifies the size of the HUD elements." msgstr "Modyfikuje rozmiar elementów paska HUD." #: src/settings_translation_file.cpp @@ -5613,6 +6187,11 @@ msgstr "Ścieżka czcionki typu Monospace" msgid "Monospace font size" msgstr "Rozmiar czcionki Monospace" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "Rozmiar czcionki Monospace" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Szum wysokości góry" @@ -5660,12 +6239,17 @@ msgid "Mute sound" msgstr "Wycisz dźwięk" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this.\n" "Current mapgens in a highly unstable state:\n" "- The optional floatlands of v7 (disabled by default)." msgstr "" +"Nazwa generatora map, który ma być użyty podczas tworzenia nowego świata.\n" +"Tworzenie świata w menu głównym nadpisze tę wartość.\n" +"Obecne mapgeny są w bardzo niestabilnym stanie:\n" +"- Opcjonalne floatlands z v7 (domyślnie wyłączone)." #: src/settings_translation_file.cpp msgid "" @@ -5688,10 +6272,6 @@ msgstr "" msgid "Near plane" msgstr "Najbliższy wymiar" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Sieć" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5700,6 +6280,11 @@ msgstr "" "Port sieciowy do nasłuchu (UDP).\n" "Ta wartość będzie nadpisana gdy zaczynasz z menu głównego." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "Sieć" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "Nowi użytkownicy muszą wpisać to hasło." @@ -5712,6 +6297,11 @@ msgstr "Tryb noclip" msgid "Noclip key" msgstr "Klawisz trybu noclip" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Podświetlanie bloków" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "Podświetlanie bloków" @@ -5724,19 +6314,12 @@ msgstr "Interwał NodeTimer" msgid "Noises" msgstr "Szumy" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Próbkowanie normalnych map" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Siła map normlanych" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Liczba powstających wątków" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Number of emerge threads to use.\n" "Value 0:\n" @@ -5749,40 +6332,41 @@ 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 "" +"Ilość wątków emerge do wykorzystania.\n" +"Wartość 0:\n" +"- Wybór automatyczny. Liczba wątków emerge będzie wynosić\n" +"- 'liczba procesorów - 2', z dolną granicą 1.\n" +"Dowolna inna wartość:\n" +"- Określa liczbę wątków emerge, z dolnym limitem równym 1.\n" +"OSTRZEŻENIE: Zwiększenie liczby wątków emerge zwiększa szybkość mapgena " +"silnika,\n" +"ale może to wpłynąć na wydajność gry przez zakłócanie innych\n" +"procesami, szczególnie w grze dla pojedynczego gracza i/lub podczas " +"uruchamiania kodu Lua w\n" +"'on_generated'. Dla wielu użytkowników optymalnym ustawieniem może być '1'." #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Ilość dodatkowych bloków, które mogą zostać wczytane naraz przez /" "clearobjects.\n" -"To wymiana pomiędzy sqlite i\n" +"Jest to kompromis między obciążeniem transakcji SQLite a\n" "konsumpcją pamięci (4096=100MB, praktyczna zasada)." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Liczba iteracji dla parallax occlusion." - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Online Content Repository" -msgstr "Repozytorium Zawartości z Sieci" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "Nieprzeźroczyste ciecze" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" +"Nieprzezroczystość (alfa) cienia za domyślną czcionką, w zakresie od 0 do " +"255." #: src/settings_translation_file.cpp msgid "" @@ -5791,51 +6375,33 @@ msgid "" "open." msgstr "" "Otwórz menu pauzy, gdy okno jest nieaktywne. Nie zatrzymuje gry jeśli " -"formspec jest otwarty." - -#: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Ogólny błąd systematyczny efektu zamykania paralaksy, zwykle skala/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Całkowity efekt skalowania zamknięcia paralaksy." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Zamknięcie paralaksy" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Błąd systematyczny zamknięcia paralaksy" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Iteracje zamknięcia paralaksy" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Tryb zamknięcia paralaksy" +"formspec jest\n" +"otwarty." #: src/settings_translation_file.cpp #, fuzzy -msgid "Parallax occlusion scale" -msgstr "Skala parallax occlusion" +msgid "Optional override for chat weblink color." +msgstr "Opcjonalna zmiana koloru łącza internetowego czatu." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" +"Ścieżka czcionki zastępczej. Musi być czcionką TrueType.\n" +"Ta czcionka będzie używana w niektórych językach lub jeśli domyślna czcionka " +"jest niedostępna." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Path to save screenshots at. Can be an absolute or relative path.\n" "The folder will be created if it doesn't already exist." msgstr "" +"Ścieżka w której zapisywane są zrzuty ekranu. Może być bezwzględna lub " +"względna.\n" +"Folder zostanie utworzony, jeśli jeszcze nie istnieje." #: src/settings_translation_file.cpp msgid "" @@ -5853,27 +6419,28 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" +"Ścieżka do domyślnej czcionki. Musi być czcionką TrueType.\n" +"Czcionka rezerwowa zostanie użyta, jeśli nie można załadować czcionki." #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" +"Ścieżka do czcionki o stałej szerokości. Musi być czcionką TrueType.\n" +"Ta czcionka jest używana np. w ekranie konsoli i profilera." #: src/settings_translation_file.cpp msgid "Pause on lost window focus" msgstr "Pauza, gdy okno jest nieaktywne" #: src/settings_translation_file.cpp +#, fuzzy msgid "Per-player limit of queued blocks load from disk" -msgstr "" +msgstr "Limit załadowanych bloków z dysku na jednego gracza" #: src/settings_translation_file.cpp #, fuzzy @@ -5894,6 +6461,16 @@ msgstr "Klawisz latania" msgid "Pitch move mode" msgstr "Tryb nachylenia ruchu włączony" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Klawisz latania" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "Interwał powtórzenia prawego kliknięcia myszy" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5902,10 +6479,6 @@ msgstr "" "Gracz ma możliwość latania bez wpływu grawitacji.\n" "Wymaga to przywileju \"fly\" na serwerze." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Nazwa gracza" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Odległość przesyłania graczy" @@ -5915,6 +6488,11 @@ msgstr "Odległość przesyłania graczy" msgid "Player versus player" msgstr "PvP" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Filtrowanie dwuliniowe" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5940,13 +6518,12 @@ msgstr "" "wywoływanie komend powłoki." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Print the engine's profiling data in regular intervals (in seconds).\n" "0 = disable. Useful for developers." msgstr "" -"Drukuj dane profilu silnika w regularnych interwałach (w sekundach) 0 = " -"wyłączone. Przydatne dla deweloperów." +"Drukuj dane profilu silnika w regularnych interwałach (w sekundach).\n" +"0 = wyłączone. Przydatne dla deweloperów." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" @@ -5962,24 +6539,26 @@ msgstr "Klawisza przełączania profilera" #: src/settings_translation_file.cpp #, fuzzy -msgid "Profiling" -msgstr "Profilowanie modyfikacji" - -#: src/settings_translation_file.cpp msgid "Prometheus listener address" -msgstr "" +msgstr "Adres słuchacza Prometheusa" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"Adres listenera Prometheus.\n" +"Jeśli Minetest jest skompilowany z włączoną opcją ENABLE_PROMETHEUS,\n" +"włącz słuchanie metryk dla Prometheusa na tym adresie.\n" +"Metryki mogą być pobierane na stronie http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp +#, fuzzy msgid "Proportion of large caves that contain liquid." -msgstr "" +msgstr "Proporcja dużych jaskiń, które zawierają ciecz." #: src/settings_translation_file.cpp msgid "" @@ -5991,9 +6570,8 @@ msgstr "" "Wartości większe niż 26 skutkują ostrym odcięciem w rogach chmur." #: src/settings_translation_file.cpp -#, fuzzy msgid "Raises terrain to make valleys around the rivers." -msgstr "Podwyższa teren by stworzyć doliny wokół rzek" +msgstr "Podwyższa teren by stworzyć doliny wokół rzek." #: src/settings_translation_file.cpp msgid "Random input" @@ -6037,6 +6615,7 @@ msgid "Report path" msgstr "Ścieżka raportu" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Restricts the access of certain client-side functions on servers.\n" "Combine the byteflags below to restrict client-side features, or set to 0\n" @@ -6049,6 +6628,20 @@ msgid "" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" +"Ogranicza dostęp do pewnych funkcji po stronie klienta na serwerach.\n" +"Połącz poniższe flagi bajtów, aby ograniczyć funkcje po stronie klienta, lub " +"ustaw na 0\n" +"bez ograniczeń:\n" +"LOAD_CLIENT_MODS: 1 (wyłączenie ładowania modów dostarczonych przez " +"klienta)\n" +"CHAT_MESSAGES: 2 (wyłączenie wywoływania send_chat_message po stronie " +"klienta)\n" +"READ_ITEMDEFS: 4 (wyłączenie wywoływania get_item_def po stronie klienta)\n" +"READ_NODEDEFS: 8 (wyłączenie wywoływania get_node_def po stronie klienta)\n" +"LOOKUP_NODES_LIMIT: 16 (ogranicza wywoływanie get_node po stronie klienta " +"do\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (wyłącza wywoływanie get_player_names po stronie klienta)" #: src/settings_translation_file.cpp #, fuzzy @@ -6072,10 +6665,6 @@ msgstr "Szum podwodnej grani" msgid "Right key" msgstr "W prawo" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Interwał powtórzenia prawego kliknięcia myszy" - #: src/settings_translation_file.cpp #, fuzzy msgid "River channel depth" @@ -6152,11 +6741,16 @@ msgid "" "pixels when scaling down, at the cost of blurring some\n" "edge pixels when images are scaled by non-integer sizes." msgstr "" -"Skaluj gui wartościami użytkownika.\n" -"Użyj najbliższego filtru anty-alias, żeby przeskalować GUI.\n" -"Wygładzi to niektóre poszarpane krawędzie oraz zmiesza piksele, podczas " -"zmniejszenia skali, kosztem rozmazywania niektórych pikseli krawędziowych, " -"gdy obrazy są skalowane niecałkowitym wartościami." +"Skaluj GUI według wartości określonej przez użytkownika.\n" +"Użyj najbliższego filtru anti-alias aby skalować GUI.\n" +"Spowoduje to wygładzenie niektórych szorstkich krawędzi i wygładzenie\n" +"pikseli przy zmniejszaniu, kosztem rozmycia niektórych\n" +"piksele krawędzi, gdy obrazy są skalowane o rozmiary niecałkowite." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Ekran:" #: src/settings_translation_file.cpp msgid "Screen height" @@ -6188,6 +6782,11 @@ msgstr "" "1 oznacza najgorszą jakość; 100 najlepszą.\n" "0 to domyślna jakość." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Zrzut ekranu" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "Szum dna morza" @@ -6202,10 +6801,6 @@ msgstr "" msgid "Second of two 3D noises that together define tunnels." msgstr "Drugi z dwóch szumów 3D które razem określają tunele." -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "Bezpieczeństwo" - #: src/settings_translation_file.cpp msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Sprawdź http://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6266,8 +6861,19 @@ msgstr "" "18 = 4D \"Mandelbulb\" zbiór Julii." #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Pojedynczy gracz" +#, fuzzy +msgid "Server" +msgstr "Adres URL serwera" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "Nazwa serwera" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Opis serwera" #: src/settings_translation_file.cpp msgid "Server URL" @@ -6293,10 +6899,20 @@ msgstr "Port Serwera" msgid "Server side occlusion culling" msgstr "Occulusion culling po stronie serwera" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Port Serwera" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "Lista publicznych serwerów" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "Lista publicznych serwerów" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Plik listy publicznych serwerów" @@ -6310,10 +6926,55 @@ msgstr "" "Wymagany restart po zmianie ustawienia." #: 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 "" "Ustaw maksymalny ciąg znaków wiadomości czatu wysyłanych przez klientów." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"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 "" +"Ustaw siłę cienia.\n" +"Niższa wartość oznacza jaśniejsze cienie, wyższa wartość oznacza ciemniejsze " +"cienie." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"Ustaw rozmiar zasięgu gładkiego cienia.\n" +"Niższe wartości oznaczają ostrzejsze cienie, wyższe wartości oznaczają " +"gładsze cienie.\n" +"Minimalna wartość: 1.0; maksymalna wartość: 10.0" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Ustaw nachylenie orbity Słońca/Księżyca w stopniach.\n" +"Wartość 0 oznacza brak nachylenia / orbitę pionową.\n" +"Wartość minimalna: 0.0; wartość maksymalna: 60.0" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Ustawienie wartości pozytywnej włącza drganie liści.\n" +"Do włączenia wymagane są shadery." + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6341,6 +7002,17 @@ msgstr "" "Ustawienie pozytywnej wartości włącza falowanie roślin.\n" "Wymaga shaderów." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Ustawia jakość tekstury cienia na 32 bity.\n" +"Jeśli wartość jest fałszywa, używana będzie tekstura 16-bitowa.\n" +"Może to powodować znacznie więcej artefaktów w cieniu." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Shadery" @@ -6353,8 +7025,29 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" "Shadery pozwalają na zaawansowane efekty wizualne, mogą również zwiększyć " -"wydajność niektórych kart graficznych.\n" -"Działa tylko na grafice OpenGL ." +"wydajność niektórych kart\n" +"graficznych.\n" +"Działa tylko z zapleczem wideo OpenGL ." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "Jakość zrzutu ekranu" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Maksymalna odległość mapy cieni w węzłach do renderowania cieni" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture in 32 bits" +msgstr "Tekstura mapy cieni w 32 bitach" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "Minimalna wielkość tekstury dla filtrów" #: src/settings_translation_file.cpp #, fuzzy @@ -6365,10 +7058,8 @@ msgstr "Offset cienia czcionki, jeżeli 0 to cień nie będzie rysowany." #: src/settings_translation_file.cpp #, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Offset cienia czcionki, jeżeli 0 to cień nie będzie rysowany." +msgid "Shadow strength gamma" +msgstr "Siła cienia" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6382,6 +7073,20 @@ msgstr "Pokaż informacje debugowania" msgid "Show entity selection boxes" msgstr "Pokazuj zaznaczenie wybranych obiektów" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Ustaw język. Zostaw puste pole, aby użyć języka systemowego.\n" +"Wymagany restart po zmianie ustawienia." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "Domyślnie wyświetlaj tła znaczników imiennych" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Komunikat zamknięcia serwera" @@ -6395,6 +7100,13 @@ msgid "" "Altering this value is for special usage, leaving it unchanged is\n" "recommended." msgstr "" +"Rozmiar mapchunków generowanych przez mapgen, podany w mapblockach (16 " +"węzłów).\n" +"UWAGA!: Nie ma z tego żadnego pożytku, ale występuje kilka zagrożeń, przy\n" +"zwiększaniu tej wartości powyżej 5.\n" +"Zmniejszenie tej wartości podnosi gęstość jaskiń i lochów.\n" +"Zmiana tej wartości ma specjalne zastosowanie, zalecane jest pozostawienie\n" +"jej nietkniętą." #: src/settings_translation_file.cpp msgid "" @@ -6402,8 +7114,14 @@ msgid "" "increase the cache hit %, reducing the data being copied from the main\n" "thread, thus reducing jitter." msgstr "" -"Rozmiar pamięci bloków mapy generatora siatki. Zwiększenie zmieni rozmiar % " -"pamięci, ograniczając dane kopiowane z głównego wątku oraz ilość drgań." +"Rozmiar pamięci bloków mapy generatora siatki. Zwiększenie\n" +"zmieni rozmiar % pamięci, ograniczając dane kopiowane z głównego wątku\n" +"oraz ilość drgań." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Sky Body Orbit Tilt" +msgstr "Pochylenie orbity ciała niebieskiego" #: src/settings_translation_file.cpp msgid "Slice w" @@ -6415,12 +7133,14 @@ msgid "Slope and fill work together to modify the heights." msgstr "Zbocze oraz wypełnienie działają razem, aby zmodyfikować wysokości." #: src/settings_translation_file.cpp +#, fuzzy msgid "Small cave maximum number" -msgstr "" +msgstr "Maksymalna ilość małych jaskiń" #: src/settings_translation_file.cpp +#, fuzzy msgid "Small cave minimum number" -msgstr "" +msgstr "Minimalna ilość małych jaskiń" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." @@ -6466,20 +7186,15 @@ msgstr "Szybkość skradania" msgid "Sneaking speed, in nodes per second." msgstr "Prędkość skradania, w blokach na sekundę." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Przeźroczystość cienia czcionki" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Dźwięk" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Skradanie" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key for climbing/descending" -msgstr "Klawisz używany do wspinania" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6498,15 +7213,30 @@ msgid "" "Note that mods or games may explicitly set a stack for certain (or all) " "items." msgstr "" +"Określa domyślny rozmiar stosu węzłów, elementów i narzędzi.\n" +"Pamiętaj, że mody lub gry mogą jawnie ustawiać stos dla niektórych (lub " +"wszystkich) przedmiotów." + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Rozszerz pełną aktualizację mapy cieni na określoną ilość klatek.\n" +"Wyższe wartości mogą sprawić, że cienie będą lagować,\n" +"niższe wartości powodują zużycie większej ilości zasobów.\n" +"Minimalna wartość: 1; maksymalna wartość: 16" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Spread of light curve boost range.\n" "Controls the width of the range to be boosted.\n" "Standard deviation of the light curve boost Gaussian." msgstr "" "Rozrzut przyśpieszenia środkowego krzywej światła.\n" +"Steruje szerokością zakresu, który ma być wzmocniony.\n" "Standardowe zniekształcenie gaussowego przyśpieszenia środkowego." #: src/settings_translation_file.cpp @@ -6532,16 +7262,15 @@ msgstr "Szum góry" msgid "Strength of 3D mode parallax." msgstr "Siła paralaksy." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Siła generowanych zwykłych map." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" "The 3 'boost' parameters define a range of the light\n" "curve that is boosted in brightness." msgstr "" +"Siła podbicia krzywej świetlnej.\n" +"3 parametry 'boost' definiują zakres krzywej świetlnej\n" +"który jest wzmacniany pod względem jasności." #: src/settings_translation_file.cpp msgid "Strict protocol checking" @@ -6565,6 +7294,21 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"Poziom powierzchni opcjonalnej wody umieszczonej na stałej warstwie terenu " +"pływającego.\n" +"Woda domyślnie jest wyłączona i zostanie umieszczona tylko wtedy, gdy " +"wartość ta jest ustawiona\n" +"powyżej 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (początek\n" +"górnego zwężenia).\n" +"***OSTRZEŻENIE, POTENCJALNE ZAGROŻENIE DLA ŚWIATÓW I WYDAJNOŚCI " +"SERWERÓW***:\n" +"Przy włączonym umieszczaniu wody, tereny pływające muszą być ustawione i " +"przetestowane\n" +"oraz być warstwą stałą poprzez ustawienie 'mgv7_floatland_density' na 2.0 " +"(lub innej\n" +"wymaganej wartości w zależności od 'mgv7_np_floatland'), \n" +"aby uniknąć intensywnego przepływu wody na serwerze oraz ogromnego zalania\n" +"powierzchni świata poniżej." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6574,6 +7318,11 @@ msgstr "Synchroniczny SQLite" msgid "Temperature variation for biomes." msgstr "Zmienność temperatury biomów." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Ustawienia" + #: src/settings_translation_file.cpp #, fuzzy msgid "Terrain alternative noise" @@ -6624,6 +7373,18 @@ msgid "Texture path" msgstr "Paczki tekstur" #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Rozmiar tekstury, na której ma być renderowana mapa cieni.\n" +"Wartość musi być potęgą dwójki.\n" +"Większe liczby tworzą lepsze cienie, ale jest to również kosztowniejsze." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Textures on a node may be aligned either to the node or to the world.\n" "The former mode suits better things like machines, furniture, etc., while\n" @@ -6632,19 +7393,33 @@ msgid "" "this option allows enforcing it for certain node types. Note though that\n" "that is considered EXPERIMENTAL and may not work properly." msgstr "" +"Tekstury na węźle mogą być dopasowane albo do niego albo do świata.\n" +"Ten pierwszy tryb bardziej pasuje do rzeczy takich jak maszyny, meble, itp.\n" +"ten drugi sprawia, że schody i mikrobloki lepiej komponują się z " +"otoczeniem.\n" +"Z uwagi na to, że ta możliwość jest nowa, nie może być wykorzystywana przez " +"starsze serwery,\n" +"opcja ta pozwala na wymuszenie jej dla określonych typów węzłów. Zwróć " +"uwagę, że\n" +"to opcja EKSPERYMENTALNA i może nie działać zbyt poprawnie." #: src/settings_translation_file.cpp #, fuzzy msgid "The URL for the content repository" msgstr "Adres URL repozytorium zawartości" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "The dead zone of the joystick" +msgstr "Identyfikator użycia joysticka" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" "when calling `/profiler save [format]` without format." msgstr "" -"Domyślny format zapisu profili, gdy wpisujemy `/ profiler save [format]` bez " -"określonego formatu." +"Domyślny format w jakim są zapisywane profile,\n" +"gdy wpisujemy `/ profiler save [format]` bez określonego formatu." #: src/settings_translation_file.cpp msgid "The depth of dirt or other biome filler node." @@ -6667,6 +7442,7 @@ msgstr "" "Długość w pikselach wymagana do wejścia w interakcję z ekranem dotykowym." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The maximum height of the surface of waving liquids.\n" "4.0 = Wave height is two nodes.\n" @@ -6674,6 +7450,11 @@ msgid "" "Default is 1.0 (1/2 node).\n" "Requires waving liquids to be enabled." msgstr "" +"Maksymalna wysokość powierzchni falujących cieczy.\n" +"4,0 = wysokość fali wynosi dwa węzły.\n" +"0.0 = Fala w ogóle się nie porusza.\n" +"Wartość domyślna to 1.0 (1/2 węzła).\n" +"Wymaga włączenia falujących cieczy." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6697,22 +7478,37 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" +"Promień objętości bloków wokół każdego gracza, który podlega\n" +"aktywne bloki, określone w mapblocks (16 węzłów).\n" +"W aktywnych blokach ładowane są obiekty i uruchamiane ABM.\n" +"Jest to również minimalny zakres, w którym utrzymywane są obiekty aktywne " +"(moby).\n" +"Należy to skonfigurować razem z active_object_send_range_blocks." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" +"Zaplecze renderowania.\n" +"Po zmianie wymagane jest ponowne uruchomienie.\n" +"Uwaga: w Androidzie trzymaj się OGLES1, jeśli nie masz pewności! W " +"przeciwnym razie aplikacja może się nie uruchomić.\n" +"Na innych platformach zalecany jest OpenGL.\n" +"Shadery są obsługiwane przez OpenGL (tylko komputery stacjonarne) i OGLES2 " +"(eksperymentalne)" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." -msgstr "Czułość osi joysticka, wpływa na drgania widoku." +"in-game view frustum around." +msgstr "" +"Czułość osi joysticka, wpływa na poruszanie się\n" +"widoku dookoła." #: src/settings_translation_file.cpp msgid "" @@ -6724,7 +7520,8 @@ msgstr "" "Siła(ciemność) ambient-occlusion shading bloków.\n" "Niższa wartość to więcej ciemności, a wyższa wartość to więcej światła.\n" "Dozwolona wartość obejmuje przedział od 0,25 do 4,0 włącznie. Jeśli wybrana " -"wartość jest z poza skali to zostanie zmieniona na najbliższą prawidłową." +"wartość jest z poza skali to\n" +"zostanie zmieniona na najbliższą prawidłową." #: src/settings_translation_file.cpp msgid "" @@ -6732,26 +7529,35 @@ 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 "" -"Czas (w sekundach) po którym następuje próba zmniejszenia rozmiaru kolejki " -"cieczy przez jej usunięcie. Do tego czasu kolejka może urosnąć ponad " -"pojemność przetwarzania. Wartość 0 wyłącza tą funkcjonalność." +"Czas (w sekundach), przez który kolejka płynów może wyrosnąć poza " +"przetwarzanie\n" +"pojemności do momentu podjęcia próby zmniejszenia jej rozmiaru poprzez " +"zrzucenie starej kolejki\n" +"przedmiotów. Wartość 0 wyłącza funkcjonalność." + +#: 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 "" +"Budżet czasu, jaki ABM mógł wykonać na każdym kroku\n" +"(jako ułamek interwału 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 "" -"Czas między powtarzanymi zdarzeniami, gdy wciskamy kombinację klawiszy " -"joysticka." +"Czas w sekundach jest brany między powtarzającymi się zdarzeniami\n" +"kiedy przytrzymuje się kombinację przycisków joysticka." #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"Czas, wyrażany w sekundach,pomiędzy powtarzanymi kliknięciami prawego " -"przycisku myszy." +"Czas w sekundach między kolejnymi położeniem węzłów po przytrzymaniu\n" +"przycisku umieszczania.." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6763,6 +7569,11 @@ msgid "" "enabled. Also the vertical distance over which humidity drops by 10 if\n" "'altitude_dry' is enabled." msgstr "" +"Odległość w pionie, powyżej której ciepło spada o 20, jeśli funkcja " +"„altitude_chill” jest\n" +"włączona. Również odległość w pionie, na której wilgotność spada o 10, " +"jeśli\n" +"„altitude_dry” jest włączony." #: src/settings_translation_file.cpp msgid "Third of 4 2D noises that together define hill/mountain range height." @@ -6791,7 +7602,8 @@ msgid "Time speed" msgstr "Szybkość upływu czasu" #: 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 "" "Przekroczono czas oczekiwania usuwania z pamięci danych nieużywanych map " "klienta." @@ -6819,6 +7631,19 @@ msgstr "Opóźnienie wskazówek narzędzi" msgid "Touch screen threshold" msgstr "Próg ekranu dotykowego" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Touchscreen" +msgstr "Próg ekranu dotykowego" + +#: src/settings_translation_file.cpp +msgid "Tradeoffs for performance" +msgstr "Kompromisy dla wydajności" + +#: src/settings_translation_file.cpp +msgid "Transparency Sorting Distance" +msgstr "" + #: src/settings_translation_file.cpp msgid "Trees noise" msgstr "Szum drzew" @@ -6898,8 +7723,9 @@ msgid "Use bilinear filtering when scaling textures." msgstr "Włącz filtrowanie bilinearne podczas skalowania tekstur." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" @@ -6908,10 +7734,33 @@ msgstr "" "zwłaszcza przy korzystaniu z tekstur wysokiej rozdzielczości.\n" "Gamma correct dowscaling nie jest wspierany." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Użyj wielopróbkowego antyaliasingu (MSAA), aby wygładzić krawędzie bloków.\n" +"Algorytm ten wygładza widok 3D, zachowując jednocześnie ostrość obrazu,\n" +"ale nie wpływa na wnętrze tekstur\n" +"(co jest szczególnie widoczne w przypadku przezroczystych tekstur).\n" +"Widoczne odstępy pojawiają się między węzłami, gdy moduły cieniujące są " +"wyłączone.\n" +"Jeśli jest ustawiony na 0, MSAA jest wyłączone.\n" +"Po zmianie tej opcji wymagane jest ponowne uruchomienie." + #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." msgstr "Użyj filtrowania tri-linearnego podczas skalowania tekstur." +#: src/settings_translation_file.cpp +msgid "User Interfaces" +msgstr "" + #: src/settings_translation_file.cpp msgid "VBO" msgstr "VBO" @@ -7011,7 +7860,7 @@ msgstr "Pole widzenia" #: src/settings_translation_file.cpp #, fuzzy -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "Joystick wirtualny aktywuje przycisk aux" #: src/settings_translation_file.cpp @@ -7028,7 +7877,6 @@ msgstr "" "Wymaga włączenia shaderów." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "W coordinate of the generated 3D slice of a 4D fractal.\n" "Determines which 3D slice of the 4D shape is generated.\n" @@ -7036,10 +7884,11 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" -"Koordynat W generowanej części 3D z fraktala 4D.\n" -"Określa która część 3D ma być wygenerowana z 4D.\n" -"Nie działa na fraktale 3D.\n" -"Jego zakres jest od -2 do 2" +"Współrzędna W wygenerowanego wycinka 3D fraktala 4D.\n" +"Określa, który wycinek 3D kształtu 4D jest generowany.\n" +"Zmienia kształt fraktala.\n" +"Nie ma wpływu na fraktale 3D.\n" +"Zasięg około -2 do 2." #: src/settings_translation_file.cpp #, fuzzy @@ -7097,15 +7946,20 @@ msgstr "Długość fal wodnych" msgid "Waving plants" msgstr "Falujące rośliny" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Kolor zaznaczenia" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" "filtered in software, but some images are generated directly\n" "to hardware (e.g. render-to-texture for nodes in inventory)." msgstr "" -"Gdy gui_scaling_filter jest aktywny to wszystkie obrazy muszą być filtrowane " -"przez Minetest, ale niektóre są generowane bezpośrednio na sprzęt ( np. " -"renderuj tekstury do bloków inwentarza)." +"Gdy gui_scaling_filter jest aktywny to wszystkie obrazy muszą być\n" +"filtrowane w oprogramowaniu, ale niektóre są generowane bezpośrednio na\n" +"sprzęt ( np. renderuj tekstury do bloków ekwipunku)." #: src/settings_translation_file.cpp msgid "" @@ -7127,9 +7981,8 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7147,14 +8000,12 @@ msgstr "" "przypisanych dla świata przy autoskalowaniu tekstur." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Kiedy tylko czcionki wolnego typu są używane wymagana jest ich kompilacja " -"wspierająca takie czcionki." +"Czy tła tagów nazw mają być domyślnie pokazywane.\n" +"Mody mogą nadal tworzyć tło." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7191,6 +8042,20 @@ msgid "" "In-game, you can toggle the mute state with the mute key or by using the\n" "pause menu." msgstr "" +"Czy wyciszyć dźwięki. Dźwięki można wyłączyć w dowolnym momencie, chyba że\n" +"system dźwiękowy jest wyłączony (enable_sound=false).\n" +"W grze możesz przełączać stan wyciszenia za pomocą klawisza wyciszania lub " +"używając\n" +"menu pauzy." + +#: 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 "" @@ -7199,7 +8064,8 @@ msgstr "" "Wyświetlanie efektów debugowania klienta(klawisz F5 ma tą samą funkcję)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "Rozdzielczość pionowa rozmiaru okna gry." #: src/settings_translation_file.cpp @@ -7237,6 +8103,13 @@ msgid "" "See also texture_min_size.\n" "Warning: This option is EXPERIMENTAL!" msgstr "" +"Tekstury wyrównane do świata mogą być skalowane tak, aby obejmowały kilka " +"węzłów. Jednakże,\n" +"serwer może nie wysłać żądanej wagi, zwłaszcza jeśli używasz\n" +"specjalnie zaprojektowany pakiet tekstur; z tą opcją klient próbuje\n" +"automatycznie określić skalę na podstawie rozmiaru tekstury.\n" +"Zobacz także texture_min_size.\n" +"Ostrzeżenie: ta opcja jest EKSPERYMENTALNA!" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" @@ -7271,6 +8144,11 @@ msgid "" "For a solid floatland layer, this controls the height of hills/mountains.\n" "Must be less than or equal to half the distance between the Y limits." msgstr "" +"Odległość Y, na której pływające tereny zwężają się od pełnej gęstości do " +"zera.\n" +"Zbieżność rozpoczyna się w tej odległości od granicy Y.\n" +"W przypadku litej warstwy pływów kontroluje wysokość wzgórz/gór.\n" +"Musi być mniejsza lub równa połowie odległości między granicami Y." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." @@ -7292,125 +8170,38 @@ msgstr "Wysokość dolin oraz dna jezior." msgid "Y-level of seabed." msgstr "Wysokość dna jezior." +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL przekroczono limit pobierania pliku" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "Limit czasu cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "Limit równoległy cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Limit czasu cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "Tryb kreatywny " -#~ msgid "Toggle Cinematic" -#~ msgstr "Przełącz na tryb Cinematic" - -#~ msgid "Select Package File:" -#~ msgstr "Wybierz plik paczki:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Y górnej granicy lawy dużych jaskiń." - -#~ msgid "Waving Water" -#~ msgstr "Falująca woda" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Określa czy lochy mają być czasem przez generowane teren." - -#~ msgid "Projecting dungeons" -#~ msgstr "Projekcja lochów" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Wysokość do której rozciągają się cienie wznoszącego terenu." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "" -#~ "Wysokość średniego punktu wznoszącego się terenu oraz powierzchni jezior." - -#~ msgid "Waving water" -#~ msgstr "Falująca woda" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Zmienność wysokości wzgórz oraz głębokości jezior na gładkim terenie " -#~ "wznoszącym się." +#~ msgid "- Damage: " +#~ msgstr "- Obrażenia: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Maksymalna, standardowa wysokość, powyżej lub poniżej średniego punktu " -#~ "górzystego terenu." +#~ "0 = parallax occlusion z informacją nachylenia (szybsze).\n" +#~ "1 = relief mapping (wolniejsze, bardziej dokładne)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Ta czcionka zostanie użyta w niektórych językach." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Siłą przyśpieszenia środkowego krzywej światła." - -#~ msgid "Shadow limit" -#~ msgstr "Limit cieni" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Ścieżka do pliku .ttf lub bitmapy." - -#~ msgid "Lightness sharpness" -#~ msgstr "Ostrość naświetlenia" - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "Głębia dużej jaskini" - -#~ msgid "IPv6 support." -#~ msgstr "Wsparcie IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Kanał alfa cienia czcionki (nieprzeźroczystość, od 0 do 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Wysokość gór latających wysp" - -#~ msgid "Floatland base height noise" -#~ msgstr "Podstawowy szum wysokości wznoszącego się terenu" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Włącz filmic tone mapping" - -#~ msgid "Enable VBO" -#~ msgstr "Włącz VBO" - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Określa obszary wznoszącego się gładkiego terenu.\n" -#~ "Wygładzone powierzchnie pojawiają się gdy szum > 0." - -#~ msgid "Darkness sharpness" -#~ msgstr "Ostrość ciemności" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Kontroluje szerokość tuneli, mniejsze wartości tworzą szersze tunele." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Kontroluje gęstość wznoszącego się terenu górzystego.\n" -#~ "Jest to wartość dodana do wartość szumu 'np_mountain'." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Centrum przyśpieszenia środkowego krzywej światła." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Zmienia sposób w jaki podobne do gór latające wyspy zwężają się ku " -#~ "środkowi nad i pod punktem środkowym." +#~ msgid "Address / Port" +#~ msgstr "Adres / Port" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7421,20 +8212,434 @@ msgstr "Limit czasu cURL" #~ "jasność.\n" #~ "To ustawienie jest tylko dla klientów, ignorowane przez serwer." -#~ msgid "Path to save screenshots at." -#~ msgstr "Ścieżka, pod którą zapisywane są zrzuty ekranu." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Zmienia sposób w jaki podobne do gór latające wyspy zwężają się ku " +#~ "środkowi nad i pod punktem środkowym." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Siła zamknięcia paralaksy" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Limit oczekiwań na dysku" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Pobieranie i instalowanie $1, proszę czekaj..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Jesteś pewny że chcesz zresetować świat singleplayer?" #~ msgid "Back" #~ msgstr "Backspace" +#~ msgid "Basic" +#~ msgstr "Podstawowy" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Bity na piksel (głębia koloru) w trybie pełnoekranowym." + +#~ msgid "Bump Mapping" +#~ msgstr "Mapowanie wypukłości" + +#~ msgid "Bumpmapping" +#~ msgstr "Mapowanie wypukłości" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Centrum przyśpieszenia środkowego krzywej światła." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Zmienia interfejs użytkownika menu głównego:\n" +#~ "- Pełny: Wiele światów jednoosobowych, wybór gry, wybór paczki " +#~ "tekstur, itd.\n" +#~ "- Prosty: Jeden świat jednoosobowy, brak wyboru gry lub paczki " +#~ "tekstur. Może być konieczny dla mniejszych ekranów." + +#~ msgid "Config mods" +#~ msgstr "Ustawienia modów" + +#~ msgid "Configure" +#~ msgstr "Ustaw" + +#~ msgid "Connect" +#~ msgstr "Połącz" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Wpływa na prędkość zanurzania w płynie." + +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Kontroluje gęstość wznoszącego się terenu górzystego.\n" +#~ "Jest to wartość dodana do wartość szumu 'np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Kontroluje szerokość tuneli, mniejsze wartości tworzą szersze tunele." + +#~ msgid "Credits" +#~ msgstr "Autorzy" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Kolor celownika (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Obrażenia włączone" + +#~ msgid "Darkness sharpness" +#~ msgstr "Ostrość ciemności" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Domyślny limit czasu dla cURL, w milisekundach.\n" +#~ "Ma znaczenie tylko gdy skompilowane z cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Określa obszary wznoszącego się gładkiego terenu.\n" +#~ "Wygładzone powierzchnie pojawiają się gdy szum > 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Definiuje krok próbkowania tekstury.\n" +#~ "Wyższa wartość reprezentuje łagodniejszą mapę normalnych." + +#~ msgid "Del. Favorite" +#~ msgstr "Usuń ulubiony" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Pobierz tryb gry, taki jak Minetest Game, z minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Ściągnij taką z minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Pobieranie i instalowanie $1, proszę czekaj..." + +#~ msgid "Enable VBO" +#~ msgstr "Włącz VBO" + +#, fuzzy +#~ msgid "Enable register confirmation" +#~ msgstr "Włącz potwierdzanie rejestracji" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Włącza mapowanie wypukłości dla tekstur. Mapy normalnych muszą być dodane " +#~ "w paczce tekstur\n" +#~ "lub muszą być automatycznie wygenerowane.\n" +#~ "Wymaga włączonych shaderów." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Włącz filmic tone mapping" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Włącza generację map normalnych w locie (efekt płaskorzeźby).\n" +#~ "Wymaga włączenia mapowania wypukłości." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Włącza mapowanie paralaksy.\n" +#~ "Wymaga włączenia shaderów." + +#~ msgid "Enter " +#~ msgstr "Enter " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Eksperymentalna opcja, może powodować widoczne przestrzenie\n" +#~ "pomiędzy blokami kiedy ustawiona powyżej 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS podczas pauzy w menu" + +#~ msgid "Fallback font shadow" +#~ msgstr "Zastępczy cień czcionki" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Zastępcza przeźroczystość cienia czcionki" + +#~ msgid "Fallback font size" +#~ msgstr "Zastępczy rozmiar czcionki" + +#~ msgid "Filtering" +#~ msgstr "Filtrowanie anizotropowe" + +#~ msgid "Floatland base height noise" +#~ msgstr "Podstawowy szum wysokości wznoszącego się terenu" + +#~ msgid "Floatland mountain height" +#~ msgstr "Wysokość gór latających wysp" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Kanał alfa cienia czcionki (nieprzeźroczystość, od 0 do 255)." + +#~ msgid "FreeType fonts" +#~ msgstr "Czcionki Freetype" + +#~ msgid "Full screen BPP" +#~ msgstr "Głębia koloru w trybie pełnoekranowym" + +#~ msgid "Game" +#~ msgstr "Gra" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Generuj normalne mapy" + +#~ msgid "Generate normalmaps" +#~ msgstr "Generuj mapy normalnych" + +#~ msgid "HUD scale factor" +#~ msgstr "Współczynnik skalowania HUD" + +#~ msgid "High-precision FPU" +#~ msgstr "FPU Wysokiej precyzji" + +#~ msgid "IPv6 support." +#~ msgstr "Wsparcie IPv6." + +#~ msgid "In-Game" +#~ msgstr "Gra" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Zainstaluj mod: plik: \"$1\"" + +#, fuzzy +#~ msgid "Instrumentation" +#~ msgstr "Instrukcja" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Zdefiniowane klawisze. (Jeżeli to menu nie działa, usuń skonfigurowane " +#~ "klawisze z pliku minetest.conf)" + +#, fuzzy +#~ msgid "Lava depth" +#~ msgstr "Głębia dużej jaskini" + +#~ msgid "Lightness sharpness" +#~ msgstr "Ostrość naświetlenia" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Limit oczekiwań na dysku" + +#~ msgid "Main" +#~ msgstr "Menu główne" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Skrypt głównego menu" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "Sprawia, że DirectX działa z LuaJIT. Wyłącz jeśli występują kłopoty." + +#~ msgid "Menus" +#~ msgstr "Menu" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Minimapa w trybie radaru, Zoom x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minimapa w trybie radaru, Zoom x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minimapa w trybie powierzchniowym, powiększenie x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minimapa w trybie powierzchniowym, powiększenie x4" + +#~ msgid "Name / Password" +#~ msgstr "Nazwa gracza / Hasło" + +#~ msgid "Name/Password" +#~ msgstr "Nazwa gracza/Hasło" + +#~ msgid "No" +#~ msgstr "Nie" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Próbkowanie normalnych map" + +#~ msgid "Normalmaps strength" +#~ msgstr "Siła map normlanych" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Liczba iteracji dla parallax occlusion." + #~ msgid "Ok" #~ msgstr "OK" + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "" +#~ "Ogólny błąd systematyczny efektu zamykania paralaksy, zwykle skala/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Całkowity efekt skalowania zamknięcia paralaksy." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Mapowanie paralaksy" + +#~ msgid "Parallax occlusion" +#~ msgstr "Zamknięcie paralaksy" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Błąd systematyczny zamknięcia paralaksy" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Iteracje zamknięcia paralaksy" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Tryb zamknięcia paralaksy" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Skala parallax occlusion" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Siła zamknięcia paralaksy" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Ścieżka do pliku .ttf lub bitmapy." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Ścieżka, pod którą zapisywane są zrzuty ekranu." + +#~ msgid "Player name" +#~ msgstr "Nazwa gracza" + +#, fuzzy +#~ msgid "Profiling" +#~ msgstr "Profilowanie modyfikacji" + +#~ msgid "Projecting dungeons" +#~ msgstr "Projekcja lochów" + +#~ msgid "PvP enabled" +#~ msgstr "PvP włączone" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Resetuj świat pojedynczego gracza" + +#~ msgid "Select Package File:" +#~ msgstr "Wybierz plik paczki:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Pojedynczy gracz" + +#~ msgid "Shadow limit" +#~ msgstr "Limit cieni" + +#, fuzzy +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "Offset cienia czcionki, jeżeli 0 to cień nie będzie rysowany." + +#~ msgid "Special" +#~ msgstr "Specialne" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "Skradanie" + +#~ msgid "Start Singleplayer" +#~ msgstr "Tryb jednoosobowy" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Siła generowanych zwykłych map." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Siłą przyśpieszenia środkowego krzywej światła." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Ta czcionka zostanie użyta w niektórych językach." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Sterownik OpenGL jest wymagany aby włączyć shadery." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Przełącz na tryb Cinematic" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Maksymalna, standardowa wysokość, powyżej lub poniżej średniego punktu " +#~ "górzystego terenu." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Zmienność wysokości wzgórz oraz głębokości jezior na gładkim terenie " +#~ "wznoszącym się." + +#~ msgid "Waving Water" +#~ msgstr "Falująca woda" + +#~ msgid "Waving water" +#~ msgstr "Falująca woda" + +#, fuzzy +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Kiedy tylko czcionki wolnego typu są używane wymagana jest ich kompilacja " +#~ "wspierająca takie czcionki." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Określa czy lochy mają być czasem przez generowane teren." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Y górnej granicy lawy dużych jaskiń." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "" +#~ "Wysokość średniego punktu wznoszącego się terenu oraz powierzchni jezior." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Wysokość do której rozciągają się cienie wznoszącego terenu." + +#~ msgid "Yes" +#~ msgstr "Tak" + +#, 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 "" +#~ "Próbujesz wejść na serwer \"%s\" o nazwie \"%2$s2\" po raz pierwszy . " +#~ "Jeśli zdecydujesz się kontynuować na serwerze zostanie utworzone nowe " +#~ "konto z Twoim danymi.\n" +#~ "Wpisz ponownie hasło i wciśnij \"Zarejestruj się i Dołącz\" aby " +#~ "potwierdzić utworzenie konta lub wciśnij \"Anuluj\" aby przerwać ten " +#~ "proces." + +#~ msgid "You died." +#~ msgstr "Umarłeś." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/pt/minetest.po b/po/pt/minetest.po index 466428c35..0a2341523 100644 --- a/po/pt/minetest.po +++ b/po/pt/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Portuguese (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-03-31 10:14+0000\n" -"Last-Translator: ssantos <ssantos@web.de>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-07-31 17:28+0000\n" +"Last-Translator: Fábio Rodrigues Ribeiro <farribeiro@gmail.com>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/minetest/" "minetest/pt/>\n" "Language: pt\n" @@ -12,7 +12,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.0-dev\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Limpe a fila de espera do chat" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Comando vazio." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Sair para o menu principal" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Comando inválido: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Comando emitido: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Liste os jogadores online" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Jogadores online: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "A fila de espera do chat agora está vazia." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Este comando está desativado pelo servidor." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,13 +58,44 @@ msgstr "Renascer" msgid "You died" msgstr "Você morreu" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Comandos disponíveis:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Comandos disponíveis: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Comando não disponível: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Obtenha ajuda para comandos" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Use '.help <cmd>' para conseguir mais informação, ou '.help all' para listar " +"tudo." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all| <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<Comando não disponível>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" -msgstr "Um erro ocorreu num script Lua:" +msgstr "Ocorreu um erro em um script Lua:" #: builtin/fstk/ui.lua msgid "An error occurred:" @@ -44,11 +111,35 @@ msgstr "Reconectar" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "O servidor requisitou uma reconexão:" +msgstr "O servidor solicitou uma reconexão:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "A carregar..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "Uma nova versão de $1 está disponível" + +#: builtin/mainmenu/common.lua +msgid "Client Mods" +msgstr "Mods de cliente" + +#: 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 "" +"Versão instalada: $1\n" +"Nova versão: $ 2\n" +"Visite $3 para descobrir como obter a versão mais recente e manter-se " +"atualizado com recursos e correções de bugs." + +#: builtin/mainmenu/common.lua +msgid "Later" +msgstr "Depois" + +#: builtin/mainmenu/common.lua +msgid "Never" +msgstr "Nunca" #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " @@ -63,10 +154,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "O servidor suporta versões de protocolo entre $1 e $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "" -"Tente recarregar a lista de servidores públicos e verifique a sua ligação à " -"internet." +msgid "Visit website" +msgstr "Visite o website" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +165,26 @@ msgstr "Nós suportamos apenas o protocolo versão $1." msgid "We support protocol versions between version $1 and $2." msgstr "Nós suportamos as versões de protocolo entre $1 e $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Enabled, has error)" +msgstr "(Ativado, tem erro)" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Unsatisfied)" +msgstr "(Insatisfeito)" + +#: 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" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Dependências:" @@ -96,7 +194,7 @@ msgstr "Desativar tudo" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "Desabilitar modpack" +msgstr "Desativar modpack" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -104,7 +202,7 @@ msgstr "Ativar tudo" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" -msgstr "Habilitar modpack" +msgstr "Ativar modpack" #: builtin/mainmenu/dlg_config_world.lua msgid "" @@ -117,7 +215,7 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Encontre Mais Mods" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -160,29 +258,67 @@ msgstr "Mundo:" msgid "enabled" msgstr "ativado" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" já existe. Gostaria de sobrescrevê-lo?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "As dependências de $1 e $2 serão instaladas." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 por $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"A descarregar $1,\n" +"$2 na fila" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "A descarregar $1..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 dependências necessárias não foram encontradas." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 serão instalados e $2 dependências serão ignoradas." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Todos os pacotes" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Já instalado" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Voltar ao menu principal" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Jogo base:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB não está disponível quando Minetest é compilado sem cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "A carregar..." +msgstr "A descarregar..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" msgstr "Falhou em descarregar $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Jogos" @@ -191,7 +327,18 @@ msgid "Install" msgstr "Instalar" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Instalar $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Instalar dependências ausentes" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Instalação: Tipo de arquivo não suportado ou corrompido" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" @@ -204,9 +351,24 @@ msgid "No results" msgstr "Sem resultados" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Procurar" +msgid "No updates" +msgstr "Sem atualizações" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Não encontrado" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Sobrescrever" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Verifique se o jogo base está correto." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Enfileirado" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -221,8 +383,12 @@ msgid "Update" msgstr "Atualizar" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Atualizar tudo [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Exibir mais informações num navegador da Web" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -230,101 +396,91 @@ msgstr "O mundo com o nome \"$1\" já existe" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Terreno adicional" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" msgstr "Frio de altitude" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Frio de altitude" +msgstr "Altitude seca" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Ruído da Biome" +msgstr "Mistura de biomas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Ruído da Biome" +msgstr "Biomas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Barulho da caverna" +msgstr "Cavernas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Octavos" +msgstr "Cavernas" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Criar" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Monitorização" +msgstr "Decorações" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Baixe um jogo, como Minetest Game, do site minetest.net" +msgid "Development Test is meant for developers." +msgstr "O Development Test destina-se apenas a programadores." #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Descarregue um do site minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Dungeons" -msgstr "Ruído de masmorra" +msgstr "Masmorras" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Terreno plano" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floating landmasses in the sky" -msgstr "Densidade da terra flutuante montanhosa" +msgstr "Terrenos flutuantes no céu" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floatlands (experimental)" -msgstr "Nível de água" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Jogo" +msgstr "Terrenos flutuantes (experimental)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Gerar terreno não-fractal: Oceanos e subsolo" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Montanhas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Humid rivers" -msgstr "Driver de vídeo" +msgstr "Rios húmidos" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" -msgstr "" +msgstr "Aumenta a humidade perto de rios" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install a game" +msgstr "Instalar um jogo" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "Instalar outro jogo" #: 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 "" +msgstr "Baixa humidade e calor elevado resultam em rios rasos ou secos" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -335,22 +491,20 @@ msgid "Mapgen flags" msgstr "Flags do mapgen" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Flags específicas do gerador de mundo V5" +msgstr "Flags específicas do mapgen" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mountains" -msgstr "Ruído da montanha" +msgstr "Montanhas" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Fluxo de lama" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Conectar túneis e cavernas" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -358,20 +512,19 @@ msgstr "Nenhum jogo selecionado" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Reduz calor com altitude" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Reduz humidade com altitude" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Tamanho do Rio" +msgstr "Rios" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Rios ao nível do mar" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -380,52 +533,47 @@ msgstr "Seed" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Transição 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 aparecem no terreno (sem efeito em árvores e grama da selva " +"criada pelo v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Estruturas que aparecem no terreno, geralmente árvores 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, Selva" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Temperado, Deserto, Selva, Tundra, Floresta Boreal" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Terrain surface erosion" -msgstr "Altura do terreno" +msgstr "Erosão superficial do terreno" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Árvores e relva da selva" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Vary river depth" -msgstr "Profundidade do Rio" +msgstr "Variar a profundidade do rio" #: 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 "Aviso: O minimal development test destina-se apenas a desenvolvedores." +msgstr "Cavernas bastante profundas" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -447,7 +595,7 @@ msgstr "Eliminar" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: failed to delete \"$1\"" -msgstr "pkgmgr: não foi possível excluir \"$1\"" +msgstr "pkgmgr: não foi possível apagar \"$1\"" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: invalid path \"$1\"" @@ -457,6 +605,36 @@ msgstr "pkgmgr: caminho inválido \"$1\"" msgid "Delete World \"$1\"?" msgstr "Eliminar mundo \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Confirmar palavra-passe" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "Juntando-se a $1" + +#: builtin/mainmenu/dlg_register.lua +msgid "Missing name" +msgstr "Nome em falta" + +#: 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 "Palavra-passe" + +#: builtin/mainmenu/dlg_register.lua +msgid "Passwords do not match" +msgstr "As senhas não coincidem" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "Registe-se" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Aceitar" @@ -490,6 +668,14 @@ msgid "Browse" msgstr "Navegar" #: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Games" +msgstr "Conteúdo: Jogos" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Mods" +msgstr "Conteúdo: Mods" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Desativado" @@ -514,7 +700,7 @@ msgid "Offset" msgstr "Deslocamento" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Persistência" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -533,6 +719,10 @@ msgstr "Restaurar valores por defeito" msgid "Scale" msgstr "Escala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Procurar" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Selecione o diretório" @@ -541,7 +731,7 @@ msgstr "Selecione o diretório" msgid "Select file" msgstr "Selecione o ficheiro" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Mostrar nomes técnicos" @@ -602,7 +792,7 @@ msgstr "amenizado" #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" -msgstr "$1 (Habilitado)" +msgstr "$1 (Ativado)" #: builtin/mainmenu/pkgmgr.lua msgid "$1 mods" @@ -623,14 +813,6 @@ msgstr "" "Instalação do Mod: não foi possível encontrar o nome da pasta adequado para " "o modpack $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Instalar: Tipo de ficheiro \"$1\" não suportado ou corrompido" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Instalar: ficheiro: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Incapaz de encontrar um módulo ou modpack válido" @@ -651,6 +833,60 @@ msgstr "Não foi possível instalar um módulo como um $1" msgid "Unable to install a modpack as a $1" msgstr "Não foi possível instalar um modpack como um $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "A carregar..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "A lista de servidores públicos está desativada" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Tente reativar a lista de servidores públicos e verifique sua conexão com a " +"Internet." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Sobre" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Contribuidores Ativos" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Renderizador ativo:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Desenvolvedores Principais" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Abrir o diretório de dados do utilizador" + +#: 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 diretório que contém mundos, jogos, mods fornecidos pelo utilizador,\n" +"e pacotes de textura num gestor de ficheiros / explorador." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Antigos Contribuidores" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Desenvolvedores principais anteriores" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "Compartilhar log de depuração" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Procurar conteúdo online" @@ -661,7 +897,7 @@ msgstr "Conteúdo" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" -msgstr "Desabilitar pacote de texturas" +msgstr "Desativar pacote de texturas" #: builtin/mainmenu/tab_content.lua msgid "Information:" @@ -691,26 +927,6 @@ msgstr "Desinstalar o pacote" msgid "Use Texture Pack" msgstr "Usar pacote de texturas" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Contribuidores Ativos" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Desenvolvedores Principais" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Créditos" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Antigos Contribuidores" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Desenvolvedores principais anteriores" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Anunciar servidor" @@ -720,14 +936,10 @@ msgid "Bind Address" msgstr "Endereço de ligação" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Configurar" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Modo Criativo" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Ativar Dano" @@ -741,11 +953,7 @@ msgstr "Servidor" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nome/palavra-passe" +msgstr "Instalar jogos do ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -759,10 +967,14 @@ msgstr "Nenhum mundo criado ou seleccionado!" msgid "Play Game" msgstr "Jogar Jogo" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Porta" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Selecionar mods" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Seleccionar Mundo:" @@ -776,45 +988,61 @@ msgid "Start Game" msgstr "Iniciar o jogo" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Endereço / Porta" +msgid "Address" +msgstr "Endereço" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Ligar" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Limpar" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Modo Criativo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Dano ativado" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Dano / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Rem. Favorito" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favoritos" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favorito" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Servidores incompatíveis" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Juntar-se ao jogo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nome / Palavra-passe" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "Login" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP ativado" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Servidores Públicos" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Atualizar" + +#: builtin/mainmenu/tab_online.lua +msgid "Remove favorite" +msgstr "Remover favorito" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Descrição do servidor" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "(Suporte de jogo necessário)" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -840,10 +1068,6 @@ msgstr "Todas as configurações" msgid "Antialiasing:" msgstr "Antialiasing:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Tem a certeza que deseja reiniciar o seu mundo?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Auto salvar tamanho do ecrã" @@ -852,10 +1076,6 @@ msgstr "Auto salvar tamanho do ecrã" msgid "Bilinear Filter" msgstr "Filtro bilinear" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bump mapping" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Mudar teclas" @@ -864,13 +1084,29 @@ msgstr "Mudar teclas" msgid "Connected Glass" msgstr "Vidro conectado" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Sombras dinâmicas" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "Sombras dinâmicas:" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Folhas detalhadas" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Gerar Normal maps" +msgid "High" +msgstr "Alto" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Baixo" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Médio" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -880,10 +1116,6 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Filtro Anisotrópico" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Não" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Sem Filtro" @@ -898,7 +1130,7 @@ msgstr "Destaque dos Cubos" #: builtin/mainmenu/tab_settings.lua msgid "Node Outlining" -msgstr "Destaque dos Cubos" +msgstr "Destaque dos Nós" #: builtin/mainmenu/tab_settings.lua msgid "None" @@ -912,21 +1144,14 @@ msgstr "Folhas Opacas" msgid "Opaque Water" msgstr "Água Opaca" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Oclusão de paralaxe" - #: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Particles" -msgstr "Ativar Particulas" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Reiniciar mundo singleplayer" +msgstr "Partículas" #: builtin/mainmenu/tab_settings.lua msgid "Screen:" -msgstr "Tela:" +msgstr "Ecrã:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" @@ -936,6 +1161,10 @@ msgstr "Definições" msgid "Shaders" msgstr "Sombras" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shaders (experimental)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Sombreadores(indisponível)" @@ -952,22 +1181,26 @@ msgstr "Iluminação Suave" msgid "Texturing:" msgstr "Texturização:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Para ativar as sombras é necessário usar o controlador OpenGL." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Mapeamento de tons" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "Nível de sensibilidade ao toque (px)" +msgid "Touch threshold (px):" +msgstr "Nível de sensibilidade ao toque (px):" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Filtro trilinear" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "Muito Alto" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Muito Baixo" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Folhas ondulantes" @@ -980,23 +1213,11 @@ msgstr "Líquidos ondulantes" msgid "Waving Plants" msgstr "Plantas ondulantes" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Sim" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Configurar mods" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Principal" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Iniciar Um Jogador" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "Conexão abortada (erro de protocolo?)." + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Erro de ligação (tempo excedido)." @@ -1025,8 +1246,8 @@ msgid "Connection error (timed out?)" msgstr "Erro de ligação (excedeu tempo?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Não foi possível encontrar ou carregar jogo \"" +msgid "Could not find or load game: " +msgstr "Não foi possível localizar ou carregar jogo " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1056,18 +1277,6 @@ msgstr "Ficheiro de palavra-passe fornecido falhou em abrir : " msgid "Provided world path doesn't exist: " msgstr "O caminho fornecido do mundo não existe: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1080,14 +1289,6 @@ msgstr "" msgid "- Address: " msgstr "- Endereço: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "Modo Criativo: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "-Dano: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Modo: " @@ -1109,42 +1310,79 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "Nome do servidor: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Ocorreu um erro:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Acesso negado. Razão:%s" + #: src/client/game.cpp msgid "Automatic forward disabled" -msgstr "Avanço automático para frente desabilitado" +msgstr "Avanço automático desativado" #: src/client/game.cpp msgid "Automatic forward enabled" -msgstr "Avanço automático para frente habilitado" +msgstr "Avanço automático para frente ativado" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Limites de bloco ocultos" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Limites de bloco mostrados para todos os blocos" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Limites de bloco mostrados para o bloco atual" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Limites de bloco mostrados para blocos próximos" #: src/client/game.cpp msgid "Camera update disabled" -msgstr "Atualização da camera desabilitada" +msgstr "Atualização da camera desativada" #: src/client/game.cpp msgid "Camera update enabled" msgstr "Atualização da camera habilitada" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Não é possível mostrar limites de bloco (desativado por mod ou jogo)" + #: src/client/game.cpp msgid "Change Password" msgstr "Mudar palavra-passe" #: src/client/game.cpp msgid "Cinematic mode disabled" -msgstr "Modo cinemático desabilitado" +msgstr "Modo cinemático desativado" #: src/client/game.cpp msgid "Cinematic mode enabled" -msgstr "Modo cinemático habilitado" +msgstr "Modo cinemático ativado" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Cliente desconectado" #: src/client/game.cpp msgid "Client side scripting is disabled" -msgstr "Scripting de cliente está desabilitado" +msgstr "O scripting de cliente está desativado" #: src/client/game.cpp msgid "Connecting to server..." msgstr "A conectar ao servidor..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "A conexão falhou por motivo desconhecido" + #: src/client/game.cpp msgid "Continue" msgstr "Continuar" @@ -1157,43 +1395,35 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" "Controles:\n" -"\n" -"- %s1: andar para frente\n" -"\n" -"- %s2: andar para trás\n" -"\n" -"- %s3: andar para a esquerda\n" -"\n" -"-%s4: andar para a direita\n" -"\n" -"- %s5: pular/escalar\n" -"\n" -"- %s6: esgueirar/descer\n" -"\n" -"- %s7: soltar item\n" -"\n" -"- %s8: inventário\n" -"\n" -"- Mouse: virar/olhar\n" -"\n" -"- Botão esquerdo do mouse: cavar/dar soco\n" -"\n" -"- Botão direito do mouse: colocar/usar\n" -"\n" -"- Roda do mouse: selecionar item\n" -"\n" -"- %s9: bate-papo\n" +"- %s: mover para a frente\n" +"- %s: mover para trás\n" +"- %s: mover para a esquerda\n" +"- %s: mover para a direita\n" +"- %s: saltar/escalar\n" +"- %s: cavar/socar\n" +"- %s: colocar/usar\n" +"- %s: esgueirar/descer\n" +"- %s: soltar item\n" +"- %s: inventário\n" +"- Rato: virar/ver\n" +"- Roda do rato: selecionar item\n" +"- %s: bate-papo\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Não foi possível resolver o endereço:%s" #: src/client/game.cpp msgid "Creating client..." @@ -1245,11 +1475,16 @@ msgstr "" #: src/client/game.cpp msgid "Disabled unlimited viewing range" -msgstr "Alcance de visualização ilimitado desabilitado" +msgstr "Alcance de visualização ilimitado desativado" #: src/client/game.cpp msgid "Enabled unlimited viewing range" -msgstr "Alcance de visualização ilimitado habilitado" +msgstr "Alcance de visualização ilimitado ativado" + +#: src/client/game.cpp +#, c-format +msgid "Error creating client: %s" +msgstr "A criar cliente: %s" #: src/client/game.cpp msgid "Exit to Menu" @@ -1261,31 +1496,31 @@ msgstr "Sair para o S.O" #: src/client/game.cpp msgid "Fast mode disabled" -msgstr "Modo rápido desabilitado" +msgstr "Modo rápido desativado" #: src/client/game.cpp msgid "Fast mode enabled" -msgstr "Modo rápido habilitado" +msgstr "Modo rápido ativado" #: src/client/game.cpp msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "Modo rápido habilitado(note: sem privilégio 'fast')" +msgstr "Modo rápido ativado (note: sem privilégio 'fast')" #: src/client/game.cpp msgid "Fly mode disabled" -msgstr "Modo voo desabilitado" +msgstr "Modo voo desativado" #: src/client/game.cpp msgid "Fly mode enabled" -msgstr "Modo voo habilitado" +msgstr "Modo voo ativado" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "Modo voo habilitado(note: sem privilegio 'fly')" +msgstr "Modo voo ativado (note: sem privilégio 'fly')" #: src/client/game.cpp msgid "Fog disabled" -msgstr "Névoa desabilitada" +msgstr "Névoa desativada" #: src/client/game.cpp msgid "Fog enabled" @@ -1321,47 +1556,23 @@ msgstr "MiB/s" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "Minipapa atualmente desabilitado por jogo ou mod" +msgstr "Minipapa atualmente desativado por jogo ou mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Minimapa escondido" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Minimapa em modo radar, zoom 1x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Minimapa em modo radar, zoom 2x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Minimapa em modo radar, zoom 4x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minimapa em modo de superfície, zoom 1x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minimapa em modo de superfície, zoom 2x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minimapa em modo de superfície, zoom 4x" +msgid "Multiplayer" +msgstr "Multi-jogador" #: src/client/game.cpp msgid "Noclip mode disabled" -msgstr "Modo atravessar paredes desabilitado" +msgstr "Modo de atravessar paredes desativado" #: src/client/game.cpp msgid "Noclip mode enabled" -msgstr "Modo atravessar paredes habilitado" +msgstr "Modo atravessar paredes ativado" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "Modo atravessar paredes habilitado(note: sem privilégio 'noclip')" +msgstr "Modo atravessar paredes ativado (note: sem privilégio 'noclip')" #: src/client/game.cpp msgid "Node definitions..." @@ -1377,11 +1588,11 @@ msgstr "Ligado" #: src/client/game.cpp msgid "Pitch move mode disabled" -msgstr "Modo movimento pitch desabilitado" +msgstr "Modo movimento pitch desativado" #: src/client/game.cpp msgid "Pitch move mode enabled" -msgstr "Modo movimento pitch habilitado" +msgstr "Modo movimento pitch ativado" #: src/client/game.cpp msgid "Profiler graph shown" @@ -1413,16 +1624,31 @@ msgstr "Som mutado" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Som do sistema está desativado" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Som do sistema não é suportado nesta versão" #: src/client/game.cpp msgid "Sound unmuted" msgstr "Som desmutado" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "O servidor provavelmente está executando uma versão diferente de%s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Não foi possível conectar a%s porque o IPv6 está desativado" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Incapaz de escutar em%s porque IPv6 está desativado" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1436,7 +1662,7 @@ msgstr "Distancia de visualização está no máximo:%d" #: src/client/game.cpp #, c-format msgid "Viewing range is at minimum: %d" -msgstr "Distancia de visualização está no mínima:%d" +msgstr "Distancia de visualização está no mínimo: %d" #: src/client/game.cpp #, c-format @@ -1449,7 +1675,7 @@ msgstr "Mostrar wireframe" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "Zoom atualmente desabilitado por jogo ou mod" +msgstr "Zoom atualmente desativado por jogo ou mod" #: src/client/game.cpp msgid "ok" @@ -1492,10 +1718,6 @@ msgstr "Tecla voltar" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Limpar" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1743,36 +1965,38 @@ msgstr "Botão X 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "As palavra-passes não correspondem!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimapa escondido" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registrar e entrar" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" -"Está prestes a entrar neste servidor com o nome \"%s\" pela primeira vez.\n" -"Se prosseguir, uma nova conta usando suas credenciais será criada neste " -"servidor.\n" -"Por favor, digite novamente a sua palavra-passe e clique em 'Registrar e se " -"cadastrar' para confirmar a criação da conta ou clique em 'Cancelar' para " -"cancelar." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimapa em modo radar, ampliação %dx" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimapa em modo de superfície, ampliação %dx" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimapa em modo de textura" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Falha ao abrir página da web" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Abrindo página da web" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Continuar" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "\"Especial\" = descer" #: src/gui/guiKeyChangeMenu.cpp @@ -1783,15 +2007,23 @@ msgstr "Avanço frontal automático" msgid "Automatic jumping" msgstr "Pulo automático" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Especial" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Recuar" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Limites de bloco" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Mudar camera" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Chat" @@ -1844,8 +2076,8 @@ msgid "Key already in use" msgstr "Tecla já em uso" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "Teclas. (Se este menu se estragar, remova as linhas do minetest.conf)" +msgid "Keybindings." +msgstr "Combinações de teclas." #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1875,10 +2107,6 @@ msgstr "Captura de ecrã" msgid "Sneak" msgstr "Agachar" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Especial" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Ativar interface" @@ -1919,10 +2147,6 @@ msgstr "pressione a tecla" msgid "Change" msgstr "Mudar" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Confirmar palavra-passe" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Palavra-passe nova" @@ -1931,6 +2155,10 @@ msgstr "Palavra-passe nova" msgid "Old Password" msgstr "Palavra-passe antiga" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "As palavra-passes não correspondem!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Sair" @@ -1940,14 +2168,9 @@ msgid "Muted" msgstr "Mutado" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Volume do som: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Enter " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Volume do som: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1956,24 +2179,36 @@ msgstr "Enter " msgid "LANG_CODE" msgstr "pt" +#: src/network/clientpackethandler.cpp +msgid "" +"Name is not registered. To create an account on this server, click 'Register'" +msgstr "" +"O nome não está registrado. Para criar uma conta neste servidor, clique em " +"'Registrar'" + +#: src/network/clientpackethandler.cpp +#, fuzzy +msgid "Name is taken. Please choose another name" +msgstr "O nome foi tomado. Por favor, escolha outro 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) Corrige a posição do joystick virtual.\n" -"Se desabilitado, o joystick virtual vai centralizar na posição do primeiro " +"Se desativado, o joystick virtual vai centralizar na posição do primeiro " "toque." #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Use joystick virtual para ativar botão \"aux\".\n" -"Se habilitado, o joystick virtual vai também clicar no botão \"aux\" quando " -"estiver fora do circulo principal." +"(Android) Use joystick virtual para ativar botão \"especial\".\n" +"Se ativado, o joystick virtual vai também clicar no botão \"especial\" " +"quando estiver fora do circulo principal." #: src/settings_translation_file.cpp msgid "" @@ -2007,19 +2242,11 @@ msgid "" msgstr "" "(X,Y,Z) Escala fractal em nós.\n" "Tamanho fractal atual será de 2 a 3 vezes maior.\n" -"Esses números podem ser muito grandes, o fractal não tem que encaixar dentro " -"do mundo.\n" +"Esses números podem ser muito grandes, o fractal não \n" +"tem que encaixar dentro do mundo.\n" "Aumente estes para 'ampliar' nos detalhes do fractal.\n" -"Padrão é para uma forma espremida verticalmente para uma ilha, coloque todos " -"os 3 números iguais para a forma crua." - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = oclusão paralaxe com dados de inclinação (mais rápido).\n" -"1 = mapeamento de relevo (mais lento, mais preciso)." +"Predefinição é para uma forma espremida verticalmente para uma ilha,\n" +"ponha todos os 3 números iguais para a forma crua." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." @@ -2058,9 +2285,8 @@ msgid "3D mode" msgstr "Modo 3D" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Intensidade de normalmaps" +msgstr "Força de paralaxe do modo 3D" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2081,6 +2307,12 @@ 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 definindo as estruturas de terras flutuantes\n" +"Se alterar da predefinição, a 'escala' do ruído (0.7 por predefinição) pode " +"precisar\n" +"ser ajustada, já que o afunilamento das terras flutuantes funciona melhor " +"quando o ruído tem\n" +"um valor entre -2.0 e 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2113,16 +2345,20 @@ msgid "" "- pageflip: quadbuffer based 3d.\n" "Note that the interlaced mode requires shaders to be enabled." msgstr "" -"Suporte 3D.\n" +"Suporte de 3D.\n" "Modos atualmente suportados:\n" -"- none: Nenhum efeito 3D.\n" -"- anaglyph: Sistema de cor Ciano/Magenta (Óculos 3D azul vermelho).\n" -"- interlaced: Sistema interlaçado (Óculos com lentes polarizadas).\n" -"- topbottom: Divide a tela em duas: uma em cima e outra em baixo.\n" -"- sidebyside: Divide a tela em duas: lado a lado.\n" +"- none: nenhum efeito 3D.\n" +"- anaglyph: sistema de cor Ciano/Magenta (Óculos 3D azul vermelho).\n" +"- interlaced: sistema interlaçado (Óculos com lentes polarizadas).\n" +"- topbottom: divide o ecrã em dois: um em cima e outro em baixo.\n" +"- sidebyside: divide o ecrã em dois: lado a lado.\n" " - crossview: 3D de olhos cruzados.\n" -" - pageflip: Quadbuffer baseado em 3D.\n" -"Note que o modo interlaçado requer que o sombreamento esteja habilitado." +" - pageflip: quadbuffer baseado em 3D.\n" +"Note que o modo interlaçado requer que sombreamentos estejam ativados." + +#: src/settings_translation_file.cpp +msgid "3d" +msgstr "3d" #: src/settings_translation_file.cpp msgid "" @@ -2149,9 +2385,12 @@ msgid "ABM interval" msgstr "Intervalo do ABM" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ABM time budget" +msgstr "Orçamento de tempo do ABM" + +#: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "Limite absoluto da fila de espera emergente" +msgstr "Limite absoluto de blocos em fila de espera a emergir" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2199,6 +2438,12 @@ msgstr "" "Ajustar configuração de dpi ao seu ecrã (não aplicável a X11/Android) ex: " "para ecrãs 4K." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Ajuste a densidade de exibição detectada, usada para dimensionar os " +"elementos da IU." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2208,6 +2453,15 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Ajusta a densidade da camada de terrenos flutuantes.\n" +"Aumenta o valor para aumentar a densidade. Pode ser positivo ou negativo.\n" +"Valor = 0,0: 50% do volume são terrenos flutuantes.\n" +"Valor = 2,0 (pode ser maior dependendo de 'mgv7_np_floatland', teste sempre\n" +"para ter certeza) cria uma camada sólida de terrenos flutuantes." + +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "Nome do administrador" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2228,8 +2482,8 @@ msgstr "" "tem muito pouco efeito na luz natural da noite." #: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "Sempre voar e correr" +msgid "Always fly fast" +msgstr "Sempre voe rápido" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -2276,8 +2530,8 @@ msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" -"Inercia dos braços fornece um movimento mais realista dos braços quando a " -"câmera mexe." +"Inercia dos braços fornece um movimento mais \n" +"realista dos braços quando a câmara se move." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" @@ -2298,14 +2552,21 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" "Nesta distância, o servidor otimizará agressivamente quais blocos são " -"enviados aos clientes.\n" -"Pequenos valores potencialmente melhoram muito o desempenho, à custa de " -"falhas de renderização visíveis(alguns blocos não serão processados debaixo " -"da água e nas cavernas, bem como às vezes em terra).\n" +"enviados aos \n" +"clientes.\n" +"Pequenos valores potencialmente melhoram muito o desempenho, à custa de \n" +"falhas de renderização visíveis (alguns blocos não serão processados debaixo " +"da \n" +"água e nas cavernas, bem como às vezes em terra).\n" "Configure isso como um valor maior do que a " -"distância_máxima_de_envio_do_bloco para desabilitar essa otimização.\n" +"distância_máxima_de_envio_do_bloco \n" +"para desativar essa otimização.\n" "Especificado em barreiras do mapa (16 nós)." +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "Áudio" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Tecla para frente automática" @@ -2326,6 +2587,14 @@ msgstr "Auto salvar tamanho do ecrã" msgid "Autoscaling mode" msgstr "Modo de alto escalamento" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Tecla especial" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Tecla Aux1 pra escalar/descer" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tecla para andar para trás" @@ -2338,10 +2607,6 @@ msgstr "Nível de solo base" msgid "Base terrain height." msgstr "Altura base do terreno." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Básico" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Privilégios básicos" @@ -2363,21 +2628,21 @@ msgid "Bind address" msgstr "Endereço de bind" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "Temperatura da API Biome e parâmetros de ruído de humidade" +msgid "Biome API noise parameters" +msgstr "Parâmetros de ruído da API do bioma" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Ruído da Biome" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bits por pixel (profundidade de cor) no modo de ecrã inteiro." - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "Distância otimizada de envio de bloco" +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "" + #: src/settings_translation_file.cpp msgid "Bold and italic font path" msgstr "Caminho de fonte para negrito e itálico" @@ -2403,21 +2668,20 @@ msgid "Builtin" msgstr "Integrado" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bump mapping" +msgid "Camera" +msgstr "Câmera" #: 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" "Increasing can reduce artifacting on weaker GPUs.\n" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" -"Distancia do plano próximo da câmera em nós, entre 0 e 0.5\n" +"Distancia do plano próximo da câmara em nós, entre 0 e 0.5\n" "A maioria dos utilizadores não precisará mudar isto.\n" "Aumentar pode reduzir a ocorrência de artefactos em GPUs mais fracas.\n" -"0.1 = Padrão, 0.25 = Bom valor para tablets fracos." +"0.1 = Predefinição, 0.25 = Bom valor para tablets fracos." #: src/settings_translation_file.cpp msgid "Camera smoothing" @@ -2425,11 +2689,11 @@ msgstr "Suavização da camera" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "Suavização da câmera no modo cinematográfico" +msgstr "Suavização da câmara no modo cinematográfico" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "Tecla para ativar/desativar atualização da câmera" +msgstr "Tecla para ativar/desativar atualização da câmara" #: src/settings_translation_file.cpp msgid "Cave noise" @@ -2484,33 +2748,24 @@ msgstr "" "0,0 é o nível mínimo de luz, 1,0 é o nível máximo de luz." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Mudanças para a interface do menu principal:\n" -" - Total: Múltiplos mundos de um jogador, escolha de jogo, escolha de pacote " -"de texturas, etc.\n" -"- Simples: Um mundo de um jogador, sem escolha de jogo ou pacote de " -"texturas. Pode ser necessário para telas menores." +msgid "Chat command time message threshold" +msgstr "Limite de mensagem de tempo de comando de bate-papo" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Comandos de Chat" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "Tamanho da fonte" +msgstr "Tamanho da fonte do chat" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Tecla de conversação" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Nível de log de depuração" +msgstr "Nível de log do chat" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2533,8 +2788,8 @@ msgid "Chat toggle key" msgstr "Tecla mostra/esconde conversação" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Comandos do Chat" +msgid "Chat weblinks" +msgstr "Ligações de bate-papo" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2552,6 +2807,14 @@ msgstr "Tecla para modo cinematográfico" msgid "Clean transparent textures" msgstr "Limpar texturas transparentes" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Ligações da web clicáveis (clique do meio ou Ctrl + botão esquerdo) ativados " +"na saída do console de bate-papo." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Cliente" @@ -2572,6 +2835,10 @@ msgstr "Restrição de modificação no lado do cliente" msgid "Client side node lookup range restriction" msgstr "Restrição do alcançe da visão superior de nós no lado do cliente" +#: src/settings_translation_file.cpp +msgid "Client-side Modding" +msgstr "Modding do lado do cliente" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Velocidade de escalada" @@ -2596,6 +2863,10 @@ msgstr "Nuvens no menu" msgid "Colored fog" msgstr "Névoa colorida" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Sombra colorida" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2609,10 +2880,11 @@ msgstr "" "Lista de flags separadas por vírgula para esconder no repositório de " "conteúdos.\n" "\"não livre\" pode ser usada para esconder pacotes que não se qualificam " -"como software livre, como definido pela fundação do software livre.\n" +"como software livre,\n" +"como definido pela Free Software Foundation.\n" "Você também pode especificar classificação de conteúdo.\n" -"Essas flags são independentes das versões do minetest, veja a lista completa " -"em https://content.minetest.net/help/content_flags/" +"Essas flags são independentes das versões do minetest,\n" +"veja a lista completa em https://content.minetest.net/help/content_flags/" #: src/settings_translation_file.cpp msgid "" @@ -2637,6 +2909,32 @@ msgstr "" msgid "Command key" msgstr "Tecla de comando" +#: src/settings_translation_file.cpp +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 "" +"Nível de compressão ZLib a ser usada ao gravar mapblocks no disco.\n" +"-1 - Nível de compressão padrão do Zlib\n" +"0 - Nenhuma compressão; o mais rápido\n" +"9 - Melhor compressão; o mais devagar (níveis 1-3 usam método \"rápido\" do " +"Zlib, enquanto que 4-9 usam método normal)" + +#: src/settings_translation_file.cpp +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 "" +"Nível de compressão ZLib a ser usada ao mandar mapblocks para o cliente.\n" +"-1 - Nível de compressão padrão do Zlib\n" +"0 - Nenhuma compressão; o mais rápido\n" +"9 - Melhor compressão; o mais devagar (níveis 1-3 usam método \"rápido\" do " +"Zlib, enquanto que 4-9 usam método normal)" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Vidro conectado" @@ -2661,10 +2959,18 @@ msgstr "Cor da consola" msgid "Console height" msgstr "Tecla da consola" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "Repositório de conteúdo" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "Lista negra de flags do ContentDB" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Máximo de descargas simultâneas de ContentDB" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "Url do ContentDB" @@ -2678,9 +2984,9 @@ msgid "" "Continuous forward movement, toggled by autoforward key.\n" "Press the autoforward key again or the backwards movement to disable." msgstr "" -"Movimento para frente contínuo, ativado pela tela de avanço automático.\n" -"Pressione a tecla de avanço frontal novamente, ou a tecla de movimento para " -"trás para desabilitar." +"Movimento para frente contínuo, ativado pela tecla de avanço automático.\n" +"Pressione a tecla de avanço frontal novamente ou a tecla de movimento para " +"trás para desativar." #: src/settings_translation_file.cpp msgid "Controls" @@ -2697,8 +3003,13 @@ msgstr "" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = Dia/noite permanece inalterado." #: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "Controla a velocidade de afundamento em líquido." +msgid "" +"Controls sinking speed in liquid when idling. Negative values will cause\n" +"you to rise instead." +msgstr "" +"Controla a velocidade de afundamento em líquido quando em marcha lenta. " +"Valores negativos causarão\n" +"você a subir em vez disso." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." @@ -2731,16 +3042,24 @@ msgid "Crosshair alpha" msgstr "Opacidade do cursor" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Opacidade do cursor (entre 0 e 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Alpha do cursor (quanto ele é opaco, níveis entre 0 e 255).\n" +"Também controla a cor da cruz do objeto." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Cor do cursor" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Cor do cursor (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Cor da cruz (R, G, B).\n" +"Também controla a cor da cruz do objeto" #: src/settings_translation_file.cpp msgid "DPI" @@ -2763,13 +3082,12 @@ msgid "Debug log level" msgstr "Nível de log de depuração" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Tecla de dimin. de som" +msgid "Debugging" +msgstr "Debugging" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Decrease this to increase liquid resistance to movement." -msgstr "Diminue isto para aumentar a resistência do líquido ao movimento." +msgid "Dec. volume key" +msgstr "Tecla de dimin. de som" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2804,17 +3122,18 @@ msgid "Default report format" msgstr "Formato de report predefinido" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Jogo por defeito" +msgstr "Tamanho de pilha predefinido" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Tempo limite por defeito para cURL, em milissegundos.\n" -"Só tem efeito se compilado com cURL." +"Define a qualidade de filtragem de sombreamento\n" +"Isso simula um efeito de sombras suaves aplicando um PCF ou um Poisson disk\n" +"mas também usa mais recursos." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2847,14 +3166,6 @@ msgstr "Define estruturas de canais de grande porte (rios)." msgid "Defines location and terrain of optional hills and lakes." msgstr "Define localizações e terrenos de morros e lagos opcionais." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Define nível de amostragem de textura.\n" -"Um valor mais alto resulta em mapas normais mais suaves." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Define o nível base do solo." @@ -2888,8 +3199,8 @@ msgid "" msgstr "" "Tempo entre atualizações das malhas 3D no cliente em milissegundos. Aumentar " "isso\n" -"vai retardar a taxa de atualização das malhas, sendo assim, reduzindo " -"travamentos em clientes lentos." +"vai retardar a taxa de atualização das malhas, por isso reduz travamentos em " +"clientes lentos." #: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" @@ -2935,6 +3246,14 @@ msgstr "" msgid "Desynchronize block animation" msgstr "Dessincroniza animação de blocos" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "Opções de desenvolvedor" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Tecla para escavar" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Ativar Particulas" @@ -2947,6 +3266,16 @@ msgstr "Desativar anti-batota" msgid "Disallow empty passwords" msgstr "Não permitir palavra-passes vazias" +#: src/settings_translation_file.cpp +msgid "Display Density Scaling Factor" +msgstr "Fator de escala de densidade de exibição" + +#: 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 de domínio do servidor, para ser mostrado na lista de servidores." @@ -2992,24 +3321,47 @@ msgid "" "Enable Lua modding support on client.\n" "This support is experimental and API can change." msgstr "" -"Habilitar suporte a mods LUA locais no cliente.\n" +"Ativar suporte a mods LUA locais no cliente.\n" "Esse suporte é experimental e a API pode mudar." #: src/settings_translation_file.cpp -msgid "Enable console window" -msgstr "Habilitar janela de console" +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Ativa filtragem de Poisson disk.\n" +"Quando em true usa o Poisson disk para fazer \"sombras suaves\". Caso " +"contrário, usa filtragem PCF." #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Habilitar modo criativo para mundos novos." +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Ativa sombras coloridas.\n" +"Quando em true, nodes translúcidos podem projetar sombras coloridas. Requer " +"o uso de muitos recursos." + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Ativar janela de console" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +msgstr "Ativar modo criativo para todos os jogadores" #: src/settings_translation_file.cpp msgid "Enable joysticks" -msgstr "Habilitar Joysticks" +msgstr "Ativar 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 "Habilitar suporte a canais de módulos." +msgstr "Ativar suporte a canais de módulos." #: src/settings_translation_file.cpp msgid "Enable mod security" @@ -3023,18 +3375,6 @@ msgstr "Ativar dano e morte dos jogadores." msgid "Enable random user input (only used for testing)." msgstr "Ativa a entrada de comandos aleatória (apenas usado para testes)." -#: src/settings_translation_file.cpp -msgid "Enable register confirmation" -msgstr "Habilitar registro de confirmação" - -#: src/settings_translation_file.cpp -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" -"Habilitar confirmação de registro quando conectar ao servidor.\n" -"Caso desabilitado, uma nova conta será registrada automaticamente." - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" @@ -3043,6 +3383,10 @@ msgstr "" "Ativar a iluminação suave com oclusão de ambiente simples.\n" "Desativar para velocidade ou vistas diferentes." +#: 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" @@ -3086,14 +3430,14 @@ msgstr "" "Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Enable/disable running an IPv6 server.\n" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" -"Habilitar/desabilitar a execução de um IPv6 do servidor. \n" -"Ignorado se bind_address estiver definido." +"Ativar/desativar a execução de um servidor IPv6.\n" +"Ignorado se bind_address estiver definido.\n" +"Necessita de habilitar_ipv6." #: src/settings_translation_file.cpp msgid "" @@ -3113,18 +3457,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Ativa animação de itens no inventário." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Ativa o bumpmapping para texturas. Mapas normais devem ser fornecidos pelo " -"pack de\n" -"texturas ou gerado automaticamente.\n" -"Requer que as sombras sejam ativadas." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Ativar armazenamento em cache para os meshes das faces." @@ -3133,22 +3465,6 @@ msgstr "Ativar armazenamento em cache para os meshes das faces." msgid "Enables minimap." msgstr "Ativa mini-mapa." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Ativa geração de normalmap (efeito de relevo) ao voar.\n" -"Requer texturização bump mapping para ser ativado." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Ativa mapeamento de oclusão de paralaxe.\n" -"Requer sombreadores ativados." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3161,6 +3477,16 @@ msgstr "" "os controles de som no jogo não funcionarão.\n" "A alteração desta configuração requer um reinício." +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "Perfil do motor" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Intervalo de exibição dos dados das analizes do motor" @@ -3169,14 +3495,6 @@ msgstr "Intervalo de exibição dos dados das analizes do motor" msgid "Entity methods" msgstr "Metodos de entidade" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Opção experimental, pode causar espaços visíveis entre blocos\n" -"quando definido com num úmero superior a 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3186,10 +3504,24 @@ 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 "" +"Expoente do afunilamento do terreno flutuante. Altera o comportamento de " +"afunilamento.\n" +"Valor = 1.0 cria um afunilamento linear e uniforme.\n" +"Valores > 1.0 criam um afunilamento suave, adequado para a separação " +"padrão.\n" +"terras flutuantes.\n" +"Valores < 1,0 (por exemplo, 0,25) criam um nível de superfície mais definido " +"com\n" +"terrenos flutuantes mais planos, adequados para uma camada sólida de " +"terrenos flutuantes." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS em menu de pausa" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS quando desfocado ou pausado" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3204,21 +3536,8 @@ msgid "Fall bobbing factor" msgstr "Cair balançando" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font path" -msgstr "Fonte alternativa" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Sombra da fonte alternativa" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Canal de opacidade sombra da fonte alternativa" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Tamanho da fonte alternativa" +msgstr "Caminho da fonte reserva" #: src/settings_translation_file.cpp msgid "Fast key" @@ -3238,10 +3557,10 @@ msgstr "Modo rápido" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Movimento rápido (através da tecla \"especial\").\n" +"Movimento rápido (através da tecla \"Aux1\").\n" "Isso requer o privilegio \"fast\" no servidor." #: src/settings_translation_file.cpp @@ -3259,7 +3578,8 @@ msgid "" "Multiplayer Tab." msgstr "" "Ficheiro na pasta client/serverlist/ que contém seus servidores favoritos, " -"que são mostrados na aba Multijogador." +"que são mostrados na\n" +"aba Multijogador." #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3276,18 +3596,21 @@ msgstr "Mapeamento de tom fílmico" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" -"Texturas filtradas podem misturar valores RGB com os vizinhos totalmente \n" -"transparentes, o qual otimizadores PNG geralmente descartam, por vezes \n" -"resultando em uma linha escura em texturas transparentes.\n" -"Aplicar esse filtro para limpar isso no tempo de carregamento da textura." +"Texturas filtradas podem misturar valores RGB com os vizinhos totalmente " +"transparentes,\n" +"o qual otimizadores PNG geralmente descartam, por vezes resultando numa " +"linha escura ou\n" +"em texturas transparentes. Aplique esse filtro para limpar isso no momento " +"de carregamento\n" +"da textura. Esse filtro será ativo automaticamente ao ativar \"mipmapping\"." #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filtros" +msgid "Filtering and Antialiasing" +msgstr "Filtragem e Antialiasing" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3307,39 +3630,32 @@ msgid "Fixed virtual joystick" msgstr "Joystick virtual fixo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "Densidade da terra flutuante montanhosa" +msgstr "Densidade do terreno flutuante" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "Y máximo da dungeon" +msgstr "Y máximo do terreno flutuante" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "Y mínimo da dungeon" +msgstr "Y mínimo do terreno flutuante" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Ruído base de terra flutuante" +msgstr "Ruído no terreno flutuante" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "Expoente de terras flutuantes montanhosas" +msgstr "Expoente de conicidade de terrenos flutuantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "Ruído base de terra flutuante" +msgstr "Distância de afilamento da ilha flutuante" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "Nível de água" +msgstr "Nível da água em terreno flutuante" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3361,6 +3677,10 @@ msgstr "Início da névoa" msgid "Fog toggle key" msgstr "Tecla de ativar/desativar nevoeiro" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "Fonte" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "Fonte em negrito por predefinição" @@ -3382,22 +3702,37 @@ msgid "Font size" msgstr "Tamanho da fonte" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "Tamanho da fonte predefinida em pontos (pt)." - -#: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Tamanho da fonte padrão onde 1 unidade = 1 pixel a 96 DPI" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" +"Tamanho da fonte da fonte monoespaçada onde 1 unidade = 1 pixel a 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 "" +"Tamanho da fonte do texto de bate-papo recente e do prompt do bate-papo em " +"pontos (pt).\n" +"O valor 0 irá utilizar o tamanho padrão de fonte." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -3423,15 +3758,15 @@ msgstr "Opacidade de fundo padrão do formspec" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Color" -msgstr "Cor de fundo em tela cheia do formspec" +msgstr "Cores de fundo de ecrã cheia de formspec" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Opacity" -msgstr "Opacidade de fundo em tela cheia do formspec" +msgstr "Opacidade de fundo de ecrã cheia do Formspec" #: src/settings_translation_file.cpp msgid "Formspec default background color (R,G,B)." -msgstr "Cor de fundo(R,G,B) padrão do formspec padrão." +msgstr "Cor de fundo padrão do Formspec (R,G,B)." #: src/settings_translation_file.cpp msgid "Formspec default background opacity (between 0 and 255)." @@ -3439,11 +3774,11 @@ msgstr "Opacidade de fundo padrão do formspec (entre 0 e 255)." #: src/settings_translation_file.cpp msgid "Formspec full-screen background color (R,G,B)." -msgstr "Cor de fundo(R,G,B) do formspec padrão em tela cheia." +msgstr "Cor de fundo (R,G,B) do formspec em ecrã cheio." #: src/settings_translation_file.cpp msgid "Formspec full-screen background opacity (between 0 and 255)." -msgstr "Opacidade de fundo do formspec em tela cheia (entre 0 e 255)." +msgstr "Opacidade de fundo do formspec em ecrã cheio (entre 0 e 255)." #: src/settings_translation_file.cpp msgid "Forward key" @@ -3462,10 +3797,6 @@ msgstr "Tipo fractal" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Fração da distância visível em que a névoa começa a aparecer" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Fontes Freetype" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3488,20 +3819,18 @@ 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 "" -"De quão longe clientes sabem sobre objetos declarados em mapblocks (16 " -"nós).\n" -" Configurando isto maior do que o alcançe de bloco ativo vai fazer com que o " -"sevidor mantenha objetos ativos na distancia que o jogador está olhando." -"(Isso pode evitar que mobs desapareçam da visão de repente)" +"De quão longe clientes sabem sobre objetos declarados em mapblocks (16 nós)." +"\n" +"\n" +"Configurando isto maior do que o alcance de bloco ativo vai fazer com que o " +"servidor\n" +"mantenha objetos ativos na distancia que o jogador\n" +"está olhando.(Isso pode evitar que mobs desapareçam da visão de repente)" #: src/settings_translation_file.cpp msgid "Full screen" msgstr "Ecrã inteiro" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "BPP em ecrã inteiro" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Modo de ecrã inteiro." @@ -3519,8 +3848,16 @@ msgid "GUI scaling filter txr2img" msgstr "Filtro txr2img de redimensionamento do interface gráfico" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Gerar mapa de normais" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gamepads" +msgstr "Gamepads" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" #: src/settings_translation_file.cpp msgid "Global callbacks" @@ -3530,32 +3867,42 @@ msgstr "Chamadas de retorno Globais" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Atributos de geração de mapa globais.\n" -"No gerador de mapa v6 a flag 'decorations' controla todas as decorações " +"No gerador de mapa v6 a flag 'decorations' controla todas as decorações, " "exceto árvores\n" "e gramas da selva, em todos os outros geradores de mapa essa flag controla " "todas as decorações." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." -msgstr "Curva gradiente de iluminaçao no nível de luz maximo." +msgstr "" +"Gradiente da curva de luz no nível de luz máximo.\n" +"Controla o contraste dos níveis de luz mais altos." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." -msgstr "Curva gradiente de iluminação no nível de luz mínimo." +msgstr "" +"Gradiente da curva de luz no nível de luz mínimo.\n" +"Controla o contraste dos níveis de luz mais baixos." #: src/settings_translation_file.cpp msgid "Graphics" msgstr "Gráficos" +#: src/settings_translation_file.cpp +msgid "Graphics Effects" +msgstr "Efeitos Gráficos" + +#: src/settings_translation_file.cpp +msgid "Graphics and Audio" +msgstr "Gráficos e Áudio" + #: src/settings_translation_file.cpp msgid "Gravity" msgstr "Gravidade" @@ -3573,26 +3920,29 @@ msgid "HTTP mods" msgstr "Módulos HTTP" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "Fator de escalonamento do painel de interface" +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "Dimensionamento do HUD" #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Tecla de comutação HUD" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"Tratamento de chamadas ao API Lua obsoletas:\n" -"- legacy: (tenta) imitar o comportamento antigo (por defeito em versão de " -"lançamento).\n" -"- log: imita e regista no log (por defeito em versão de depuração).\n" -"- error: aborta (sugerido para desenvolvedores de extras)." +"Lidando com funções obsoletas da API Lua:\n" +"-...none: não regista funções obsoletas.\n" +"-...log: imita e regista as funções obsoletas chamadas (padrão).\n" +"-...error: aborta quando chama uma função obsoleta (sugerido para " +"programadores de mods)." #: src/settings_translation_file.cpp msgid "" @@ -3602,11 +3952,11 @@ msgid "" "call).\n" "* Instrument the sampler being used to update the statistics." msgstr "" -"Tem o instrumento de registro em si:\n" +"Fazer que o profiler instrumente si próprio:\n" "* Monitorar uma função vazia.\n" -"Isto estima a sobrecarga, que o istrumento está adicionando (+1 Chamada de " +"Isto estima a sobrecarga, que o instrumento está a adicionar (+1 chamada de " "função).\n" -"* Monitorar o amostrador que está sendo usado para atualizar as estatísticas." +"* Monitorar o sampler que está a ser usado para atualizar as estatísticas." #: src/settings_translation_file.cpp msgid "Heat blend noise" @@ -3617,8 +3967,11 @@ msgid "Heat noise" msgstr "Ruído para cavernas #1" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Altura da janela inicial." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Componente de altura do tamanho da janela inicial. Ignorado em modo de ecrã " +"cheio." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3628,10 +3981,6 @@ msgstr "Ruído de altura" msgid "Height select noise" msgstr "Parâmetros de ruido de seleção de altura do gerador de mundo v6" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "FPU de alta precisão" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Inclinação dos lagos no gerador de mapa plano" @@ -3830,15 +4179,28 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"A velocidade com que as ondas líquidas se movem. Maior = mais rápido.\n" +"Se negativo, as ondas líquidas se moverão para trás.\n" +"Requer que a ondulação de líquidos esteja ativada." #: 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 "" -"A quantidade que o servidor vai esperar antes de descarregar mapblocks não " -"utilizados.\n" -"Valor maior é mais suave, mas irá usar mais memoria RAM." +"Quanto tempo o servidor esperará antes de descarregar mapblocks não usados, " +"declarados em segundos.\n" +"O valor mais alto é mais suave, mas usará mais 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 "" +"O quanto se é atrasado ao mover-se dentro de um líquido.\n" +"Diminua isto para aumentar a resistência do líquido ao movimento." #: src/settings_translation_file.cpp msgid "How wide to make rivers." @@ -3874,12 +4236,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Se estiver desabilitado, a tecla \"especial será usada para voar rápido se " -"modo voo e rápido estiverem habilitados." +"Se estiver desativado, a tecla \"especial\" será usada para voar rápido se " +"modo voo e rápido estiverem\n" +"ativados." #: src/settings_translation_file.cpp msgid "" @@ -3889,10 +4251,13 @@ msgid "" "invisible\n" "so that the utility of noclip mode is reduced." msgstr "" -"Se habilitado, o servidor executará a seleção de oclusão de bloco de mapa " -"com base na posição do olho do jogador. Isso pode reduzir o número de blocos " -"enviados ao cliente de 50 a 80%. O cliente não será mais mais invisível, de " -"modo que a utilidade do modo \"noclip\" (modo intangível) será reduzida." +"Se ativado, o servidor executará a seleção de oclusão de bloco de mapa com " +"base \n" +"na posição do olho do jogador. Isso pode reduzir o número de blocos enviados " +"ao \n" +"cliente de 50 a 80%. O cliente ja não será invisível, de modo que a " +"utilidade do \n" +"modo \"noclip\" (modo intangível) será reduzida." #: src/settings_translation_file.cpp msgid "" @@ -3906,19 +4271,29 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Se habilitado, a tecla \"especial\" em vez de \"esgueirar\" servirá para " -"usada descer." +"Se ativado, a tecla \"especial\" em vez de \"esgueirar\" servirá para\n" +"descer." + +#: 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 "" +"Se ativado, o registro da conta será separado do login na interface do " +"usuário.\n" +"Se desativadas, novas contas serão registradas automaticamente ao fazer " +"login." #: src/settings_translation_file.cpp msgid "" "If enabled, actions are recorded for rollback.\n" "This option is only read when server starts." msgstr "" -"Se habilitado, as ações são registradas para reversão.\n" +"Se ativado, as ações são registadas para reversão.\n" "Esta opção só é lido quando o servidor é iniciado." #: src/settings_translation_file.cpp @@ -3930,19 +4305,22 @@ 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 habilitado, dados inválidos do mundo não vão fazer o servidor desligar.\n" -"Só habilite isso, se você souber o que está fazendo." +"Se ativado, dados inválidos do mundo não vão fazer o servidor desligar.\n" +"Só ative isto, se souber o que está a fazer." #: src/settings_translation_file.cpp msgid "" "If enabled, makes move directions relative to the player's pitch when flying " "or swimming." msgstr "" -"Se habilitado, faz com que os movimentos sejam relativos ao pitch do jogador " -"quando voando ou nadando." +"Se ativado, faz com que os movimentos sejam relativos ao pitch do jogador " +"quando a voar ou a nadar." #: 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 ativado, novos jogadores não podem entrar com uma palavra-passe vazia." @@ -3962,8 +4340,18 @@ msgid "" "limited\n" "to this distance from the player to the node." msgstr "" -"Se a restrição de CSM para alcançe de nós está habilitado, chamadas get_node " -"são limitadas a está distancia do player até o nó." +"Se a restrição de CSM para o alcançe de nós está ativado, chamadas get_node " +"são \n" +"limitadas a está distancia do jogador até o 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 execução de um comando de chat demorar mais do que o tempo especificado " +"em\n" +"segundos, adicione a informação do tempo na mensagem-comando" #: src/settings_translation_file.cpp msgid "" @@ -3988,10 +4376,6 @@ msgstr "" msgid "Ignore world errors" msgstr "Ignorar erros do mundo" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "No jogo" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -4025,8 +4409,8 @@ msgstr "" "Isto é usualmente apenas nessesário por contribuidores core/builtin" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "Monitoração de comandos de chat quando registrados." +msgid "Instrument chat commands on registration." +msgstr "Comandos de chat de instrumentos no registro." #: src/settings_translation_file.cpp msgid "" @@ -4052,10 +4436,6 @@ msgstr "" msgid "Instrument the methods of entities on registration." msgstr "Monitorar os métodos das entidades durante a registração." -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "Monitorização" - #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." msgstr "" @@ -4063,8 +4443,9 @@ msgstr "" "em segundos." #: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." -msgstr "Intervalo de envio de hora do dia para os clientes." +msgid "Interval of sending time of day to clients, stated in seconds." +msgstr "" +"Intervalo de envio de hora do dia para os clientes, indicados em segundos." #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -4083,14 +4464,12 @@ msgid "Invert vertical mouse movement." msgstr "Inverte o movimento vertical do rato." #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "Caminho de fonte monoespaçada" +msgstr "Caminho da fonte em itálico" #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic monospace font path" -msgstr "Caminho de fonte monoespaçada" +msgstr "Caminho da fonte em itálico monoespaçada" #: src/settings_translation_file.cpp msgid "Item entity TTL" @@ -4108,8 +4487,8 @@ msgid "" "At iterations = 20 this mapgen has a similar load to mapgen V7." msgstr "" "Iterações da função recursiva.\n" -"Aumentando isso aumenta a quantidade de detalhes, mas também aumenta o tempo " -"de processamento.\n" +"Aumentando isso aumenta a quantidade de detalhes, mas também\n" +"aumenta o tempo de processamento.\n" "Com iterações = 20, esse gerador de mapa tem um tempo de carregamento " "similar ao gerador V7." @@ -4121,6 +4500,10 @@ msgstr "ID do Joystick" msgid "Joystick button repetition interval" msgstr "Intervalo de repetição do botão do Joystick" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "\"Zona morta\" do joystick" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Sensibilidade do frustum do Joystick" @@ -4138,7 +4521,8 @@ msgid "" "Range roughly -2 to 2." msgstr "" "Apenas para a configuração de Julia.\n" -"Componente W da constante hipercomplexa determinando o formato do fractal.\n" +"Componente W da constante hipercomplexa.\n" +"Determinando o formato do fractal.\n" "Não tem nenhum efeito em fractais 3D.\n" "varia aproximadamente entre -2 e 2." @@ -4162,8 +4546,9 @@ msgid "" "Range roughly -2 to 2." msgstr "" "Apenas para configuração de Julia.\n" -"Componente Y da constante hipercomplexa.\n" -"Varia aproximadamente entre -2 e 2." +"Componente em Y da constante hipercomplexa.\n" +"Altera a forma do fractal.\n" +"Alcance aproximado de -2 a 2." #: src/settings_translation_file.cpp msgid "" @@ -4221,6 +4606,16 @@ msgstr "" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para escavar. \n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4279,7 +4674,7 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" "Tecla para mover o jogador para trás.\n" -"Também ira desabilitar o andar para frente automático quando ativo.\n" +"Também ira desativar o andar para frente automático quando ativo.\n" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4363,6 +4758,16 @@ msgstr "" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para pôr objetos. \n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4723,7 +5128,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para comutação entre câmera de primeira e terceira pessoa.\n" +"Tecla para comutação entre câmara de primeira e terceira pessoa.\n" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4733,7 +5138,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para tirar fotos da tela.\n" +"Tecla para tirar fotos do ecrã.\n" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4853,7 +5258,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para ativar/desativar a exibição do HUD.\n" +"Tecla para ativar/desativar a a exibição do HUD.\n" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4863,8 +5268,8 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para ativar/desativar a exibição de informações de depuração.\n" -"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"Tecla para ativar/desativar exibição do bate-papo.\n" +"Ver http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp @@ -4898,6 +5303,10 @@ msgstr "" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "Expulsar jogadores que enviaram mais de X mensagem por 10 segundos." @@ -4920,15 +5329,15 @@ msgstr "Profundidade de cavernas grandes" #: src/settings_translation_file.cpp msgid "Large cave maximum number" -msgstr "" +msgstr "Quantidade máxima de cavernas grandes" #: src/settings_translation_file.cpp msgid "Large cave minimum number" -msgstr "" +msgstr "Quantidade mínima de cavernas grandes" #: src/settings_translation_file.cpp msgid "Large cave proportion flooded" -msgstr "" +msgstr "Proporção inundada de cavernas grandes" #: src/settings_translation_file.cpp msgid "Large chat console key" @@ -4958,31 +5367,40 @@ msgstr "Tecla para a esquerda" msgid "" "Length of a server tick and the interval at which objects are generally " "updated over\n" -"network." +"network, stated in seconds." msgstr "" -"Comprimento do tick do servidor e o intervalo no qual os objetos são " -"geralmente atualizados em rede." +"Duração de um tick do servidor e o intervalo no qual os objetos são " +"geralmente atualizados ao longo\n" +"rede, declarada em segundos." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." msgstr "" -"Com o valor TRUE, folhas ondulantes são ativadas.\n" -"Necessita de shaders para estar ativo." +"Comprimento das ondas líquidas.\n" +"Requer que a ondulação de líquidos esteja ativada." #: src/settings_translation_file.cpp -msgid "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "Período de tempo entre os ciclos de execução de ABMs" +msgid "" +"Length of time between Active Block Modifier (ABM) execution cycles, stated " +"in seconds." +msgstr "" +"Duração do tempo entre ciclos de execução do Active Block Modifier (ABM), " +"indicado em segundos." #: src/settings_translation_file.cpp -msgid "Length of time between NodeTimer execution cycles" -msgstr "Período de tempo entre ciclos de execução de NodeTimer" +#, fuzzy +msgid "Length of time between NodeTimer execution cycles, stated in seconds." +msgstr "" +"Duração do tempo entre ciclos de execução do NodeTimer, indicado em segundos." #: src/settings_translation_file.cpp -msgid "Length of time between active block management cycles" -msgstr "Período de tempo entre os ciclos de gestão de blocos" +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" +"Duração do tempo entre ciclos ativos de gestão de blocos, indicado em " +"segundos." #: src/settings_translation_file.cpp msgid "" @@ -4993,46 +5411,46 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" -"Nível de registo log a ser guardado em debug.txt:\n" -"- <nothing> (nada registado)\n" +"Nível de registro log a ser guardado em debug.txt:\n" +"- <nothing> (nada registrado)\n" "- none (mensagens sem nível de log)\n" "- error\n" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost" -msgstr "Aumento leve da curva de luz" +msgstr "Aumento da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost center" -msgstr "Centro do aumento leve da curva de luz" +msgstr "Centro do aumento da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost spread" -msgstr "Extensão do aumento leve da curva de luz" +msgstr "Extensão do aumento da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve gamma" -msgstr "Aumento leve da curva de luz" +msgstr "Gamma da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve high gradient" -msgstr "Aumento leve da curva de luz" +msgstr "Gradiente alto da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve low gradient" -msgstr "Centro do aumento leve da curva de luz" +msgstr "Gradiente baixo da curva de luz" + +#: src/settings_translation_file.cpp +msgid "Lighting" +msgstr "Iluminação" #: src/settings_translation_file.cpp msgid "" @@ -5040,9 +5458,9 @@ msgid "" "Only mapchunks completely within the mapgen limit are generated.\n" "Value is stored per-world." msgstr "" -"Limite de geração de mapas, em nós, em todas as 6 direções de (0, 0, 0). " -"Apenas áreas completas de mapa dentro do limite do mapgen são gerados. O " -"valor é armazenado por mundo." +"Limite de geração de mapas, em nós, em todas as 6 direções de (0, 0, 0).\n" +"Apenas áreas completas de mapa dentro do limite do mapgen são gerados.\n" +"O valor é armazenado por mundo." #: src/settings_translation_file.cpp msgid "" @@ -5052,10 +5470,10 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" -"Limites número de solicitações HTTP paralelas. afeta:\n" +"Limite quantidade de solicitações HTTP paralelas. afeta:\n" "- Media buscar se servidor usa configuração de remote_media.\n" -"- Download de lista de servidores e anúncio do servidor.\n" -"- Transferências realizadas pelo menu principal (por exemplo gerência de " +"- Descarrega de lista de servidores e anúncio do servidor.\n" +"- Transferências realizadas pelo menu principal (por exemplo, gerência de " "mods).\n" "Só tem efeito se compilado com cURL." @@ -5110,18 +5528,13 @@ msgid "Lower Y limit of dungeons." msgstr "Menor limite Y de dungeons." #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "Menor limite Y de dungeons." +msgstr "Menor limite Y de ilhas flutuantes." #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "Menu principal de scripts" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Estilo do menu principal" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5129,14 +5542,18 @@ msgstr "" "Fazer cores de névoa e céu dependerem do dia (amanhecer/pôr do sol) e exibir " "a direção." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "Faz o DirectX trabalhar com LuaJIT. Desative se causa problemas." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Torna todos os líquidos opacos" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Nível de Compressão de Mapa no Armazenamento em Disco" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Nível de Compressão do Mapa na Transferência em Rede" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Diretório do mapa" @@ -5146,24 +5563,22 @@ msgid "Map generation attributes specific to Mapgen Carpathian." msgstr "Atributos de geração de mapa específicos ao gerador Carpathian." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." msgstr "" -"Atributos de geração de mapas específicos para o gerador de mundo plano.\n" +"Atributos de geração de mapas específicos para o Gerador de mundo Plano.\n" "Lagos e colinas ocasionalmente podem ser adicionados ao mundo plano." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Fractal.\n" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" -"Atributos de geração de mapas específicos do Mapgen plano.\n" -"O \"terreno\" permite a geração de terrenos não fractários:\n" -"oceano, ilhas e subsolo." +"Atributos de geração de mapas específicos para o Gerador de mundo Fractal.\n" +"'terreno' permite a geração de terreno não fractal:\n" +"oceano, ilhas e subterrâneos." #: src/settings_translation_file.cpp msgid "" @@ -5175,11 +5590,11 @@ msgid "" "'altitude_dry': Reduces humidity with altitude." msgstr "" "Atributos de geração de mapa específicos ao gerador Valleys.\n" -"'altitude_chill':Reduz o calor com a altitude.\n" -"'humid_rivers':Aumenta a umidade em volta dos rios.\n" -"'profundidade_variada_rios': Se habilitado, baixa umidade e alto calor faz " -"com que que rios se tornem mais rasos e eventualmente sumam.\n" -"'altitude_dry': Reduz a umidade com a altitude." +"'altitude_chill': Reduz o calor com a altitude.\n" +"'humid_rivers': Aumenta a humidade à volta de rios.\n" +"'profundidade_variada_rios': se ativado, baixa a humidade e alto calor faz \n" +"com que rios se tornem mais rasos e eventualmente sumam.\n" +"'altitude_dry': reduz a humidade com a altitude." #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen v5." @@ -5199,15 +5614,16 @@ msgstr "" "a marcação 'selvas' é ignorada." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Atributos de geração de mapa específicos ao gerador V7.\n" -"'ridges' habilitam os rios." +"Atributos de geração de mapas específicos para Gerador de mapas v7.\n" +"'ridges': rios.\n" +"'floatlands': massas de terra flutuantes na atmosfera.\n" +"'caverns': cavernas gigantes no subsolo." #: src/settings_translation_file.cpp msgid "Map generation limit" @@ -5217,6 +5633,10 @@ msgstr "Limite de geração de mapa" msgid "Map save interval" msgstr "Intervalo de salvamento de mapa" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Quadros de atualização de sombras do mapa" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Limite de mapblock" @@ -5241,7 +5661,7 @@ msgstr "Gerador de mundo Carpathian" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian specific flags" -msgstr "Flags específicas do gerador de mundo Carpathian" +msgstr "Flags específicas do gerador do mundo Carpathian" #: src/settings_translation_file.cpp msgid "Mapgen Flat" @@ -5324,8 +5744,13 @@ msgid "Maximum FPS" msgstr "FPS máximo" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Máximo FPS quando o jogo é pausado." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"FPS máximo quando a janela não está com foco, ou quando o jogo é pausado." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5338,20 +5763,20 @@ msgstr "Largura máxima da hotbar" #: src/settings_translation_file.cpp msgid "Maximum limit of random number of large caves per mapchunk." msgstr "" +"Limite máximo da quantidade aleatória de cavernas grandes por mapchunk." #: src/settings_translation_file.cpp msgid "Maximum limit of random number of small caves per mapchunk." msgstr "" +"Limite máximo da quantidade aleatória de cavernas pequenas por mapchunk." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum liquid resistance. Controls deceleration when entering liquid at\n" "high speed." msgstr "" -"Resistência máxima do líquido. Controla a desaceleração ao entrar no líquido " -"a\n" -"alta velocidade." +"Resistência líquida máxima. Controla desaceleração ao entrar num líquido\n" +"em alta velocidade." #: src/settings_translation_file.cpp msgid "" @@ -5369,25 +5794,32 @@ msgstr "" "Número máximo de blocos que podem ser enfileirados para o carregamento." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "This limit is enforced per player." msgstr "" -"Número máximo de blocos para serem enfileirados que estão a ser gerados.\n" -"Definido em branco para uma quantidade apropriada ser escolhida " -"automaticamente." +"Quantidade máxima de blocos a serem enfileirados, dos que estão para ser " +"gerados.\n" +"Esse limite é forçado para cada jogador." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" -"Número máximo de blocos para ser enfileirado que serão carregados do " -"ficheiro.\n" -"Definido em branco para uma quantidade apropriada ser escolhida " -"automaticamente." +"Quantdade máxima de blocos a serem enfileirados, dos que estão para ser " +"carregados do ficheiro.\n" +"Esse limite é forçado para cada jogador." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Quantidade máxima de descarregas paralelas. Descarregas a exceder esse " +"limite esperarão numa fila.\n" +"Deve ser menor que curl_parallel_limit." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." @@ -5402,15 +5834,16 @@ msgstr "" "Definido como -1 para quantidade ilimitada." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of packets sent per send step, if you have a slow connection\n" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" -"Número máximo de pacotes enviados por etapa de envio, se você tem uma " -"conexão lenta \n" -"tente reduzir isso, mas não reduza a um número abaixo do dobro do número de " -"cliente alvo." +"Número máximo de pacotes enviados por etapa de envio, se tiver uma conexão " +"lenta\n" +"tente reduzi-lo, mas não o reduza para um número abaixo do dobro do alvo\n" +"número de cliente." #: src/settings_translation_file.cpp msgid "Maximum number of players that can be connected simultaneously." @@ -5422,7 +5855,7 @@ msgstr "Número máximo de mensagens recentes mostradas" #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." -msgstr "Número máximo de objetos estaticamente armazenados em um bloco." +msgstr "Número máximo de objetos estaticamente armazenados num bloco." #: src/settings_translation_file.cpp msgid "Maximum objects per block" @@ -5450,22 +5883,28 @@ msgid "" "0 to disable queueing and -1 to make the queue size unlimited." msgstr "" "Tamanho máximo da fila do chat.\n" -"0 para desabilitar a fila e -1 para a tornar ilimitada." +"0 para desativar a fila e -1 para a tornar ilimitada." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Tempo máximo em ms para descarregamento de ficheiro (por exemplo, um " -"ficheiro ZIP de um modificador) pode tomar." +"Tempo máximo em ms para descarregar ficheiros (por exemplo, um mod) pode " +"tomar." + +#: 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 um pedido interativo (ex: busca de lista de servidores) " +"pode levar, em milissegundos." #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "Limite de utilizadores" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Opções para menus" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "Cache de malha" @@ -5484,7 +5923,7 @@ msgstr "Método usado para destacar o objeto selecionado." #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "Nível mínimo de registo a ser impresso no chat." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5499,13 +5938,14 @@ msgid "Minimap scan height" msgstr "Altura de varredura do mini-mapa" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "Ruído 3D que determina o número de masmorras por mapchunk." +msgstr "" +"Limite mínimo da quantidade aleatória de grandes cavernas por mapchunk." #: src/settings_translation_file.cpp msgid "Minimum limit of random number of small caves per mapchunk." msgstr "" +"Limite mínimo da quantidade aleatória de cavernas pequenas por mapchunk." #: src/settings_translation_file.cpp msgid "Minimum texture size" @@ -5515,12 +5955,24 @@ msgstr "Tamanho mínimo da textura" msgid "Mipmapping" msgstr "Mapeamento MIP" +#: src/settings_translation_file.cpp +msgid "Misc" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mod Profiler" +msgstr "Mod Profiler" + +#: src/settings_translation_file.cpp +msgid "Mod Security" +msgstr "Segurança do Mod" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "Canais de mod" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "Modifica o tamanho dos elementos do hudbar." #: src/settings_translation_file.cpp @@ -5531,6 +5983,10 @@ msgstr "Caminho de fonte monoespaçada" msgid "Monospace font size" msgstr "Tamanho da fonte monoespaçada" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Tamanho de letra monoespaçada divisível por" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Parâmetros ruido da altura de montagem do gerador de mundo v7" @@ -5549,11 +6005,11 @@ msgstr "Nível zero da montanha" #: src/settings_translation_file.cpp msgid "Mouse sensitivity" -msgstr "Sensibilidade do mouse" +msgstr "Sensibilidade do rato" #: src/settings_translation_file.cpp msgid "Mouse sensitivity multiplier." -msgstr "Multiplicador de sensibilidade do mouse." +msgstr "Multiplicador de sensibilidade do rato." #: src/settings_translation_file.cpp msgid "Mud noise" @@ -5606,13 +6062,8 @@ msgstr "" "servidores." #: src/settings_translation_file.cpp -#, fuzzy msgid "Near plane" -msgstr "Plano de corte próximo" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Rede" +msgstr "Plano próximo" #: src/settings_translation_file.cpp msgid "" @@ -5622,6 +6073,10 @@ msgstr "" "Porta de rede para receber dados (UDP).\n" "Esse valor será substituído se for definido a partir do menu principal." +#: src/settings_translation_file.cpp +msgid "Networking" +msgstr "Rede" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "Novos jogadores precisam de introduzir esta palavra-passe." @@ -5634,6 +6089,10 @@ msgstr "Atravessar blocos" msgid "Noclip key" msgstr "Tecla Noclip" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "Nó e Entidade em Destaque" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "Destacando cubos" @@ -5646,20 +6105,11 @@ msgstr "Intervalo de NodeTimer" msgid "Noises" msgstr "Ruidos" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Amostragem de normalmaps" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Intensidade de normalmaps" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Número de seguimentos de emersão" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Number of emerge threads to use.\n" "Value 0:\n" @@ -5672,41 +6122,31 @@ 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 "" -"Quantidade de threads emergentes a utilizar.\n" -"AVISO: Atualmente existem vários bugs que podem causar falhas quando\n" -"'num_emerge_threads' é maior que 1. Até que este aviso seja removido, é\n" -"bem recomendado que este valor seja definido ao valor padrão '1'.\n" +"Quantidade de threads de emersão a serem usadas.\n" "Valor 0:\n" -"- Seleção automática. A quantidade de threads emergentes será\n" -"- 'quantidade de processadores - 2', com um limite inferior de 1.\n" +"- Seleção automática. A quantidade de threads de emersão será\n" +"- 'quantidade de processadores - 2', com um limite inferior de 1.\n" "Qualquer outro valor:\n" -"- Especifica a quantidade de threads emergentes, com um limite inferior " -"de 1.\n" -"AVISO: O aumento do quantidade de threads emergentes aumenta a velocidade " -"do\n" -"motor mapgen, mas isso pode prejudicar o desempenho do jogo, interferindo " -"com outros\n" -"processos, especialmente no singleplayer e/ou ao executar código Lua em\n" -"'on_generated'. Para muitos utilizadores, o ajuste ideal pode ser '1'." +"- Especifica a quantidade de threads de emersão, com um limite inferior de " +"1.\n" +"AVISO: Aumentar a quantidade de threads de emersão aumenta a velocidade do " +"motor de\n" +"geração de mapas, mas isso pode prejudicar o desempenho do jogo, a " +"interferir com outros\n" +"processos, especialmente em singleplayer e / ou ao executar código Lua em " +"eventos\n" +"'on_generated'. Para muitos utilizadores, a configuração ideal pode ser '1'." #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" -"Número de blocos extras que pode ser carregados por /clearobjects ao mesmo " -"tempo.\n" -"Esta é uma troca entre sobrecarga de transação do sqlite e consumo de " -"memória (4096 = 100 MB, como uma regra de ouro)." - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Número de iterações de oclusão de paralaxe." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Repositório de conteúdo online" +"Quantidde de blocos adicionais que podem ser carregados por /clearobjects ao " +"mesmo tempo.\n" +"Esta é uma troca entre sobrecarga de transação do sqlite e\n" +"consumo de memória (4096 = 100 MB, como uma regra de ouro)." #: src/settings_translation_file.cpp msgid "Opaque liquids" @@ -5715,12 +6155,7 @@ msgstr "Líquidos Opacos" #: src/settings_translation_file.cpp msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" +msgstr "Opacidade (alpha) das sombras atrás da fonte padrão, entre 0 e 255." #: src/settings_translation_file.cpp msgid "" @@ -5729,50 +6164,30 @@ msgid "" "open." msgstr "" "Abre o menu de pausa quando o foco da janela é perdido.Não pausa se um " -"formspec está aberto." +"formspec está\n" +"aberto." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Enviesamento do efeito de oclusão de paralaxe, normalmente escala/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Escala do efeito de oclusão de paralaxe." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Oclusão de paralaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Enviesamento de oclusão paralaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Iterações de oclusão paralaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Modo de oclusão paralaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Escala de Oclusão de paralaxe" +msgid "Optional override for chat weblink color." +msgstr "Substituição opcional da cor de ligações do bate-papo." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" +"Caminho da fonte de fallback. Deve ser uma fonte TrueType.\n" +"Essa fonte será usada para determinados idiomas ou se a fonte padrão não " +"estiver disponível." #: 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 "" +"Caminho para gravar capturas de ecrã. Pode ser absoluto ou relativo.\n" +"A pasta será criada se já não existe." #: src/settings_translation_file.cpp msgid "" @@ -5790,19 +6205,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" +"Caminho para a fonte padrão. Deve ser uma fonte TrueType.\n" +"A fonte de fallback será usada se a fonte não puder ser carregada." #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" +"Caminho para a fonte monoespaçada. Deve ser uma fonte TrueType.\n" +"Esta fonte é usada para, por exemplo, a tela do console e do profiler." #: src/settings_translation_file.cpp msgid "Pause on lost window focus" @@ -5811,11 +6226,11 @@ msgstr "Pausa quando o foco da janela é perdido" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" msgstr "" +"Limite de blocos na fila de espera de carregamento do disco por jogador" #: src/settings_translation_file.cpp -#, fuzzy msgid "Per-player limit of queued blocks to generate" -msgstr "Limite de filas emerge para gerar" +msgstr "Limite por jogador de blocos enfileirados para gerar" #: src/settings_translation_file.cpp msgid "Physics" @@ -5829,6 +6244,14 @@ msgstr "Tecla de movimento pitch" msgid "Pitch move mode" msgstr "Modo movimento pitch" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Tecla de pôr" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Intervalo de repetição da ação pôr" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5837,10 +6260,6 @@ msgstr "" "O jogador é capaz de voar sem ser afetado pela gravidade.\n" "Isso requer o privilégio \"fly\" no servidor." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Nome do Jogador" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Distância de transferência do jogador" @@ -5849,6 +6268,10 @@ msgstr "Distância de transferência do jogador" msgid "Player versus player" msgstr "Jogador contra jogador" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Filtragem de Poisson" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5862,9 +6285,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 "" -"Evita remoção e colocação de blocos repetidos quando os botoes do mouse são " -"segurados.\n" -"Habilite isto quando você cava ou coloca blocos constantemente por acidente." +"Evita remoção e colocação de blocos repetidos quando os botoes do rato são " +"seguros.\n" +"Ative isto quando cava ou põe blocos constantemente por acidente." #: src/settings_translation_file.cpp msgid "Prevent mods from doing insecure things like running shell commands." @@ -5876,8 +6299,8 @@ msgid "" "Print the engine's profiling data in regular intervals (in seconds).\n" "0 = disable. Useful for developers." msgstr "" -"Intervalo de impressão de dados do analisador (em segundos). 0 = " -"desabilitado. Útil para desenvolvedores." +"Intervalo de impressão de dados do analisador (em segundos).\n" +"0 = desativado. Útil para desenvolvedores." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" @@ -5891,25 +6314,25 @@ msgstr "Analizador" msgid "Profiler toggle key" msgstr "Tecla de alternância do Analizador" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Analizando" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" -msgstr "" +msgstr "Endereço do Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"Endereço do Prometheus\n" +"Se o minetest for compilado com a opção ENABLE_PROMETHEUS ativa,\n" +"ativa a obtenção de métricas do Prometheus neste endereço.\n" +"As métricas podem ser obtidas em http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." -msgstr "" +msgstr "Proporção de cavernas grandes que contém líquido." #: src/settings_translation_file.cpp msgid "" @@ -5937,9 +6360,8 @@ msgid "Recent Chat Messages" msgstr "Mensagens de chat recentes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "Diretório para logs" +msgstr "Caminho da fonte regular" #: src/settings_translation_file.cpp msgid "Remote media" @@ -5980,16 +6402,15 @@ msgid "" msgstr "" "Restringe o acesso de certas funções a nível de cliente em servidores.\n" "Combine os byflags abaixo par restringir recursos de nível de cliente, ou " -"coloque 0 para nenhuma restrição:\n" -"LOAD_CLIENT_MODS: 1 (desabilita o carregamento de mods de cliente)\n" -"CHAT_MESSAGES: 2 (desabilita a chamada send_chat_message no lado do " -"cliente)\n" -"READ_ITEMDEFS: 4 (desabilita a chamada get_item_def no lado do cliente)\n" -"READ_NODEDEFS: 8 (desabilita a chamada get_node_def no lado do cliente)\n" -"LOOKUP_NODES_LIMIT: 16 (limita a chamada get_node no lado do cliente para " +"coloque 0\n" +"para nenhuma restrição:\n" +"LOAD_CLIENT_MODS: 1 (desativa o carregamento de mods de cliente)\n" +"CHAT_MESSAGES: 2 (desativa a chamada send_chat_message no lado do cliente)\n" +"READ_ITEMDEFS: 4 (desativa a chamada get_item_def no lado do cliente)\n" +"READ_NODEDEFS: 8 (desativa a chamada get_node_def no lado do cliente)\n" +"LOOKUP_NODES_LIMIT: 16 (limita a chamada get_node no lado do cliente para\n" "csm_restriction_noderange)\n" -"READ_PLAYERINFO: 32 (desabilita a chamada get_player_names no lado do " -"cliente)" +"READ_PLAYERINFO: 32 (desativa a chamada get_player_names no lado do cliente)" #: src/settings_translation_file.cpp msgid "Ridge mountain spread noise" @@ -6011,10 +6432,6 @@ msgstr "Ruído do tamanho de montanhas acidentadas" msgid "Right key" msgstr "Tecla para a direita" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Intervalo de repetição do clique direito" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Profundidade do canal do rio" @@ -6089,6 +6506,11 @@ msgstr "" "quando a escala é reduzida, ao custo de borrar alguns pixels da borda \n" "quando as imagens são dimensionadas em tamanhos não inteiros." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Ecrã" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Altura do ecrã" @@ -6119,6 +6541,11 @@ msgstr "" "1 significa pior qualidade; 100 significa melhor qualidade.\n" "Use 0 para qualidade padrão." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Captura de ecrã" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "Ruído para cavernas #1" @@ -6132,10 +6559,6 @@ msgstr "" msgid "Second of two 3D noises that together define tunnels." msgstr "Segundo de 2 ruídos 3D que juntos definem tunéis." -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "Segurança" - #: src/settings_translation_file.cpp msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Consulte http://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6185,7 +6608,7 @@ msgstr "" "7 = Conjunto de mandelbrot \"Variation\" 4D.\n" "8 = Conjunto de julia \"Variation\" 4D.\n" "9 = Conjunto de mandelbrot \"Mandelbrot/Mandelbar\" 3D.\n" -"10 = Conjunto de julia \"Mandelbrot/Mandelbar\" 3D.\n" +"10 = Conjunto de julia \"Mandelbrot/Mandelbar\" 3D.\n" "11 = Conjunto de mandelbrot \"Árvore de natal\" 3D.\n" "12 = Conjunto de julia \"Árvore de natal\" 3D..\n" "13 = Conjunto de mandelbrot \"Bulbo de Mandelbrot\" 3D.\n" @@ -6196,8 +6619,16 @@ msgstr "" "18 = Conjunto de julia \"Bulbo de Mandelbrot\" 4D." #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Servidor / Um jogador" +msgid "Server" +msgstr "Servidor" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "Jogabilidade do servidor" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "Segurança do Servidor" #: src/settings_translation_file.cpp msgid "Server URL" @@ -6223,10 +6654,18 @@ msgstr "Porta do servidor" msgid "Server side occlusion culling" msgstr "Separação de oclusão no lado do servidor" +#: src/settings_translation_file.cpp +msgid "Server/Env Performance" +msgstr "Desempenho do Servidor/Env" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL da lista de servidores" +#: src/settings_translation_file.cpp +msgid "Serverlist and MOTD" +msgstr "Lista de servidores e MOTD" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Ficheiro da lista de servidores" @@ -6240,37 +6679,87 @@ msgstr "" "Apos mudar isso uma reinicialização é necessária." #: 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 "" -"Configura o tamanho máximo de caracteres de uma mensagem enviada por " -"clientes." +"Defina o comprimento máximo de uma mensagem de chat (em caracteres) enviada " +"por clientes." #: src/settings_translation_file.cpp #, fuzzy msgid "" +"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 "" +"Coloque a força da sombra gama.\n" +"Ajusta a intensidade das sombras dinâmicas no jogo.\n" +"Valor mais baixo significa sombras mais claras, maior valor significa " +"sombras mais escuras." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"Defina o tamanho do raio de sombras suaves.\n" +"Valores mais baixos significam sombras mais nítidas e valores altos sombras " +"suaves.\n" +"Valor mínimo 1.0 e valor máximo 10.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Defina a inclinação da órbita do Sol/Lua em graus\n" +"Valor 0 significa sem inclinação/ órbita vertical.\n" +"Valor mínimo de 0.0 e máximo de 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Defina para true para ativar o Mapeamento de Sombras.\n" +"Requer sombreadores para ser ativado." + +#: src/settings_translation_file.cpp +msgid "" "Set to true to enable waving leaves.\n" "Requires shaders to be enabled." msgstr "" -"Com o valor TRUE, folhas ondulantes são ativadas.\n" -"Necessita de shaders para estar ativo." +"Definido como true ativa o balanço das folhas.\n" +"Requer que os sombreadores estejam ativados." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"Definido como true permite ondulação da água.\n" -"Requer sombreadores seres ativados." +"Definido como true permite ondulação de líquidos (como a água).\n" +"Requer que os sombreadores estejam ativados." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving plants.\n" "Requires shaders to be enabled." msgstr "" "Definido como true permite balanço de plantas.\n" -"Requer sombreadores serem ativados." +"Requer que os sombreadores estejam ativados." + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Define a qualidade da textura das sombras para 32 bits.\n" +"Quando false, a textura de 16 bits será usada\n" +"Isso pode fazer com que muito mais coisas aparecam nas sombras." #: src/settings_translation_file.cpp msgid "Shader path" @@ -6284,22 +6773,37 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" "Sombreadores permitem efeitos visuais avançados e podem aumentar a " -"performance em algumas placas de vídeo.\n" +"performance em algumas placas de\n" +"vídeo.\n" "Só funcionam com o modo de vídeo OpenGL." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Shadow filter quality" +msgstr "Qualidade do filtro de sombras" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Distância do mapa de sombras em nodes para renderizar sombras" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "Textura do mapa de sombras em 32 bits" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Tamanho 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 "Fonte de compensador de sombra, se 0 então sombra não será desenhada." +msgstr "" +"Distância (em pixels) da sombra da fonte padrão. Se 0, então a sombra não " +"será desenhada." #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Fonte de compensador de sombra, se 0 então sombra não será desenhada." +msgid "Shadow strength gamma" +msgstr "Força da sombra gamma" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6313,6 +6817,18 @@ msgstr "Mostrar informação de depuração" msgid "Show entity selection boxes" msgstr "Mostrar as caixas de seleção entidades" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Mostrar caixas de seleção de entidades\n" +"É necessário reiniciar após alterar isso." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Mostrar plano de fundo da nametag por padrão" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Mensagem de desligamento" @@ -6327,10 +6843,11 @@ msgid "" "recommended." msgstr "" "Tamanho dos mapchunks gerados pelo gerador de mapa, em mapblocks(16 nós).\n" -"ALERTA!: Não há benefício e existem diversos perigos em aumentar este valor " -"acima de 5.\n" +"ALERTA!: Não há benefício e existem diversos perigos em\n" +"aumentar este valor acima de 5.\n" "Reduzir este valor aumenta a densidade de dungeons e cavernas.\n" -"Alterar este valor é para uso especial, é recomendado deixar inalterado." +"Alterar este valor é para uso especial, é recomendado deixar\n" +"inalterado." #: src/settings_translation_file.cpp msgid "" @@ -6339,8 +6856,14 @@ msgid "" "thread, thus reducing jitter." msgstr "" "Tamanho da memória cache do MapBlock do gerador de malha. Aumentar isso " -"aumentará o percentual de hit do cache, reduzindo os dados sendo copiados do " -"encadeamento principal, reduzindo assim o jitter." +"aumentará\n" +"o percentual de hit do cache %, a reduzir os dados que são copiados do " +"encadeamento principal,\n" +"e assim reduz o jitter." + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Inclinação Da Órbita Do Céu" #: src/settings_translation_file.cpp msgid "Slice w" @@ -6352,11 +6875,11 @@ msgstr "Inclinação e preenchimento trabalham juntos para modificar as alturas. #: src/settings_translation_file.cpp msgid "Small cave maximum number" -msgstr "" +msgstr "Quantidade máxima de cavernas pequenas" #: src/settings_translation_file.cpp msgid "Small cave minimum number" -msgstr "" +msgstr "Quantidade mínima de cavernas pequenas" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." @@ -6377,17 +6900,17 @@ msgid "" "Smooths camera when looking around. Also called look or mouse smoothing.\n" "Useful for recording videos." msgstr "" -"Suaviza o movimento da câmera quando olhando ao redor. Também chamado de " -"olhar ou suavização do mouse.\n" +"Suaviza o movimento da câmara quando olhando ao redor. Também chamado de " +"olhar ou suavização 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 "Suaviza a rotação da câmera no modo cinemático. 0 para desativar." +msgstr "Suaviza a rotação da câmara no modo cinemático. 0 para desativar." #: src/settings_translation_file.cpp msgid "Smooths rotation of camera. 0 to disable." -msgstr "Suaviza a rotação da câmera. 0 para desativar." +msgstr "Suaviza a rotação da câmara. 0 para desativar." #: src/settings_translation_file.cpp msgid "Sneak key" @@ -6401,18 +6924,14 @@ msgstr "Velocidade da furtividade" msgid "Sneaking speed, in nodes per second." msgstr "Velocidade furtiva, em nós por segundo." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Raio das sombras suaves" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Som" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Tecla especial" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Tecla especial pra escalar/descer" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6422,9 +6941,9 @@ msgid "" msgstr "" "Especifica a URL no qual os clientes buscam a mídia ao em vez de usar o " "UDP.\n" -"$filename deve ser acessível a partir de $remote_media$filename via cURL \n" +"$filename deve ser acessível de $remote_media$filename via cURL \n" "(obviamente, remote_media deve terminar com uma barra \"/\").\n" -"Arquivos que não estão presentes serão obtidos da maneira usual por UDP." +"Ficheiros que não estão presentes serão obtidos da maneira usual por UDP." #: src/settings_translation_file.cpp msgid "" @@ -6432,16 +6951,27 @@ msgid "" "Note that mods or games may explicitly set a stack for certain (or all) " "items." msgstr "" +"Especifica o tamanho padrão da pilha de nós, items e ferramentas.\n" +"Note que mods e games talvez definam explicitamente um tamanho para certos " +"(ou todos) os itens." + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Spread of light curve boost range.\n" "Controls the width of the range to be boosted.\n" "Standard deviation of the light curve boost Gaussian." msgstr "" -"Extensão do aumento médio da curva da luz.\n" -"Desvio padrão do aumento médio gaussiano." +"Ampliação da faixa de aumento da curva de luz.\n" +"Controla a largura do intervalo a ser aumentado.\n" +"O desvio padrão da gaussiana do aumento da curva de luz." #: src/settings_translation_file.cpp msgid "Static spawnpoint" @@ -6460,13 +6990,8 @@ msgid "Step mountain spread noise" msgstr "Extensão do ruído da montanha de passo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." -msgstr "Intensidade de paralaxe." - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Intensidade de normalmaps gerados." +msgstr "Força da paralaxe do modo 3D." #: src/settings_translation_file.cpp msgid "" @@ -6474,6 +6999,9 @@ msgid "" "The 3 'boost' parameters define a range of the light\n" "curve that is boosted in brightness." msgstr "" +"Aumento da força da curva de luz.\n" +"Os 3 parâmetros de 'aumento' definem uma faixa\n" +"da curva de luz que é aumentada em brilho." #: src/settings_translation_file.cpp msgid "Strict protocol checking" @@ -6496,6 +7024,20 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"Nível de superfície de água opcional posta numa camada sólida de flutuação.\n" +"A água está desativada por padrão e só será posta se este valor for " +"definido\n" +"acima de 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (o início do\n" +"afilamento superior).\n" +"*** AVISO, POTENCIAL PERIGO PARA OS MUNDOS E DESEMPENHO DO SERVIDOR ***:\n" +"Ao ativar a colocação de água, as áreas flutuantes devem ser configuradas e " +"testadas\n" +"para ser uma camada sólida, a definir 'mgv7_floatland_density' para 2.0 (ou " +"outro\n" +"valor necessário a depender de 'mgv7_np_floatland'), para evitar\n" +"fluxo de água extremo intensivo do servidor e para evitar grandes inundações " +"do\n" +"superfície do mundo abaixo." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6505,6 +7047,10 @@ msgstr "SQLite síncrono" msgid "Temperature variation for biomes." msgstr "Variação de temperatura para biomas." +#: src/settings_translation_file.cpp +msgid "Temporary Settings" +msgstr "Configurações Temporárias" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "Ruído alternativo do terreno" @@ -6553,6 +7099,16 @@ msgstr "Ruído de persistência do terreno" msgid "Texture path" msgstr "Caminho para a pasta de texturas" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Tamanho da textura em que o mapa de sombras será renderizado em.\n" +"Deve ser um múltiplo de dois.\n" +"Números maiores criam sombras melhores mas também esvazia a conta do banco." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6562,24 +7118,28 @@ msgid "" "this option allows enforcing it for certain node types. Note though that\n" "that is considered EXPERIMENTAL and may not work properly." msgstr "" -"Texturas em um nó podem ser alinhadas ao próprio nó ou ao mundo.\n" -"O modo antigo serve melhor para coisas como maquinas, móveis, etc, enquanto " +"Texturas num nó podem ser alinhadas ao próprio nó ou ao mundo.\n" +"O modo antigo serve melhor para coisas como maquinas, móveis, etc, enquanto\n" "o novo faz com que escadas e microblocos encaixem melhor a sua volta.\n" "Entretanto, como essa é uma possibilidade nova, não deve ser usada em " -"servidores antigos, essa opção pode ser forçada para certos tipos de nós. " -"Note que esta opção é considerada EXPERIMENTAL e pode não funcionar " -"adequadamente." +"servidores antigos,\n" +"essa opção pode ser forçada para certos tipos de nós. Note que esta\n" +"opção é considerada EXPERIMENTAL e pode não funcionar adequadamente." #: src/settings_translation_file.cpp msgid "The URL for the content repository" msgstr "A url para o repositório de conteúdo" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +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 padrão no qual as analises estão sendo salvas,\n" +"O formato padrão no qual as análises estão a ser gravadas,\n" "Quando chamado `/profiler save [formato]` sem formato." #: src/settings_translation_file.cpp @@ -6600,7 +7160,7 @@ msgstr "O identificador do joystick para usar" #: src/settings_translation_file.cpp msgid "The length in pixels it takes for touch screen interaction to start." msgstr "" -"A largura em pixels necessária para interação de tela de toque começar." +"A largura em pixels necessária para a interação de ecrã de toque começar." #: src/settings_translation_file.cpp msgid "" @@ -6610,6 +7170,11 @@ msgid "" "Default is 1.0 (1/2 node).\n" "Requires waving liquids to be enabled." msgstr "" +"A altura máxima da superfície de líquidos com ondas.\n" +"4.0 = Altura da onda é dois nós.\n" +"0.0 = Onda nem se move.\n" +"O padrão é 1.0 (meio nó).\n" +"Requer ondas em líquidos ativada." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6625,7 +7190,6 @@ msgstr "" "servidor e dos modificadores." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The radius of the volume of blocks around every player that is subject to " "the\n" @@ -6635,32 +7199,34 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" -"O raio do volume de blocos em volta de cada jogador que é sujeito a coisas " -"de bloco ativo, em mapblocks (16 nós).\n" -"Em blocos ativos, objetos são carregados e ABMs executam.\n" -"Isto é também o alcançe mínimo em que objetos ativos(mobs) são mantidos.\n" -"Isto deve ser configurado junto com o alcance_objeto_ativo." +"O raio do volume dos blocos em torno de cada jogador que está sujeito ao\n" +"material de bloco ativo, declarado em mapblocks (16 nós).\n" +"Nos blocos ativos, os objetos são carregados e os ABMs executados.\n" +"Este também é o intervalo mínimo no qual os objetos ativos (mobs) são " +"mantidos.\n" +"Isso deve ser configurado junto com active_object_send_range_blocks." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Renderizador de fundo para o irrlight.\n" -"Uma reinicialização é necessária após alterar isso.\n" -"Note: no android, use o OGLES1 caso em dúvida! O aplicativo pode falhar ao " -"abrir em outro caso.\n" -"Em outras plataformas, OpenGL é recomendo, e é o único driver com suporte a " -"sombreamento atualmente." +"O back-end de renderização.\n" +"É necessário reiniciar após alterar isso.\n" +"Nota: No Android, use OGLES1 se não tiver certeza! A app pode falhar ao " +"iniciar de outra forma.\n" +"Em outras plataformas, OpenGL é recomendado.\n" +"Shaders são suportados por OpenGL (somente desktop) e OGLES2 (experimental)" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "A sensibilidade dos eixos do joystick para movimentar o \n" "frustum de exibição no jogo." @@ -6690,6 +7256,12 @@ msgstr "" "pelo despejo \n" "de antigas filas de itens. Um valor 0 desativa a funcionalidade." +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6700,12 +7272,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"O tempo em segundos entre repetidos cliques direitos ao segurar o botão " -"direito do mouse." +"O tempo em segundos que leva entre as colocações de nó repetidas ao segurar\n" +"o botão de pôr." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6717,9 +7288,9 @@ msgid "" "enabled. Also the vertical distance over which humidity drops by 10 if\n" "'altitude_dry' is enabled." msgstr "" -"A distancia vertical onde o calor cai por 20 caso 'altitude_chill' esteja " -"habilitado. Também é a distancia vertical onde a umidade cai por 10 se " -"'altitude_dry' estiver habilitado." +"A distância vertical onde o calor cai por 20 caso 'altitude_chill' esteja \n" +"ativado. Também é a distância vertical onde a humidade cai por 10 se \n" +"'altitude_dry' estiver ativado." #: src/settings_translation_file.cpp msgid "Third of 4 2D noises that together define hill/mountain range height." @@ -6747,10 +7318,10 @@ msgid "Time speed" msgstr "Velocidade de tempo" #: 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 "" -"Tempo de espera para o cliente remover dados de mapa não utilizados da " -"memória." +"Tempo limite para o cliente remover dados de mapa não utilizados da memória, " +"em segundos." #: src/settings_translation_file.cpp msgid "" @@ -6765,7 +7336,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Toggle camera mode key" -msgstr "Tecla de alternância do modo de câmera" +msgstr "Tecla de alternância do modo de câmara" #: src/settings_translation_file.cpp msgid "Tooltip delay" @@ -6773,7 +7344,19 @@ msgstr "Atraso de dica de ferramenta" #: src/settings_translation_file.cpp msgid "Touch screen threshold" -msgstr "Limiar a tela de toque" +msgstr "Limiar o ecrã de toque" + +#: src/settings_translation_file.cpp +msgid "Touchscreen" +msgstr "Tela sensível ao toque" + +#: 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" @@ -6784,7 +7367,6 @@ msgid "Trilinear filtering" msgstr "Filtro tri-linear" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" @@ -6792,7 +7374,7 @@ msgid "" msgstr "" "True = 256\n" "False = 128\n" -"Útil para fazer o mini-mapa mais fluido em computadores mais lentos." +"Útil para suavizar o minimapa em máquinas mais lentas." #: src/settings_translation_file.cpp msgid "Trusted mods" @@ -6834,9 +7416,8 @@ msgid "Upper Y limit of dungeons." msgstr "Limite topo Y de dungeons." #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "Limite topo Y de dungeons." +msgstr "Limite máximo Y para as ilhas flutuantes." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6856,19 +7437,44 @@ msgstr "Usar filtragem bilinear ao dimensionamento de texturas." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" "Usar mip mapping para escalar texturas. Pode aumentar a performance " -"levemente, especialmente quando usando um pacote de texturas em alta " -"resolução.\n" +"levemente,\n" +"especialmente quando usando um pacote de texturas em alta resolução.\n" "O downscaling correto de gama não é suportado." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Use o anti-serrilhamento de várias amostras (MSAA) para suavizar as bordas " +"do bloco.\n" +"Este algoritmo suaviza a janela de visualização 3D enquanto mantém a imagem " +"nítida,\n" +"mas não afeta o interior das texturas\n" +"(que é especialmente perceptível com texturas transparentes).\n" +"Espaços visíveis aparecem entre os nós quando os sombreadores são " +"desativados.\n" +"Se definido como 0, MSAA é desativado.\n" +"É necessário reiniciar após alterar esta opção." + #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." msgstr "Use a filtragem trilinear ao dimensionamento de texturas." +#: src/settings_translation_file.cpp +msgid "User Interfaces" +msgstr "" + #: src/settings_translation_file.cpp msgid "VBO" msgstr "VBO" @@ -6936,7 +7542,7 @@ msgstr "Velocidade de subida vertical, em nós por segundo." #: src/settings_translation_file.cpp msgid "Vertical screen synchronization." -msgstr "Sincronização vertical da tela." +msgstr "Sincronização vertical do ecrã." #: src/settings_translation_file.cpp msgid "Video driver" @@ -6967,21 +7573,20 @@ msgid "Viewing range" msgstr "Intervalo de visualização" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Joystick virtual ativa botão auxiliar" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Joystick virtual ativa botão especial" #: src/settings_translation_file.cpp msgid "Volume" msgstr "Volume do som" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" -"Ativa mapeamento de oclusão de paralaxe.\n" -"Requer sombreadores ativados." +"Volume de todos os sons.\n" +"Requer que o sistema de som esteja ativado." #: src/settings_translation_file.cpp msgid "" @@ -6993,6 +7598,7 @@ msgid "" msgstr "" "Coordenada W da fatia 3D gerada de um fractal 4D.\n" "Determina qual fatia 3D da forma 4D é gerada.\n" +"Altera a forma do fractal.\n" "Não tem efeito sobre fractais 3D.\n" "Varia aproximadamente de -2 a 2." @@ -7026,29 +7632,30 @@ msgid "Waving leaves" msgstr "Folhas ondulantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" msgstr "Líquidos ondulantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "Altura da onda de água ondulante" +msgstr "Altura da onda nos líquidos ondulantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" -msgstr "Velocidade da onda de água ondulante" +msgstr "Velocidade de balanço da água" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" -msgstr "Comprimento de onda da água de ondulação" +msgstr "Comprimento de balanço da água" #: src/settings_translation_file.cpp msgid "Waving plants" msgstr "Balançar das Plantas" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Cor da caixa de seleção" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7077,9 +7684,8 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7090,21 +7696,17 @@ msgstr "" "de nearest-neighbor para preservar os pixels nítidos. Isto define o tamanho\n" "mínimo da textura para as texturas melhoradas; valores mais altos parecem\n" "mais nítidos, mas requerem mais memória. Potências de 2 são recomendadas.\n" -"Essa configuração superior a 1 pode não ter um efeito visível, a menos que " -"a \n" +"Essa configuração superior a 1 pode não ter um efeito visível, a menos que a " +"\n" "filtragem bilineares/trilinear/anisotrópica estejam habilitadas.\n" -"Isso também é usado como tamanho base da textura para autoescalamento de " +"Isso também é usado como tamanho base da textura para auto-escalamento de " "texturas." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Se forem utilizadas fontes freetype, requer suporte a freetype para ser " -"compilado." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7146,6 +7748,19 @@ msgid "" "In-game, you can toggle the mute state with the mute key or by using the\n" "pause menu." msgstr "" +"Quando mutar os sons. Pode mutar os sons a qualquer hora, a não ser\n" +"que o sistema de som esteja desativado (enable_sound=false).\n" +"No jogo, pode ativar o estado de mutado com o botão de mutar\n" +"ou a usar o menu 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 "" @@ -7155,8 +7770,9 @@ msgstr "" "premir F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Largura da janela inicial." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Componente de tamanho da janela inicial. Ignorado em modo de ecrã cheio." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7193,11 +7809,12 @@ msgid "" "See also texture_min_size.\n" "Warning: This option is EXPERIMENTAL!" msgstr "" -"Texturas alinhadas ao mundo podem ser escaladas em vários nós. Entretando, o " -"servidor pode não enviar a escala desejada, especialmente se você usa um " -"pacote de textura especialmente projetado; com está opção, o cliente tenta " -"determinar a escala automaticamente baseado no tamanho da textura. Veja " -"também texture_min_size.\n" +"Texturas alinhadas ao mundo podem ser escaladas em vários nós. Entretanto,\n" +"o servidor pode não enviar a escala desejada, especialmente se você usa\n" +"um pacote de textura especialmente projetado; com está opção, o cliente " +"tenta\n" +"determinar a escala automaticamente baseado no tamanho da textura.\n" +"Veja também texture_min_size.\n" "Alerta: Esta opção é EXPERIMENTAL!" #: src/settings_translation_file.cpp @@ -7218,7 +7835,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Y of upper limit of large caves." -msgstr "Limite Y máximo de grandes cavernas." +msgstr "Limite Y máximo de grandes cavernas." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." @@ -7232,6 +7849,12 @@ 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 "" +"Distância de Y sobre a qual as ilhas flutuantes diminuem de densidade total " +"para nenhuma densidade.\n" +"O afunilamento começa nesta distância do limite Y.\n" +"Para uma ilha flutuante sólida, isso controla a altura das colinas / " +"montanhas.\n" +"Deve ser menor ou igual a metade da distância entre os limites Y." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." @@ -7253,132 +7876,37 @@ msgstr "Nível Y de terreno inferior e solo oceânico." msgid "Y-level of seabed." msgstr "Nível Y do fundo do mar." +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "Tempo limite de descarregamento de ficheiro via cURL" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "tempo limite interativo cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "limite paralelo de cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Tempo limite de cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "Modo Criativo: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Ativar/Desativar câmera cinemática" - -#~ msgid "Select Package File:" -#~ msgstr "Selecionar o ficheiro do pacote:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Limite Y máximo de lava em grandes cavernas." - -#~ msgid "Waving Water" -#~ msgstr "Água ondulante" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Se dungeons ocasionalmente se projetam do terreno." - -#~ msgid "Projecting dungeons" -#~ msgstr "Projetando dungeons" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Nível Y para o qual as sombras de ilhas flutuantes se estendem." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "" -#~ "Nível em Y do ponto médio da montanha flutuante e da superfície do lago." - -#~ msgid "Waving water" -#~ msgstr "Balançar das Ondas" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variação da altura da colina e profundidade do lago no terreno liso da " -#~ "Terra Flutuante." +#~ msgid "- Damage: " +#~ msgstr "-Dano: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Altura máxima típica, acima e abaixo do ponto médio, do terreno da " -#~ "montanha flutuante." +#~ "0 = oclusão paralaxe com dados de inclinação (mais rápido).\n" +#~ "1 = mapeamento de relevo (mais lento, mais preciso)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Esta fonte será usada para determinados idiomas." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Força do aumento médio da curva de luz." - -#~ msgid "Shadow limit" -#~ msgstr "Limite de mapblock" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Caminho para TrueTypeFont ou bitmap." - -#~ msgid "Lightness sharpness" -#~ msgstr "Nitidez da iluminação" - -#~ msgid "Lava depth" -#~ msgstr "Profundidade da lava" - -#~ msgid "IPv6 support." -#~ msgstr "Suporte IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gama" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Opacidade da sombra da fonte (entre 0 e 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Altura da terra flutuante montanhosa" - -#~ msgid "Floatland base height noise" -#~ msgstr "Altura base de ruído de terra flutuante" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Ativa mapeamento de tons fílmico" - -#~ msgid "Enable VBO" -#~ msgstr "Ativar VBO" - -#~ msgid "" -#~ "Deprecated, define and locate cave liquids using biome definitions " -#~ "instead.\n" -#~ "Y of upper limit of lava in large caves." -#~ msgstr "" -#~ "Depreciar, definir e localizar líquidos de cavernas usando definições de " -#~ "biomas.\n" -#~ "Y do limite superior de lava em grandes cavernas." - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Define áreas de terra flutuante em terreno suavizado.\n" -#~ "Terrenos suavizados ocorrem quando o ruído é menor que zero." - -#~ msgid "Darkness sharpness" -#~ msgstr "Nitidez da escuridão" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "Controla a largura dos túneis, um valor menor cria túneis maiores." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Controla a densidade do terreno montanhoso nas ilhas flutuantes.\n" -#~ "É um parâmetro adicionado ao valor de ruído 'mgv7_np_mountain'." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Centro do aumento da curva de luz." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Altera como terras flutuantes montanhosas afunilam acima e abaixo do " -#~ "ponto médio." +#~ msgid "Address / Port" +#~ msgstr "Endereço / Porta" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7389,20 +7917,449 @@ msgstr "Tempo limite de cURL" #~ "elevados são mais brilhantes.\n" #~ "Esta configuração é somente para o cliente e é ignorada pelo servidor." -#~ msgid "Path to save screenshots at." -#~ msgstr "Caminho para onde salvar screenshots." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Altera como terras flutuantes montanhosas afunilam acima e abaixo do " +#~ "ponto médio." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Força da oclusão paralaxe" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Limite de filas emerge no disco" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Descarregando e instalando $1, por favor aguarde..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Tem a certeza que deseja reiniciar o seu mundo?" #~ msgid "Back" #~ msgstr "Voltar" +#~ msgid "Basic" +#~ msgstr "Básico" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Bits por pixel (profundidade de cor) no modo de ecrã inteiro." + +#~ msgid "Bump Mapping" +#~ msgstr "Bump mapping" + +#~ msgid "Bumpmapping" +#~ msgstr "Bump mapping" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Centro do aumento da curva de luz." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Mudanças para a interface do menu principal:\n" +#~ "- Total: Múltiplos mundos de um jogador, escolha de jogo, escolha de " +#~ "pacote de texturas, etc.\n" +#~ "- Simples: Um mundo de um jogador, sem escolha de jogo ou pacote de " +#~ "texturas. Pode ser \n" +#~ "necessário para ecrãs menores." + +#~ msgid "Config mods" +#~ msgstr "Configurar mods" + +#~ msgid "Configure" +#~ msgstr "Configurar" + +#~ msgid "Connect" +#~ msgstr "Ligar" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Controla a velocidade de afundamento em líquido." + +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Controla a densidade do terreno montanhoso nas ilhas flutuantes.\n" +#~ "É um parâmetro adicionado ao valor de ruído 'mgv7_np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "Controla a largura dos túneis, um valor menor cria túneis maiores." + +#~ msgid "Credits" +#~ msgstr "Méritos" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Cor do cursor (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Dano ativado" + +#~ msgid "Darkness sharpness" +#~ msgstr "Nitidez da escuridão" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Tempo limite por defeito para cURL, em milissegundos.\n" +#~ "Só tem efeito se compilado com cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Define áreas de terra flutuante em terreno suavizado.\n" +#~ "Terrenos suavizados ocorrem quando o ruído é menor que zero." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Define nível de amostragem de textura.\n" +#~ "Um valor mais alto resulta em mapas normais mais suaves." + +#~ msgid "Del. Favorite" +#~ msgstr "Rem. Favorito" + +#~ msgid "" +#~ "Deprecated, define and locate cave liquids using biome definitions " +#~ "instead.\n" +#~ "Y of upper limit of lava in large caves." +#~ msgstr "" +#~ "Depreciar, definir e localizar líquidos de cavernas usando definições de " +#~ "biomas.\n" +#~ "Y do limite superior de lava em grandes cavernas." + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Baixe um jogo, como Minetest Game, do site minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Descarregue um do site minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Descarregando e instalando $1, por favor aguarde..." + +#~ msgid "Enable VBO" +#~ msgstr "Ativar VBO" + +#~ msgid "Enable register confirmation" +#~ msgstr "Ativar registo de confirmação" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Ativa o bumpmapping para texturas. Mapas normais devem ser fornecidos " +#~ "pelo pack de\n" +#~ "texturas ou gerado automaticamente.\n" +#~ "Requer que as sombras sejam ativadas." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Ativa mapeamento de tons fílmico" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Ativa geração de normalmap (efeito de relevo) ao voar.\n" +#~ "Requer texturização bump mapping para ser ativado." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Ativa mapeamento de oclusão de paralaxe.\n" +#~ "Requer sombreadores ativados." + +#~ msgid "Enter " +#~ msgstr "Enter " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Opção experimental, pode causar espaços visíveis entre blocos\n" +#~ "quando definido com num úmero superior a 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS em menu de pausa" + +#~ msgid "Fallback font shadow" +#~ msgstr "Sombra da fonte alternativa" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Canal de opacidade sombra da fonte alternativa" + +#~ msgid "Fallback font size" +#~ msgstr "Tamanho da fonte alternativa" + +#~ msgid "Filtering" +#~ msgstr "Filtros" + +#~ msgid "Floatland base height noise" +#~ msgstr "Altura base de ruído de terra flutuante" + +#~ msgid "Floatland mountain height" +#~ msgstr "Altura da terra flutuante montanhosa" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Opacidade da sombra da fonte (entre 0 e 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Tamanho da fonte reserva em pontos (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Fontes Freetype" + +#~ msgid "Full screen BPP" +#~ msgstr "BPP em ecrã inteiro" + +#~ msgid "Game" +#~ msgstr "Jogo" + +#~ msgid "Gamma" +#~ msgstr "Gama" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Gerar Normal maps" + +#~ msgid "Generate normalmaps" +#~ msgstr "Gerar mapa de normais" + +#~ msgid "HUD scale factor" +#~ msgstr "Fator de escalonamento do painel de interface" + +#~ msgid "High-precision FPU" +#~ msgstr "FPU de alta precisão" + +#~ msgid "IPv6 support." +#~ msgstr "Suporte IPv6." + +#~ msgid "In-Game" +#~ msgstr "No jogo" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Instalar: ficheiro: \"$1\"" + +#~ msgid "Instrumentation" +#~ msgstr "Monitorização" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Teclas. (Se este menu se estragar, remova as linhas do minetest.conf)" + +#~ msgid "Lava depth" +#~ msgstr "Profundidade da lava" + +#~ msgid "Lightness sharpness" +#~ msgstr "Nitidez da iluminação" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Limite de filas emerge no disco" + +#~ msgid "Main" +#~ msgstr "Principal" + +#~ msgid "Main menu style" +#~ msgstr "Estilo do menu principal" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "Faz o DirectX trabalhar com LuaJIT. Desative se causa problemas." + +#~ msgid "Menus" +#~ msgstr "Opções para menus" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Minimapa em modo radar, zoom 2x" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minimapa em modo radar, zoom 4x" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minimapa em modo de superfície, zoom 2x" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minimapa em modo de superfície, zoom 4x" + +#~ msgid "Name / Password" +#~ msgstr "Nome / Palavra-passe" + +#~ msgid "Name/Password" +#~ msgstr "Nome/palavra-passe" + +#~ msgid "No" +#~ msgstr "Não" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Amostragem de normalmaps" + +#~ msgid "Normalmaps strength" +#~ msgstr "Intensidade de normalmaps" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Número de iterações de oclusão de paralaxe." + #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Opacidade (alpha) da sombra atrás da fonte alternativa, entre 0 e 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "" +#~ "Enviesamento do efeito de oclusão de paralaxe, normalmente escala/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Escala do efeito de oclusão de paralaxe." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Oclusão de paralaxe" + +#~ msgid "Parallax occlusion" +#~ msgstr "Oclusão de paralaxe" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Enviesamento de oclusão paralaxe" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Iterações de oclusão paralaxe" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Modo de oclusão paralaxe" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Escala de Oclusão de paralaxe" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Força da oclusão paralaxe" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Caminho para TrueTypeFont ou bitmap." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Caminho para onde salvar screenshots." + +#~ msgid "Player name" +#~ msgstr "Nome do Jogador" + +#~ msgid "Profiling" +#~ msgstr "Analizando" + +#~ msgid "Projecting dungeons" +#~ msgstr "Projetando dungeons" + +#~ msgid "PvP enabled" +#~ msgstr "PvP ativado" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Reiniciar mundo singleplayer" + +#~ msgid "Select Package File:" +#~ msgstr "Selecionar o ficheiro do pacote:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Servidor / Um jogador" + +#~ msgid "Shadow limit" +#~ msgstr "Limite de mapblock" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Distância (em pixels) da sombra da fonte de backup. Se 0, então nenhuma " +#~ "sombra será desenhada." + +#~ msgid "Special" +#~ msgstr "Especial" + +#~ msgid "Special key" +#~ msgstr "Tecla especial" + +#~ msgid "Start Singleplayer" +#~ msgstr "Iniciar Um Jogador" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Intensidade de normalmaps gerados." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Força do aumento médio da curva de luz." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Esta fonte será usada para determinados idiomas." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Para ativar as sombras é necessário usar o controlador OpenGL." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Ativar/Desativar câmera cinemática" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Altura máxima típica, acima e abaixo do ponto médio, do terreno da " +#~ "montanha flutuante." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variação da altura da colina e profundidade do lago no terreno liso da " +#~ "Terra Flutuante." + +#~ msgid "View" +#~ msgstr "Vista" + +#~ msgid "Waving Water" +#~ msgstr "Água ondulante" + +#~ msgid "Waving water" +#~ msgstr "Balançar das Ondas" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Se as fontes FreeType são usadas, requer que suporte FreeType tenha sido " +#~ "compilado.\n" +#~ "Se desativado, fontes de bitmap e de vetores XML são usadas em vez disso." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Se dungeons ocasionalmente se projetam do terreno." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Limite Y máximo de lava em grandes cavernas." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "" +#~ "Nível em Y do ponto médio da montanha flutuante e da superfície do lago." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Nível Y para o qual as sombras de ilhas flutuantes se estendem." + +#~ msgid "Yes" +#~ msgstr "Sim" + +#, 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á prestes a entrar neste servidor com o nome \"%s\" pela primeira " +#~ "vez.\n" +#~ "Se prosseguir, uma nova conta usando suas credenciais será criada neste " +#~ "servidor.\n" +#~ "Por favor, digite novamente a sua palavra-passe e clique em 'Registrar e " +#~ "se cadastrar' para confirmar a criação da conta ou clique em 'Cancelar' " +#~ "para cancelar." + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Você morreu" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/pt_BR/minetest.po b/po/pt_BR/minetest.po index fc31640c4..2b295d37a 100644 --- a/po/pt_BR/minetest.po +++ b/po/pt_BR/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Portuguese (Brazil) (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2019-12-11 13:36+0000\n" -"Last-Translator: ramon.venson <ramon.venson@gmail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-06-12 18:17+0000\n" +"Last-Translator: Igor Vinoski <igor.vinoski2@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "minetest/minetest/pt_BR/>\n" "Language: pt_BR\n" @@ -12,7 +12,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 3.10-dev\n" +"X-Generator: Weblate 4.13-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Limpe a fila de espera do chat" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Comando vazio." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Sair para o menu principal" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Comando inválido: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Comando emitido: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Liste os jogadores online" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Jogadores online: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "A fila de espera do chat agora está vazia." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Este comando está desabilitado pelo servidor." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,9 +58,40 @@ msgstr "Reviver" msgid "You died" msgstr "Você morreu" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Comandos disponíveis:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Comandos disponíveis: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Comando não disponível: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Obtenha ajuda para comandos" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Use '.help <cmd>' para conseguir mais informação, ou '.help all' para listar " +"tudo." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all| <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "Ok" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<Comando não disponível>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -46,9 +113,30 @@ msgstr "Reconectar" msgid "The server has requested a reconnect:" msgstr "O servidor solicitou uma nova conexão:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Carregando..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Selecione 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. " @@ -63,30 +151,37 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "O servidor suporta versões de protocolo entre $1 e $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Tente reabilitar a lista de servidores públicos e verifique sua conexão com " -"a internet." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." -msgstr "Nós apenas suportamos a versão de protocolo $1." +msgstr "Nós só suportamos a versão do protocolo $1." #: builtin/mainmenu/common.lua msgid "We support protocol versions between version $1 and $2." -msgstr "Nós suportamos as versões de protocolo entre $1 e $2 ." +msgstr "Suportamos protocolos com versões entre $1 e $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Cancelar" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Dependências:" @@ -117,7 +212,7 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Encontre Mais Mods" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -132,13 +227,12 @@ msgid "No game description provided." msgstr "Nenhuma descrição de jogo disponível." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "Sem dependências." +msgstr "Sem dependências rígidas" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." -msgstr "Nenhuma descrição de modpack disponível." +msgstr "Nenhuma descrição do modpack fornecida." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" @@ -161,29 +255,67 @@ msgstr "Mundo:" msgid "enabled" msgstr "habilitado" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" já existe. Gostaria de sobrescrevê-lo?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "As dependências $1 e $2 serão instaladas." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 por $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 baixando,\n" +"$2 na fila" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 baixando..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 dependências obrigatórias não puderam ser encontradas." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 será instalado, e $2 dependências serão ignoradas." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Todos os pacotes" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Já instalado" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Voltar ao menu principal" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Jogo Base:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB não está disponível quando Minetest é compilado sem cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Carregando..." +msgstr "Baixando..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" -msgstr "Falhou em baixar $1" +msgstr "Falha ao baixar $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Jogos" @@ -192,22 +324,48 @@ msgid "Install" msgstr "Instalar" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Instalar $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Instalar dependências ausentes" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Instalação: Tipo de arquivo não suportado ou corrompido" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Modulos (Mods)" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" -msgstr "Nenhum pacote pode ser recuperado" +msgstr "Nenhum pacote pôde ser recuperado" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" msgstr "Sem resultados" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Buscar" +msgid "No updates" +msgstr "Sem atualizações" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Não encontrado" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Sobrescrever" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Verifique se o jogo base está correto." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Na fila" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -222,8 +380,12 @@ msgid "Update" msgstr "Atualizar" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Atualizar tudo [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Veja mais informações em um navegador da web" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -231,101 +393,93 @@ msgstr "Já existe um mundo com o nome \"$1\"" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Terreno adicional" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "Frio de altitude" +msgstr "Altitude fria" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Frio de altitude" +msgstr "Altitude seca" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Ruído do bioma" +msgstr "Transição de bioma" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Ruído do bioma" +msgstr "Biomas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Barulho da caverna" +msgstr "Cavernas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Octavos" +msgstr "Cavernas" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Criar" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Monitorização" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Baixe um jogo, como Minetest Game, do site minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Baixe um apartir do site minetest.net" +msgstr "Decorações" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Development Test is meant for developers." +msgstr "Aviso: O jogo Development Test é projetado para desenvolvedores." + +#: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "Y mínimo da dungeon" +msgstr "Masmorras (Dungeons)" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Terreno plano" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floating landmasses in the sky" -msgstr "Densidade da Ilha Flutuante montanhosa" +msgstr "Ilhas flutuantes no céu" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floatlands (experimental)" -msgstr "Nível de água" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Jogo" +msgstr "Ilhas flutuantes (experimental)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Gera terrenos não fractais: Oceanos e subterrâneos" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Colinas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Humid rivers" -msgstr "Driver de vídeo" +msgstr "Rios húmidos" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" +msgstr "Aumenta a umidade perto de rios" + +#: 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 "" +msgstr "Baixa humidade e calor elevado resultam em rios rasos ou secos" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -333,25 +487,23 @@ msgstr "Gerador de mapa" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "Flags do gerador de mundo" +msgstr "Opções do gerador de mapas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Flags específicas do gerador de mundo V5" +msgstr "Parâmetros específicos do gerador de mapas" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mountains" -msgstr "Ruído da montanha" +msgstr "Montanhas" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Fluxo de lama" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Conectar túneis e cavernas" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -359,75 +511,68 @@ msgstr "Nenhum jogo selecionado" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Reduz calor com a altitude" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Reduz humidade com a altitude" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Tamanho do Rio" +msgstr "Rios" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Rios ao nível do mar" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Seed" -msgstr "Seed" +msgstr "Semente (Seed)" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Transição 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 aparecem no terreno (sem efeito em árvores e grama da selva " +"criada pelo v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Estruturas que aparecem no terreno, geralmente árvores 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, Selva" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Temperado, Deserto, Selva, Tundra, Taiga" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Terrain surface erosion" -msgstr "Altura do terreno" +msgstr "Erosão na superfície do terreno" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Árvores e relva da selva" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Vary river depth" -msgstr "Profundidade do Rio" +msgstr "Variar altura dos rios" #: 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 "" -"Aviso: O game \"minimal development test\" apenas serve para desenvolvedores." +msgstr "Cavernas muito grandes nas profundezas do subsolo" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -459,13 +604,46 @@ msgstr "pkgmgr: caminho inválido \"$1\"" msgid "Delete World \"$1\"?" msgstr "Excluir o mundo \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Confirmar a senha" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Missing name" +msgstr "Nome do gerador de mundo" + +#: 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 "Senha" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "As senhas não correspondem!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Registrar e entrar" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Aceitar" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Renomear pacote de módulos:" +msgstr "Renomear Modpack:" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "" @@ -473,7 +651,7 @@ msgid "" "override any renaming here." msgstr "" "Esse modpack possui um nome explícito em seu modpack.conf que vai " -"sobrescrever qualquer renomeio aqui." +"sobrescrever qualquer nome aqui." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" @@ -492,6 +670,16 @@ msgid "Browse" msgstr "Procurar" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Conteúdo" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Conteúdo" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Desabilitado" @@ -516,12 +704,12 @@ msgid "Offset" msgstr "Deslocamento" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Persistência" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." -msgstr "Por favor insira um inteiro válido." +msgstr "Por favor, insira um inteiro válido." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." @@ -529,12 +717,16 @@ msgstr "Por favor, insira um número válido." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" -msgstr "Restaurar para o padrão" +msgstr "Restaurar Padrão" #: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Scale" msgstr "Escala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Buscar" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Selecione o diretório" @@ -543,7 +735,7 @@ msgstr "Selecione o diretório" msgid "Select file" msgstr "Selecione o arquivo" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Mostrar nomes técnicos" @@ -592,7 +784,7 @@ msgstr "valor absoluto" #. for noise settings in main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "defaults" -msgstr "Padrões" +msgstr "padrão" #. ~ "eased" is a noise parameter flag. #. It is used to make the map smoother and @@ -608,34 +800,25 @@ msgstr "$1 (Habilitado)" #: builtin/mainmenu/pkgmgr.lua msgid "$1 mods" -msgstr "$1 módulos" +msgstr "$1 mods" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" -msgstr "Não foi possível instalar $1 para $2" +msgstr "Não foi possível instalar $1 em $2" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "" -"Instalação de módulo: não foi possível encontrar o nome real do módulo: $1" +msgstr "Instalação de mod: não foi possível encontrar o nome real do mod: $1" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -"Instalação do Mod: não foi possível encontrar o nome da pasta adequado para " +"Instalação de mod: não foi possível encontrar o nome da pasta adequado para " "o modpack $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Instalar: Tipo de arquivo \"$1\" não suportado ou corrompido" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Instalar: arquivo: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" -msgstr "Incapaz de encontrar um módulo ou modpack válido" +msgstr "Incapaz de encontrar um mod ou modpack válido" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a $1 as a texture pack" @@ -647,12 +830,67 @@ msgstr "Não foi possível instalar um jogo como um $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" -msgstr "Não foi possível instalar um módulo como um $1" +msgstr "Não foi possível instalar um mod como um $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a modpack as a $1" msgstr "Não foi possível instalar um modpack como um $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Carregando..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "A lista de servidores públicos está desabilitada" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Tente reativar a lista de servidores públicos e verifique sua conexão com a " +"internet." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Sobre" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Colaboradores Ativos" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Renderizador ativo:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Desenvolvedores Principais" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Abrir diretório de dados do usuário" + +#: 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 diretório que contém mundos, jogos, mods fornecidos pelo usuário,\n" +"e pacotes de textura em um gerenciador / navegador de arquivos." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Colaboradores Anteriores" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Desenvolvedores Principais Anteriores" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Share debug log" +msgstr "Mostrar informações de depuração" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Procurar conteúdo online" @@ -663,7 +901,7 @@ msgstr "Conteúdo" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" -msgstr "Desabilitar pacote de texturas" +msgstr "Desabilitar Pacote de Texturas" #: builtin/mainmenu/tab_content.lua msgid "Information:" @@ -671,7 +909,7 @@ msgstr "Informação:" #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" -msgstr "Pacotes instalados:" +msgstr "Pacotes Instalados:" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." @@ -679,7 +917,7 @@ msgstr "Sem dependências." #: builtin/mainmenu/tab_content.lua msgid "No package description available" -msgstr "Nenhuma descrição do pacote disponível" +msgstr "Nenhuma descrição de pacote disponível" #: builtin/mainmenu/tab_content.lua msgid "Rename" @@ -687,67 +925,39 @@ msgstr "Renomear" #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" -msgstr "Desinstalar o pacote" +msgstr "Desinstalar Pacote" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" -msgstr "Usar pacote de texturas" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Colaboradores ativos" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Desenvolvedores principais" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Créditos" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Colaboradores anteriores" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Desenvolvedores principais anteriores" +msgstr "Usar Pacote de Texturas" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "Anunciar servidor" +msgstr "Anunciar Servidor" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" -msgstr "Endereço de Bind" +msgstr "Endereço" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Configurar" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "Modo criativo" +msgstr "Modo Criativo" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" -msgstr "Habilitar dano" +msgstr "Habilitar Dano" #: builtin/mainmenu/tab_local.lua msgid "Host Game" -msgstr "Criar Jogo" +msgstr "Hospedar Jogo" #: builtin/mainmenu/tab_local.lua msgid "Host Server" -msgstr "Criar Servidor" +msgstr "Hospedar Servidor" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nome / Senha" +msgstr "Instalar jogos do ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -761,62 +971,83 @@ msgstr "Nenhum mundo criado ou selecionado!" msgid "Play Game" msgstr "Jogar" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Porta" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Selecione Mods" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Selecione um mundo:" #: builtin/mainmenu/tab_local.lua msgid "Server Port" -msgstr "Porta do servidor" +msgstr "Porta do Servidor" #: builtin/mainmenu/tab_local.lua msgid "Start Game" -msgstr "Iniciar o jogo" +msgstr "Iniciar Jogo" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Endereço / Porta" +msgid "Address" +msgstr "Endereço" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Conectar" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Limpar" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Modo criativo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Dano habilitado" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Dano / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Deletar Favorito" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "Favoritos" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Servidores incompatíveis" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" -msgstr "Juntar-se ao jogo" +msgstr "Entrar em um Jogo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nome / Senha" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP habilitado" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Servidores Públicos" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Atualizar" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Porta remota" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Descrição do servidor" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -840,11 +1071,7 @@ msgstr "Todas as configurações" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "Antialiasing:" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Você tem certeza que deseja resetar seu mundo um-jogador?" +msgstr "Anti-aliasing:" #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" @@ -854,10 +1081,6 @@ msgstr "Salvar automaticamente o tamanho da tela" msgid "Bilinear Filter" msgstr "Filtragem bi-linear" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bump mapping" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Mudar teclas" @@ -866,13 +1089,30 @@ msgstr "Mudar teclas" msgid "Connected Glass" msgstr "Vidro conectado" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Sombras dinâmicas" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Sombras dinâmicas: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Folhas com transparência" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Gerar Normal maps" +msgid "High" +msgstr "Alto" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Baixo" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Médio" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -882,10 +1122,6 @@ msgstr "Mipmap (filtro)" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Filtro Anisotrópico" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Não" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Sem filtros" @@ -914,18 +1150,10 @@ msgstr "Folhas Opacas" msgid "Opaque Water" msgstr "Água opaca" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Oclusão de paralaxe" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partículas" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Resetar mundo um-jogador" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Tela:" @@ -938,6 +1166,10 @@ msgstr "Configurações" msgid "Shaders" msgstr "Sombreadores" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Sombreadores (experimental)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Sombreadores(indisponível)" @@ -954,52 +1186,46 @@ msgstr "Iluminação suave" msgid "Texturing:" msgstr "Texturização:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Para habilitar os sombreadores é necessário usar o driver OpenGL." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Tone mapping" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "Nível de sensibilidade ao toque (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Filtragem tri-linear" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Muito Alto" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Muito Baixo" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Folhas Balançam" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Waving Liquids" -msgstr "Nós que balancam" +msgstr "Líquidos com ondas" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" msgstr "Plantas balançam" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Sim" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Configurar Mods" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Principal" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Iniciar Um jogador" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Erro de conexão (tempo excedido?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Erro de conexão (tempo excedido)." @@ -1028,8 +1254,8 @@ msgid "Connection error (timed out?)" msgstr "Erro de conexão (tempo excedido?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Não foi possível localizar ou carregar jogo \"" +msgid "Could not find or load game: " +msgstr "Não foi possível localizar ou carregar jogo " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1050,7 +1276,7 @@ msgstr "Nome de jogador muito longo." #: src/client/clientlauncher.cpp msgid "Please choose a name!" -msgstr "Por favor escolha um nome!" +msgstr "Por favor, escolha um nome!" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " @@ -1058,19 +1284,7 @@ msgstr "Arquivo de senha fornecido falhou em abrir : " #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " -msgstr "O caminho do mundo providenciado não existe. " - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" +msgstr "Caminho informado para o mundo não existe: " #: src/client/game.cpp msgid "" @@ -1084,14 +1298,6 @@ msgstr "" msgid "- Address: " msgstr "- Endereço: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "Modo Criativo: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "-Dano: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Modo: " @@ -1113,6 +1319,15 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "Nome do servidor: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Ocorreu um erro:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Acesso negado. Razão:%s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Avanço automático para frente desabilitado" @@ -1121,6 +1336,22 @@ msgstr "Avanço automático para frente desabilitado" msgid "Automatic forward enabled" msgstr "Avanço automático para frente habilitado" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Limites de bloco ocultos" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Limites de bloco mostrados para todos os blocos" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Limites de bloco mostrados para o bloco atual" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Limites de bloco mostrados para blocos próximos" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Atualização da camera desabilitada" @@ -1129,6 +1360,12 @@ msgstr "Atualização da camera desabilitada" msgid "Camera update enabled" msgstr "Atualização da camera habilitada" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" +"Não é possível mostrar limites de bloco (precisa do privilégio 'basic_debug')" + #: src/client/game.cpp msgid "Change Password" msgstr "Alterar a senha" @@ -1141,6 +1378,10 @@ msgstr "Modo cinemático desabilitado" msgid "Cinematic mode enabled" msgstr "Modo cinemático habilitado" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Cliente desconectado" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Scripting de cliente está desabilitado" @@ -1149,6 +1390,10 @@ msgstr "Scripting de cliente está desabilitado" msgid "Connecting to server..." msgstr "Conectando ao servidor..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "A conexão falhou por motivo desconhecido" + #: src/client/game.cpp msgid "Continue" msgstr "Continuar" @@ -1161,43 +1406,35 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" "Controles:\n" -"\n" -"- %s1: andar para frente\n" -"\n" -"- %s2: andar para trás\n" -"\n" -"- %s3: andar para a esquerda\n" -"\n" -"-%s4: andar para a direita\n" -"\n" -"- %s5: pular/escalar\n" -"\n" -"- %s6: esgueirar/descer\n" -"\n" -"- %s7: soltar item\n" -"\n" -"- %s8: inventário\n" -"\n" +"- %s: mover para frente\n" +"- %s: mover para trás\n" +"- %s: mover para esquerda\n" +"- %s: mover para direita\n" +"- %s: pular/subir\n" +"- %s: cavar/socar\n" +"- %s: colocar/usar\n" +"- %s: andar furtivamente/descer\n" +"- %s: soltar item\n" +"- %s: inventário\n" "- Mouse: virar/olhar\n" -"\n" -"- Botão esquerdo do mouse: cavar/dar soco\n" -"\n" -"- Botão direito do mouse: colocar/usar\n" -"\n" "- Roda do mouse: selecionar item\n" -"\n" -"- %s9: bate-papo\n" +"- %s: bate-papo\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Não foi possível resolver o endereço:%s" #: src/client/game.cpp msgid "Creating client..." @@ -1255,6 +1492,11 @@ msgstr "Alcance de visualização ilimitado desabilitado" msgid "Enabled unlimited viewing range" msgstr "Alcance de visualização ilimitado habilitado" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Criando o cliente..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Sair para o menu" @@ -1273,7 +1515,7 @@ msgstr "Modo rápido habilitado" #: src/client/game.cpp msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "Modo rápido habilitado(note: sem privilégio 'fast')" +msgstr "Modo rápido habilitado (nota: sem o privilégio 'fast')" #: src/client/game.cpp msgid "Fly mode disabled" @@ -1328,32 +1570,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Minipapa atualmente desabilitado por jogo ou mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Minimapa escondido" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Minimapa em modo radar, zoom 1x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Minimapa em modo radar, zoom 2x" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Minimapa em modo radar, zoom 4x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Minimapa em modo de superfície, zoom 1x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Minimapa em modo de superfície, zoom 2x" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Minimapa em modo de superfície, zoom 4x" +msgid "Multiplayer" +msgstr "Multi-jogador" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1417,16 +1635,31 @@ msgstr "Som mutado" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Sistema de som está desativado" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Sistema de som não é suportado nesta versão" #: src/client/game.cpp msgid "Sound unmuted" msgstr "Som desmutado" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "O servidor provavelmente está executando uma versão diferente de%s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Não foi possível conectar a%s porque o IPv6 está desativado" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Incapaz de escutar em%s porque IPv6 está desabilitado" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1440,7 +1673,7 @@ msgstr "Distancia de visualização está no máximo:%d" #: src/client/game.cpp #, c-format msgid "Viewing range is at minimum: %d" -msgstr "Distancia de visualização está no mínima:%d" +msgstr "Alcance de visualização é no mínimo: %d" #: src/client/game.cpp #, c-format @@ -1496,10 +1729,6 @@ msgstr "Tecla voltar" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Limpar" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1747,35 +1976,38 @@ msgstr "Botão X 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "As senhas não correspondem!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimapa escondido" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registrar e entrar" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimapa em modo radar, Zoom %dx" -#: src/gui/guiConfirmRegistration.cpp -#, fuzzy, 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 "" -"Você está prestes a entrar no servidor em %1$s com o nome \"%2$s\" pela " -"primeira vez. Se continuar, uma nova conta usando suas credenciais será " -"criada neste servidor.\n" -"Por favor, redigite sua senha e clique registrar e entrar para confirmar a " -"criação da conta ou clique em cancelar para abortar." +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimapa em modo de superfície, Zoom %dx" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimapa em modo de textura" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Falha ao abrir página da web" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Abrindo página da web" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Continuar" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "\"Especial\" = descer" #: src/gui/guiKeyChangeMenu.cpp @@ -1786,15 +2018,23 @@ msgstr "Avanço frontal automático" msgid "Automatic jumping" msgstr "Pulo automático" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Especial" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Voltar" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Limites de bloco" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Mudar camera" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Bate-papo" @@ -1847,18 +2087,16 @@ msgid "Key already in use" msgstr "Essa tecla já está em uso" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" -"Teclas (se este menu estiver com problema, remova itens do arquivo minetest." -"conf)" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" -msgstr "Comandos de Local" +msgstr "Comando local" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" -msgstr "Mutar" +msgstr "Mudo" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" @@ -1880,10 +2118,6 @@ msgstr "Captura de tela" msgid "Sneak" msgstr "Esgueirar" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Especial" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Ativar interface" @@ -1913,9 +2147,8 @@ msgid "Toggle noclip" msgstr "Alternar noclip" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle pitchmove" -msgstr "Ativar histórico de conversa" +msgstr "Ativar Voar seguindo a câmera" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" @@ -1925,10 +2158,6 @@ msgstr "pressione uma tecla" msgid "Change" msgstr "Alterar" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Confirmar a senha" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Nova senha" @@ -1937,6 +2166,10 @@ msgstr "Nova senha" msgid "Old Password" msgstr "Senha antiga" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "As senhas não correspondem!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Sair" @@ -1946,14 +2179,9 @@ msgid "Muted" msgstr "Mutado" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Volume do som: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Entrar " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Volume do som: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1962,6 +2190,16 @@ msgstr "Entrar " msgid "LANG_CODE" msgstr "pt_BR" +#: 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, escolha um nome!" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1973,16 +2211,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Use joystick virtual para ativar botão \"aux\".\n" -"Se habilitado, o joystick virtual vai também clicar no botão \"aux\" quando " -"estiver fora do circulo principal." +"(Android) Use joystick virtual para ativar botão \"especial\".\n" +"Se habilitado, o joystick virtual vai também clicar no botão \"especial\" " +"quando estiver fora do circulo principal." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" "Can be used to move a desired point to (0, 0) to create a\n" @@ -1993,13 +2230,17 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" -"(X,Y,Z) Espaço do fractal a partir centro do mundo em unidades de 'escala'.\n" -"Pode ser usado para mover um ponto desejado para (0, 0) para criar um ponto " -"de spawn apropriado, ou para permitir zoom em um ponto desejado aumentando " -"sua escala.\n" -"O padrão é configurado para ponto de spawn mandelbrot, pode ser necessário " -"altera-lo em outras situações.\n" -"Variam de -2 a 2. Multiplica por \"escala\" para compensação de nós." +"(X,Y,Z) compensação do fractal a partir centro do mundo em unidades de " +"'escala'.\n" +"Pode ser usado para mover um ponto desejado para (0, 0) para criar um\n" +"ponto de spawn flexível ou para permitir zoom em um ponto desejado,\n" +"aumentando 'escala'.\n" +"O padrão é ajustado para um ponto de spawn adequado para conjuntos de\n" +"Mandelbrot com parâmetros padrão, podendo ser necessário alterá-lo em " +"outras \n" +"situações.\n" +"Variam aproximadamente de -2 a 2. Multiplique por 'escala' para compensar em " +"nodes." #: src/settings_translation_file.cpp msgid "" @@ -2013,19 +2254,11 @@ msgid "" msgstr "" "(X,Y,Z) Escala fractal em nós.\n" "Tamanho fractal atual será de 2 a 3 vezes maior.\n" -"Esses números podem ser muito grandes, o fractal não tem que encaixar dentro " -"do mundo.\n" +"Esses números podem ser muito grandes, o fractal\n" +"não tem que encaixar dentro do mundo.\n" "Aumente estes para 'ampliar' nos detalhes do fractal.\n" -"Padrão é para uma forma espremida verticalmente para uma ilha, coloque todos " -"os 3 números iguais para a forma crua." - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = oclusão paralaxe com dados de inclinação (mais rápido).\n" -"1 = mapeamento de relevo (mais lento, mais preciso)." +"Padrão é para uma forma espremida verticalmente para\n" +"uma ilha, coloque todos os 3 números iguais para a forma crua." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." @@ -2037,7 +2270,7 @@ msgstr "Ruído 2D que controla o formato/tamanho de colinas." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "Ruído 2D que controla o formato/tamanho de montanhas de etapa." +msgstr "Ruído 2D que controla o formato/tamanho de montanhas de caminhada." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." @@ -2049,12 +2282,13 @@ msgstr "2D noise que controla o tamanho/ocorrência de colinas." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "Ruído 2D que controla o tamanho/ocorrência de montanhas de passo." +msgstr "" +"Ruído 2D que controla o tamanho/ocorrência de intervalos de montanhas de " +"caminhar." #: src/settings_translation_file.cpp -#, fuzzy msgid "2D noise that locates the river valleys and channels." -msgstr "Ruído 2D que controla o formato/tamanho de colinas." +msgstr "Ruído 2D que localiza os vales e canais dos rios." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2065,20 +2299,19 @@ msgid "3D mode" msgstr "modo 3D" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Intensidade de normalmaps" +msgstr "Força de paralaxe do modo 3D" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "barulho 3D que define cavernas gigantes." +msgstr "Ruído 3D que define cavernas gigantes." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" -"barulho 3D que define estrutura de montanha e altura.\n" +"Ruído 3D que define estrutura de montanha e altura.\n" "Também define a estrutura do terreno da montanha das ilhas flutuantes." #: src/settings_translation_file.cpp @@ -2088,6 +2321,12 @@ 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 definindo as estruturas de terras flutuantes\n" +"Se alterar da predefinição, a 'escala' do ruído (0.7 por predefinição) pode " +"precisar\n" +"ser ajustada, já que o afunilamento das terras flutuantes funciona melhor " +"quando o ruído tem\n" +"um valor entre -2.0 e 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2131,6 +2370,10 @@ msgstr "" " - pageflip: Quadbuffer baseado em 3D.\n" "Note que o modo interlaçado requer que o sombreamento esteja habilitado." +#: 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" @@ -2156,9 +2399,12 @@ msgid "ABM interval" msgstr "Intervalo do ABM" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ABM time budget" +msgstr "Alocação de tempo do ABM" + +#: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "Limite absoluto de filas emergentes" +msgstr "Limite absoluto de filas de blocos para emergir" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2206,6 +2452,12 @@ msgstr "" "Ajustar configuração de dpi (profundidade de cor) para sua tela (apenas para " "quem não usa X11/Android) Ex para telas 4K." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Ajuste a densidade de exibição detectada, usada para dimensionar os " +"elementos da IU." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2215,6 +2467,16 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Ajusta a densidade da camada de ilhas flutuantes.\n" +"Aumente o valor para aumentar a densidade. Pode ser positivo ou negativo.\n" +"Valor = 0.0: 50% do volume é ilhas flutuantes.\n" +"Valor = 2.0 (pode ser maior dependendo do 'mgv7_np_floatland', sempre teste\n" +"para ter certeza) cria uma camada sólida de ilhas flutuantes." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Concatenar nome do item" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2228,9 +2490,16 @@ 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 da luz aplicando-lhe a 'correção gama'.\n" +"Valores altos tornam os níveis médios e baixos de luminosidade mais " +"brilhantes.\n" +"O valor '1.0' mantêm a curva de luz inalterada.\n" +"Isto só tem um efeito significativo sobre a luz do dia e a luz\n" +"artificial, tem pouquíssimo efeito na luz natural da noite." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Sempre voar e correr" #: src/settings_translation_file.cpp @@ -2267,7 +2536,7 @@ msgstr "Concatenar nome do item a descrição." #: src/settings_translation_file.cpp msgid "Apple trees noise" -msgstr "Barulho das Árvores de Macieira" +msgstr "Ruído de Árvores de Macieira" #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2278,8 +2547,8 @@ msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" -"Inercia dos braços fornece um movimento mais realista dos braços quando a " -"câmera mexe." +"Inercia dos braços, fornece um movimento mais realista dos\n" +"braços quando movimenta a câmera." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" @@ -2299,14 +2568,22 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" -"Nesta distância, o servidor otimizará agressivamente quais blocos são " -"enviados aos clientes.\n" +"Nesta distância, o servidor otimizará agressivamente quais blocos serão " +"enviados\n" +"aos clientes.\n" "Pequenos valores potencialmente melhoram muito o desempenho, à custa de " -"falhas de renderização visíveis(alguns blocos não serão processados debaixo " -"da água e nas cavernas, bem como às vezes em terra).\n" -"Configure isso como um valor maior do que a " -"distância_máxima_de_envio_do_bloco para desabilitar essa otimização.\n" -"Especificado em barreiras do mapa (16 nós)." +"falhas\n" +"de renderização visíveis (alguns blocos não serão processados debaixo da " +"água e nas\n" +"cavernas, bem como às vezes em terra).\n" +"Configurando isso para um valor maior do que a " +"distância_máxima_de_envio_do_bloco\n" +"para desabilitar essa otimização.\n" +"Especificado em barreiras do mapa (16 nodes)." + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" #: src/settings_translation_file.cpp msgid "Automatic forward key" @@ -2328,6 +2605,14 @@ msgstr "Salvar automaticamente o tamanho da tela" msgid "Autoscaling mode" msgstr "Modo de alto escalamento" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Tecla Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Tecla Aux1 pra escalar/descer" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tecla para andar para trás" @@ -2340,21 +2625,17 @@ msgstr "Nível de solo base" msgid "Base terrain height." msgstr "Altura base do terreno." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Básico" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Privilégios básicos" #: src/settings_translation_file.cpp msgid "Beach noise" -msgstr "barulho de praia" +msgstr "Ruído de praias" #: src/settings_translation_file.cpp msgid "Beach noise threshold" -msgstr "Limitar o barulho da praia" +msgstr "Limiar do ruído de praias" #: src/settings_translation_file.cpp msgid "Bilinear filtering" @@ -2365,42 +2646,37 @@ msgid "Bind address" msgstr "Endereço de bind" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +#, fuzzy +msgid "Biome API noise parameters" msgstr "Parâmetros de ruído e umidade da API de Bioma" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Ruído do bioma" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" -"Bits por pixel (Também conhecido como profundidade de cor) no modo de tela " -"cheia." - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "Distância otimizada de envio de bloco" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Bobbing" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bold and italic font path" -msgstr "Caminho de fonte monoespaçada" +msgstr "Caminho de fonte em negrito e itálico" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold and italic monospace font path" -msgstr "Caminho de fonte monoespaçada" +msgstr "Caminho de fonte monoespaçada para negrito e itálico" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold font path" -msgstr "Caminho da fonte" +msgstr "Caminho da fonte em negrito" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold monospace font path" -msgstr "Caminho de fonte monoespaçada" +msgstr "Caminho de fonte monoespaçada em negrito" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2411,19 +2687,20 @@ msgid "Builtin" msgstr "Embutido" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bump mapping" +#, fuzzy +msgid "Camera" +msgstr "Mudar camera" #: 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" "Increasing can reduce artifacting on weaker GPUs.\n" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" -"Distancia do plano próximo da câmera em nós, entre 0 e 0.5\n" -"A maioria dos usuários não precisarão mudar isto.\n" +"Distancia do plano próximo da câmera em nós, entre 0 e 0.25\n" +"Só funciona em plataformas GLES. A maioria dos usuários não precisarão mudar " +"isto.\n" "Aumentar pode reduzir a ocorrencia de artefatos em GPUs mais fracas.\n" "0.1 = Padrão, 0.25 = Bom valor para tablets fracos." @@ -2441,15 +2718,15 @@ msgstr "Tecla para alternar atualização da câmera" #: src/settings_translation_file.cpp msgid "Cave noise" -msgstr "Barulho nas caverna" +msgstr "Ruído de cavernas" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "Barulho na caverna #1" +msgstr "Ruído de cavernas #1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "Barulho na caverna #2" +msgstr "Ruído de cavernas #2" #: src/settings_translation_file.cpp msgid "Cave width" @@ -2457,11 +2734,11 @@ msgstr "Largura da caverna" #: src/settings_translation_file.cpp msgid "Cave1 noise" -msgstr "Barulho na caverna1" +msgstr "Ruídos de Cave1" #: src/settings_translation_file.cpp msgid "Cave2 noise" -msgstr "Barulho na caverna2" +msgstr "Ruídos de Cave2" #: src/settings_translation_file.cpp msgid "Cavern limit" @@ -2469,7 +2746,7 @@ msgstr "Limite da caverna" #: src/settings_translation_file.cpp msgid "Cavern noise" -msgstr "Barulho da caverna" +msgstr "Ruído de cavernas" #: src/settings_translation_file.cpp msgid "Cavern taper" @@ -2488,44 +2765,36 @@ msgid "" "Center of light curve boost range.\n" "Where 0.0 is minimum light level, 1.0 is maximum light level." msgstr "" +"Centro da faixa de aumento da curva de luz.\n" +"Onde 0.0 é o nível mínimo de luz, 1.0 é o nível máximo de luz." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Mudanças para a interface do menu principal:\n" -" - Total: Múltiplos mundos de um jogador, escolha de jogo, escolha de pacote " -"de texturas, etc.\n" -"- Simples: Um mundo de um jogador, sem escolha de jogo ou pacote de " -"texturas. Pode ser necessário para telas menores." +msgid "Chat command time message threshold" +msgstr "Limite de mensagem de tempo de comando de bate-papo" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Comandos de Chat" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "Tamanho da fonte" +msgstr "Tamanho da fonte do chat" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Tecla de Chat" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Nível de log do Debug" +msgstr "Nível de log do chat" #: src/settings_translation_file.cpp msgid "Chat message count limit" msgstr "Limite do contador de mensagens de bate-papo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message format" -msgstr "Tamanho máximo da mensagem de conversa" +msgstr "Formato da mensagem de chat" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" @@ -2540,8 +2809,8 @@ msgid "Chat toggle key" msgstr "Tecla comutadora de chat" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Comandos de Chat" +msgid "Chat weblinks" +msgstr "Links de bate-papo" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2559,6 +2828,14 @@ msgstr "Tecla para modo cinematográfico" msgid "Clean transparent textures" msgstr "Limpe as texturas transparentes" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Links da web clicáveis (clique do meio ou Ctrl + botão esquerdo) ativados na " +"saída do console de bate-papo." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Cliente" @@ -2579,6 +2856,11 @@ msgstr "Restrição de modificação no lado do cliente" msgid "Client side node lookup range restriction" msgstr "Restrição do alcançe da visão superior de nós no lado do cliente" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "Mods de Cliente Local" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Velocidade de subida (em escadas e outros)" @@ -2603,6 +2885,10 @@ msgstr "Nuvens no menu" msgid "Colored fog" msgstr "Névoa colorida" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Sombra colorida" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2616,10 +2902,11 @@ msgstr "" "Lista de flags separadas por vírgula para esconder no repositório de " "conteúdos.\n" "\"não livre\" pode ser usada para esconder pacotes que não se qualificam " -"como software livre, como definido pela fundação do software livre.\n" +"como software livre,\n" +"como definido pela fundação do software livre.\n" "Você também pode especificar classificação de conteúdo.\n" -"Essas flags são independentes das versões do minetest, veja a lista completa " -"em https://content.minetest.net/help/content_flags/" +"Essas flags são independentes das versões do minetest,\n" +"veja a lista completa em https://content.minetest.net/help/content_flags/" #: src/settings_translation_file.cpp msgid "" @@ -2643,6 +2930,32 @@ msgstr "" msgid "Command key" msgstr "Tecla de Comando" +#: src/settings_translation_file.cpp +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 "" +"Nível de compressão ZLib a ser usada ao salvar mapblocks no disco.\n" +"-1 - Nível de compressão padrão do Zlib\n" +"0 - Nenhuma compressão; o mais rápido\n" +"9 - Melhor compressão; o mais devagar" + +#: src/settings_translation_file.cpp +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 "" +"Nível de compressão ZLib a ser usada ao mandar mapblocks para o cliente.\n" +"-1 - Nível de compressão padrão do Zlib\n" +"0 - Nenhuma compressão; o mais rápido\n" +"9 - Melhor compressão; o mais devagar\n" +"(níveis 1-3 usam método \"rápido\" do Zlib, enquanto que 4-9 usam método " +"normal)" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Vidro conectado" @@ -2667,10 +2980,19 @@ msgstr "Cor do console" msgid "Console height" msgstr "Tamanho vertical do console" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Content Repository" +msgstr "Repositório de conteúdo online" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "Lista negra de flags do ContentDB" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Máximo de downloads simultâneos de ContentDB" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "Url do ContentDB" @@ -2703,8 +3025,10 @@ msgstr "" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = Dia/noite permanece inalterado." #: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "Controla a velocidade de afundamento em 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." @@ -2720,6 +3044,9 @@ msgid "" "Value >= 10.0 completely disables generation of tunnels and avoids the\n" "intensive noise calculations." msgstr "" +"Controla a largura dos túneis, um valor menor cria túneis mais largos.\n" +"Valor >= 10,0 desabilita completamente a geração de túneis e evita os\n" +"cálculos intensivos de ruído." #: src/settings_translation_file.cpp msgid "Crash message" @@ -2734,16 +3061,24 @@ msgid "Crosshair alpha" msgstr "Alpha do cursor" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Alpha do cursor (o quanto ele é opaco, níveis entre 0 e 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Alpha do cursor (quanto ele é opaco, níveis entre 0 e 255).\n" +"Também controla a cor da cruz do objeto." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Cor do cursor" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Cor do cursor (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Cor da cruz (R, G, B).\n" +"Também controla a cor da cruz do objeto" #: src/settings_translation_file.cpp msgid "DPI" @@ -2766,12 +3101,12 @@ msgid "Debug log level" msgstr "Nível de log do Debug" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Tecla de abaixar volume" +msgid "Debugging" +msgstr "" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" +msgid "Dec. volume key" +msgstr "Tecla de abaixar volume" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2806,17 +3141,18 @@ msgid "Default report format" msgstr "Formato de reporte padrão" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Jogo padrão" +msgstr "Tamanho padrão de stack" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Tempo limite padrão para cURL, indicado em milissegundos.\n" -"Só tem efeito se compilado com cURL." +"Define a qualidade de filtragem de sombreamento\n" +"Isso simula um efeito de sombras suaves aplicando um PCF ou um Poisson disk\n" +"mas também usa mais recursos." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2849,22 +3185,13 @@ msgstr "Define estruturas de canais de grande porte (rios)." msgid "Defines location and terrain of optional hills and lakes." msgstr "Define localizações e terrenos de morros e lagos opcionais." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Define processo amostral de textura.\n" -"Um valor mais alto resulta em mapas de normais mais suaves." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Define o nível base do solo." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the depth of the river channel." -msgstr "Define o nível base do solo." +msgstr "Define a profundidade do canal do rio." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." @@ -2873,14 +3200,12 @@ msgstr "" "ilimitado)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river channel." -msgstr "Define estruturas de canais de grande porte (rios)." +msgstr "Define a largura do canal do rio." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river valley." -msgstr "Define áreas onde na árvores têm maçãs." +msgstr "Define a largura do vale do rio." #: src/settings_translation_file.cpp msgid "Defines tree areas and tree density." @@ -2891,9 +3216,9 @@ 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 "" -"Tempo entre atualizações das malhas 3D no cliente em milissegundos. Aumentar " -"isso vai retardar a taxa de atualização das malhas, sendo assim, reduzindo " -"travamentos em clientes lentos." +"Tempo entre atualizações das malhas 3D no cliente em milissegundos.\n" +"Aumentar isso vai retardar a taxa de atualização das malhas, sendo assim, " +"reduzindo travamentos em clientes lentos." #: src/settings_translation_file.cpp msgid "Delay in sending blocks after building" @@ -2920,26 +3245,34 @@ msgid "" "Description of server, to be displayed when players join and in the " "serverlist." msgstr "" -"Descrição do servidor, a ser exibida quando os jogadores se se conectarem e " -"na lista de servidores." +"Descrição do servidor, a ser exibida quando os jogadores se conectarem e na " +"lista de servidores." #: src/settings_translation_file.cpp msgid "Desert noise threshold" msgstr "Limite do ruído de deserto" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Deserts occur when np_biome exceeds this value.\n" "When the 'snowbiomes' flag is enabled, this is ignored." msgstr "" -"Deserto ocorre quando \"np_biome\" excede esse valor.\n" -"Quando o novo sistema de biomas está habilitado, isso é ignorado." +"Os desertos ocorrem quando np_biome excede este valor.\n" +"Quando a marcação 'snowbiomes' está ativada, isto é ignorado." #: src/settings_translation_file.cpp msgid "Desynchronize block animation" msgstr "Dessincronizar animação do bloco" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Decorações" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Tecla para escavar" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Partículas de Escavação" @@ -2952,6 +3285,17 @@ msgstr "Habilitar Anti-Hack" msgid "Disallow empty passwords" msgstr "Não permitir logar sem senha" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Display Density Scaling Factor" +msgstr "Fator de escala de densidade de exibição" + +#: 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ínio do servidor, para ser mostrado na lista de servidores." @@ -2981,15 +3325,16 @@ msgid "Dungeon minimum Y" msgstr "Y mínimo da dungeon" #: src/settings_translation_file.cpp -#, fuzzy msgid "Dungeon noise" -msgstr "Y mínimo da dungeon" +msgstr "Ruído de masmorra" #: src/settings_translation_file.cpp msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" +"Habilitar suporte IPv6 (tanto para cliente quanto para servidor).\n" +"Necessário para que as conexões IPv6 funcionem." #: src/settings_translation_file.cpp msgid "" @@ -2999,18 +3344,41 @@ msgstr "" "Habilitar suporte a mods de LuaScript no cliente.\n" "Esse suporte é experimental e a API pode mudar." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Ativa filtragem de Poisson disk.\n" +"Quando em true usa o Poisson disk para fazer \"sombras suaves\". Caso " +"contrário, usa filtragem PCF." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Ativa sombras coloridas.\n" +"Quando em true, nodes translúcidos podem projetar sombras coloridas. Requer " +"o uso de muitos recursos." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Habilitar janela de console" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Habilitar modo criativo para mundos novos." +msgid "Enable creative mode for all players" +msgstr "Habilitar modo criativo para todos os jogadores" #: src/settings_translation_file.cpp msgid "Enable joysticks" msgstr "Habilitar 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 "Habilitar suporte a canais de módulos." @@ -3027,18 +3395,6 @@ msgstr "Permitir que os jogadores possam sofrer dano e morrer." msgid "Enable random user input (only used for testing)." msgstr "Habilitar entrada de comandos aleatórios (apenas usado para testes)." -#: src/settings_translation_file.cpp -msgid "Enable register confirmation" -msgstr "Habilitar registro de confirmação" - -#: src/settings_translation_file.cpp -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" -"Habilitar confirmação de registro quando conectar ao servidor.\n" -"Caso desabilitado, uma nova conta será registrada automaticamente." - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" @@ -3047,6 +3403,10 @@ msgstr "" "Ativar iluminação suave com oclusão de ambiente simples.\n" "Desativada para andar rápido ou para visões diferentes." +#: 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" @@ -3058,8 +3418,8 @@ msgstr "" "Habilitar recurso de não permitir que jogadores usando versões antigas do " "cliente possam se conectar.\n" "Essas versões são compatíveis no sentido de não travar quando conectam a " -"servidores com versões mais atuais, porém eles podem não suportar todos os " -"recursos que você está esperando." +"servidores com versões mais atuais,\n" +"porém eles podem não suportar todos os recursos que você está esperando." #: src/settings_translation_file.cpp msgid "" @@ -3078,6 +3438,8 @@ msgid "" "Enable vertex buffer objects.\n" "This should greatly improve graphics performance." msgstr "" +"Ativa vertex buffer objects.\n" +"Isso deve melhorar muito a performance gráfica." #: src/settings_translation_file.cpp msgid "" @@ -3088,14 +3450,14 @@ msgstr "" "Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Enable/disable running an IPv6 server.\n" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" "Habilitar/desabilitar a execução de um IPv6 do servidor. \n" -"Ignorado se bind_address estiver definido." +"Ignorado se bind_address estiver definido.\n" +"Precisa de enable_ipv6 para ser ativado." #: src/settings_translation_file.cpp msgid "" @@ -3104,23 +3466,16 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" +"Permite o mapeamento de tom do filme 'Uncharted 2', de Hable.\n" +"Simula a curva de tons do filme fotográfico e como isso se aproxima da\n" +"aparência de imagens de alto alcance dinâmico (HDR). O contraste de médio " +"alcance é ligeiramente\n" +"melhorado, os destaques e as sombras são gradualmente comprimidos." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." msgstr "Habilita itens animados no inventário." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Ativar texturização bump mapping para texturas. Normalmaps precisam ser " -"fornecidos pelo\n" -"pacote de textura ou a necessidade de ser auto-gerada.\n" -"Requer shaders a serem ativados." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Ativar armazenamento em cache de direção de face girada das malhas." @@ -3129,22 +3484,6 @@ msgstr "Ativar armazenamento em cache de direção de face girada das malhas." msgid "Enables minimap." msgstr "Habilitar minimapa." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Ativa geração de normalmap (efeito de relevo) ao voar.\n" -"Requer texturização bump mapping para ser ativado." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Ativar mapeamento de oclusão de paralaxe.\n" -"Requer shaders a serem ativados." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3152,6 +3491,26 @@ msgid "" "sound controls will be non-functional.\n" "Changing this setting requires a restart." msgstr "" +"Ativa o sistema de som.\n" +"Se desativado, isso desabilita completamente todos os sons em todos os " +"lugares\n" +"e os controles de som dentro do jogo se tornarão não funcionais.\n" +"Mudar esta configuração requer uma reinicialização." + +#: src/settings_translation_file.cpp +#, fuzzy +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 compensações que reduzem a carga da CPU ou aumentam o desempenho de " +"renderização\n" +"à custa de pequenas falhas visuais que não afetam a jogabilidade do jogo." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "Perfil do vale" #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" @@ -3161,14 +3520,6 @@ msgstr "Intervalo de exibição dos dados das analizes do motor" msgid "Entity methods" msgstr "Metodos de entidade" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Opção experimental, pode causar espaços visíveis entre blocos\n" -"quando definido como número maior do que 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3178,10 +3529,22 @@ 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 "" +"Expoente de estreitamento das ilhas flutuantes. Altera o comportamento de " +"afilamento.\n" +"Valor = 1.0 cria um afunilamento linear uniforme.\n" +"Valores> 1.0 criam um estreitamento suave adequado para as ilhas flutuantes\n" +"padrão (separadas).\n" +"Valores <1.0 (por exemplo 0.25) criam um nível de superfície mais definido " +"com\n" +"planícies mais planas, adequadas para uma camada sólida de ilhas flutuantes." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS no menu de pausa" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS quando o jogo é pausado ou perde o foco" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3196,21 +3559,8 @@ msgid "Fall bobbing factor" msgstr "Fator de balanço em queda" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font path" -msgstr "Fonte Alternativa" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Sombra da fonte alternativa" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Alpha da sombra da fonte alternativa" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Tamanho da fonte alternativa" +msgstr "Fonte reserva" #: src/settings_translation_file.cpp msgid "Fast key" @@ -3230,10 +3580,10 @@ msgstr "Modo rápido" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Movimento rápido (através da tecla \"especial\").\n" +"Movimento rápido (através da tecla \"Aux1\").\n" "Isso requer o privilegio \"fast\" no servidor." #: src/settings_translation_file.cpp @@ -3251,7 +3601,8 @@ msgid "" "Multiplayer Tab." msgstr "" "Arquivo na pasta client/serverlist/ que contém seus servidores favoritos, " -"que são mostrados na aba Multijogador." +"que são mostrados na\n" +"aba Multijogador." #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3268,18 +3619,20 @@ msgstr "Filmic Tone Mapping" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Texturas filtradas podem misturar valores RGB com os vizinhos totalmente \n" "transparentes, o qual otimizadores PNG geralmente descartam, por vezes \n" "resultando em uma linha escura em texturas transparentes.\n" -"Aplicar esse filtro para limpar isso no tempo de carregamento da textura." +"Aplique esse filtro para limpar isso no momento de carregamento da textura.\n" +"Esse filtro será ativo automaticamente ao ativar \"mipmapping\"." #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filtros" +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "Anti-aliasing:" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3299,39 +3652,32 @@ msgid "Fixed virtual joystick" msgstr "Joystick virtual fixo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "Densidade da Ilha Flutuante montanhosa" +msgstr "Densidade das terras flutuantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "Y máximo da dungeon" +msgstr "Y máximo das terras flutuantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "Y mínimo da dungeon" +msgstr "Y mínimo das terras flutuantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Ruído base de Ilha Flutuante" +msgstr "Ruído das terras flutuantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "Expoente de terras flutuantes montanhosas" +msgstr "Expoente de conicidade das ilhas flutuantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "Ruído base de Ilha Flutuante" +msgstr "Distância de afilamento da ilha flutuante" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "Nível de água" +msgstr "Nível de água da ilha flutuante" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3353,13 +3699,18 @@ msgstr "Início da névoa" msgid "Fog toggle key" msgstr "Tecla de comutação de névoa" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font" +msgstr "Tamanho da fonte" + #: src/settings_translation_file.cpp msgid "Font bold by default" -msgstr "" +msgstr "Fonte em negrito por padrão" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "" +msgstr "Fonte em itálico por padrão" #: src/settings_translation_file.cpp msgid "Font shadow" @@ -3374,22 +3725,47 @@ msgid "Font size" msgstr "Tamanho da fonte" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" +msgid "Font size divisible by" +msgstr "Tamanho da fonte divisível por" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" +#, fuzzy +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Tamanho da fonte padrão onde 1 unidade = 1 pixel em 96 DPI" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" +#, fuzzy +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Tamanho da fonte monoespacial onde 1 unidade = 1 pixel em 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 "" +"Tamanho da fonte do texto de bate-papo recente e do prompt do bate-papo em " +"pontos (pt).\n" +"O valor 0 irá utilizar o tamanho padrão de fonte." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"Para fontes de estilo de pixel que não são bem dimensionadas, isso garante " +"que os tamanhos de fonte usados\n" +"com esta fonte será sempre divisível por este valor, em pixels. Por " +"exemplo,\n" +"uma fonte de 16 pixels de altura deve ter isso definido como 16, então só " +"será\n" +"tamanho 16, 32, 48, etc., então um mod solicitando um tamanho de 25 receberá " +"32." #: src/settings_translation_file.cpp msgid "" @@ -3397,6 +3773,9 @@ msgid "" "placeholders:\n" "@name, @message, @timestamp (optional)" msgstr "" +"Formato das mensagem de bate-papo dos jogadores. Os textos abaixo são " +"palavras-chave válidas:\n" +"@name, @message, @timestamp (opcional)" #: src/settings_translation_file.cpp msgid "Format of screenshots." @@ -3451,10 +3830,6 @@ msgstr "Tipo fractal" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Fração da distância visível em que a névoa começa a aparecer" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Fontes Freetype" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3480,18 +3855,17 @@ msgid "" msgstr "" "De quão longe clientes sabem sobre objetos declarados em mapblocks (16 " "nós).\n" -" Configurando isto maior do que o alcançe de bloco ativo vai fazer com que o " -"sevidor mantenha objetos ativos na distancia que o jogador está olhando." -"(Isso pode evitar que mobs desapareçam da visão de repente)" +"\n" +"Configurando isto maior do que o alcançe de bloco ativo vai fazer com que o " +"sevidor\n" +"mantenha objetos ativos na distancia na direção que o\n" +"jogador está olhando.(Isso pode evitar que mobs desapareçam da visão de " +"repente)" #: src/settings_translation_file.cpp msgid "Full screen" msgstr "Tela cheia" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Tela cheia BPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Modo tela cheia." @@ -3509,8 +3883,17 @@ msgid "GUI scaling filter txr2img" msgstr "Filtro txr2img de escala da GUI" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Gerar mapa de normais" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Jogos" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" #: src/settings_translation_file.cpp msgid "Global callbacks" @@ -3520,32 +3903,44 @@ msgstr "Chamadas de retorno Globais" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Atributos de geração de mapa globais.\n" -"No gerador de mapa v6 a flag 'decorations' controla todas as decorações " +"No gerador de mapa v6 a flag 'decorations' controla todas as decorações, " "exceto árvores\n" "e gramas da selva, em todos os outros geradores de mapa essa flag controla " "todas as decorações." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." -msgstr "Curva gradiente de iluminaçao no nível de luz maximo." +msgstr "" +"Gradiente da curva de luz no nível de luz máximo.\n" +"Controla o contraste dos níveis de luz mais altos." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." -msgstr "Curva gradiente de iluminação no nível de luz mínimo." +msgstr "" +"Gradiente da curva de luz no nível de luz mínimo.\n" +"Controla o contraste dos níveis de luz mais baixos." #: src/settings_translation_file.cpp 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 "Gravidade" @@ -3563,27 +3958,29 @@ msgid "HTTP mods" msgstr "Módulos HTTP" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "Fator de escalonamento do painel de interface" +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "Escala da GUI" #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Tecla de comutação HUD" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"Manipulação para chamadas de API Lua reprovados:\n" -"- legacy: (tentar) imitar o comportamento antigo (padrão para a " -"liberação).\n" -"- log: imitação e log de retraçamento da chamada reprovada (padrão para " -"depuração).\n" -"- error: abortar no uso da chamada reprovada (sugerido para " +"Lidando com funções obsoletas da API Lua:\n" +"-...none: não registra funções obsoletas.\n" +"-...log: imita e registra as funções obsoletas chamadas (padrão).\n" +"-...error: aborta quando chama uma função obsoleta (sugerido para " "desenvolvedores de mods)." #: src/settings_translation_file.cpp @@ -3596,7 +3993,7 @@ msgid "" msgstr "" "Tem o instrumento de registro em si:\n" "* Monitorar uma função vazia.\n" -"Isto estima a sobrecarga, que o istrumento está adicionando (+1 Chamada de " +"Isto estima a sobrecarga, que o instrumento está adicionando (+1 Chamada de " "função).\n" "* Monitorar o amostrador que está sendo usado para atualizar as estatísticas." @@ -3609,8 +4006,11 @@ msgid "Heat noise" msgstr "Ruído nas cavernas #1" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Altura da janela inicial." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Componente de altura do tamanho da janela inicial. Ignorado em modo de tela " +"cheia." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3618,19 +4018,15 @@ msgstr "Ruído de altura" #: src/settings_translation_file.cpp msgid "Height select noise" -msgstr "Parâmetros de ruido de seleção de altura do gerador de mundo v6" - -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "FPU de alta precisão" +msgstr "Parâmetros de ruido de seleção de altura" #: src/settings_translation_file.cpp msgid "Hill steepness" -msgstr "Esparsamento das colinas no gerador de mundo plano" +msgstr "Inclinação dos morros" #: src/settings_translation_file.cpp msgid "Hill threshold" -msgstr "Threshold das colinas no gerador de mundo plano" +msgstr "Limite das colinas no gerador de mundo plano" #: src/settings_translation_file.cpp msgid "Hilliness1 noise" @@ -3657,18 +4053,24 @@ msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" +"Aceleração horizontal no ar ao saltar ou cair,\n" +"em nós por segundo por segundo." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration in fast mode,\n" "in nodes per second per second." msgstr "" +"Aceleração horizontal e vertical no modo rápido,\n" +"em nós por segundo 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 "" +"Aceleração horizontal e vertical no solo ou ao escalar,\n" +"em nós por segundo por segundo." #: src/settings_translation_file.cpp msgid "Hotbar next key" @@ -3816,15 +4218,27 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"A velocidade com que as ondas líquidas se movem. Maior = mais rápido.\n" +"Se negativo, as ondas líquidas se moverão para trás.\n" +"Requer que a ondulação de líquidos esteja ativada." #: 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 o servidor aguardará antes de descarregar chunks não utilizados. \n" "Um valor mais elevado é mais suave, mas vai usar mais memória 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 "Diminua isto para aumentar a resistência do líquido ao movimento." + #: src/settings_translation_file.cpp msgid "How wide to make rivers." msgstr "Quão largos serão os rios." @@ -3859,12 +4273,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Se estiver desabilitado, a tecla \"especial será usada para voar rápido se " -"modo voo e rápido estiverem habilitados." +"Se estiver desabilitado, a tecla \"especial\" será usada para voar rápido se " +"modo voo e rápido estiverem\n" +"habilitados." #: src/settings_translation_file.cpp msgid "" @@ -3875,9 +4289,10 @@ msgid "" "so that the utility of noclip mode is reduced." msgstr "" "Se habilitado, o servidor executará a seleção de oclusão de bloco de mapa " -"com base na posição do olho do jogador. Isso pode reduzir o número de blocos " -"enviados ao cliente de 50 a 80%. O cliente não será mais mais invisível, de " -"modo que a utilidade do modo \"noclip\" (modo intangível) será reduzida." +"com base\n" +"na posição do olho do jogador. Isso pode reduzir o número de blocos\n" +"enviados ao cliente de 50 a 80%. O cliente não receberá mais invisível\n" +"para que a utilidade do modo noclip é reduzida." #: src/settings_translation_file.cpp msgid "" @@ -3891,12 +4306,21 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Se habilitado, a tecla \"especial\" em vez de \"esgueirar\" servirá para " -"usada descer." +"Se habilitado, a tecla \"especial\" em vez de \"esgueirar\" servirá para\n" +"descer." + +#: 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 confirmação de registro quando conectar ao servidor.\n" +"Caso desabilitado, uma nova conta será registrada automaticamente." #: src/settings_translation_file.cpp msgid "" @@ -3927,7 +4351,10 @@ msgstr "" "quando voando ou nadando." #: 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 habilitado, novos jogadores não podem entrar com uma senha vazia." #: src/settings_translation_file.cpp @@ -3947,7 +4374,17 @@ msgid "" "to this distance from the player to the node." msgstr "" "Se a restrição de CSM para alcançe de nós está habilitado, chamadas get_node " -"são limitadas a está distancia do player até o nó." +"são limitadas\n" +"a esta distancia do player até o node." + +#: 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 execução de um comando de chat demorar mais do que o tempo especificado " +"em\n" +"segundos, adicione a informação do tempo na mensagem-comando" #: src/settings_translation_file.cpp msgid "" @@ -3956,6 +4393,12 @@ msgid "" "deleting an older debug.txt.1 if it exists.\n" "debug.txt is only moved if this setting is positive." msgstr "" +"Se o tamanho do arquivo debug.txt exceder o número de megabytes " +"especificado\n" +"nesta configuração quando ele for aberto, o arquivo é movido para debug." +"txt.1,\n" +"excluindo um debug.txt.1 mais antigo, se houver.\n" +"debug.txt só é movido se esta configuração for positiva." #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." @@ -3967,10 +4410,6 @@ msgstr "" msgid "Ignore world errors" msgstr "Ignorar erros do mundo" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "No jogo" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -3993,18 +4432,19 @@ msgstr "Tecla de aumentar volume" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "" +msgstr "Velocidade vertical inicial ao saltar, em nós por segundo." #: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" msgstr "" -"Monitoração imbutida.\n" -"Isto é usualmente apenas nessesário por contribuidores core/builtin" +"Monitoração embutida.\n" +"Isto é necessário apenas por contribuidores core/builtin" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Monitoração de comandos de chat quando registrados." #: src/settings_translation_file.cpp @@ -4031,10 +4471,6 @@ msgstr "" msgid "Instrument the methods of entities on registration." msgstr "Monitorar os métodos das entidades durante a registração." -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "Monitorização" - #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." msgstr "" @@ -4042,7 +4478,8 @@ msgstr "" "em 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 envio de hora do dia para os clientes." #: src/settings_translation_file.cpp @@ -4062,14 +4499,12 @@ msgid "Invert vertical mouse movement." msgstr "Inverta o movimento vertical do mouse." #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "Caminho de fonte monoespaçada" +msgstr "Caminho da fonte em itálico" #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic monospace font path" -msgstr "Caminho de fonte monoespaçada" +msgstr "Caminho da fonte em itálico monoespaçada" #: src/settings_translation_file.cpp msgid "Item entity TTL" @@ -4087,8 +4522,8 @@ msgid "" "At iterations = 20 this mapgen has a similar load to mapgen V7." msgstr "" "Iterações da função recursiva.\n" -"Aumentando isso aumenta a quantidade de detalhes, mas também aumenta o tempo " -"de processamento.\n" +"Aumentando isso aumenta a quantidade de detalhes, mas também\n" +"aumenta o tempo de processamento.\n" "Com iterações = 20, esse gerador de mapa tem um tempo de carregamento " "similar ao gerador V7." @@ -4100,6 +4535,10 @@ msgstr "ID do Joystick" msgid "Joystick button repetition interval" msgstr "Intervalo de repetição do botão do Joystick" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "\"Zona morta\" do joystick" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Sensibilidade do frustum do Joystick" @@ -4117,7 +4556,8 @@ msgid "" "Range roughly -2 to 2." msgstr "" "Apenas para a configuração de Julia.\n" -"Componente W da constante hipercomplexa determinando o formato do fractal.\n" +"Componente W da constante hipercomplexa.\n" +"Altera o formato do fractal.\n" "Não tem nenhum efeito em fractais 3D.\n" "varia aproximadamente entre -2 e 2." @@ -4142,6 +4582,7 @@ msgid "" msgstr "" "Apenas para configuração de Julia.\n" "Componente Y da constante hipercomplexa.\n" +"Altera o formato do fractal.\n" "Varia aproximadamente entre -2 e 2." #: src/settings_translation_file.cpp @@ -4196,7 +4637,17 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para diminuir o alcance de visão.\n" +"Tecla para diminuir o volume.\n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para escavar. \n" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4226,7 +4677,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para aumentar o alcance de visão.\n" +"Tecla para aumentar o volume.\n" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4298,7 +4749,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Tecla para pular. \n" +"Tecla para por o som em mudo. \n" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4342,6 +4793,16 @@ msgstr "" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tecla para colocar objetos. \n" +"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4878,6 +5339,10 @@ msgstr "" "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "Expulsar jogadores que enviaram mais de X mensagem por 10 segundos." @@ -4900,15 +5365,15 @@ msgstr "Profundidade de cavernas grandes" #: src/settings_translation_file.cpp msgid "Large cave maximum number" -msgstr "" +msgstr "Número máximo de cavernas grandes" #: src/settings_translation_file.cpp msgid "Large cave minimum number" -msgstr "" +msgstr "Número mínimo de cavernas grandes" #: src/settings_translation_file.cpp msgid "Large cave proportion flooded" -msgstr "" +msgstr "Proporção inundada de cavernas grandes" #: src/settings_translation_file.cpp msgid "Large chat console key" @@ -4935,36 +5400,44 @@ msgid "Left key" msgstr "Tecla para a 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 "" "Comprimento do tick do servidor e o intervalo no qual os objetos são " -"geralmente atualizados em rede." +"geralmente atualizados em\n" +"rede." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." msgstr "" -"Definido como true habilita balanço folhas.\n" -"Requer sombreadores serem ativados." +"Comprimento das ondas líquidas.\n" +"Requer que a ondulação de líquidos esteja ativada." #: 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 tempo entre os ciclos de execução de ABMs" #: 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 "Período de tempo entre ciclos de execução 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 "Período de tempo entre os ciclos de gerenciamento de blocos" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- <nothing> (no logging)\n" @@ -4973,7 +5446,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "Nível de registro a serem gravados em debug.txt:\n" "- <nothing> (nenhum)\n" @@ -4985,34 +5459,33 @@ msgstr "" "- verbose" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost" -msgstr "Aumento leve da curva de luz" +msgstr "Aumento da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost center" -msgstr "Centro do aumento leve da curva de luz" +msgstr "Centro do aumento da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost spread" -msgstr "Extensão do aumento leve da curva de luz" +msgstr "Extensão do aumento da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve gamma" -msgstr "Aumento leve da curva de luz" +msgstr "Gamma da curva de luz" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve high gradient" -msgstr "Aumento leve da curva de luz" +msgstr "Gradiente alto da curva de luz" + +#: src/settings_translation_file.cpp +msgid "Light curve low gradient" +msgstr "Gradiente baixo da curva de luz" #: src/settings_translation_file.cpp #, fuzzy -msgid "Light curve low gradient" -msgstr "Centro do aumento leve da curva de luz" +msgid "Lighting" +msgstr "Iluminação suave" #: src/settings_translation_file.cpp msgid "" @@ -5020,9 +5493,9 @@ msgid "" "Only mapchunks completely within the mapgen limit are generated.\n" "Value is stored per-world." msgstr "" -"Limite de geração de mapas, em nós, em todas as 6 direções de (0, 0, 0). " -"Apenas áreas completas de mapa dentro do limite do mapgen são gerados. O " -"valor é armazenado por mundo." +"Limite de geração de mapas, em nós, em todas as 6 direções de (0, 0, 0).\n" +"Apenas áreas completas de mapa dentro do limite do mapgen são gerados.\n" +"O valor é armazenado por mundo." #: src/settings_translation_file.cpp msgid "" @@ -5056,9 +5529,8 @@ msgid "Liquid queue purge time" msgstr "Tempo para limpar a lista de espera para a atualização de líquidos" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid sinking" -msgstr "Velocidade do afundamento de liquido" +msgstr "Afundamento do líquido" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." @@ -5091,18 +5563,13 @@ msgid "Lower Y limit of dungeons." msgstr "Menor limite Y de dungeons." #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "Menor limite Y de dungeons." +msgstr "Menor limite Y de ilhas flutuantes." #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "Menu principal do script" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Estilo do menu principal" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5110,14 +5577,18 @@ msgstr "" "Fazer cores de névoa e céu dependerem do dia (amanhecer/pôr do sol) e exibir " "a direção." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "Faz o DirectX trabalhar com LuaJIT. Desative se causa problemas." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Torna todos os líquidos opacos" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Nível de Compressão de Mapa no Armazenamento em Disco" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Nível de Compressão do Mapa na Transferência em Rede" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Diretório do mapa" @@ -5127,23 +5598,22 @@ msgid "Map generation attributes specific to Mapgen Carpathian." msgstr "Atributos de geração de mapa específicos ao gerador Carpathian." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." msgstr "" -"Atributos de geração de mapas específicos para o gerador de mundo plano.\n" +"Atributos de geração de mapas específicos para o Gerador de mundo Plano.\n" "Lagos e colinas ocasionalmente podem ser adicionados ao mundo plano." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Fractal.\n" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" -"Atributos de geração de mapa específicos ao gerador V7.\n" -"'ridges' habilitam os rios." +"Atributos de geração de mapas específicos para o Gerador de mundo Fractal.\n" +"'terreno' permite a geração de terreno não fractal:\n" +"oceano, ilhas e subterrâneos." #: src/settings_translation_file.cpp msgid "" @@ -5158,7 +5628,8 @@ msgstr "" "'altitude_chill':Reduz o calor com a altitude.\n" "'humid_rivers':Aumenta a umidade em volta dos rios.\n" "'profundidade_variada_rios': Se habilitado, baixa umidade e alto calor faz " -"com que que rios se tornem mais rasos e eventualmente sumam.\n" +"com que rios\n" +"se tornem mais rasos e eventualmente sumam.\n" "'altitude_dry': Reduz a umidade com a altitude." #: src/settings_translation_file.cpp @@ -5166,28 +5637,29 @@ msgid "Map generation attributes specific to Mapgen v5." msgstr "Atributos de geração de mapa específicos ao gerador V5." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v6.\n" "The 'snowbiomes' flag enables the new 5 biome system.\n" "When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" "the 'jungles' flag is ignored." msgstr "" -"Atributos de geração de mapas específico para o gerador de mundo v6.\n" -" O 'snowbiomes' flag habilita o novo sistema de bioma 5.\n" -"Quando o sistema de novo bioma estiver habilitado, selvas são " -"automaticamente habilitadas e a flag 'jungles' é ignorada." +"Atributos de geração de mapas específicos para Gerador de mapas v6.\n" +"A opção 'snowbiomes' habilita o novo sistema de 5 biomas.\n" +"Quando a opção 'snowbiomes' está ativada, as selvas são ativadas " +"automaticamente e\n" +"a opção 'jungles' é ignorada." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Atributos de geração de mapa específicos ao gerador V7.\n" -"'ridges' habilitam os rios." +"Atributos de geração de mapas específicos para Gerador de mapas v7.\n" +"'ridges': rios.\n" +"'floatlands': massas de terra flutuantes na atmosfera.\n" +"'caverns': cavernas gigantes no subsolo." #: src/settings_translation_file.cpp msgid "Map generation limit" @@ -5197,6 +5669,11 @@ msgstr "Limite de geração de mapa" msgid "Map save interval" msgstr "Intervalo de salvamento de mapa" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Tempo de atualização do mapa" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Limite de mapblock" @@ -5221,7 +5698,7 @@ msgstr "Gerador de mundo Carpathian" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian specific flags" -msgstr "Flags específicas do gerador de mundo Carpathian" +msgstr "Flags específicas do gerador de mundo Carpathian" #: src/settings_translation_file.cpp msgid "Mapgen Flat" @@ -5236,9 +5713,8 @@ msgid "Mapgen Fractal" msgstr "Gerador de mundo Fractal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Flags específicas do gerador de mundo plano" +msgstr "Opções específicas do Gerador de mapas Fractal" #: src/settings_translation_file.cpp msgid "Mapgen V5" @@ -5305,8 +5781,13 @@ msgid "Maximum FPS" msgstr "FPS máximo" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Máximo FPS quando o jogo é pausado." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"FPS máximo quando a janela não está com foco, ou quando o jogo é pausado." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Distância máxima para renderizar sombras." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5318,17 +5799,19 @@ msgstr "Largura máxima da hotbar" #: src/settings_translation_file.cpp msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" +msgstr "Limite máximo do número aleatório de cavernas grandes por mapchunk." #: src/settings_translation_file.cpp msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "" +msgstr "Limite máximo do número aleatório de cavernas pequenas por mapchunk." #: src/settings_translation_file.cpp msgid "" "Maximum liquid resistance. Controls deceleration when entering liquid at\n" "high speed." msgstr "" +"Resistência líquida máxima. Controla desaceleração ao entrar num líquido\n" +"em alta velocidade." #: src/settings_translation_file.cpp msgid "" @@ -5346,25 +5829,32 @@ msgstr "" "Número máximo de blocos que podem ser enfileirados para o carregamento." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "This limit is enforced per player." msgstr "" -"Número máximo de blocos para serem enfileirados que estão a ser gerados.\n" -"Definido em branco para uma quantidade apropriada ser escolhida " -"automaticamente." +"Número máximo de blocos para serem enfileirado, dos que estão para ser " +"gerados.\n" +"Esse limite é forçado para cada jogador." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" -"Número máximo de blocos para ser enfileirado que serão carregados do " -"arquivo.\n" -"Definido em branco para uma quantidade apropriada ser escolhida " -"automaticamente." +"Número máximo de blocos para serem enfileirado, dos que estão para ser " +"carregados do arquivo.\n" +"Esse limite é forçado para cada jogador." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Número máximo de downloads paralelos. Downloads excedendo esse limite " +"esperarão numa fila.\n" +"Deve ser menor que curl_parallel_limit." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." @@ -5385,9 +5875,9 @@ msgid "" "client number." msgstr "" "Número máximo de pacotes enviados por etapa de envio, se você tem uma " -"conexão lenta \n" -"tente reduzir isso, mas não reduza a um número abaixo do dobro do número de " -"cliente alvo." +"conexão lenta\n" +"tente reduzir isso, mas não reduza a um número abaixo do dobro do\n" +"número de cliente alvo." #: src/settings_translation_file.cpp msgid "Maximum number of players that can be connected simultaneously." @@ -5430,19 +5920,24 @@ msgstr "" "0 para desabilitar a fila e -1 para a tornar ilimitada." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Tempo máximo em ms para download de arquivo (por exemplo, um arquivo ZIP de " -"um modificador) pode tomar." +"Tempo máximo em ms para download de arquivo (por exemplo, um mod) pode tomar." + +#: 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 um pedido interativo (ex: busca de lista de servidores) " +"pode levar, em milissegundos." #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "Limite de usuários" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Opções para menus" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "Cache de malha" @@ -5461,7 +5956,7 @@ msgstr "Método usado para destacar o objeto selecionado." #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "Nível mínimo de registro a ser impresso no chat." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5476,13 +5971,12 @@ msgid "Minimap scan height" msgstr "Altura de escaneamento do minimapa" #: src/settings_translation_file.cpp -#, fuzzy msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "Ruído 3D que determina o número de cavernas por pedaço de mapa." +msgstr "Limite mínimo do número aleatório de grandes cavernas por mapchunk." #: src/settings_translation_file.cpp msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "" +msgstr "Limite mínimo do número aleatório de cavernas pequenas por mapchunk." #: src/settings_translation_file.cpp msgid "Minimum texture size" @@ -5492,12 +5986,26 @@ msgstr "Tamanho mínimo da textura" msgid "Mipmapping" msgstr "Mipmapping (filtro)" +#: src/settings_translation_file.cpp +msgid "Misc" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Mod Profiler" +msgstr "Analizador" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Mod Security" +msgstr "Segurança" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "Canais de mod" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "Modifica o tamanho dos elementos do hudbar." #: src/settings_translation_file.cpp @@ -5508,6 +6016,11 @@ msgstr "Caminho de fonte monoespaçada" msgid "Monospace font size" msgstr "Tamanho da fonte monoespaçada" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "Tamanho da fonte monoespaçada" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Parâmetros ruido da altura de montagem do gerador de mundo v7" @@ -5553,19 +6066,17 @@ msgid "Mute sound" msgstr "Mutar som" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Name of map generator to be used when creating a new world.\n" "Creating a world in the main menu will override this.\n" "Current mapgens in a highly unstable state:\n" "- The optional floatlands of v7 (disabled by default)." msgstr "" -"Nome do gerador de mapa usando quando criar um novo mundo.\n" -"Criar um mundo no menu principal vai sobrescrever isto.\n" -"Geradores de mapa estáveis atualmente:\n" -"v5, v6, v7(exceto terras flutuantes), singlenode.\n" -"'estável' significa que a forma do terreno em um mundo existente não será " -"alterado no futuro. Note que biomas definidos por jogos ainda podem mudar." +"Nome do gerador de mapas a ser usado ao criar um novo mundo.\n" +"Criar um mundo no menu principal substituirá isso.\n" +"Geradores de mapa atuais em um estado altamente instável:\n" +"- A opção de ilhas flutuantes do Gerador de mapas de v7 (desabilitado por " +"padrão)." #: src/settings_translation_file.cpp msgid "" @@ -5586,13 +6097,8 @@ msgstr "" "servidores." #: src/settings_translation_file.cpp -#, fuzzy msgid "Near plane" -msgstr "plano próximo" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Rede" +msgstr "Plano próximo" #: src/settings_translation_file.cpp msgid "" @@ -5602,6 +6108,11 @@ msgstr "" "Porta de rede para receber dados (UDP).\n" "Esse valor será substituído se for definido a partir do menu 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 "Novos usuários precisam inserir esta senha." @@ -5614,6 +6125,11 @@ msgstr "Atravessar blocos" msgid "Noclip key" msgstr "Tecla Noclip" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Destaque nos Blocos" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "Destacamento do bloco" @@ -5626,20 +6142,11 @@ msgstr "Intervalo de NodeTimer" msgid "Noises" msgstr "Ruidos" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Amostragem de normalmaps" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Intensidade de normalmaps" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Número de seguimentos de emersão" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Number of emerge threads to use.\n" "Value 0:\n" @@ -5652,36 +6159,30 @@ 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 thread emergentes para usar.\n" -"Vazio ou valor 0:\n" -"- Seleção automática. O número de threads emergentes será 'número de " -"processadores - 2', com limite mínimo de 1.\n" +"Número de threads de emersão a serem usadas.\n" +"Valor 0:\n" +"- Seleção automática. O número de threads de emersão será\n" +"- 'número de processadores - 2', com um limite inferior de 1.\n" "Qualquer outro valor:\n" -"- Especifica o número de threads emergentes com limite mínimo de 1.\n" -"Alerta: aumentando o número de threads emergentes aumenta a velocidade do " -"gerador, mas pode prejudicar o desemepenho interferindo com outros " -"processos, especialmente in singleplayer e/ou quando executando código lua " -"em 'on_generated'.\n" -"Para muitos usuários a opção mais recomendada é 1." +"- Especifica o número de threads de emersão, com um limite inferior de 1.\n" +"AVISO: Aumentar o número de threads de emersão aumenta a velocidade do motor " +"de\n" +"geração de mapas, mas isso pode prejudicar o desempenho do jogo, " +"interferindo com outros\n" +"processos, especialmente em singleplayer e / ou ao executar código Lua em " +"eventos\n" +"'on_generated'. Para muitos usuários, a configuração ideal pode ser '1'." #: src/settings_translation_file.cpp 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Número de blocos extras que pode ser carregados por /clearobjects ao mesmo " "tempo.\n" -"Esta é uma troca entre sobrecarga de transação do sqlite e consumo de " -"memória (4096 = 100 MB, como uma regra de ouro)." - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Número de iterações de oclusão de paralaxe." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Repositório de conteúdo online" +"Esta é uma troca entre sobrecarga de transação do sqlite e\n" +"consumo de memória (4096 = 100 MB, como uma regra de ouro)." #: src/settings_translation_file.cpp msgid "Opaque liquids" @@ -5690,12 +6191,7 @@ msgstr "Líquidos Opacos" #: src/settings_translation_file.cpp msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" +msgstr "Opacidade (alpha) das sombras atrás da fonte padrão, entre 0 e 255." #: src/settings_translation_file.cpp msgid "" @@ -5704,50 +6200,31 @@ msgid "" "open." msgstr "" "Abre o menu de pausa quando o foco da janela é perdido.Não pausa se um " -"formspec está aberto." +"formspec está\n" +"aberto." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Viés geral do efeito de oclusão de paralaxe, geralmente de escala/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Escala global do efeito de oclusão de paralaxe." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Oclusão de paralaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Viés de oclusão de paralaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Iterações de oclusão de paralaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Modo de oclusão de paralaxe" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Escala de Oclusão de paralaxe" +msgid "Optional override for chat weblink color." +msgstr "Substituição opcional da cor do link do bate-papo." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" +"Caminho da fonte de fallback. Deve ser uma fonte TrueType.\n" +"Essa fonte será usada para determinados idiomas ou se a fonte padrão não " +"estiver disponível." #: 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 "" +"Caminho para salvar capturas de tela. Pode ser absoluto ou relativo.\n" +"A pasta será criada se já não existe." #: src/settings_translation_file.cpp msgid "" @@ -5764,20 +6241,23 @@ msgstr "" "primeiro daqui." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" +"Caminho para a fonte padrão. Deve ser uma fonte TrueType.\n" +"A fonte de fallback será usada se a fonte não puder ser carregada." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" +"Caminho para a fonte monoespaçada. Deve ser uma fonte TrueType.\n" +"Esta fonte é usada para, por exemplo, a tela do console e do criador de " +"perfil." #: src/settings_translation_file.cpp msgid "Pause on lost window focus" @@ -5786,11 +6266,11 @@ msgstr "Pausa quando o foco da janela é perdido" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" msgstr "" +"Limite de blocos na fila de espera de carregamento do disco por jogador" #: src/settings_translation_file.cpp -#, fuzzy msgid "Per-player limit of queued blocks to generate" -msgstr "Limite de filas emerge para gerar" +msgstr "Limite por jogador de blocos enfileirados para gerar" #: src/settings_translation_file.cpp msgid "Physics" @@ -5804,6 +6284,14 @@ msgstr "Tecla de movimento pitch" msgid "Pitch move mode" msgstr "Modo movimento pitch" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Tecla de colocar" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Intervalo de repetição da ação colocar" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5812,10 +6300,6 @@ msgstr "" "O jogador é capaz de voar sem ser afetado pela gravidade.\n" "Isso requer o privilégio \"fly\" no servidor." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Nome do Jogador" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Distância de transferência do jogador" @@ -5824,6 +6308,10 @@ msgstr "Distância de transferência do jogador" msgid "Player versus player" msgstr "Jogador contra jogador" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Filtragem de Poisson" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5851,8 +6339,8 @@ msgid "" "Print the engine's profiling data in regular intervals (in seconds).\n" "0 = disable. Useful for developers." msgstr "" -"Intervalo de impressão de dados do analisador (em segundos). 0 = " -"desabilitado. Útil para desenvolvedores." +"Intervalo de impressão de dados do analisador (em segundos).\n" +"0 = desabilitado. Útil para desenvolvedores." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" @@ -5866,25 +6354,25 @@ msgstr "Analizador" msgid "Profiler toggle key" msgstr "Tecla de alternância do Analizador" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Analizando" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" -msgstr "" +msgstr "Endereço do Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"Endereço do Prometheus\n" +"Se o minetest for compilado com a opção ENABLE_PROMETHEUS ativa,\n" +"habilita a obtenção de métricas do Prometheus neste endereço.\n" +"As métricas podem ser obtidas em http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." -msgstr "" +msgstr "Proporção de cavernas grandes que contém líquido." #: src/settings_translation_file.cpp msgid "" @@ -5913,9 +6401,8 @@ msgid "Recent Chat Messages" msgstr "Mensagens de chat recentes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "Diretorio de reporte" +msgstr "Caminho da fonte regular" #: src/settings_translation_file.cpp msgid "Remote media" @@ -5956,13 +6443,14 @@ msgid "" msgstr "" "Restringe o acesso de certas funções a nível de cliente em servidores.\n" "Combine os byflags abaixo par restringir recursos de nível de cliente, ou " -"coloque 0 para nenhuma restrição:\n" +"coloque 0\n" +"para nenhuma restrição:\n" "LOAD_CLIENT_MODS: 1 (desabilita o carregamento de mods de cliente)\n" "CHAT_MESSAGES: 2 (desabilita a chamada send_chat_message no lado do " "cliente)\n" "READ_ITEMDEFS: 4 (desabilita a chamada get_item_def no lado do cliente)\n" "READ_NODEDEFS: 8 (desabilita a chamada get_node_def no lado do cliente)\n" -"LOOKUP_NODES_LIMIT: 16 (limita a chamada get_node no lado do cliente para " +"LOOKUP_NODES_LIMIT: 16 (limita a chamada get_node no lado do cliente para\n" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (desabilita a chamada get_player_names no lado do " "cliente)" @@ -5988,18 +6476,12 @@ msgid "Right key" msgstr "Tecla direita" #: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Intervalo de repetição do clique direito" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "River channel depth" -msgstr "Profundidade do Rio" +msgstr "Profundidade do canal do rio" #: src/settings_translation_file.cpp -#, fuzzy msgid "River channel width" -msgstr "Profundidade do Rio" +msgstr "Largura do canal do rio" #: src/settings_translation_file.cpp msgid "River depth" @@ -6014,9 +6496,8 @@ msgid "River size" msgstr "Tamanho do Rio" #: src/settings_translation_file.cpp -#, fuzzy msgid "River valley width" -msgstr "Profundidade do Rio" +msgstr "Largura do vale do rio" #: src/settings_translation_file.cpp msgid "Rollback recording" @@ -6068,6 +6549,11 @@ msgstr "" "quando a escala é reduzida, ao custo de borrar alguns pixels da borda \n" "quando as imagens são dimensionadas em tamanhos não-inteiros." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Tela:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Altura da tela" @@ -6086,7 +6572,7 @@ msgstr "Formato da Captura de tela" #: src/settings_translation_file.cpp msgid "Screenshot quality" -msgstr "Qualidade da Captura de tela;" +msgstr "Qualidade da Captura de tela" #: src/settings_translation_file.cpp msgid "" @@ -6098,6 +6584,11 @@ msgstr "" "1 significa pior qualidade; 100 significa melhor qualidade.\n" "Use 0 para qualidade padrão." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Captura de tela" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "Ruído nas cavernas #1" @@ -6111,10 +6602,6 @@ msgstr "" msgid "Second of two 3D noises that together define tunnels." msgstr "Segundo de 2 ruídos 3D que juntos definem tunéis." -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "Segurança" - #: src/settings_translation_file.cpp msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Consulte http://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6132,7 +6619,6 @@ msgid "Selection box width" msgstr "Largura da caixa de seleção" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Selects one of 18 fractal types.\n" "1 = 4D \"Roundy\" Mandelbrot set.\n" @@ -6164,7 +6650,7 @@ msgstr "" "7 = Conjunto de mandelbrot \"Variation\" 4D.\n" "8 = Conjunto de julia \"Variation\" 4D.\n" "9 = Conjunto de mandelbrot \"Mandelbrot/Mandelbar\" 3D.\n" -"10 = Conjunto de julia \"Mandelbrot/Mandelbar\" 3D.\n" +"10 = Conjunto de julia \"Mandelbrot/Mandelbar\" 3D.\n" "11 = Conjunto de mandelbrot \"Árvore de natal\" 3D.\n" "12 = Conjunto de julia \"Árvore de natal\" 3D..\n" "13 = Conjunto de mandelbrot \"Bulbo de Mandelbrot\" 3D.\n" @@ -6175,8 +6661,19 @@ msgstr "" "18 = Conjunto de julia \"Bulbo de Mandelbrot\" 4D." #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Servidor / Um jogador" +#, 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 "Descrição do servidor" #: src/settings_translation_file.cpp msgid "Server URL" @@ -6202,10 +6699,20 @@ msgstr "Porta do servidor" msgid "Server side occlusion culling" msgstr "Separação de oclusão no lado do servidor" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Porta do Servidor" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL da lista de servidores" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "URL da lista de servidores" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Arquivo da lista de servidores" @@ -6219,7 +6726,9 @@ msgstr "" "Apos mudar isso uma reinicialização é necessária." #: 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 "" "Configura o tamanho máximo de caracteres de uma mensagem enviada por " "clientes." @@ -6227,29 +6736,77 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Set to true to enable waving leaves.\n" -"Requires shaders to be enabled." +"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 "" -"Definido como true habilita balanço folhas.\n" -"Requer sombreadores serem ativados." +"Defina a força da sombra.\n" +"Valores mais baixo significam sombras mais brandas, valores mais altos " +"significam sombras mais fortes." #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"Defina o tamanho do raio de sombras suaves.\n" +"Valores mais baixos significam sombras mais nítidas e valores altos sombras " +"suaves.\n" +"Valor mínimo 1.0 e valor máximo 10.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Defina a inclinação da órbita do Sol/Lua em graus\n" +"Valor 0 significa sem inclinação/ órbita vertical.\n" +"Valor mínimo de 0.0 e máximo de 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Defina para true para ativar o Mapeamento de Sombras.\n" +"Requer sombreadores para ser ativado." + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" +"Definido como true habilita o balanço das folhas.\n" +"Requer que os sombreadores estejam ativados." + +#: src/settings_translation_file.cpp +msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"Definido como true permite ondulação da água.\n" -"Requer sombreadores seres ativados." +"Definido como true permite ondulação de líquidos (como a água).\n" +"Requer que os sombreadores estejam ativados." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving plants.\n" "Requires shaders to be enabled." msgstr "" "Definido como true permite balanço de plantas.\n" -"Requer sombreadores serem ativados." +"Requer que os sombreadores estejam ativados." + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Define a qualidade da textura das sombras para 32 bits.\n" +"Quando false, a textura de 16 bits será usada\n" +"Isso pode fazer com que muito mais coisas aparecam nas sombras." #: src/settings_translation_file.cpp msgid "Shader path" @@ -6263,22 +6820,38 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" "Sombreadores permitem efeitos visuais avançados e podem aumentar a " -"performance em algumas placas de vídeo.\n" +"performance em algumas\n" +"placas de vídeo.\n" "Só funcionam com o modo de vídeo OpenGL." #: src/settings_translation_file.cpp -#, fuzzy +msgid "Shadow filter quality" +msgstr "Qualidade do filtro de sombras" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Distância do mapa de sombras em nodes para renderizar sombras" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "Textura do mapa de sombras em 32 bits" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Tamanho 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 "Fonte de compensador de sombra, se 0 então sombra não será desenhada." +msgstr "" +"Distância (em pixels) da sombra da fonte padrão. Se 0, então a sombra não " +"será desenhada." #: src/settings_translation_file.cpp #, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Fonte de compensador de sombra, se 0 então sombra não será desenhada." +msgid "Shadow strength gamma" +msgstr "Força da sombra" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6292,6 +6865,18 @@ msgstr "Mostrar informações de depuração" msgid "Show entity selection boxes" msgstr "Mostrar as caixas de seleção entidades" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Mostrar caixas de seleção de entidades\n" +"É necessário reiniciar após alterar isso." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Mostrar plano de fundo da nametag por padrão" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Mensagem de desligamento" @@ -6306,10 +6891,11 @@ msgid "" "recommended." msgstr "" "Tamanho dos mapchunks gerados pelo gerador de mapa, em mapblocks(16 nós).\n" -"ALERTA!: Não há benefício e existem diversos perigos em aumentar este valor " -"acima de 5.\n" +"ALERTA!: Não há benefício e existem diversos perigos em\n" +"aumentar este valor acima de 5.\n" "Reduzir este valor aumenta a densidade de dungeons e cavernas.\n" -"Alterar este valor é para uso especial, é recomendado deixar inalterado." +"Alterar este valor é para uso especial, é recomendado deixar\n" +"inalterado." #: src/settings_translation_file.cpp msgid "" @@ -6318,8 +6904,14 @@ msgid "" "thread, thus reducing jitter." msgstr "" "Tamanho da memória cache do MapBlock do gerador de malha. Aumentar isso " -"aumentará o percentual de hit do cache, reduzindo os dados sendo copiados do " -"encadeamento principal, reduzindo assim o jitter." +"aumentará\n" +"o percentual de hit do cache, reduzindo os dados sendo copiados do " +"encadeamento principal\n" +", reduzindo assim o jitter." + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Inclinação Da Órbita Do Céu" #: src/settings_translation_file.cpp msgid "Slice w" @@ -6331,11 +6923,11 @@ msgstr "Inclinação e preenchimento trabalham juntos para modificar as alturas. #: src/settings_translation_file.cpp msgid "Small cave maximum number" -msgstr "" +msgstr "Número máximo de cavernas pequenas" #: src/settings_translation_file.cpp msgid "Small cave minimum number" -msgstr "" +msgstr "Número mínimo de cavernas pequenas" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." @@ -6378,20 +6970,16 @@ msgstr "Velocidade da furtividade" #: src/settings_translation_file.cpp msgid "Sneaking speed, in nodes per second." -msgstr "" +msgstr "Velocidade ao esgueirar-se, em nós (blocos) por segundo." + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Raio das sombras suaves" #: src/settings_translation_file.cpp msgid "Sound" msgstr "Som" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Tecla especial" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Tecla especial pra escalar/descer" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6411,16 +6999,33 @@ msgid "" "Note that mods or games may explicitly set a stack for certain (or all) " "items." msgstr "" +"Especifica o tamanho padrão da pilha de nós, items e ferramentas.\n" +"Note que mods e games talvez definam explicitamente um tamanho para certos " +"(ou todos) os itens." #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Espalhe uma atualização completa do mapa de sombras em uma determinada " +"quantidade de quadros.\n" +"Valores mais altos podem tornar as sombras lentas, valores mais baixos\n" +"consumirá mais recursos.\n" +"Valor mínimo: 1; valor máximo: 16" + +#: src/settings_translation_file.cpp +msgid "" "Spread of light curve boost range.\n" "Controls the width of the range to be boosted.\n" "Standard deviation of the light curve boost Gaussian." msgstr "" -"Extensão do aumento médio da curva da luz.\n" -"Desvio padrão do aumento médio gaussiano." +"Ampliação da faixa de aumento da curva de luz.\n" +"Controla a largura do intervalo a ser aumentado.\n" +"O desvio padrão da gaussiana do aumento da curva de luz." #: src/settings_translation_file.cpp msgid "Static spawnpoint" @@ -6439,13 +7044,8 @@ msgid "Step mountain spread noise" msgstr "Extensão do ruído da montanha de passo" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." -msgstr "Intensidade de paralaxe." - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Intensidade de normalmaps gerados." +msgstr "Força da paralaxe do modo 3D." #: src/settings_translation_file.cpp msgid "" @@ -6453,6 +7053,9 @@ msgid "" "The 3 'boost' parameters define a range of the light\n" "curve that is boosted in brightness." msgstr "" +"Aumento da força da curva de luz.\n" +"Os 3 parâmetros de 'aumento' definem uma faixa\n" +"da curva de luz que é aumentada em brilho." #: src/settings_translation_file.cpp msgid "Strict protocol checking" @@ -6475,6 +7078,21 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"Nível de superfície de água opcional colocada em uma camada sólida de " +"flutuação.\n" +"A água está desativada por padrão e só será colocada se este valor for " +"definido\n" +"acima de 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (o início do\n" +"afilamento superior).\n" +"*** AVISO, POTENCIAL PERIGO PARA OS MUNDOS E DESEMPENHO DO SERVIDOR ***:\n" +"Ao habilitar a colocação de água, as áreas flutuantes devem ser configuradas " +"e testadas\n" +"para ser uma camada sólida, definindo 'mgv7_floatland_density' para 2.0 (ou " +"outro\n" +"valor necessário dependendo de 'mgv7_np_floatland'), para evitar\n" +"fluxo de água extremo intensivo do servidor e para evitar grandes inundações " +"do\n" +"superfície do mundo abaixo." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6484,6 +7102,11 @@ msgstr "SQLite síncrono" msgid "Temperature variation for biomes." msgstr "Variação de temperatura para biomas." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Configurações" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "Ruído alternativo do terreno" @@ -6532,6 +7155,16 @@ msgstr "Ruído de persistência do terreno" msgid "Texture path" msgstr "Diretorio da textura" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Tamanho da textura em que o mapa de sombras será renderizado em.\n" +"Deve ser um múltiplo de dois.\n" +"Números maiores criam sombras melhores mas também esvazia a conta do banco." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6542,17 +7175,21 @@ msgid "" "that is considered EXPERIMENTAL and may not work properly." msgstr "" "Texturas em um nó podem ser alinhadas ao próprio nó ou ao mundo.\n" -"O modo antigo serve melhor para coisas como maquinas, móveis, etc, enquanto " +"O modo antigo serve melhor para coisas como maquinas, móveis, etc, enquanto\n" "o novo faz com que escadas e microblocos encaixem melhor a sua volta.\n" "Entretanto, como essa é uma possibilidade nova, não deve ser usada em " -"servidores antigos, essa opção pode ser forçada para certos tipos de nós. " -"Note que esta opção é considerada EXPERIMENTAL e pode não funcionar " -"adequadamente." +"servidores antigos,\n" +"essa opção pode ser forçada para certos tipos de nós. Note que esta opção\n" +"é considerada EXPERIMENTAL e pode não funcionar adequadamente." #: src/settings_translation_file.cpp msgid "The URL for the content repository" msgstr "A url para o repositório de conteúdo" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "A zona morta do joystick" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6589,6 +7226,11 @@ msgid "" "Default is 1.0 (1/2 node).\n" "Requires waving liquids to be enabled." msgstr "" +"A altura máxima da superfície de líquidos com ondas.\n" +"4.0 = Altura da onda é dois nós.\n" +"0.0 = Onda nem se move.\n" +"O padrão é 1.0 (meio nó).\n" +"Requer ondas em líquidos habilitada." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6604,7 +7246,6 @@ msgstr "" "servidor e dos modificadores." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The radius of the volume of blocks around every player that is subject to " "the\n" @@ -6614,35 +7255,36 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" -"O raio do volume de blocos em volta de cada jogador que é sujeito a coisas " -"de bloco ativo, em mapblocks (16 nós).\n" -"Em blocos ativos, objetos são carregados e ABMs executam.\n" -"Isto é também o alcançe mínimo em que objetos ativos(mobs) são mantidos.\n" -"Isto deve ser configurado junto com o alcance_objeto_ativo." +"O raio do volume dos blocos em torno de cada jogador que está sujeito ao\n" +"material de bloco ativo, declarado em mapblocks (16 nós).\n" +"Nos blocos ativos, os objetos são carregados e os ABMs executados.\n" +"Este também é o intervalo mínimo no qual os objetos ativos (mobs) são " +"mantidos.\n" +"Isso deve ser configurado junto com active_object_send_range_blocks." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Renderizador de fundo para o irrlight.\n" -"Uma reinicialização é necessária após alterar isso.\n" -"Note: no android, use o OGLES1 caso em dúvida! O aplicativo pode falhar ao " -"abrir em outro caso.\n" -"Em outras plataformas, OpenGL é recomendo, e é o único driver com suporte a " -"sombreamento atualmente." +"O back-end de renderização.\n" +"É necessário reiniciar após alterar isso.\n" +"Nota: No Android, use OGLES1 se não tiver certeza! O aplicativo pode falhar " +"ao iniciar de outra forma.\n" +"Em outras plataformas, OpenGL é recomendado.\n" +"Shaders são suportados por OpenGL (somente desktop) e OGLES2 (experimental)" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" -"A sensibilidade dos eixos do joystick para movimentar o frustum de exibição " -"no jogo." +"A sensibilidade dos eixos do joystick para movimentar o\n" +"frustum de exibição no jogo." #: src/settings_translation_file.cpp msgid "" @@ -6669,6 +7311,14 @@ msgstr "" "pelo despejo \n" "de antigas filas de itens. Um valor 0 desativa a funcionalidade." +#: 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 disponível permitido para ABMs executarem em cada passo\n" +"(como uma fração do intervalo do ABM)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6679,12 +7329,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"O tempo em segundos entre repetidos cliques direitos ao segurar o botão " -"direito do mouse." +"O tempo em segundos que leva entre as colocações de nó repetidas ao segurar\n" +"o botão de colocar." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6696,8 +7345,8 @@ msgid "" "enabled. Also the vertical distance over which humidity drops by 10 if\n" "'altitude_dry' is enabled." msgstr "" -"A distancia vertical onde o calor cai por 20 caso 'altitude_chill' esteja " -"habilitado. Também é a distancia vertical onde a umidade cai por 10 se " +"A distancia vertical onde o calor cai por 20 caso 'altitude_chill' esteja\n" +"habilitado. Também é a distancia vertical onde a umidade cai por 10 se\n" "'altitude_dry' estiver habilitado." #: src/settings_translation_file.cpp @@ -6726,7 +7375,8 @@ msgid "Time speed" msgstr "Velocidade 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 "" "Tempo de espera para o cliente remover dados de mapa não utilizados da " "memória." @@ -6755,6 +7405,20 @@ msgstr "Atraso de dica de ferramenta" msgid "Touch screen threshold" msgstr "Limiar a tela de toque" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Touchscreen" +msgstr "Limiar a tela de toque" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Tradeoffs for performance" +msgstr "Trocas por desempenho" + +#: src/settings_translation_file.cpp +msgid "Transparency Sorting Distance" +msgstr "" + #: src/settings_translation_file.cpp msgid "Trees noise" msgstr "Ruido de árvores" @@ -6764,7 +7428,6 @@ msgid "Trilinear filtering" msgstr "Filtragem tri-linear" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" @@ -6787,7 +7450,6 @@ msgid "Undersampling" msgstr "Subamostragem" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Undersampling is similar to using a lower screen resolution, but it applies\n" "to the game world only, keeping the GUI intact.\n" @@ -6795,10 +7457,12 @@ msgid "" "image.\n" "Higher values result in a less detailed image." msgstr "" -"A subamostragem é semelhante ao uso de resolução de tela menor, mas se " -"aplica apenas ao mundo do jogo, mantendo a GUI (Interface Gráfica do " -"Usuário) intacta. Deve dar um aumento significativo no desempenho ao custo " -"de uma imagem menos detalhada." +"A subamostragem é semelhante a usar uma resolução de tela inferior, mas se " +"aplica\n" +"apenas para o mundo do jogo, mantendo a GUI intacta.\n" +"Deve dar um aumento significativo de desempenho ao custo de uma imagem menos " +"detalhada.\n" +"Valores mais altos resultam em uma imagem menos detalhada." #: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" @@ -6813,9 +7477,8 @@ msgid "Upper Y limit of dungeons." msgstr "Limite topo Y de dungeons." #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "Limite topo Y de dungeons." +msgstr "Limite máximo Y para as ilhas flutuantes." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6835,19 +7498,44 @@ msgstr "Usar filtragem bilinear ao dimensionamento de texturas." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" "Usar mip mapping para escalar texturas. Pode aumentar a performance " -"levemente, especialmente quando usando um pacote de texturas em alta " -"resolução.\n" +"levemente,\n" +"especialmente quando usando um pacote de texturas em alta resolução.\n" "O downscaling correto de gama não é suportado." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Use o anti-serrilhamento de várias amostras (MSAA) para suavizar as bordas " +"do bloco.\n" +"Este algoritmo suaviza a janela de visualização 3D enquanto mantém a imagem " +"nítida,\n" +"mas não afeta o interior das texturas\n" +"(que é especialmente perceptível com texturas transparentes).\n" +"Espaços visíveis aparecem entre os nós quando os sombreadores são " +"desativados.\n" +"Se definido como 0, MSAA é desativado.\n" +"É necessário reiniciar após alterar esta opção." + #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." msgstr "Use a filtragem trilinear ao dimensionamento de texturas." +#: src/settings_translation_file.cpp +msgid "User Interfaces" +msgstr "" + #: src/settings_translation_file.cpp msgid "VBO" msgstr "VBO" @@ -6911,7 +7599,7 @@ msgstr "Controla o esparsamento/altura das colinas." #: src/settings_translation_file.cpp msgid "Vertical climbing speed, in nodes per second." -msgstr "" +msgstr "Velocidade vertical de escalda, em nós por segundo." #: src/settings_translation_file.cpp msgid "Vertical screen synchronization." @@ -6927,9 +7615,7 @@ msgstr "Visualização de balanço" #: src/settings_translation_file.cpp msgid "View distance in nodes." -msgstr "" -"Distância de visão (em nós).\n" -"Minimo = 20" +msgstr "Distância de visão (em nós)." #: src/settings_translation_file.cpp msgid "View range decrease key" @@ -6948,23 +7634,23 @@ msgid "Viewing range" msgstr "Intervalo de visualização" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Joystick virtual ativa botão auxiliar" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Joystick virtual ativa botão especial" #: src/settings_translation_file.cpp msgid "Volume" msgstr "Volume do som" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" -"Ativar mapeamento de oclusão de paralaxe.\n" -"Requer shaders a serem ativados." +"Volume de todos os sons.\n" +"Requer que o sistema de som esteja ativado." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "W coordinate of the generated 3D slice of a 4D fractal.\n" "Determines which 3D slice of the 4D shape is generated.\n" @@ -6972,14 +7658,15 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" -"Coordenada W da fatia 3D gerada de um fractal 4D.\n" -"Determina qual fatia 3D da forma 4D é gerada.\n" -"Não tem efeito sobre fractais 3D.\n" -"Varia aproximadamente de -2 a 2." +"W coordenada da fatia 3D gerada de um fractal 4D.\n" +"Determina qual a fatia 3D da forma 4D que é gerada.\n" +"Altera a forma do fractal.\n" +"Não tem efeito sobre os fractais 3D.\n" +"Alcance aproximado de -2 a 2." #: src/settings_translation_file.cpp msgid "Walking and flying speed, in nodes per second." -msgstr "" +msgstr "Velocidade do andar e voar, em nós por segundo." #: src/settings_translation_file.cpp msgid "Walking speed" @@ -6988,6 +7675,7 @@ msgstr "Velocidade de caminhada" #: src/settings_translation_file.cpp msgid "Walking, flying and climbing speed in fast mode, in nodes per second." msgstr "" +"Velocidade do caminhar, voar e escalar no modo rápido, em nós por segundo." #: src/settings_translation_file.cpp msgid "Water level" @@ -7006,22 +7694,18 @@ msgid "Waving leaves" msgstr "Balanço das árvores" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" -msgstr "Nós que balancam" +msgstr "Líquidos ondulantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "Altura de balanço da água" +msgstr "Altura da onda nos líquidos ondulantes" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" msgstr "Velocidade de balanço da água" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" msgstr "Comprimento de balanço da água" @@ -7029,6 +7713,11 @@ msgstr "Comprimento de balanço da água" msgid "Waving plants" msgstr "Balanço das plantas" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Cor da caixa de seleção" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7052,14 +7741,14 @@ msgstr "" "vídeo que não suportem propriedades baixas de texturas voltam do hardware." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7079,12 +7768,11 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Se forem utilizadas fontes freetype, requer suporte a freetype para ser " -"compilado." +"Se os planos de fundo das nametags devem ser mostradas por padrão.\n" +"Mods ainda poderão definir um plano de fundo." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7125,6 +7813,19 @@ msgid "" "In-game, you can toggle the mute state with the mute key or by using the\n" "pause menu." msgstr "" +"Quando mutar os sons. Você pode mutar os sons a qualquer hora, a não ser\n" +"que o sistema de som esteja desabilitado (enable_sound=false).\n" +"No jogo, você pode habilitar o estado de mutado com o botão de mutar\n" +"ou usando o menu 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 "" @@ -7134,8 +7835,9 @@ msgstr "" "como teclar F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Largura da janela inicial." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Componente de tamanho da janela inicial. Ignorado em modo de tela cheia." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7172,11 +7874,12 @@ msgid "" "See also texture_min_size.\n" "Warning: This option is EXPERIMENTAL!" msgstr "" -"Texturas alinhadas ao mundo podem ser escaladas em vários nós. Entretando, o " -"servidor pode não enviar a escala desejada, especialmente se você usa um " -"pacote de textura especialmente projetado; com está opção, o cliente tenta " -"determinar a escala automaticamente baseado no tamanho da textura. Veja " -"também texture_min_size.\n" +"Texturas alinhadas ao mundo podem ser escaladas em vários nós. Entretanto,\n" +"o servidor pode não enviar a escala desejada, especialmente se você usa\n" +"um pacote de textura especialmente projetado; com está opção, o cliente " +"tenta\n" +"determinar a escala automaticamente baseado no tamanho da textura.\n" +"Veja também texture_min_size.\n" "Alerta: Esta opção é EXPERIMENTAL!" #: src/settings_translation_file.cpp @@ -7197,7 +7900,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Y of upper limit of large caves." -msgstr "Limite Y máximo de grandes cavernas." +msgstr "Limite Y máximo de grandes cavernas." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." @@ -7211,6 +7914,12 @@ 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 "" +"Distância de Y sobre a qual as ilhas flutuantes diminuem de densidade total " +"para nenhuma densidade.\n" +"O afunilamento começa nesta distância do limite Y.\n" +"Para uma ilha flutuante sólida, isso controla a altura das colinas / " +"montanhas.\n" +"Deve ser menor ou igual a metade da distância entre os limites Y." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." @@ -7232,124 +7941,38 @@ msgstr "Nível Y de terreno inferior e solo oceânico." msgid "Y-level of seabed." msgstr "Nível Y do fundo do mar." +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "Tempo limite de download de arquivo via cURL" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "Tempo limite de cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "limite paralelo de cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "Tempo limite de cURL" +#~ msgid "- Creative Mode: " +#~ msgstr "- Modo Criativo: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Alternar modo de câmera cinemática" - -#~ msgid "Select Package File:" -#~ msgstr "Selecionar o arquivo do pacote:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Limite Y máximo de lava em grandes cavernas." - -#~ msgid "Waving Water" -#~ msgstr "Ondas na água" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Se dungeons ocasionalmente se projetam do terreno." - -#~ msgid "Projecting dungeons" -#~ msgstr "Projetando dungeons" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Nível Y para o qual as sombras de ilhas flutuantes se estendem." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "" -#~ "Nível em Y do ponto médio da montanha flutuante e da superfície do lago." - -#~ msgid "Waving water" -#~ msgstr "Balanço da água" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Variação da altura da colina e profundidade do lago no terreno liso da " -#~ "Terra Flutuante." +#~ msgid "- Damage: " +#~ msgstr "-Dano: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Altura máxima típica, acima e abaixo do ponto médio, do terreno da " -#~ "montanha flutuante." +#~ "0 = oclusão paralaxe com dados de inclinação (mais rápido).\n" +#~ "1 = mapeamento de relevo (mais lento, mais preciso)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Esta fonte será usada para determinados idiomas." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Força do aumento médio da curva de luz." - -#~ msgid "Shadow limit" -#~ msgstr "Limite de mapblock" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Caminho para TrueTypeFont ou bitmap." - -#~ msgid "Lightness sharpness" -#~ msgstr "Nitidez da iluminação" - -#~ msgid "Lava depth" -#~ msgstr "Profundidade da lava" - -#~ msgid "IPv6 support." -#~ msgstr "Suporte a IPv6." - -#~ msgid "Gamma" -#~ msgstr "Gama" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Fonte alpha de sombra (opacidade, entre 0 e 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Altura da Ilha Flutuante montanhosa" - -#~ msgid "Floatland base height noise" -#~ msgstr "Altura base de ruído de Ilha Flutuante" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Habilitar efeito \"filmic tone mapping\"" - -#~ msgid "Enable VBO" -#~ msgstr "Habilitar VBO" - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Define áreas de Ilha Flutuante em terreno suavizado.\n" -#~ "Terrenos suavizados ocorrem quando o ruído é menor que zero." - -#~ msgid "Darkness sharpness" -#~ msgstr "Nitidez da escuridão" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Controla a largura dos túneis, um valor menor cria túneis mais largos." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Controla a densidade do terreno montanhoso nas ilhas flutuantes.\n" -#~ "É um parâmetro adicionado ao valor de ruído 'mgv7_np_mountain'." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Centro do aumento da curva de luz." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Altera como terras flutuantes montanhosas afunilam acima e abaixo do " -#~ "ponto médio." +#~ msgid "Address / Port" +#~ msgstr "Endereço / Porta" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7360,20 +7983,452 @@ msgstr "Tempo limite de cURL" #~ "elevados são mais brilhantes.\n" #~ "Esta configuração é somente para o cliente e é ignorada pelo servidor." -#~ msgid "Path to save screenshots at." -#~ msgstr "Caminho para onde salvar screenshots." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Altera como terras flutuantes montanhosas afunilam acima e abaixo do " +#~ "ponto médio." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Insinsidade de oclusão de paralaxe" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Limite de filas emerge no disco" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Baixando e instalando $1, por favor aguarde..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Você tem certeza que deseja resetar seu mundo um-jogador?" #~ msgid "Back" #~ msgstr "Backspace" +#~ msgid "Basic" +#~ msgstr "Básico" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "" +#~ "Bits por pixel (Também conhecido como profundidade de cor) no modo de " +#~ "tela cheia." + +#~ msgid "Bump Mapping" +#~ msgstr "Bump mapping" + +#~ msgid "Bumpmapping" +#~ msgstr "Bump mapping" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Centro do aumento da curva de luz." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Mudanças para a interface do menu principal:\n" +#~ " - Total: Múltiplos mundos de um jogador, escolha de jogo, escolha de " +#~ "pacote de texturas, etc.\n" +#~ "- Simples: Um mundo de um jogador, sem escolha de jogo ou pacote de " +#~ "texturas. Pode ser necessário para telas menores." + +#~ msgid "Config mods" +#~ msgstr "Configurar Mods" + +#~ msgid "Configure" +#~ msgstr "Configurar" + +#~ msgid "Connect" +#~ msgstr "Conectar" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Controla a velocidade de afundamento em líquidos." + +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Controla a densidade do terreno montanhoso nas ilhas flutuantes.\n" +#~ "É um parâmetro adicionado ao valor de ruído 'mgv7_np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Controla a largura dos túneis, um valor menor cria túneis mais largos." + +#~ msgid "Credits" +#~ msgstr "Créditos" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Cor do cursor (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Dano habilitado" + +#~ msgid "Darkness sharpness" +#~ msgstr "Nitidez da escuridão" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Tempo limite padrão para cURL, indicado em milissegundos.\n" +#~ "Só tem efeito se compilado com cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Define áreas de Ilha Flutuante em terreno suavizado.\n" +#~ "Terrenos suavizados ocorrem quando o ruído é menor que zero." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Define processo amostral de textura.\n" +#~ "Um valor mais alto resulta em mapas de normais mais suaves." + +#~ msgid "Del. Favorite" +#~ msgstr "Rem. Favorito" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Baixe um jogo, como Minetest Game, do site minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Baixe um a partir do site minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Baixando e instalando $1, por favor aguarde..." + +#~ msgid "Enable VBO" +#~ msgstr "Habilitar VBO" + +#~ msgid "Enable register confirmation" +#~ msgstr "Habilitar registro de confirmação" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Ativar texturização bump mapping para texturas. Normalmaps precisam ser " +#~ "fornecidos pelo\n" +#~ "pacote de textura ou a necessidade de ser auto-gerada.\n" +#~ "Requer shaders a serem ativados." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Habilitar efeito \"filmic tone mapping\"" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Ativa geração de normalmap (efeito de relevo) ao voar.\n" +#~ "Requer texturização bump mapping para ser ativado." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Ativar mapeamento de oclusão de paralaxe.\n" +#~ "Requer shaders a serem ativados." + +#~ msgid "Enter " +#~ msgstr "Entrar " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Opção experimental, pode causar espaços visíveis entre blocos\n" +#~ "quando definido como número maior do que 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS no menu de pausa" + +#~ msgid "Fallback font shadow" +#~ msgstr "Sombra da fonte alternativa" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Alpha da sombra da fonte alternativa" + +#~ msgid "Fallback font size" +#~ msgstr "Tamanho da fonte alternativa" + +#~ msgid "Filtering" +#~ msgstr "Filtros" + +#~ msgid "Floatland base height noise" +#~ msgstr "Altura base de ruído de Ilha Flutuante" + +#~ msgid "Floatland mountain height" +#~ msgstr "Altura da Ilha Flutuante montanhosa" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Fonte alpha de sombra (opacidade, entre 0 e 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Tamanho da fonte reserva em pontos (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Fontes Freetype" + +#~ msgid "Full screen BPP" +#~ msgstr "Tela cheia BPP" + +#~ msgid "Game" +#~ msgstr "Jogo" + +#~ msgid "Gamma" +#~ msgstr "Gama" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Gerar Normal maps" + +#~ msgid "Generate normalmaps" +#~ msgstr "Gerar mapa de normais" + +#~ msgid "HUD scale factor" +#~ msgstr "Fator de escalonamento do painel de interface" + +#~ msgid "High-precision FPU" +#~ msgstr "FPU de alta precisão" + +#~ msgid "IPv6 support." +#~ msgstr "Suporte a IPv6." + +#~ msgid "In-Game" +#~ msgstr "No jogo" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Instalação: arquivo: \"$1\"" + +#~ msgid "Instrumentation" +#~ msgstr "Monitorização" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Teclas (se este menu estiver com problema, remova itens do arquivo " +#~ "minetest.conf)" + +#~ msgid "Lava depth" +#~ msgstr "Profundidade da lava" + +#~ msgid "Lightness sharpness" +#~ msgstr "Nitidez da iluminação" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Limite de filas emerge no disco" + +#~ msgid "Main" +#~ msgstr "Principal" + +#~ msgid "Main menu style" +#~ msgstr "Estilo do menu principal" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "Faz o DirectX trabalhar com LuaJIT. Desative se causa problemas." + +#~ msgid "Menus" +#~ msgstr "Opções para menus" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Minimapa em modo radar, zoom 2x" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minimapa em modo radar, zoom 4x" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minimapa em modo de superfície, zoom 2x" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minimapa em modo de superfície, zoom 4x" + +#~ msgid "Name / Password" +#~ msgstr "Nome / Senha" + +#~ msgid "Name/Password" +#~ msgstr "Nome / Senha" + +#~ msgid "No" +#~ msgstr "Não" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Amostragem de normalmaps" + +#~ msgid "Normalmaps strength" +#~ msgstr "Intensidade de normalmaps" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Número de iterações de oclusão de paralaxe." + #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "Opacidade (alpha) da sombra atrás da fonte alternativa, entre 0 e 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "" +#~ "Viés geral do efeito de oclusão de paralaxe, geralmente de escala/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Escala global do efeito de oclusão de paralaxe." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Oclusão de paralaxe" + +#~ msgid "Parallax occlusion" +#~ msgstr "Oclusão de paralaxe" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Viés de oclusão de paralaxe" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Iterações de oclusão de paralaxe" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Modo de oclusão de paralaxe" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Escala de Oclusão de paralaxe" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Insinsidade de oclusão de paralaxe" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Caminho para TrueTypeFont ou bitmap." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Caminho para onde salvar screenshots." + +#~ msgid "Player name" +#~ msgstr "Nome do Jogador" + +#~ msgid "Profiling" +#~ msgstr "Analizando" + +#~ msgid "Projecting dungeons" +#~ msgstr "Projetando dungeons" + +#~ msgid "PvP enabled" +#~ msgstr "PvP habilitado" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Resetar mundo um-jogador" + +#~ msgid "Select Package File:" +#~ msgstr "Selecionar o arquivo do pacote:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Servidor / Um jogador" + +#~ msgid "" +#~ "Set the shadow update time.\n" +#~ "Lower value means shadows and map updates faster, but it consume more " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "Defina o tempo de atualização das sombras.\n" +#~ "Valores mais baixos significam que sombras e mapa atualizam mais rápido, " +#~ "mas consume mais recursos.\n" +#~ "Valor mínimo 0.001 segundos e valor máximo 0.2 segundos" + +#~ msgid "Shadow limit" +#~ msgstr "Limite de mapblock" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Distância (em pixels) da sombra da fonte de backup. Se 0, então nenhuma " +#~ "sombra será desenhada." + +#~ msgid "Special" +#~ msgstr "Especial" + +#~ msgid "Special key" +#~ msgstr "Tecla especial" + +#~ msgid "Start Singleplayer" +#~ msgstr "Iniciar Um jogador" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Intensidade de normalmaps gerados." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Força do aumento médio da curva de luz." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Esta fonte será usada para determinados idiomas." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Para habilitar os sombreadores é necessário usar o driver OpenGL." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Alternar modo de câmera cinemática" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Altura máxima típica, acima e abaixo do ponto médio, do terreno da " +#~ "montanha flutuante." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Variação da altura da colina e profundidade do lago no terreno liso da " +#~ "Terra Flutuante." + +#~ msgid "View" +#~ msgstr "Vista" + +#~ msgid "Waving Water" +#~ msgstr "Ondas na água" + +#~ msgid "Waving water" +#~ msgstr "Balanço da água" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Se as fontes FreeType são usadas, requer que suporte FreeType tenha sido " +#~ "compilado.\n" +#~ "Se desativado, fontes de bitmap e de vetores XML são usadas em seu lugar." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Se dungeons ocasionalmente se projetam do terreno." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Limite Y máximo de lava em grandes cavernas." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "" +#~ "Nível em Y do ponto médio da montanha flutuante e da superfície do lago." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Nível Y para o qual as sombras de ilhas flutuantes se estendem." + +#~ msgid "Yes" +#~ msgstr "Sim" + +#, 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 "" +#~ "Você está prestes a entrar no servidor com o nome \"%s\" pela primeira " +#~ "vez. \n" +#~ "Se continuar, uma nova conta usando suas credenciais será criada neste " +#~ "servidor.\n" +#~ "Por favor, confirme sua senha e clique em \"Registrar e Entrar\" para " +#~ "confirmar a criação da conta, ou clique em \"Cancelar\" para abortar." + +#~ msgid "You died." +#~ msgstr "Você morreu." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/ro/minetest.po b/po/ro/minetest.po index f7c6b6fef..909b33d2c 100644 --- a/po/ro/minetest.po +++ b/po/ro/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Romanian (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-04 16:41+0000\n" -"Last-Translator: f0roots <f0rootss@gmail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2021-07-25 23:36+0000\n" +"Last-Translator: Nicolae Crefelean <kneekoo@yahoo.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/minetest/" "minetest/ro/>\n" "Language: ro\n" @@ -13,7 +13,43 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.1-dev\n" +"X-Generator: Weblate 4.7.2-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Golește coada mesajelor de chat" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Comenzi de chat." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Ieși în meniul principal" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Comandă greșită: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Comanda dată: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Arată jucătorii conectați" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Jucători conectați: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Coada mesajelor de chat a fost golită." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Această comandă este dezactivată de server." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -23,9 +59,41 @@ msgstr "Reînviere" msgid "You died" msgstr "Ai murit" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Comenzi disponibile:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Comenzi disponibile: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Comandă indisponibilă: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Obține ajutor pentru comenzi" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Folosește „.help <cmd>” pentru detalii sau „.help all” pentru informații " +"complete." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +#, fuzzy +msgid "<none available>" +msgstr "Comandă indisponibilă: " #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -41,15 +109,36 @@ msgstr "Meniul principal" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "Reconectează-te" +msgstr "Reconectare" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "Serverul cere o reconectare :" +msgstr "Serverul cere o reconectare:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Se încarcă..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Alege modificările" + +#: 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. " @@ -61,33 +150,40 @@ msgstr "Serverul forțează versiunea protocolului $1. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " -msgstr "Acest Server suporta versiunile protocolului intre $1 si $2. " +msgstr "Serverul permite versiuni ale protocolului între $1 și $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Încercați să activați lista de servere publică și să vă verificați " -"conexiunea la internet." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." -msgstr "Suportam doar versiunea de protocol $1." +msgstr "Permitem doar versiunea de protocol $1." #: builtin/mainmenu/common.lua msgid "We support protocol versions between version $1 and $2." msgstr "Acceptăm versiuni de protocol între versiunea 1$ și 2$." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Anulează" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Dependențe:" @@ -97,7 +193,7 @@ msgstr "Dezactivează toate" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "Dezactiveaza pachet mod" +msgstr "Dezactivează modpack-ul" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -105,7 +201,7 @@ msgstr "Activează tot" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" -msgstr "Activeaza pachet mod" +msgstr "Activează modpack-ul" #: builtin/mainmenu/dlg_config_world.lua msgid "" @@ -117,7 +213,7 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Găsește mai multe modificări" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -160,29 +256,67 @@ msgstr "Lume:" msgid "enabled" msgstr "activat" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "„$1” există deja. Doriți s-o suprascrieți?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Dependențele $1 și $2 vor fi instalate." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1, de $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 în descărcare,\n" +"$2 în așteptare" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 se descarcă..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 are dependințe care nu sunt disponibile." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 va fi instalat, iar $2 dependințe vor fi ignorate." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Toate pachetele" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Deja instalată" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" -msgstr "Înapoi la meniul principal" +msgstr "Meniul principal" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Jocul de bază:" #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgstr "ContentDB nu este disponibilă când Minetest e compilat fără cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Se încarcă..." +msgstr "Descărcare..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" -msgstr "Nu a putut descărca $1" +msgstr "Nu s-a putut descărca $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Jocuri" @@ -191,9 +325,21 @@ msgid "Install" msgstr "Instalează" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Instalează $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Instalează dependințele opționale" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "Instalare: tipul de fișier neacceptat „$ 1” sau arhiva ruptă" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" -msgstr "Moduri" +msgstr "Modificări" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" @@ -201,16 +347,31 @@ msgstr "Nu s-au putut prelua pachete" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" -msgstr "Fara rezultate" +msgstr "Fără rezultate" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Caută" +msgid "No updates" +msgstr "Nu există actualizări" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Indisponibile" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Suprascrie" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Verificați dacă jocul de bază este corect." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "În așteptare" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" -msgstr "Pachete de textură" +msgstr "Pachete de texturi" #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" @@ -221,107 +382,107 @@ msgid "Update" msgstr "Actualizare" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Actualizează tot [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Vezi detalii într-un navigator web" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "O lume cu numele \"$1\" deja există" +msgstr "Deja există o lume numită \"$1\"" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Teren suplimentar" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "Altitudine de frisoane" +msgstr "Răcire la altitudine" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Altitudine de frisoane" +msgstr "Ariditate la altitudine" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Biome zgomot" +msgstr "Amestec de biom" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Biome zgomot" +msgstr "Biomuri" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Pragul cavernei" +msgstr "Caverne" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Octava" +msgstr "Peșteri" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Creează" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Informații:" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Descărcați un joc, cum ar fi Minetest Game, de pe minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Descărcați unul de pe minetest.net" +msgstr "Decorațiuni" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Development Test is meant for developers." +msgstr "Avertisment: Testul de dezvoltare este destinat dezvoltatorilor." + +#: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "Zgomotul temnițelor" +msgstr "Temnițe" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Teren plat" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "" +msgstr "Mase de teren plutitoare în cer" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Joc" +msgstr "Terenuri plutitoare (experimental)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Generare terenuri fără fracturi: Oceane și sub pământ" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Dealuri" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" -msgstr "" +msgstr "Râuri umede" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" +msgstr "Mărește umiditea în jurul râurilor" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Instalează $1" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "Lacuri" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" msgstr "" +"Umiditatea redusă și căldura ridicată cauzează râuri superficiale sau uscate" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -332,21 +493,20 @@ msgid "Mapgen flags" msgstr "Steagurile Mapgen" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Steaguri specifice Mapgen V5" +msgstr "Steaguri specifice Mapgen" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "Munți" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Curgere de noroi" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Rețea de tunele și peșteri" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -354,20 +514,19 @@ msgstr "Nici un joc selectat" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Reduce căldura cu altitudinea" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Reduce umiditatea cu altitudinea" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Zgomotul râului" +msgstr "Râuri" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Râuri la nivelul mării" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -376,51 +535,47 @@ msgstr "Seminţe" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Tranziție lină între biomi" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Structuri care apar pe teren (fără efect asupra copacilor și a ierbii de " +"junglă creați de v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Structuri care apar pe teren, tipic copaci și plante" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Temperat, Deșert" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Temperat, Deșert, Junglă" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Temperat, Deșert, Junglă, Tundră, Taiga" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "Eroziunea suprafeței terenului" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Copaci și iarbă de junglă" #: builtin/mainmenu/dlg_create_world.lua msgid "Vary river depth" -msgstr "" +msgstr "Adâncimea râului variază" #: 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 "" -"Avertisment: Testul de dezvoltare minimă este destinat dezvoltatorilor." +msgstr "Caverne foarte mari adânc în pământ" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -452,6 +607,39 @@ msgstr "Pkgmgr: calea nevalidă '$ 1'" msgid "Delete World \"$1\"?" msgstr "Ștergi lumea \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Confirmarea parolei" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Missing name" +msgstr "Numele Mapgen" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Name" +msgstr "Nume" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Parola" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "Parolele nu se potrivesc!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Înregistrează-te și Alătură-te" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Acceptă" @@ -485,6 +673,16 @@ msgid "Browse" msgstr "Navighează" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Conţinut" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Conţinut" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Dezactivat" @@ -509,7 +707,8 @@ msgid "Offset" msgstr "Decalaj" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Persistență" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -528,6 +727,10 @@ msgstr "Restabilește valori implicite" msgid "Scale" msgstr "Scală" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Caută" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Selectează directorul" @@ -536,7 +739,7 @@ msgstr "Selectează directorul" msgid "Select file" msgstr "Selectează fila" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Afișați numele tehnice" @@ -617,14 +820,6 @@ msgstr "" "Instalare Mod: nu se poate găsi nume de folder potrivit pentru pachetul de " "moduri $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Instalare: tipul de fișier neacceptat „$ 1” sau arhiva ruptă" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Instalare: fișier: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Nu se poate găsi un mod sau un pachet de moduri valid" @@ -645,6 +840,60 @@ msgstr "Imposibil de instalat un mod ca $1" msgid "Unable to install a modpack as a $1" msgstr "Imposibil de instalat un pachet de moduri ca $ 1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Se încarcă..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Lista de servere publice este dezactivată" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Încercați să activați lista de servere publică și să vă verificați " +"conexiunea la internet." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Despre" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Contribuitori activi" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Tipul curent de randare:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Dezvoltatori de bază" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Deschide directorul cu datele utilizatorului" + +#: 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 "" +"Deschide într-un manager de fișiere directorul care conține lumile,\n" +"jocurile, modificările și texturile furnizate de utilizator." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Foști contribuitori" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Dezvoltatori de bază precedenți" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Căutați conținut online" @@ -685,26 +934,6 @@ msgstr "Dezinstalați pachetul" msgid "Use Texture Pack" msgstr "Folosiți pachetul de textură" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Contribuitori activi" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Dezvoltatori de bază" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Credite" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Foști contribuitori" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Dezvoltatori de bază precedenți" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Anunțare server" @@ -714,14 +943,10 @@ msgid "Bind Address" msgstr "Adresa legată" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Configurează" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Modul Creativ" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Activează Daune" @@ -735,11 +960,7 @@ msgstr "Găzduiește Server" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Nume/Parolă" +msgstr "Instalarea jocurilor din ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -753,10 +974,14 @@ msgstr "Nicio lume creată sau selectată!" msgid "Play Game" msgstr "Joacă jocul" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Alege modificările" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Selectează lumea:" @@ -770,45 +995,62 @@ msgid "Start Game" msgstr "Începe Jocul" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adresă / Port" +msgid "Address" +msgstr "Adresă" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Conectează" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Șterge" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Modul Creativ" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Daune activate" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Daune / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Şterge Favorit" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favorite" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favorit" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Servere incompatibile" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Alatură-te jocului" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Nume / Parolă" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP activat" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Servere publice" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Actualizează" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Şterge Favorit" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Descrierea serverului" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -834,10 +1076,6 @@ msgstr "Toate setările" msgid "Antialiasing:" msgstr "Antialiasing:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Eşti sigur că vrei să resetezi lumea proprie ?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Salvează automat dimensiunea ecranului" @@ -846,10 +1084,6 @@ msgstr "Salvează automat dimensiunea ecranului" msgid "Bilinear Filter" msgstr "Filtrare Biliniară" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Cartografiere cu denivelări" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Modifică tastele" @@ -858,13 +1092,30 @@ msgstr "Modifică tastele" msgid "Connected Glass" msgstr "Sticlă conectată" -#: builtin/mainmenu/tab_settings.lua -msgid "Fancy Leaves" -msgstr "Frunze luxsoase" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Umbre dinamice" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Generați Hărți Normale" +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Umbre dinamice: " + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "Frunze detaliate" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -874,10 +1125,6 @@ msgstr "Hartă mip" msgid "Mipmap + Aniso. Filter" msgstr "Hartă mip + filtru aniso." -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nu" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Fără Filtru" @@ -906,18 +1153,10 @@ msgstr "Frunze opace" msgid "Opaque Water" msgstr "Apă opacă" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Ocluzie Parallax" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Particule" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Resetează lume proprie" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Ecran:" @@ -930,6 +1169,10 @@ msgstr "Setări" msgid "Shaders" msgstr "Umbră" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shadere (experimental)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Shaders (indisponibil)" @@ -946,22 +1189,27 @@ msgstr "Lumină fină" msgid "Texturing:" msgstr "Texturare:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Pentru a permite shadere OpenGL trebuie să fie folosite." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Mapare ton" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "PragulAtingerii: (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Filtrare Triliniară" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Frunze legănătoare" @@ -974,23 +1222,12 @@ msgstr "Fluturarea lichidelor" msgid "Waving Plants" msgstr "Plante legănătoare" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Da" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Configurează moduri" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Principal" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Începeți Jucător singur" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Eroare de conexiune (timeout?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Conexiunea a expirat." @@ -1019,7 +1256,8 @@ msgid "Connection error (timed out?)" msgstr "Eroare de conexiune (timeout?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Nu se poate găsi sau încărca jocul \"" #: src/client/clientlauncher.cpp @@ -1050,18 +1288,6 @@ msgstr "Fișierul cu parolă nu a putut fi deschis: " msgid "Provided world path doesn't exist: " msgstr "Calea aprovizionată a lumii nu există: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1074,14 +1300,6 @@ msgstr "" msgid "- Address: " msgstr "- Adresa: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Modul creativ: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Daune: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Modul: " @@ -1103,6 +1321,16 @@ msgstr "- Jucător vs jucător: " msgid "- Server Name: " msgstr "- Numele serverului: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "A apărut o eroare:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Redirecționare automată dezactivată" @@ -1111,6 +1339,22 @@ msgstr "Redirecționare automată dezactivată" msgid "Automatic forward enabled" msgstr "Redirecționare automată activată" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Actualizarea camerei este dezactivată" @@ -1119,6 +1363,10 @@ msgstr "Actualizarea camerei este dezactivată" msgid "Camera update enabled" msgstr "Actualizarea camerei este activată" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Schimbă Parola" @@ -1131,6 +1379,11 @@ msgstr "Modul cinematografic este dezactivat" msgid "Cinematic mode enabled" msgstr "Modul cinematografic activat" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Modare la client" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Scripturile din partea clientului sunt dezactivate" @@ -1139,6 +1392,10 @@ msgstr "Scripturile din partea clientului sunt dezactivate" msgid "Connecting to server..." msgstr "Se conectează la server..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Continuă" @@ -1151,30 +1408,35 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" "Controale:\n" -"-%s: deplasați înainte\n" -"-%s: deplasați înapoi\n" -"-%s: deplasați spre stânga\n" -"-%s: deplasați spre dreapta\n" -"-%s: salt / urcare\n" -"-%s: strecurați / coborâți\n" -"-%s: aruncați element\n" -"-%s: inventar\n" -"- Mouse: rotiți / priviți\n" -"- Mouse stânga: săpați / pocniți\n" -"- Mouse dreapta: plasați / utilizare\n" -"- Roată mousului: selectează elementul\n" -"-%s: chat\n" +"- %s: deplasare înainte\n" +"- %s: deplasare înapoi\n" +"- %s: deplasare stânga\n" +"- %s: deplasare dreapta\n" +"- %s: salt/urcare\n" +"- %s: săpare/lovire\n" +"- %s: plasare/utilizare\n" +"- %s: furișare/coborâre\n" +"- %s: aruncare obiect\n" +"- %s: inventar\n" +"- Maus: rotire/privire\n" +"- Roata mausului: selectare obiect\n" +"- %s: chat\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" #: src/client/game.cpp msgid "Creating client..." @@ -1232,6 +1494,11 @@ msgstr "Interval de vizualizare nelimitat dezactivat" msgid "Enabled unlimited viewing range" msgstr "Interval de vizualizare nelimitat activat" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Se creează clientul..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Ieși în Meniu" @@ -1305,32 +1572,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "Hartă mip dezactivată de joc sau mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Hartă mip ascunsă" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Hartă mip în modul radar, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Hartă mip în modul radar, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Hartă mip în modul radar, Zoom x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Hartă mip în modul de suprafață, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Hartă mip în modul de suprafață, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Hartă mip în modul de suprafață, Zoom x4" +#, fuzzy +msgid "Multiplayer" +msgstr "Jucător singur" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1394,16 +1638,31 @@ msgstr "Sunet dezactivat" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Sistem audio dezactivat" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Sistemul audio nu e suportat în această construcție" #: src/client/game.cpp msgid "Sound unmuted" msgstr "Sunet activat" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1473,10 +1732,6 @@ msgstr "Înapoi" msgid "Caps Lock" msgstr "Majuscule" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Șterge" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1724,36 +1979,40 @@ msgstr "X Butonul 2" msgid "Zoom" msgstr "Mărire" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Parolele nu se potrivesc!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Hartă mip ascunsă" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Înregistrează-te și Alătură-te" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Mini hartă în modul radar, Zoom %dx" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Mini hartă în modul de suprafață, Zoom %dx" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Mini hartă în modul de textură" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Nu s-a putut descărca $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" -"Sunteți pe cale să vă asociați pentru prima dată la acest server cu numele " -"\"%s\".\n" -"Dacă continuați, se va crea un cont nou utilizând acreditările pe acest " -"server.\n" -"Reintroduceți parola și faceți clic pe \"Înregistrare și asociere\" pentru a " -"confirma crearea contului sau faceți clic pe \"Revocare\" pentru a abandona." #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Continuă" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +#, fuzzy +msgid "\"Aux1\" = climb down" msgstr "\"Special\" = coborâți" #: src/gui/guiKeyChangeMenu.cpp @@ -1764,15 +2023,23 @@ msgstr "Redirecționare înainte" msgid "Automatic jumping" msgstr "Salt automat" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Înapoi" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Schimba camera" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Chat" @@ -1825,9 +2092,8 @@ msgid "Key already in use" msgstr "Tastă deja folosită" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" -"Keybindings. (Dacă acest meniu apare, șterge lucrurile din minetest.conf)" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1857,10 +2123,6 @@ msgstr "Captură de ecran" msgid "Sneak" msgstr "Furișează" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Special" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Comutați HUD" @@ -1901,10 +2163,6 @@ msgstr "apasă o tastă" msgid "Change" msgstr "Schimbă" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Confirmarea parolei" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Noua parolă" @@ -1913,6 +2171,10 @@ msgstr "Noua parolă" msgid "Old Password" msgstr "Vechea parolă" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Parolele nu se potrivesc!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Ieșire" @@ -1922,15 +2184,10 @@ msgid "Muted" msgstr "Amuțit" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +msgid "Sound Volume: %d%%" msgstr "Volum sunet: " -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Introduceţi " - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -1938,6 +2195,16 @@ msgstr "Introduceţi " msgid "LANG_CODE" msgstr "ro" +#: 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ă rugăm să alegeți un nume!" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1948,14 +2215,15 @@ msgstr "" "prima atingere." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Utilizați joystick-ul virtual pentru a declanșa butonul \"aux\".\n" -"Dacă este activat, joystick-ul virtual va atinge, de asemenea, butonul \"aux" -"\" atunci când este în afara cercului principal." +"Dacă este activat, joystick-ul virtual va atinge, de asemenea, butonul " +"\"aux\" atunci când este în afara cercului principal." #: src/settings_translation_file.cpp msgid "" @@ -1998,14 +2266,6 @@ msgstr "" "Valoarea implicită este pentru o formă ghemuită vertical, potrivită pentru\n" "o insulă, setați toate cele 3 numere egale pentru forma brută." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = ocluzia de paralax cu informații despre panta (mai rapid).\n" -"1 = mapare în relief (mai lentă, mai exactă)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "Zgomot 2D care controlează forma/dimensiunea munților crestați." @@ -2045,7 +2305,7 @@ msgstr "Mod 3D" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" -msgstr "" +msgstr "Mod 3D putere paralaxă" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2066,6 +2326,10 @@ 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 "" +"Zgomot 3D care definește structura insulelor plutitoare (floatlands).\n" +"Dacă este modificată valoarea implicită, 'scala' (0.7) ar putea trebui\n" +"să fie ajustată, formarea floatland funcționează optim cu un zgomot\n" +"în intervalul aproximativ -2.0 până la 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2108,6 +2372,10 @@ msgstr "" "- pageflip: quadbuffer pe bază de 3d.\n" "Rețineți că modul între țesutnecesită umbrire pentru a fi activat." +#: 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" @@ -2133,9 +2401,12 @@ msgid "ABM interval" msgstr "Interval ABM" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ABM time budget" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "Limita absolută a cozilor emergente" +msgstr "Limita absolută a cozilor de blocuri procesate" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2183,6 +2454,10 @@ msgstr "" "Ajustați configurația dpi pe ecran (numai pentru x11/Android), de exemplu " "pentru ecrane 4k." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2192,6 +2467,18 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Ajustează densitatea stratului de insule plutitoare.\n" +"Mărește valoarea pentru creșterea densității. Poate fi pozitivă sau " +"negativă.\n" +"Valoarea = 0.0: 50% din volum este insulă plutitoare.\n" +"Valoarea = 2.0 (poate fi mai mare în funcție de 'mgv7_np_floatland'; " +"testați\n" +"pentru siguranță) va crea un strat solid de insulă plutitoare." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Adăugare nume element" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2214,7 +2501,8 @@ msgstr "" "lumina, are un efect foarte mic asupra naturală lumina de noapte." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Întotdeauna zboară și rapid" #: src/settings_translation_file.cpp @@ -2294,6 +2582,10 @@ msgstr "" "Optimizare.\n" "În scrise în mapblocks (16 noduri)." +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Tasta de avans automată" @@ -2314,6 +2606,15 @@ msgstr "Salvează automat dimensiunea ecranului" msgid "Autoscaling mode" msgstr "Mod scalare automată" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Tasta de salt" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tastă înapoi" @@ -2326,10 +2627,6 @@ msgstr "Nivelul solului de bază" msgid "Base terrain height." msgstr "Înălțimea terenului de bază." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "De bază" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Privilegii de bază" @@ -2351,21 +2648,22 @@ msgid "Bind address" msgstr "Adresa de legare" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +#, fuzzy +msgid "Biome API noise parameters" msgstr "Parametrii de zgomot de temperatură și umiditate Biome API" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Biome zgomot" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Biți per pixel (aka adâncime de culoare) în modul ecran complet." - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "Distanță de optimizare trimitere bloc" +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "" + #: src/settings_translation_file.cpp msgid "Bold and italic font path" msgstr "Cale font aldin și cursiv" @@ -2391,8 +2689,9 @@ msgid "Builtin" msgstr "Incorporat" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Hartă pentru Denivelări" +#, fuzzy +msgid "Camera" +msgstr "Schimba camera" #: src/settings_translation_file.cpp msgid "" @@ -2413,88 +2712,89 @@ msgstr "Netezirea camerei" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "" +msgstr "Cameră fluidă în modul cinematic" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "" +msgstr "Tasta de comutare a actualizării camerei" #: src/settings_translation_file.cpp msgid "Cave noise" -msgstr "" +msgstr "Zgomotul peșterilor" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "" +msgstr "Zgomotul 1 al peșterilor" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "" +msgstr "Zgomotul 2 al peșterilor" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "Lățime peșteri" #: src/settings_translation_file.cpp msgid "Cave1 noise" -msgstr "" +msgstr "Zgomot peșteri1" #: src/settings_translation_file.cpp msgid "Cave2 noise" -msgstr "" +msgstr "Zgomot peșteri2" #: src/settings_translation_file.cpp msgid "Cavern limit" -msgstr "" +msgstr "Limita cavernelor" #: src/settings_translation_file.cpp msgid "Cavern noise" -msgstr "" +msgstr "Zgomotul cavernelor" #: src/settings_translation_file.cpp msgid "Cavern taper" -msgstr "" +msgstr "Subțiere caverne" #: src/settings_translation_file.cpp msgid "Cavern threshold" -msgstr "Pragul cavernei" +msgstr "Pragul cavernelor" #: src/settings_translation_file.cpp msgid "Cavern upper limit" -msgstr "" +msgstr "Limita superioară a cavernelor" #: 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 "" +"Centrul razei de amplificare a curbei de lumină.\n" +"Aici 0.0 este nivelul minim de lumină, iar 1.0 este nivelul maxim." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +#, fuzzy +msgid "Chat command time message threshold" +msgstr "Pragul de lansare a mesajului de chat" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Comenzi de chat" #: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "" +msgstr "Dimensiunea fontului din chat" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Tasta de chat" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Cheia de comutare a chatului" +msgstr "Nivelul de raportare în chat" #: src/settings_translation_file.cpp msgid "Chat message count limit" -msgstr "" +msgstr "Limita mesajelor din chat" #: src/settings_translation_file.cpp msgid "Chat message format" @@ -2506,19 +2806,20 @@ msgstr "Pragul de lansare a mesajului de chat" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "Lungimea maximă a unui mesaj din chat" #: src/settings_translation_file.cpp msgid "Chat toggle key" msgstr "Cheia de comutare a chatului" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Comenzi de chat" +#, fuzzy +msgid "Chat weblinks" +msgstr "Chat afișat" #: src/settings_translation_file.cpp msgid "Chunk size" -msgstr "" +msgstr "Dimensiunea unui chunk" #: src/settings_translation_file.cpp msgid "Cinematic mode" @@ -2530,6 +2831,12 @@ msgstr "Tasta modului cinematografic" #: src/settings_translation_file.cpp msgid "Clean transparent textures" +msgstr "Texturi transparente curate" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." msgstr "" #: src/settings_translation_file.cpp @@ -2538,7 +2845,7 @@ msgstr "Client" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "Client și server" #: src/settings_translation_file.cpp msgid "Client modding" @@ -2550,11 +2857,16 @@ msgstr "Restricții de modificare de partea clientului" #: src/settings_translation_file.cpp msgid "Client side node lookup range restriction" -msgstr "" +msgstr "Restricția razei de căutare a nodurilor în clienți" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "Modare la client" #: src/settings_translation_file.cpp msgid "Climbing speed" -msgstr "" +msgstr "Viteza escaladării" #: src/settings_translation_file.cpp msgid "Cloud radius" @@ -2566,7 +2878,7 @@ msgstr "Nori" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." -msgstr "" +msgstr "Norii sunt un efect pe client." #: src/settings_translation_file.cpp msgid "Clouds in menu" @@ -2576,6 +2888,11 @@ msgstr "Nori in meniu" msgid "Colored fog" msgstr "Ceaţă colorată" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "Ceaţă colorată" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2586,12 +2903,22 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" +"Listă separată de virgule cu etichete de ascuns din depozitul de conținut.\n" +"\"nonfree\" se poate folosi pentru ascunderea pachetelor care nu sunt " +"'software liber',\n" +"conform definiției Free Software Foundation.\n" +"Puteți specifica și clasificarea conținutului.\n" +"Aceste etichete nu depind de versiunile Minetest.\n" +"Puteți vedea lista completă la 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 "" +"Listă separată de virgule, cu modificări care au acces la API-uri HTTP,\n" +"care la permit încărcarea și descărcarea de date în/din internet." #: src/settings_translation_file.cpp msgid "" @@ -2603,6 +2930,22 @@ msgstr "" msgid "Command key" msgstr "Tasta de comandă" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Sticla conectată" @@ -2613,7 +2956,7 @@ msgstr "Se conectează la server media extern" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." -msgstr "" +msgstr "Unește sticla dacă nodul permite asta." #: src/settings_translation_file.cpp msgid "Console alpha" @@ -2627,10 +2970,18 @@ msgstr "Culoare consolă" msgid "Console height" msgstr "Înalţime consolă" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "Maximul de descărcări simultane din ContentDB" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "URL-ul ContentDB" @@ -2657,7 +3008,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 @@ -2688,7 +3041,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2696,7 +3051,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2720,11 +3077,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 @@ -2758,14 +3115,14 @@ msgid "Default report format" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Jocul implicit" +msgstr "Dimensiunea implicită a stivei" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2796,12 +3153,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2872,6 +3223,15 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Decorațiuni" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Tasta pentru săpat" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Particule pentru săpare" @@ -2884,6 +3244,16 @@ msgstr "Dezactivează anticheatul" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2928,18 +3298,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "Activați suportul pentru canale mod." @@ -2956,22 +3343,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -3020,14 +3401,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -3036,18 +3409,6 @@ msgstr "" msgid "Enables minimap." msgstr "Activează minimap." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3056,6 +3417,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -3064,12 +3435,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3081,7 +3446,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3100,18 +3469,6 @@ msgstr "" msgid "Fallback font path" msgstr "Cale font de rezervă" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3130,7 +3487,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3164,14 +3521,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filtrarea" +#, 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." @@ -3202,9 +3560,8 @@ msgid "Floatland minimum Y" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Zgomotul solului" +msgstr "Sunetul insulelor plutitoare" #: src/settings_translation_file.cpp msgid "Floatland taper exponent" @@ -3238,6 +3595,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3259,15 +3620,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3276,6 +3637,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3335,10 +3707,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3363,10 +3731,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3384,7 +3748,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Jocuri" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3395,7 +3768,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3414,6 +3787,14 @@ msgstr "" 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 "" @@ -3431,9 +3812,14 @@ msgid "HTTP mods" msgstr "Moduri HTTP" #: src/settings_translation_file.cpp -msgid "HUD scale factor" +msgid "HUD" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "HUD afișat" + #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -3441,8 +3827,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3464,7 +3850,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3475,10 +3862,6 @@ msgstr "Zgomot de înălțime" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Abruptul dealului" @@ -3674,10 +4057,17 @@ 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 "" @@ -3710,8 +4100,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3733,11 +4122,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3761,7 +4156,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 @@ -3778,6 +4175,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3794,10 +4197,6 @@ msgstr "" msgid "Ignore world errors" msgstr "" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "În joc" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -3825,7 +4224,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3848,16 +4247,12 @@ msgstr "" 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 @@ -3908,6 +4303,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3987,6 +4386,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4086,6 +4492,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4459,6 +4872,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4515,7 +4932,7 @@ msgstr "Tasta stângă" 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 @@ -4525,15 +4942,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 @@ -4545,7 +4965,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4572,6 +4993,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Lumină fină" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4643,21 +5069,21 @@ msgstr "" msgid "Main menu script" msgstr "Scriptul meniului principal" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Stilul meniului principal" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4719,6 +5145,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4824,7 +5254,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4872,6 +5306,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4926,17 +5367,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Meniuri" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4985,12 +5430,25 @@ msgstr "" msgid "Mipmapping" msgstr "Cartografierea mip" +#: 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 "Activați securitatea modului" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5001,6 +5459,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5067,16 +5529,16 @@ msgstr "" 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 "" @@ -5089,6 +5551,11 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Evidenţiere Nod" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5101,14 +5568,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5130,18 +5589,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5151,11 +5602,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5164,38 +5610,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5218,17 +5638,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5257,13 +5673,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" +msgstr "Tasta de plasare" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +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 @@ -5274,6 +5694,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Filtrare Biliniară" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5308,10 +5733,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5319,9 +5740,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5411,10 +5832,6 @@ msgstr "" msgid "Right key" msgstr "Tasta dreapta" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5484,6 +5901,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Ecran:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5511,6 +5933,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Captură de ecran" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5523,10 +5950,6 @@ msgstr "" 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 "" @@ -5567,8 +5990,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Server / Jucător singur" +#, fuzzy +msgid "Server" +msgstr "URL-ul serverului" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "Numele serverului" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Descrierea serverului" #: src/settings_translation_file.cpp msgid "Server URL" @@ -5594,10 +6028,20 @@ msgstr "Port server" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Port server" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL listă server" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "URL listă server" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Fișier listă pentru servere" @@ -5609,7 +6053,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5630,6 +6102,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Calea shaderului" @@ -5642,6 +6121,23 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "Calitatea capturii de ecran" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5649,9 +6145,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5666,6 +6160,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5687,6 +6191,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5741,18 +6249,15 @@ msgstr "Viteza de furișare" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Rază nori" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Cheie specială" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5768,6 +6273,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5795,10 +6308,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5836,6 +6345,11 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Setări" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -5878,6 +6392,13 @@ msgstr "" msgid "Texture path" msgstr "Calea texturii" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5892,6 +6413,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5947,18 +6472,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5976,6 +6501,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5984,9 +6515,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6023,7 +6553,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 @@ -6046,6 +6576,19 @@ msgstr "" msgid "Touch screen threshold" msgstr "Prag ecran tactil" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Touchscreen" +msgstr "Prag ecran tactil" + +#: 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 "" @@ -6116,15 +6659,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6218,7 +6776,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6288,6 +6846,10 @@ msgstr "Lungirea undei lichide" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6309,18 +6871,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6355,13 +6915,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6445,43 +7014,220 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- Modul creativ: " + +#~ msgid "- Damage: " +#~ msgstr "- Daune: " + +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." +#~ msgstr "" +#~ "0 = ocluzia de paralax cu informații despre panta (mai rapid).\n" +#~ "1 = mapare în relief (mai lentă, mai exactă)." + +#~ msgid "Address / Port" +#~ msgstr "Adresă / Port" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Eşti sigur că vrei să resetezi lumea proprie ?" + +#~ msgid "Back" +#~ msgstr "Înapoi" + +#~ msgid "Basic" +#~ msgstr "De bază" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Biți per pixel (aka adâncime de culoare) în modul ecran complet." + +#~ msgid "Bump Mapping" +#~ msgstr "Cartografiere cu denivelări" + +#~ msgid "Bumpmapping" +#~ msgstr "Hartă pentru Denivelări" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Modifică interfața meniului principal:\n" +#~ "- Complet: Lumi multiple singleplayer, selector de joc, selector de " +#~ "texturi etc.\n" +#~ "- Simplu: Doar o lume singleplayer, fără selectoare de joc sau " +#~ "texturi.\n" +#~ "Poate fi necesar pentru ecrane mai mici." + +#~ msgid "Config mods" +#~ msgstr "Configurează moduri" + +#~ msgid "Configure" +#~ msgstr "Configurează" + +#~ msgid "Connect" +#~ msgstr "Conectează" + +#~ msgid "Credits" +#~ msgstr "Credite" + +#~ msgid "Damage enabled" +#~ msgstr "Daune activate" #, fuzzy -#~ msgid "Toggle Cinematic" -#~ msgstr "Intră pe rapid" +#~ msgid "Darkness sharpness" +#~ msgstr "Mapgen" -#, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Selectează Fișierul Modului:" +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Descărcați un joc, precum Minetest Game, de pe minetest.net" -#, fuzzy -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Activează Daune" +#~ msgid "Download one from minetest.net" +#~ msgstr "Descărcați unul de pe minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Se descarca si se instaleaza $ 1, vă rugăm să așteptați ..." #, fuzzy #~ msgid "Enable VBO" #~ msgstr "Activează MP" #, fuzzy -#~ msgid "Darkness sharpness" -#~ msgstr "Mapgen" +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Activează Daune" -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Se descarca si se instaleaza $ 1, vă rugăm să așteptați ..." +#~ msgid "Enter " +#~ msgstr "Introduceţi " -#~ msgid "Back" -#~ msgstr "Înapoi" +#~ msgid "Filtering" +#~ msgstr "Filtrarea" + +#~ msgid "Game" +#~ msgstr "Joc" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Generați Hărți Normale" + +#~ msgid "In-Game" +#~ msgstr "În joc" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Instalare: fișier: \"$1\"" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Keybindings. (Dacă acest meniu apare, șterge lucrurile din minetest.conf)" + +#~ msgid "Main" +#~ msgstr "Principal" + +#~ msgid "Main menu style" +#~ msgstr "Stilul meniului principal" + +#~ msgid "Menus" +#~ msgstr "Meniuri" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Hartă mip în modul radar, Zoom x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Hartă mip în modul radar, Zoom x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Hartă mip în modul de suprafață, Zoom x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Hartă mip în modul de suprafață, Zoom x4" + +#~ msgid "Name / Password" +#~ msgstr "Nume / Parolă" + +#~ msgid "Name/Password" +#~ msgstr "Nume/Parolă" + +#~ msgid "No" +#~ msgstr "Nu" #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Ocluzie Parallax" + +#~ msgid "PvP enabled" +#~ msgstr "PvP activat" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Resetează lume proprie" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Selectează Fișierul Modului:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Server / Jucător singur" + +#~ msgid "Special" +#~ msgstr "Special" + +#~ msgid "Special key" +#~ msgstr "Cheie specială" + +#~ msgid "Start Singleplayer" +#~ msgstr "Începeți Jucător singur" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Pentru a permite shadere OpenGL trebuie să fie folosite." + +#, fuzzy +#~ msgid "Toggle Cinematic" +#~ msgstr "Intră pe rapid" + +#~ msgid "View" +#~ msgstr "Vizualizare" + +#~ msgid "Yes" +#~ msgstr "Da" + +#, 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 "" +#~ "Sunteți pe cale să vă asociați pentru prima dată la acest server cu " +#~ "numele \"%s\".\n" +#~ "Dacă continuați, se va crea un cont nou utilizând acreditările pe acest " +#~ "server.\n" +#~ "Reintroduceți parola și faceți clic pe \"Înregistrare și asociere\" " +#~ "pentru a confirma crearea contului sau faceți clic pe \"Revocare\" pentru " +#~ "a abandona." + +#~ msgid "You died." +#~ msgstr "Ai murit." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/ru/minetest.po b/po/ru/minetest.po index e626d58b3..11295943b 100644 --- a/po/ru/minetest.po +++ b/po/ru/minetest.po @@ -2,18 +2,54 @@ msgid "" msgstr "" "Project-Id-Version: Russian (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-18 13:41+0000\n" -"Last-Translator: Maksim Gamarnik <MoNTE48@mail.ua>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-06-27 03:16+0000\n" +"Last-Translator: Темак <artemkotlubai@yandex.ru>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/minetest/" "minetest/ru/>\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.1.1-dev\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 4.13.1-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Очистить очередь чата" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Пустая команда." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Выход в главное меню" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Неверная команда: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Выданная команда: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Список игроков в сети" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Игроки в сети: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Очередь в чате теперь пуста." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Эта команда отключена сервером." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -23,10 +59,41 @@ msgstr "Возродиться" msgid "You died" msgstr "Вы умерли" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Доступные команды:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Доступные команды: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Команда недоступна: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[all | <команда>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "ОК" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<недоступно>" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Произошла ошибка в скрипте Lua:" @@ -47,9 +114,30 @@ msgstr "Переподключиться" msgid "The server has requested a reconnect:" msgstr "Сервер запросил переподключение:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -61,32 +149,40 @@ msgstr "Сервер требует протокол версии $1. " #: builtin/mainmenu/common.lua msgid "Server supports protocol versions between $1 and $2. " -msgstr "Сервер поддерживает версии протокола между $1 и $2. " +msgstr "Сервер поддерживает версии протокола с $1 по $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Попробуйте обновить список публичных серверов и проверьте связь с Интернетом." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." -msgstr "Поддерживается только протокол версии $1." +msgstr "Мы поддерживаем только протокол версии $1." #: builtin/mainmenu/common.lua msgid "We support protocol versions between version $1 and $2." -msgstr "Мы поддерживаем версии протоколов между $1 и $2." +msgstr "Поддерживаются только протоколы версий с $1 по $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Отмена" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Зависимости:" @@ -96,7 +192,7 @@ msgstr "Отключить все" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "Отключить пакет модов" +msgstr "Отключить набор модов" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" @@ -104,7 +200,7 @@ msgstr "Включить все" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" -msgstr "Включить пакет модов" +msgstr "Включить набор модов" #: builtin/mainmenu/dlg_config_world.lua msgid "" @@ -135,8 +231,9 @@ msgid "No hard dependencies" msgstr "Нет жёстких зависимостей" #: builtin/mainmenu/dlg_config_world.lua +#, fuzzy msgid "No modpack description provided." -msgstr "Описание пакета модов недоступно." +msgstr "Описание набора модов недоступно." #: builtin/mainmenu/dlg_config_world.lua msgid "No optional dependencies" @@ -157,22 +254,61 @@ msgstr "Мир:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" -msgstr "включен" +msgstr "включено" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" уже существует. Перезаписать?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Зависимости $1 и $2 будут установлены." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "$1 скачивается…" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "Не удалось найти требуемые зависимости $1." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "Будет установлен $1, а зависимости $2 будут пропущены." #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Все дополнения" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Уже установлено" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Назад в главное меню" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +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 -#, fuzzy msgid "Downloading..." msgstr "Загрузка..." @@ -181,7 +317,6 @@ msgid "Failed to download $1" msgstr "Не удалось загрузить $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Игры" @@ -190,26 +325,55 @@ msgid "Install" msgstr "Установить" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Установить $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Установить недостающие зависимости" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Установка мода: неподдерживаемый тип файла или повреждённый архив" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Моды" #: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy msgid "No packages could be retrieved" -msgstr "Пакеты не могут быть получены" +msgstr "Дополнения не могут быть получены" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" msgstr "Ничего не найдено" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Искать" +msgid "No updates" +msgstr "Нет обновлений" #: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Не найдено" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Перезаписать" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Please check that the base game is correct." +msgstr "Пожалуйста, убедитесь, что основная игра верна." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "В очереди" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy msgid "Texture packs" -msgstr "Пакеты текстур" +msgstr "Наборы текстур" #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" @@ -220,8 +384,12 @@ msgid "Update" msgstr "Обновить" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Вид" +msgid "Update All [$1]" +msgstr "Обновить все [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Посмотреть дополнительную информацию в веб-браузере" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -233,88 +401,80 @@ msgstr "Дополнительная местность" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "Высота нивального пояса" +msgstr "Высота над уровнем моря" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" msgstr "Высота нивального пояса" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Шум биомов" +msgstr "Смешивание биомов" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Шум биомов" +msgstr "Биомы" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Шум пещеры" +msgstr "Пещеры" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Октавы" +msgstr "Пещеры" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Создать" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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" +msgstr "Украшения" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Development Test is meant for developers." +msgstr "Внимание: «The Development Test» предназначен для разработчиков." + +#: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "Шум подземелья" +msgstr "Подземелья" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" msgstr "Плоская местность" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Floating landmasses in the sky" -msgstr "Плотность гор на парящих островах" +msgstr "Парящие острова на небе" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 "Создать нефрактальную местность: океаны и подземелья" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" msgstr "Холмы" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 @@ -324,6 +484,7 @@ msgstr "Озёра" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" msgstr "" +"Пониженную влажность и высокую температуру вызывают отмель или высыхание рек" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -336,16 +497,15 @@ msgstr "Флаги картогенератора" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy msgid "Mapgen-specific flags" -msgstr "Специальные флаги картогенератора V5" +msgstr "Особые флаги картогенератора" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mountains" -msgstr "Шум гор" +msgstr "Горы" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Грязевой поток" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" @@ -364,13 +524,12 @@ msgid "Reduces humidity with altitude" msgstr "Уменьшает влажность с высотой" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Размер рек" +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 @@ -382,50 +541,46 @@ msgid "Smooth transition between biomes" msgstr "Плавный переход между биомами" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +"Строения, появляющиеся на поверхности (не влияет на деревья и тропическую " +"траву, сгенерированные v6)" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Structures appearing on the terrain, typically trees and plants" +msgstr "Строения, появляющиеся на поверхности, обычно деревья и растения" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert" +msgstr "Умеренный пояс, Пустыня" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle" +msgstr "Умеренный пояс, Пустыня, Джунгли" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +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 "Деревья и Джунгли-трава" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "" -"Внимание: «Minimal development test» предназначен только для разработчиков." +msgstr "Очень большие пещеры глубоко под землей" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -457,21 +612,56 @@ 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 +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 "Принять" #: builtin/mainmenu/dlg_rename_modpack.lua +#, fuzzy msgid "Rename Modpack:" -msgstr "Переименовать пакет модов:" +msgstr "Переименовать набор модов:" #: builtin/mainmenu/dlg_rename_modpack.lua +#, fuzzy msgid "" "This modpack has an explicit name given in its modpack.conf which will " "override any renaming here." msgstr "" -"Этот модпак имеет явное имя, указанное в modpack.conf, который переопределит " -"любое переименование здесь." +"Этот набор модов имеет имя, явно указанное в modpack.conf, которое изменится " +"от переименования здесь." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" @@ -490,12 +680,22 @@ 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 "Отключено" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "Изменить" +msgstr "Править" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" @@ -514,8 +714,8 @@ msgid "Offset" msgstr "Смещение" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" -msgstr "Персистенция" +msgid "Persistence" +msgstr "Упорство" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." @@ -527,21 +727,26 @@ 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 "Масштаб" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Поиск" + #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "Select directory" -msgstr "Выбрать каталог" +msgstr "Выбрать папку" #: builtin/mainmenu/dlg_settings_advanced.lua 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 "Показывать технические названия" @@ -590,7 +795,7 @@ msgstr "абсолютная величина" #. 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 @@ -610,35 +815,27 @@ msgstr "$1 модов" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" -msgstr "Не удалось установить $1 в $2" +msgstr "Невозможно установить $1 в $2" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" msgstr "Установка мода: не удаётся определить название мода для «$1»" #: builtin/mainmenu/pkgmgr.lua +#, fuzzy msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -"Установка мода: не удаётся найти подходящей каталог для пакета модов «$1»" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"Установка мода: неподдерживаемый тип файла или повреждённый архив \"$1\"" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Установка мода: файл \"$1\"" +"Установка мода: не удаётся найти подходящую папку для набора модов «$1»" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" -"Установка мода: не удаётся найти подходящий каталог для мода или пакета " -"модов $1" +"Установка мода: не удаётся найти подходящий каталог для мода или пакета модов" #: builtin/mainmenu/pkgmgr.lua +#, fuzzy msgid "Unable to install a $1 as a texture pack" -msgstr "Не удаётся установить $1 как пакет текстур" +msgstr "Не удаётся установить $1 как набор текстур" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a game as a $1" @@ -652,6 +849,62 @@ msgstr "Не удаётся установить мод как $1" msgid "Unable to install a modpack as a $1" msgstr "Не удаётся установить пакет модов как $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Загрузка..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Публичный список серверов отключён" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Попробуйте обновить список публичных серверов и проверьте связь с Интернетом." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Об игре" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Активные участники" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Активный визуализатор:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Основные разработчики" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Открыть папку данных пользователя" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +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 "Прошлые участники" + +#: builtin/mainmenu/tab_about.lua +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 "Поиск дополнений в сети" @@ -661,8 +914,9 @@ msgid "Content" msgstr "Дополнения" #: builtin/mainmenu/tab_content.lua +#, fuzzy msgid "Disable Texture Pack" -msgstr "Отключить пакет текстур" +msgstr "Отключить набор текстур" #: builtin/mainmenu/tab_content.lua msgid "Information:" @@ -689,28 +943,9 @@ msgid "Uninstall Package" msgstr "Удалить дополнение" #: builtin/mainmenu/tab_content.lua +#, fuzzy msgid "Use Texture Pack" -msgstr "Использовать пакет текстур" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Активные участники" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Основные разработчики" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Благодарности" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Прошлые участники" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Прошлые разработчики" +msgstr "Использовать набор текстур" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" @@ -718,17 +953,13 @@ msgstr "Публичный сервер" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" -msgstr "Адрес привязки" +msgstr "Привязать Адрес" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Настроить" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Режим творчества" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Включить урон" @@ -742,11 +973,7 @@ msgstr "Запустить сервер" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "Установите игры из ContentDB" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Имя/Пароль" +msgstr "Установить игры из ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -760,10 +987,14 @@ msgstr "Мир не создан или не выбран!" msgid "Play Game" msgstr "Играть" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Порт" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Выберите моды" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Выберите мир:" @@ -777,47 +1008,63 @@ msgid "Start Game" msgstr "Начать игру" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Адрес / Порт" +msgid "Address" +msgstr "Адрес" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Подключиться" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Очистить" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Режим творчества" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Урон включён" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Урон / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" -"Убрать из\n" -"избранных" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Избранное" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "В избранные" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Несовместимые серверы" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Подключиться к игре" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Имя / Пароль" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua +#, fuzzy msgid "Ping" -msgstr "Пинг" +msgstr "Задержка" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP разрешён" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Публичные серверы" + +#: builtin/mainmenu/tab_online.lua +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" @@ -843,10 +1090,6 @@ msgstr "Все настройки" msgid "Antialiasing:" msgstr "Сглаживание:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Уверены, что хотите сбросить мир одиночной игры?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Запоминать размер окна" @@ -855,10 +1098,6 @@ msgstr "Запоминать размер окна" msgid "Bilinear Filter" msgstr "Билинейная фильтрация" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Бампмаппинг" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Смена управления" @@ -867,33 +1106,49 @@ msgstr "Смена управления" msgid "Connected Glass" msgstr "Стёкла без швов" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Динамические тени" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Динамические тени: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Красивая листва" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Создавать карты нормалей" +msgid "High" +msgstr "Высокое" #: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Низкое" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Среднее" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Mipmap" -msgstr "Мипмаппинг" +msgstr "Размытие текстур" #: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Mipmap + Aniso. Filter" -msgstr "Мипмаппинг + анизотр. фильтр" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Нет" +msgstr "Размытие текстур + анизотр. фильтр" #: builtin/mainmenu/tab_settings.lua msgid "No Filter" -msgstr "Без фильтрации (пиксельное)" +msgstr "Без фильтрации" #: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "No Mipmap" -msgstr "Без мипмаппинга" +msgstr "Без размытия текстур" #: builtin/mainmenu/tab_settings.lua msgid "Node Highlighting" @@ -905,7 +1160,7 @@ msgstr "Обводка нод" #: builtin/mainmenu/tab_settings.lua msgid "None" -msgstr "Нет" +msgstr "Ничего" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" @@ -915,18 +1170,10 @@ msgstr "Непрозрачная листва" msgid "Opaque Water" msgstr "Непрозрачная вода" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Объёмные текстуры" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Частицы" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Сброс одиночной игры" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Экран:" @@ -939,6 +1186,10 @@ msgstr "Настройки" msgid "Shaders" msgstr "Шейдеры" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Шейдеры (экспериментально)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Шейдеры (недоступно)" @@ -955,53 +1206,49 @@ msgstr "Мягкое освещение" msgid "Texturing:" msgstr "Текстурирование:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Для включения шейдеров необходим драйвер OpenGL." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Тональное отображение" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "Порог чувствительности: (px)" +#, fuzzy +msgid "Touch threshold (px):" +msgstr "Чувствительность: (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Трилинейная фильтрация" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Сверхвысокое" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Очень низкое" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Покачивание листвы" #: builtin/mainmenu/tab_settings.lua msgid "Waving Liquids" -msgstr "Покачивание жидкостей" +msgstr "Волнистые жидкости" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" msgstr "Покачивание растений" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Да" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Настройка модов" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Главное меню" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Начать одиночную игру" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Ошибка соединения (время вышло?)" + +#: src/client/client.cpp src/client/game.cpp +#, fuzzy msgid "Connection timed out." -msgstr "Тайм-аут соединения." +msgstr "Время ожидания соединения истекло." #: src/client/client.cpp msgid "Done!" @@ -1025,11 +1272,11 @@ msgstr "Сборка шейдеров..." #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "Ошибка соединения (тайм-аут?)" +msgstr "Ошибка соединения (время вышло?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Невозможно найти или загрузить игру \"" +msgid "Could not find or load game: " +msgstr "Не удалось найти или загрузить игру: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1059,18 +1306,6 @@ msgstr "Не удалось открыть указанный файл с пар msgid "Provided world path doesn't exist: " msgstr "По этому пути мира нет: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1083,14 +1318,6 @@ msgstr "" msgid "- Address: " msgstr "- Адрес: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Режим творчества: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Урон: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Режим: " @@ -1105,13 +1332,23 @@ msgstr "- Публичность: " #. ~ PvP = Player versus Player #: src/client/game.cpp +#, fuzzy msgid "- PvP: " -msgstr "- PvP: " +msgstr "- Режим сражения: " #: src/client/game.cpp msgid "- Server Name: " msgstr "- Имя сервера: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Произошла ошибка сериализации:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Доступ запрещен. Причина: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Автобег отключён" @@ -1120,14 +1357,35 @@ msgstr "Автобег отключён" msgid "Automatic forward enabled" msgstr "Автобег включён" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Границы блока скрыты" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Границы показаны для всех блоков" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Границы показаны для текущего блока" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Границы показаны для блоков рядом" + #: src/client/game.cpp msgid "Camera update disabled" -msgstr "Обновление камеры отключено" +msgstr "Обновление камеры выключено" #: src/client/game.cpp msgid "Camera update enabled" msgstr "Обновление камеры включено" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Нельзя показать границы блока (нужна привилегия 'basic_debug')" + #: src/client/game.cpp msgid "Change Password" msgstr "Изменить пароль" @@ -1141,13 +1399,22 @@ msgid "Cinematic mode enabled" msgstr "Режим кино включён" #: src/client/game.cpp +msgid "Client disconnected" +msgstr "Клиент отключился" + +#: src/client/game.cpp +#, fuzzy msgid "Client side scripting is disabled" -msgstr "Клиентские моды отключены" +msgstr "Пользовательские моды отключены" #: src/client/game.cpp msgid "Connecting to server..." msgstr "Подключение к серверу..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Сбой соединения по неизвестной причине" + #: src/client/game.cpp msgid "Continue" msgstr "Продолжить" @@ -1160,13 +1427,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1176,15 +1443,20 @@ msgstr "" "- %s: влево\n" "- %s: вправо\n" "- %s: прыжок/подъём\n" +"- %s: копать/удар\n" +"- %s: разместить/использовать\n" "- %s: красться/спуск\n" "- %s: бросить предмет\n" "- %s: инвентарь\n" "- Мышь: поворот/обзор\n" -"- ЛКМ: копать/удар\n" -"- ПКМ: положить/использовать\n" "- Колесо мыши: выбор предмета\n" "- %s: чат\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Не удалось разрешить адрес: %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "Создание клиента..." @@ -1242,6 +1514,11 @@ msgstr "Ограничение видимости включено" 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 "Выход в меню" @@ -1272,7 +1549,7 @@ msgstr "Режим полёта включён" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "Режим полёта включён (но: нет привилегии «fly»)" +msgstr "Режим полёта включён (но нет привилегии «fly»)" #: src/client/game.cpp msgid "Fog disabled" @@ -1315,32 +1592,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Миникарта сейчас отключена игрой или модом" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Миникарта скрыта" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Миникарта в режиме радара, увеличение x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Миникарта в режиме радара, увеличение x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Миникарта в режиме радара, увеличение x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Миникарта в поверхностном режиме, увеличение x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Миникарта в поверхностном режиме, увеличение x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Миникарта в поверхностном режиме, увеличение x4" +msgid "Multiplayer" +msgstr "Мультиплеер" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1352,7 +1605,7 @@ msgstr "Режим прохождения сквозь стены включён #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "Режим прохождения сквозь стены включён (но: нет привилегии «noclip»)" +msgstr "Режим прохождения сквозь стены включён (но нет привилегии «noclip»)" #: src/client/game.cpp msgid "Node definitions..." @@ -1414,6 +1667,21 @@ msgstr "Звук не поддерживается в этой сборке" msgid "Sound unmuted" msgstr "Звук включён" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +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" @@ -1483,10 +1751,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Очистить" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1509,7 +1773,7 @@ msgstr "Выполнить" #: src/client/keycode.cpp msgid "Help" -msgstr "Справка" +msgstr "Помощь" #: src/client/keycode.cpp msgid "Home" @@ -1517,23 +1781,23 @@ msgstr "Home" #: src/client/keycode.cpp msgid "IME Accept" -msgstr "IME Accept" +msgstr "Принять IME" #: src/client/keycode.cpp msgid "IME Convert" -msgstr "IME Convert" +msgstr "Конвертировать IME" #: src/client/keycode.cpp msgid "IME Escape" -msgstr "IME Escape" +msgstr "Экранировать IME" #: src/client/keycode.cpp msgid "IME Mode Change" -msgstr "IME Mode Change" +msgstr "Изменить режим IME" #: src/client/keycode.cpp msgid "IME Nonconvert" -msgstr "IME Nonconvert" +msgstr "Неконвертируемый IME" #: src/client/keycode.cpp msgid "Insert" @@ -1541,7 +1805,7 @@ msgstr "Insert" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Left" -msgstr "Влево" +msgstr "Лево" #: src/client/keycode.cpp msgid "Left Button" @@ -1566,7 +1830,7 @@ msgstr "Левый Win" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp msgid "Menu" -msgstr "Menu" +msgstr "Контекстное меню" #: src/client/keycode.cpp msgid "Middle Button" @@ -1590,7 +1854,7 @@ msgstr "Доп. клав. -" #: src/client/keycode.cpp msgid "Numpad ." -msgstr "Цифр. клав. '.'" +msgstr "Цифр. кл. ." #: src/client/keycode.cpp msgid "Numpad /" @@ -1659,7 +1923,7 @@ msgstr "Играть" #. ~ "Print screen" key #: src/client/keycode.cpp msgid "Print" -msgstr "Print" +msgstr "PrtSc" #: src/client/keycode.cpp msgid "Return" @@ -1704,7 +1968,7 @@ msgstr "Shift" #: src/client/keycode.cpp msgid "Sleep" -msgstr "Sleep" +msgstr "Спать" #: src/client/keycode.cpp msgid "Snapshot" @@ -1734,37 +1998,39 @@ msgstr "Доп. кнопка 2" msgid "Zoom" msgstr "Приближение" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Пароли не совпадают!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Миникарта скрыта" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Регистрация и подключение" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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" -"Пожалуйста, введите пароль ещё раз и нажмите «Регистрация и подключение», " -"чтобы подтвердить создание аккаунта, либо нажмите «Отмена», чтобы прервать " -"операцию." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Миникарта в режиме радара, увеличение x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Миникарта в поверхностном режиме, увеличение x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Минимальный размер текстуры" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Не удалось открыть веб-страницу" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Открытие страницы" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Продолжить" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "Использовать = спуск" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = спуск" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1774,17 +2040,26 @@ msgstr "Автобег" msgid "Automatic jumping" msgstr "Автопрыжок" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Назад" #: src/gui/guiKeyChangeMenu.cpp -msgid "Change camera" -msgstr "Камера" +msgid "Block bounds" +msgstr "Границы блока" #: src/gui/guiKeyChangeMenu.cpp +#, fuzzy +msgid "Change camera" +msgstr "Сменить угол" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" -msgstr "Сообщение" +msgstr "Чат" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" @@ -1816,11 +2091,11 @@ msgstr "Вперёд" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. range" -msgstr "Видимость +" +msgstr "Увеличить видимость" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" -msgstr "Громкость +" +msgstr "Увеличить громкость" #: src/gui/guiKeyChangeMenu.cpp msgid "Inventory" @@ -1835,18 +2110,16 @@ 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" -msgstr "Команда клиента" +msgstr "Локальная команда" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" -msgstr "Звук" +msgstr "Заглушить" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" @@ -1858,27 +2131,23 @@ msgstr "Пред. предмет" #: src/gui/guiKeyChangeMenu.cpp msgid "Range select" -msgstr "Видимость" +msgstr "Дальность прорисовки" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Screenshot" -msgstr "Cкриншот" +msgstr "Снимок экрана" #: src/gui/guiKeyChangeMenu.cpp msgid "Sneak" msgstr "Красться" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Использовать" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" -msgstr "Игровой интерфейс" +msgstr "Вкл/выкл игровой интерфейс" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle chat log" -msgstr "Чат" +msgstr "Вкл/выкл историю чата" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" @@ -1906,16 +2175,12 @@ msgstr "По наклону взгляда" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" -msgstr "нажмите ..." +msgstr "нажмите клавишу" #: src/gui/guiPasswordChange.cpp msgid "Change" msgstr "Изменить" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Подтверждение пароля" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Новый пароль" @@ -1924,6 +2189,10 @@ msgstr "Новый пароль" msgid "Old Password" msgstr "Старый пароль" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Пароли не совпадают!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Выход" @@ -1933,14 +2202,9 @@ msgid "Muted" msgstr "Заглушить" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Громкость звука: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Введите " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Громкость звука: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1949,6 +2213,16 @@ msgstr "Введите " msgid "LANG_CODE" msgstr "ru" +#: 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" @@ -1960,12 +2234,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Использовать виртуальный джойстик для активации кнопки \"aux\".\n" -"Если включено, виртуальный джойстик также будет нажимать кнопку \"aux\", " +"(Android) Использовать виртуальный джойстик для активации кнопки \"Aux1\".\n" +"Если включено, виртуальный джойстик также будет нажимать кнопку \"Aux1\", " "когда будет находиться за пределами основного колеса." #: src/settings_translation_file.cpp @@ -1999,20 +2273,13 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" -"(Х,Y,Z) шкала фрактала в нодах.\n" -"Фактический фрактальный размер будет в 2-3 раза больше.\n" -"Эти числа могут быть очень большими, фракталу нет нужды заполнять мир.\n" -"Увеличьте их, чтобы увеличить «масштаб» детали фрактала.\n" -"Для вертикально сжатой фигуры, что подходит\n" -"острову, сделайте все 3 числа равными для необработанной формы." - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = Параллакс окклюзии с информацией о склоне (быстро).\n" -"1 = Рельефный маппинг (медленно, но качественно)." +"(Х,Y,Z) масштаб фрактала в нодах.\n" +"Фактический размер фрактала будет в 2-3 раза больше.\n" +"Эти числа могут быть очень большими, фракталу нет нужды\n" +"заполнять мир. Увеличьте их, чтобы увеличить «масштаб»\n" +"детали фрактала. По умолчанию значения подходят для\n" +"вертикально сжатой фигуры, что подходит острову, для\n" +"необработанной формы сделайте все 3 значения равными." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." @@ -2053,21 +2320,21 @@ msgid "3D mode" msgstr "3D-режим" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Сила карт нормалей" +msgstr "Сила параллакса в 3D-режиме" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." msgstr "3D-шум, определяющий огромные пещеры." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" -"3D-шум, определяющий структуру гор и их высоту.\n" -"Также определяет структуру гор на парящих островах." +"3D-шум, определяющий строение гор и их высоту.\n" +"Также определяет строение гор на парящих островах." #: src/settings_translation_file.cpp msgid "" @@ -2076,10 +2343,16 @@ 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 шум, определяющий строение парящих островов.\n" +"Если изменен по-умолчанию, 'уровень' шума (0.7 по-умолчанию) возможно " +"необходимо установить,\n" +"так как функции сужения парящих островов лучше всего работают, \n" +"когда значение шума находиться в диапазоне от -2.0 до 2.0." #: src/settings_translation_file.cpp +#, fuzzy msgid "3D noise defining structure of river canyon walls." -msgstr "3D-шум, определяющий структуру стен речного каньона." +msgstr "3D-шум, определяющий строение стен речного каньона." #: src/settings_translation_file.cpp msgid "3D noise defining terrain." @@ -2088,7 +2361,7 @@ msgstr "Трёхмерный шум, определяющий рельеф ме #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." msgstr "" -"3D-шум для горных выступов, скал и т. д. В основном небольшие вариации." +"3D шум для горных выступов, скал и т. д. В основном небольшие вариации." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." @@ -2109,15 +2382,19 @@ msgid "" msgstr "" "Поддержка 3D.\n" "Сейчас поддерживаются:\n" -"- none: 3D-режим отключён.\n" -"- anaglyph: голубой/пурпурный цвет в 3D.\n" -"- interlaced: чётные/нечётные линии отображают два разных кадра для " -"экранов, поддерживающих поляризацию.\n" -"- topbottom: Разделение экрана верх/низ\n" -"- sidebyside: Разделение экрана право/лево.\n" -"- pageflip: Четырёхкратная буферизация (QuadBuffer).\n" +"- none: Нет.\n" +"- anaglyph: Анаглифные очки.\n" +"- interlaced: Поляризационные 3d-очки.\n" +"- topbottom: Разделение экрана по горизонтали.\n" +"- sidebyside: Разделение экрана по диагонали.\n" +"- crossview: 3D на основе автостереограммы.\n" +"- pageflip: Четырёхкратная буферизация.\n" "Примечание: в режиме interlaced шейдеры должны быть включены." +#: 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" @@ -2135,13 +2412,17 @@ msgid "A message to be displayed to all clients when the server shuts down." msgstr "Сообщение, которое будет показано всем при отключении сервера." #: src/settings_translation_file.cpp +#, fuzzy msgid "ABM interval" -msgstr "Интервал сохранения карты" +msgstr "ABM промежуток" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "Лимит времени ABM" #: src/settings_translation_file.cpp -#, fuzzy msgid "Absolute limit of queued blocks to emerge" -msgstr "Абсолютный лимит появляющихся запросов" +msgstr "Абсолютный предел появления блоков в очереди" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2156,8 +2437,9 @@ msgid "Active Block Modifiers" msgstr "Модификаторы активных блоков" #: src/settings_translation_file.cpp +#, fuzzy msgid "Active block management interval" -msgstr "Интервал управления активным блоком" +msgstr "Промежуток управления активным блоком" #: src/settings_translation_file.cpp msgid "Active block range" @@ -2173,9 +2455,9 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" -"Адрес, к которому присоединиться.\n" -"Оставьте это поле, чтобы запустить локальный сервер.\n" -"ПРИМЕЧАНИЕ: это поле адреса перезапишет эту настройку в главном меню." +"Адрес, к которому нужно присоединиться.\n" +"Оставьте это поле пустым, чтобы запустить локальный сервер.\n" +"Обратите внимание, что поле адреса в главном меню перезапишет эту настройку." #: src/settings_translation_file.cpp msgid "Adds particles when digging a node." @@ -2189,6 +2471,12 @@ msgstr "" "Настройка dpi (плотности точек на дюйм) для вашего экрана (не для X11, " "только для Android). Например для мониторов с разрешением в 4k." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Настройка обнаруженной плотности дисплея, используется для масштабирования " +"элементов интерфейса." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2198,6 +2486,18 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Регулирует плотность слоя парящих островов.\n" +"Увеличьте значение, чтобы увеличить плотность. Может быть положительным или " +"отрицательным.\n" +"Значение = 0,0: 50% o объема парящих островов.\n" +"Значение = 2,0 (может быть выше в зависимости от 'mgv7_np_floatland', всегда " +"проверяйте)\n" +"создает сплошной слой парящих островов." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Добавлять названия предметов" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2211,16 +2511,15 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" -"Изменяет кривую блеска, применяя к ней «гамма-\n" -"коррекцию». Более высокие значения делают средний \n" -"и нижний уровни света ярче. Значение «1.0» оставляет\n" -"кривую блеска без изменений. Это оказывает \n" -"существенное влияние только на дневной и \n" -"искусственный свет, он очень мало влияет на \n" -"естественный ночной свет." +"Изменяет кривую света, применяя к ней гамма-коррекцию.\n" +"Более высокие значения делают средние и низкие уровни света более яркими.\n" +"Значение 1.0 оставляет кривую света без изменений.\n" +"Это значительно влияет только на дневной и искусственный\n" +"свет, но имеет очень слабый эффект на естественный ночной свет." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Всегда включены полёт и ускорение" #: src/settings_translation_file.cpp @@ -2230,8 +2529,8 @@ msgstr "Гамма глобального затенения" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." msgstr "" -"Задаёт максимальное количество сообщений, которые клиент может отправить в " -"чат в течении 10 секунд." +"Задаёт предельное количество сообщений, которые клиент может отправить в чат " +"в течении 10 секунд." #: src/settings_translation_file.cpp msgid "Amplifies the valleys." @@ -2247,7 +2546,7 @@ msgstr "О сервере" #: src/settings_translation_file.cpp msgid "Announce to this serverlist." -msgstr "Анонсировать на этот список серверов." +msgstr "Оповещение в этот сервер-лист." #: src/settings_translation_file.cpp msgid "Append item name" @@ -2269,7 +2568,9 @@ msgstr "Инерция руки" msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." -msgstr "Делает более реалистичным движение руки персонажа при движении камеры." +msgstr "" +"Делает более правдоподобным движение руки\n" +"персонажа при движении камеры." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" @@ -2298,17 +2599,21 @@ msgstr "" "отключит эту оптимизацию.\n" "Указывается в блоках карты (16 нод)." +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" -msgstr "Клавиша авто-вперёд" +msgstr "Автоматическая кнопка вперед" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." -msgstr "Автоматически запрыгивать на препятствия высотой в одну ноду." +msgstr "Автоматический подъем на одиночные ноды." #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." -msgstr "Автоматически анонсировать в список серверов." +msgstr "Автоматическая жалоба на сервер-лист." #: src/settings_translation_file.cpp msgid "Autosave screen size" @@ -2316,7 +2621,15 @@ msgstr "Запоминать размер окна" #: src/settings_translation_file.cpp msgid "Autoscaling mode" -msgstr "Режим автомасштабирования" +msgstr "Режим автоматического масштабирования" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Клавиша Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Клавиша Aux1 для подъема/спуска" #: src/settings_translation_file.cpp msgid "Backward key" @@ -2324,19 +2637,16 @@ msgstr "Клавиша назад" #: src/settings_translation_file.cpp msgid "Base ground level" -msgstr "Уровень земли" +msgstr "Базовый уровень земли" #: src/settings_translation_file.cpp msgid "Base terrain height." msgstr "Высота основной местности." #: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Базовый" - -#: src/settings_translation_file.cpp +#, fuzzy msgid "Basic privileges" -msgstr "Базовые привилегии" +msgstr "Основные привилегии" #: src/settings_translation_file.cpp msgid "Beach noise" @@ -2355,28 +2665,29 @@ 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 msgid "Biome noise" msgstr "Шум биомов" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Бит на пиксель (глубина цвета) в полноэкранном режиме." - #: src/settings_translation_file.cpp 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 "Путь к жирному и курсивному шрифту" #: src/settings_translation_file.cpp msgid "Bold and italic monospace font path" -msgstr "Путь к жирному и курсиву моноширинного шрифта" +msgstr "Путь к жирному и курсивному моноширинному шрифту" #: src/settings_translation_file.cpp msgid "Bold font path" @@ -2395,8 +2706,9 @@ msgid "Builtin" msgstr "Встроенный" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Бампмаппинг" +#, fuzzy +msgid "Camera" +msgstr "Сменить угол" #: src/settings_translation_file.cpp msgid "" @@ -2477,33 +2789,24 @@ msgstr "" "где 0.0 — минимальный уровень света, а 1.0 — максимальный." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Изменение интерфейса в главном меню:\n" -"- Full: несколько однопользовательских миров, выбор игры, выбор пакета " -"текстур и т. д.\n" -"- Simple: один однопользовательский мир без выбора игр или текстур. Может " -"быть полезно для небольших экранов." +msgid "Chat command time message threshold" +msgstr "Порог cообщения команды чата" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Команды чата" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "Размер шрифта" +msgstr "Размер шрифта чата" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Кнопка чата" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Отладочный уровень" +msgstr "Уровень журнала чата" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2514,20 +2817,22 @@ msgid "Chat message format" msgstr "Формат сообщений в чате" #: src/settings_translation_file.cpp +#, fuzzy msgid "Chat message kick threshold" -msgstr "Максимальное количество сообщений в чате (для отключения)" +msgstr "Предельное количество сообщений в чате (для отключения)" #: src/settings_translation_file.cpp +#, fuzzy msgid "Chat message max length" -msgstr "Максимальная длина сообщения в чате" +msgstr "Предельная длина сообщения в чате" #: src/settings_translation_file.cpp msgid "Chat toggle key" msgstr "Кнопка переключения чата" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Команды в чате" +msgid "Chat weblinks" +msgstr "Сетевые ссылки в чате" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2545,6 +2850,12 @@ msgstr "Кнопка переключения в кинематографиче msgid "Clean transparent textures" msgstr "Очистить прозрачные текстуры" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "Нажимающиеся ссылки (СКМ или Ctrl+ЛКМ) включены в консоли." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Клиент" @@ -2565,6 +2876,11 @@ msgstr "Ограничения моддинга на стороне клиент 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 "Скорость подъёма" @@ -2589,6 +2905,10 @@ msgstr "Облака в меню" msgid "Colored fog" msgstr "Цветной туман" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Цветные тени" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2601,7 +2921,8 @@ msgid "" msgstr "" "Разделённый запятыми список меток, которые можно скрывать в репозитории.\n" "\"nonfree\" можно использовать, чтобы скрыть пакеты, которые не являются " -"свободным программным обеспечением по определению Free Software Foundation.\n" +"'свободным программным обеспечением'\n" +" по определению Free Software Foundation.\n" "Также вы можете назначить рейтинг.\n" "Метки не зависят от версии Minetest,\n" "узнать полный список можно на https://content.minetest.net/help/" @@ -2612,22 +2933,49 @@ 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 "" -"Список доверенных модов через запятую, которым разрешён доступ к HTTP API, " -"что позволяет им отправлять и принимать данные через Интернет." +"Разделённый запятыми список модов, у которых есть доступ к HTTP API,\n" +"что позволяет им загружать и отдавать данные по интернету." #: 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 "" -"Список доверенных модов через запятую, которым разрешён доступ к " -"небезопасным функциям даже когда включена защита модов (через " +"Разделённый запятыми список доверенных модов, которым разрешён\n" +"доступ к небезопасным функциям, даже когда включена защита модов (через " "request_insecure_environment())." #: src/settings_translation_file.cpp msgid "Command key" msgstr "Команда" +#: src/settings_translation_file.cpp +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 "" +"Уровень сжатия для использования при сохранении картографических блоков на " +"диске.\n" +"-1 - уровень сжатия по умолчанию\n" +"0 - без сжатия, самый быстрый\n" +"9 - лучшее сжатие, самое медленное\n" +"(уровни 1-3 используют \"быстрый\" метод Zlib, 4-9 используют обычный метод)" + +#: src/settings_translation_file.cpp +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 "" +"Уровень сжатия для использования при отправке блоков карты клиенту.\n" +"-1 - уровень сжатия по умолчанию\n" +"0 - без компрессора, самый быстрый\n" +"9 - лучшее сжатие, самое медленное\n" +"(уровни 1-3 используют \"быстрый\" метод Zlib, 4-9 используют обычный метод)" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Стёкла без швов" @@ -2652,10 +3000,20 @@ msgstr "Цвет в консоли" 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" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "ContentDB Max Concurrent Downloads" +msgstr "Предельное количество одновременных загрузок ContentDB" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "Адрес ContentDB" @@ -2687,8 +3045,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." @@ -2723,16 +3083,24 @@ msgid "Crosshair alpha" msgstr "Прозрачность перекрестия" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Прозрачность прицела (от 0 (прозрачно) до 255 (непрозрачно))." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Прозрачность прицела (от 0 (прозрачно) до 255 (непрозрачно)).\n" +"Также контролирует цвет перекрестия объекта." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Цвет перекрестия" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Цвет перекрестия (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Цвет прицела (R, G, B).\n" +"Также контролирует цвет перекрестия объекта" #: src/settings_translation_file.cpp msgid "DPI" @@ -2755,12 +3123,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" @@ -2797,15 +3165,17 @@ msgstr "Формат отчёта по умолчанию" #: src/settings_translation_file.cpp #, fuzzy msgid "Default stack size" -msgstr "Стандартная игра" +msgstr "Размер стопки по умолчанию" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Стандартный тайм-аут для cURL, заданный в миллисекундах.\n" -"Работает только на сборках с cURL." +"Определите качество фильтрации теней.\n" +"Это имитирует эффект мягких теней, применяя PCF или пуассоновский диск\n" +"но также использует больше ресурсов." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2831,21 +3201,14 @@ msgstr "" "Определяет полный размер пещер, меньшие значения создают большие пещеры." #: src/settings_translation_file.cpp +#, fuzzy msgid "Defines large-scale river channel structure." -msgstr "Определяет крупномасштабную структуру каналов рек." +msgstr "Определяет крупномасштабное строение каналов рек." #: src/settings_translation_file.cpp msgid "Defines location and terrain of optional hills and lakes." msgstr "Определяет расположение и поверхность дополнительных холмов и озёр." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Определяет шаг выборки текстуры.\n" -"Более высокое значение приводит к более гладким картам нормалей." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Определяет базовый уровень земли." @@ -2855,9 +3218,10 @@ msgid "Defines the depth of the river channel." msgstr "Определяет глубину русла реки." #: src/settings_translation_file.cpp +#, fuzzy msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "" -"Определяет максимальное расстояние перемещения игрока в блоках (0 = " +"Определяет предельное расстояние перемещения игрока в блоках (0 = " "неограниченное)." #: src/settings_translation_file.cpp @@ -2873,13 +3237,14 @@ msgid "Defines tree areas and tree density." msgstr "Определяет области и плотность деревьев." #: src/settings_translation_file.cpp +#, fuzzy 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 "" "Задержка между обновлением мешей на клиенте в миллисекундах. Увеличение " "этого значения\n" -"замедлит темп обновления мешей, тем самым уменьшая колебания кадровой " +"замедлит скорость обновления мешей, тем самым уменьшая колебания кадровой " "частоты на медленных клиентах." #: src/settings_translation_file.cpp @@ -2895,8 +3260,9 @@ msgid "Deprecated Lua API handling" msgstr "Обработка устаревшего Lua API" #: src/settings_translation_file.cpp +#, fuzzy msgid "Depth below which you'll find giant caverns." -msgstr "Глубина, ниже которой встречаются гигантские пещеры." +msgstr "Глубина, ниже которой встречаются крупные пещеры." #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." @@ -2926,6 +3292,15 @@ msgstr "" 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 "Частицы при рытье" @@ -2938,6 +3313,16 @@ msgstr "Отключить анти-чит" msgid "Disallow empty passwords" msgstr "Запретить пустой пароль" +#: src/settings_translation_file.cpp +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 "Доменное имя сервера, отображаемое в списке серверов." @@ -2976,7 +3361,7 @@ msgid "" "Required for IPv6 connections to work at all." msgstr "" "Включить поддержку IPv6 (для клиента и сервера).\n" -"Необходимо для работы IPv6-соединений." +"Требуется для того, чтобы вообще соединяться по IPv6." #: src/settings_translation_file.cpp msgid "" @@ -2986,18 +3371,41 @@ msgstr "" "Включить поддержку Lua-моддинга на клиенте.\n" "Эта поддержка является экспериментальной и API может измениться." +#: 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 "" +"Включить фильтрацию диска Пуассона.\n" +"По истине использует диск Пуассона для создания \"мягких теней\". Иначе " +"используется фильтрация PCF." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Включить цветные тени.\n" +"На истинно полупрозрачных узлах отбрасываются цветные тени. Это ресурсоёмко." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Включить окно консоли" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Включить творческий режим для вновь созданных карт." +msgid "Enable creative mode for all players" +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 "Включить поддержку каналов модов." @@ -3014,18 +3422,6 @@ msgstr "Включить получение игроками урона и их 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" @@ -3034,6 +3430,10 @@ msgstr "" "Включить мягкое освещение с простым глобальным затенением.\n" "Отключите для более высокой скорости или другого внешнего вида." +#: 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" @@ -3094,22 +3494,15 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" +"Включает кинематографическое отображение тонов «Uncharted 2».\n" +"Имитирует кривую тона фотопленки и приближает\n" +"изображение к большему динамическому диапазону. Средний контраст слегка\n" +"усиливается, блики и тени постепенно сжимаются." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." msgstr "Включить анимацию предметов в инвентаре." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Включает бампмаппинг для текстур. Карты нормалей должны быть предоставлены\n" -"пакетом текстур или сгенерированы автоматически.\n" -"Требует, чтобы шейдеры были включены." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Включает кэширование повёрнутых мешей." @@ -3118,22 +3511,6 @@ msgstr "Включает кэширование повёрнутых мешей. msgid "Enables minimap." msgstr "Включить мини-карту." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Включает генерацию карт нормалей \"на лету\" (эффект тиснения).\n" -"Требует, чтобы бампмаппинг был включён." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Включает Parallax Occlusion.\n" -"Требует, чтобы шейдеры были включены." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3147,21 +3524,28 @@ msgstr "" "Изменение этого параметра требует перезапуска." #: 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 "" +"Обеспечивает компромисс, который снижает использование ЦП или увеличивает " +"производительность рендеринга\n" +"ценой мелких визуальных дефектов, не влияющих на геймплей." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "Профиль долины" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Engine profiling data print interval" -msgstr "Интервал печати данных профилирования движка" +msgstr "Промежуток печати данных профилирования движка" #: src/settings_translation_file.cpp msgid "Entity methods" msgstr "Методы сущностей" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Экспериментальная опция, может привести к видимым зазорам\n" -"между блоками, когда значение больше, чем 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3171,10 +3555,20 @@ msgid "" "Values < 1.0 (for example 0.25) create a more defined surface level with\n" "flatter lowlands, suitable for a solid floatland layer." msgstr "" +"Степень сужения парящих островов. Изменяет характер сужения.\n" +"Значение = 1.0 задает равномерное, линейное сужение.\n" +"Значения > 1.0 задают гладкое сужение, подходит для отдельных\n" +" парящих островов по-умолчанию.\n" +"Значения < 1.0 (например, 0.25) задают более точный уровень поверхности\n" +"с более плоскими низинами, подходит для массивного уровня парящих островов." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "Кадровая частота во время паузы" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "Максимум кадровой частоты при паузе или когда окно вне фокуса" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3192,18 +3586,6 @@ msgstr "Коэффициент покачивания при падении" msgid "Fallback font path" msgstr "Путь к резервному шрифту" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Тень резервного шрифта" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Прозрачность тени резервного шрифта" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Размер резервного шрифта" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Клавиша ускорения" @@ -3222,19 +3604,19 @@ msgstr "Быстрое перемещение" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Быстрое перемещение (с помощью клавиши «Использовать»).\n" +"Быстрое перемещение (с помощью клавиши \"Aux1\").\n" "Это требует привилегию 'fast' на сервере." #: src/settings_translation_file.cpp msgid "Field of view" -msgstr "Поле зрения" +msgstr "Угол обзора" #: src/settings_translation_file.cpp msgid "Field of view in degrees." -msgstr "Поле зрения в градусах." +msgstr "Угол обзора в градусах." #: src/settings_translation_file.cpp msgid "" @@ -3242,7 +3624,7 @@ msgid "" "the\n" "Multiplayer Tab." msgstr "" -"Файл в директории client/serverlist/, содержащий ваши избранные серверы\n" +"Файл в папке client/serverlist/, содержащий ваши избранные серверы\n" "из вкладки Мультиплеер." #: src/settings_translation_file.cpp @@ -3260,18 +3642,22 @@ msgstr "Кинематографическое тональное отображ #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" -"Отфильтрованные текстуры могут смешивать значения RGB с полностью\n" -"прозрачными соседними, которые оптимизаторы PNG обычно отбрасывают.\n" -"Иногда это может привести к тёмным или светлым краям полупрозрачных\n" -"текстур. Примените этот фильтр, чтобы исправить текстуру во время загрузки." +"Фильтрованные текстуры могут смешивать значения RGB с полностью прозрачными " +"соседними,\n" +"которые оптимизаторы PNG обычно отбрасывают, что часто приводит к темным " +"или\n" +"светлым краям прозрачных текстур. Примените фильтр для очистки\n" +"во время загрузки текстуры. Это автоматически включается, если включен " +"mipmapping." #: 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." @@ -3290,39 +3676,32 @@ msgid "Fixed virtual joystick" msgstr "Фиксация виртуального джойстика" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "Плотность гор на парящих островах" +msgstr "Плотность парящих островов" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "Максимальная Y подземелья" +msgstr "Максимальная Y парящих островов" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "Минимальная Y подземелья" +msgstr "Минимальная Y парящих островов" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Базовый шум парящих островов" +msgstr "Шум парящих островов" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "Экспонента гор на парящих островах" +msgstr "Экспонента конуса на парящих островах" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "Базовый шум парящих островов" +msgstr "Расстояние сужения парящих островов" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "Уровень парящих островов" +msgstr "Уровень воды на парящих островах" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3344,13 +3723,18 @@ msgstr "Граница тумана" 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 "Стандартный жирный шрифт" +msgstr "Жирный шрифт по умолчанию" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "Стандартный курсивный шрифт" +msgstr "Курсивный шрифт по умолчанию" #: src/settings_translation_file.cpp msgid "Font shadow" @@ -3365,22 +3749,42 @@ msgid "Font size" msgstr "Размер шрифта" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "Размер стандартного шрифта в пунктах (pt)." +msgid "Font size divisible by" +msgstr "Размер шрифта, кратный" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Размер резервного шрифта в пунктах (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Размер стандартного шрифта в пунктах (pt)" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "Размер моноширинного шрифта в пунктах (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Размер моноширинного шрифта в пунктах (pt)" #: 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 "" +"Размер шрифта последнего чата и подсказки чата в точке (pt).\n" +"Значение 0 будет использовать размер шрифта по умолчанию." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"Для шрифтов пиксельного стиля, которые плохо масштабируются, это " +"гарантирует, что размеры шрифта, используемые\n" +"с этим шрифтом всегда будут кратны этому значению в пикселях. Например,\n" +"пиксельный шрифт высотой 16 пикселей должен иметь значение 16, поэтому он " +"всегда будет иметь только\n" +"16, 32, 48 и т.д., поэтому мод, запрашивающий размер 25, получит 32." #: src/settings_translation_file.cpp msgid "" @@ -3393,8 +3797,9 @@ msgstr "" "@name, @message, @timestamp (необязательно)" #: src/settings_translation_file.cpp +#, fuzzy msgid "Format of screenshots." -msgstr "Формат скриншотов." +msgstr "Формат снимков экрана." #: src/settings_translation_file.cpp msgid "Formspec Default Background Color" @@ -3430,7 +3835,7 @@ msgstr "Непрозрачность фона формы в полноэкран #: src/settings_translation_file.cpp msgid "Forward key" -msgstr "Клавиша вперёд" +msgstr "Клавиша вперёд" #: src/settings_translation_file.cpp msgid "Fourth of 4 2D noises that together define hill/mountain range height." @@ -3445,10 +3850,6 @@ msgstr "Тип фрактала" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Часть видимого расстояния, на которой начинает появляться туман" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Шрифты FreeType" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3481,10 +3882,6 @@ msgstr "" msgid "Full screen" msgstr "Полный экран" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Глубина цвета в полноэкранном режиме" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Полноэкранный режим." @@ -3502,8 +3899,17 @@ msgid "GUI scaling filter txr2img" msgstr "Фильтр txr2img для масштабирования интерфейса" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Генерировать карты нормалей" +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" @@ -3513,34 +3919,46 @@ msgstr "Глобальные обратные вызовы" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Глобальные атрибуты генерации карт.\n" -"В картогенераторе v6 флаг «decorations» не влияет на деревья\n" -"и траву в джунглях, в остальных генераторах этот флаг\n" -"контролирует все декорации." +"В картогенераторе v6 флаг «decorations» не влияет на деревья и траву\n" +"в джунглях, в остальных генераторах этот флаг контролирует все декорации." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." -msgstr "Градиент кривой света на максимальном уровне освещённости." +msgstr "" +"Градиент кривой света на максимальном уровне освещённости.\n" +"Контролирует контрастность самых высоких уровней освещенности." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." -msgstr "Градиент кривой света на минимальном уровне освещённости." +msgstr "" +"Градиент кривой света на минимальном уровне освещённости.\n" +"Контролирует контрастность самых низких уровней освещенности." #: src/settings_translation_file.cpp 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 +#, fuzzy msgid "Gravity" -msgstr "Гравитация" +msgstr "Притяжение" #: src/settings_translation_file.cpp msgid "Ground level" @@ -3548,31 +3966,34 @@ msgstr "Уровень земли" #: src/settings_translation_file.cpp msgid "Ground noise" -msgstr "Шум грунта" +msgstr "Шум земли" #: src/settings_translation_file.cpp msgid "HTTP mods" msgstr "Моды HTTP" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "Масштаб игрового интерфейса" +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "Масштабирование интерфейса" #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "Клавиша переключения игрового интерфейса" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Обработка устаревших вызовов Lua API:\n" -"- legacy: (пытаться) имитировать прежнее поведение (по умолчанию для " -"релиза).\n" +"- none: не записывать устаревшие вызовы\n" "- log: имитировать и журналировать устаревшие вызовы (по умолчанию для " "отладки).\n" "- error: прерывание при использовании устаревших вызовов (рекомендовано " @@ -3600,8 +4021,11 @@ msgid "Heat noise" msgstr "Шум теплоты" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "Высота окна при запуске." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Компонент высоты начального размера окна. Игнорируется в полноэкранном " +"режиме." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3611,10 +4035,6 @@ msgstr "Шум высоты" msgid "Height select noise" msgstr "Шум выбора высоты" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Высокоточный FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Крутизна холмов" @@ -3677,135 +4097,135 @@ msgstr "Предыдущий предмет на горячей панели" #: src/settings_translation_file.cpp msgid "Hotbar slot 1 key" -msgstr "Предмет 1 на горячей панели" +msgstr "Быстрая кнопка 1" #: src/settings_translation_file.cpp msgid "Hotbar slot 10 key" -msgstr "Предмет 10 на горячей панели" +msgstr "Быстрая кнопка 10" #: src/settings_translation_file.cpp msgid "Hotbar slot 11 key" -msgstr "Предмет 11 на горячей панели" +msgstr "Быстрая кнопка 11" #: src/settings_translation_file.cpp msgid "Hotbar slot 12 key" -msgstr "Предмет 12 на горячей панели" +msgstr "Быстрая кнопка 12" #: src/settings_translation_file.cpp msgid "Hotbar slot 13 key" -msgstr "Предмет 13 на горячей панели" +msgstr "Быстрая кнопка 13" #: src/settings_translation_file.cpp msgid "Hotbar slot 14 key" -msgstr "Предмет 14 на горячей панели" +msgstr "Быстрая кнопка 14" #: src/settings_translation_file.cpp msgid "Hotbar slot 15 key" -msgstr "Предмет 15 на горячей панели" +msgstr "Быстрая кнопка 15" #: src/settings_translation_file.cpp msgid "Hotbar slot 16 key" -msgstr "Предмет 16 на горячей панели" +msgstr "Быстрая кнопка 16" #: src/settings_translation_file.cpp msgid "Hotbar slot 17 key" -msgstr "Предмет 17 на горячей панели" +msgstr "Быстрая кнопка 17" #: src/settings_translation_file.cpp msgid "Hotbar slot 18 key" -msgstr "Предмет 18 на горячей панели" +msgstr "Быстрая кнопка 18" #: src/settings_translation_file.cpp msgid "Hotbar slot 19 key" -msgstr "Предмет 19 на горячей панели" +msgstr "Быстрая кнопка 19" #: src/settings_translation_file.cpp msgid "Hotbar slot 2 key" -msgstr "Предмет 2 на горячей панели" +msgstr "Быстрая кнопка 2" #: src/settings_translation_file.cpp msgid "Hotbar slot 20 key" -msgstr "Предмет 20 на горячей панели" +msgstr "Быстрая кнопка 20" #: src/settings_translation_file.cpp msgid "Hotbar slot 21 key" -msgstr "Предмет 21 на горячей панели" +msgstr "Быстрая кнопка 21" #: src/settings_translation_file.cpp msgid "Hotbar slot 22 key" -msgstr "Предмет 22 на горячей панели" +msgstr "Быстрая кнопка 22" #: src/settings_translation_file.cpp msgid "Hotbar slot 23 key" -msgstr "Предмет 23 на горячей панели" +msgstr "Быстрая кнопка 23" #: src/settings_translation_file.cpp msgid "Hotbar slot 24 key" -msgstr "Предмет 24 на горячей панели" +msgstr "Быстрая кнопка 24" #: src/settings_translation_file.cpp msgid "Hotbar slot 25 key" -msgstr "Предмет 25 на горячей панели" +msgstr "Быстрая кнопка 25" #: src/settings_translation_file.cpp msgid "Hotbar slot 26 key" -msgstr "Предмет 26 на горячей панели" +msgstr "Быстрая кнопка 26" #: src/settings_translation_file.cpp msgid "Hotbar slot 27 key" -msgstr "Предмет 27 на горячей панели" +msgstr "Быстрая кнопка 27" #: src/settings_translation_file.cpp msgid "Hotbar slot 28 key" -msgstr "Предмет 28 на горячей панели" +msgstr "Быстрая кнопка 28" #: src/settings_translation_file.cpp msgid "Hotbar slot 29 key" -msgstr "Предмет 29 на горячей панели" +msgstr "Быстрая кнопка 29" #: src/settings_translation_file.cpp msgid "Hotbar slot 3 key" -msgstr "Предмет 3 на горячей панели" +msgstr "Быстрая кнопка 3" #: src/settings_translation_file.cpp msgid "Hotbar slot 30 key" -msgstr "Предмет 30 на горячей панели" +msgstr "Быстрая кнопка 30" #: src/settings_translation_file.cpp msgid "Hotbar slot 31 key" -msgstr "Предмет 31 на горячей панели" +msgstr "Быстрая кнопка 31" #: src/settings_translation_file.cpp msgid "Hotbar slot 32 key" -msgstr "Предмет 32 на горячей панели" +msgstr "Быстрая кнопка 32" #: src/settings_translation_file.cpp msgid "Hotbar slot 4 key" -msgstr "Предмет 4 на горячей панели" +msgstr "Быстрая кнопка 4" #: src/settings_translation_file.cpp msgid "Hotbar slot 5 key" -msgstr "Предмет 5 на горячей панели" +msgstr "Быстрая кнопка 5" #: src/settings_translation_file.cpp msgid "Hotbar slot 6 key" -msgstr "Предмет 6 на горячей панели" +msgstr "Быстрая кнопка 6" #: src/settings_translation_file.cpp msgid "Hotbar slot 7 key" -msgstr "Предмет 7 на горячей панели" +msgstr "Быстрая кнопка 7" #: src/settings_translation_file.cpp msgid "Hotbar slot 8 key" -msgstr "Предмет 8 на горячей панели" +msgstr "Быстрая кнопка 8" #: src/settings_translation_file.cpp msgid "Hotbar slot 9 key" -msgstr "Предмет 9 на горячей панели" +msgstr "Быстрая кнопка 9" #: src/settings_translation_file.cpp msgid "How deep to make rivers." -msgstr "Как глубоко делать реки." +msgstr "Насколько глубоко делать реки." #: src/settings_translation_file.cpp msgid "" @@ -3813,18 +4233,30 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"Как быстро будут покачиваться волны жидкостей. Выше = быстрее\n" +"Если отрицательно, жидкие волны будут двигаться назад.\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 "" "Время ожидания сервера до выгрузки неиспользуемых блоков.\n" -"Высокие значения более плавные, но используют больше 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 "Уменьшите значение, чтобы увеличить сопротивление жидкости движению." #: src/settings_translation_file.cpp msgid "How wide to make rivers." -msgstr "Насколько широкими делать реки." +msgstr "Насколько широко делать реки." #: src/settings_translation_file.cpp msgid "Humidity blend noise" @@ -3856,12 +4288,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Если отключено, кнопка «Использовать» активирует быстрый полёт, если " -"одновременно включены режим быстрого перемещения и режим полёта." +"Если отключено, кнопка \"Aux1\" используется для быстрого полета, если режим " +"полёта и быстрый режим\n" +"включены." #: src/settings_translation_file.cpp msgid "" @@ -3888,12 +4320,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Если включено, то для спуска (в воде или при полёте) будет задействована " -"клавиша «Использовать», а не «Красться»." +"Если включено, клавиша \"Aux1\" вместо клавиши \"Sneak\" используется для " +"подъема вниз и\n" +"спуска." + +#: 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 "" @@ -3924,7 +4366,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 "" "Если включено, то новые игроки не смогут подключаться с пустым паролем." @@ -3946,6 +4391,14 @@ msgstr "" "Если ограничение CSM для диапазона нод включено, вызовы\n" "get_node ограничиваются на это расстояние от игрока до ноды." +#: 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 "" +"Если выполнение команды чата занимает больше указанного времени в\n" +"секундах, добавьте информацию о времени в сообщение команды чата" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3959,17 +4412,14 @@ msgstr "" "debug.txt перемещается только тогда, когда это значение положительное." #: src/settings_translation_file.cpp +#, fuzzy msgid "If this is set, players will always (re)spawn at the given position." -msgstr "Если установлено, то игроки будут возрождаться в указанной позиции." +msgstr "Если установлено, то игроки будут возрождаться в указанном месте." #: src/settings_translation_file.cpp 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)." @@ -3999,7 +4449,7 @@ msgstr "" "Обычно это нужно тем, кто пишет код для движка" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "Выполнять команды в чате при регистрации." #: src/settings_translation_file.cpp @@ -4025,16 +4475,15 @@ msgid "Instrument the methods of entities on registration." msgstr "Замерять методы сущностей." #: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "Замеры" - -#: src/settings_translation_file.cpp +#, fuzzy msgid "Interval of saving important changes in the world, stated in seconds." -msgstr "Интервал сохранения важных изменений в мире, установленный в секундах." +msgstr "" +"Промежуток сохранения важных изменений в мире, установленный в секундах." #: 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 "Промежуток отправки клиентам сведений о времени дня." #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -4088,6 +4537,10 @@ msgstr "Идентификатор джойстика" msgid "Joystick button repetition interval" msgstr "Интервал повторного клика кнопкой джойстика" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Мертвая зона джойстика" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Чувствительность джойстика" @@ -4190,6 +4643,16 @@ msgstr "" "См. http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша копания.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4332,6 +4795,16 @@ msgstr "" "См. http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавиша размещения.\n" +"См. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4702,7 +5175,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"Клавиша снятия скриншота.\n" +"Клавиша для создания снимка экрана .\n" "См. http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4867,6 +5340,10 @@ msgstr "" "См. http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4890,16 +5367,18 @@ msgid "Large cave depth" msgstr "Глубина больших пещер" #: src/settings_translation_file.cpp +#, fuzzy msgid "Large cave maximum number" -msgstr "Максимальное количество больших пещер" +msgstr "Предельное количество больших пещер" #: src/settings_translation_file.cpp +#, fuzzy msgid "Large cave minimum number" -msgstr "Минимальное количество больших пещер" +msgstr "Наименьшее количество больших пещер" #: src/settings_translation_file.cpp msgid "Large cave proportion flooded" -msgstr "" +msgstr "Пропорция затопленных больших пещер" #: src/settings_translation_file.cpp msgid "Large chat console key" @@ -4927,36 +5406,43 @@ 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 "" -"Длина серверного тика и интервал, на котором объекты обычно\n" +"Длина серверного тика и промежуток, на котором объекты обычно\n" "обновляются по сети." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." msgstr "" -"Установка в true включает покачивание листвы.\n" -"Требует, чтобы шейдеры были включены." +"Длина волн жидкостей.\n" +"Требуется включение волнистых жидкостей." #: 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 "Время между циклами выполнения модификаторов активных блоков (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 "Время между циклами выполнения таймеров нод" #: 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" @@ -4965,7 +5451,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "Уровень логов для записи в debug.txt:\n" "- <nothing> (нет логов)\n" @@ -4977,34 +5464,33 @@ msgstr "" "- verbose (подробности)" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost" -msgstr "Средний подъём кривой света" +msgstr "Усиление кривой света" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost center" -msgstr "Центр среднего подъёма кривой света" +msgstr "Центр усиления кривой света" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost spread" -msgstr "Распространение среднего роста кривой света" +msgstr "Распространение усиления роста кривой света" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve gamma" -msgstr "Средний подъём кривой света" +msgstr "Гамма кривой света" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve high gradient" -msgstr "Средний подъём кривой света" +msgstr "Высокий градиент кривой света" + +#: src/settings_translation_file.cpp +msgid "Light curve low gradient" +msgstr "Низкий градиент кривой света" #: src/settings_translation_file.cpp #, fuzzy -msgid "Light curve low gradient" -msgstr "Центр среднего подъёма кривой света" +msgid "Lighting" +msgstr "Мягкое освещение" #: src/settings_translation_file.cpp msgid "" @@ -5041,8 +5527,9 @@ msgid "Liquid fluidity smoothing" msgstr "Сглаживание текучести жидкостей" #: src/settings_translation_file.cpp +#, fuzzy msgid "Liquid loop max" -msgstr "Максимальное количество зацикленных жидкостей" +msgstr "Предельное количество зацикленных жидкостей" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" @@ -5053,12 +5540,14 @@ msgid "Liquid sinking" msgstr "Стекание жидкости" #: src/settings_translation_file.cpp +#, fuzzy msgid "Liquid update interval in seconds." -msgstr "Интервал обновления жидкостей в секундах." +msgstr "Промежуток обновления жидкостей в секундах." #: src/settings_translation_file.cpp +#, fuzzy msgid "Liquid update tick" -msgstr "Интервал обновления жидкостей" +msgstr "Промежуток обновления жидкостей" #: src/settings_translation_file.cpp msgid "Load the game profiler" @@ -5083,43 +5572,41 @@ msgid "Lower Y limit of dungeons." msgstr "Нижний лимит Y для подземелий." #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "Нижний лимит Y для подземелий." +msgstr "Нижний лимит Y для парящих островов." #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "Скрипт главного меню" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Стиль главного меню" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" "Включить зависимость цвета тумана и облаков от времени суток (рассвет/закат)." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"Заставляет DirectX работать с LuaJIT. Отключите, если это вызывает проблемы." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Сделать все жидкости непрозрачными" #: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Уровень сжатия карты для дискового хранилища" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Уровень сжатия карты для передачи по сети" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Map directory" -msgstr "Каталог сохранения карт" +msgstr "Папка сохранения карт" #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen Carpathian." msgstr "Атрибуты генерации карт для Mapgen Carpathian." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Flat.\n" "Occasional lakes and hills can be added to the flat world." @@ -5128,14 +5615,13 @@ msgstr "" "Иногда озера и холмы могут добавляться в плоский мир." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen Fractal.\n" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" "Атрибуты генерации для картогенератора плоскости.\n" -"«terrain» включает генерацию нефрактального рельефа:\n" +"'terrain' включает генерацию нефрактального рельефа:\n" "океаны, острова и подземелья." #: src/settings_translation_file.cpp @@ -5178,16 +5664,23 @@ msgid "" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" -"Атрибуты генерации карт для Mapgen v7.\n" -"«хребты» включают реки." +"Атрибуты генерации карт, специфичные для Mapgen v7.\n" +"'ridges': Реки.\n" +"'floatlands': Парящие острова суши в атмосфере.\n" +"'caverns': Крупные пещеры глубоко под землей." #: src/settings_translation_file.cpp msgid "Map generation limit" msgstr "Предел генерации карты" #: src/settings_translation_file.cpp +#, fuzzy msgid "Map save interval" -msgstr "Интервал сохранения карты" +msgstr "Промежуток сохранения карты" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Время обновления карты" #: src/settings_translation_file.cpp msgid "Mapblock limit" @@ -5202,32 +5695,36 @@ msgid "Mapblock mesh generator's MapBlock cache size in MB" msgstr "Размер кэша блоков карты в генераторе мешей в МБ" #: src/settings_translation_file.cpp +#, fuzzy msgid "Mapblock unload timeout" -msgstr "Тайм-аут выгрузки блоков" +msgstr "Время ожидания выгрузки блоков" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian" msgstr "Картогенератор Карпаты" #: src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen Carpathian specific flags" -msgstr "Специальные флаги генератора Карпаты" +msgstr "Особые флаги генератора Карпаты" #: src/settings_translation_file.cpp msgid "Mapgen Flat" msgstr "Картогенератор плоскости" #: src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen Flat specific flags" -msgstr "Специальные флаги картогенератора плоскости" +msgstr "Особые флаги картогенератора плоскости" #: src/settings_translation_file.cpp msgid "Mapgen Fractal" msgstr "Картогенератор Фрактал" #: src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Специальные флаги картогенератора Фрактал" +msgstr "Особые флаги картогенератора Фрактал" #: src/settings_translation_file.cpp msgid "Mapgen V5" @@ -5242,24 +5739,27 @@ msgid "Mapgen V6" msgstr "Картогенератор V6" #: src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen V6 specific flags" -msgstr "Специальные флаги картогенератора V6" +msgstr "Особые флаги картогенератора V6" #: src/settings_translation_file.cpp msgid "Mapgen V7" msgstr "Картогенератор V7" #: src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen V7 specific flags" -msgstr "Специальные флаги картогенератора V7" +msgstr "Особые флаги картогенератора V7" #: src/settings_translation_file.cpp msgid "Mapgen Valleys" msgstr "Картогенератор долин" #: src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen Valleys specific flags" -msgstr "Специальные флаги картогенератора долин" +msgstr "Особые флаги картогенератора долин" #: src/settings_translation_file.cpp msgid "Mapgen debug" @@ -5270,48 +5770,67 @@ msgid "Mapgen name" msgstr "Название картогенератора" #: src/settings_translation_file.cpp +#, fuzzy msgid "Max block generate distance" -msgstr "Максимальное расстояние генерации блоков" +msgstr "Предельное расстояние генерации блоков" #: src/settings_translation_file.cpp +#, fuzzy msgid "Max block send distance" -msgstr "Максимальное расстояние отправки блоков" +msgstr "Предельное расстояние отправки блоков" #: src/settings_translation_file.cpp +#, fuzzy msgid "Max liquids processed per step." -msgstr "Максимальное количество обработанных жидкостей за шаг." +msgstr "Предельное количество обработанных жидкостей за шаг." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" msgstr "Количество дополнительно загружаемых блоков clearobjects" #: src/settings_translation_file.cpp +#, fuzzy msgid "Max. packets per iteration" -msgstr "Максимальное количество пакетов за итерацию" +msgstr "Предельное количество пакетов за итерацию" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum FPS" -msgstr "Максимум кадровой частоты (FPS)" +msgstr "Предел кадровой частоты (FPS)" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Максимум кадровой частоты при паузе." +#, fuzzy +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"Предел кадровой частоты, когда окно не сфокусировано, или когда игра " +"приостановлена." #: src/settings_translation_file.cpp +#, fuzzy +msgid "Maximum distance to render shadows." +msgstr "Предельное расстояние для отрисовки теней." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum forceloaded blocks" -msgstr "Максимальное количество принудительно загруженных блоков" +msgstr "Предельное количество принудительно загруженных блоков" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum hotbar width" -msgstr "Максимальная ширина горячей панели" +msgstr "Предельная ширина горячей панели" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "Максимальный порог случайного количества больших пещер на кусок карты" +msgstr "" +"Предельное ограничение случайного количества больших пещер на кусок карты." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum limit of random number of small caves per mapchunk." msgstr "" +"Предельное ограничение случайного количества маленьких пещер на кусок карты." #: src/settings_translation_file.cpp #, fuzzy @@ -5319,23 +5838,25 @@ msgid "" "Maximum liquid resistance. Controls deceleration when entering liquid at\n" "high speed." msgstr "" -"Максимальное сопротивление жидкости. Контролирует замедление\n" -"при поступлении жидкости с высокой скоростью." +"Предельное сопротивление жидкости. Контролирует замедление\n" +"при погружении в жидкость на высокой скорости." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of blocks that are simultaneously sent per client.\n" "The maximum total count is calculated dynamically:\n" "max_total = ceil((#clients + max_users) * per_client / 4)" msgstr "" -"Максимальное количество одновременно отправляемых каждому клиенту блоков.\n" +"Предельное количество одновременно отправляемых каждому клиенту блоков.\n" "Общее максимальное количество вычисляется динамически:\n" "max_total = ceil((#clients + max_users) * per_client / 4)" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of blocks that can be queued for loading." msgstr "" -"Максимальное количество блоков, которые могут быть помещены в очередь для " +"Предельное количество блоков, которые могут быть помещены в очередь для " "загрузки." #: src/settings_translation_file.cpp @@ -5344,8 +5865,8 @@ msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "This limit is enforced per player." msgstr "" -"Максимальное количество блоков в очереди на генерацию. Оставьте пустым для " -"автоматического выбора подходящего значения." +"Предельное количество блоков в очередь, которые должны быть образованы.\n" +"Это ограничение применяется для каждого игрока." #: src/settings_translation_file.cpp #, fuzzy @@ -5353,85 +5874,117 @@ msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" -"Максимальное количество блоков в очереди на загрузку из файла. Оставьте " -"пустым для автоматического выбора подходящего значения." +"Предельное количество блоков в очередь, которые должны быть загружены из " +"файла.\n" +"Это ограничение применяется для каждого игрока." #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Предельное количество одновременных загрузок. Загрузки, превышающие это " +"ограничение, будут поставлены в очередь.\n" +"Это должно быть меньше curl_parallel_limit." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of forceloaded mapblocks." -msgstr "Максимальное количество принудительно загруженных блоков." +msgstr "Предельное количество принудительно загруженных блоков." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of mapblocks for client to be kept in memory.\n" "Set to -1 for unlimited amount." msgstr "" -"Максимальное количество блоков в памяти клиента.\n" +"Предельное количество блоков в памяти клиента.\n" "Установите в -1 для бесконечного количества." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum number of packets sent per send step, if you have a slow connection\n" "try reducing it, but don't reduce it to a number below double of targeted\n" "client number." msgstr "" -"Максимальное количество пакетов, отправляемых за шаг. Если у вас медленное " +"Предельное количество пакетов, отправляемых за раз. Если у вас медленное " "подключение,\n" -"попробуйте уменьшить его, но не устанавливайте ниже значения клиента, " +"попробуйте уменьшить его, но не устанавливайте ниже значения клиента,\n" "умноженного на два." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of players that can be connected simultaneously." -msgstr "Максимальное количество одновременно подключённых игроков." +msgstr "Предельное количество одновременно подключённых игроков." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of recent chat messages to show" -msgstr "Максимальное количество последних отображаемых сообщений чата" +msgstr "Предельное количество последних отображаемых сообщений чата" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum number of statically stored objects in a block." -msgstr "Максимальное количество статически хранимых объектов в блоке." +msgstr "Предельное количество статически хранимых объектов в блоке." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum objects per block" -msgstr "Максимальное количество объектов на блок" +msgstr "Предельное количество объектов на блок" #: src/settings_translation_file.cpp +#, fuzzy 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 "" -"Максимальная доля окна, используемая для горячей панели.\n" +"Предельная доля окна, используемая для горячей панели.\n" "Полезно, если что-то будет отображаться справа или слева от него." #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum simultaneous block sends per client" -msgstr "Максимальное число одновременно отправляемых блоков на клиент" +msgstr "Предельное число одновременно отправляемых блоков на клиент" #: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum size of the out chat queue" -msgstr "Максимальный размер очереди исходящих сообщений" +msgstr "Предельный размер очереди исходящих сообщений" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Maximum size of the out chat queue.\n" "0 to disable queueing and -1 to make the queue size unlimited." msgstr "" -"Максимальный размер очереди исходящих сообщений.\n" +"Предельный размер очереди исходящих сообщений.\n" "0 для отключения очереди и -1 для неограниченного размера." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +#, fuzzy +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Максимум времени (в миллисекундах), которое может занять загрузка (например, " -"мода)." +"Предельное время загрузки файла (например, загрузки мода), указанное в " +"миллисекундах." #: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Предельное время, которое может занять интерактивный запрос (например, " +"получение списка серверов), указывается в миллисекундах." + +#: src/settings_translation_file.cpp +#, fuzzy msgid "Maximum users" -msgstr "Максимальное количество пользователей" - -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Меню" +msgstr "Предельное количество пользователей" #: src/settings_translation_file.cpp msgid "Mesh cache" @@ -5446,12 +5999,14 @@ msgid "Message of the day displayed to players connecting." msgstr "Сообщение, отображаемое подключившимся игрокам." #: src/settings_translation_file.cpp +#, fuzzy msgid "Method used to highlight selected object." -msgstr "Метод подсветки выделенного объекта." +msgstr "Способ подсветки выделенного объекта." #: src/settings_translation_file.cpp +#, fuzzy msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "Наименьший уровень записи в чат." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5468,26 +6023,43 @@ msgstr "Высота сканирования миникарты" #: src/settings_translation_file.cpp #, fuzzy msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "3D-шум, определяющий количество подземелий в куске карты." +msgstr "Наименьший предел случайного количества больших пещер на кусок карты." #: src/settings_translation_file.cpp +#, fuzzy msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "Наименьшее количество маленьких пещер на кусок карты." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Minimum texture size" +msgstr "Наименьший размер текстуры" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Mipmapping" +msgstr "Размытие текстур (MIP-текстурирование)" + +#: src/settings_translation_file.cpp +msgid "Misc" msgstr "" #: src/settings_translation_file.cpp -msgid "Minimum texture size" -msgstr "Минимальный размер текстуры" +#, fuzzy +msgid "Mod Profiler" +msgstr "Профилировщик" #: src/settings_translation_file.cpp -msgid "Mipmapping" -msgstr "Мипмаппинг (MIP-текстурирование)" +#, fuzzy +msgid "Mod Security" +msgstr "Безопасность" #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "Каналы модификаций" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "Изменяет размер элементов игрового интерфейса." #: src/settings_translation_file.cpp @@ -5498,6 +6070,10 @@ msgstr "Путь к моноширинному шрифту" msgid "Monospace font size" msgstr "Размер моноширинного шрифта" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Размер моноширинного шрифта, кратный" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Шум высоты гор" @@ -5571,13 +6147,8 @@ msgid "" msgstr "Имя сервера, отображаемое при входе и в списке серверов." #: src/settings_translation_file.cpp -#, fuzzy msgid "Near plane" -msgstr "Близкая плоскость отсечения" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Сеть" +msgstr "Ближняя плоскость" #: src/settings_translation_file.cpp msgid "" @@ -5587,6 +6158,11 @@ msgstr "" "Сетевой порт для прослушивания (UDP).\n" "Этот параметр будет переопределён, если запустить сервер из главного меню." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "Сеть" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "Новым пользователям нужно вводить этот пароль." @@ -5599,32 +6175,29 @@ msgstr "Проходить сквозь стены" 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 "Подсветка нод" #: src/settings_translation_file.cpp +#, fuzzy msgid "NodeTimer interval" -msgstr "Интервал таймера нод" +msgstr "Промежуток таймера нод" #: src/settings_translation_file.cpp msgid "Noises" msgstr "Шумы" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Выборка карт нормалей" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Сила карт нормалей" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Количество emerge-потоков" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Number of emerge threads to use.\n" "Value 0:\n" @@ -5638,24 +6211,22 @@ msgid "" "'on_generated'. For many users the optimum setting may be '1'." msgstr "" "Количество возникающих потоков для использования.\n" -"ВНИМАНИЕ: Пока могут появляться ошибки, вызывающие сбой, если\n" -"«num_emerge_threads» больше 1. Строго рекомендуется использовать\n" -"значение «1», до тех пор, пока предупреждение не будет убрано.\n" "Значение 0:\n" "- Автоматический выбор. Количество потоков будет\n" -"- «число процессоров - 2», минимально — 1.\n" +"- 'число процессоров - 2', минимально — 1.\n" "Любое другое значение:\n" "- Указывает количество потоков, минимально — 1.\n" "ВНИМАНИЕ: Увеличение числа потоков улучшает быстродействие движка\n" "картогенератора, но может снижать производительность игры, мешая другим\n" "процессам, особенно в одиночной игре и при запуске кода Lua в " -"«on_generated».\n" -"Для большинства пользователей наилучшим значением может быть «1»." +"'on_generated'.\n" +"Для большинства пользователей наилучшим значением может быть '1'." #: 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Количество дополнительных блоков, которые могут сразу быть загружены /" @@ -5664,14 +6235,6 @@ msgstr "" "потреблением\n" "памяти (4096=100 MБ, как правило)." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Количество итераций Parallax Occlusion." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Сетевой репозиторий" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "Непрозрачные жидкости" @@ -5679,12 +6242,7 @@ msgstr "Непрозрачные жидкости" #: src/settings_translation_file.cpp msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" +msgstr "Прозрачность тени сзади стандартного шрифта, между 0 и 255." #: src/settings_translation_file.cpp msgid "" @@ -5696,76 +6254,68 @@ msgstr "" "форма уже открыта." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Общее смещение эффекта Parallax Occlusion, обычно масштаб/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Общее смещение эффекта Parallax Occlusion." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Включить параллакс" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Смещение параллакса" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Повторение параллакса" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Режим параллакса" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Масштаб параллаксной окклюзии" +msgid "Optional override for chat weblink color." +msgstr "Необязательное переопределение цвета ссылки в чате." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" +"Путь к резервному шрифту.\n" +"Если параметр «freetype» включён: должен быть шрифтом TrueType.\n" +"Если параметр «freetype» отключён: должен быть векторным XML-шрифтом.\n" +"Этот шрифт будет использоваться для некоторых языков или если стандартный " +"шрифт недоступен." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Path to save screenshots at. Can be an absolute or relative path.\n" "The folder will be created if it doesn't already exist." msgstr "" +"Путь для сохранения снимков экрана. Может быть абсолютным или относительным " +"путем.\n" +"Папка будет создана, если она еще не существует." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Path to shader directory. If no path is defined, default location will be " "used." msgstr "" -"Путь к директории с шейдерами. Если не задан, то будет использоваться путь " -"по умолчанию." +"Путь к папке с шейдерами. Если не задан, то будет использоваться путь по " +"умолчанию." #: src/settings_translation_file.cpp +#, fuzzy msgid "Path to texture directory. All textures are first searched from here." msgstr "" -"Путь до каталога с текстурами. Все текстуры в первую очередь берутся от сюда." +"Путь к папке с текстурами. Все текстуры в первую очередь берутся отсюда." #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" +"Путь к шрифту по умолчанию.\n" +"Если параметр «freetype» включен: должен быть шрифт TrueType.\n" +"Если параметр «freetype» отключен: это должен быть растровый или векторный " +"шрифт XML.\n" +"Резервный шрифт будет использоваться, если шрифт не может быть загружен." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" +"Путь к моноширинному шрифту.\n" +"Если параметр «freetype» включен: должен быть шрифт TrueType.\n" +"Если параметр «freetype» отключен: это должен быть растровый или векторный " +"шрифт XML.\n" +"Этот шрифт используется, например, для экран консоли и экрана профилей." #: src/settings_translation_file.cpp msgid "Pause on lost window focus" @@ -5773,12 +6323,11 @@ msgstr "Пауза при потере фокуса" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" -msgstr "" +msgstr "Ограничение поочередной загрузки блоков с диска на игрока" #: src/settings_translation_file.cpp -#, fuzzy msgid "Per-player limit of queued blocks to generate" -msgstr "Ограничение очередей emerge для генерации" +msgstr "Ограничение для каждого игрока в очереди блоков для генерации" #: src/settings_translation_file.cpp msgid "Physics" @@ -5793,17 +6342,23 @@ msgid "Pitch move mode" msgstr "Режим движения вниз/вверх по направлению взгляда" #: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Клавиша положить" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "Промежуток повторного размещения" + +#: src/settings_translation_file.cpp +#, fuzzy msgid "" "Player is able to fly without being affected by gravity.\n" "This requires the \"fly\" privilege on the server." msgstr "" -"Игрок может летать без влияния гравитации.\n" +"Игрок может летать без влияния притяжения.\n" "Это требует привилегии 'fly' на сервере." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Имя игрока" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Расстояние передачи игрока" @@ -5812,6 +6367,10 @@ msgstr "Расстояние передачи игрока" msgid "Player versus player" msgstr "Режим «Игрок против игрока» (PvP)" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Пуассоновская фильтрация" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5837,11 +6396,13 @@ msgstr "" "консольных команд." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Print the engine's profiling data in regular intervals (in seconds).\n" "0 = disable. Useful for developers." msgstr "" -"Печатать информацию о профилировании через заданные интервалы (в секундах).\n" +"Печатать информацию о профилировании через заданные промежутки (в " +"секундах).\n" "0 = отключить. Полезно для разработчиков." #: src/settings_translation_file.cpp @@ -5856,25 +6417,25 @@ msgstr "Профилировщик" msgid "Profiler toggle key" msgstr "Клавиша переключения профилировщика" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Профилирование" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" -msgstr "" +msgstr "адрес приёмника Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"Адрес приёмника Prometheus.\n" +"Если мой тест скомпилирован с включенной опцией ENABLE_PROMETHEUS,\n" +"включить приемник метрик для Prometheus по этому адресу.\n" +"Метрики можно получить на http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." -msgstr "" +msgstr "Доля больших пещер, которые содержат жидкость." #: src/settings_translation_file.cpp msgid "" @@ -5902,9 +6463,8 @@ msgid "Recent Chat Messages" msgstr "Недавние сообщения чата" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "Путь для сохранения отчётов" +msgstr "Путь к обычному шрифту" #: src/settings_translation_file.cpp msgid "Remote media" @@ -5974,10 +6534,6 @@ msgstr "Размер шума подводных хребтов" msgid "Right key" msgstr "Правая клавиша меню" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Интервал повторного клика правой кнопкой" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Глубина русла реки" @@ -6049,9 +6605,14 @@ msgstr "" "Масштабировать интерфейс, используя заданное пользователем значение.\n" "Использовать метод ближайшего соседа и антиалиасинг, чтобы масштабировать " "интерфейс.\n" -"Это сгладит некоторые острые углы и смешает пиксели при уменьшении масштаба " -"за счёт\n" -"размывания пикселей на гранях при масштабировании на нецелые размеры." +"Это сгладит некоторые острые углы и смешает\n" +"пиксели при уменьшении масштаба за счёт размывания\n" +"пикселей на гранях при масштабировании на нецелые размеры." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Экран:" #: src/settings_translation_file.cpp msgid "Screen height" @@ -6062,27 +6623,36 @@ msgid "Screen width" msgstr "Ширина экрана" #: src/settings_translation_file.cpp +#, fuzzy msgid "Screenshot folder" -msgstr "Каталог со скриншотами" +msgstr "Папка для снимков экрана" #: src/settings_translation_file.cpp +#, fuzzy msgid "Screenshot format" -msgstr "Формат скриншота" +msgstr "Формат снимка экрана" #: src/settings_translation_file.cpp +#, fuzzy msgid "Screenshot quality" -msgstr "Качество скриншота" +msgstr "Качество снимка экрана" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Screenshot quality. Only used for JPEG format.\n" "1 means worst quality; 100 means best quality.\n" "Use 0 for default quality." msgstr "" -"Качество скриншота. Используется только для изображений в формате JPEG.\n" +"Качество снимка экрана. Используется только для изображений в формате JPEG.\n" "1 означает худшее качество; 100 означает лучшее качество.\n" "Используйте 0 для настроек по умолчанию." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Снимок экрана" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "Шум морского дна" @@ -6097,10 +6667,6 @@ msgstr "" 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 "См. http://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6118,7 +6684,6 @@ msgid "Selection box width" msgstr "Толщина рамки выделения" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Selects one of 18 fractal types.\n" "1 = 4D \"Roundy\" Mandelbrot set.\n" @@ -6161,8 +6726,19 @@ msgstr "" "18 = 4D \"Mandelbulb\" множество Жюлиа." #: 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" @@ -6188,10 +6764,20 @@ msgstr "Порт сервера" 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 +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "Адрес списка серверов" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Файл списка серверов" @@ -6201,18 +6787,60 @@ msgid "" "Set the language. Leave empty to use the system language.\n" "A restart is required after changing this." msgstr "" -"Установка языка. Оставьте пустым для использования системного языка.\n" +"Установка языка. Оставьте пустым для использования языка системы.\n" "Требует перезапуска после изменения." #: 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 #, fuzzy msgid "" +"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 "" +"Установите силу тени.\n" +"Меньшее значение означает более светлые тени, большее значение означает " +"более тёмные тени." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"Установить размер радиуса мягкой тени.\n" +"Меньшие значения означают более резкие тени, большие значения более мягкие.\n" +"Минимальное значение 1,0 и максимальное 10,0" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Установка наклона орбиты Солнца/Луны в градусах.\n" +"Значение 0 означает отсутствие наклона / вертикальную орбиту.\n" +"Наименьшее значение 0.0 и максимальное значение 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Установка в true включает покачивание листвы.\n" +"Требует, чтобы шейдеры были включены." + +#: src/settings_translation_file.cpp +msgid "" "Set to true to enable waving leaves.\n" "Requires shaders to be enabled." msgstr "" @@ -6220,16 +6848,14 @@ msgstr "" "Требует, чтобы шейдеры были включены." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"Установка в true включает волны на воде.\n" +"Установка в true включает волнистые жидкости (например, вода).\n" "Требует, чтобы шейдеры были включены." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving plants.\n" "Requires shaders to be enabled." @@ -6237,6 +6863,16 @@ msgstr "" "Установка в true включает покачивание растений.\n" "Требует, чтобы шейдеры были включены." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Устанавливает качество текстуры тени в 32 бита.\n" +"При значении false будет использоваться 16-битная текстура.\n" +"Это может вызвать гораздо больше артефактов в тени." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Путь к шейдерам" @@ -6249,22 +6885,39 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" "Шейдеры позволяют использовать дополнительные визуальные эффекты и могут " -"увеличить производительность на некоторых видеокартах.\n" +"увеличить\n" +"производительность на некоторых видеокартах.\n" "Работают только с видео-бэкендом OpenGL." #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " -"drawn." -msgstr "Смещение тени шрифта. Если указан 0, то тень не будет показана." +msgid "Shadow filter quality" +msgstr "Качество теневого фильтра" #: src/settings_translation_file.cpp #, fuzzy +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Предельное расстояние карты теней в нодах для рендеринга теней" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "Текстура карты теней в 32 битах" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Размер текстуры карты теней" + +#: src/settings_translation_file.cpp msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Смещение тени шрифта. Если указан 0, то тень не будет показана." +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" +"Смещение тени стандартного шрифта (в пикселях). Если указан 0, то тень не " +"будет показана." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow strength gamma" +msgstr "Сила тени" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6278,6 +6931,18 @@ msgstr "Показывать отладочную информацию" msgid "Show entity selection boxes" msgstr "Показывать область выделения объектов" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Показывать область выделения объектов\n" +"Требует перезапуска после изменения." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "Отображать задний план у табличек с именами" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Сообщение о выключении" @@ -6311,6 +6976,10 @@ msgstr "" "увеличит процент попаданий в кэш, предотвращая копирование информации\n" "из основного потока игры, тем самым уменьшая колебания кадровой частоты." +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Наклон орбиты небесного тела" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "Разрез w" @@ -6320,12 +6989,14 @@ msgid "Slope and fill work together to modify the heights." msgstr "Склон и заполнение работают совместно для изменения высот." #: src/settings_translation_file.cpp +#, fuzzy msgid "Small cave maximum number" -msgstr "" +msgstr "Предельное количество маленьких пещер" #: src/settings_translation_file.cpp +#, fuzzy msgid "Small cave minimum number" -msgstr "" +msgstr "Наименьшее количество маленьких пещер" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." @@ -6369,18 +7040,14 @@ msgstr "Скорость скрытной ходьбы" msgid "Sneaking speed, in nodes per second." msgstr "Скорость ходьбы украдкой в нодах в секунду." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Радиус мягкой тени" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Звук" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Клавиша использовать" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Клавиша «Использовать» для спуска" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6395,21 +7062,38 @@ 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 "" +"Устанавливает размер стопки блоков, предметов и инструментов по умолчанию.\n" +"Обратите внимание, что моды или игры могут явно установить стопку для " +"определенных (или всех) предметов." + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"Распространяет полное обновление карты теней на заданное количество кадров.\n" +"Более высокие значения могут сделать тени нестабильными, более низкие " +"значения\n" +"будут потреблять больше ресурсов.\n" +"Наименьшее значение: 1; Предельное значение: 16" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Spread of light curve boost range.\n" "Controls the width of the range to be boosted.\n" "Standard deviation of the light curve boost Gaussian." msgstr "" -"Распространение среднего подъёма кривой света.\n" -"Стандартное отклонение среднего подъёма по Гауссу." +"Диапазон увеличения кривой света.\n" +"Регулирует ширину увеличиваемого диапазона.\n" +"Стандартное отклонение усиления кривой света по Гауссу." #: src/settings_translation_file.cpp msgid "Static spawnpoint" @@ -6428,13 +7112,8 @@ msgid "Step mountain spread noise" msgstr "Шаг шума распространения гор" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." -msgstr "Сила параллакса." - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Сила сгенерированных карт нормалей." +msgstr "Сила параллакса в 3D режиме." #: src/settings_translation_file.cpp msgid "" @@ -6442,6 +7121,9 @@ msgid "" "The 3 'boost' parameters define a range of the light\n" "curve that is boosted in brightness." msgstr "" +"Сила искажения света.\n" +"3 параметра 'усиления' определяют предел искажения света,\n" +"который увеличивается в освещении." #: src/settings_translation_file.cpp msgid "Strict protocol checking" @@ -6464,6 +7146,21 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"Уровень поверхности необязательной воды размещенной на твердом слое парящих " +"островов. \n" +"Вода по умолчанию отключена и будет размещена только в том случае, если это " +"значение \n" +"будет установлено выше «mgv7_floatland_ymax» - «mgv7_floatland_taper» \n" +"(начало верхнего сужения).\n" +"*** ПРЕДУПРЕЖДЕНИЕ, ПОТЕНЦИАЛЬНАЯ ОПАСНОСТЬ ДЛЯ МИРОВ И РАБОТЫ СЕРВЕРА ***:\n" +"При включении размещения воды парящих островов должны быть сконфигурированы " +"и проверены \n" +"на наличие сплошного слоя, установив «mgv7_floatland_density» на 2,0 (или " +"другое \n" +"требуемое значение в зависимости от «mgv7_np_floatland»), чтобы избежать \n" +"чрезмерного интенсивного потока воды на сервере и избежать обширного " +"затопления\n" +"поверхности мира внизу." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6473,13 +7170,19 @@ msgstr "Синхронный SQLite" 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 "Альтернативный шум рельефа" #: src/settings_translation_file.cpp +#, fuzzy msgid "Terrain base noise" -msgstr "Базовый шум поверхности" +msgstr "Основной шум поверхности" #: src/settings_translation_file.cpp msgid "Terrain height" @@ -6521,6 +7224,16 @@ msgstr "Шум постоянности ландшафта" msgid "Texture path" msgstr "Путь к текстурам" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Размер текстуры для рендеринга карты теней.\n" +"Это должно быть число, кратное двум.\n" +"Большие числа создают более качественные тени, но они и более затратные." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6540,8 +7253,14 @@ msgstr "" "образом." #: src/settings_translation_file.cpp +#, fuzzy msgid "The URL for the content repository" -msgstr "Адрес сетевого репозитория" +msgstr "Адрес сетевого хранилища" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "The dead zone of the joystick" +msgstr "Мертвая зона джойстика" #: src/settings_translation_file.cpp msgid "" @@ -6573,6 +7292,7 @@ msgstr "" "экраном." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The maximum height of the surface of waving liquids.\n" "4.0 = Wave height is two nodes.\n" @@ -6580,6 +7300,11 @@ msgid "" "Default is 1.0 (1/2 node).\n" "Requires waving liquids to be enabled." msgstr "" +"Предельная высота поверхности волнистых жидкостей.\n" +"4.0 = высота волны равна двум нодам.\n" +"0.0 = волна не двигается вообще.\n" +"Значение по умолчанию — 1.0 (1/2 ноды).\n" +"Требует, чтобы волнистые жидкости были включены." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6595,7 +7320,6 @@ msgstr "" "настройке мода." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "The radius of the volume of blocks around every player that is subject to " "the\n" @@ -6605,32 +7329,36 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" -"Радиус объёма блоков вокруг каждого игрока, в котором действуют\n" -"активные блоки, определённые в блоках карты (16 нод).\n" -"В активных блоках загружаются объекты и работает ABM.\n" -"Также это минимальный диапазон, в котором обрабатываются активные объекты " +"Радиус объёма блоков вокруг каждого игрока, на которого распространяется " +"действие\n" +"активного материала блока, указанного в mapblocks (16 узлов).\n" +"В активные блоки загружаются объекты и запускаются ПРО.\n" +"Это также минимальный диапазон, в котором поддерживаются активные объекты " "(мобы).\n" -"Необходимо настраивать вместе с active_object_range." +"Это должно быть настроено вместе с active_object_send_range_blocks." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Программный интерфейс визуализации для Irrlicht.\n" -"После изменения этого параметра потребуется перезапуск.\n" -"Примечание: Если не уверены, используйте OGLES1 для Android, иначе\n" -"приложение может не запуститься. На других платформах рекомендуется\n" -"OpenGL, так как сейчас это единственный драйвер с поддержкой шейдеров." +"Бэкэнд рендеринга.\n" +"После изменения этого параметра требуется перезагрузка.\n" +"Примечание: На Android, если вы не уверены, используйте OGLES1! В противном " +"случае приложение может не запуститься.\n" +"На других платформах рекомендуется использовать OpenGL.\n" +"Шейдеры поддерживаются OpenGL (только для настольных компьютеров) и OGLES2 " +"(экспериментальный)" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "Чувствительность осей джойстика для перемещения\n" "взгляда в игре." @@ -6658,20 +7386,30 @@ msgstr "" "старые элементы очереди\n" "Значение 0 отключает этот функционал." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"The time budget allowed for ABMs to execute on each step\n" +"(as a fraction of the ABM Interval)" +msgstr "" +"Бюджет времени для выполнения ABM на каждом шаге\n" +"(как часть 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 "" "Время в секундах между повторяющимися событиями,\n" -"когда зажата комбинация кнопок на джойстике." +"когда зажато сочетание кнопок на джойстике." #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." -msgstr "Задержка в секундах между кликами при зажатой правой кнопке мыши." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" +"Задержка перед повторным размещением ноды в секундах\n" +"при удержании клавиши размещения." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6707,15 +7445,17 @@ msgstr "" "Время суток во вновь созданном мире, в милличасах (значение от 0 до 23999)." #: src/settings_translation_file.cpp +#, fuzzy msgid "Time send interval" -msgstr "Интервал отправки времени" +msgstr "Промежуток отправки времени" #: src/settings_translation_file.cpp 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 "" "Время, после которого клиент удаляет из памяти неиспользуемую информацию о " "карте." @@ -6744,6 +7484,19 @@ msgstr "Задержка подсказки" 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 "Шум деревьев" @@ -6753,7 +7506,6 @@ msgid "Trilinear filtering" msgstr "Трилинейная фильтрация" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" @@ -6788,7 +7540,7 @@ msgstr "" "затрагивается.\n" "Значительно увеличивает производительность за счёт вывода менее подробного " "изображения.\n" -"Высокие значения приводят к менее детализированному изображению." +"Высокие значения приводят к менее проработанному изображению." #: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" @@ -6803,9 +7555,8 @@ msgid "Upper Y limit of dungeons." msgstr "Верхний лимит Y для подземелий." #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "Верхний лимит Y для подземелий." +msgstr "Верхний лимит Y для парящих островов." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6825,20 +7576,45 @@ msgid "Use bilinear filtering when scaling textures." msgstr "Использовать билинейную фильтрацию для масштабирования текстур." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" -"Использовать MIP-текстурирование для масштабирования текстур.\n" -"Может немного увеличить производительность, особенно при\n" -"использовании пакета текстур высокого разрешения.\n" +"Использовать MIP-текстурирование для масштабирования текстур. Может немного " +"увеличить производительность,\n" +"особенно при использовании набора текстур высокого разрешения.\n" "Гамма-коррекция при уменьшении масштаба не поддерживается." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Используйте многовыборочное сглаживание (MSAA) для сглаживания краев " +"блоков.\n" +"Этот алгоритм сглаживает область просмотра 3D, сохраняя резкость " +"изображения,\n" +"но это не влияет на внутренности текстур\n" +"(что особенно заметно на прозрачных текстурах).\n" +"Когда шейдеры отключены, между узлами появляются видимые пробелы.\n" +"Если установлено значение 0, MSAA отключено.\n" +"После изменения этой опции требуется перезагрузка." + #: src/settings_translation_file.cpp 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)" @@ -6868,8 +7644,9 @@ msgid "Variation of biome filler depth." msgstr "Вариация глубины наполнителя биома." #: src/settings_translation_file.cpp +#, fuzzy msgid "Variation of maximum mountain height (in nodes)." -msgstr "Вариация максимальной высоты гор (в нодах)." +msgstr "Вариация предельной высоты гор (в нодах)." #: src/settings_translation_file.cpp msgid "Variation of number of caves." @@ -6932,25 +7709,25 @@ msgid "View zoom key" msgstr "Клавиша режима увеличения" #: src/settings_translation_file.cpp +#, fuzzy msgid "Viewing range" -msgstr "Дистанция отрисовки" +msgstr "Дальность отрисовки" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Дополнительная кнопка триггеров виртуального джойстика" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Виртуальный джойстик нажимает кнопку Aux1" #: src/settings_translation_file.cpp msgid "Volume" msgstr "Громкость" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" -"Включает Parallax Occlusion.\n" -"Требует, чтобы шейдеры были включены." +"Громкость всех звуков.\n" +"Требует включенной звуковой системы." #: src/settings_translation_file.cpp msgid "" @@ -6997,22 +7774,18 @@ msgid "Waving leaves" msgstr "Покачивание листвы" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" -msgstr "Покачивание жидкостей" +msgstr "Волнистые жидкости" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "Высота волн на воде" +msgstr "Высота волн волнистых жидкостей" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" -msgstr "Скорость волн на воде" +msgstr "Скорость волн волнистых жидкостей" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" msgstr "Длина волн на воде" @@ -7020,6 +7793,11 @@ msgstr "Длина волн на воде" msgid "Waving plants" msgstr "Покачивание растений" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Цвет выделения" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7045,37 +7823,40 @@ msgstr "" "правильно поддерживают загрузку текстур с аппаратного обеспечения." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" -"При использовании билинейного, трилинейного или анизотропного фильтра\n" -"текстуры с низким разрешением могут быть размыты, поэтому происходит\n" -"автоматическое масштабирование их с интерполяцией по ближайшим соседям,\n" -"чтобы сохранить чёткие пиксели. Этот параметр определяет минимальный\n" -"размер для увеличенных текстур. При высоких значениях отображение более\n" -"чёткое, но требует больше памяти. Рекомендуется значение 2. Установка этого\n" -"значения выше 1 может не иметь видимого эффекта, если не включена \n" -"билинейная, трилинейная или анизотропная фильтрация.\n" -"Также используется как размер базовой текстуры ноды для мирового\n" -"автомасштабирования текстур." +"При использовании билинейных/трилинейных/анизотропных фильтров текстуры с " +"низким разрешением\n" +"могут быть размыты, поэтому автоматически повышайте их масштаб с помощью " +"ближайших соседей\n" +"интерполяцией, чтобы сохранить чёткие пиксели. Здесь задается минимальный " +"размер текстуры\n" +"для увеличенных текстур; более высокие значения выглядят более чёткими, но " +"требуют больше\n" +"памяти. Рекомендуется использовать значения, кратные 2. Эта настройка " +"применяется ТОЛЬКО в том случае, если\n" +"включена билинейная/трилинейная/анизотропная фильтрация.\n" +"Это значение также используется в качестве базового размера текстуры узла " +"для автомасштабирования текстур с выравниванием по миру\n" +"автомасштабирования текстуры." #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Использовать шрифты FreeType. Поддержка FreeType должна быть включена при " -"сборке." +"Должен ли отображаться задний план бирки по умолчанию.\n" +"Моды в любом случае могут задать задний план." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7114,6 +7895,20 @@ msgid "" "In-game, you can toggle the mute state with the mute key or by using the\n" "pause menu." msgstr "" +"Нужно ли выключить звуки? Вы можете включить звуки в любое время, если\n" +"звуковая система не отключена (enable_sound=false).\n" +"Внутри игры, вы можете включить режим отключения звуков, нажав на клавишу " +"отключения звуков или используя\n" +"меню паузы." + +#: 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 "" @@ -7121,8 +7916,10 @@ msgid "" msgstr "Показывать данные отладки (аналогично нажатию F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "Ширина компонента начального размера окна." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"Компонент ширины начального размера окна. Игнорируется в полноэкранном " +"режиме." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7139,11 +7936,12 @@ msgstr "" "Содержит ту же информацию, что и файл debug.txt (имя файла может отличаться)." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "World directory (everything in the world is stored here).\n" "Not needed if starting from the main menu." msgstr "" -"Директория мира (всё в мире хранится в ней).\n" +"Папка мира (всё в мире хранится в ней).\n" "Не требуется при запуске из главного меню." #: src/settings_translation_file.cpp @@ -7151,6 +7949,7 @@ msgid "World start time" msgstr "Начальное время мира" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "World-aligned textures may be scaled to span several nodes. However,\n" "the server may not send the scale you want, especially if you use\n" @@ -7159,13 +7958,14 @@ msgid "" "See also texture_min_size.\n" "Warning: This option is EXPERIMENTAL!" msgstr "" -"Выровненные по миру текстуры можно масштабировать так, чтобы они\n" -"охватывали несколько нод. Но сервер может не отправить нужный\n" -"масштаб, особенно если вы используете специально разработанный\n" -"пакет текстур; с этим параметром клиент пытается определить масштаб\n" -"автоматически на основании размера текстуры.\n" -"Смотрите также texture_min_size.\n" -"Внимание: Этот параметр ЭКСПЕРИМЕНТАЛЬНЫЙ!" +"Текстуры с выравниванием по миру могут быть масштабированы так, чтобы " +"охватить несколько узлов. Однако,\n" +"сервер может не передать нужный масштаб, особенно если вы используете\n" +"специально разработанный набор текстур; при использовании этой опции клиент " +"пытается\n" +"определить масштаб автоматически, основываясь на размере текстуры.\n" +"См. также texture_min_size.\n" +"Предупреждение: Эта опция является ЭКСПЕРИМЕНТАЛЬНОЙ!" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" @@ -7198,6 +7998,10 @@ msgid "" "For a solid floatland layer, this controls the height of hills/mountains.\n" "Must be less than or equal to half the distance between the Y limits." msgstr "" +"Y-расстояние, на котором равнины сужаются от полной плотности до нуля.\n" +"Сужение начинается на этом расстоянии от предела Y.\n" +"Для твердого слоя парящих островов это контролирует высоту холмов/гор.\n" +"Должно быть меньше или равно половине расстояния между пределами Y." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." @@ -7220,128 +8024,38 @@ msgid "Y-level of seabed." msgstr "Y-уровень морского дна." #: src/settings_translation_file.cpp -msgid "cURL file download timeout" -msgstr "Тайм-аут загрузки файла с помощью cURL" +msgid "cURL" +msgstr "" #: src/settings_translation_file.cpp -msgid "cURL parallel limit" -msgstr "Лимит одновременных соединений cURL" - -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL тайм-аут" - -#~ msgid "Toggle Cinematic" -#~ msgstr "Кино" - -#~ msgid "Select Package File:" -#~ msgstr "Выберите файл дополнения:" - #, fuzzy -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Верхний предел по Y для больших псевдослучайных пещер." +msgid "cURL file download timeout" +msgstr "Превышено время ожидания загрузки файла с помощью cURL" -#~ msgid "Waving Water" -#~ msgstr "Волны на воде" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "Превышено время ожидания для взаимодействия с cURL" -#~ msgid "Projecting dungeons" -#~ msgstr "Проступающие подземелья" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL parallel limit" +msgstr "Предел одновременных соединений cURL" -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Y-уровень, на который распространяются тени с плавающей точкой." +#~ msgid "- Creative Mode: " +#~ msgstr "- Режим творчества: " -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "Y-уровень середины поплавка и поверхности озера." - -#~ msgid "Waving water" -#~ msgstr "Волны на воде" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Вариация высоты холмов и глубин озёр на гладкой местности парящих " -#~ "островов." +#~ msgid "- Damage: " +#~ msgstr "- Урон: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Типичная максимальная высота, выше и ниже средней точки гор парящих " -#~ "островов." +#~ "0 = Параллакс окклюзии с информацией о склоне (быстро).\n" +#~ "1 = Рельефный маппинг (медленно, но качественно)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Этот шрифт будет использован для некоторых языков." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Сила среднего подъёма кривой света." - -#~ msgid "Shadow limit" -#~ msgstr "Лимит теней" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Путь к шрифту TrueType или картинке со шрифтом." - -#~ msgid "Lightness sharpness" -#~ msgstr "Резкость освещённости" - -#~ msgid "Lava depth" -#~ msgstr "Глубина лавы" - -#~ msgid "IPv6 support." -#~ msgstr "Поддержка IPv6." - -#~ msgid "Gamma" -#~ msgstr "Гамма" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Прозрачность тени шрифта (непрозрачность от 0 до 255)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Высота гор на парящих островах" - -#~ msgid "Floatland base height noise" -#~ msgstr "Шум базовой высоты парящих островов" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Включить кинематографическое тональное отображение" - -#~ msgid "Enable VBO" -#~ msgstr "Включить объекты буфера вершин (VBO)" - -#~ msgid "" -#~ "Deprecated, define and locate cave liquids using biome definitions " -#~ "instead.\n" -#~ "Y of upper limit of lava in large caves." -#~ msgstr "" -#~ "Устарело, определяет и располагает жидкости в пещерах с использованием " -#~ "определений биома.\n" -#~ "Y верхней границы лавы в больших пещерах." - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Определяет области гладкой поверхности на парящих островах.\n" -#~ "Гладкие парящие острова появляются, когда шум больше ноля." - -#~ msgid "Darkness sharpness" -#~ msgstr "Резкость темноты" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Контролирует ширину тоннелей. Меньшие значения создают более широкие " -#~ "тоннели." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Контролирует плотность горной местности парящих островов.\n" -#~ "Является смещением, добавляемым к значению шума 'mgv7_np_mountain'." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Центр среднего подъёма кривой света." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "Управляет сужением островов горного типа ниже средней точки." +#~ msgid "Address / Port" +#~ msgstr "Адрес / Порт" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7352,22 +8066,458 @@ msgstr "cURL тайм-аут" #~ "ярче.\n" #~ "Этот параметр предназначен только для клиента и игнорируется сервером." -#~ msgid "Path to save screenshots at." -#~ msgstr "Путь для сохранения скриншотов." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "Управляет сужением островов горного типа ниже средней точки." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Сила параллакса" +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Уверены, что хотите сбросить мир одиночной игры?" -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Ограничение очередей emerge на диске" +#~ msgid "Back" +#~ msgstr "Назад" + +#, fuzzy +#~ msgid "Basic" +#~ msgstr "Основной" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Бит на пиксель (глубина цвета) в полноэкранном режиме." + +#~ msgid "Bump Mapping" +#~ msgstr "Бампмаппинг" + +#~ msgid "Bumpmapping" +#~ msgstr "Бампмаппинг" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Центр среднего подъёма кривой света." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Изменение интерфейса в главном меню:\n" +#~ "- Full: несколько однопользовательских миров, выбор игры, выбор пакета " +#~ "текстур и т. д.\n" +#~ "- Simple: один однопользовательский мир без выбора игр или текстур. " +#~ "Может быть полезно для небольших экранов." + +#~ msgid "Config mods" +#~ msgstr "Настройка модов" + +#~ msgid "Configure" +#~ msgstr "Настроить" + +#~ msgid "Connect" +#~ 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." +#~ msgstr "" +#~ "Контролирует плотность горной местности парящих островов.\n" +#~ "Является смещением, добавляемым к значению шума 'mgv7_np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Контролирует ширину тоннелей. Меньшие значения создают более широкие " +#~ "тоннели." + +#~ msgid "Credits" +#~ msgstr "Благодарности" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Цвет перекрестия (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Урон включён" + +#~ msgid "Darkness sharpness" +#~ msgstr "Резкость темноты" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Стандартный тайм-аут для cURL, заданный в миллисекундах.\n" +#~ "Работает только на сборках с cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Определяет области гладкой поверхности на парящих островах.\n" +#~ "Гладкие парящие острова появляются, когда шум больше ноля." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Определяет шаг выборки текстуры.\n" +#~ "Более высокое значение приводит к более гладким картам нормалей." + +#~ msgid "Del. Favorite" +#~ msgstr "Убрать из избранного" + +#~ msgid "" +#~ "Deprecated, define and locate cave liquids using biome definitions " +#~ "instead.\n" +#~ "Y of upper limit of lava in large caves." +#~ msgstr "" +#~ "Устарело, определяет и располагает жидкости в пещерах с использованием " +#~ "определений биома.\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.\n" #~ "Пожалуйста, подождите..." -#~ msgid "Back" -#~ msgstr "Назад" +#~ 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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Включает бампмаппинг для текстур. Карты нормалей должны быть " +#~ "предоставлены\n" +#~ "пакетом текстур или сгенерированы автоматически.\n" +#~ "Требует, чтобы шейдеры были включены." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Включить кинематографическое тональное отображение" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Включает генерацию карт нормалей \"на лету\" (эффект тиснения).\n" +#~ "Требует, чтобы бампмаппинг был включён." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Включает Parallax Occlusion.\n" +#~ "Требует, чтобы шейдеры были включены." + +#~ msgid "Enter " +#~ msgstr "Введите " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Экспериментальная опция, может привести к видимым зазорам\n" +#~ "между блоками, когда значение больше, чем 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "Кадровая частота во время паузы" + +#~ msgid "Fallback font shadow" +#~ msgstr "Тень резервного шрифта" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Прозрачность тени резервного шрифта" + +#~ msgid "Fallback font size" +#~ msgstr "Размер резервного шрифта" + +#~ msgid "Filtering" +#~ msgstr "Фильтрация" + +#~ msgid "Floatland base height noise" +#~ msgstr "Шум базовой высоты парящих островов" + +#~ msgid "Floatland mountain height" +#~ msgstr "Высота гор на парящих островах" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Прозрачность тени шрифта (непрозрачность от 0 до 255)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Размер резервного шрифта в пунктах (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "Шрифты FreeType" + +#~ msgid "Full screen BPP" +#~ msgstr "Глубина цвета в полноэкранном режиме" + +#~ msgid "Game" +#~ msgstr "Игра" + +#~ msgid "Gamma" +#~ msgstr "Гамма" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Создавать карты нормалей" + +#~ msgid "Generate normalmaps" +#~ msgstr "Генерировать карты нормалей" + +#~ msgid "HUD scale factor" +#~ msgstr "Масштаб игрового интерфейса" + +#~ msgid "High-precision FPU" +#~ msgstr "Высокоточный FPU" + +#~ msgid "IPv6 support." +#~ msgstr "Поддержка IPv6." + +#~ 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 "Глубина лавы" + +#~ msgid "Lightness sharpness" +#~ msgstr "Резкость освещённости" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Ограничение очередей emerge на диске" + +#~ msgid "Main" +#~ msgstr "Главное меню" + +#~ msgid "Main menu style" +#~ msgstr "Стиль главного меню" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "Заставляет DirectX работать с LuaJIT. Отключите, если это вызывает " +#~ "проблемы." + +#~ msgid "Menus" +#~ msgstr "Меню" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Миникарта в режиме радара, увеличение x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Миникарта в режиме радара, увеличение x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Миникарта в поверхностном режиме, увеличение x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Миникарта в поверхностном режиме, увеличение x4" + +#~ msgid "Name / Password" +#~ msgstr "Имя / Пароль" + +#~ msgid "Name/Password" +#~ msgstr "Имя/Пароль" + +#~ msgid "No" +#~ msgstr "Нет" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Выборка карт нормалей" + +#~ msgid "Normalmaps strength" +#~ msgstr "Сила карт нормалей" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Количество итераций Parallax Occlusion." #~ msgid "Ok" #~ msgstr "Oк" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "Непрозрачность (альфа) тени за резервным шрифтом, между 0 и 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "Общее смещение эффекта Parallax Occlusion, обычно масштаб/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Общее смещение эффекта Parallax Occlusion." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Объёмные текстуры" + +#~ msgid "Parallax occlusion" +#~ msgstr "Включить параллакс" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Смещение параллакса" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Повторение параллакса" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Режим параллакса" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Масштаб параллаксной окклюзии" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Сила параллакса" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Путь к шрифту TrueType или картинке со шрифтом." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Путь для сохранения скриншотов." + +#~ msgid "Player name" +#~ msgstr "Имя игрока" + +#~ msgid "Profiling" +#~ msgstr "Профилирование" + +#~ msgid "Projecting dungeons" +#~ msgstr "Проступающие подземелья" + +#~ msgid "PvP enabled" +#~ msgstr "PvP разрешён" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Сброс одиночной игры" + +#~ msgid "Select Package File:" +#~ msgstr "Выберите файл дополнения:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Сервер / одиночная игра" + +#~ msgid "" +#~ "Set the shadow update time.\n" +#~ "Lower value means shadows and map updates faster, but it consume more " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "Установить время обновления теней.\n" +#~ "Меньшее значение означает, что тени и карта обновляются быстрее, но это " +#~ "потребляет больше ресурсов.\n" +#~ "Минимальное значение 0,001 секунды, максимальное 0,2 секунды" + +#~ msgid "Shadow limit" +#~ msgstr "Лимит теней" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Смещение тени резервного шрифта (в пикселях). Если указан 0, то тень не " +#~ "будет показана." + +#~ msgid "Special" +#~ msgstr "Особенный" + +#~ msgid "Special key" +#~ msgstr "Клавиша использовать" + +#~ msgid "Start Singleplayer" +#~ msgstr "Начать одиночную игру" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Сила сгенерированных карт нормалей." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Сила среднего подъёма кривой света." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Этот шрифт будет использован для некоторых языков." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Для включения шейдеров необходим драйвер OpenGL." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Кино" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Типичная максимальная высота, выше и ниже средней точки гор парящих " +#~ "островов." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Вариация высоты холмов и глубин озёр на гладкой местности парящих " +#~ "островов." + +#~ msgid "View" +#~ msgstr "Вид" + +#~ msgid "Waving Water" +#~ msgstr "Волны на воде" + +#~ msgid "Waving water" +#~ msgstr "Волны на воде" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Использовать ли шрифты FreeType. Поддержка FreeType должна быть включена " +#~ "при сборке.\n" +#~ "Если отключено, используются растровые и XML-векторные изображения." + +#, fuzzy +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Верхний предел по Y для больших псевдослучайных пещер." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "Y-уровень середины поплавка и поверхности озера." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Y-уровень, на который распространяются тени с плавающей точкой." + +#~ 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 "Ты умер." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/sk/minetest.po b/po/sk/minetest.po index 843c924e3..878e86a1f 100644 --- a/po/sk/minetest.po +++ b/po/sk/minetest.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-07-08 20:47+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:25+0000\n" +"Last-Translator: Marian <daretmavi@gmail.com>\n" "Language-Team: Slovak <https://hosted.weblate.org/projects/minetest/minetest/" "sk/>\n" "Language: sk\n" @@ -17,259 +17,450 @@ 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.2-dev\n" +"X-Generator: Weblate 4.14-dev\n" -#: builtin/client/death_formspec.lua src/client/game.cpp -msgid "You died" -msgstr "Zomrel si" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Vyprázdniť výstupný komunikačný poradovník" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Prázdny príkaz." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Návrat do hlavnej ponuky" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Chybný príkaz: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Spustený príkaz: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Vypísať pripojených hráčov" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Pripojení hráči: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Výstupný komunikačný poradovník je teraz prázdny." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Tento príkaz je zakázaný serverom." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "Oživiť" +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "You died" +msgstr "Zomrel si" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Dostupné príkazy:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Dostupné príkazy: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Príkaz nie je k dispozícií: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Zobraz pomocníka k príkazom" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Použi '.help <cmd>' aby si získal viac informácií, alebo '.help all' pre " +"zobrazenie všetkého." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <príkaz>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "OK" +msgstr "V poriadku" #: builtin/fstk/ui.lua -msgid "The server has requested a reconnect:" -msgstr "Server požadoval obnovu spojenia:" +msgid "<none available>" +msgstr "<nie je k dispozícií>" + +#: builtin/fstk/ui.lua +msgid "An error occurred in a Lua script:" +msgstr "Objavila sa chyba v lua skripte:" + +#: builtin/fstk/ui.lua +msgid "An error occurred:" +msgstr "Objavila sa chyba:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Hlavná ponuka" #: builtin/fstk/ui.lua msgid "Reconnect" msgstr "Znova pripojiť" #: builtin/fstk/ui.lua -msgid "Main menu" -msgstr "Hlavné menu" - -#: builtin/fstk/ui.lua -msgid "An error occurred in a Lua script:" -msgstr "Chyba v lua skripte:" - -#: builtin/fstk/ui.lua -msgid "An error occurred:" -msgstr "Chyba:" - -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Nahrávam..." +msgid "The server has requested a reconnect:" +msgstr "Server požiadal o obnovu spojenia:" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "A new $1 version is available" +msgstr "K dispozícií je nová verzia $1" + +#: builtin/mainmenu/common.lua +msgid "Client Mods" +msgstr "Užívateľské módy" + +#: 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 "" -"Skús znova povoliť verejný zoznam serverov a skontroluj internetové " -"pripojenie." +"Nainštalovaná verzia: $1\n" +"Nová verzia: $2\n" +"Navštív $3 pre informácie ako získať najnovšiu verziu a maj prehľad o " +"funkciách a opravách chýb." #: builtin/mainmenu/common.lua -msgid "Server supports protocol versions between $1 and $2. " -msgstr "Server podporuje verzie protokolov: $1 - $2. " +msgid "Later" +msgstr "Neskôr" + +#: builtin/mainmenu/common.lua +msgid "Never" +msgstr "Nikdy" + +#: builtin/mainmenu/common.lua +msgid "Protocol version mismatch. " +msgstr "Verzie protokolov sa nezhodujú. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " msgstr "Server vyžaduje protokol verzie $1. " #: builtin/mainmenu/common.lua -msgid "We support protocol versions between version $1 and $2." -msgstr "Podporujeme verzie protokolov: $1 - $2." +msgid "Server supports protocol versions between $1 and $2. " +msgstr "Server podporuje verzie protokolov medzi $1 a $2. " + +#: builtin/mainmenu/common.lua +msgid "Visit website" +msgstr "Navštív webovú stránku" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." -msgstr "Podporujeme len protokol verzie $1." +msgstr "Podporujeme iba protokol verzie $1." #: builtin/mainmenu/common.lua -msgid "Protocol version mismatch. " -msgstr "Nesúhlas verzií protokolov. " +msgid "We support protocol versions between version $1 and $2." +msgstr "Podporujeme verzie protokolov medzi $1 a $2." #: builtin/mainmenu/dlg_config_world.lua -msgid "World:" -msgstr "Svet:" +msgid "(Enabled, has error)" +msgstr "(Povolené, s chybou)" #: builtin/mainmenu/dlg_config_world.lua -msgid "No modpack description provided." -msgstr "Popis balíka rozšírení nie je k dispozícií." +msgid "(Unsatisfied)" +msgstr "(Neuspokojivé)" -#: builtin/mainmenu/dlg_config_world.lua -msgid "No game description provided." -msgstr "Popis hry nie je k dispozícií." - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Mod:" -msgstr "Rozšírenie:" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "No (optional) dependencies" -msgstr "Bez (voliteľných) závislostí" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "No hard dependencies" -msgstr "Bez povinných závislostí" - -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -msgid "Optional dependencies:" -msgstr "Voliteľné závislosti:" - -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -msgid "Dependencies:" -msgstr "Závislosti:" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "No optional dependencies" -msgstr "Bez voliteľných závislostí" - -#: builtin/mainmenu/dlg_config_world.lua -#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp -msgid "Save" -msgstr "Ulož" - -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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š" +msgstr "Zrušiť" -#: builtin/mainmenu/dlg_config_world.lua -msgid "Find More Mods" -msgstr "Nájdi viac rozšírení" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Disable modpack" -msgstr "Deaktivuj rozšírenie" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "Enable modpack" -msgstr "Povoľ rozšírenie" - -#: builtin/mainmenu/dlg_config_world.lua -msgid "enabled" -msgstr "povolené" +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +msgstr "Nevyhnutné doplnky:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable all" -msgstr "Deaktivuj všetko" +msgstr "Zakázať všetko" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable modpack" +msgstr "Deaktivuj balíček modifikácií" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "Povoľ všetko" +msgstr "Povoliť všetko" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable modpack" +msgstr "Povoliť balíček modifikácií" #: 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 "" -"Nepodarilo sa aktivovať rozšírenie \"$1\" lebo obsahuje nepovolené znaky. " +"Nepodarilo sa povoliť modifikáciu \"$1\" pretože obsahuje nepovolené znaky. " "Povolené sú len znaky [a-z0-9_]." +#: builtin/mainmenu/dlg_config_world.lua +msgid "Find More Mods" +msgstr "Nájdi viac modifikácií" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No (optional) dependencies" +msgstr "Bez (voliteľných) nevyhnutných doplnkov" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "Popis hry nie je k dispozícií." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No hard dependencies" +msgstr "Bez povinných nevyhnutných doplnkov" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." +msgstr "Popis balíka rozšírení nie je k dispozícií." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No optional dependencies" +msgstr "Bez voliteľných nevuhnutných doplnkov" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "Voliteľné nevyhnutné doplnky:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Uložiť" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Svet:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "povolené" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" už exituje. Chcel by si ho prepísať?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Nevyhnutné doplnky $1 a $2 budú nainštalované." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 od $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 sa sťahuje,\n" +"$2 čaká v rade" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 sťahujem..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 požadované nevyhnutné doplnky nie je možné nájsť." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 bude nainštalovaný a $2 nevyhnutné doplnky budú vynechané." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "Všetky balíky" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Už nainštalované" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Back to Main Menu" +msgstr "Späť na Hlavnú ponuku" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Základná hra:" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "ContentDB nie je k dispozícií ak bol Minetest skompilovaný bez cURL" #: builtin/mainmenu/dlg_contentstore.lua -msgid "All packages" -msgstr "Všetky balíčky" - -#: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Games" -msgstr "Hry" - -#: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Mods" -msgstr "Rozšírenia" - -#: builtin/mainmenu/dlg_contentstore.lua -msgid "Texture packs" -msgstr "Balíčky textúr" +msgid "Downloading..." +msgstr "Sťahujem..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" msgstr "Nepodarilo sa stiahnuť $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Hľadaj" +msgid "Games" +msgstr "Hry" #: builtin/mainmenu/dlg_contentstore.lua -msgid "Back to Main Menu" -msgstr "Naspäť do hlavného menu" +msgid "Install" +msgstr "Nainštalovať" #: builtin/mainmenu/dlg_contentstore.lua -msgid "No results" -msgstr "Bez výsledku" +msgid "Install $1" +msgstr "Nainštalovať $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Nainštalovať chýbajúce nevyhnutné doplnky (závislosti)" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Inštalácia: Nepodporovaný typ súboru, alebo poškodený archív" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Mods" +msgstr "Rozšírenia" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" msgstr "Nepodarilo sa stiahnuť žiadne balíčky" #: builtin/mainmenu/dlg_contentstore.lua -msgid "Downloading..." -msgstr "Sťahujem..." +msgid "No results" +msgstr "Bez výsledkov" #: builtin/mainmenu/dlg_contentstore.lua -msgid "Install" -msgstr "Inštaluj" +msgid "No updates" +msgstr "Bez aktualizácií" #: builtin/mainmenu/dlg_contentstore.lua -msgid "Update" -msgstr "Aktualizuj" +msgid "Not found" +msgstr "Nenájdené" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Prepísať" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Prosím skontroluj či je základná hra v poriadku." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Čaká v rade" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" +msgstr "Balíky textúr" #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" -msgstr "Odinštaluj" +msgstr "Odinštalovať" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Zobraziť" +msgid "Update" +msgstr "Aktualizácia" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "Aktualizovať všetky [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Pozri si viac informácií vo webovom prehliadači" #: builtin/mainmenu/dlg_create_world.lua -msgid "Caverns" -msgstr "Jaskyne" +msgid "A world named \"$1\" already exists" +msgstr "Svet s názvom \"$1\" už existuje" #: builtin/mainmenu/dlg_create_world.lua -msgid "Very large caverns deep in the underground" -msgstr "Obrovské jaskyne hlboko v podzemí" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Sea level rivers" -msgstr "Rieky na úrovni hladiny mora" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Rivers" -msgstr "Rieky" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Mountains" -msgstr "Hory" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Floatlands (experimental)" -msgstr "Lietajúce krajiny (experimentálne)" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Floating landmasses in the sky" -msgstr "Poletujúce pevniny na oblohe" +msgid "Additional terrain" +msgstr "Dodatočný terén" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" msgstr "Ochladenie s nadmorskou výškou" -#: builtin/mainmenu/dlg_create_world.lua -msgid "Reduces heat with altitude" -msgstr "Znižuje teplotu s nadmorskou výškou" - #: builtin/mainmenu/dlg_create_world.lua msgid "Altitude dry" msgstr "Sucho v nadmorskej výške" #: builtin/mainmenu/dlg_create_world.lua -msgid "Reduces humidity with altitude" -msgstr "Znižuje vlhkosť s nadmorskou výškou" +msgid "Biome blending" +msgstr "Miešanie ekosystémov" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biomes" +msgstr "Ekosystémy" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caverns" +msgstr "Jaskyne" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caves" +msgstr "Jaskyne" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "Vytvoriť" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "Dekorácie" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Development Test is meant for developers." +msgstr "Vývojový Test je určený vývojárom." + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Dungeons" +msgstr "Kobky" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "Rovný terén" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "Poletujúce pevniny na oblohe" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "Lietajúce krajiny (experimentálne)" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "Generuj nefragmentovaný terén: oceány a podzemie" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Hills" +msgstr "Kopce" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" @@ -280,8 +471,16 @@ msgid "Increases humidity around rivers" msgstr "Zvyšuje vlhkosť v okolí riek" #: builtin/mainmenu/dlg_create_world.lua -msgid "Vary river depth" -msgstr "Premenlivá hĺbka riek" +msgid "Install a game" +msgstr "Nainštalovať hru" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "Nainštalovať inú hru" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Lakes" +msgstr "Jazerá" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" @@ -289,69 +488,58 @@ msgstr "" "Nízka vlhkosť a vysoké teploty spôsobujú znižovanie hladín, alebo vysychanie " "riek" -#: builtin/mainmenu/dlg_create_world.lua -msgid "Hills" -msgstr "Kopce" +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "Generátor mapy" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "Príznaky generátora máp" #: builtin/mainmenu/dlg_create_world.lua -msgid "Lakes" -msgstr "Jazerá" +msgid "Mapgen-specific flags" +msgstr "Špecifické príznaky generátora máp" #: builtin/mainmenu/dlg_create_world.lua -msgid "Additional terrain" -msgstr "Dodatočný terén" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "Generuj nefragmentovaný terén: oceány a podzemie" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Trees and jungle grass" -msgstr "Stromy a vysoká tráva" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Flat terrain" -msgstr "Rovný terén" +msgid "Mountains" +msgstr "Hory" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" msgstr "Prúd bahna" #: builtin/mainmenu/dlg_create_world.lua -msgid "Terrain surface erosion" -msgstr "Erózia terénu" +msgid "Network of tunnels and caves" +msgstr "Sieť tunelov a jaskýň" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "Mierne pásmo, Púšť, Džungľa, Tundra, Tajga" +msgid "No game selected" +msgstr "Nie je zvolená hra" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert, Jungle" -msgstr "Mierne pásmo, Púšť, Džungľa" +msgid "Reduces heat with altitude" +msgstr "Znižuje teplotu s nadmorskou výškou" #: builtin/mainmenu/dlg_create_world.lua -msgid "Temperate, Desert" -msgstr "Mierne pásmo, Púšť" +msgid "Reduces humidity with altitude" +msgstr "Znižuje vlhkosť s nadmorskou výškou" #: builtin/mainmenu/dlg_create_world.lua -msgid "You have no games installed." -msgstr "Nie je nainštalovaná žiadna hra." +msgid "Rivers" +msgstr "Rieky" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Stiahni jednu z minetest.net" +msgid "Sea level rivers" +msgstr "Rieky na úrovni hladiny mora" #: builtin/mainmenu/dlg_create_world.lua -msgid "Caves" -msgstr "Jaskyne" +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" +msgstr "Semienko" #: builtin/mainmenu/dlg_create_world.lua -msgid "Dungeons" -msgstr "Kobky" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Decorations" -msgstr "Dekorácie" +msgid "Smooth transition between biomes" +msgstr "Plynulý prechod medzi ekosystémami" #: builtin/mainmenu/dlg_create_world.lua msgid "" @@ -366,65 +554,40 @@ msgid "Structures appearing on the terrain, typically trees and plants" msgstr "Štruktúry objavujúce sa na povrchu, typicky stromy a rastliny" #: builtin/mainmenu/dlg_create_world.lua -msgid "Network of tunnels and caves" -msgstr "Sieť tunelov a jaskýň" +msgid "Temperate, Desert" +msgstr "Mierne pásmo, Púšť" #: builtin/mainmenu/dlg_create_world.lua -msgid "Biomes" -msgstr "Ekosystémy" +msgid "Temperate, Desert, Jungle" +msgstr "Mierne pásmo, Púšť, Džungľa" #: builtin/mainmenu/dlg_create_world.lua -msgid "Biome blending" -msgstr "Miešanie ekosystémov" +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgstr "Mierne pásmo, Púšť, Džungľa, Tundra, Tajga" #: builtin/mainmenu/dlg_create_world.lua -msgid "Smooth transition between biomes" -msgstr "Plynulý prechod medzi ekosystémami" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Mapgen flags" -msgstr "Príznaky generátora máp" +msgid "Terrain surface erosion" +msgstr "Erózia terénu" #: builtin/mainmenu/dlg_create_world.lua -msgid "Mapgen-specific flags" -msgstr "Špecifické príznaky generátora máp" +msgid "Trees and jungle grass" +msgstr "Stromy a vysoká tráva" #: builtin/mainmenu/dlg_create_world.lua -msgid "Warning: The Development Test is meant for developers." -msgstr "Varovanie: Vývojarský Test je určený vývojárom." +msgid "Vary river depth" +msgstr "Premenlivá hĺbka riek" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Stiahni si hru, ako napr. Minetest Game z minetest.net" +msgid "Very large caverns deep in the underground" +msgstr "Obrovské jaskyne hlboko v podzemí" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "Meno sveta" #: builtin/mainmenu/dlg_create_world.lua -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Seed" -msgstr "Semienko" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Mapgen" -msgstr "Generátor mapy" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Hra" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Create" -msgstr "Vytvor" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "A world named \"$1\" already exists" -msgstr "Svet menom \"$1\" už existuje" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "No game selected" -msgstr "Nie je zvolená hra" +msgid "You have no games installed." +msgstr "Nie je nainštalovaná žiadna hra." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" @@ -434,7 +597,7 @@ msgstr "Si si istý, že chceš zmazať \"$1\"?" #: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua #: src/client/keycode.cpp msgid "Delete" -msgstr "Zmaž" +msgstr "Vymazať" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: failed to delete \"$1\"" @@ -448,10 +611,44 @@ msgstr "pkgmgr: nesprávna cesta \"$1\"" msgid "Delete World \"$1\"?" msgstr "Zmazať svet \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Potvrď heslo" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "Pripája sa $1" + +#: builtin/mainmenu/dlg_register.lua +msgid "Missing name" +msgstr "Chýba meno" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Name" +msgstr "Meno" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Heslo" + +#: builtin/mainmenu/dlg_register.lua +msgid "Passwords do not match" +msgstr "Heslá sa nezhodujú" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "Registrovať sa" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Prijať" +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "Premenuj balíček rozšírení:" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "" "This modpack has an explicit name given in its modpack.conf which will " @@ -460,57 +657,129 @@ msgstr "" "Tento balíček rozšírení má vo svojom modpack.conf explicitne zadané meno, " "ktoré prepíše akékoľvek tunajšie premenovanie." -#: builtin/mainmenu/dlg_rename_modpack.lua -msgid "Rename Modpack:" -msgstr "Premenuj balíček rozšírení:" - #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Disabled" -msgstr "Zablokované" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Enabled" -msgstr "Povolené" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Browse" -msgstr "Prehliadaj" - -#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp -msgid "Offset" -msgstr "Ofset" - -#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp -msgid "Scale" -msgstr "Mierka" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "X spread" -msgstr "Rozptyl X" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Y spread" -msgstr "Rozptyl Y" +msgid "(No description of setting given)" +msgstr "(Nie je zadaný popis nastavenia)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "2D Noise" msgstr "2D šum" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Z spread" -msgstr "Rozptyl Z" +msgid "< Back to Settings page" +msgstr "< Späť na nastavenia" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Browse" +msgstr "Prehliadaj" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Games" +msgstr "Doplnky: Hry" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Mods" +msgstr "Doplnky: Rozšírenia (módy)" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua +msgid "Disabled" +msgstr "Vypnuté" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "Upraviť" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "Aktivované" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Lacunarity" +msgstr "Lakunarita" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Octaves" msgstr "Oktávy" +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" +msgstr "Ofset" + #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Vytrvalosť" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Lacunarity" -msgstr "Lakunarita" +msgid "Please enter a valid integer." +msgstr "Prosím zadaj platné celé číslo." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "Prosím vlož platné číslo." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "Obnov štand. hodnoty" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "Mierka" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Hľadaj" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "Zvoľ adresár" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "Zvoľ súbor" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "Zobraz technické názvy" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "Hodnota musí byť najmenej $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "Hodnota nesmie byť vyššia ako $1." + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "Rozptyl X" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "Rozptyl Y" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "Z" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "Rozptyl Z" + +#. ~ "absvalue" is a noise parameter flag. +#. It is short for "absolute value". +#. It can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "absvalue" +msgstr "Absolútna hodnota (absvalue)" #. ~ "defaults" is a noise parameter flag. #. It describes the default processing options @@ -527,89 +796,22 @@ msgstr "štandardné hodnoty (defaults)" msgid "eased" msgstr "zjemnené (eased)" -#. ~ "absvalue" is a noise parameter flag. -#. It is short for "absolute value". -#. It can be enabled in noise settings in -#. main menu -> "All Settings". -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "absvalue" -msgstr "Absolútna hodnota (absvalue)" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "X" -msgstr "X" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Y" -msgstr "Y" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Z" -msgstr "Z" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "(No description of setting given)" -msgstr "(Nie je zadaný popis nastavenia)" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Please enter a valid integer." -msgstr "Prosím zadaj platné celé číslo." - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must be at least $1." -msgstr "Hodnota musí byť najmenej $1." - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "The value must not be larger than $1." -msgstr "Hodnota nesmie byť vyššia ako $1." - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Please enter a valid number." -msgstr "Prosím vlož platné číslo." - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Select directory" -msgstr "Zvoľ adresár" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Select file" -msgstr "Zvoľ súbor" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "< Back to Settings page" -msgstr "< Späť na nastavenia" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Edit" -msgstr "Upraviť" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Restore Default" -msgstr "Obnov štandardné hodnoty" - -#: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Show technical names" -msgstr "Zobraz technické názvy" - #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" -msgstr "$1 (povolený)" +msgstr "$1 (Aktivované)" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a $1 as a texture pack" -msgstr "Nie je možné nainštalovať $1 ako balíček textúr" +msgid "$1 mods" +msgstr "$1 rozšírenia" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" msgstr "Zlyhala inštalácia $1 na $2" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to find a valid mod or modpack" -msgstr "Nie je možné nájsť platné rozšírenie, alebo balíček rozšírení" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a modpack as a $1" -msgstr "Nie je možné nainštalovať balíček rozšírení $1" +msgid "Install Mod: Unable to find real mod name for: $1" +msgstr "" +"Inštalácia rozšírenia: Nie je možné nájsť skutočné meno rozšírenia pre: $1" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" @@ -618,37 +820,102 @@ msgstr "" "rozšírení $1" #: builtin/mainmenu/pkgmgr.lua -msgid "Unable to install a mod as a $1" -msgstr "Nie je možné nainštalovať rozšírenie $1" +msgid "Unable to find a valid mod or modpack" +msgstr "Nie je možné nájsť platné rozšírenie, alebo balíček rozšírení" #: builtin/mainmenu/pkgmgr.lua -msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "" -"Inštalácia rozšírenia: Nie je možné nájsť skutočné meno rozšírenia pre: $1" +msgid "Unable to install a $1 as a texture pack" +msgstr "Nie je možné nainštalovať $1 ako balíček textúr" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a game as a $1" msgstr "Nie je možné nainštalovať hru $1" #: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Inštalácia: súbor: \"$1\"" +msgid "Unable to install a mod as a $1" +msgstr "Nie je možné nainštalovať rozšírenie $1" #: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Inštalácia: Nepodporovaný typ súboru \"$1\", alebo poškodený archív" +msgid "Unable to install a modpack as a $1" +msgstr "Nie je možné nainštalovať balíček rozšírení $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "$1 mods" -msgstr "$1 rozšírenia" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Nahrávam..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Zoznam verejných serverov je zakázaný" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Skús znova povoliť verejný zoznam serverov a skontroluj internetové " +"pripojenie." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "O" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktívny prispievatelia" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Aktívny renderer:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Hlavný vývojari" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Otvor adresár užívateľa" + +#: 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 "" +"Otvor adresár, ktorý obsahuje svety, hry, mody a textúry\n" +"od užívateľov v správcovi/prieskumníkovi súborov." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Predchádzajúci prispievatelia" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Predchádzajúci hlavný vývojári" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "Zdieľaj ladiaci záznam (debug log)" + +#: builtin/mainmenu/tab_content.lua +msgid "Browse online content" +msgstr "Hľadaj nový obsah na internete" + +#: builtin/mainmenu/tab_content.lua +msgid "Content" +msgstr "Doplnky" + +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "Deaktivuj balíček textúr" + +#: builtin/mainmenu/tab_content.lua +msgid "Information:" +msgstr "Informácie:" #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" msgstr "Nainštalované balíčky:" #: builtin/mainmenu/tab_content.lua -msgid "Browse online content" -msgstr "Prehliadaj online obsah" +msgid "No dependencies." +msgstr "Bez závislostí." #: builtin/mainmenu/tab_content.lua msgid "No package description available" @@ -658,630 +925,530 @@ msgstr "Nie je k dispozícií popis balíčka" msgid "Rename" msgstr "Premenuj" -#: builtin/mainmenu/tab_content.lua -msgid "No dependencies." -msgstr "Bez závislostí." - -#: builtin/mainmenu/tab_content.lua -msgid "Disable Texture Pack" -msgstr "Deaktivuj balíček textúr" - -#: builtin/mainmenu/tab_content.lua -msgid "Use Texture Pack" -msgstr "Použi balíček textúr" - -#: builtin/mainmenu/tab_content.lua -msgid "Information:" -msgstr "Informácie:" - #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" msgstr "Odinštaluj balíček" #: builtin/mainmenu/tab_content.lua -msgid "Content" -msgstr "Obsah" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Uznanie" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Hlavný vývojari" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktívny prispievatelia" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Predchádzajúci hlavný vývojári" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Predchádzajúci prispievatelia" - -#: builtin/mainmenu/tab_local.lua -msgid "Install games from ContentDB" -msgstr "Inštaluj hru z ContentDB" - -#: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigurácia" - -#: builtin/mainmenu/tab_local.lua -msgid "New" -msgstr "Nový" - -#: builtin/mainmenu/tab_local.lua -msgid "Select World:" -msgstr "Zvoľ si svet:" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Creative Mode" -msgstr "Kreatívny mód" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua -msgid "Enable Damage" -msgstr "Povoľ poškodenie" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Server" -msgstr "Hosťuj server" - -#: builtin/mainmenu/tab_local.lua -msgid "Host Game" -msgstr "Hosťuj hru" +msgid "Use Texture Pack" +msgstr "Použi balíček textúr" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Zverejni server" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Meno/Heslo" - #: builtin/mainmenu/tab_local.lua msgid "Bind Address" msgstr "Priraď adresu" #: builtin/mainmenu/tab_local.lua +msgid "Creative Mode" +msgstr "Kreatívny mód" + +#: builtin/mainmenu/tab_local.lua +msgid "Enable Damage" +msgstr "Aktivuj zranenie" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "Hosťuj hru" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "Hosťuj server" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +msgstr "Inštaluj hry z ContentDB" + +#: builtin/mainmenu/tab_local.lua +msgid "New" +msgstr "Nový" + +#: builtin/mainmenu/tab_local.lua +msgid "No world created or selected!" +msgstr "Nie je vytvorený ani zvolený svet!" + +#: builtin/mainmenu/tab_local.lua +msgid "Play Game" +msgstr "Hraj hru" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Zvoľ mody" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "Zvoľ si svet:" + #: builtin/mainmenu/tab_local.lua msgid "Server Port" msgstr "Port servera" -#: builtin/mainmenu/tab_local.lua -msgid "Play Game" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "No world created or selected!" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Start Game" -msgstr "" +msgstr "Spusti hru" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "" +msgid "Address" +msgstr "Adresa" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Zmaž" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Ping" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" -msgstr "" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "" +msgstr "Kreatívny mód" #. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Zranenie / PvP" + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Obľúbené" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Nekompatibilné servery" #: builtin/mainmenu/tab_online.lua msgid "Join Game" -msgstr "" +msgstr "Pripoj sa do hry" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "Prihlásiť sa" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "Ping" + +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Verejné servery" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Obnov" + +#: builtin/mainmenu/tab_online.lua +msgid "Remove favorite" +msgstr "Odstráň z obľúbených" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Popis servera" #: builtin/mainmenu/tab_settings.lua -msgid "Opaque Leaves" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Simple Leaves" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Fancy Leaves" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Node Outlining" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Node Highlighting" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "None" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Trilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No Mipmap" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Mipmap" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Mipmap + Aniso. Filter" -msgstr "" +msgid "(game support required)" +msgstr "(vyžaduje sa podpora hry)" #: builtin/mainmenu/tab_settings.lua msgid "2x" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "4x" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "8x" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Smooth Lighting" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Particles" -msgstr "" +msgstr "2x" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "" +msgstr "3D mraky" #: builtin/mainmenu/tab_settings.lua -msgid "Opaque Water" -msgstr "" +msgid "4x" +msgstr "4x" #: builtin/mainmenu/tab_settings.lua -msgid "Connected Glass" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Texturing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Antialiasing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Screen:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Autosave Screen Size" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Shaders" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Shaders (unavailable)" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/client/game.cpp -msgid "Change Keys" -msgstr "" +msgid "8x" +msgstr "8x" #: builtin/mainmenu/tab_settings.lua msgid "All Settings" -msgstr "" +msgstr "Všetky nastavenia" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "" +msgid "Antialiasing:" +msgstr "Vyhladzovanie:" #: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" +msgid "Autosave Screen Size" +msgstr "Automat. ulož. veľkosti okna" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "Bilineárny filter" + +#: builtin/mainmenu/tab_settings.lua src/client/game.cpp +msgid "Change Keys" +msgstr "Zmeň ovládacie klávesy" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "Prepojené sklo" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Tone Mapping" -msgstr "" +msgid "Dynamic shadows" +msgstr "Dynamické tiene" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" +msgid "Dynamic shadows:" +msgstr "Dynamické tiene:" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Liquids" -msgstr "" +msgid "Fancy Leaves" +msgstr "Ozdobné listy" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Leaves" -msgstr "" +msgid "High" +msgstr "Vysoké" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Plants" -msgstr "" +msgid "Low" +msgstr "Nízke" #: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" +msgid "Medium" +msgstr "Stredné" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "Mipmapy" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "Mipmapy + Aniso. filter" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "Žiaden filter" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "Žiadne Mipmapy" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "Nasvietenie kocky" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "Obrys kocky" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "Žiadne" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "Nepriehľadné listy" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "Nepriehľadná voda" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "Častice" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "Zobrazenie:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "" +msgstr "Nastavenia" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "Shadery" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shadery (experimentálne)" -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "Shadery (nedostupné)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "Jednoduché listy" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "Jemné osvetlenie" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "Textúrovanie:" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "Optim. farieb" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touch threshold (px):" +msgstr "Dotykový prah (px):" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "Trilineárny filter" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "Veľmi vysoké" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Veľmi nízke" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "Vlniace sa listy" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "Vlniace sa kvapaliny" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Plants" +msgstr "Vlniace sa rastliny" #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "Spojenie zrušené (chyba protokolu?)." + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." -msgstr "" - -#: src/client/client.cpp -msgid "Loading textures..." -msgstr "" - -#: src/client/client.cpp -msgid "Rebuilding shaders..." -msgstr "" - -#: src/client/client.cpp -msgid "Initializing nodes..." -msgstr "" - -#: src/client/client.cpp -msgid "Initializing nodes" -msgstr "" +msgstr "Časový limit pripojenia vypršal." #: src/client/client.cpp msgid "Done!" -msgstr "" +msgstr "Hotovo!" -#: src/client/clientlauncher.cpp -msgid "Main Menu" -msgstr "" +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "Inicializujem kocky" -#: src/client/clientlauncher.cpp -msgid "Player name too long." -msgstr "" +#: src/client/client.cpp +msgid "Initializing nodes..." +msgstr "Inicializujem kocky..." + +#: src/client/client.cpp +msgid "Loading textures..." +msgstr "Nahrávam textúry..." + +#: src/client/client.cpp +msgid "Rebuilding shaders..." +msgstr "Obnovujem shadery..." #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "" +msgstr "Chyba spojenia (časový limit?)" #: src/client/clientlauncher.cpp -msgid "Provided password file failed to open: " -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "Please choose a name!" -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "No world selected and no address provided. Nothing to do." -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "Provided world path doesn't exist: " -msgstr "" - -#: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "" +msgid "Could not find or load game: " +msgstr "Nie je možné nájsť alebo nahrať hru: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." -msgstr "" +msgstr "Chybná špec. hry." -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "" +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "Hlavné menu" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "Nie je zvolený svet ani poskytnutá adresa. Niet čo robiť." + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "Meno hráča je príliš dlhé." + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "Prosím zvoľ si meno!" + +#: src/client/clientlauncher.cpp +msgid "Provided password file failed to open: " +msgstr "Dodaný súbor s heslom nie je možné otvoriť: " + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "Zadaná cesta k svetu neexistuje: " #: src/client/game.cpp -msgid "Shutting down..." +msgid "" +"\n" +"Check debug.txt for details." msgstr "" +"\n" +"Pozri detaily v debug.txt." #: src/client/game.cpp -msgid "Creating server..." -msgstr "" +msgid "- Address: " +msgstr "- Adresa: " #: src/client/game.cpp -msgid "Creating client..." -msgstr "" +msgid "- Mode: " +msgstr "- Mode: " #: src/client/game.cpp -msgid "Resolving address..." -msgstr "" +msgid "- Port: " +msgstr "- Port: " #: src/client/game.cpp -msgid "Connecting to server..." -msgstr "" +msgid "- Public: " +msgstr "- Verejný: " + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +msgid "- PvP: " +msgstr "- PvP: " #: src/client/game.cpp -msgid "Item definitions..." -msgstr "" +msgid "- Server Name: " +msgstr "- Meno servera: " #: src/client/game.cpp -msgid "Node definitions..." -msgstr "" - -#: src/client/game.cpp -msgid "Media..." -msgstr "" - -#: src/client/game.cpp -msgid "KiB/s" -msgstr "" - -#: src/client/game.cpp -msgid "MiB/s" -msgstr "" - -#: src/client/game.cpp -msgid "Client side scripting is disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Sound muted" -msgstr "" - -#: src/client/game.cpp -msgid "Sound unmuted" -msgstr "" - -#: src/client/game.cpp -msgid "Sound system is disabled" -msgstr "" +msgid "A serialization error occurred:" +msgstr "Chyba pri serializácií:" #: src/client/game.cpp #, c-format -msgid "Volume changed to %d%%" -msgstr "" - -#: src/client/game.cpp -msgid "Sound system is not supported on this build" -msgstr "" - -#: src/client/game.cpp -msgid "ok" -msgstr "" - -#: src/client/game.cpp -msgid "Fly mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "" - -#: src/client/game.cpp -msgid "Fly mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Pitch move mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Pitch move mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fast mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "" - -#: src/client/game.cpp -msgid "Fast mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Noclip mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "" - -#: src/client/game.cpp -msgid "Noclip mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Cinematic mode enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Cinematic mode disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Automatic forward enabled" -msgstr "" +msgid "Access denied. Reason: %s" +msgstr "Prístup zamietnutý. Dôvod: %s" #: src/client/game.cpp msgid "Automatic forward disabled" -msgstr "" +msgstr "Automatický pohyb vpred je zakázaný" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" +msgid "Automatic forward enabled" +msgstr "Automatický pohyb vpred je aktivovaný" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" +msgid "Block bounds hidden" +msgstr "Hranice bloku sú skryté" #: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Block bounds shown for all blocks" +msgstr "Hranice bloku sú zobrazené pre všetky bloky" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" +msgid "Block bounds shown for current block" +msgstr "Hranice bloku sú zobrazené pre aktuálny blok" #: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap currently disabled by game or mod" -msgstr "" - -#: src/client/game.cpp -msgid "Fog disabled" -msgstr "" - -#: src/client/game.cpp -msgid "Fog enabled" -msgstr "" - -#: src/client/game.cpp -msgid "Debug info shown" -msgstr "" - -#: src/client/game.cpp -msgid "Profiler graph shown" -msgstr "" - -#: src/client/game.cpp -msgid "Wireframe shown" -msgstr "" - -#: src/client/game.cpp -msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Debug info and profiler graph hidden" -msgstr "" +msgid "Block bounds shown for nearby blocks" +msgstr "Hranice bloku sú zobrazené pre blízke bloky" #: src/client/game.cpp msgid "Camera update disabled" -msgstr "" +msgstr "Aktualizácia kamery je zakázaná" #: src/client/game.cpp msgid "Camera update enabled" -msgstr "" +msgstr "Aktualizácia kamery je aktivovaná" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Hranice bloku nie je možné zobraziť (zakázané rozšírením, alebo hrou)" + +#: src/client/game.cpp +msgid "Change Password" +msgstr "Zmeniť heslo" + +#: src/client/game.cpp +msgid "Cinematic mode disabled" +msgstr "Filmový režim je zakázaný" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "Filmový režim je aktivovaný" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Klient je odpojený" + +#: src/client/game.cpp +msgid "Client side scripting is disabled" +msgstr "Skriptovanie na strane klienta je zakázané" + +#: src/client/game.cpp +msgid "Connecting to server..." +msgstr "Pripájam sa k serveru..." + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Spojenie sa z neznámeho dôvodu nepodarilo" + +#: src/client/game.cpp +msgid "Continue" +msgstr "Pokračuj" #: src/client/game.cpp #, c-format -msgid "Viewing range is at maximum: %d" +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" msgstr "" +"Ovládanie:\n" +"- %s: pohyb vpred\n" +"- %s: pohyb vzad\n" +"- %s: pohyb doľava\n" +"- %s: pohyb doprava\n" +"- %s: skoč/vylez\n" +"- %s: kop/udri\n" +"- %s: polož/použi\n" +"- %s: zakrádaj sa/choď dole\n" +"- %s: odhoď vec\n" +"- %s: inventár\n" +"- Myš: otoč sa/obzeraj sa\n" +"- Myš koliesko: zvoľ si vec\n" +"- %s: komunikácia\n" #: src/client/game.cpp #, c-format -msgid "Viewing range changed to %d" -msgstr "" +msgid "Couldn't resolve address: %s" +msgstr "Nepodarilo za vyhodnotiť adresu: %s" #: src/client/game.cpp -#, c-format -msgid "Viewing range is at minimum: %d" -msgstr "" +msgid "Creating client..." +msgstr "Vytváram klienta..." #: src/client/game.cpp -msgid "Enabled unlimited viewing range" -msgstr "" +msgid "Creating server..." +msgstr "Vytváram server..." #: src/client/game.cpp -msgid "Disabled unlimited viewing range" -msgstr "" +msgid "Debug info and profiler graph hidden" +msgstr "Ladiace informácie a Profilový graf sú skryté" #: src/client/game.cpp -msgid "Zoom currently disabled by game or mod" -msgstr "" +msgid "Debug info shown" +msgstr "Ladiace informácie zobrazené" + +#: src/client/game.cpp +msgid "Debug info, profiler graph, and wireframe hidden" +msgstr "Ladiace informácie, Profilový graf a Obrysy sú skryté" #: src/client/game.cpp msgid "" @@ -1298,600 +1465,718 @@ msgid "" "- touch&drag, tap 2nd finger\n" " --> place single item to slot\n" msgstr "" +"Štandardné ovládanie:\n" +"Menu nie je zobrazené:\n" +"- jeden klik: tlačidlo aktivuj\n" +"- dvojklik: polož/použi\n" +"- posun prstom: pozeraj sa dookola\n" +"Menu/Inventár je zobrazené/ý:\n" +"- dvojklik (mimo):\n" +" -->zatvor\n" +"- klik na kôpku, klik na pozíciu:\n" +" --> presuň kôpku \n" +"- chyť a prenes, klik druhým prstom\n" +" --> polož jednu vec na pozíciu\n" + +#: src/client/game.cpp +msgid "Disabled unlimited viewing range" +msgstr "Neobmedzená dohľadnosť je zakázaná" + +#: src/client/game.cpp +msgid "Enabled unlimited viewing range" +msgstr "Neobmedzená dohľadnosť je aktivovaná" #: src/client/game.cpp #, c-format -msgid "" -"Controls:\n" -"- %s: move forwards\n" -"- %s: move backwards\n" -"- %s: move left\n" -"- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" -"- %s: drop item\n" -"- %s: inventory\n" -"- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" -"- Mouse wheel: select item\n" -"- %s: chat\n" -msgstr "" - -#: src/client/game.cpp -msgid "Continue" -msgstr "" - -#: src/client/game.cpp -msgid "Change Password" -msgstr "" - -#: src/client/game.cpp -msgid "Game paused" -msgstr "" - -#: src/client/game.cpp -msgid "Sound Volume" -msgstr "" +msgid "Error creating client: %s" +msgstr "Chyba pri vytváraní klienta: %s" #: src/client/game.cpp msgid "Exit to Menu" -msgstr "" +msgstr "Návrat do menu" #: src/client/game.cpp msgid "Exit to OS" -msgstr "" +msgstr "Ukončiť hru" + +#: src/client/game.cpp +msgid "Fast mode disabled" +msgstr "Rýchly režim je zakázaný" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "Rýchly režim je aktívny" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "Rýchly režim je aktivovaný (poznámka: chýba právo 'fast')" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "Režim lietania je zakázaný" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "Režim lietania je aktívny" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "Režim lietania je aktívny (poznámka: chýba právo 'fly')" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "Hmla je vypnutá" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "Hmla je aktivovaná" #: src/client/game.cpp msgid "Game info:" -msgstr "" +msgstr "Informácie o hre:" #: src/client/game.cpp -msgid "- Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "Remote server" -msgstr "" - -#: src/client/game.cpp -msgid "- Address: " -msgstr "" +msgid "Game paused" +msgstr "Hra je pozastavená" #: src/client/game.cpp msgid "Hosting server" -msgstr "" +msgstr "Beží server" #: src/client/game.cpp -msgid "- Port: " -msgstr "" +msgid "Item definitions..." +msgstr "Definície vecí..." #: src/client/game.cpp -msgid "Singleplayer" -msgstr "" +msgid "KiB/s" +msgstr "KiB/s" #: src/client/game.cpp -msgid "On" +msgid "Media..." +msgstr "Média..." + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "MiB/s" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "Minimapa je aktuálne zakázaná hrou, alebo rozšírením" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "Hra pre viacerých hráčov" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "Režim prechádzania stenami je zakázaný" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "Režim prechádzania stenami je aktivovaný" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" msgstr "" +"Režim prechádzania stenami je aktivovaný (poznámka: chýba právo 'noclip')" + +#: src/client/game.cpp +msgid "Node definitions..." +msgstr "Definície kocky..." #: src/client/game.cpp msgid "Off" -msgstr "" +msgstr "Vypnutý" #: src/client/game.cpp -msgid "- Damage: " -msgstr "" +msgid "On" +msgstr "Aktívny" #: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#. ~ PvP = Player versus Player -#: src/client/game.cpp -msgid "- PvP: " -msgstr "" +msgid "Pitch move mode disabled" +msgstr "Režim pohybu podľa sklonu je zakázaný" #: src/client/game.cpp -msgid "- Public: " -msgstr "" +msgid "Pitch move mode enabled" +msgstr "Režim pohybu podľa sklonu je aktívny" #: src/client/game.cpp -msgid "- Server Name: " -msgstr "" +msgid "Profiler graph shown" +msgstr "Profilový graf je zobrazený" #: src/client/game.cpp -msgid "" -"\n" -"Check debug.txt for details." -msgstr "" +msgid "Remote server" +msgstr "Vzdialený server" -#: src/client/gameui.cpp -msgid "Chat shown" -msgstr "" +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "Prekladám adresu..." + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "Vypínam..." + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "Hra pre jedného hráča" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "Hlasitosť" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "Zvuk je stlmený" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "Zvukový systém je zakázaný" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "Zvukový systém nie je podporovaný v tomto zostavení" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "Zvuk je obnovený" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Na serveri pravdepodobne beží iná verzia %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Nemôžem sa pripojiť na %s, lebo IPv6 je zakázané" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Nemôžem sa spojiť s %s, lebo IPv6 je zakázané" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "Dohľadnosť je zmenená na %d" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +msgstr "Dohľadnosť je na maxime: %d" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at minimum: %d" +msgstr "Dohľadnosť je na minime: %d" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "Hlasitosť zmenená na %d%%" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "Obrysy zobrazené" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "Zväčšenie je zakázané hrou, alebo rozšírením" + +#: src/client/game.cpp +msgid "ok" +msgstr "ok" #: src/client/gameui.cpp msgid "Chat hidden" -msgstr "" +msgstr "Komunikačná konzola je skrytá" #: src/client/gameui.cpp -msgid "HUD shown" -msgstr "" +msgid "Chat shown" +msgstr "Komunikačná konzola je zobrazená" #: src/client/gameui.cpp msgid "HUD hidden" -msgstr "" +msgstr "HUD je skryrý" + +#: src/client/gameui.cpp +msgid "HUD shown" +msgstr "HUD je zobrazený" + +#: src/client/gameui.cpp +msgid "Profiler hidden" +msgstr "Profilovanie je skryté" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" - -#: src/client/gameui.cpp -msgid "Profiler hidden" -msgstr "" +msgstr "Profilovanie je zobrazené (strana %d z %d)" #: src/client/keycode.cpp -msgid "Left Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "Middle Button" -msgstr "" - -#: src/client/keycode.cpp -msgid "X Button 1" -msgstr "" - -#: src/client/keycode.cpp -msgid "X Button 2" -msgstr "" +msgid "Apps" +msgstr "Aplikácie" #: src/client/keycode.cpp msgid "Backspace" -msgstr "" +msgstr "Backspace" #: src/client/keycode.cpp -msgid "Tab" -msgstr "" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - -#: src/client/keycode.cpp -msgid "Return" -msgstr "" - -#: src/client/keycode.cpp -msgid "Shift" -msgstr "" +msgid "Caps Lock" +msgstr "Caps Lock" #: src/client/keycode.cpp msgid "Control" -msgstr "" +msgstr "CTRL" + +#: src/client/keycode.cpp +msgid "Down" +msgstr "Dole" + +#: src/client/keycode.cpp +msgid "End" +msgstr "End" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "Zmaž EOF" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "Spustiť" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "Pomoc" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "Home" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "IME Súhlas" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "IME Konvertuj" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "IME Escape" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "IME Zmena módu" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "IME Nekonvertuj" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "Vlož" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "Vľavo" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "Ľavé tlačítko" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "Ľavý CRTL" + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "Ľavé Menu" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "Ľavý Shift" + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "Ľavá klávesa Windows" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp msgid "Menu" -msgstr "" +msgstr "Menu" #: src/client/keycode.cpp -msgid "Pause" -msgstr "" +msgid "Middle Button" +msgstr "Stredné tlačítko" #: src/client/keycode.cpp -msgid "Caps Lock" -msgstr "" +msgid "Num Lock" +msgstr "Num Lock" #: src/client/keycode.cpp -msgid "Space" -msgstr "" +msgid "Numpad *" +msgstr "Numerická klávesnica *" #: src/client/keycode.cpp -msgid "Page up" -msgstr "" +msgid "Numpad +" +msgstr "Numerická klávesnica +" + +#: src/client/keycode.cpp +msgid "Numpad -" +msgstr "Numerická klávesnica -" + +#: src/client/keycode.cpp +msgid "Numpad ." +msgstr "Numerická klávesnica ." + +#: src/client/keycode.cpp +msgid "Numpad /" +msgstr "Numerická klávesnica /" + +#: src/client/keycode.cpp +msgid "Numpad 0" +msgstr "Numerická klávesnica 0" + +#: src/client/keycode.cpp +msgid "Numpad 1" +msgstr "Numerická klávesnica 1" + +#: src/client/keycode.cpp +msgid "Numpad 2" +msgstr "Numerická klávesnica 2" + +#: src/client/keycode.cpp +msgid "Numpad 3" +msgstr "Numerická klávesnica 3" + +#: src/client/keycode.cpp +msgid "Numpad 4" +msgstr "Numerická klávesnica 4" + +#: src/client/keycode.cpp +msgid "Numpad 5" +msgstr "Numerická klávesnica 5" + +#: src/client/keycode.cpp +msgid "Numpad 6" +msgstr "Numerická klávesnica 6" + +#: src/client/keycode.cpp +msgid "Numpad 7" +msgstr "Numerická klávesnica 7" + +#: src/client/keycode.cpp +msgid "Numpad 8" +msgstr "Numerická klávesnica 8" + +#: src/client/keycode.cpp +msgid "Numpad 9" +msgstr "Numerická klávesnica 9" + +#: src/client/keycode.cpp +msgid "OEM Clear" +msgstr "OEM Clear" #: src/client/keycode.cpp msgid "Page down" -msgstr "" +msgstr "Page down" #: src/client/keycode.cpp -msgid "End" -msgstr "" +msgid "Page up" +msgstr "Page up" #: src/client/keycode.cpp -msgid "Home" -msgstr "" - -#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -msgid "Left" -msgstr "" +msgid "Pause" +msgstr "Pause" #: src/client/keycode.cpp -msgid "Up" -msgstr "" - -#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp -msgid "Right" -msgstr "" - -#: src/client/keycode.cpp -msgid "Down" -msgstr "" - -#. ~ Key name -#: src/client/keycode.cpp -msgid "Select" -msgstr "" +msgid "Play" +msgstr "Hraj" #. ~ "Print screen" key #: src/client/keycode.cpp msgid "Print" -msgstr "" +msgstr "PrtSc" #: src/client/keycode.cpp -msgid "Execute" -msgstr "" +msgid "Return" +msgstr "Enter" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" +msgstr "Vpravo" #: src/client/keycode.cpp -msgid "Snapshot" -msgstr "" - -#: src/client/keycode.cpp -msgid "Insert" -msgstr "" - -#: src/client/keycode.cpp -msgid "Help" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Windows" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Windows" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 0" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 1" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 2" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 3" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 4" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 5" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 6" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 7" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 8" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad 9" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad *" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad +" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad ." -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad -" -msgstr "" - -#: src/client/keycode.cpp -msgid "Numpad /" -msgstr "" - -#: src/client/keycode.cpp -msgid "Num Lock" -msgstr "" - -#: src/client/keycode.cpp -msgid "Scroll Lock" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Shift" -msgstr "" - -#: src/client/keycode.cpp -msgid "Right Shift" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Control" -msgstr "" +msgid "Right Button" +msgstr "Pravé tlačítko" #: src/client/keycode.cpp msgid "Right Control" -msgstr "" - -#: src/client/keycode.cpp -msgid "Left Menu" -msgstr "" +msgstr "Pravý CRTL" #: src/client/keycode.cpp msgid "Right Menu" -msgstr "" +msgstr "Pravé Menu" #: src/client/keycode.cpp -msgid "IME Escape" -msgstr "" +msgid "Right Shift" +msgstr "Pravý Shift" #: src/client/keycode.cpp -msgid "IME Convert" -msgstr "" +msgid "Right Windows" +msgstr "Pravá klávesa Windows" #: src/client/keycode.cpp -msgid "IME Nonconvert" -msgstr "" +msgid "Scroll Lock" +msgstr "Scroll Lock" + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" +msgstr "Vybrať" #: src/client/keycode.cpp -msgid "IME Accept" -msgstr "" - -#: src/client/keycode.cpp -msgid "IME Mode Change" -msgstr "" - -#: src/client/keycode.cpp -msgid "Apps" -msgstr "" +msgid "Shift" +msgstr "Shift" #: src/client/keycode.cpp msgid "Sleep" -msgstr "" +msgstr "Spánok" #: src/client/keycode.cpp -msgid "Erase EOF" -msgstr "" +msgid "Snapshot" +msgstr "Snímka" #: src/client/keycode.cpp -msgid "Play" -msgstr "" +msgid "Space" +msgstr "Medzera" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "Tab" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "Hore" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "X tlačidlo 1" + +#: src/client/keycode.cpp +msgid "X Button 2" +msgstr "X tlačidlo 2" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" -msgstr "" +msgstr "Priblíž" -#: src/client/keycode.cpp -msgid "OEM Clear" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimapa je skrytá" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimapa v radarovom režime, priblíženie x%d" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimapa v povrchovom režime, priblíženie x%d" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimapa v móde textúry" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Nepodarilo sa otvoriť web stránku" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Otváram web stránku" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" -msgstr "" +msgstr "Pokračuj" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Double tap \"jump\" to toggle fly" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp -msgid "Automatic jumping" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Key already in use" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "press key" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Forward" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Backward" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Jump" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Sneak" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Drop" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inventory" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Prev. item" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Next item" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Change camera" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle minimap" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle fly" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle pitchmove" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle fast" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Toggle noclip" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Mute" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Dec. volume" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Inc. volume" -msgstr "" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\"=šplhaj dole" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Chat" -msgstr "" +msgstr "Automaticky pohyb vpred" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp -msgid "Screenshot" -msgstr "" +msgid "Automatic jumping" +msgstr "Automatické skákanie" #: src/gui/guiKeyChangeMenu.cpp -msgid "Range select" -msgstr "" +msgid "Aux1" +msgstr "Aux1" #: src/gui/guiKeyChangeMenu.cpp -msgid "Dec. range" -msgstr "" +msgid "Backward" +msgstr "Vzad" #: src/gui/guiKeyChangeMenu.cpp -msgid "Inc. range" -msgstr "" +msgid "Block bounds" +msgstr "Hranice bloku" #: src/gui/guiKeyChangeMenu.cpp -msgid "Console" -msgstr "" +msgid "Change camera" +msgstr "Zmeň pohľad" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Chat" +msgstr "Komunikácia" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" -msgstr "" +msgstr "Príkaz" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "Konzola" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "Zníž dohľad" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "Zníž hlasitosť" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "2x stlač \"skok\" pre prepnutie lietania" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "Zahodiť" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "Vpred" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "Zvýš dohľad" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "Zvýš hlasitosť" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "Inventár" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "Skok" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "Klávesa sa už používa" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." +msgstr "Priradenie kláves." #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" -msgstr "" +msgstr "Lokálny príkaz" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "Vypni zvuk" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "Ďalšia vec" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "Pred. vec" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "Zmena dohľadu" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "Fotka obrazovky" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "Zakrádať sa" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" -msgstr "" +msgstr "Prepni HUD" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle chat log" -msgstr "" +msgstr "Prepni logovanie komunikácie" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "Prepni rýchly režim" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "Prepni lietanie" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" -msgstr "" +msgstr "Prepni hmlu" -#: src/gui/guiPasswordChange.cpp -msgid "Old Password" -msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "Prepni minimapu" -#: src/gui/guiPasswordChange.cpp -msgid "New Password" -msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "Prepni režim prechádzania stenami" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "Prepni režim pohybu podľa sklonu" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "stlač klávesu" #: src/gui/guiPasswordChange.cpp msgid "Change" -msgstr "" +msgstr "Zmeniť" -#: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "New Password" +msgstr "Nové heslo" + +#: src/gui/guiPasswordChange.cpp +msgid "Old Password" +msgstr "Staré heslo" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Hesla sa nezhodujú!" #: src/gui/guiVolumeChange.cpp msgid "Exit" -msgstr "" +msgstr "Odísť" #: src/gui/guiVolumeChange.cpp msgid "Muted" -msgstr "" +msgstr "Zvuk stlmený" -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "" +#: src/gui/guiVolumeChange.cpp +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Hlasitosť: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1900,1605 +2185,153 @@ msgstr "" msgid "LANG_CODE" msgstr "sk" -#: src/settings_translation_file.cpp -msgid "Controls" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Build inside player" -msgstr "" - -#: src/settings_translation_file.cpp +#: src/network/clientpackethandler.cpp msgid "" -"If enabled, you can place blocks at the position (feet + eye level) where " -"you stand.\n" -"This is helpful when working with nodeboxes in small areas." +"Name is not registered. To create an account on this server, click 'Register'" msgstr "" +"Meno nie je zaregistrované. Pre vytvorenie účtu na tomto serveri klikni na " +"'Registrovať' ('Register')" -#: src/settings_translation_file.cpp -msgid "Flying" -msgstr "" - -#: 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 "Pitch move mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, makes move directions relative to the player's pitch when flying " -"or swimming." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast movement" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Fast movement (via the \"special\" key).\n" -"This requires the \"fast\" privilege on the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noclip" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled together with fly mode, player is able to fly through solid " -"nodes.\n" -"This requires the \"noclip\" privilege on the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cinematic mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Smooths camera when looking around. Also called look or mouse smoothing.\n" -"Useful for recording videos." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera smoothing" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Smooths rotation of camera. 0 to disable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera smoothing in cinematic mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Smooths rotation of camera in cinematic mode. 0 to disable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Invert mouse" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Invert vertical mouse movement." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mouse sensitivity multiplier." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" -"descending." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Double tap jump for fly" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Double-tapping the jump key toggles fly mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" -"enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatically jump up single-node obstacles." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Safe digging and placing" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Random input" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable random user input (only used for testing)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Continuous forward" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Touch screen threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The length in pixels it takes for touch screen interaction to start." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fixed virtual joystick" -msgstr "" +#: src/network/clientpackethandler.cpp +msgid "Name is taken. Please choose another name" +msgstr "Meno už je použité. Prosím zvoľ si iné meno" #: 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 "" - -#: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "" +"(Android) Zafixuje pozíciu virtuálneho joysticku.\n" +"Ak je vypnuté, virtuálny joystick sa vycentruje na pozícií prvého dotyku." #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable joysticks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick ID" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The identifier of the joystick to use" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick type" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The type of joystick" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick button repetition interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time in seconds it takes between repeated events\n" -"when holding down a joystick button combination." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Joystick frustum sensitivity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Forward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player forward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Backward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player backward.\n" -"Will also disable autoforward, when active.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Left key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player left.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Right key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving the player right.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Jump key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for jumping.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneak key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for sneaking.\n" -"Also used for climbing down and descending in water if aux1_descends is " -"disabled.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Inventory key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the inventory.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for moving fast in fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Command key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for opening the chat window to type local commands.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Range select key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling unlimited view range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fly key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling flying.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Pitch move key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling pitch move mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling fast mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noclip key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling noclip mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar next key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the next item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar previous key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the previous item in the hotbar.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mute key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for muting the game.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Inc. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the volume.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatic forward key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling autoforward.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cinematic mode key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling cinematic mode.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling display of minimap.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for taking screenshots.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Drop item key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for dropping the currently selected item.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View zoom key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key to use view zoom when possible.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 1 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the first hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 2 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the second hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 3 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the third hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 4 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fourth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 5 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the fifth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 6 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the sixth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 7 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the seventh hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 8 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the eighth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 9 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the ninth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 10 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the tenth hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 11 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 11th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 12 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 12th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 13 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 13th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 14 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 14th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 15 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 15th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 16 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 16th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 17 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 17th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 18 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 18th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 19 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 19th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 20 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 20th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 21 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 21st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 22 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 22nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 23 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 23rd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 24 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 24th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 25 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 25th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 26 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 26th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 27 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 27th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 28 key" -msgstr "" +"(Android) Použije virtuálny joystick na stlačenie tlačidla \"Aux1\".\n" +"Ak je aktivované, virtuálny joystick stlačí tlačidlo \"Aux1\" keď je mimo " +"hlavný kruh." #: src/settings_translation_file.cpp msgid "" -"Key for selecting the 28th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 29 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 29th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 30 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 30th hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 31 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 31st hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hotbar slot 32 key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for selecting the 32nd hotbar slot.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "HUD toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the HUD.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of chat.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large chat console key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the large chat console.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of fog.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Camera update toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the camera update. Only used for development\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug info toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of debug info.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler toggle key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for toggling the display of the profiler. Used for development.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Toggle camera mode key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for switching between first- and third-person camera.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range increase key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for increasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View range decrease key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Key for decreasing the viewing range.\n" -"See http://irrlicht.sourceforge.net/docu/namespaceirr." -"html#a54da2a0e231901735e3da1b0edf72eb3" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Graphics" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VBO" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"situations.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"(X,Y,Z) posun fraktálu od stredu sveta v jednotkách 'mierky'.\n" +"Môže byť použité pre posun požadovaného bodu do (0, 0) pre\n" +"vytvorenie vhodného bodu pre ožitie, alebo pre povolenie 'priblíženia'\n" +"na želaný bod zväčšením 'mierky'.\n" +"Štandardne je to vyladené na vhodný bod oživenia pre Mandelbrot\n" +"sadu so štandardnými parametrami, je možné, že bude potrebná úprava\n" +"v iných situáciach.\n" +"Rozsah je približne -2 to 2. Zväčší podľa 'mierky' pre posun v kockách." #: src/settings_translation_file.cpp msgid "" -"Enable vertex buffer objects.\n" -"This should greatly improve graphics performance." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to fog out the end of the visible area." +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"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) mierka fraktálu v kockách.\n" +"Skutočná veľkosť fraktálu bude 2 až 3 krát väčšia.\n" +"Tieto čísla môžu byť veľmi veľké, fraktál sa nemusí\n" +"zmestiť do sveta.\n" +"Zvýš pre 'priblíženie' detailu fraktálu.\n" +"Štandardne je vertikálne stlačený tvar vhodný pre\n" +"ostrov, nastav všetky 3 čísla rovnaké pre nezmenený tvar." #: src/settings_translation_file.cpp -msgid "Leaves style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Leaves style:\n" -"- Fancy: all faces visible\n" -"- Simple: only outer faces, if defined special_tiles are used\n" -"- Opaque: disable transparency" -msgstr "" +msgid "2D noise that controls the shape/size of ridged mountains." +msgstr "2D šum, ktorý riadi tvar/veľkosť hrebeňa hôr." #: src/settings_translation_file.cpp -msgid "Connect glass" -msgstr "" +msgid "2D noise that controls the shape/size of rolling hills." +msgstr "2D šum, ktorý riadi tvar/veľkosť vlnitosti kopcov." #: src/settings_translation_file.cpp -msgid "Connects glass if supported by node." -msgstr "" +msgid "2D noise that controls the shape/size of step mountains." +msgstr "2D šum, ktorý riadi tvar/veľkosť horských stepí." #: src/settings_translation_file.cpp -msgid "Smooth lighting" -msgstr "" +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." +msgstr "2D šum, ktorý riadi veľkosť/výskyt hrebeňa kopcov." #: src/settings_translation_file.cpp -msgid "" -"Enable smooth lighting with simple ambient occlusion.\n" -"Disable for speed or for different looks." -msgstr "" +msgid "2D noise that controls the size/occurrence of rolling hills." +msgstr "2D šum, ktorý riadi veľkosť/výskyt zvlnenia kopcov." #: src/settings_translation_file.cpp -msgid "Clouds" -msgstr "" +msgid "2D noise that controls the size/occurrence of step mountain ranges." +msgstr "2D šum, ktorý riadi veľkosť/výskyt horských stepí." #: src/settings_translation_file.cpp -msgid "Clouds are a client side effect." -msgstr "" +msgid "2D noise that locates the river valleys and channels." +msgstr "2D šum, ktorý určuje údolia a kanály riek." #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use 3D cloud look instead of flat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Node highlighting" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Method used to highlight selected object." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Digging particles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Adds particles when digging a node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mipmapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" -"especially when using a high resolution texture pack.\n" -"Gamma correct downscaling is not supported." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Anisotropic filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use anisotropic filtering when viewing at textures from an angle." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bilinear filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use bilinear filtering when scaling textures." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trilinear filtering" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use trilinear filtering when scaling textures." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clean transparent textures" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum texture size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" -"can be blurred, so automatically upscale them with nearest-neighbor\n" -"interpolation to preserve crisp pixels. This sets the minimum texture size\n" -"for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" -"This is also used as the base node texture size for world-aligned\n" -"texture autoscaling." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FSAA" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Undersampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Undersampling is similar to using a lower screen resolution, but it applies\n" -"to the game world only, keeping the GUI intact.\n" -"It should give a significant performance boost at the cost of less detailed " -"image.\n" -"Higher values result in a less detailed image." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shaders allow advanced visual effects and may increase performance on some " -"video\n" -"cards.\n" -"This only works with the OpenGL video backend." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shader path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to shader directory. If no path is defined, default location will be " -"used." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filmic tone mapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" -"Simulates the tone curve of photographic film and how this approximates the\n" -"appearance of high dynamic range images. Mid-range contrast is slightly\n" -"enhanced, highlights and shadows are gradually compressed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving Nodes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving liquids (like water).\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wave height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The maximum height of the surface of waving liquids.\n" -"4.0 = Wave height is two nodes.\n" -"0.0 = Wave doesn't move at all.\n" -"Default is 1.0 (1/2 node).\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wavelength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of liquid waves.\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving liquids wave speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How fast liquid waves will move. Higher = faster.\n" -"If negative, liquid waves will move backwards.\n" -"Requires waving liquids to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving leaves" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving leaves.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Waving plants" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Set to true to enable waving plants.\n" -"Requires shaders to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Advanced" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Arm inertia" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Arm inertia, gives a more realistic movement of\n" -"the arm when the camera moves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Pause on lost window focus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Open the pause menu when the window's focus is lost. Does not pause if a " -"formspec is\n" -"open." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Viewing range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View distance in nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Near plane" -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" -"Increasing can reduce artifacting on weaker GPUs.\n" -"0.1 = Default, 0.25 = Good value for weaker tablets." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screen height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autosave screen size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save window size automatically when modified." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "VSync" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical screen synchronization." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Field of view in degrees." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve gamma" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Alters the light curve by applying 'gamma correction' to it.\n" -"Higher values make middle and lower light levels brighter.\n" -"Value '1.0' leaves the light curve unaltered.\n" -"This only has significant effect on daylight and artificial\n" -"light, it has very little effect on natural night light." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve low gradient" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Gradient of light curve at minimum light level.\n" -"Controls the contrast of the lowest light levels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve high gradient" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Gradient of light curve at maximum light level.\n" -"Controls the contrast of the highest light levels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Strength of light curve boost.\n" -"The 3 'boost' parameters define a range of the light\n" -"curve that is boosted in brightness." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost center" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Light curve boost spread" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Spread of light curve boost range.\n" -"Controls the width of the range to be boosted.\n" -"Standard deviation of the light curve boost Gaussian." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Texture path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Path to texture directory. All textures are first searched from here." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Video driver" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The rendering back-end for Irrlicht.\n" -"A restart is required after changing this.\n" -"Note: On Android, stick with OGLES1 if unsure! App may fail to start " -"otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cloud radius" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Radius of cloud area stated in number of 64 node cloud squares.\n" -"Values larger than 26 will start to produce sharp cutoffs at cloud area " -"corners." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "View bobbing factor" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Fall bobbing factor" -msgstr "" - -#: 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 "" +msgstr "3D mraky" #: src/settings_translation_file.cpp msgid "3D mode" +msgstr "3D režim" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "3D režim stupeň paralaxy" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "3D šum definujúci gigantické dutiny/jaskyne." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." msgstr "" +"3D šum definujúci štruktúru a výšku hôr.\n" +"Takisto definuje štruktúru pohorí lietajúcich pevnín." + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"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 šum definujúci štruktúru lietajúcich pevnín.\n" +"Ak je zmenený zo štandardného, 'mierka' šumu (štandardne 0.7) môže\n" +"potrebovať nastavenie, keďže zošpicaťovanie lietajúcej pevniny funguje " +"najlepšie,\n" +"keď tento šum má hodnotu približne v rozsahu -2.0 až 2.0." + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "3D šum definujúci štruktúru stien kaňona rieky." + +#: src/settings_translation_file.cpp +msgid "3D noise defining terrain." +msgstr "3D šum definujúci terén." + +#: src/settings_translation_file.cpp +msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgstr "3D šum pre previsy, útesy, atď. hôr. Obvykle malé odchýlky." + +#: src/settings_translation_file.cpp +msgid "3D noise that determines number of dungeons per mapchunk." +msgstr "3D šum definujúci počet kobiek na časť mapy (mapchunk)." #: src/settings_translation_file.cpp msgid "" @@ -3513,581 +2346,73 @@ msgid "" "- pageflip: quadbuffer based 3d.\n" "Note that the interlaced mode requires shaders to be enabled." msgstr "" +"Podpora 3D.\n" +"Aktuálne sú podporované:\n" +"- none: žiaden 3D režim.\n" +"- anaglyph: tyrkysovo/purpurová farba 3D.\n" +"- interlaced: podpora polarizácie založenej na párnych/nepárnych riadkoch " +"obrazu.\n" +"- topbottom: rozdelená obrazovka hore/dole.\n" +"- sidebyside: rozdelená obrazovka vedľa seba.\n" +"- crossview: 3D prekrížených očí (Cross-eyed)\n" +"- pageflip: 3D založené na quadbuffer\n" +"Režim interlaced požaduje, aby boli aktivované shadery." #: src/settings_translation_file.cpp -msgid "3D mode parallax strength" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strength of 3D mode parallax." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Console alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Full-Screen Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec full-screen background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Full-Screen Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec full-screen background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Opacity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background opacity (between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec Default Background Color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Formspec default background color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box border color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Selection box width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Width of the selection box lines around nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Recent Chat Messages" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of recent chat messages to show" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Desynchronize block animation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum hotbar width" -msgstr "" +msgid "3d" +msgstr "3d" #: 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." +"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 "" +"Zvolené semienko pre novú mapu, ponechaj prázdne pre náhodné.\n" +"Pri vytvorení nového sveta z hlavného menu, bude prepísané." #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "" +msgid "A message to be displayed to all clients when the server crashes." +msgstr "Správa, ktorá sa zobrazí všetkým klientom pri páde servera." #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "" +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "Správa, ktorá sa zobrazí všetkým klientom, keď sa server vypína." #: src/settings_translation_file.cpp -msgid "Mesh cache" -msgstr "" +msgid "ABM interval" +msgstr "Interval Aktívnej Blokovej Modifikácie (ABM)" #: src/settings_translation_file.cpp -msgid "Enables caching of facedir rotated meshes." -msgstr "" +msgid "ABM time budget" +msgstr "Vyhradená doba ABM" #: src/settings_translation_file.cpp -msgid "Mapblock mesh generation delay" -msgstr "" +msgid "Absolute limit of queued blocks to emerge" +msgstr "Absolútny limit kociek vo fronte" #: 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 "" +msgid "Acceleration in air" +msgstr "Zrýchlenie vo vzduchu" #: src/settings_translation_file.cpp -msgid "Mapblock mesh generator's MapBlock cache size in MB" -msgstr "" +msgid "Acceleration of gravity, in nodes per second per second." +msgstr "Gravitačné zrýchlenie, v kockách za sekundu na druhú." #: src/settings_translation_file.cpp -msgid "" -"Size of the MapBlock cache of the mesh generator. Increasing this will\n" -"increase the cache hit %, reducing the data being copied from the main\n" -"thread, thus reducing jitter." -msgstr "" +msgid "Active Block Modifiers" +msgstr "Aktívne modifikátory blokov (ABM)" #: src/settings_translation_file.cpp -msgid "Minimap" -msgstr "" +msgid "Active block management interval" +msgstr "Riadiaci interval aktívnych blokov" #: src/settings_translation_file.cpp -msgid "Enables minimap." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Round minimap" -msgstr "" +msgid "Active block range" +msgstr "Rozsah aktívnych blokov" #: src/settings_translation_file.cpp -msgid "Shape of the minimap. Enabled = round, disabled = square." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimap scan height" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"True = 256\n" -"False = 128\n" -"Usable to make minimap smoother on slower machines." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Colored fog" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ambient occlusion gamma" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The strength (darkness) of node ambient-occlusion shading.\n" -"Lower is darker, Higher is lighter. The valid range of values for this\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Inventory items animations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enables animation of inventory items." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fog start" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Opaque liquids" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "World-aligned textures mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Textures on a node may be aligned either to the node or to the world.\n" -"The former mode suits better things like machines, furniture, etc., while\n" -"the latter makes stairs and microblocks fit surroundings better.\n" -"However, as this possibility is new, thus may not be used by older servers,\n" -"this option allows enforcing it for certain node types. Note though that\n" -"that is considered EXPERIMENTAL and may not work properly." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Autoscaling mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"World-aligned textures may be scaled to span several nodes. However,\n" -"the server may not send the scale you want, especially if you use\n" -"a specially-designed texture pack; with this option, the client tries\n" -"to determine the scale automatically basing on the texture size.\n" -"See also texture_min_size.\n" -"Warning: This option is EXPERIMENTAL!" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Show entity selection boxes" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Clouds in menu" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Use a cloud animation for the main menu background." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Scale GUI by a user specified value.\n" -"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" -"This will smooth over some of the rough edges, and blend\n" -"pixels when scaling down, at the cost of blurring some\n" -"edge pixels when images are scaled by non-integer sizes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling filter" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When gui_scaling_filter is true, all GUI images need to be\n" -"filtered in software, but some images are generated directly\n" -"to hardware (e.g. render-to-texture for nodes in inventory)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "GUI scaling filter txr2img" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"When gui_scaling_filter_txr2img is true, copy those images\n" -"from hardware to software for scaling. When false, fall back\n" -"to the old scaling method, for video drivers that don't\n" -"properly support downloading textures back from hardware." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Tooltip delay" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay showing tooltips, stated in milliseconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Append item name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Append item name to tooltip." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font bold by default" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font italic by default" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " -"drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Regular font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"The fallback font will be used if the font cannot be loaded." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font is used for e.g. the console and profiler screen." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bold and italic monospace font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" -"This font will be used for certain languages or if the default font is " -"unavailable." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat font size" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Screenshot folder" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Screenshot format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Format of screenshots." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Screenshot quality" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Screenshot quality. Only used for JPEG format.\n" -"1 means worst quality; 100 means best quality.\n" -"Use 0 for default quality." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "DPI" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " -"screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable console window" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Windows systems only: Start Minetest with the command line window in the " -"background.\n" -"Contains the same information as the file debug.txt (default name)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables the sound system.\n" -"If disabled, this completely disables all sounds everywhere and the in-game\n" -"sound controls will be non-functional.\n" -"Changing this setting requires a restart." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Volume" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Volume of all sounds.\n" -"Requires the sound system to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mute sound" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to mute sounds. You can unmute sounds at any time, unless the\n" -"sound system is disabled (enable_sound=false).\n" -"In-game, you can toggle the mute state with the mute key or by using the\n" -"pause menu." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server address" -msgstr "" +msgid "Active object send range" +msgstr "Zasielaný rozsah aktívnych objektov" #: src/settings_translation_file.cpp msgid "" @@ -4095,820 +2420,121 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"Adresa pre pripojenie sa.\n" +"Ponechaj prázdne pre spustenie lokálneho servera.\n" +"Adresné políčko v hlavnom menu prepíše toto nastavenie." #: src/settings_translation_file.cpp -msgid "Remote port" -msgstr "" +msgid "Adds particles when digging a node." +msgstr "Pridá časticové efekty pri vykopávaní kocky." #: src/settings_translation_file.cpp msgid "" -"Port to connect to (UDP).\n" -"Note that the port field in the main menu overrides this setting." +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." msgstr "" +"Nastav dpi konfiguráciu podľa svojej obrazovky (nie pre X11/len pre Android) " +"napr. pre 4k obrazovky." #: src/settings_translation_file.cpp -msgid "Prometheus listener address" +msgid "Adjust the detected display density, used for scaling UI elements." msgstr "" +"Uprav zistenú hustotu zobrazenia, použitú pre zmenu veľkosti prvkov " +"grafického rozhrania." + +#: src/settings_translation_file.cpp +#, c-format +msgid "" +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" +"to be sure) creates a solid floatland layer." +msgstr "" +"Nastav hustotu vrstvy lietajúcej pevniny.\n" +"Zvýš hodnotu pre zvýšenie hustoty. Môže byť kladná, alebo záporná.\n" +"Hodnota = 0.0: 50% objemu je lietajúca pevnina.\n" +"Hodnota = 2.0 (môže byť vyššie v závislosti od 'mgv7_np_floatland', vždy " +"otestuj\n" +"aby si si bol istý) vytvorí pevnú úroveň lietajúcej pevniny." + +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "Meno správcu" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "Pokročilé" #: src/settings_translation_file.cpp msgid "" -"Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" -"enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"This only has significant effect on daylight and artificial\n" +"light, it has very little effect on natural night light." msgstr "" +"Zmení svetelnú krivku aplikovaním 'gamma korekcie'.\n" +"Vyššie hodnoty robia stredné a nižšie tóny svetlejšími.\n" +"Hodnota '1.0' ponechá svetelnú krivku nezmenenú.\n" +"Toto má vplyv len na denné a umelé svetlo,\n" +"ma len veľmi malý vplyv na prirodzené nočné svetlo." #: src/settings_translation_file.cpp -msgid "Saving map received from server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Save the map received by the client on disk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Connect to external media server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable usage of remote media server (if provided by server).\n" -"Remote servers offer a significantly faster way to download media (e.g. " -"textures)\n" -"when connecting to the server." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client modding" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable Lua modding support on client.\n" -"This support is experimental and API can change." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Serverlist URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "URL to the server list displayed in the Multiplayer Tab." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Serverlist file" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"File in client/serverlist/ that contains your favorite servers displayed in " -"the\n" -"Multiplayer Tab." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum size of the out chat queue" -msgstr "" - -#: 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 "" - -#: 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 "Mapblock unload timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Timeout for client to remove unused map data from memory." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapblock limit" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Show debug info" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Whether to show the client debug info (has the same effect as hitting F5)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the server, to be displayed when players join and in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server description" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Description of server, to be displayed when players join and in the " -"serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Domain name of server, to be displayed in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Server URL" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Homepage of server, to be displayed in the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Announce server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Automatically report to the serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Announce to this serverlist." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strip color codes" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Server port" -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 "Bind address" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "The network interface that the server listens on." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Strict protocol checking" -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 " -"connecting\n" -"to new servers, but they may not support all new features that you are " -"expecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Remote media" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Specifies URL from which client fetches media instead of using UDP.\n" -"$filename should be accessible from $remote_media$filename via cURL\n" -"(obviously, remote_media should end with a slash).\n" -"Files that are not present will be fetched the usual way." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "IPv6 server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable/disable running an IPv6 server.\n" -"Ignored if bind_address is set.\n" -"Needs enable_ipv6 to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum simultaneous block sends per client" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of blocks that are simultaneously sent per client.\n" -"The maximum total count is calculated dynamically:\n" -"max_total = ceil((#clients + max_users) * per_client / 4)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Delay in sending blocks after building" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"To reduce lag, block transfers are slowed down when a player is building " -"something.\n" -"This determines how long they are slowed down after placing or removing a " -"node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. packets per iteration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum number of packets sent per send step, if you have a slow connection\n" -"try reducing it, but don't reduce it to a number below double of targeted\n" -"client number." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default game" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Message of the day" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Message of the day displayed to players connecting." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of players that can be connected simultaneously." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map directory" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Item entity TTL" -msgstr "" +msgid "Always fly fast" +msgstr "Vždy lietaj rýchlo" #: 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 "" - -#: src/settings_translation_file.cpp -msgid "Default stack size" -msgstr "" - -#: src/settings_translation_file.cpp -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 "" - -#: src/settings_translation_file.cpp -msgid "Damage" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable players getting damage and dying." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Creative" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fixed map seed" -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 "" - -#: src/settings_translation_file.cpp -msgid "Default password" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "New users need to input this password." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default privileges" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Basic privileges" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Privileges that players with basic_privs can grant" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Unlimited player transfer distance" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Player transfer distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player versus player" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Whether to allow players to damage and kill each other." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mod channels" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod channels support." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Static spawnpoint" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If this is set, players will always (re)spawn at the given position." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disallow empty passwords" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, new players cannot join with an empty password." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Disable anticheat" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rollback recording" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If enabled, actions are recorded for rollback.\n" -"This option is only read when server starts." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Format of player chat messages. The following strings are valid " -"placeholders:\n" -"@name, @message, @timestamp (optional)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Shutdown message" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Crash message" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "A message to be displayed to all clients when the server crashes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ask to reconnect after crash" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Active object send range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far clients know about objects, stated in mapblocks (16 nodes).\n" -"\n" -"Setting this larger than active_block_range will also cause the server\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Active block range" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The radius of the volume of blocks around every player that is subject to " -"the\n" -"active block stuff, stated in mapblocks (16 nodes).\n" -"In active blocks objects are loaded and ABMs run.\n" -"This is also the minimum range in which active objects (mobs) are " -"maintained.\n" -"This should be configured together with active_object_send_range_blocks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max block send distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum forceloaded blocks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of forceloaded mapblocks." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time send interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Interval of sending time of day to clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls length of day/night cycle.\n" -"Examples:\n" -"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "World start time" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Time of day when a new world is started, in millihours (0-23999)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map save interval" -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 "Chat message max length" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat message count limit" -msgstr "" +msgid "Ambient occlusion gamma" +msgstr "Ambient occlusion gamma" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "Počet správ, ktoré môže hráč poslať za 10 sekúnd." #: src/settings_translation_file.cpp -msgid "Chat message kick threshold" -msgstr "" +msgid "Amplifies the valleys." +msgstr "Zväčšuje údolia." #: src/settings_translation_file.cpp -msgid "Kick players who sent more than X messages per 10 seconds." -msgstr "" +msgid "Anisotropic filtering" +msgstr "Anisotropné filtrovanie" #: src/settings_translation_file.cpp -msgid "Physics" -msgstr "" +msgid "Announce server" +msgstr "Zverejni server" #: src/settings_translation_file.cpp -msgid "Default acceleration" -msgstr "" +msgid "Announce to this serverlist." +msgstr "Zverejni v zozname serverov." + +#: src/settings_translation_file.cpp +msgid "Append item name" +msgstr "Pridaj názov položky/veci" + +#: src/settings_translation_file.cpp +msgid "Append item name to tooltip." +msgstr "Pridaj názov veci do popisku." + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "Šum jabloní" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" +msgstr "Zotrvačnosť ruky" #: src/settings_translation_file.cpp msgid "" -"Horizontal and vertical acceleration on ground or when climbing,\n" -"in nodes per second per second." +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." msgstr "" +"Zotrvačnosť ruky, vytvára realistickejší pohyb ruky\n" +"pri pohybe kamery." #: src/settings_translation_file.cpp -msgid "Acceleration in air" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal acceleration in air when jumping or falling,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast mode acceleration" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Horizontal and vertical acceleration in fast mode,\n" -"in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking and flying speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneaking speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sneaking speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fast mode speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Walking, flying and climbing speed in fast mode, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Climbing speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Vertical climbing speed, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Jumping speed" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid fluidity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid fluidity smoothing" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Maximum liquid resistance. Controls deceleration when entering liquid at\n" -"high speed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid sinking" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Gravity" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Deprecated Lua API handling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" -"- error: abort on usage of deprecated call (suggested for mod developers)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max. clearobjects extra blocks" -msgstr "" - -#: src/settings_translation_file.cpp -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 "Unload unused server data" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"How much the server will wait before unloading unused mapblocks.\n" -"Higher value is smoother, but will use more RAM." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum objects per block" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of statically stored objects in a block." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Synchronous SQLite" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dedicated server step" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Length of a server tick and the interval at which objects are generally " -"updated over\n" -"network." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active block management interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between active block management cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "ABM interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between Active Block Modifier (ABM) execution cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "NodeTimer interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Length of time between NodeTimer execution cycles" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ignore world errors" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Liquid loop max" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max liquids processed per step." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid queue purge time" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The time (in seconds) that the liquids queue may grow beyond processing\n" -"capacity until an attempt is made to decrease its size by dumping old queue\n" -"items. A value of 0 disables the functionality." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid update tick" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Liquid update interval in seconds." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Block send optimize distance" -msgstr "" +msgid "Ask to reconnect after crash" +msgstr "Ponúkni obnovu pripojenia po páde" #: src/settings_translation_file.cpp msgid "" @@ -4924,10 +2550,1685 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" +"V tento vzdialenosti bude server agresívne optimalizovať, ktoré\n" +"bloky pošle klientovi.\n" +"Malé hodnoty potenciálne výrazne zvýšia výkon, za cenu viditeľných\n" +"chýb renderovania (niektoré bloky nebudú vyrenderované pod vodou a v " +"jaskyniach,\n" +"prípadne niekedy aj na súši).\n" +"Nastavenie hodnoty vyššej ako max_block_send_distance deaktivuje túto\n" +"optimalizáciu.\n" +"Udávane v blokoch mapy (16 kociek)." #: src/settings_translation_file.cpp -msgid "Server side occlusion culling" +msgid "Audio" +msgstr "Zvuk" + +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "Tlačidlo Automatický pohyb vpred" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "Automaticky vyskočí na prekážku vysokú jedna kocka." + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "Automaticky zápis do zoznamu serverov." + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "Pamätať si veľkosť obrazovky" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "Režim automatickej zmeny mierky" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Tlačidlo Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Klávesa Aux1 pre šplhanie hore/dole" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "Tlačidlo Vzad" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "Základná úroveň dna" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "Základná výška terénu." + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "Základné práva" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "Šum pláže" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "Hraničná hodnota šumu pláže" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "Bilineárne filtrovanie" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "Spájacia adresa" + +#: src/settings_translation_file.cpp +msgid "Biome API noise parameters" +msgstr "Parametre šumu pre Biome API" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "Šum biómu" + +#: src/settings_translation_file.cpp +msgid "Block send optimize distance" +msgstr "Vzdialenosť pre optimalizáciu posielania blokov" + +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "Nadskakovanie" + +#: src/settings_translation_file.cpp +msgid "Bold and italic font path" +msgstr "Cesta k tučnému šikmému písmu" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "Cesta k tučnému šikmému písmu s pevnou šírkou" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "Cesta k tučnému písmu" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "Cesta k tučnému písmu s pevnou šírkou" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "Stavanie vnútri hráča" + +#: src/settings_translation_file.cpp +msgid "Builtin" +msgstr "Vstavané (Builtin)" + +#: src/settings_translation_file.cpp +msgid "Camera" +msgstr "Pohľad" + +#: 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 "" +"Vzdialenosť kamery 'blízko orezanej roviny' v kockách, medzi 0 a 0.25\n" +"Funguje len na GLES platformách. Väčšina toto nepotrebuje meniť.\n" +"Zvýšenie môže zredukovať artefakty na slabších GPU.\n" +"0.1 = Štandardná hodnota, 0.25 = Dobrá hodnota pre slabé tablety." + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "Plynulý pohyb kamery" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "Plynulý pohyb kamery vo filmovom režime" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "Tlačidlo Aktualizácia pohľadu" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "Šum jaskyne" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "Šum jaskýň #1" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "Šum jaskýň #2" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "Šírka jaskyne" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "Cave1 šum" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "Cave2 šum" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "Limit dutín" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "Šum dutín" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "Zbiehavosť dutín" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "Hraničná hodnota dutín" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +msgstr "Horný limit dutín" + +#: 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 "" +"Centrum rozsahu zosilnenia svetelnej krivky.\n" +"Kde 0.0 je minimálna úroveň, 1.0 je maximálna úroveň ." + +#: src/settings_translation_file.cpp +msgid "Chat command time message threshold" +msgstr "Časové obmedzenie príkazu v správe" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Komunikačné príkazy" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "Veľkosť komunikačného písma" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "Tlačidlo Komunikácia" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "Úroveň komunikačného logu" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "Limit počtu správ" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "Formát komunikačných správ" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "Hranica správ pre vylúčenie" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "Max dĺžka správy" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "Tlačidlo Prepnutie komunikácie" + +#: src/settings_translation_file.cpp +msgid "Chat weblinks" +msgstr "Komunikačná webové odkazy" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "Veľkosť časti (chunk)" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "Filmový mód" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "Tlačidlo Filmový režim" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "Vyčisti priehľadné textúry" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Spustiteľné webové odkazy (kliknutie stredným tlačítkom, alebo CTRL+ľave " +"kliknutie) sú v komunikačnej konzole povolené." + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "Klient" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "Klient a Server" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "Úpravy (modding) cez klienta" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" +msgstr "Obmedzenia úprav na strane klienta" + +#: src/settings_translation_file.cpp +msgid "Client side node lookup range restriction" +msgstr "Obmedzenie vyhľadávania dosahu kociek na strane klienta" + +#: src/settings_translation_file.cpp +msgid "Client-side Modding" +msgstr "Úpravy (módovanie) na strane klienta" + +#: src/settings_translation_file.cpp +msgid "Climbing speed" +msgstr "Rýchlosť šplhania" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "Polomer mrakov" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "Mraky" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "Mraky sú efektom na strane klienta." + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "Mraky v menu" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "Farebná hmla" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Farebné tiene" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" +msgstr "" +"Čiarkou oddelený zoznam príznakov, ktoré sa skryjú v zozname doplnkov.\n" +"\"nonfree\" môže byť využité na skrytie doplnkov, ktoré nie je možné " +"považovať za 'voľný softvér',\n" +"tak ako je definovaný Free Software Foundation.\n" +"Môžeš definovať aj hodnotenie obsahu.\n" +"Tie to príznaky sú nezávislé od verzie Minetestu,\n" +"viď. aj kompletný zoznam na 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 "" +"Čiarkou oddelený zoznam rozšírení, ktoré majú povolené prístup na HTTP API,\n" +"ktoré im dovolia posielať a sťahovať dáta z/na 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 "" +"Čiarkou oddelený zoznam dôveryhodných rozšírení, ktoré majú povolené\n" +"nebezpečné funkcie aj keď je bezpečnosť rozšírení aktívna (cez " +"request_insecure_environment())." + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "Tlačidlo Príkaz" + +#: src/settings_translation_file.cpp +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 "" +"Úroveň kompresie použitej pri ukladaní blokov mapy na disk.\n" +"-1 - predvolená úroveň kompresie\n" +"0 - najmenšia kompresia, najrýchlejšie\n" +"9 - najlepšia kompresia, najpomalšie" + +#: src/settings_translation_file.cpp +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 "" +"Úroveň kompresie použitej pri posielaní blokov mapy klientom.\n" +"-1 - predvolená úroveň kompresie\n" +"0 - najmenšia kompresia, najrýchlejšie\n" +"9 - najlepšia kompresia, najpomalšie" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "Prepojené sklo" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "Pripoj sa na externý média server" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "Prepojí sklo, ak je to podporované kockou." + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "Priehľadnosť konzoly" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "Farba konzoly" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "Výška konzoly" + +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "Úložisko doplnkov" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "Čierna listina príznakov z ContentDB" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB Maximum súbežných sťahovaní" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "Cesta (URL) ku ContentDB" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "Neustály pohyb vpred" + +#: 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 "" +"Neustály pohyb vpred, prepína sa klávesou pre \"Automatický pohyb vpred\".\n" +"Opätovne stlač klávesu pre \"Automatický pohyb vpred\", alebo pohyb vzad pre " +"vypnutie." + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "Ovládanie" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples:\n" +"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." +msgstr "" +"Riadi dĺžku dňa a noci.\n" +"Príklad:\n" +"72 = 20min, 360 = 4min, 1 = 24hodín, 0 = deň/noc/čokoľvek ostáva nezmenený." + +#: src/settings_translation_file.cpp +msgid "" +"Controls sinking speed in liquid when idling. Negative values will cause\n" +"you to rise instead." +msgstr "" +"Riadi rýchlosť klesania v kvapaline pri nečinnosti. Negatívne hodnoty\n" +"spôsobia, že budeš namiesto klesania stúpať." + +#: src/settings_translation_file.cpp +msgid "Controls steepness/depth of lake depressions." +msgstr "Riadi strmosť/hĺbku jazier." + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "Riadi strmosť/výšku kopcov." + +#: src/settings_translation_file.cpp +msgid "" +"Controls width of tunnels, a smaller value creates wider tunnels.\n" +"Value >= 10.0 completely disables generation of tunnels and avoids the\n" +"intensive noise calculations." +msgstr "" +"Riadi šírku tunelov, menšia hodnota vytvára širšie tunely.\n" +"Hodnota >= 10.0 úplne vypne generovanie tunelov, čím sa vyhne\n" +"náročným prepočtom šumu." + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "Správa pri páde" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "Kreatívny režim" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "Priehľadnosť zameriavača" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Priehľadnosť zameriavača (nepriehľadnosť, medzi 0 a 255).\n" +"Tiež nastavuje farbu objektu zameriavača." + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "Farba zameriavača" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Farba zameriavača (R,G,B).\n" +"Nastavuje farbu objektu zameriavača" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "DPI" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "Zranenie" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "Tlačidlo Ladiace informácie" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "Hraničná veľkosť ladiaceho log súboru" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "Úroveň ladiacich info" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "Ladenie" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "Tlačidlo Zníž hlasitosť" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "Určený krok servera" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "Štandardné zrýchlenie" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "Štandardná hra" + +#: 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 "" +"Štandardná hra pri vytváraní nového sveta.\n" +"Toto bude prepísané pri vytvorení nového sveta z hlavného menu." + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "Štandardné heslo" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "Štandardné práva" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "Štandardný formát záznamov" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "Štandardná veľkosť kôpky" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." +msgstr "" +"Definuje kvalitu filtrovania tieňov\n" +"Toto simuluje efekt jemných tieňov použitím PCF alebo poisson disk\n" +"zároveň ale spotrebováva viac zdrojov." + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "Definuje oblasti, kde stromy majú jablká." + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "Definuje oblasti s pieskovými plážami." + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain and steepness of cliffs." +msgstr "Definuje rozdelenie vyššieho terénu a strmosť útesov." + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain." +msgstr "Definuje rozdelenie vyššieho terénu." + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "Definuje plnú šírku dutín, menšie hodnoty vytvoria väčšie dutiny." + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "Vo veľkom merítku definuje štruktúru kanálov riek." + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "Definuje umiestnenie a terén voliteľných kopcov a jazier." + +#: src/settings_translation_file.cpp +msgid "Defines the base ground level." +msgstr "Definuje úroveň dna." + +#: src/settings_translation_file.cpp +msgid "Defines the depth of the river channel." +msgstr "Definuje hĺbku koryta rieky." + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" +"Určuje maximálnu vzdialenosť zobrazenia hráča v blokoch (0 = neobmedzená)." + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river channel." +msgstr "Definuje šírku pre koryto rieky." + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river valley." +msgstr "Definuje šírku údolia rieky." + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "Definuje oblasti so stromami a hustotu stromov." + +#: 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 "" +"Oneskorenie, kým sa Mesh aktualizuje na strane klienta v ms.\n" +"Zvýšenie spomalí množstvo aktualizácie Mesh objektov, teda zníži chvenie na " +"pomalších klientoch." + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "Oneskorenie posielania blokov po výstavbe" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "Oneskorenie zobrazenia popisku, zadané v milisekundách." + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "Zastaralé Lua API spracovanie" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find giant caverns." +msgstr "Hĺbka pod ktorou nájdeš gigantické dutiny/jaskyne." + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "Hĺbka pod ktorou nájdeš veľké jaskyne." + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" +"Zobrazovaný popis servera, keď sa hráč na server pripojí a v zozname " +"serverov." + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "Hraničná hodnota šumu púšte" + +#: 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 "" +"Púšte sa objavia keď np_biome presiahne túto hodnotu.\n" +"Ak je aktívny príznak 'snowbiomes', tak toto je ignorované." + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "Nesynchronizuj animáciu blokov" + +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "Nastavenia pre vývojárov" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Tlačidlo Kopanie" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "Časticové efekty pri kopaní" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "Zakáž anticheat" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "Zakáž prázdne heslá" + +#: src/settings_translation_file.cpp +msgid "Display Density Scaling Factor" +msgstr "Faktor škálovania hustoty zobrazenia" + +#: 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 "" +"Vzdialenosť v kockách do ktorej sa ešte spracúva hĺbka priesvitnosti\n" +"Používa sa obmedzenie dopadu na výkon pri spracovaní hĺbky priesvitnosti" + +#: src/settings_translation_file.cpp +msgid "Domain name of server, to be displayed in the serverlist." +msgstr "Doménové meno servera, ktoré bude zobrazené v zozname serverov." + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "Dvakrát skok pre lietanie" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "Dvojnásobné stlačenie klávesy pre skok prepne režim lietania." + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "Tlačidlo Zahoď vec" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "Získaj ladiace informácie generátora máp." + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "Maximálne Y kobky" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "Minimálne Y kobky" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +msgstr "Šum kobky" + +#: src/settings_translation_file.cpp +msgid "" +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." +msgstr "" +"Aktivuj IPv6 podporu (pre klienta ako i server).\n" +"Požadované aby IPv6 spojenie vôbec mohlo fungovať." + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" +"Aktivuj podporu úprav na klientovi pomocou Lua skriptov.\n" +"Táto podpora je experimentálna a API sa môže zmeniť." + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Aktivuj poisson disk filtrovanie.\n" +"Ak je aktivované použije poisson disk pre vytvorenie \"mäkkých tieňov\". V " +"opačnom prípade sa použije PCF filtrovanie." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Aktivuje farebné tiene.\n" +"Ak je aktivovaný, tak priesvitné kocky dávajú farebné tiene. Toto je náročné." + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Aktivuj okno konzoly" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +msgstr "Aktivuj kreatívny režim pre všetkých hráčov" + +#: src/settings_translation_file.cpp +msgid "Enable joysticks" +msgstr "Aktivuj joysticky" + +#: src/settings_translation_file.cpp +msgid "Enable joysticks. Requires a restart to take effect" +msgstr "Povoľ joystick. Vyžaduje sa reštart hry" + +#: src/settings_translation_file.cpp +msgid "Enable mod channels support." +msgstr "Aktivuj podporu komunikačných kanálov rozšírení (mod channels)." + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "Aktivuj rozšírenie pre zabezpečenie" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "Aktivuje aby mohol byť hráč zranený a zomrieť." + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "Aktivuje náhodný užívateľský vstup (používa sa len pre testovanie)." + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +msgstr "" +"Aktivuj jemné nasvietenie pomocou jednoduchej \"ambient occlusion\".\n" +"Vypni pre zrýchlenie, alebo iný vzhľad." + +#: src/settings_translation_file.cpp +msgid "Enable split login/register" +msgstr "Povoľ rozdielné prihlásenie/registráciu" + +#: 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 " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" +"Aktivuj zakázanie pripojenia starých klientov.\n" +"Starší klienti sú kompatibilný v tom zmysle, že nepadnú pri pripájaní\n" +"k novým serverom, ale nemusia podporovať nové funkcie, ktoré očakávaš." + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" +"Aktivuj použitie vzdialeného média servera (ak je poskytovaný serverom).\n" +"Vzdialený server poskytuje výrazne rýchlejší spôsob pre sťahovanie médií " +"(napr. textúr)\n" +"pri pripojení na server." + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" +"Aktivuj \"vertex buffer objects\".\n" +"Toto by malo viditeľne zvýšiť grafický výkon." + +#: 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 "" +"Aktivuj pohupovanie sa a hodnotu pohupovania.\n" +"Napr.: 0 pre žiadne pohupovanie; 1.0 pre normálne; 2.0 pre dvojnásobné." + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server.\n" +"Ignored if bind_address is set.\n" +"Needs enable_ipv6 to be enabled." +msgstr "" +"Aktivuj/vypni IPv6 server.\n" +"Ignorované, ak je nastavená bind_address .\n" +"Vyžaduje povolené enable_ipv6." + +#: src/settings_translation_file.cpp +msgid "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"appearance of high dynamic range images. Mid-range contrast is slightly\n" +"enhanced, highlights and shadows are gradually compressed." +msgstr "" +"Aktivuje Hablov 'Uncharted 2' filmový tone mapping.\n" +"Simuluje farebnú krivku fotografického filmu a ako sa približuje\n" +"vzhľadu obrázku s veľkým dynamickým rozsahom. Stredový kontrast je mierne\n" +"zlepšený, nasvietenie a tiene sú postupne zhustené." + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "Aktivuje animáciu vecí v inventári." + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "Aktivuje ukladanie tvárou rotovaných Mesh objektov do medzipamäti." + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "Aktivuje minimapu." + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" +"Aktivuje zvukový systém.\n" +"Ak je zakázaný, tak kompletne zakáže všetky zvuky\n" +"a ovládanie hlasitosti v hre bude nefunkčné.\n" +"Zmena tohto nastavenia si vyžaduje reštart hry." + +#: 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 "" +"Povolí kompromis, ktorý zníži zaťaženie CPU, alebo zvýši výkon renderovania\n" +"za cenu drobných vizuálnych chýb, ktoré neovplyvnia hrateľnosť." + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "Profil enginu" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "Interval tlače profilových dát enginu" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "Metódy bytostí" + +#: src/settings_translation_file.cpp +msgid "" +"Exponent of the floatland tapering. Alters the tapering behaviour.\n" +"Value = 1.0 creates a uniform, linear tapering.\n" +"Values > 1.0 create a smooth tapering suitable for the default separated\n" +"floatlands.\n" +"Values < 1.0 (for example 0.25) create a more defined surface level with\n" +"flatter lowlands, suitable for a solid floatland layer." +msgstr "" +"Exponent zošpicatenia lietajúcej pevniny. Pozmeňuje fungovanie " +"zošpicatenia.\n" +"Hodnota = 1.0 vytvorí stále, lineárne zošpicatenie.\n" +"Hodnoty > 1.0 vytvoria plynulé zošpicatenie, vhodné pre štandardné oddelené\n" +"lietajúce pevniny.\n" +"Hodnoty < 1.0 (napríklad 0.25) vytvoria viac vymedzený povrch s\n" +"rovnejšími nížinami, vhodné ako pevná základná vrstva lietajúcej pevniny." + +#: src/settings_translation_file.cpp +msgid "FPS" +msgstr "FPS" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS ak je hra nezameraná, alebo pozastavená" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "FSAA" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "Faktor šumu" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "Faktor pohupovania sa pri pádu" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "Cesta k záložnému písmu" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "Tlačidlo Rýchlosť" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "Zrýchlenie v rýchlom režime" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "Rýchlosť v rýchlom režime" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "Rýchly pohyb" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via the \"Aux1\" key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" +"Rýchly pohyb (cez \"Aux1\" klávesu).\n" +"Toto si na serveri vyžaduje privilégium \"fast\"." + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "Zorné pole" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "Zorné pole v stupňoch." + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" +"Súbor v client/serverlist ktorý obsahuje obľúbené servery, ktoré\n" +"sa zobrazujú v záložke Multiplayer." + +#: src/settings_translation_file.cpp +msgid "Filler depth" +msgstr "Hĺbka výplne" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "Šum hĺbky výplne" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "Filmový tone mapping" + +#: src/settings_translation_file.cpp +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 "" +"Filtrované textúry môžu zmiešať svoje RGB hodnoty s plne priehľadnými " +"susedmi,\n" +"ktoré sú PNG optimizérmi obvykle zmazané, niekdy môžu viesť k tmavým " +"oblastiam\n" +"alebo svetlým rohom na priehľadnej textúre. Aplikuj tento filter na ich " +"vyčistenie\n" +"pri nahrávaní textúry. Toto je automaticky aktivované, ak je aktivovaný " +"mipmapping." + +#: src/settings_translation_file.cpp +msgid "Filtering and Antialiasing" +msgstr "Filtrovanie a vyhladzovanie" + +#: src/settings_translation_file.cpp +msgid "First of 4 2D noises that together define hill/mountain range height." +msgstr "Prvý zo 4 2D šumov, ktoré spolu definujú rozsah výšok kopcov/hôr." + +#: src/settings_translation_file.cpp +msgid "First of two 3D noises that together define tunnels." +msgstr "Prvý z dvoch 3D šumov, ktoré spolu definujú tunely." + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "Predvolené semienko mapy" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "Pevný virtuálny joystick" + +#: src/settings_translation_file.cpp +msgid "Floatland density" +msgstr "Hustota lietajúcej pevniny" + +#: src/settings_translation_file.cpp +msgid "Floatland maximum Y" +msgstr "Maximálne Y lietajúcich pevnín" + +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "Minimálne Y lietajúcich pevnín" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "Šum lietajúcich krajín" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "Exponent kužeľovitosti lietajúcej pevniny" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "Vzdialenosť špicatosti lietajúcich krajín" + +#: src/settings_translation_file.cpp +msgid "Floatland water level" +msgstr "Úroveň vody lietajúcich pevnín" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "Tlačidlo Lietanie" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "Lietanie" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "Hmla" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "Začiatok hmly" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "Tlačidlo Prepnutie hmly" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "Písmo" + +#: src/settings_translation_file.cpp +msgid "Font bold by default" +msgstr "Štandardne tučné písmo" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "Štandardne šikmé písmo" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "Tieň písma" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "Priehľadnosť tieňa písma" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "Veľkosť písma" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "Veľkosť písma deliteľná" + +#: src/settings_translation_file.cpp +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Veľkosť písma štandardného fontu, kde 1jednotka = 1 pixel pri 96 DPI" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Veľkosť písma s pevnou šírkou, kde 1jednotka = 1 pixel pri 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 "" +"Veľkosť písma aktuálneho komunikačného textu a príkazového riadku v bodoch " +"(pt).\n" +"Pri hodnote 0 bude použitá štandardná veľkosť písma." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"Pre pixelové písma, ktoré sa zle škálujú, toto zabezpečí, že použité " +"veľkosti písma\n" +"s týmto fontom budú vždy deliteľné touto hodnotou v pixeloch. Napríklad,\n" +"pixelové písmo vysoké 16 pixelov, by malo mať toto nastavené na 16, aby sa " +"veľkosť\n" +"menila len na hodnoty 16, 32, 48, atď., takže rozšírenie požadujúce veľkosť " +"25 dostane 32." + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" +"Formát komunikačných správ hráča. Nasledujúce reťazce sú platné zástupné " +"symboly:\n" +"@name, @message, @timestamp (voliteľné)" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "Formát obrázkov snímok obrazovky." + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "Formspec štandardná farba pozadia" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "Formspec štandardná nepriehľadnosť pozadia" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "Formspec Celo-obrazovková farba pozadia" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "Formspec Celo-obrazovková nepriehľadnosť pozadia" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +msgstr "Štandardná farba pozadia (R,G,B) v definícii formulára (Formspec)." + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "" +"Štandardná nepriehľadnosť pozadia (medzi 0 a 255) v definícii formulára " +"(Formspec)." + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background color (R,G,B)." +msgstr "" +"Farba pozadia (R,G,B) v režime celej obrazovky v definícii formulára " +"(Formspec)." + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background opacity (between 0 and 255)." +msgstr "" +"Nepriehľadnosť pozadia (0-255) v režime celej obrazovky v definícii " +"formulára (Formspec)." + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "Tlačidlo Vpred" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "Štvrtý zo 4 2D šumov, ktoré spolu definujú rozsah výšok kopcov/hôr." + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "Typ fraktálu" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "Zlomok viditeľnej vzdialenosti od ktorej začne byť vykresľovaná hmla" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" +"Z akej vzdialeností sú klientovi generované bloky, zadané v blokoch mapy (16 " +"kociek)." + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" +"Z akej vzdialenosti sú bloky posielané klientovi, uvádzané v blokoch mapy " +"(16 kociek)." + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" +"Do akej vzdialenosti vedia klienti o objektoch, uvádzané v blokoch mapy (16 " +"kociek).\n" +"\n" +"Nastavenie vyššie ako active_block_range spôsobí, že server bude\n" +"uchovávať objekty až do udanej vzdialenosti v smere v ktorom sa\n" +"hráč pozerá. (Toto môže zabrániť tomu aby mobovia zrazu zmizli z pohľadu)" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "Celá obrazovka" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "Režim celej obrazovky." + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "Mierka GUI" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "Filter mierky GUI" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter txr2img" +msgstr "Filter mierky GUI txr2img" + +#: src/settings_translation_file.cpp +msgid "GUIs" +msgstr "Užívateľské rozhrania" + +#: src/settings_translation_file.cpp +msgid "Gamepads" +msgstr "Gamepady" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "Všeobecné" + +#: src/settings_translation_file.cpp +msgid "Global callbacks" +msgstr "Globálne odozvy" + +#: 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 "" +"Globálne atribúty pre generovanie máp.\n" +"V generátore v6 príznak 'decorations' riadi všetky dekorácie okrem stromov\n" +"a vysokej trávy, vo všetkých ostatných generátoroch tento príznak riadi " +"všetky dekorácie." + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" +"Gradient svetelnej krivky na maximálnych úrovniach svetlosti.\n" +"Upravuje kontrast najvyšších úrovni svetlosti." + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" +"Gradient svetelnej krivky na minimálnych úrovniach svetlosti.\n" +"Upravuje kontrast najnižších úrovni svetlosti." + +#: src/settings_translation_file.cpp +msgid "Graphics" +msgstr "Grafika" + +#: src/settings_translation_file.cpp +msgid "Graphics Effects" +msgstr "Grafické efekty" + +#: src/settings_translation_file.cpp +msgid "Graphics and Audio" +msgstr "Grafika a zvuk" + +#: src/settings_translation_file.cpp +msgid "Gravity" +msgstr "Gravitácia" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "Základná úroveň" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "Šum terénu" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "HTTP rozšírenia" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "HUD" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "Mierka HUD" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "Tlačidlo Prepínanie HUD" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" +"Spracovanie zastaralých Lua API volaní:\n" +"- none: Zastarané funkcie neukladaj do logu\n" +"- log: napodobni log backtrace zastaralého volania (štandardne).\n" +"- error: preruš spracovanie zastaralého volania (odporúčané pre vývojárov " +"rozšírení)." + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" +"Ako má profiler inštrumentovať sám seba:\n" +"* Inštrumentuj prázdnu funkciu.\n" +"Toto odhaduje režijné náklady, táto inštrumentácia pridáva (+1 funkčné " +"volanie).\n" +"* Instrument the sampler being used to update the statistics." + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "Šum miešania teplôt" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "Teplotný šum" + +#: src/settings_translation_file.cpp +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "Výška okna po spustení. Ignorované v móde plnej obrazovky." + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "Výškový šum" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "Šum výšok" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "Strmosť kopcov" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "Hranica kopcov" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "Šum Kopcovitosť1" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "Šum Kopcovitosť2" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "Šum Kopcovitosť3" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "Šum Kopcovitosť4" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "Domovská stránka servera, ktorá bude zobrazená v zozname serverov." + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal acceleration in air when jumping or falling,\n" +"in nodes per second per second." +msgstr "" +"Horizontálne zrýchlenie vo vzduchu pri skákaní alebo padaní,\n" +"v kockách za sekundu na druhú." + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration in fast mode,\n" +"in nodes per second per second." +msgstr "" +"Horizontálne a vertikálne zrýchlenie v rýchlom režime,\n" +"v kockách za sekundu na druhú." + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration on ground or when climbing,\n" +"in nodes per second per second." +msgstr "" +"Horizontálne a vertikálne zrýchlenie na zemi, alebo pri šplhaní,\n" +"v kockách za sekundu na druhú." + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "Tlačidlo Nasledujúca vec na opasku" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "Tlačidlo Predchádzajúcu vec na opasku" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "Tlačidlo Opasok pozícia 1" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "Tlačidlo Opasok pozícia 10" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "Tlačidlo Opasok pozícia 11" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "Tlačidlo Opasok pozícia 12" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "Tlačidlo Opasok pozícia 13" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "Tlačidlo Opasok pozícia 14" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "Tlačidlo Opasok pozícia 15" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "Tlačidlo Opasok pozícia 16" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "Tlačidlo Opasok pozícia 17" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "Tlačidlo Opasok pozícia 18" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "Tlačidlo Opasok pozícia 19" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "Tlačidlo Opasok pozícia 2" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "Tlačidlo Opasok pozícia 20" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "Tlačidlo Opasok pozícia 21" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "Tlačidlo Opasok pozícia 22" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "Tlačidlo Opasok pozícia 23" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "Tlačidlo Opasok pozícia 24" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "Tlačidlo Opasok pozícia 25" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "Tlačidlo Opasok pozícia 26" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "Tlačidlo Opasok pozícia 27" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "Tlačidlo Opasok pozícia 28" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "Tlačidlo Opasok pozícia 29" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "Tlačidlo Opasok pozícia 3" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "Tlačidlo Opasok pozícia 30" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "Tlačidlo Opasok pozícia 31" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "Tlačidlo Opasok pozícia 32" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "Tlačidlo Opasok pozícia 4" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "Tlačidlo Opasok pozícia 5" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "Tlačidlo Opasok pozícia 6" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "Tlačidlo Opasok pozícia 7" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "Tlačidlo Opasok pozícia 8" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "Tlačidlo Opasok pozícia 9" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "Aké hlboké majú byť rieky." + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"If negative, liquid waves will move backwards.\n" +"Requires waving liquids to be enabled." +msgstr "" +"Ako rýchlo sa budú pohybovať vlny tekutín. Vyššia hodnota = rýchlejšie.\n" +"Ak je záporná, tekutina sa bude pohybovať naspäť.\n" +"Požaduje, aby boli aktivované vlniace sa tekutiny." + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" +"Koľko bude server čakať kým uvoľní nepoužívané bloky mapy, v sekundách.\n" +"Vyššia hodnota je plynulejšia, ale použije sa viac 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 "" +"Ako veľmi budeš spomalený pri pohybe v tekutine.\n" +"Znížením zvýšiš odpor tekutiny pri pohybe." + +#: src/settings_translation_file.cpp +msgid "How wide to make rivers." +msgstr "Aké široké majú byť rieky." + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "Šum miešania vlhkostí" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "Šum vlhkosti" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "Odchýlky vlhkosti pre biómy." + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "IPv6" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "IPv6 server" + +#: 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 "" +"Ak by malo byt FPS vyššie, bude obmedzené, aby\n" +"sa bezvýznamne, bez úžitku neplytvalo výkonom CPU." + +#: 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 "" +"Ak nie je aktivované, použije sa \"Aux1\" klávesa na rýchle lietanie, v " +"prípade,\n" +"že je povolený režim lietania aj rýchlosti." #: src/settings_translation_file.cpp msgid "" @@ -4937,10 +4238,2105 @@ msgid "" "invisible\n" "so that the utility of noclip mode is reduced." msgstr "" +"Ak je aktivovaný, server bude realizovať occlusion culling blokov mapy " +"založený\n" +"na pozícií oka hráča. Toto môže znížiť počet blokov posielaných klientovi\n" +"o 50-80%. Klient už nebude dostávať takmer neviditeľné bloky,\n" +"takže funkčnosť režim prechádzania stenami je obmedzená." #: src/settings_translation_file.cpp -msgid "Client side modding restrictions" +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." msgstr "" +"Ak je aktivovaný spolu s režimom lietania, tak je hráč schopný letieť cez " +"pevné kocky.\n" +"Toto si na serveri vyžaduje privilégium \"noclip\"." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +msgstr "" +"Ak je aktivované, použije sa namiesto klávesy pre \"zakrádanie\" \"Aux1\" " +"klávesu\n" +"pre klesanie a šplhanie dole." + +#: 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 "" +"Ak je aktivované, tak registrácia účtu je oddelená od prihlásenia v UI.\n" +"Ak je zakázané, nové konto sa zaregistruje automaticky pri prihlásení." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, actions are recorded for rollback.\n" +"This option is only read when server starts." +msgstr "" +"Ak je aktivované, akcie sa nahrávajú pre účely obnovenia.\n" +"Toto nastavenie sa prečíta len pri štarte servera." + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" +"Ak je aktivované, zruší ochranu pred podvodmi (cheatmi) v multiplayeri." + +#: 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 "" +"Ak je aktivované, chybné dáta nespôsobia vypnutie servera.\n" +"Povoľ len ak vieš čo robíš." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" +"Ak je aktivované, tak je smer pohybu pri lietaní, alebo plávaní daný sklonom " +"hráča." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "" +"Ak je aktivované, nový hráči sa nemôžu prihlásiť bez zadaného hesla, ani si " +"nemôžu heslo vymazať." + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" +"Ak je aktivované, môžeš dať bloky na miesto kde stojíš (v úrovni päta + " +"oči).\n" +"Je to užitočné ak pracuješ s kockami v stiesnených priestoroch." + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." +msgstr "" +"Ak sú CSM obmedzenia pre dohľad kocky aktívne, volania get_node sú\n" +"obmedzené touto vzdialenosťou od hráča ku kocke." + +#: 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 "" +"Ak vykonanie príkazu trvá dlhšie ako zadaný čas v sekundách,\n" +"tak pridá informáciu o čase do komunikačného správy príkazu" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" +"Ak veľkosť súboru debug.txt prekročí zadanú veľkosť v megabytoch,\n" +"keď bude otvorený, súbor bude presunutý do debug.txt.1,\n" +"ak existuje starší debug.txt.1, tak tento bude zmazaný.\n" +"debug.txt bude presunutý, len ak je toto nastavenie kladné." + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "Ak je povolený, hráči vždy ožijú (obnovia sa) na zadanej pozícií." + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "Ignoruj chyby vo svete" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "Priehľadnosť pozadia konzoly v hre (nepriehľadnosť, medzi 0 a 255)." + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "Pozadie (R,G,B) komunikačnej konzoly v hre." + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "Výška komunikačnej konzoly v hre, medzi 0.1 (10%) a 1.0 (100%)." + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "Tlačidlo Zvýš hlasitosť" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +msgstr "Počiatočná vertikálna rýchlosť pri skákaní, v kockách za sekundu." + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" +"Inštrumentuj vstavané (builtin).\n" +"Toto je obvykle potrebné len pre core/builtin prispievateľov" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "Inštrumentuj komunikačné príkazy pri registrácií." + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" +"Inštrumentuj globálne odozvy volaní funkcií pri registrácií.\n" +"(čokoľvek je poslané minetest.register_*() funkcií)" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "Inštrumentuj funkcie ABM pri registrácií." + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "Inštrumentuj funkcie nahrávania modifikátorov blokov pri registrácií." + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +msgstr "Inštrumentuj metódy bytostí pri registrácií." + +#: src/settings_translation_file.cpp +msgid "Interval of saving important changes in the world, stated in seconds." +msgstr "Interval ukladania dôležitých zmien vo svete, uvádzaný v sekundách." + +#: src/settings_translation_file.cpp +msgid "Interval of sending time of day to clients, stated in seconds." +msgstr "Interval v akom sa posiela denný čas klientom, v sekundách." + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "Animácia vecí v inventári" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "Tlačidlo Inventár" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "Obrátiť smer myši" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "Obráti vertikálny pohyb myši." + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "Cesta k šikmému písmu" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "Cesta k šikmému písmu s pevnou šírkou" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "Životnosť odložených vecí" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "Iterácie" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"increases processing load.\n" +"At iterations = 20 this mapgen has a similar load to mapgen V7." +msgstr "" +"Iterácie rekurzívnej funkcie.\n" +"Zvýšenie zvýši úroveň jemnosti detailov, ale tiež\n" +"zvýši zaťaženie pri spracovaní.\n" +"Pri iteráciach = 20 má tento generátor podobné zaťaženie ako generátor V7." + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "ID joysticku" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "Interval opakovania tlačidla joysticku" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Mŕtva zóna joysticku" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "Citlivosť otáčania pohľadu joystickom" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "Typ joysticku" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" +"Len pre sadu Julia.\n" +"W komponent hyperkomplexnej konštanty.\n" +"Zmení tvar fraktálu.\n" +"Nemá vplyv na 3D fraktály.\n" +"Rozsah zhruba -2 až 2." + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" +"Len pre sadu Julia.\n" +"X komponent hyperkomplexnej konštanty.\n" +"Zmení tvar fraktálu.\n" +"Rozsah zhruba -2 až 2." + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" +"Len pre sadu Julia.\n" +"Y komponent hyperkomplexnej konštanty.\n" +"Zmení tvar fraktálu.\n" +"Rozsah zhruba -2 až 2." + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" +"Len pre sadu Julia.\n" +"Z komponent hyperkomplexnej konštanty.\n" +"Zmení tvar fraktálu.\n" +"Rozsah zhruba -2 až 2." + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "Julia w" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "Julia x" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "Julia y" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "Julia z" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "Tlačidlo Skok" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "Rýchlosť skákania" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre zníženie dohľadu.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre zníženie hlasitosti.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre kopanie.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre zahodenie aktuálne vybranej veci.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre zvýšenie dohľadu.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre zvýšenie hlasitosti.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre skákanie.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre rýchly pohyb hráča v rýchlom móde.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre pohyb hráča vzad.\n" +"Zároveň vypne automatický pohyb hráča dopredu, ak je aktívny.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre pohyb hráča vpred.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre pohyb hráča vľavo.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre pohyb hráča vpravo.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre vypnutie hlasitosti v hre.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre otvorenie komunikačného okna pre zadávanie príkazov.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre otvorenie komunikačného okna pre zadávanie lokálnych príkazov.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre otvorenie komunikačného okna.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre otvorenie inventára.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre pokladanie.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber jedenástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber dvanástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber trinástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber štrnástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber pätnástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber šestnástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber sedemnástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber osemnástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber devätnástej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 20. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 21. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 22. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 23. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 24. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 25. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 26. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 27. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 28. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 29. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 30. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 31. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber 32. pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber ôsmej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber piatej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber prvej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber štvrtej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber ďalšej veci na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber deviatej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber predchádzajúcej veci na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber druhej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber siedmej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber šiestej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber desiatej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre výber tretej pozície na opasku.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre utajený pohyb (zakrádanie) hráča.\n" +"Tiež sa používa pre zliezanie a ponáranie vo vode ak aux1_descends je " +"vypnutý.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepínanie medzi pohľadom z prvej a tretej osoby.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre snímanie obrazovky.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie režimu automatického pohybu vpred.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie filmového režimu.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie zobrazenia minimapy.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie režimu rýchlosť.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie lietania.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie režimu prechádzania stenami.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie režimu pohyb podľa sklonu.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie aktualizácie pohľadu. Používa sa len pre vývoj.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie zobrazenia komunikácie.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie zobrazenia ladiacich informácií.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie zobrazenia hmly.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie zobrazenia HUD (Head-Up Display - výhľadový " +"displej).\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie zobrazenia veľkej konzoly na komunikáciu.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie zobrazenia profileru. Používa sa pri vývoji.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre prepnutie neobmedzeného dohľadu.\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Tlačidlo pre použitie priblíženia pokiaľ je to možné .\n" +"Viď. http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "Keyboard and Mouse" +msgstr "Klávesnica a myš" + +#: src/settings_translation_file.cpp +msgid "Kick players who sent more than X messages per 10 seconds." +msgstr "Vylúč hráča, ktorý pošle viac ako X správ za 10 sekúnd." + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "Strmosť jazier" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "Hranica jazier" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "Jazyk" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "Hĺbka veľkých jaskýň" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "Minimálny počet veľkých jaskýň" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "Minimálny počet veľkých jaskýň" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "Pomer zaplavených častí veľkých jaskýň" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "Tlačidlo Veľká komunikačná konzola" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "Štýl listov" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" +"Štýly listov:\n" +"- Ozdobné: všetky plochy sú viditeľné\n" +"- Jednoduché: sú použité len vonkajšie plochy, ak sú použité definované " +"\"special_tiles\"\n" +"- Nepriehľadné: vypne priehliadnosť" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "Tlačidlo Vľavo" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" +"Dĺžka kroku servera a interval v ktorom sú objekty štandardne aktualizované\n" +"cez sieť, uvedené v sekundách." + +#: src/settings_translation_file.cpp +msgid "" +"Length of liquid waves.\n" +"Requires waving liquids to be enabled." +msgstr "" +"Dĺžka vĺn tekutín.\n" +"Požaduje, aby boli aktivované vlniace sa tekutiny." + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between Active Block Modifier (ABM) execution cycles, stated " +"in seconds." +msgstr "" +"Časový interval medzi jednotlivými vykonávacími cyklami ABM (Active Block " +"Modifier), v sekundách." + +#: src/settings_translation_file.cpp +msgid "Length of time between NodeTimer execution cycles, stated in seconds." +msgstr "" +"Časový interval medzi jednotlivými vykonávacími cyklami časovača kociek " +"(NodeTimer), v sekundách." + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" +"Časový interval medzi jednotlivými riadiacimi cyklami aktívnych blokov, v " +"sekundách." + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" +"Úroveň ladiacich informácií, ktoré budú zapísané do debug.txt:\n" +"- <nič> (bez logovania)\n" +"- none - žiadna (správy bez úrovne)\n" +"- error - chyby\n" +"- warning - varovania\n" +"- akcie\n" +"- info - informácie\n" +"- verbose - všetko\n" +"- trace - krokovanie" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "Zosilnenie svetelnej krivky" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "Stred zosilnenia svetelnej krivky" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "Rozptyl zosilnenia svetelnej krivky" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "Svetelná gamma krivka" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "Horný gradient svetelnej krivky" + +#: src/settings_translation_file.cpp +msgid "Light curve low gradient" +msgstr "Spodný gradient svetelnej krivky" + +#: src/settings_translation_file.cpp +msgid "Lighting" +msgstr "Osvetlenie" + +#: 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 "" +"Limit pre generovanie mapy, v kockách, vo všetkých 6 smeroch (0, 0, 0).\n" +"Len časti mapy (mapchunks) kompletne v rámci limitu generátora máp sú " +"generované.\n" +"Hodnota sa ukladá pre každý svet." + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" +"Maximálny počet paralelných HTTP požiadavok. Ovplyvňuje:\n" +"- Získavanie médií ak server používa nastavenie remote_media.\n" +"- Sťahovanie zoznamu serverov a zverejňovanie servera.\n" +"- Sťahovania vykonávané z hlavného menu (napr. správca rozšírení).\n" +"Má efekt len ak je skompilovaný s cURL." + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "Tekutosť kvapalín" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "Zjemnenie tekutosti kvapalín" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "Max sprac. tekutín" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "Čas do uvolnenia fronty tekutín" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "Ponáranie v tekutinách" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "Aktualizačný interval tekutín v sekundách." + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "Aktualizačný interval tekutín" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "Nahraj profiler hry" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" +"Nahraj profiler hry pre získanie profilových dát.\n" +"Poskytne príkaz /profiler pre prístup k skompilovanému profilu.\n" +"Užitočné pre vývojárov rozšírení a správcov serverov." + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "Nahrávam modifikátory blokov" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "Dolný Y limit kobiek." + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "Spodný Y limit lietajúcich pevnín." + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "Skript hlavného menu" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" +"Prispôsob farbu hmly a oblohy dennej dobe (svitanie/súmrak) a uhlu pohľadu." + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "Všetky tekutiny budú nepriehľadné" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Úroveň kompresie mapy pre diskové úložisko" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Úroveň kompresie mapy pre sieťový prenos" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "Adresár máp" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen Carpathian." +msgstr "Špecifické príznaky pre generátor máp Karpaty." + +#: 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 "" +"Špecifické atribúty pre plochý generátor mapy.\n" +"Príležitostne môžu byť na plochý svet pridané jazerá a kopce." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'terrain' enables the generation of non-fractal terrain:\n" +"ocean, islands and underground." +msgstr "" +"Špecifické príznaky generátora máp Fraktál.\n" +"'terrain' aktivuje generovanie nie-fraktálneho terénu:\n" +"oceán, ostrovy and podzemie." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"to become shallower and occasionally dry.\n" +"'altitude_dry': Reduces humidity with altitude." +msgstr "" +"Špecifické príznaky pre generovanie mapy generátora Údolia.\n" +"'altitude_chill': Znižuje teplotu s nadmorskou výškou.\n" +"'humid_rivers': Zvyšuje vlhkosť okolo riek.\n" +"'vary_river_depth': ak je aktívne, nízka vlhkosť a vysoké teploty\n" +"spôsobia, že hladina rieky poklesne, niekdy aj vyschne.\n" +"'altitude_dry': Znižuje vlhkosť s nadmorskou výškou." + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen v5." +msgstr "Príznaky pre generovanie špecifické pre generátor V5." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored." +msgstr "" +"Špecifické atribúty pre generátor V6.\n" +"Príznak 'snowbiomes' aktivuje nový systém 5 biómov.\n" +"Ak je aktívny prźnak 'snowbiomes', džungle sú automaticky povolené a\n" +"príznak 'jungles' je ignorovaný." + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'floatlands': Floating land masses in the atmosphere.\n" +"'caverns': Giant caves deep underground." +msgstr "" +"Špecifické príznaky pre generátor máp V7.\n" +"'ridges': Rieky.\n" +"'floatlands': Lietajúce masy pevnín v atmosfére.\n" +"'caverns': Gigantické jaskyne hlboko v podzemí." + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "Limit generovania mapy" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "Interval ukladania mapy" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "Aktualizačný čas mapy tieňov" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "Limit blokov mapy" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "Oneskorenie generovania Mesh blokov" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "Medzipamäť Mapblock Mesh generátora blokov v MB" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "Čas odstránenia bloku mapy" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "Generátor mapy Karpaty" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "Špecifické príznaky generátora máp Karpaty" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "Generátor mapy plochý" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "Špecifické príznaky plochého generátora mapy" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "Generátor mapy Fraktál" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "Špecifické príznaky generátora máp Fraktál" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "Generátor mapy V5" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "Špecifické príznaky pre generátor mapy V5" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "Generátor mapy V6" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "Špecifické príznaky generátora mapy V6" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "Generátor mapy V7" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "Špecifické príznaky generátora V7" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "Generátor mapy Údolia" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "Špecifické príznaky pre generátor Údolia" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "Ladenie generátora máp" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "Meno generátora mapy" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "Maximálna vzdialenosť generovania blokov" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "Max vzdialenosť posielania objektov" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "Maximálny počet tekutín spracovaný v jednom kroku." + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "Max. extra blokov clearobjects" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "Max. paketov za opakovanie" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "Maximálne FPS" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" +"Maximálne FPS, ak je hra nie je v aktuálnom okne, alebo je pozastavená." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Maximálna vzdialenosť pre renderovanie tieňov." + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "Maximum vynútene nahraných blokov" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "Maximálna šírka opaska" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of large caves per mapchunk." +msgstr "" +"Maximálny limit náhodného počtu veľkých jaskýň v danej časti mapy (mapchunk)." + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of small caves per mapchunk." +msgstr "" +"Maximálny limit náhodného počtu malých jaskýň v danej časti mapy (mapchunk)." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum liquid resistance. Controls deceleration when entering liquid at\n" +"high speed." +msgstr "" +"Maximálny odpor tekutín. Riadi spomalenie ak sa tekutina\n" +"vlieva vysokou rýchlosťou." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" +"Maximálny počet súčasne posielaných blokov na klienta.\n" +"Maximálny počet sa prepočítava dynamicky:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "Maximálny limit kociek, ktoré môžu byť vo fronte pre nahrávanie." + +#: 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 "" +"Maximálny limit kociek vo fronte, ktoré budú generované.\n" +"Tento limit je vynútený pre každého hráča." + +#: 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 "" +"Maximálny limit kociek vo fronte, ktoré budú nahrané zo súboru.\n" +"Tento limit je vynútený pre každého hráča." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Maximálny počet súčasných sťahovaní. Sťahovania presahujúce tento limit budú " +"čakať v rade.\n" +"Mal by byť nižší ako curl_parallel_limit." + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "Maximálny počet vynútene nahraných blokov mapy." + +#: 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 "" +"Maximálny počet blokov u klienta, ktoré ostávajú v pamäti.\n" +"Nastav -1 pre neobmedzené množstvo." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" +"Maximálny počet paketov poslaný pri jednom kroku posielania,\n" +"ak máš pomalé pripojenie skús ho znížiť, ale\n" +"neznižuj ho pod dvojnásobok cieľového počtu klientov." + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "Maximálny počet hráčov, ktorí sa môžu súčasne pripojiť." + +#: src/settings_translation_file.cpp +msgid "Maximum number of recent chat messages to show" +msgstr "Maximálny počet nedávnych správ v komunikácií, ktoré budú zobrazované" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "Maximálny počet staticky uložených objektov v bloku." + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "Max. počet objektov na blok" + +#: 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 "" +"Maximálny pomer aktuálneho okna, ktorý sa použije pre opasok.\n" +"Užitočné, ak treba zobraziť niečo vpravo, alebo vľavo od opaska." + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "Maximum súčasných odoslaní bloku na klienta" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "Maximálna veľkosť výstupnej komunikačnej fronty" + +#: 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 "" +"Maximálna veľkosť výstupnej komunikačnej fronty.\n" +"0 pre zakázanie fronty a -1 pre neobmedzenú frontu." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" +"Maximálny čas v ms, ktorý môže zabrať sťahovanie súboru (napr. sťahovanie " +"rozšírenia)." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Maximálny čas v ms, ktorý môže zabrať interaktívna požiadavka (napr. " +"sťahovanie zoznamu serverov)." + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "Maximálny počet hráčov" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "Medzipamäť Mesh" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "Správa dňa" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "Správa dňa sa zobrazí hráčom pri pripájaní." + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "Metóda použitá pre zvýraznenie vybraných objektov." + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "Minimálna úroveň záznamov, ktoré budú vypísané do komunikačného okna." + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "Minimapa" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "Tlačidlo Minimapa" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "Minimapa výška skenovania" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +msgstr "" +"Minimálny limit náhodného počtu veľkých jaskýň v danej časti mapy (mapchunk)." + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "" +"Minimálny limit náhodného počtu malých jaskýň v danej časti mapy (mapchunk)." + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +msgstr "Minimálna veľkosť textúry" + +#: src/settings_translation_file.cpp +msgid "Mipmapping" +msgstr "Mip-mapovanie" + +#: src/settings_translation_file.cpp +msgid "Misc" +msgstr "Rôzne" + +#: src/settings_translation_file.cpp +msgid "Mod Profiler" +msgstr "Profiler rozšírení" + +#: src/settings_translation_file.cpp +msgid "Mod Security" +msgstr "Bezpečnosť rozšírení" + +#: src/settings_translation_file.cpp +msgid "Mod channels" +msgstr "Komunikačné kanály rozšírení" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "Upraví veľkosť elementov v užívateľskom rozhraní." + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "Cesta k písmu s pevnou šírkou" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "Veľkosť písmo s pevnou šírkou" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "Veľkosť písma s pevnou šírkou deliteľná" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "Šum pre výšku hôr" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "Šum hôr" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "Odchýlka šumu hôr" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "Základná úroveň hôr" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "Citlivosť myši" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "Multiplikátor citlivosti myši." + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "Šum bahna" + +#: 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 "" +"Násobiteľ pre pohupovanie sa pri pádu.\n" +"Napr.: 0 pre žiadne pohupovanie; 1.0 pre normálne; 2.0 pre dvojnásobné." + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "Tlačidlo Ticho" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "Stíš hlasitosť" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"Current mapgens in a highly unstable state:\n" +"- The optional floatlands of v7 (disabled by default)." +msgstr "" +"Meno generátora mapy, ktorý sa použije pri vytváraní nového sveta.\n" +"Vytvorenie sveta cez hlavné menu toto prepíše.\n" +"Aktuálne nestabilné generátory:\n" +"- Voliteľné lietajúce pevniny (floatlands) vo v7 (štandardne vypnuté)." + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" +"Meno hráča.\n" +"Ak je spustený server, klienti s týmto menom sú administrátori.\n" +"Pri štarte z hlavného menu, toto bude prepísané." + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" +"Zobrazované meno servera, keď sa hráč na server pripojí a v zozname serverov." + +#: src/settings_translation_file.cpp +msgid "Near plane" +msgstr "Blízkosť roviny" + +#: src/settings_translation_file.cpp +msgid "" +"Network port to listen (UDP).\n" +"This value will be overridden when starting from the main menu." +msgstr "" +"Sieťový port (UDP).\n" +"Táto hodnota bude prepísaná pri spustení z hlavného menu." + +#: src/settings_translation_file.cpp +msgid "Networking" +msgstr "Sieťové nastavenia" + +#: src/settings_translation_file.cpp +msgid "New users need to input this password." +msgstr "Noví hráči musia zadať toto heslo." + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "Prechádzanie stenami" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "Tlačidlo Prechádzanie stenami" + +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "Nasvietenie kocky a bytosti" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "Zvýrazňovanie kociek" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "Interval časovača kociek" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "Šumy" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "Počet použitých vlákien" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"processes, especially in singleplayer and/or when running Lua code in\n" +"'on_generated'. For many users the optimum setting may be '1'." +msgstr "" +"Počet použitých vlákien.\n" +"Hodnota 0:\n" +"- Automatický určenie. Počet použitých vlákien bude\n" +"- 'počet procesorov - 2', s dolným limitom 1.\n" +"Akákoľvek iná hodnota:\n" +"- Definuje počet vlákien, s dolným limitom 1.\n" +"VAROVANIE: Zvýšenie počtu vlákien zvýši rýchlosť generátora máp,\n" +"ale môže to uškodiť hernému výkonu interferenciou s inými\n" +"procesmi, obzvlášť pri hre jedného hráča a/alebo ak beží Lua kód\n" +"v 'on_generated'. Pre mnohých hráčov môže byť optimálne nastavenie '1'." + +#: src/settings_translation_file.cpp +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 "" +"Počet extra blokov, ktoré môžu byť naraz nahrané pomocou /clearobjects.\n" +"Toto je kompromis medzi vyťažením SQLite transakciami\n" +"a spotrebou pamäti (4096=100MB, ako približné pravidlo)." + +#: src/settings_translation_file.cpp +msgid "Opaque liquids" +msgstr "Nepriehľadné tekutiny" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "Nepriehľadnosť tieňa za štandardným písmom, medzi 0 a 255." + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" +"Otvorí menu pozastavenia, ak aktuálne okno hry nie je vybrané.\n" +"Nepozastaví sa ak je otvorený formspec." + +#: src/settings_translation_file.cpp +msgid "Optional override for chat weblink color." +msgstr "Voliteľná zmena farby webového odkazu v komunikačnej konzole." + +#: src/settings_translation_file.cpp +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 "" +"Cesta k záložnému písmu. Musí to byť TrueType font.\n" +"Toto písmo bude použité pre určité jazyky, alebo ak nie je štandardné písmo " +"k dispozícií." + +#: 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 "" +"Cesta, kam sa budú ukladať snímky obrazovky. Môže to byť ako absolútna, tak " +"relatívna cesta.\n" +"Adresár bude vytvorený ak neexistuje." + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" +"Cesta do adresára so shadermi. Ak nie je definovaná, použije sa predvolená " +"lokácia." + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "Cesta do adresára s textúrami. Všetky textúry sú najprv hľadané tu." + +#: 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 "" +"Cesta k štandardnému písmu. Musí to byť TrueType font.\n" +"Bude použité záložné písmo, ak nebude možné písmo nahrať." + +#: 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 "" +"Cesta k písmu s pevnou šírkou. Musí to byť TrueType font.\n" +"Toto písmo je použité pre napr. konzolu a okno profilera." + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "Pozastav hru, pri strate zamerania okna" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +msgstr "Limit kociek vo fronte na každého hráča nahrávaných z disku" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks to generate" +msgstr "Limit kociek vo fronte na každého hráča pre generovanie" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "Fyzika" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "Tlačidlo Pohyb podľa sklonu" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "Režim pohybu podľa sklonu" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Tlačidlo na pokladanie" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Interval opakovania pokladania" + +#: 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 "" +"Hráč je schopný lietať bez ovplyvnenia gravitáciou.\n" +"Toto si na serveri vyžaduje privilégium \"fly\"." + +#: src/settings_translation_file.cpp +msgid "Player transfer distance" +msgstr "Vzdialenosť zobrazenia hráča" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "Hráč proti hráčovi (PvP)" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Poisson filtrovanie" + +#: 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 "" +"Port pre pripojenie sa (UDP).\n" +"Políčko pre nastavenie Portu v hlavnom menu prepíše toto nastavenie." + +#: 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 "" +"Zabráni opakovanému kopaniu a ukladaniu blokov pri držaní tlačítka myši.\n" +"Aktivuj, ak príliš často omylom niečo vykopeš, alebo položíš blok." + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" +"Zabráni rozšíreniam aby robili nebezpečné veci ako spúšťanie systémových " +"príkazov." + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" +"Vytlačí profilové dáta enginu v pravidelných intervaloch (v sekundách).\n" +"0 = vypnuté. Užitočné pre vývojárov." + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "Oprávnenia, ktoré môže udeliť hráč s basic_privs" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "Profilátor" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "Tlačidlo Prepínanie profileru" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "Odpočúvacia adresa Promethea" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" +"Odpočúvacia adresa Promethea.\n" +"Ak je Minetest skompilovaný s nastaveným ENABLE_PROMETHEUS,\n" +"aktivuj odpočúvanie metriky pre Prometheus na zadanej adrese.\n" +"Metrika môže byť získaná na http://127.0.0.1:30000/metrics" + +#: src/settings_translation_file.cpp +msgid "Proportion of large caves that contain liquid." +msgstr "Pomer častí veľkých jaskýň, ktoré obsahujú tekutinu." + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" +"Polomer oblasti mrakov zadaný v počtoch 64 kociek na štvorcový mrak.\n" +"Hodnoty vyššie než 26 budú produkovať ostré hranice na rohoch oblasti mrakov." + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers." +msgstr "Zvýši terén aby vznikli údolia okolo riek." + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "Náhodný vstup" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "Tlačidlo Dohľad" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "Posledné správy v komunikácií" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "Štandardná cesta k písmam" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "Vzdialené média" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "Vzdialený port" + +#: 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 "" +"Odstráň farby z prichádzajúcich komunikačných správ\n" +"Použi pre zabránenie používaniu farieb hráčmi v ich správach" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "Nahradí štandardné hlavné menu vlastným." + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "Cesta k záznamom" #: src/settings_translation_file.cpp msgid "" @@ -4955,1062 +6351,176 @@ msgid "" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client side node lookup range restriction" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the CSM restriction for node range is enabled, get_node calls are " -"limited\n" -"to this distance from the player to the node." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Enable mod security" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Prevent mods from doing insecure things like running shell commands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trusted mods" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "HTTP mods" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Load the game profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Load the game profiler to collect game profiling data.\n" -"Provides a /profiler command to access the compiled profile.\n" -"Useful for mod developers and server operators." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Default report format" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The default format in which profiles are being saved,\n" -"when calling `/profiler save [format]` without format." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Report path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"The file path relative to your worldpath in which profiles will be saved to." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Entity methods" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument the methods of entities on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Active Block Modifiers" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument the action function of Active Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Loading Block Modifiers" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument the action function of Loading Block Modifiers on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Global callbacks" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument global callback functions on registration.\n" -"(anything you pass to a minetest.register_*() function)" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Builtin" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Instrument builtin.\n" -"This is usually only needed by core/builtin contributors" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Profiler" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Have the profiler instrument itself:\n" -"* Instrument an empty function.\n" -"This estimates the overhead, that instrumentation is adding (+1 function " -"call).\n" -"* Instrument the sampler being used to update the statistics." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Client and Server" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of the player.\n" -"When running a server, clients connecting with this name are admins.\n" -"When starting from the main menu, this is overridden." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Language" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Debug log level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Level of logging to be written to debug.txt:\n" -"- <nothing> (no logging)\n" -"- none (messages with no level)\n" -"- error\n" -"- warning\n" -"- action\n" -"- info\n" -"- verbose" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Debug log file size threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"If the file size of debug.txt exceeds the number of megabytes specified in\n" -"this setting when it is opened, the file is moved to debug.txt.1,\n" -"deleting an older debug.txt.1 if it exists.\n" -"debug.txt is only moved if this setting is positive." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chat log level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimal level of logging to be written to chat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "IPv6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable IPv6 support (for both client and server).\n" -"Required for IPv6 connections to work at all." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL parallel limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Limits number of parallel HTTP requests. Affects:\n" -"- Media fetch if server uses remote_media setting.\n" -"- Serverlist download and server announcement.\n" -"- Downloads performed by main menu (e.g. mod manager).\n" -"Only has an effect if compiled with cURL." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL file download timeout" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu script" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Replaces the default main menu with a custom one." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Engine profiling data print interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Print the engine's profiling data in regular intervals (in seconds).\n" -"0 = disable. Useful for developers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen name" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Name of map generator to be used when creating a new world.\n" -"Creating a world in the main menu will override this.\n" -"Current mapgens in a highly unstable state:\n" -"- The optional floatlands of v7 (disabled by default)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Water level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Water surface level of the world." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Max block generate distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"From how far blocks are generated for clients, stated in mapblocks (16 " -"nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation limit" -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" -"Value is stored per-world." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Global map generation attributes.\n" -"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Heat noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Temperature variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Heat blend noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small-scale temperature variation for blending biomes on borders." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity variation for biomes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Humidity blend noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small-scale humidity variation for blending biomes on borders." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V5" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V5 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation attributes specific to Mapgen v5." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Controls width of tunnels, a smaller value creates wider tunnels.\n" -"Value >= 10.0 completely disables generation of tunnels and avoids the\n" -"intensive noise calculations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y of upper limit of large caves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small cave minimum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Small cave maximum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave minimum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave maximum number" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Large cave proportion flooded" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Proportion of large caves that contain liquid." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern limit" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of cavern upper limit." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern taper" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-distance over which caverns expand to full size." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines full size of caverns, smaller values create larger caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon minimum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lower Y limit of dungeons." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon maximum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Upper Y limit of dungeons." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Noises" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Filler depth noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of biome filler depth." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Factor noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Variation of terrain vertical scale.\n" -"When noise is < -0.55 terrain is near-flat." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of average terrain surface." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave1 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "First of two 3D noises that together define tunnels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave2 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Second of two 3D noises that together define tunnels." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cavern noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining giant caverns." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ground noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dungeon noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V6" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V6 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen v6.\n" -"The 'snowbiomes' flag enables the new 5 biome system.\n" -"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" -"the 'jungles' flag is ignored." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Desert noise threshold" -msgstr "" - -#: 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 "" - -#: src/settings_translation_file.cpp -msgid "Beach noise threshold" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Sandy beaches occur when np_beach exceeds this value." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain base noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of lower terrain and seabed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain higher noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of higher terrain that creates cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Steepness noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Varies steepness of cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Height select noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines distribution of higher terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mud noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Varies depth of biome surface nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Beach noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines areas with sandy beaches." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Cave noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of number of caves." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Trees noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines tree areas and tree density." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Apple trees noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines areas where trees have apples." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V7" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen V7 specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen v7.\n" -"'ridges': Rivers.\n" -"'floatlands': Floating land masses in the atmosphere.\n" -"'caverns': Giant caves deep underground." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain zero level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Y of mountain density gradient zero level. Used to shift mountains " -"vertically." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland minimum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Lower Y limit of floatlands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland maximum Y" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Upper Y limit of floatlands." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland tapering distance" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Y-distance over which floatlands taper from full density to nothing.\n" -"Tapering starts at this distance from the Y limit.\n" -"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 "" - -#: src/settings_translation_file.cpp -msgid "Floatland taper exponent" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Exponent of the floatland tapering. Alters the tapering behaviour.\n" -"Value = 1.0 creates a uniform, linear tapering.\n" -"Values > 1.0 create a smooth tapering suitable for the default separated\n" -"floatlands.\n" -"Values < 1.0 (for example 0.25) create a more defined surface level with\n" -"flatter lowlands, suitable for a solid floatland layer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland density" -msgstr "" - -#: src/settings_translation_file.cpp -#, c-format -msgid "" -"Adjusts the density of the floatland layer.\n" -"Increase value to increase density. Can be positive or negative.\n" -"Value = 0.0: 50% of volume is floatland.\n" -"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" -"to be sure) creates a solid floatland layer." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland water level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Surface level of optional water placed on a solid floatland layer.\n" -"Water is disabled by default and will only be placed if this value is set\n" -"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" -"upper tapering).\n" -"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" -"When enabling water placement the floatlands must be configured and tested\n" -"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" -"required value depending on 'mgv7_np_floatland'), to avoid\n" -"server-intensive extreme water flow and to avoid vast flooding of the\n" -"world surface below." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain alternative noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Terrain persistence noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Varies roughness of terrain.\n" -"Defines the 'persistence' value for terrain_base and terrain_alt noises." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain height noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Variation of maximum mountain height (in nodes)." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridge underwater noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines large-scale river channel structure." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mountain noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"3D noise defining mountain structure and height.\n" -"Also defines structure of floatland mountain terrain." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Ridge noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "3D noise defining structure of river canyon walls." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Floatland noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"3D noise defining structure of floatlands.\n" -"If altered from the default, the noise 'scale' (0.7 by default) may need\n" -"to be adjusted, as floatland tapering functions best when this noise has\n" -"a value range of approximately -2.0 to 2.0." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Carpathian" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Carpathian specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Base ground level" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the base ground level." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River channel width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the width of the river channel." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River channel depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the depth of the river channel." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "River valley width" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Defines the width of the river valley." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness1 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "First of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness2 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Second of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness3 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Third of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Hilliness4 noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fourth of 4 2D noises that together define hill/mountain range height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rolling hills spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +"Obmedzi prístup k určitým klientským funkciám na serveroch.\n" +"Skombinuj bajtové príznaky dole pre obmedzenie jednotlivých\n" +"fukncii u klienta, alebo nastav 0 pre funkcie bez obmedzení:\n" +"LOAD_CLIENT_MODS: 1 (zakáže nahrávanie rozšírení u klienta)\n" +"CHAT_MESSAGES: 2 (zakáže send_chat_message volania u klienta)\n" +"READ_ITEMDEFS: 4 (zakáže get_item_def volania u klienta)\n" +"READ_NODEDEFS: 8 (zakáže get_node_def volania u klienta)\n" +"LOOKUP_NODES_LIMIT: 16 (obmedzí get_node volania u klienta na\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (zakáže get_player_names volania u klienta)" #: src/settings_translation_file.cpp msgid "Ridge mountain spread noise" -msgstr "" +msgstr "Rozptyl šumu hrebeňa hôr" #: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" +msgid "Ridge noise" +msgstr "Šum hrebeňa" #: src/settings_translation_file.cpp -msgid "Step mountain spread noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Rolling hill size noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgid "Ridge underwater noise" +msgstr "Šum podmorského hrebeňa" #: src/settings_translation_file.cpp msgid "Ridged mountain size noise" -msgstr "" +msgstr "Veľkosť šumu hrebeňa hôr" #: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" +msgid "Right key" +msgstr "Tlačidlo Vpravo" #: src/settings_translation_file.cpp -msgid "Step mountain size noise" -msgstr "" +msgid "River channel depth" +msgstr "Hĺbka riečneho kanála" #: src/settings_translation_file.cpp -msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgid "River channel width" +msgstr "Šírka kanála rieky" + +#: src/settings_translation_file.cpp +msgid "River depth" +msgstr "Hĺbka rieky" #: src/settings_translation_file.cpp msgid "River noise" -msgstr "" +msgstr "Šum riek" #: src/settings_translation_file.cpp -msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgid "River size" +msgstr "Veľkosť riek" #: src/settings_translation_file.cpp -msgid "Mountain variation noise" -msgstr "" +msgid "River valley width" +msgstr "Šírka údolia rieky" #: src/settings_translation_file.cpp -msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." -msgstr "" +msgid "Rollback recording" +msgstr "Nahrávanie pre obnovenie" #: src/settings_translation_file.cpp -msgid "Mapgen Flat" -msgstr "" +msgid "Rolling hill size noise" +msgstr "Veľkosť šumu vlnitosti kopcov" #: src/settings_translation_file.cpp -msgid "Mapgen Flat specific flags" -msgstr "" +msgid "Rolling hills spread noise" +msgstr "Rozptyl šumu vlnitosti kopcov" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "Okrúhla minimapa" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "Bezpečné kopanie a ukladanie" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "Pieskové pláže sa objavia keď np_beach presiahne túto hodnotu." + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "Ulož mapu získanú klientom na disk." + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "Automaticky ulož veľkosť okna po úprave." + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "Ukladanie mapy získanej zo servera" #: 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." +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." msgstr "" +"Zmeň mierku užívateľského rozhrania (GUI) podľa zadanej hodnoty.\n" +"Pre zmenu mierky GUI použi antialias filter podľa-najbližšieho-suseda.\n" +"Toto zjemní niektoré hrubé hrany a zmieša pixely pri zmenšení,\n" +"za cenu rozmazania niektorých okrajových pixelov ak sa mierka\n" +"obrázkov mení podľa neceločíselných hodnôt." #: src/settings_translation_file.cpp -msgid "Ground level" -msgstr "" +msgid "Screen" +msgstr "Zobrazenie" #: src/settings_translation_file.cpp -msgid "Y of flat ground." -msgstr "" +msgid "Screen height" +msgstr "Výška obrazovky" #: src/settings_translation_file.cpp -msgid "Lake threshold" -msgstr "" +msgid "Screen width" +msgstr "Šírka obrazovky" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "Adresár pre snímky obrazovky" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "Formát snímok obrazovky" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "Kvalita snímok obrazovky" #: src/settings_translation_file.cpp msgid "" -"Terrain noise threshold for lakes.\n" -"Controls proportion of world area covered by lakes.\n" -"Adjust towards 0.0 for a larger proportion." +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." msgstr "" +"Kvalita snímok obrazovky. Používa sa len pre JPEG formát.\n" +"1 znamená najhoršiu kvalitu; 100 znamená najlepšiu kvalitu.\n" +"Použi 0 pre štandardnú kvalitu." #: src/settings_translation_file.cpp -msgid "Lake steepness" -msgstr "" +msgid "Screenshots" +msgstr "Fotky obrazovky" #: src/settings_translation_file.cpp -msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgid "Seabed noise" +msgstr "Šum morského dna" #: src/settings_translation_file.cpp -msgid "Hill threshold" -msgstr "" +msgid "Second of 4 2D noises that together define hill/mountain range height." +msgstr "Druhý zo 4 2D šumov, ktoré spolu definujú rozsah výšok kopcov/hôr." #: src/settings_translation_file.cpp -msgid "" -"Terrain noise threshold for hills.\n" -"Controls proportion of world area covered by hills.\n" -"Adjust towards 0.0 for a larger proportion." -msgstr "" +msgid "Second of two 3D noises that together define tunnels." +msgstr "Druhý z dvoch 3D šumov, ktoré spolu definujú tunely." #: src/settings_translation_file.cpp -msgid "Hill steepness" -msgstr "" +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "Viď. https://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp -msgid "Controls steepness/height of hills." -msgstr "" +msgid "Selection box border color (R,G,B)." +msgstr "Farba obrysu bloku (R,G,B)." #: src/settings_translation_file.cpp -msgid "Terrain noise" -msgstr "" +msgid "Selection box color" +msgstr "Farba obrysu bloku" #: src/settings_translation_file.cpp -msgid "Defines location and terrain of optional hills and lakes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Fractal" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Fractal specific flags" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Map generation attributes specific to Mapgen Fractal.\n" -"'terrain' enables the generation of non-fractal terrain:\n" -"ocean, islands and underground." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fractal type" -msgstr "" +msgid "Selection box width" +msgstr "Šírka obrysu bloku" #: src/settings_translation_file.cpp msgid "" @@ -6034,220 +6544,236 @@ msgid "" "17 = 4D \"Mandelbulb\" Mandelbrot set.\n" "18 = 4D \"Mandelbulb\" Julia set." msgstr "" +"Zvoľ si jeden z 18 typov fraktálu.\n" +"1 = 4D \"Roundy\" sada Mandelbrot.\n" +"2 = 4D \"Roundy\" sada Julia.\n" +"3 = 4D \"Squarry\" sada Mandelbrot.\n" +"4 = 4D \"Squarry\" sada Julia.\n" +"5 = 4D \"Mandy Cousin\" sada Mandelbrot.\n" +"6 = 4D \"Mandy Cousin\" sada Julia.\n" +"7 = 4D \"Variation\" sada Mandelbrot.\n" +"8 = 4D \"Variation\" sada Julia.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" sada Mandelbrot.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" sada Julia.\n" +"11 = 3D \"Christmas Tree\" sada Mandelbrot.\n" +"12 = 3D \"Christmas Tree\" sada Julia.\n" +"13 = 3D \"Mandelbulb\" sada Mandelbrot.\n" +"14 = 3D \"Mandelbulb\" sada Julia.\n" +"15 = 3D \"Cosine Mandelbulb\" sada Mandelbrot.\n" +"16 = 3D \"Cosine Mandelbulb\" sada Julia.\n" +"17 = 4D \"Mandelbulb\" sada Mandelbrot.\n" +"18 = 4D \"Mandelbulb\" sada Julia." #: src/settings_translation_file.cpp -msgid "Iterations" -msgstr "" +msgid "Server" +msgstr "Server" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "Hra na serveri" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "Bezpečnosť servera" + +#: src/settings_translation_file.cpp +msgid "Server URL" +msgstr "URL servera" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "Adresa servera" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "Popis servera" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "Meno servera" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "Port servera" + +#: src/settings_translation_file.cpp +msgid "Server side occlusion culling" +msgstr "Occlusion culling na strane servera" + +#: src/settings_translation_file.cpp +msgid "Server/Env Performance" +msgstr "Výkon servera/prostredia" + +#: src/settings_translation_file.cpp +msgid "Serverlist URL" +msgstr "URL zoznamu serverov" + +#: src/settings_translation_file.cpp +msgid "Serverlist and MOTD" +msgstr "Zoznam serverov a hláška dňa" + +#: src/settings_translation_file.cpp +msgid "Serverlist file" +msgstr "Súbor so zoznamom serverov" #: src/settings_translation_file.cpp msgid "" -"Iterations of the recursive function.\n" -"Increasing this increases the amount of fine detail, but also\n" -"increases processing load.\n" -"At iterations = 20 this mapgen has a similar load to mapgen V7." +"Set the language. Leave empty to use the system language.\n" +"A restart is required after changing this." msgstr "" +"Nastav jazyk. Ponechaj prázdne pre systémové nastavenie.\n" +"Po zmene je požadovaný reštart." #: src/settings_translation_file.cpp msgid "" -"(X,Y,Z) scale of fractal in nodes.\n" -"Actual fractal size will be 2 to 3 times larger.\n" -"These numbers can be made very large, the fractal does\n" -"not have to fit inside the world.\n" -"Increase these to 'zoom' into the detail of the fractal.\n" -"Default is for a vertically-squashed shape suitable for\n" -"an island, set all 3 numbers equal for the raw shape." -msgstr "" +"Set the maximum length of a chat message (in characters) sent by clients." +msgstr "Nastav maximálny počet znakov komunikačnej správy posielanej klientmi." #: src/settings_translation_file.cpp msgid "" -"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" -"Can be used to move a desired point to (0, 0) to create a\n" -"suitable spawn point, or to allow 'zooming in' on a desired\n" -"point by increasing 'scale'.\n" -"The default is tuned for a suitable spawn point for Mandelbrot\n" -"sets with default parameters, it may need altering in other\n" -"situations.\n" -"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Slice w" +"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 "" +"Nastav gammu tieňov.\n" +"Vylaď intenzitu dynamických tieňov v hre.\n" +"Nižšia hodnota znamená svetlejšie tiene, vyššia hodnota znamená tmavšie " +"tiene." #: src/settings_translation_file.cpp msgid "" -"W coordinate of the generated 3D slice of a 4D fractal.\n" -"Determines which 3D slice of the 4D shape is generated.\n" -"Alters the shape of the fractal.\n" -"Has no effect on 3D fractals.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia x" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" msgstr "" +"Nastav dosah mäkkých tieňov.\n" +"Nižšia hodnota znamená ostrejšie a vyššia jemnejšie tiene.\n" +"Minimálna hodnota: 1.0; Maximálna hodnota: 15.0" #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"X component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia y" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" msgstr "" +"Nastav sklon orbity slnka/mesiaca v stupňoch\n" +"Hodnota 0 znamená bez vertikálneho sklonu orbity.\n" +"Minimálna hodnota: 0.0; max. hodnota: 60.0" #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"Y component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia z" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" +"Nastav true pre povolenie mapovania tieňov.\n" +"Požaduje aby boli aktivované shadery." #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"Z component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Julia w" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." msgstr "" +"Nastav true pre povolenie vlniacich sa listov.\n" +"Požaduje aby boli aktivované shadery." #: src/settings_translation_file.cpp msgid "" -"Julia set only.\n" -"W component of hypercomplex constant.\n" -"Alters the shape of the fractal.\n" -"Has no effect on 3D fractals.\n" -"Range roughly -2 to 2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Seabed noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Y-level of seabed." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen Valleys specific flags" +"Set to true to enable waving liquids (like water).\n" +"Requires shaders to be enabled." msgstr "" +"Nastav true pre aktivovanie vlniacich sa tekutín (ako napr. voda).\n" +"Požaduje aby boli aktivované shadery." #: src/settings_translation_file.cpp msgid "" -"Map generation attributes specific to Mapgen Valleys.\n" -"'altitude_chill': Reduces heat with altitude.\n" -"'humid_rivers': Increases humidity around rivers.\n" -"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" -"to become shallower and occasionally dry.\n" -"'altitude_dry': Reduces humidity with altitude." +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." msgstr "" +"Nastav true pre aktivovanie vlniacich sa rastlín.\n" +"Požaduje aby boli aktivované shadery." #: src/settings_translation_file.cpp msgid "" -"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" -"enabled. Also the vertical distance over which humidity drops by 10 if\n" -"'altitude_dry' is enabled." +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." msgstr "" +"Nastav kvalitu textúr tieňov na 32 bitov.\n" +"Ak je false, použijú sa 16 bitové textúry.\n" +"Toto môže spôsobiť v tieňoch viac artefaktov." #: src/settings_translation_file.cpp -msgid "Depth below which you'll find large caves." -msgstr "" +msgid "Shader path" +msgstr "Cesta k shaderom" #: src/settings_translation_file.cpp -msgid "Cavern upper limit" +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"cards.\n" +"This only works with the OpenGL video backend." msgstr "" +"Shadery umožňujú pokročilé vizuálne efekty a na niektorých grafických " +"kartách\n" +"môžu zvýšiť výkon.\n" +"Toto funguje len s OpenGL." #: src/settings_translation_file.cpp -msgid "Depth below which you'll find giant caverns." -msgstr "" +msgid "Shadow filter quality" +msgstr "Kvalita filtra pre tiene" #: src/settings_translation_file.cpp -msgid "River depth" +msgid "Shadow map max distance in nodes to render shadows" msgstr "" +"Maximálna vzdialenosť v kockách, pre mapu tieňov na renderovanie tieňov" #: src/settings_translation_file.cpp -msgid "How deep to make rivers." -msgstr "" +msgid "Shadow map texture in 32 bits" +msgstr "32 bitové textúry pre mapovanie tieňov" #: src/settings_translation_file.cpp -msgid "River size" -msgstr "" +msgid "Shadow map texture size" +msgstr "Veľkosť textúry pre mapovanie tieňov" #: src/settings_translation_file.cpp -msgid "How wide to make rivers." +msgid "" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." msgstr "" +"Posun tieňa (v pixeloch) štandardného písma. Ak je 0, tak tieň nebude " +"vykreslený." #: src/settings_translation_file.cpp -msgid "Cave noise #1" -msgstr "" +msgid "Shadow strength gamma" +msgstr "Úroveň gamma tieňov" #: src/settings_translation_file.cpp -msgid "Cave noise #2" -msgstr "" +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "Tvar minimapy. Aktivované = okrúhla, vypnuté = štvorcová." #: src/settings_translation_file.cpp -msgid "Filler depth" -msgstr "" +msgid "Show debug info" +msgstr "Zobraz ladiace informácie" #: src/settings_translation_file.cpp -msgid "The depth of dirt or other biome filler node." -msgstr "" +msgid "Show entity selection boxes" +msgstr "Zobraz obrys bytosti" #: src/settings_translation_file.cpp -msgid "Terrain height" +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." msgstr "" +"Zobraz obrysy bytosti\n" +"Po zmene je požadovaný reštart." #: src/settings_translation_file.cpp -msgid "Base terrain height." -msgstr "" +msgid "Show name tag backgrounds by default" +msgstr "Štandardne zobraz menovku pozadia" #: src/settings_translation_file.cpp -msgid "Valley depth" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Raises terrain to make valleys around the rivers." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley fill" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Slope and fill work together to modify the heights." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley profile" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Amplifies the valleys." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Valley slope" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Chunk size" -msgstr "" +msgid "Shutdown message" +msgstr "Správa pri vypínaní" #: src/settings_translation_file.cpp msgid "" @@ -6258,84 +6784,1368 @@ msgid "" "Altering this value is for special usage, leaving it unchanged is\n" "recommended." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Mapgen debug" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Dump the mapgen debug information." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Absolute limit of queued blocks to emerge" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Maximum number of blocks that can be queued for loading." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Per-player limit of queued blocks load from disk" -msgstr "" +"Veľkosť časti mapy generovanej generátorom mapy, zadaný v blokoch mapy (16 " +"kociek).\n" +"VAROVANIE!: Neexistuje žiadna výhoda, a je tu pár rizík,\n" +"pri zvýšení tejto hodnoty nad 5.\n" +"Zníženie tejto hodnoty zvýši hustotu jaskýň a kobiek.\n" +"Zmena tejto hodnoty slúži k špeciálnym účelom, odporúča sa ponechať\n" +"to nezmenené." #: 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." +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." msgstr "" +"Veľkosť medzipamäte blokov v Mesh generátori.\n" +"Zvýšenie zvýši využitie medzipamäte %, zníži sa množstvo dát kopírovaných\n" +"z hlavnej vetvy a tým sa zníži chvenie." #: src/settings_translation_file.cpp -msgid "Per-player limit of queued blocks to generate" -msgstr "" +msgid "Sky Body Orbit Tilt" +msgstr "Sklon orbity na oblohe" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "Plátok w" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights." +msgstr "Sklon a výplň spolupracujú aby upravili výšky." + +#: src/settings_translation_file.cpp +msgid "Small cave maximum number" +msgstr "Maximálny počet malých jaskýň" + +#: src/settings_translation_file.cpp +msgid "Small cave minimum number" +msgstr "Minimálny počet malých jaskýň" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "Drobné odchýlky vlhkosti pre zjemnenie prechodu na hraniciach biómov." + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "Drobné odchýlky teplôt pre zjemnenie prechodu na hraniciach biómov." + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "Jemné osvetlenie" #: 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." +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." msgstr "" +"Zjemňuje pohyb kamery pri pohľade po okolí. Tiež sa nazýva zjemnenie " +"pohľady, alebo pohybu myši.\n" +"Užitočné pri nahrávaní videí." #: src/settings_translation_file.cpp -msgid "Number of emerge threads" -msgstr "" +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "Zjemní rotáciu kamery vo filmovom režime. 0 je pre vypnuté." + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "Zjemní rotáciu kamery. 0 je pre vypnuté." + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "Tlačidlo zakrádania sa" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "Rýchlosť zakrádania" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "Rýchlosť zakrádania sa, v kockách za sekundu." + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Dosah mäkkých tieňov" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "Zvuk" #: src/settings_translation_file.cpp msgid "" -"Number of emerge threads to use.\n" -"Value 0:\n" -"- Automatic selection. The number of emerge threads will be\n" -"- 'number of processors - 2', with a lower limit of 1.\n" -"Any other value:\n" -"- Specifies the number of emerge threads, with a lower limit of 1.\n" -"WARNING: Increasing the number of emerge threads increases engine mapgen\n" -"speed, but this may harm game performance by interfering with other\n" -"processes, especially in singleplayer and/or when running Lua code in\n" -"'on_generated'. For many users the optimum setting may be '1'." +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." msgstr "" +"Špecifikuje URL s ktorého klient stiahne média namiesto použitia UDP.\n" +"$filename by mal byt dostupný z $remote_media$filename cez cURL\n" +"(samozrejme, remote_media by mal končiť lomítkom).\n" +"Súbory, ktoré nie sú dostupné budú získané štandardným spôsobom." #: src/settings_translation_file.cpp -msgid "Online Content Repository" +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 "" +"Definuje štandardnú veľkosť kôpky kociek, vecí a nástrojov.\n" +"Ber v úvahu, že rozšírenia, alebo hry môžu explicitne nastaviť veľkosť pre " +"určité (alebo všetky) typy." #: src/settings_translation_file.cpp -msgid "ContentDB URL" +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" msgstr "" +"Rozptýľ celkovú aktualizáciu mapy tieňov cez zadané množstvo snímok.\n" +"Vyššie hodnoty môžu spôsobiť trhanie tieňov, nižšie hodnoty\n" +"spotrebujú viac zdrojov.\n" +"Minimálna hodnota: 1; maximálna hodnota: 16" + +#: src/settings_translation_file.cpp +msgid "" +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" +"Rozptyl zosilnenia svetelnej krivky.\n" +"Určuje šírku rozsahu , ktorý bude zosilnený.\n" +"Štandardné gausovo rozdelenie odchýlky svetelnej krivky." + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "Pevný bod obnovy" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "Šum zrázov" + +#: src/settings_translation_file.cpp +msgid "Step mountain size noise" +msgstr "Veľkosť šumu horských stepí" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "Rozptyl šumu horských stepí" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "Stupeň paralaxy 3D režimu." + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" +"Sila zosilnenia svetelnej krivky.\n" +"Tri 'zosilňujúce' parametre definujú ktorý rozsah\n" +"svetelnej krivky je zosilnený v jasu." + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "Prísna kontrola protokolu" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "Odstráň farby" + +#: src/settings_translation_file.cpp +msgid "" +"Surface level of optional water placed on a solid floatland layer.\n" +"Water is disabled by default and will only be placed if this value is set\n" +"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" +"upper tapering).\n" +"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" +"When enabling water placement the floatlands must be configured and tested\n" +"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" +"required value depending on 'mgv7_np_floatland'), to avoid\n" +"server-intensive extreme water flow and to avoid vast flooding of the\n" +"world surface below." +msgstr "" +"Povrchová úroveň voliteľnej vody umiestnená na pevnej vrstve lietajúcej " +"krajiny.\n" +"Štandardne je voda deaktivovaná a bude umiestnená len ak je táto voľba " +"nastavená\n" +"nad 'mgv7_floatland_ymax' - 'mgv7_floatland_taper'\n" +"(štart horného zašpicaťovania).\n" +"***VAROVANIE, POTENCIÁLNE RIZIKO PRE VÝKON SVETOV A SERVEROV***:\n" +"Pri aktivovaní vody na lietajúcich pevninách musí byť nastavený\n" +"a otestovaný pevný povrch nastavením 'mgv7_floatland_density' na 2.0 ( alebo " +"inú\n" +"požadovanú hodnotu v závislosti na 'mgv7_np_floatland'), aby sa zabránilo\n" +"pre server náročnému extrémnemu toku vody a rozsiahlym záplavám\n" +"na svet pod nimi." + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "Synchrónne SQLite" + +#: src/settings_translation_file.cpp +msgid "Temperature variation for biomes." +msgstr "Odchýlky teplôt pre biómy." + +#: src/settings_translation_file.cpp +msgid "Temporary Settings" +msgstr "Dočasné nastavenia" + +#: src/settings_translation_file.cpp +msgid "Terrain alternative noise" +msgstr "Alternatívny šum terénu" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "Základný šum terénu" + +#: src/settings_translation_file.cpp +msgid "Terrain height" +msgstr "Výška terénu" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "Horný šum terénu" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "Šum terénu" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" +"Prah šumu terénu pre kopce.\n" +"Riadi pomer plochy sveta pokrytého kopcami.\n" +"Uprav smerom k 0.0 pre väčší pomer." + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" +"Prah šumu terénu pre jazerá.\n" +"Riadi pomer plochy sveta pokrytého jazerami.\n" +"Uprav smerom k 0.0 pre väčší pomer." + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "Stálosť šumu terénu" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "Cesta k textúram" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Veľkosť textúry pre renderovanie mapy tieňov.\n" +"Toto musí byť mocnina dvoch.\n" +"Väčšie čísla vytvoria lepšie tiene, ale sú aj náročnejšie." + +#: src/settings_translation_file.cpp +msgid "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." +msgstr "" +"Textúry na kocke môžu byť zarovnané buď podľa kocky, alebo sveta.\n" +"Kým prvý režim poslúži lepšie veciam ako sú stroje, nábytok, atď.,\n" +"tak s druhým režimom zapadnú schody a mikrobloky lepšie do svojho okolia.\n" +"Keďže je táto možnosť nová, nemusí byť použitá na starších serveroch,\n" +"toto nastavenie povolí jeho vynútenie pre určité typy kociek. Je potrebné\n" +"si uvedomiť, že táto funkcia je EXPERIMENTÁLNA a nemusí fungovať korektne." #: src/settings_translation_file.cpp msgid "The URL for the content repository" -msgstr "" +msgstr "Webová adresa (URL) k úložisku doplnkov" #: src/settings_translation_file.cpp -msgid "ContentDB Flag Blacklist" -msgstr "" +msgid "The dead zone of the joystick" +msgstr "Mŕtva zóna joysticku" #: src/settings_translation_file.cpp msgid "" -"Comma-separated list of flags to hide in the content repository.\n" -"\"nonfree\" can be used to hide packages which do not qualify as 'free " -"software',\n" -"as defined by the Free Software Foundation.\n" -"You can also specify content ratings.\n" -"These flags are independent from Minetest versions,\n" -"so see a full list at https://content.minetest.net/help/content_flags/" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." msgstr "" +"Štandardný formát v ktorom sa ukladajú profily,\n" +"pri volaní `/profiler save [format]` bez udania formátu." + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other biome filler node." +msgstr "Hĺbka zeminy, alebo inej výplne kocky." + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" +"Relatívna cesta k súboru vzhľadom na svet z ktorého budú profily uložené." + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "Identifikátor joysticku na použitie" + +#: src/settings_translation_file.cpp +msgid "The length in pixels it takes for touch screen interaction to start." +msgstr "" +"Dĺžka v pixloch, ktorú potrebuje dotyková obrazovka pre začiatok interakcie." + +#: src/settings_translation_file.cpp +msgid "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"Default is 1.0 (1/2 node).\n" +"Requires waving liquids to be enabled." +msgstr "" +"Maximálna výška povrchu vlniacich sa tekutín.\n" +"4.0 = Výška vlny sú dve kocky.\n" +"0.0 = Vlna sa vôbec nehýbe.\n" +"Štandardná hodnota je 1.0 (1/2 kocky).\n" +"Požaduje, aby boli aktivované vlniace sa tekutiny." + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "Sieťové rozhranie, na ktorom server načúva." + +#: 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 "" +"Oprávnenia, ktoré automaticky dostane nový hráč.\n" +"Pozri si /privs v hre pre kompletný zoznam pre daný server a konfigurácie " +"rozšírení." + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" +"Polomer objemu blokov okolo každého hráča, ktoré sú predmetom\n" +"záležitostí okolo aktívnych objektov, uvádzané v blokoch mapy (16 kociek).\n" +"V objektoch aktívnych blokov sú nahrávané a spúšťané ABM.\n" +"Toto je tiež minimálna vzdialenosť v ktorej sú aktívne objekty (mobovia) " +"zachovávaný.\n" +"Malo by to byť konfigurované spolu s active_object_send_range_blocks." + +#: src/settings_translation_file.cpp +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" +"Renderovací back-end.\n" +"Po zmene je vyžadovaný reštart.\n" +"Poznámka: Na Androide, ak si nie si istý, ponechaj OGLES1! Aplikácia by " +"nemusela naštartovať.\n" +"Na iných platformách, sa odporúča OpenGL.\n" +"Shadery sú podporované v OpenGL (len pre desktop) a v OGLES2 (experimentálne)" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" +"Citlivosť osí joysticku pre pohyb\n" +"otáčania pohľadu v hre." + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" +"Úroveň tieňovania ambient-occlusion kocky (tmavosť).\n" +"Nižšia hodnota je tmavšie, vyššia svetlejšie.\n" +"Platý rozsah hodnôt je od 0.25 po 0.4 vrátane.\n" +"Ak je hodnota mimo rozsah, bude nastavená na najbližšiu platnú hodnotu." + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" +"Čas (c sekundách) kedy fronta tekutín môže narastať nad kapacitu\n" +"spracovania než bude urobený pokus o jej zníženie zrušením starých\n" +"vecí z fronty. Hodnota 0 vypne túto funkciu." + +#: 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 "" +"Vyhradená doba pre ABM na vykonanie v každom kroku\n" +"(ako zlomok ABM imtervalu)" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" +"Čas v sekundách medzi opakovanými udalosťami\n" +"pri stlačenej kombinácií tlačidiel na joysticku." + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" +"Čas v sekundách pre opakované položenie kocky\n" +"ak je držané tlačítko pokladania." + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "Typ joysticku" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" +"Vertikálna vzdialenosť kedy poklesne teplota o 20 ak je 'altitude_chill'\n" +"aktívne. Tiež je to vertikálna vzdialenosť kedy poklesne vlhkosť o 10,\n" +"ak je 'altitude_dry' aktívne." + +#: src/settings_translation_file.cpp +msgid "Third of 4 2D noises that together define hill/mountain range height." +msgstr "Tretí zo 4 2D šumov, ktoré spolu definujú rozsah výšok kopcov/hôr." + +#: 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 "" +"Čas existencie odložený (odhodených) vecí v sekundách.\n" +"Nastavené na -1 vypne túto vlastnosť." + +#: src/settings_translation_file.cpp +msgid "Time of day when a new world is started, in millihours (0-23999)." +msgstr "Čas pri spustení nového sveta, v milihodinách (0-23999)." + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "Interval posielania času" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "Rýchlosť času" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" +"Časový limit klienta, pre odstránenie nepoužívaných mapových dát z pamäte, v " +"sekundách." + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" +"Pre zníženie lagu, prenos blokov je spomalený, keď hráč niečo stavia.\n" +"Toto určuje ako dlho je spomalený po vložení, alebo zmazaní kocky." + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "Tlačidlo Prepnutie režimu zobrazenia" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "Oneskorenie popisku" + +#: src/settings_translation_file.cpp +msgid "Touch screen threshold" +msgstr "Prah citlivosti dotykovej obrazovky" + +#: src/settings_translation_file.cpp +msgid "Touchscreen" +msgstr "Dotyková obrazovka" + +#: src/settings_translation_file.cpp +msgid "Tradeoffs for performance" +msgstr "Kompromisy za výkon" + +#: src/settings_translation_file.cpp +msgid "Transparency Sorting Distance" +msgstr "Vzdialenosť spracovania priehľadnosti" + +#: src/settings_translation_file.cpp +msgid "Trees noise" +msgstr "Šum stromov" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "Trilineárne filtrovanie" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" +"Pravda = 256\n" +"Nepravda = 128\n" +"Užitočné pre plynulejšiu minimapu na pomalších strojoch." + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "Dôveryhodné rozšírenia" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" +"Adresa (URL) k zoznamu serverov, ktorý sa zobrazuje v záložke Multiplayer." + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "Podvzorkovanie" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" +"Podvzorkovanie je podobné ako použiť obrazovku s nižším rozlíšením, ale\n" +"aplikuje sa len na samotný svet, pričom GUI ostáva nezmenené.\n" +"Malo by poskytnúť výrazné zvýšenie výkonu za cenu nižších detailov obrazu.\n" +"Vyššie hodnotu vedú k menej detailnému obrazu." + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "Neobmedzená vzdialenosť zobrazenia hráča" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "Uvoľni nepoužívané serverové dáta" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "Horný Y limit kobiek." + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "Horný Y limit lietajúcich pevnín." + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "Použi 3D mraky namiesto plochých." + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "Použi animáciu mrakov pre pozadie hlavného menu." + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "Použi anisotropné filtrovanie pri pohľade na textúry zo strany." + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "Použi bilineárne filtrovanie pri zmene mierky textúr." + +#: src/settings_translation_file.cpp +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 "" +"Použi mip mapy pre zmenu veľkosti textúr. Môže jemne zvýšiť výkon,\n" +"obzvlášť pri použití balíčka textúr s vysokým rozlíšením.\n" +"Gama korektné podvzorkovanie nie je podporované." + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Použi multi-sample antialiasing (MSAA) pre zjemnenie hrán blokov.\n" +"Tento algoritmus zjemní 3D vzhľad zatiaľ čo zachová ostrosť obrazu,\n" +"ale neovplyvní vnútro textúr\n" +"(čo je obzvlášť viditeľné pri priesvitných textúrach).\n" +"Ak sú shadery zakázané, objavia sa viditeľné medzery medzi kockami.\n" +"Ak sú nastavené na 0, MSAA je zakázané.\n" +"Po zmene tohto nastavenia je požadovaný reštart." + +#: src/settings_translation_file.cpp +msgid "Use trilinear filtering when scaling textures." +msgstr "Použi trilineárne filtrovanie pri zmene mierky textúr." + +#: src/settings_translation_file.cpp +msgid "User Interfaces" +msgstr "Užívateľské rozhranie" + +#: src/settings_translation_file.cpp +msgid "VBO" +msgstr "VBO" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "VSync" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "Hĺbka údolia" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "Výplň údolí" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "Profil údolia" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "Sklon údolia" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "Odchýlka hĺbky výplne biómu." + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "Obmieňa maximálnu výšku hôr (v kockách)." + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "Rôznosť počtu jaskýň." + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" +"Rozptyl vertikálnej mierky terénu.\n" +"Ak je šum <-0.55, terén je takmer rovný." + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "Pozmeňuje hĺbku povrchových kociek biómu." + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" +"Mení rôznorodosť terénu.\n" +"Definuje hodnotu 'stálosti' pre terrain_base a terrain_alt noises." + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "Pozmeňuje strmosť útesov." + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "Vertikálna rýchlosť šplhania, v kockách za sekundu." + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "Vertikálna synchronizácia obrazovky." + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "Grafický ovládač" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "Faktor pohupovania sa" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "Vzdialenosť dohľadu v kockách." + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "Tlačidlo Zníž dohľad" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "Tlačidlo Zvýš dohľad" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "Tlačidlo Priblíženie pohľadu" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "Vzdialenosť dohľadu" + +#: src/settings_translation_file.cpp +msgid "Virtual joystick triggers Aux1 button" +msgstr "Virtuálny joystick aktivuje tlačidlo Aux1" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "Hlasitosť" + +#: src/settings_translation_file.cpp +msgid "" +"Volume of all sounds.\n" +"Requires the sound system to be enabled." +msgstr "" +"Hlasitosť všetkých zvukov.\n" +"Požaduje aby bol zvukový systém aktivovaný." + +#: src/settings_translation_file.cpp +msgid "" +"W coordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" +"W koordináty generovaného 3D plátku v 4D fraktáli.\n" +"Určuje, ktorý 3D plátok z 4D tvaru je generovaný.\n" +"Zmení tvar fraktálu.\n" +"Nemá vplyv na 3D fraktály.\n" +"Rozsah zhruba -2 až 2." + +#: src/settings_translation_file.cpp +msgid "Walking and flying speed, in nodes per second." +msgstr "Rýchlosť chôdze a lietania, v kockách za sekundu." + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "Rýchlosť chôdze" + +#: src/settings_translation_file.cpp +msgid "Walking, flying and climbing speed in fast mode, in nodes per second." +msgstr "" +"Rýchlosť chôdze, lietania a šplhania v rýchlom režime, v kockách za sekundu." + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "Úroveň vody" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "Hladina povrchovej vody vo svete." + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "Vlniace sa kocky" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "Vlniace sa listy" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "Vlniace sa tekutiny" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "Výška vlnenia sa tekutín" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "Rýchlosť vlny tekutín" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "Vlnová dĺžka vlniacich sa tekutín" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "Vlniace sa rastliny" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Farba webového odkazu" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" +"Ake je gui_scaling_filter povolený, všetky GUI obrázky potrebujú byť\n" +"filtrované softvérom, ale niektoré obrázky sú generované priamo\n" +"pre hardvér (napr. render-to-texture pre kocky v inventári)." + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" +"Ake je gui_scaling_filter_txr2img povolený, nakopíruj tieto obrázky\n" +"z hardvéru do softvéru pre zmenu mierky. Ak za vypnutý, vráť sa\n" +"k starej metóde zmeny mierky, pre grafické ovládače, ktoré dostatočne\n" +"nepodporujú sťahovanie textúr z hardvéru." + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"This is also used as the base node texture size for world-aligned\n" +"texture autoscaling." +msgstr "" +"Pri použití bilineárneho/trilineárneho/anisotropného filtra, textúry s " +"nízkym\n" +"rozlíšením môžu byť rozmazané, tak sa automaticky upravia interpoláciou\n" +"s najbližším susedom aby bola zachovaná ostrosť pixelov.\n" +"Toto nastaví minimálnu veľkosť pre upravenú textúru;\n" +"vyššia hodnota znamená ostrejší vzhľad, ale potrebuje viac pamäti.\n" +"Odporúčané sú mocniny 2. Nastavenie sa aplikuje len ak je použité bilineárne/" +"trilineárne/anisotropné filtrovanie.\n" +"Toto sa tiež používa ako základná veľkosť textúry kociek pre\n" +"\"world-aligned autoscaling\" textúr." + +#: src/settings_translation_file.cpp +msgid "" +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" +"Či sa má štandardne zobraziť menovka pozadia.\n" +"Rozšírenia stále môžu pozadie nastaviť." + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "Či sa nemá animácia textúry kocky synchronizovať." + +#: 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 "" +"Či sa hráči zobrazia klientom bez obmedzenia vzdialenosti.\n" +"Zastarané, namiesto tohto použi player_transfer_distance." + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "Či sa môžu hráči navzájom poškodzovať a zabiť." + +#: 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 "" +"Či ná ponúknuť klientom obnovenie spojenia po páde (Lua).\n" +"Povoľ, ak je tvoj server nastavený na automatický reštart." + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "Či zamlžiť okraj viditeľnej oblasti." + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." +msgstr "" +"Vypnutie zvukov. Zapnúť zvuky môžeš kedykoľvek, pokiaľ\n" +"nie je zakázaný zvukový systém (enable_sound=false).\n" +"V hre môžeš zapnúť/vypnúť zvuk tlačidlom pre stíšenie zvuku, alebo\n" +"pozastavením hry." + +#: 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 "" +"Zobrazovanie technických názvov.\n" +"Ovplyvní rozšírenia a balíčky textúr v Doplnkoch a pri výbere rozšírení, ako " +"aj\n" +"názvy nastavení v menu všetkých nastavení.\n" +"Nastavuje sa zaškrtávacím políčkom v menu \"Všetky nastavenia\"." + +#: src/settings_translation_file.cpp +msgid "" +"Whether to show the client debug info (has the same effect as hitting F5)." +msgstr "Zobrazenie ladiaceho okna na klientovi (má rovnaký efekt ako F5)." + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "Šírka okna po spustení. Ignorované v móde celej obrazovky." + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "Šírka línií obrysu kocky." + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" +"Len pre systémy s Windows: Spusti Minetest s oknom príkazovej riadky na " +"pozadí.\n" +"Obsahuje tie isté informácie ako súbor debug.txt (štandardný názov)." + +#: 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 "" +"Adresár sveta (všetko na svete je uložené tu).\n" +"Nie je potrebné ak sa spúšťa z hlavného menu." + +#: src/settings_translation_file.cpp +msgid "World start time" +msgstr "Počiatočný čas sveta" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" +"Textúry zarovnané podľa sveta môžu byť zväčšené aby pokryli niekoľko " +"kociek.\n" +"Avšak server nemusí poslať mierku akú potrebuješ, obzvlášť ak používaš\n" +"špeciálne dizajnovaný balíček textúr; s týmto nastavením, sa klient pokúsi\n" +"určiť mierku automaticky na základe veľkosti textúry.\n" +"Viď. tiež texture_min_size.\n" +"Varovanie: Toto nastavenie je EXPERIMENTÁLNE!" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "Režim zarovnaných textúr podľa sveta" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "Y plochej zeme." + +#: src/settings_translation_file.cpp +msgid "" +"Y of mountain density gradient zero level. Used to shift mountains " +"vertically." +msgstr "" +"Y hustotný gradient hladiny nula pre hory. Používa sa pre vertikálny posun " +"hôr." + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large caves." +msgstr "Horný Y limit veľkých jaskýň." + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "Y-nová vzdialenosť nad ktorou dutiny expandujú do plnej veľkosti." + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "" +"Y-vzdialenosť kde sa lietajúce pevniny zužujú od plnej hustoty po nič.\n" +"Zužovanie začína na tejto vzdialenosti z Y limitu.\n" +"Pre jednoznačnosť vrstvy lietajúcej krajiny, toto riadi výšku kopcov/hôr.\n" +"Musí byť menej ako, alebo rovnako ako polovica vzdialenosti medzi Y limitami." + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "Y-úroveň priemeru povrchu terénu." + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "Y-úroveň horného limitu dutín." + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "Y-úroveň horného terénu, ktorý tvorí útesy/skaly." + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +msgstr "Y-úroveň dolnej časti terénu a morského dna." + +#: src/settings_translation_file.cpp +msgid "Y-level of seabed." +msgstr "Y-úroveň morského dna." + +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "cURL" + +#: src/settings_translation_file.cpp +msgid "cURL file download timeout" +msgstr "cURL časový rámec sťahovania súborov" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "Časový rámec interakcie cURL" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "Paralelný limit cURL" + +#~ msgid "- Creative Mode: " +#~ msgstr "- Kreatívny mód: " + +#~ msgid "- Damage: " +#~ msgstr "- Poškodenie: " + +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." +#~ msgstr "" +#~ "0 = parallax occlusion s informácia o sklone (rýchlejšie).\n" +#~ "1 = mapovanie reliéfu (pomalšie, presnejšie)." + +#~ msgid "Address / Port" +#~ msgstr "Adresa / Port" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Si si istý, že chceš vynulovať svoj svet jedného hráča?" + +#~ msgid "Basic" +#~ msgstr "Základné" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Počet bitov na pixel (farebná hĺbka) v režime celej obrazovky." + +#~ msgid "Bump Mapping" +#~ msgstr "Bump Mapping (Ilúzia nerovnosti)" + +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmapping" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Zmení užívateľské rozhranie (UI) hlavného menu:\n" +#~ "- Plné: Viacero svetov, voľby hry, voľba balíčka textúr, atď.\n" +#~ "- Jednoduché: Jeden svet, bez herných volieb, alebo voľby textúr. Môže " +#~ "byť\n" +#~ "nevyhnutné pre malé obrazovky." + +#~ msgid "Config mods" +#~ msgstr "Nastav rozšírenia" + +#~ msgid "Configure" +#~ msgstr "Konfigurácia" + +#~ msgid "Connect" +#~ msgstr "Pripojiť sa" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Riadi rýchlosť ponárania v tekutinách." + +#~ msgid "Credits" +#~ msgstr "Poďakovanie" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Farba zameriavača (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Poškodenie je aktivované" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Štandardný časový rámec pre cURL, zadaný v milisekundách.\n" +#~ "Má efekt len ak je skompilovaný s cURL." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Definuje vzorkovací krok pre textúry.\n" +#~ "Vyššia hodnota vedie k jemnejším normálovým mapám." + +#~ msgid "Del. Favorite" +#~ msgstr "Zmaž obľúbené" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Stiahni si hru, ako napr. Minetest Game z minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Stiahni jednu z minetest.net" + +#~ msgid "Enable register confirmation" +#~ msgstr "Aktivuj potvrdenie registrácie" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Aktivuje bumpmapping pre textúry. Normálové mapy musia byť dodané v " +#~ "balíčku textúr.\n" +#~ "alebo musia byť automaticky generované.\n" +#~ "Vyžaduje aby boli shadery aktivované." + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Aktivuje generovanie normálových máp za behu (efekt reliéfu).\n" +#~ "Požaduje aby bol aktivovaný bumpmapping." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Aktivuj parallax occlusion mapping.\n" +#~ "Požaduje aby boli aktivované shadery." + +#~ msgid "Enter " +#~ msgstr "Vlož " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Experimentálne nastavenie, môže spôsobiť viditeľné medzery\n" +#~ "medzi blokmi, ak je nastavené väčšie než 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS v menu pozastavenia hry" + +#~ msgid "Fallback font shadow" +#~ msgstr "Tieň záložného písma" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Priehľadnosť tieňa záložného fontu" + +#~ msgid "Fallback font size" +#~ msgstr "Veľkosť záložného písma" + +#~ msgid "Filtering" +#~ msgstr "Filtrovanie" + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Veľkosť písma záložného písma v bodoch (pt)." + +#~ msgid "FreeType fonts" +#~ msgstr "FreeType písma" + +#~ msgid "Full screen BPP" +#~ msgstr "BPP v režime celej obrazovky" + +#~ msgid "Game" +#~ msgstr "Hra" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Normal Maps (nerovnosti)" + +#~ msgid "Generate normalmaps" +#~ msgstr "Generuj normálové mapy" + +#~ msgid "HUD scale factor" +#~ msgstr "Mierka HUD" + +#~ msgid "High-precision FPU" +#~ msgstr "Vysoko-presné FPU" + +#~ msgid "In-Game" +#~ msgstr "V hre" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Inštalácia: súbor: \"$1\"" + +#~ msgid "Instrumentation" +#~ msgstr "Výstroj" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Priradenie kláves. (ak je toto menu rozbité, zmaž zbytočnosti z minetest." +#~ "conf)" + +#~ msgid "Main" +#~ msgstr "Hlavné" + +#~ msgid "Main menu style" +#~ msgstr "Štýl hlavného menu" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "Umožní DirectX pracovať s LuaJIT. Vypni ak to spôsobuje problémy." + +#~ msgid "Menus" +#~ msgstr "Menu" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Minimapa v radarovom režime, priblíženie x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Minimapa v radarovom režime, priblíženie x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Minimapa v povrchovom režime, priblíženie x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Minimapa v povrchovom režime, priblíženie x4" + +#~ msgid "Name / Password" +#~ msgstr "Meno / Heslo" + +#~ msgid "Name/Password" +#~ msgstr "Meno/Heslo" + +#~ msgid "No" +#~ msgstr "Nie" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Vzorkovanie normálových máp" + +#~ msgid "Normalmaps strength" +#~ msgstr "Intenzita normálových máp" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Počet opakovaní výpočtu parallax occlusion." + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "Nepriehľadnosť tieňa za záložným písmom, medzi 0 a 255." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "Celkové skreslenie parallax occlusion efektu, obvykle mierka/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Celková mierka parallax occlusion efektu." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax Occlusion (nerovnosti)" + +#~ msgid "Parallax occlusion" +#~ msgstr "Parallax occlusion" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Skreslenie parallax occlusion" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Opakovania parallax occlusion" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Režim parallax occlusion" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Mierka parallax occlusion" + +#~ msgid "Player name" +#~ msgstr "Meno hráča" + +#~ msgid "Profiling" +#~ msgstr "Profilovanie" + +#~ msgid "PvP enabled" +#~ msgstr "PvP je aktívne" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Vynuluj svet jedného hráča" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Server / Hra pre jedného hráča" + +#~ msgid "" +#~ "Set the shadow update time.\n" +#~ "Lower value means shadows and map updates faster, but it consume more " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "Nastav aktualizačný čas tieňov.\n" +#~ "Nižšia hodnota znamená. že sa mapa a tiene aktualizujú rýchlejšie, ale " +#~ "spotrebuje sa viac zdrojov.\n" +#~ "Minimálna hodnota je 0.001 sekúnd max. hodnota je 0.2 sekundy" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Posun tieňa (v pixeloch) záložného písma. Ak je 0, tak tieň nebude " +#~ "vykreslený." + +#~ msgid "Special" +#~ msgstr "Špeciál" + +#~ msgid "Special key" +#~ msgstr "Špeciálne tlačidlo" + +#~ msgid "Start Singleplayer" +#~ msgstr "Spusti hru pre jedného hráča" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Intenzita generovaných normálových máp." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Aby mohli byť aktivované shadery, musí sa použiť OpenGL." + +#~ msgid "View" +#~ msgstr "Zobraziť" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Aby boli FreeType písma použité, je nutné aby bola podpora FreeType " +#~ "zakompilovaná.\n" +#~ "Ak je zakázané, budú použité bitmapové a XML vektorové písma." + +#~ msgid "Yes" +#~ msgstr "Áno" + +#, 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 "" +#~ "Chystáš sa pripojiť k serveru \"%s\" po prvý krát.\n" +#~ "Ak budeš pokračovať, bude na tomto serveri vytvorený nový účet s tvojimi " +#~ "údajmi.\n" +#~ "Zapíš znova prosím svoje heslo a klikni 'Registrovať a pripojiť sa' pre " +#~ "potvrdenie súhlasu s vytvorením účtu, alebo klikni 'Zrušiť' pre návrat." + +#~ msgid "You died." +#~ msgstr "Zomrel si." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/sl/minetest.po b/po/sl/minetest.po index 16d224c40..5412dd023 100644 --- a/po/sl/minetest.po +++ b/po/sl/minetest.po @@ -2,18 +2,58 @@ msgid "" msgstr "" "Project-Id-Version: Slovenian (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2019-11-29 23:04+0000\n" -"Last-Translator: Matej Mlinar <mlinar.matej@gmail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2020-09-30 19:41+0000\n" +"Last-Translator: Iztok Bajcar <iztok.bajcar@gmail.com>\n" "Language-Team: Slovenian <https://hosted.weblate.org/projects/minetest/" "minetest/sl/>\n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" -"%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 3.10-dev\n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 4.3-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Izhod na meni" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "Krajevni ukaz" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "samostojna igra" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "samostojna igra" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -23,8 +63,39 @@ msgstr "Ponovno oživi" msgid "You died" msgstr "Umrl si" +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "Krajevni ukaz" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "Krajevni ukaz" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" +msgstr "V redu" + +#: builtin/fstk/ui.lua +msgid "<none available>" msgstr "" #: builtin/fstk/ui.lua @@ -47,9 +118,30 @@ msgstr "Ponovna povezava" msgid "The server has requested a reconnect:" msgstr "Strežnik zahteva ponovno povezavo:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Poteka nalaganje ..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Izbor sveta:" + +#: 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. " @@ -64,10 +156,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Strežnik podpira različice protokolov med $1 in $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Morda je treba ponovno omogočiti javni seznam strežnikov oziroma preveriti " -"internetno povezavo." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,17 +167,26 @@ msgstr "Podporta je le različica protokola $1." msgid "We support protocol versions between version $1 and $2." msgstr "Podprte so različice protokolov med $1 in $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Prekliči" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Odvisnosti:" @@ -117,7 +216,7 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Poišči več razširitev" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -144,7 +243,7 @@ msgstr "Opis prilagoditve ni na voljo." #: builtin/mainmenu/dlg_config_world.lua #, fuzzy msgid "No optional dependencies" -msgstr "Izbirne možnosti:" +msgstr "Ni izbirnih odvisnosti" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" @@ -163,17 +262,58 @@ msgstr "Svet:" msgid "enabled" msgstr "omogočeno" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Poteka nalaganje ..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Vsi paketi" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Already installed" +msgstr "Tipka je že v uporabi" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Nazaj na glavni meni" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "Gosti igro" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgstr "ContentDB ni na voljo, če je bil Minetest narejen brez podpore cURL" #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy @@ -185,7 +325,6 @@ msgid "Failed to download $1" msgstr "Prenos $1 je spodletel" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Igre" @@ -194,7 +333,21 @@ msgid "Install" msgstr "Namesti" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "Namesti" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "Izbirne možnosti:" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "Nameščanje: nepodprta vrsta datoteke \"$1\" oziroma okvarjen arhiv" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Prilagoditve (mods)" @@ -207,9 +360,25 @@ msgid "No results" msgstr "Ni rezultatov" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Poišči" +#, fuzzy +msgid "No updates" +msgstr "Posodobi" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -224,7 +393,11 @@ msgid "Update" msgstr "Posodobi" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -232,8 +405,9 @@ msgid "A world named \"$1\" already exists" msgstr "Svet z imenom »$1« že obstaja" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Additional terrain" -msgstr "" +msgstr "Dodatni teren" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" @@ -244,12 +418,14 @@ msgid "Altitude dry" msgstr "" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Biome blending" -msgstr "" +msgstr "Zlivanje biomov" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Biomes" -msgstr "" +msgstr "Biomi" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy @@ -257,9 +433,8 @@ msgid "Caverns" msgstr "Šum votline" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Oktave" +msgstr "Jame" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" @@ -268,60 +443,65 @@ msgstr "Ustvari" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy msgid "Decorations" -msgstr "Informacije:" +msgstr "Dekoracije" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Prenesi igro, kot na primer Minetest Game, s spletišča minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Na voljo so na spletišču minetest.net/customize" +#, fuzzy +msgid "Development Test is meant for developers." +msgstr "Opozorilo: okrnjena razvojna različica je namenjena razvijalcem." #: builtin/mainmenu/dlg_create_world.lua #, fuzzy msgid "Dungeons" -msgstr "Šum ječe" +msgstr "Ječe" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Flat terrain" -msgstr "" +msgstr "Raven teren" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Floating landmasses in the sky" -msgstr "" +msgstr "Lebdeče kopenske mase na nebu" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" msgstr "" -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Igra" - #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Generiraj nefraktalen teren: oceani in podzemlje" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Hribi" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" -msgstr "" +msgstr "Vlažne reke" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" +msgstr "Poveča vlažnost v bližini rek" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Namesti" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "Jezera" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgstr "Nizka vlažnost in visoka vročina povzročita plitve ali izsušene reke" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -329,7 +509,7 @@ msgstr "Oblika sveta (mapgen)" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "" +msgstr "Možnosti generatorja zemljevida" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy @@ -338,15 +518,15 @@ msgstr "Oblika sveta (mapgen) Fractal" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "Gore" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Tok blata" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Omrežje predorov in jam" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -354,19 +534,19 @@ msgstr "Niste izbrali igre" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Vročina pojema z višino" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Vlažnost pojema z višino" #: builtin/mainmenu/dlg_create_world.lua msgid "Rivers" -msgstr "" +msgstr "Reke" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Reke na višini morja" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -375,17 +555,20 @@ msgstr "Seme" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Gladek prehod med biomi" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Strukture, ki se pojavijo na terenu (nima vpliva na drevesa in džungelsko " +"travo, ustvarjeno z mapgenom v6)" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Strukture, ki se pojavljajo na terenu, npr. drevesa in rastline" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" @@ -401,11 +584,11 @@ msgstr "" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "Erozija terena" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Drevesa in džungelska trava" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy @@ -414,12 +597,7 @@ msgstr "Globina polnila" #: 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 "Opozorilo: okrnjena razvojna različica je namenjena razvijalcem." +msgstr "Zelo velike jame globoko v podzemlju" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -451,6 +629,39 @@ msgstr "Package manager: neveljavna pot \"$1\"" msgid "Delete World \"$1\"?" msgstr "Ali res želiš izbrisati svet »$1«?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Potrditev gesla" + +#: 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 "Novo geslo" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "Gesli se ne ujemata!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Registriraj in prijavi se" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Sprejmi" @@ -472,9 +683,8 @@ msgid "(No description of setting given)" msgstr "(ni podanega opisa nastavitve)" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "2D Noise" -msgstr "2D zvok" +msgstr "2D šum" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" @@ -485,6 +695,16 @@ msgid "Browse" msgstr "Prebrskaj" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Vsebina" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Vsebina" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Onemogočeno" @@ -497,8 +717,9 @@ msgid "Enabled" msgstr "Omogočeno" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "Lacunarity" -msgstr "" +msgstr "lacunarnost" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Octaves" @@ -509,7 +730,8 @@ msgid "Offset" msgstr "Odmik" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "Trajanje" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -528,6 +750,10 @@ msgstr "Obnovi privzeto" msgid "Scale" msgstr "Skala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Poišči" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Izberi mapo" @@ -536,9 +762,9 @@ msgstr "Izberi mapo" msgid "Select file" msgstr "Izberi datoteko" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" -msgstr "Pokaži tehnične zapise" +msgstr "Prikaži tehnična imena" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must be at least $1." @@ -592,8 +818,9 @@ msgstr "Privzeta/standardna vrednost (defaults)" #. can be enabled in noise settings in #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy msgid "eased" -msgstr "" +msgstr "sproščeno" #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" @@ -617,14 +844,6 @@ msgstr "" "Namestitev prilagoditve: ni mogoče najti ustreznega imena mape za paket " "prilagoditev $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Nameščanje: nepodprta vrsta datoteke \"$1\" oziroma okvarjen arhiv" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Namesti: datoteka: »$1«" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Ni mogoče najti ustrezne prilagoditve ali paketa prilagoditev" @@ -645,6 +864,60 @@ msgstr "Ni mogoče namestiti prilagoditve kot $1" msgid "Unable to install a modpack as a $1" msgstr "Ni mogoče namestiti paketa prilagoditev kot $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Poteka nalaganje ..." + +#: builtin/mainmenu/serverlistmgr.lua +#, fuzzy +msgid "Public server list is disabled" +msgstr "Skriptiranje s strani odjemalca je onemogočeno" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Morda je treba ponovno omogočiti javni seznam strežnikov oziroma preveriti " +"internetno povezavo." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Dejavni sodelavci" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Glavni razvijalci" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Izberi mapo" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Predhodni sodelavci" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Predhodni razvajalci" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Brskaj po spletnih vsebinah" @@ -685,26 +958,6 @@ msgstr "Odstrani paket" msgid "Use Texture Pack" msgstr "Uporabi paket tekstur" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Dejavni sodelavci" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Glavni razvijalci" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Zasluge" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Predhodni sodelavci" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Predhodni razvajalci" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Objavi strežnik" @@ -714,14 +967,10 @@ msgid "Bind Address" msgstr "Vezani naslov" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Nastavi" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Ustvarjalni način" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Omogoči poškodbe" @@ -735,11 +984,7 @@ msgstr "Gostiteljski strežnik" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Ime / Geslo" +msgstr "Namesti igre iz ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -753,10 +998,15 @@ msgstr "Ni ustvarjenega oziroma izbranega sveta!" msgid "Play Game" msgstr "Zaženi igro" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Vrata" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Izbor sveta:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Izbor sveta:" @@ -770,45 +1020,67 @@ msgid "Start Game" msgstr "Začni igro" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Naslov / Vrata" +#, fuzzy +msgid "Address" +msgstr "– Naslov: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Poveži" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Počisti" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Ustvarjalni način" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Poškodbe so omogočene" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "Poškodbe" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Izbriši priljubljeno" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Priljubljeno" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Prijavi se v igro" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Ime / Geslo" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Igra PvP je omogočena" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Objavi strežnik" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Izbriši priljubljeno" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Server Description" +msgstr "Vrata strežnika" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -834,10 +1106,6 @@ msgstr "Vse nastavitve" msgid "Antialiasing:" msgstr "Glajenje:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Ali res želiš ponastaviti samostojno igro?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Samodejno shrani velikost zaslona" @@ -846,10 +1114,6 @@ msgstr "Samodejno shrani velikost zaslona" msgid "Bilinear Filter" msgstr "Bilinearni filter" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Površinsko preslikavanje" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Spremeni tipke" @@ -858,13 +1122,31 @@ msgstr "Spremeni tipke" msgid "Connected Glass" msgstr "Povezano steklo" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +#, fuzzy +msgid "Dynamic shadows" +msgstr "Senca pisave" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Senca pisave" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Olepšani listi" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Generiranje normalnih svetov" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -874,10 +1156,6 @@ msgstr "Zemljevid (minimap)" msgid "Mipmap + Aniso. Filter" msgstr "Zemljevid (minimap) s filtrom Aniso" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Ne" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Brez filtra" @@ -906,18 +1184,10 @@ msgstr "Neprosojni listi" msgid "Opaque Water" msgstr "Neprosojna površina vode" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Paralaksa" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Delci" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Ponastavi samostojno igro" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Zaslon:" @@ -930,9 +1200,14 @@ msgstr "Nastavitve" msgid "Shaders" msgstr "Senčenje" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "Senčenje (ni na voljo)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" -msgstr "" +msgstr "Senčenje (ni na voljo)" #: builtin/mainmenu/tab_settings.lua msgid "Simple Leaves" @@ -946,22 +1221,27 @@ msgstr "Gladko osvetljevanje" msgid "Texturing:" msgstr "Tekstura:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Za prikaz senčenja mora biti omogočen gonilnik OpenGL." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Barvno preslikavanje" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "" +#, fuzzy +msgid "Touch threshold (px):" +msgstr "Občutljivost dotika (v pikslih):" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Trilinearni filter" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Pokaži premikanje listov" @@ -974,23 +1254,12 @@ msgstr "Valovanje tekočin" msgid "Waving Plants" msgstr "Pokaži nihanje rastlin" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Da" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Nastavitve prilagoditev" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Glavni" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Zaženi samostojno igro" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Napaka povezave (ali je dejanje časovno preteklo?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Povezava je potekla." @@ -1019,7 +1288,8 @@ msgid "Connection error (timed out?)" msgstr "Napaka povezave (ali je dejanje časovno preteklo?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Ni mogoče najti oziroma naložiti igre »" #: src/client/clientlauncher.cpp @@ -1052,18 +1322,6 @@ msgstr "Ni bilo mogoče odpreti datoteke z geslom: " msgid "Provided world path doesn't exist: " msgstr "Podana pot do sveta ne obstaja: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1076,14 +1334,6 @@ msgstr "" msgid "- Address: " msgstr "– Naslov: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "– Ustvarjalni način: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "– Poškodbe: " - #: src/client/game.cpp msgid "- Mode: " msgstr "– Način: " @@ -1105,6 +1355,16 @@ msgstr "– Igra PvP: " msgid "- Server Name: " msgstr "– Ime strežnika: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Prišlo je do napake:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Samodejno premikanje naprej je onemogočeno" @@ -1113,6 +1373,22 @@ msgstr "Samodejno premikanje naprej je onemogočeno" msgid "Automatic forward enabled" msgstr "Samodejno premikanje naprej je omogočeno" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Posodabljanje kamere je onemogočeno" @@ -1121,6 +1397,10 @@ msgstr "Posodabljanje kamere je onemogočeno" msgid "Camera update enabled" msgstr "Posodabljanje kamere je omogočeno" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Spremeni geslo" @@ -1133,6 +1413,10 @@ msgstr "Filmski način(Cinematic mode) je onemogočen" msgid "Cinematic mode enabled" msgstr "Filmski način (Cinematic mode) je omogočen" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Skriptiranje s strani odjemalca je onemogočeno" @@ -1141,25 +1425,29 @@ msgstr "Skriptiranje s strani odjemalca je onemogočeno" msgid "Connecting to server..." msgstr "Poteka povezovanje s strežnikom ..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Nadaljuj" #: src/client/game.cpp -#, c-format +#, fuzzy, c-format msgid "" "Controls:\n" "- %s: move forwards\n" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1178,6 +1466,11 @@ msgstr "" "- kolesce miške: izbere orodje iz zaloge\n" "- %s 9: omogoči klepet\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Ustvarjanje odjemalca ..." @@ -1187,16 +1480,18 @@ msgid "Creating server..." msgstr "Poteka zagon strežnika ..." #: src/client/game.cpp +#, fuzzy msgid "Debug info and profiler graph hidden" -msgstr "" +msgstr "Podatki za razhroščevanje in graf skriti" #: src/client/game.cpp msgid "Debug info shown" msgstr "Prikazani so podatki o odpravljanju napak" #: src/client/game.cpp +#, fuzzy msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "" +msgstr "Podatki za razhroščevanje, graf, in žičnati prikaz skriti" #: src/client/game.cpp msgid "" @@ -1234,6 +1529,11 @@ msgstr "Onemogočen neomejen doseg pogleda" msgid "Enabled unlimited viewing range" msgstr "Omogočen neomejen doseg pogleda" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Ustvarjanje odjemalca ..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Izhod na meni" @@ -1308,32 +1608,9 @@ msgstr "" "Zemljevid (minimap) je trenutno onemogočen zaradi igre ali prilagoditve" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Zemljevid (minimap) je skrit" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Zemljevid (minimap) je v radar načinu, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Zemljevid (minimap) je v radar načinu, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Zemljevid (minimap) je v radar načinu, Zoom x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Zemljevid (minimap) je v načinu prikazovanja površja, Zoom x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Zemljevid (minimap) je v načinu prikazovanja površja, Zoom x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Zemljevid (minimap) je v načinu prikazovanja površja, Zoom x4" +#, fuzzy +msgid "Multiplayer" +msgstr "samostojna igra" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1370,8 +1647,9 @@ msgid "Pitch move mode enabled" msgstr "Prostorsko premikanje (pitch mode) je omogočeno" #: src/client/game.cpp +#, fuzzy msgid "Profiler graph shown" -msgstr "" +msgstr "Profiler prikazan" #: src/client/game.cpp msgid "Remote server" @@ -1399,16 +1677,31 @@ msgstr "Zvok je utišan" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Zvočni sistem je onemogočen" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Zvočni sistem v tej izdaji Minetesta ni podprt" #: src/client/game.cpp msgid "Sound unmuted" msgstr "Zvok ni utišan" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1430,8 +1723,9 @@ msgid "Volume changed to %d%%" msgstr "Glasnost zvoka je nastavljena na %d %%" #: src/client/game.cpp +#, fuzzy msgid "Wireframe shown" -msgstr "" +msgstr "Žičnati prikaz omogočen" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" @@ -1458,13 +1752,14 @@ msgid "HUD shown" msgstr "HUD je prikazan" #: src/client/gameui.cpp +#, fuzzy msgid "Profiler hidden" -msgstr "" +msgstr "Profiler skrit" #: src/client/gameui.cpp -#, c-format +#, fuzzy, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" +msgstr "Profiler prikazan (stran %d od %d)" #: src/client/keycode.cpp msgid "Apps" @@ -1478,10 +1773,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Velike črke" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Počisti" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1511,24 +1802,29 @@ msgid "Home" msgstr "Začetno mesto" #: src/client/keycode.cpp +#, fuzzy msgid "IME Accept" -msgstr "" +msgstr "IME Sprejem" #: src/client/keycode.cpp +#, fuzzy msgid "IME Convert" -msgstr "" +msgstr "IME Pretvorba" #: src/client/keycode.cpp +#, fuzzy msgid "IME Escape" -msgstr "" +msgstr "IME Pobeg" #: src/client/keycode.cpp +#, fuzzy msgid "IME Mode Change" -msgstr "" +msgstr "IME sprememba načina" #: src/client/keycode.cpp +#, fuzzy msgid "IME Nonconvert" -msgstr "" +msgstr "IME Nepretvorba" #: src/client/keycode.cpp msgid "Insert" @@ -1632,8 +1928,9 @@ msgid "Numpad 9" msgstr "Tipka 9 na številčnici" #: src/client/keycode.cpp +#, fuzzy msgid "OEM Clear" -msgstr "" +msgstr "OEM Clear" #: src/client/keycode.cpp msgid "Page down" @@ -1729,35 +2026,41 @@ msgstr "X Gumb 2" msgid "Zoom" msgstr "Približanje" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Gesli se ne ujemata!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Zemljevid (minimap) je skrit" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Registriraj in prijavi se" +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Zemljevid (minimap) je v radar načinu, Zoom x1" -#: 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." +#: src/client/minimap.cpp +#, fuzzy, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Zemljevid (minimap) je v načinu prikazovanja površja, Zoom x1" + +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap in texture mode" +msgstr "Zemljevid (minimap) je v načinu prikazovanja površja, Zoom x1" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Prenos $1 je spodletel" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" -"Prvič se boste prijavili v strežnik z imenom \"%s\".\n" -"Če nadaljujete, bo na tem strežniku ustvarjen nov račun z vašimi prijavnimi " -"podatki.\n" -"Prosimo, znova vnesite svoje geslo in kliknite \"Registriraj in prijavi se" -"\", da potrdite ustvarjanje računa ali kliknite \"Prekliči\" za prekinitev." #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Nadaljuj" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +#, fuzzy +msgid "\"Aux1\" = climb down" msgstr "\"Special\" = plezanje dol" #: src/gui/guiKeyChangeMenu.cpp @@ -1768,15 +2071,23 @@ msgstr "Samodejno premikanje naprej" msgid "Automatic jumping" msgstr "Samodejno skakanje" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Nazaj" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Sprememba kamere" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Klepet" @@ -1829,7 +2140,7 @@ msgid "Key already in use" msgstr "Tipka je že v uporabi" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +msgid "Keybindings." msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1860,10 +2171,6 @@ msgstr "Posnetek zaslona" msgid "Sneak" msgstr "Plaziti se" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Specialen" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Preklopi HUD" @@ -1905,10 +2212,6 @@ msgstr "pritisni tipko" msgid "Change" msgstr "Spremeni" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Potrditev gesla" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Novo geslo" @@ -1917,6 +2220,10 @@ msgstr "Novo geslo" msgid "Old Password" msgstr "Staro geslo" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Gesli se ne ujemata!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Izhod" @@ -1926,15 +2233,10 @@ msgid "Muted" msgstr "Utišano" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +msgid "Sound Volume: %d%%" msgstr "Glasnost zvoka: " -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Vpis " - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -1942,18 +2244,35 @@ msgstr "Vpis " msgid "LANG_CODE" msgstr "sl" +#: 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 "Izbrati je treba ime!" + #: 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) Popravi položaj virtualne igralne palice.\n" +"Če je onemogočeno, se bo sredina igralne palice nastavila na položaj prvega " +"pritiska na ekran." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Uporabi virtualno igralno palico za pritisk gumba \"aux\".\n" +"Če je omogočeno, bo igralna palica sprožila gumb \"aux\", ko bo zunaj " +"glavnega kroga." #: src/settings_translation_file.cpp msgid "" @@ -1966,6 +2285,15 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"(X, Y, Z) Zamik fraktala od središča sveta v enotah 'scale'.\n" +"Uporabno za premik določene točke na (0, 0) za ustvarjanje\n" +"primerne začetne točke (spawn point) ali za 'zumiranje' na določeno\n" +"točko, tako da povečate 'scale'.\n" +"Privzeta vrednost je prirejena za primerno začetno točko za Mandelbrotovo\n" +"množico s privzetimi parametri, v ostalih situacijah jo bo morda treba\n" +"spremeniti.\n" +"Obseg je približno od -2 do 2. Pomnožite s 'scale', da določite zamik v " +"enoti ene kocke." #: src/settings_translation_file.cpp msgid "" @@ -1977,12 +2305,13 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" +"(X, Y, Z) skala (razteg) fraktala v enoti ene kocke.\n" +"Resnična velikost fraktala bo 2- do 3-krat večja.\n" +"Te vrednosti so lahko zelo velike; ni potrebno,\n" +"da se fraktal prilega velikosti sveta.\n" +"Povečajte te vrednosti, da 'zumirate' na podrobnosti fraktala.\n" +"Privzeta vrednost določa vertikalno stisnjeno obliko, primerno za\n" +"otok; nastavite vse tri vrednosti na isto število za neobdelano obliko." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." @@ -1990,27 +2319,29 @@ msgstr "2D šum, ki nadzoruje obliko/velikost gorskih verig." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgstr "2D šum, ki nadzira obliko in velikost hribov." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgstr "2D šum, ki nadzira obliko/velikost gora." #: src/settings_translation_file.cpp +#, fuzzy msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" +msgstr "2D šum, ki nadzira velikost/pojavljanje gorskih verig." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +msgstr "2D šum, ki nadzira veliokst/pojavljanje hribov." #: src/settings_translation_file.cpp +#, fuzzy msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" +msgstr "2D šum, ki nadzira velikost/pojavljanje gorskih verig." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgstr "2D šum, ki določa položaj rečnih dolin in kanalov." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2022,17 +2353,19 @@ msgstr "3D način" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" -msgstr "" +msgstr "Moč 3D parallax načina" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "" +msgstr "3D šum, ki določa večje jame." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" +"3D šum, ki določa strukturo in višino gora\n" +"ter strukturo terena lebdečih gora." #: src/settings_translation_file.cpp msgid "" @@ -2041,22 +2374,27 @@ 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 šum, ki določa strukturo lebdeče pokrajine.\n" +"Po spremembi s privzete vrednosti bo 'skalo' šuma (privzeto 0,7) morda " +"treba\n" +"prilagoditi, saj program za generiranje teh pokrajin najbolje deluje\n" +"z vrednostjo v območju med -2,0 in 2,0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." -msgstr "" +msgstr "3D šum, ki določa strukturo sten rečnih kanjonov." #: src/settings_translation_file.cpp msgid "3D noise defining terrain." -msgstr "" +msgstr "3D šum za določanje terena." #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." -msgstr "" +msgstr "3D šum za gorske previse, klife, itd. Ponavadi so variacije majhne." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" +msgstr "3D šum, ki določa število ječ na posamezen kos zemljevida." #: src/settings_translation_file.cpp msgid "" @@ -2072,11 +2410,18 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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." msgstr "" +"Izbrano seme zemljevida, pustite prazno za izbor naključnega semena.\n" +"Ta nastavitev bo povožena v primeru ustvarjanja novega sveta iz glavnega " +"menija." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." @@ -2091,6 +2436,10 @@ msgstr "" #: src/settings_translation_file.cpp msgid "ABM interval" +msgstr "Interval ABM" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" msgstr "" #: src/settings_translation_file.cpp @@ -2099,23 +2448,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "Pospešek v zraku" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "Pospešek gravitacije v kockah na kvadratno sekundo." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "Modifikatorji aktivnih blokov" #: src/settings_translation_file.cpp msgid "Active block management interval" -msgstr "" +msgstr "Interval upravljanja aktivnih blokov" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "" +msgstr "Doseg aktivnih blokov" #: src/settings_translation_file.cpp msgid "Active object send range" @@ -2127,16 +2476,26 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"Naslov strežnika.\n" +"Pustite prazno za zagon lokalnega strežnika.\n" +"Polje za vpis naslova v glavnem meniju povozi to nastavitev." #: src/settings_translation_file.cpp +#, fuzzy msgid "Adds particles when digging a node." -msgstr "" +msgstr "Doda partikle pri kopanju kocke." #: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" +"Nastavite dpi konfiguracijo (gostoto prikaza) svojemu ekranu (samo za ne-X11/" +"Android), npr. za 4K ekrane." + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" #: src/settings_translation_file.cpp #, c-format @@ -2148,6 +2507,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Dodaj ime elementa" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Naprednejše" @@ -2163,7 +2527,7 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "Vedno leti in bodi hiter (fly and fast mode)" #: src/settings_translation_file.cpp @@ -2172,11 +2536,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "Največja količina sporočil, ki jih igralec sme poslati v 10 sekundah." #: src/settings_translation_file.cpp msgid "Amplifies the valleys." -msgstr "" +msgstr "Ojača doline." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" @@ -2192,7 +2556,7 @@ msgstr "Objavi strežnik na seznamu strežnikov." #: src/settings_translation_file.cpp msgid "Append item name" -msgstr "" +msgstr "Dodaj ime elementa" #: src/settings_translation_file.cpp msgid "Append item name to tooltip." @@ -2205,13 +2569,15 @@ msgstr "Šum jablan" #: src/settings_translation_file.cpp msgid "Arm inertia" -msgstr "" +msgstr "Vztrajnost roke" #: src/settings_translation_file.cpp msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" +"Vztrajnost roke; daje bolj realistično gibanje\n" +"roke, ko se kamera premika." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" @@ -2231,6 +2597,19 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" +"Na tej razdalji bo strežnik agresivno optimiziral, kateri bloki bodo " +"poslani\n" +"igralcem.\n" +"Manjše vrednosti lahko močno pospešijo delovanje na račun napak\n" +"pri izrisovanju (nekateri bloki se ne bodo izrisali pod vodo in v jamah,\n" +"včasih pa tudi na kopnem).\n" +"Nastavljanje na vrednost, večjo od max_block_send_distance, onemogoči to\n" +"optimizacijo.\n" +"Navedena vrednost ima enoto 'mapchunk' (16 blokov)." + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" #: src/settings_translation_file.cpp msgid "Automatic forward key" @@ -2253,6 +2632,15 @@ msgstr "Samodejno shrani velikost zaslona" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "Posebna tipka, ki se uporablja za plezanje in spuščanje" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Tipka backward" @@ -2264,11 +2652,7 @@ msgstr "Osnovna podlaga" #: src/settings_translation_file.cpp msgid "Base terrain height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" +msgstr "Višina osnovnega terena." #: src/settings_translation_file.cpp msgid "Basic privileges" @@ -2284,35 +2668,36 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Bilinear filtering" -msgstr "" +msgstr "Bilinearno filtriranje" #: src/settings_translation_file.cpp 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 +#, fuzzy msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" +msgstr "Šum bioma" #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Bold and italic font path" +msgid "Bobbing" msgstr "" +#: src/settings_translation_file.cpp +msgid "Bold and italic font path" +msgstr "Pot do krepke in poševne pisave" + #: src/settings_translation_file.cpp msgid "Bold and italic monospace font path" -msgstr "" +msgstr "Pot do krepke in ležeče pisave konstantne širine" #: src/settings_translation_file.cpp #, fuzzy @@ -2321,7 +2706,7 @@ msgstr "Pot pisave" #: src/settings_translation_file.cpp msgid "Bold monospace font path" -msgstr "" +msgstr "Pot do krepke pisave konstantne širine" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2329,19 +2714,28 @@ msgstr "Postavljanje blokov znotraj igralca" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "Vgrajeno" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +#, fuzzy +msgid "Camera" +msgstr "Sprememba kamere" #: 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" "Increasing can reduce artifacting on weaker GPUs.\n" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" +"'Bližnja ravnina' kamere - najmanjša razdalja, na kateri kamera vidi objekte " +"- v blokih, med 0 in 0,25.\n" +"Deluje samo na platformah GLES. Večini uporabnikov te nastavitve ni treba " +"spreminjati.\n" +"Povečanje vrednosti lahko odpravi anomalije na šibkejših grafičnih " +"procesorjih.\n" +"0.1 = privzeto, 0.25 = dobra vrednost za šibkejše naprave" #: src/settings_translation_file.cpp msgid "Camera smoothing" @@ -2376,11 +2770,11 @@ msgstr "Širina jame" #: src/settings_translation_file.cpp msgid "Cave1 noise" -msgstr "" +msgstr "Šum Cave1" #: src/settings_translation_file.cpp msgid "Cave2 noise" -msgstr "" +msgstr "Šum Cave2" #: src/settings_translation_file.cpp msgid "Cavern limit" @@ -2408,17 +2802,18 @@ msgid "" "Center of light curve boost range.\n" "Where 0.0 is minimum light level, 1.0 is maximum light level." msgstr "" +"Središče območja povečave svetlobne krivulje.\n" +"0.0 je minimalna raven svetlobe, 1.0 maksimalna." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Ukaz" + #: src/settings_translation_file.cpp #, fuzzy msgid "Chat font size" @@ -2455,12 +2850,14 @@ msgid "Chat toggle key" msgstr "Tipka za preklop na klepet" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" +#, fuzzy +msgid "Chat weblinks" +msgstr "Pogovor je prikazan" #: src/settings_translation_file.cpp +#, fuzzy msgid "Chunk size" -msgstr "" +msgstr "Velikost 'chunka'" #: src/settings_translation_file.cpp msgid "Cinematic mode" @@ -2471,7 +2868,14 @@ msgid "Cinematic mode key" msgstr "Tipka za filmski način" #: src/settings_translation_file.cpp +#, fuzzy msgid "Clean transparent textures" +msgstr "Čiste prosojne teksture" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." msgstr "" #: src/settings_translation_file.cpp @@ -2494,6 +2898,10 @@ msgstr "" 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 "Hitrost plezanja" @@ -2518,6 +2926,11 @@ msgstr "Oblaki v meniju" msgid "Colored fog" msgstr "Barvna megla" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "Barvna megla" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2543,6 +2956,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Command key" +msgstr "Tipka Command" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" #: src/settings_translation_file.cpp @@ -2564,16 +2993,24 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Console color" -msgstr "" +msgstr "Barva konzole" #: src/settings_translation_file.cpp msgid "Console height" +msgstr "Višina konzole" + +#: src/settings_translation_file.cpp +msgid "Content Repository" msgstr "" #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2590,8 +3027,9 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "Controls" -msgstr "" +msgstr "Kontrole" #: src/settings_translation_file.cpp msgid "" @@ -2601,16 +3039,18 @@ 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 msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgstr "Nadzira strmost/globino jezerskih depresij." #: src/settings_translation_file.cpp msgid "Controls steepness/height of hills." -msgstr "" +msgstr "Nadzira strmost/višino hribov." #: src/settings_translation_file.cpp msgid "" @@ -2632,7 +3072,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2640,7 +3082,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2664,12 +3108,12 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Tipka za zmanjševanje glasnosti" +msgid "Debugging" +msgstr "" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" +msgid "Dec. volume key" +msgstr "Tipka za zmanjševanje glasnosti" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2710,8 +3154,9 @@ msgstr "Privzeta igra" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2743,14 +3188,6 @@ msgstr "Določa obsežno strukturo rečnega kanala." msgid "Defines location and terrain of optional hills and lakes." msgstr "Določa lokacijo in teren neobveznih gričev in jezer." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Določa korak vzorčenja teksture.\n" -"Višja vrednost povzroči bolj gladke normalne zemljevide." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Določa osnovno podlago." @@ -2823,6 +3260,16 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Dekoracije" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "Tipka za met predmeta" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Kopanje delcev" @@ -2835,6 +3282,16 @@ msgstr "Onemogoči preprečevanje goljufanja" msgid "Disallow empty passwords" msgstr "Ne dovoli praznih gesel" +#: src/settings_translation_file.cpp +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 "Ime domene strežnika, ki se prikaže na seznamu strežnikov." @@ -2879,18 +3336,36 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +#, fuzzy +msgid "Enable creative mode for all players" msgstr "Omogoči ustvarjalni način za novo ustvarjene svetove." #: src/settings_translation_file.cpp msgid "Enable joysticks" msgstr "Omogoč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 "" @@ -2907,22 +3382,16 @@ msgstr "Omogoči, da igralci dobijo poškodbo in umrejo." 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2971,14 +3440,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2987,18 +3448,6 @@ msgstr "" msgid "Enables minimap." msgstr "Omogoči zemljevid (minimap)." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3007,6 +3456,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -3015,12 +3474,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3032,7 +3485,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3052,18 +3509,6 @@ msgstr "" msgid "Fallback font path" msgstr "Pot pisave" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Tipka za hitro premikanje" @@ -3083,7 +3528,7 @@ msgstr "Hitro premikanje" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "Možnost omogoča hitro premikanje (s tipko »uporabi«).\n" @@ -3121,14 +3566,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filtriranje" +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "Glajenje:" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3194,6 +3640,11 @@ msgstr "Začetek megle" msgid "Fog toggle key" msgstr "Tipka za preklop na meglo" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font" +msgstr "Velikost pisave" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3217,15 +3668,15 @@ msgid "Font size" msgstr "Velikost pisave" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3234,6 +3685,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3296,10 +3758,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3324,10 +3782,6 @@ msgstr "" msgid "Full screen" msgstr "Celozaslonski način" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Celozaslonski način." @@ -3345,7 +3799,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Igre" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3356,7 +3819,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3375,6 +3838,16 @@ msgstr "" 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 "Gravitacija" @@ -3392,9 +3865,14 @@ 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 je prikazan" + #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "" @@ -3402,8 +3880,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3425,7 +3903,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3436,10 +3915,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Strmina hriba" @@ -3635,10 +4110,17 @@ 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 "Kako široke naredi reke." @@ -3673,8 +4155,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3698,14 +4179,21 @@ msgstr "" "To zahteva privilegij \"noclip\" na strežniku." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" "Izbrana možnost omogoči delovanje \"posebne\" tipke namesto tipke \"plaziti " "se\" za spuščanja in plezanje navzdol." +#: 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" @@ -3734,7 +4222,10 @@ msgstr "" "pri letenju ali plavanju (premikaš se tja, kamor si obrnjen)." #: 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 "Če je omogočeno, se novi igralci ne morejo prijaviti s praznim geslom." #: src/settings_translation_file.cpp @@ -3755,6 +4246,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3773,10 +4270,6 @@ msgstr "" msgid "Ignore world errors" msgstr "Prezri napake svetov" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "V igri" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -3804,7 +4297,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3827,16 +4320,12 @@ msgstr "" 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 @@ -3888,6 +4377,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3967,6 +4460,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4066,6 +4566,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4439,6 +4946,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4495,7 +5006,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 @@ -4505,15 +5016,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 @@ -4525,7 +5039,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4552,6 +5067,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Gladko osvetljevanje" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4623,21 +5143,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Slog glavnega menija" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4699,6 +5219,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4805,7 +5329,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4853,6 +5381,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4907,17 +5442,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4966,12 +5505,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4982,6 +5533,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5048,16 +5603,16 @@ msgstr "" 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 "" @@ -5070,6 +5625,11 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Poudarjanje vozlišč" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5082,14 +5642,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5111,18 +5663,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5132,11 +5676,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5145,39 +5684,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Optional override for chat weblink color." msgstr "" -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Lestvica okluzije paralakse" - #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5200,17 +5712,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5238,6 +5746,15 @@ msgstr "" msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Tipka za letenje" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5246,10 +5763,6 @@ msgstr "" "Možnost omogoča letenje brez učinkovanja težnosti.\n" "Delovanje zahteva omogočeno podporo za »letenje (fly)« na strežniku." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5258,6 +5771,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Bilinearno filtriranje" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5292,10 +5810,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5303,9 +5817,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5396,10 +5910,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5469,6 +5979,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Zaslon:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5496,6 +6011,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Posnetek zaslona" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5508,10 +6028,6 @@ msgstr "" 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 "" @@ -5552,8 +6068,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" +#, fuzzy +msgid "Server" +msgstr "Gostiteljski strežnik" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "– Ime strežnika: " + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Vrata strežnika" #: src/settings_translation_file.cpp msgid "Server URL" @@ -5579,10 +6106,19 @@ msgstr "" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Vrata strežnika" + #: 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 "" @@ -5594,7 +6130,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5615,6 +6179,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5627,6 +6198,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5634,9 +6221,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5651,6 +6236,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5672,6 +6267,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5732,18 +6331,15 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Senca pisave" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Posebna tipka" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Posebna tipka, ki se uporablja za plezanje in spuščanje" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5759,6 +6355,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5786,10 +6390,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5827,6 +6427,11 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Nastavitve" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -5869,6 +6474,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5883,6 +6495,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5938,18 +6554,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5967,6 +6583,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5975,9 +6597,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6014,7 +6635,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 @@ -6037,6 +6658,19 @@ msgstr "" msgid "Touch screen threshold" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Touchscreen" +msgstr "Celozaslonski način" + +#: 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 "" @@ -6107,15 +6741,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6209,7 +6858,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6283,6 +6932,10 @@ msgstr "Pokaži valovanje vode" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6304,18 +6957,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6350,13 +7001,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6440,39 +7100,224 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "– Ustvarjalni način: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Preklopi gladek pogled" +#~ msgid "- Damage: " +#~ msgstr "– Poškodbe: " -#~ msgid "Select Package File:" -#~ msgstr "Izberi datoteko paketa:" +#, fuzzy +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." +#~ msgstr "" +#~ "0 = \"parallax occlusion\" s podatki o nagibih (hitrejše)\n" +#~ "1 = mapiranje reliefa (počasnejše, a bolj natančno)" -#~ msgid "IPv6 support." -#~ msgstr "IPv6 podpora." +#~ msgid "Address / Port" +#~ msgstr "Naslov / Vrata" + +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Ali res želiš ponastaviti samostojno igro?" + +#~ msgid "Back" +#~ msgstr "Nazaj" + +#~ msgid "Basic" +#~ msgstr "Osnovno" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Biti na piksel (barvna globina) v celozaslonskem načinu." + +#~ msgid "Bump Mapping" +#~ msgstr "Površinsko preslikavanje" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Spremeni uporabniški vmesnik glavnega menija:\n" +#~ "- Polno: več enoigralskih svetov, izbira igre, izbirnik paketov " +#~ "tekstur, itd.\n" +#~ "- Preprosto: en enoigralski svet, izbirnika iger in paketov tekstur se " +#~ "ne prikažeta. Morda bo za manjše\n" +#~ "ekrane potrebna ta nastavitev." + +#~ msgid "Config mods" +#~ msgstr "Nastavitve prilagoditev" + +#~ msgid "Configure" +#~ msgstr "Nastavi" + +#~ msgid "Connect" +#~ msgstr "Poveži" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Nadzira hitrost potapljanja v tekočinah." + +#~ msgid "Credits" +#~ msgstr "Zasluge" + +#~ msgid "Damage enabled" +#~ msgstr "Poškodbe so omogočene" + +#~ msgid "Darkness sharpness" +#~ msgstr "Ostrina teme" + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Določa korak vzorčenja teksture.\n" +#~ "Višja vrednost povzroči bolj gladke normalne zemljevide." + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Prenesi igro, kot na primer Minetest Game, s spletišča minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Na voljo so na spletišču minetest.net/customize" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Prenašanje in nameščanje $1, prosimo počakajte..." #, fuzzy #~ msgid "Enable VBO" #~ msgstr "Omogoči VBO" -#~ msgid "Darkness sharpness" -#~ msgstr "Ostrina teme" +#~ msgid "Enter " +#~ msgstr "Vpis " -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Prenašanje in nameščanje $1, prosimo počakajte..." +#~ msgid "Filtering" +#~ msgstr "Filtriranje" -#~ msgid "Back" -#~ msgstr "Nazaj" +#~ msgid "Game" +#~ msgstr "Igra" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Generiranje normalnih svetov" + +#~ msgid "IPv6 support." +#~ msgstr "IPv6 podpora." + +#~ msgid "In-Game" +#~ msgstr "V igri" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Namesti: datoteka: »$1«" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Vloge tipk (če ta meni preneha delovati, odstranite nastavitve tipk iz " +#~ "datoteke minetest.conf)" + +#~ msgid "Main" +#~ msgstr "Glavni" + +#~ msgid "Main menu style" +#~ msgstr "Slog glavnega menija" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Zemljevid (minimap) je v radar načinu, Zoom x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Zemljevid (minimap) je v radar načinu, Zoom x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Zemljevid (minimap) je v načinu prikazovanja površja, Zoom x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Zemljevid (minimap) je v načinu prikazovanja površja, Zoom x4" + +#~ msgid "Name / Password" +#~ msgstr "Ime / Geslo" + +#~ msgid "Name/Password" +#~ msgstr "Ime / Geslo" + +#~ msgid "No" +#~ msgstr "Ne" #~ msgid "Ok" #~ msgstr "V redu" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Paralaksa" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Lestvica okluzije paralakse" + +#~ msgid "PvP enabled" +#~ msgstr "Igra PvP je omogočena" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Ponastavi samostojno igro" + +#~ msgid "Select Package File:" +#~ msgstr "Izberi datoteko paketa:" + +#~ msgid "Special" +#~ msgstr "Specialen" + +#~ msgid "Special key" +#~ msgstr "Posebna tipka" + +#~ msgid "Start Singleplayer" +#~ msgstr "Zaženi samostojno igro" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Za prikaz senčenja mora biti omogočen gonilnik OpenGL." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Preklopi gladek pogled" + +#, fuzzy +#~ msgid "View" +#~ msgstr "Pogled" + +#~ msgid "Yes" +#~ msgstr "Da" + +#, 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 "" +#~ "Prvič se boste prijavili v strežnik z imenom \"%s\".\n" +#~ "Če nadaljujete, bo na tem strežniku ustvarjen nov račun z vašimi " +#~ "prijavnimi podatki.\n" +#~ "Prosimo, znova vnesite svoje geslo in kliknite \"Registriraj in prijavi " +#~ "se\", da potrdite ustvarjanje računa ali kliknite \"Prekliči\" za " +#~ "prekinitev." + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Umrl si" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/sr_Cyrl/minetest.po b/po/sr_Cyrl/minetest.po index 67ee37bd0..f50dc7a91 100644 --- a/po/sr_Cyrl/minetest.po +++ b/po/sr_Cyrl/minetest.po @@ -2,39 +2,103 @@ msgid "" msgstr "" "Project-Id-Version: Serbian (cyrillic) (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\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-07-12 16:18+0000\n" +"Last-Translator: OrbitalPetrol <ccorporation981@gmail.com>\n" "Language-Team: Serbian (cyrillic) <https://hosted.weblate.org/projects/" "minetest/minetest/sr_Cyrl/>\n" "Language: sr_Cyrl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.2-dev\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 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Празна команда." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Врати се на главни мени" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Неважећа команда: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Издата команда: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Излистај мрежне играче" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Мрежни играчи: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Излазни ред са ћаскање је сада празан." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Ова команда није дозвољена од стране сервера." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "Врати се у живот" #: builtin/client/death_formspec.lua src/client/game.cpp -#, fuzzy msgid "You died" -msgstr "Умро/ла си." +msgstr "Умро си" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Доступне команде:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Доступне команде: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Команда није доступна: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Нађите помоћ за команде" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Користите '.help <komanda>' да бисте добили више информација или '.help all' " +"да бисте све набројали." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <команда>]" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "У реду" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<ни једна није доступна>" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred in a Lua script:" -msgstr "Догодила се грешка у Lua скрипти, у моду:" +msgstr "Догодила се грешка у Lua скрипти:" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred:" msgstr "Догодила се грешка:" @@ -50,9 +114,30 @@ msgstr "Поновно повезивање" msgid "The server has requested a reconnect:" msgstr "Сервер тражи поновно повезивање:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -67,10 +152,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Сервер подржава верзије протокола између $1 и $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Покушајте да поновно укључите листу сервера и проверите вашу интернет " -"конекцију." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -80,18 +163,26 @@ msgstr "Ми подржавамо само $1 верзију протокола. msgid "We support protocol versions between version $1 and $2." msgstr "Ми подржавамо верзије протокола између верзије $1 и $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Прекини" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua -#, fuzzy +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Зависи од:" @@ -100,21 +191,18 @@ msgid "Disable all" msgstr "Онемогући све" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Disable modpack" -msgstr "Онемогућено" +msgstr "Онемогући групу модова" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" msgstr "Укључи све" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "Enable modpack" -msgstr "Преименуј мод-паковање:" +msgstr "Укључи групу модова" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." @@ -124,36 +212,31 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Нађи још модова" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Мод:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No (optional) dependencies" -msgstr "Необавезне зависности:" +msgstr "Нема (необавезних) зависности" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No game description provided." -msgstr "Није доступан опис мода" +msgstr "Није пружен опис мода." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "Нема зависности." +msgstr "Нема обавезних зависности." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No modpack description provided." -msgstr "Није доступан опис мода" +msgstr "Није пружен опис групе модова." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No optional dependencies" -msgstr "Необавезне зависности:" +msgstr "Нема необавезних зависности" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" @@ -173,30 +256,67 @@ msgid "enabled" msgstr "укључено" #: builtin/mainmenu/dlg_contentstore.lua -msgid "All packages" -msgstr "" +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" већ постоји. Да ли желите да га препишете?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 и $2 зависности ће бити инсталиране." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "$1 се преузима..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 неопходних зависности није могло бити нађено." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 зависности ће бити инсталирано, и $2 зависности ће бити прескочено." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "Сви пакети" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Већ инсталирано" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Back to Main Menu" -msgstr "Главни мени" +msgstr "Назад у главни мени" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +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 -#, fuzzy msgid "Downloading..." -msgstr "Учитавање..." +msgstr "Преузимање..." #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Failed to download $1" -msgstr "Неуспела инсталација $1 у $2" +msgstr "Неуспело преузимање $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Игре" @@ -205,40 +325,69 @@ msgid "Install" msgstr "Инсталирај" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Инсталирај $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Инсталирај недостајуће зависности" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "Инсталирај мод: неподржан тип фајла \"$1\" или оштећена архива" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Модови" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" -msgstr "" +msgstr "Ниједан пакет није било могуће преузети" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" -msgstr "" +msgstr "Нема резултата" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Тражи" +msgid "No updates" +msgstr "Нема ажурирања" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Није пронађено" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Препиши" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Молим проверите да ли је основна игра исправна." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "На чекању" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Texture packs" msgstr "Сетови текстура" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Uninstall" -msgstr "Инсталирај" +msgstr "Деинсталирај" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "" +msgstr "Ажурирај" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Ажурирај све [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Погледај још информација у веб претраживачу" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -246,98 +395,93 @@ 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 -#, fuzzy msgid "Biome blending" -msgstr "Семе биома" +msgstr "Склапање биома" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Семе биома" +msgstr "Биоми" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Семе пећина" +msgstr "Пећине" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Семе пећина" +msgstr "Јама" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Направи" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Информације о моду:" +msgstr "Украси" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Преузми подигру, као што је minetest_game, са minetest.net" +msgid "Development Test is meant for developers." +msgstr "Упозорење: Минимални развојни тест је намењен развијачима." #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Преузми један са minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 "Floatlands (експериментални)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Створи нефрактални терен: Океани и подземље" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +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 msgid "Lakes" -msgstr "" +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" @@ -345,46 +489,43 @@ msgstr "Генератор мапе" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "" +msgstr "Опције генератора мапа" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Генератор мапе" +msgstr "Специфичне опције генератора мапа" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +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 -#, fuzzy msgid "No game selected" -msgstr "Одабир домета" +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 -#, fuzzy msgid "Rivers" -msgstr "Семе пећина" +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 @@ -393,57 +534,53 @@ msgstr "Семе" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Глатка транзиција између биома" #: builtin/mainmenu/dlg_create_world.lua 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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "Упозорење: Минимални развојни тест је намењен развијачима." +msgstr "Веома велике пећине дубоко у подземљу" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "Име света" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "You have no games installed." msgstr "Нема инсталираних подигара." @@ -458,32 +595,64 @@ msgid "Delete" msgstr "Обриши" #: builtin/mainmenu/dlg_delete_content.lua -#, fuzzy msgid "pkgmgr: failed to delete \"$1\"" -msgstr "Modmgr: неуспело брисање \"$1\"" +msgstr "pkgmgr: неуспело брисање \"$1\"" #: builtin/mainmenu/dlg_delete_content.lua -#, fuzzy msgid "pkgmgr: invalid path \"$1\"" -msgstr "Modmgr: локација мода \"$1\" није валидна" +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 +#, 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 +msgid "Register" +msgstr "" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Прихвати" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Преименуј мод-паковање:" +msgstr "Преименуј групу модова:" #: 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.conf које ће " +"преписати било које име дато овде." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" @@ -492,7 +661,7 @@ msgstr "(Није дат опис поставке)" #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "2D Noise" -msgstr "Cave2 семе" +msgstr "2D бука" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" @@ -503,6 +672,16 @@ 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 "Онемогућено" @@ -516,23 +695,24 @@ msgstr "Омогућено" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Lacunarity" -msgstr "" +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 "Persistance" -msgstr "" +#, fuzzy +msgid "Persistence" +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." @@ -540,11 +720,15 @@ 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" +msgstr "Тражи" #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy @@ -556,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 "Прикажи техничка имена" @@ -642,18 +826,6 @@ msgstr "" "Инсталирај мод: не може се пронаћи одговарајуће име за фасциклу мод-паковања " "$1" -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"\n" -"Инсталирај мод: неподржан тип фајла \"$1\" или оштећена архива" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: file: \"$1\"" -msgstr "Инсталирај мод: фајл: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua #, fuzzy msgid "Unable to find a valid mod or modpack" @@ -681,6 +853,60 @@ msgstr "Неуспела инсталација $1 у $2" msgid "Unable to install a modpack as a $1" msgstr "Неуспела инсталација $1 у $2" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Учитавање..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Покушајте да поновно укључите листу сервера и проверите вашу интернет " +"конекцију." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Активни сарадници" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "Даљина слања активног блока" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Главни развијачи" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "" @@ -728,26 +954,6 @@ msgstr "Уклони изабрани мод" msgid "Use Texture Pack" msgstr "Сетови текстура" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Активни сарадници" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Главни развијачи" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Заслуге" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Предходни сарадници" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Предходни главни развијачи" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Пријави сервер" @@ -757,14 +963,10 @@ msgid "Bind Address" msgstr "Вежи адресу" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Подеси" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Слободни мод" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Омогући оштећење" @@ -780,10 +982,6 @@ msgstr "Направи сервер" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Име/Шифра" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Нови" @@ -797,10 +995,15 @@ msgstr "Ниједан свет није направљен или изабра msgid "Play Game" msgstr "Почни игру" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Порт" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Одабери свет:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Одабери свет:" @@ -815,46 +1018,68 @@ msgid "Start Game" msgstr "Направи игру" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Адреса / Порт" +#, fuzzy +msgid "Address" +msgstr "- Адреса: " -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Прикључи се" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Очисти" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Слободни мод" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Оштећење омогућено" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "Штета" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Обриши Омиљени" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Омиљени" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Join Game" msgstr "Направи игру" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Име / Шифра" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Одзив" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Туча омогућена" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Пријави сервер" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +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" @@ -881,10 +1106,6 @@ msgstr "Поставке" msgid "Antialiasing:" msgstr "Гланчање текстура:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Да ли сте сигурни да желите да ресетујете ваш свет?" - #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Autosave Screen Size" @@ -894,10 +1115,6 @@ msgstr "Аутоматски сачувај величину екрана" msgid "Bilinear Filter" msgstr "Билинеарни филтер" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Bump-Мапирање" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Подеси контроле" @@ -906,12 +1123,28 @@ msgstr "Подеси контроле" msgid "Connected Glass" msgstr "Спојено стакло" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Елегантно лишће" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -922,10 +1155,6 @@ msgstr "Мипмап" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Анизотропни филтер" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Не" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Без филтера" @@ -954,18 +1183,10 @@ msgstr "Непровидно лишће" msgid "Opaque Water" msgstr "Непрозирна вода" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax Occlusion Мапирање" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Честице" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Ресетуј свет" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Екран:" @@ -978,6 +1199,10 @@ msgstr "Поставке" msgid "Shaders" msgstr "Шејдери" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -994,23 +1219,27 @@ msgstr "Глатко осветљење" msgid "Texturing:" msgstr "Филтери за текстуре:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Да би се омогућили шејдери мора се користити OpenGL драјвер." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Тонско Мапирање" #: builtin/mainmenu/tab_settings.lua #, fuzzy -msgid "Touchthreshold: (px)" +msgid "Touch threshold (px):" msgstr "Праг додиривања (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Трилинеарни филтер" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Лепршајуће лишће" @@ -1024,23 +1253,12 @@ msgstr "Лепршајуће лишће" msgid "Waving Plants" msgstr "Лепршајуће биљке" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Да" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Подеси модове" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Главно" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "Конекцији је истекло време." @@ -1069,7 +1287,8 @@ msgid "Connection error (timed out?)" msgstr "Грешка у конекцији (истекло време?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Немогу пронаћи или учитати игру \"" #: src/client/clientlauncher.cpp @@ -1101,18 +1320,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "Дата локација света не постоји: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1125,14 +1332,6 @@ msgstr "" msgid "- Address: " msgstr "- Адреса: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Слободни мод: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Оштећење: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Мод: " @@ -1154,6 +1353,16 @@ msgstr "- Играч против играча: " msgid "- Server Name: " msgstr "- Име сервера: " +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Догодила се грешка:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Automatic forward disabled" @@ -1164,6 +1373,22 @@ msgstr "Кључ за синематски мод" msgid "Automatic forward enabled" msgstr "Кључ за синематски мод" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Camera update disabled" @@ -1174,6 +1399,10 @@ msgstr "Кључ за укључивање/искључивање освежав msgid "Camera update enabled" msgstr "Кључ за укључивање/искључивање освежавања камере" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Промени шифру" @@ -1188,6 +1417,11 @@ msgstr "Кључ за синематски мод" msgid "Cinematic mode enabled" msgstr "Кључ за синематски мод" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Модификовање клијента" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1196,25 +1430,29 @@ msgstr "" msgid "Connecting to server..." msgstr "Повезујем се на сервер..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Настави" #: src/client/game.cpp -#, c-format +#, fuzzy, c-format msgid "" "Controls:\n" "- %s: move forwards\n" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1233,6 +1471,11 @@ msgstr "" "- Точкић миша: одабирање ставке\n" "- %s: причање\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Правим клијента..." @@ -1290,6 +1533,11 @@ msgstr "" 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 "Изађи у мени" @@ -1367,32 +1615,9 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +#, fuzzy +msgid "Multiplayer" +msgstr "Један играч" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1469,6 +1694,21 @@ msgstr "" msgid "Sound unmuted" msgstr "Јачина звука" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, fuzzy, c-format msgid "Viewing range changed to %d" @@ -1540,10 +1780,6 @@ msgstr "Назад" msgid "Caps Lock" msgstr "Велика слова" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Очисти" - #: src/client/keycode.cpp msgid "Control" msgstr "Контрола" @@ -1792,22 +2028,31 @@ msgstr "X Дугме 2" msgid "Zoom" msgstr "Зумирај" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Шифре се не поклапају!" - -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Неуспело преузимање $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1816,7 +2061,7 @@ msgstr "Настави" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "\"Користи\" = Силажење" #: src/gui/guiKeyChangeMenu.cpp @@ -1828,16 +2073,24 @@ msgstr "Напред" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Назад" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Change camera" msgstr "Промени дугмад" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Чет" @@ -1890,10 +2143,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" @@ -1924,10 +2175,6 @@ msgstr "" msgid "Sneak" msgstr "Шуњање" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Toggle HUD" @@ -1973,10 +2220,6 @@ msgstr "притисните дугме" msgid "Change" msgstr "Промени" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Потврди шифру" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Нова шифра" @@ -1985,6 +2228,10 @@ msgstr "Нова шифра" msgid "Old Password" msgstr "Стара шифра" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Шифре се не поклапају!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Изађи" @@ -1995,15 +2242,10 @@ msgid "Muted" msgstr "Изкључи звук" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, 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 "Уреду " - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -2011,6 +2253,16 @@ msgstr "Уреду " msgid "LANG_CODE" msgstr "sr_Cyrl" +#: 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" @@ -2019,8 +2271,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -2054,14 +2306,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax occlusion са информацијама о нагибима (брже)\n" -"1 = мапирање рељефа (спорије, прецизније)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2159,6 +2403,10 @@ msgstr "" "- sidebyside: Лево/Десно подела екрана.\n" "- pageflip: Четвородупли буфер 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" @@ -2179,6 +2427,10 @@ msgstr "Порука приказана свим играчима када се msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Absolute limit of queued blocks to emerge" @@ -2231,6 +2483,10 @@ msgstr "" "Подеси dpi конфигурацију за твој екран (само за оне који нису X11/Android) " "нпр. за 4k екране." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2241,6 +2497,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Име света" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Напредно" @@ -2255,7 +2516,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Увек летење и брзина" #: src/settings_translation_file.cpp @@ -2334,6 +2596,10 @@ msgstr "" "оптимизацију.\n" "Постављено у мапа-блоковима (16 блокова)" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Automatic forward key" @@ -2356,6 +2622,14 @@ msgstr "Аутоматски сачувај величину екрана" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Кључ за назад" @@ -2368,10 +2642,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Основно" - #: src/settings_translation_file.cpp #, fuzzy msgid "Basic privileges" @@ -2394,7 +2664,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 @@ -2402,11 +2673,11 @@ msgid "Biome noise" msgstr "Семе биома" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Битови по пикселу (или дубина боје) у моду целог екрана." +msgid "Block send optimize distance" +msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2434,8 +2705,9 @@ msgid "Builtin" msgstr "Уграђено" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Рељефна тектура" +#, fuzzy +msgid "Camera" +msgstr "Промени дугмад" #: src/settings_translation_file.cpp msgid "" @@ -2509,14 +2781,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +#, fuzzy +msgid "Chat command time message threshold" +msgstr "Граница пећине" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Чат команде" #: src/settings_translation_file.cpp #, fuzzy @@ -2555,8 +2827,8 @@ msgid "Chat toggle key" msgstr "Кључ за укључивање чета" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Чат команде" +msgid "Chat weblinks" +msgstr "" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2574,6 +2846,12 @@ msgstr "Кључ за синематски мод" msgid "Clean transparent textures" msgstr "Очисти провидне трекстуре" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Клијент" @@ -2595,6 +2873,11 @@ msgstr "Модификовање клијента" 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 "Брзина успона" @@ -2619,6 +2902,11 @@ msgstr "Облаци у менију" msgid "Colored fog" msgstr "Обојена магла" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "Обојена магла" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2653,6 +2941,22 @@ msgstr "" msgid "Command key" msgstr "Кључ за команду" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Споји стакло" @@ -2677,10 +2981,18 @@ msgstr "Боја конзоле" msgid "Console height" msgstr "Висина конзоле" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2712,7 +3024,9 @@ 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 @@ -2743,7 +3057,10 @@ msgid "Crosshair alpha" msgstr "Провидност нишана" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "Провидност нишана (видљивост, између 0 и 255)." #: src/settings_translation_file.cpp @@ -2751,8 +3068,10 @@ msgid "Crosshair color" msgstr "Боја нишана" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Боја нишана (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" #: src/settings_translation_file.cpp msgid "DPI" @@ -2776,11 +3095,11 @@ msgid "Debug log level" msgstr "Ниво записивања у debug" #: 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 @@ -2822,8 +3141,9 @@ msgstr "Уобичајена игра" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2854,12 +3174,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2930,6 +3244,15 @@ msgstr "" 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 #, fuzzy msgid "Digging particles" @@ -2943,6 +3266,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2988,18 +3321,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -3016,22 +3366,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -3080,14 +3424,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -3096,18 +3432,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3116,6 +3440,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -3124,12 +3458,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3141,7 +3469,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -3160,18 +3492,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3191,7 +3511,7 @@ msgstr "Брзо кретање" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "Видно поље за време увеличавања.\n" @@ -3227,14 +3547,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: 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." @@ -3301,6 +3622,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3322,15 +3647,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3339,6 +3664,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3398,10 +3734,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3426,10 +3758,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3447,7 +3775,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +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 @@ -3458,7 +3795,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3477,6 +3814,14 @@ msgstr "" 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 "" @@ -3495,7 +3840,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 @@ -3505,8 +3854,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3528,7 +3877,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3540,10 +3890,6 @@ msgstr "Десни Windows" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3739,10 +4085,17 @@ 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 "" @@ -3775,8 +4128,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3798,11 +4150,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3826,7 +4184,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 @@ -3845,6 +4205,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3861,10 +4227,6 @@ msgstr "" 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 "" @@ -3892,7 +4254,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3915,16 +4277,12 @@ msgstr "" 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 @@ -3975,6 +4333,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -4054,6 +4416,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4153,6 +4522,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4526,6 +4902,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4582,7 +4962,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 @@ -4592,15 +4972,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 @@ -4612,7 +4995,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4639,6 +5023,11 @@ msgstr "" 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" @@ -4711,22 +5100,21 @@ msgstr "Абсолутни лимит emerge токова." msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Главни мени" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4788,6 +5176,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4899,7 +5291,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4947,6 +5343,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -5001,17 +5404,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -5060,12 +5467,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5076,6 +5495,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5142,16 +5565,16 @@ msgstr "" 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 "" @@ -5164,6 +5587,11 @@ msgstr "" 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 "" @@ -5176,14 +5604,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5205,18 +5625,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5226,11 +5638,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5239,39 +5646,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Optional override for chat weblink color." msgstr "" -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Parallax Occlusion Мапирање" - #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5294,17 +5674,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5333,6 +5709,15 @@ msgstr "Кључ за синематски мод" msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Кључ за синематски мод" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5341,10 +5726,6 @@ msgstr "" "Играч је у могућности д лети без утицаја гравитације.\n" "Ово захтева \"fly\" привилегију на серверима." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5353,6 +5734,11 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Билинеарно филтрирање" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5387,10 +5773,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5398,9 +5780,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5491,10 +5873,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5565,6 +5943,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Екран:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5592,6 +5975,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Екран:" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5604,10 +5992,6 @@ msgstr "" 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 "" @@ -5668,8 +6052,19 @@ msgstr "" "18 = 4Д \"Mandelbulb\" жулијин скуп." #: 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" @@ -5695,10 +6090,19 @@ msgstr "" 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 "" @@ -5710,7 +6114,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5731,6 +6163,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Shader path" @@ -5744,6 +6183,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5751,9 +6206,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5768,6 +6221,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5789,6 +6252,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5844,17 +6311,13 @@ msgstr "Брзина успона" msgid "Sneaking speed, in nodes per second." msgstr "" -#: src/settings_translation_file.cpp -msgid "Sound" -msgstr "" - #: src/settings_translation_file.cpp #, fuzzy -msgid "Special key" -msgstr "притисните дугме" +msgid "Soft shadow radius" +msgstr "Величина облака" #: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" +msgid "Sound" msgstr "" #: src/settings_translation_file.cpp @@ -5872,6 +6335,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5899,10 +6370,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5940,6 +6407,11 @@ msgstr "" 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 "" @@ -5982,6 +6454,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5996,6 +6475,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6051,18 +6534,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6080,6 +6563,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6088,9 +6577,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6127,7 +6615,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 @@ -6151,6 +6639,19 @@ msgstr "" 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 "" @@ -6222,15 +6723,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6324,7 +6840,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6398,6 +6914,10 @@ msgstr "Веслајућа вода" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6419,18 +6939,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6465,13 +6983,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6557,35 +7084,37 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- Слободни мод: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Укључи/Искључи Cinematic мод" +#~ msgid "- Damage: " +#~ msgstr "- Оштећење: " -#, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Изаберите фајл мода:" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "Контролише ширину тунела, мања вредност ствара шире тунеле." - -#, fuzzy #~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Контролише густину планинског терена на лебдећим острвима.\n" -#~ "Као одступање се додаје на вредност 'np_mountain' семена." +#~ "0 = parallax occlusion са информацијама о нагибима (брже)\n" +#~ "1 = мапирање рељефа (спорије, прецизније)." + +#~ msgid "Address / Port" +#~ msgstr "Адреса / Порт" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -6595,12 +7124,133 @@ msgstr "" #~ "Подеси осветљење унутар игре. Веће вредности су светлије.\n" #~ "Ово подешавање је само за клијента, сервер га игнорише." -#, fuzzy -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Преузима се $1, молим вас сачекајте..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Да ли сте сигурни да желите да ресетујете ваш свет?" #~ msgid "Back" #~ msgstr "Назад" +#~ msgid "Basic" +#~ msgstr "Основно" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Битови по пикселу (или дубина боје) у моду целог екрана." + +#~ msgid "Bump Mapping" +#~ msgstr "Bump-Мапирање" + +#~ msgid "Bumpmapping" +#~ msgstr "Рељефна тектура" + +#~ msgid "Config mods" +#~ msgstr "Подеси модове" + +#~ msgid "Configure" +#~ msgstr "Подеси" + +#~ msgid "Connect" +#~ msgstr "Прикључи се" + +#, fuzzy +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Контролише густину планинског терена на лебдећим острвима.\n" +#~ "Као одступање се додаје на вредност 'np_mountain' семена." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "Контролише ширину тунела, мања вредност ствара шире тунеле." + +#~ msgid "Credits" +#~ msgstr "Заслуге" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Боја нишана (R,G,B)." + +#~ msgid "Damage enabled" +#~ 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" + +#, fuzzy +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Преузима се $1, молим вас сачекајте..." + +#~ msgid "Enter " +#~ 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)" + +#~ msgid "Main" +#~ msgstr "Главно" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Главни мени" + +#~ msgid "Name / Password" +#~ msgstr "Име / Шифра" + +#~ msgid "Name/Password" +#~ msgstr "Име/Шифра" + +#~ msgid "No" +#~ msgstr "Не" + #~ msgid "Ok" #~ msgstr "Уреду" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax Occlusion Мапирање" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Parallax Occlusion Мапирање" + +#~ msgid "PvP enabled" +#~ msgstr "Туча омогућена" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Ресетуј свет" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Изаберите фајл мода:" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "притисните дугме" + +#~ msgid "Start Singleplayer" +#~ msgstr "Започни игру за једног играча" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Да би се омогућили шејдери мора се користити OpenGL драјвер." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Укључи/Искључи Cinematic мод" + +#~ msgid "Yes" +#~ msgstr "Да" + +#~ msgid "You died." +#~ msgstr "Умро/ла си." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/sr_Latn/minetest.po b/po/sr_Latn/minetest.po new file mode 100644 index 000000000..91a698dba --- /dev/null +++ b/po/sr_Latn/minetest.po @@ -0,0 +1,6875 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: minetest\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2020-08-15 23:32+0000\n" +"Last-Translator: Milos <milosfilic97@gmail.com>\n" +"Language-Team: Serbian (latin) <https://hosted.weblate.org/projects/minetest/" +"minetest/sr_Latn/>\n" +"Language: sr_Latn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.2-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Nazad na Glavni meni" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "Vrati se u zivot" + +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "You died" +msgstr "Umro/la si." + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + +#: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp +msgid "OK" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + +#: builtin/fstk/ui.lua +msgid "An error occurred in a Lua script:" +msgstr "Doslo je do greske u Lua skripti:" + +#: builtin/fstk/ui.lua +msgid "An error occurred:" +msgstr "Doslo je do greske:" + +#: builtin/fstk/ui.lua +msgid "Main menu" +msgstr "Glavni meni" + +#: builtin/fstk/ui.lua +msgid "Reconnect" +msgstr "Ponovno povezivanje" + +#: builtin/fstk/ui.lua +msgid "The server has requested a reconnect:" +msgstr "Server je zahtevao ponovno povezivanje:" + +#: 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 +msgid "Protocol version mismatch. " +msgstr "Protokol verzija neuskladjena. " + +#: builtin/mainmenu/common.lua +msgid "Server enforces protocol version $1. " +msgstr "Server primenjuje protokol verzije $1. " + +#: builtin/mainmenu/common.lua +msgid "Server supports protocol versions between $1 and $2. " +msgstr "Server podrzava protokol verzije izmedju $1 ili $2. " + +#: builtin/mainmenu/common.lua +msgid "Visit website" +msgstr "" + +#: builtin/mainmenu/common.lua +msgid "We only support protocol version $1." +msgstr "Mi samo podrzavamo protokol verzije $1." + +#: builtin/mainmenu/common.lua +msgid "We support protocol versions between version $1 and $2." +msgstr "Mi podrzavamo protokol verzija izmedju verzije $1 i $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_register.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp +#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp +msgid "Cancel" +msgstr "Ponisti" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua +msgid "Dependencies:" +msgstr "Zavisnosti:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable all" +msgstr "Onemoguci sve" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Disable modpack" +msgstr "Onemoguci modpack" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable all" +msgstr "Omoguci sve" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Enable modpack" +msgstr "Omoguci 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 "" +"Nije omogucen mod \"$1\" jer sadrzi nedozvoljene simbole. Samo simboli [a-z, " +"0-9_] su dozvoljeni." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Find More Mods" +msgstr "Nadji jos modova" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "Mod:" +msgstr "Mod:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No (optional) dependencies" +msgstr "Nema (opcionih) zavisnosti" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No game description provided." +msgstr "Opis igre nije prilozen." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No hard dependencies" +msgstr "Bez teskih zavisnosti" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No modpack description provided." +msgstr "Opis modpack-a nije prilozen." + +#: builtin/mainmenu/dlg_config_world.lua +msgid "No optional dependencies" +msgstr "Bez neobaveznih zavisnosti" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +msgid "Optional dependencies:" +msgstr "Neobavezne zavisnosti:" + +#: builtin/mainmenu/dlg_config_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp +msgid "Save" +msgstr "Sacuvaj" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "World:" +msgstr "Svet:" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "enabled" +msgstr "Omoguceno" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Preuzimanje..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "All packages" +msgstr "Svi paketi" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Back to Main Menu" +msgstr "Nazad na Glavni meni" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB je nedostupan kada je Minetest sastavljen bez cURL" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Downloading..." +msgstr "Preuzimanje..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Failed to download $1" +msgstr "Neuspelo preuzimanje $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Games" +msgstr "Igre" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install" +msgstr "Instalirati" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install $1" +msgstr "Instalirati" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "Neobavezne zavisnosti:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Mods" +msgstr "Modovi" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No packages could be retrieved" +msgstr "Nema paketa za preuzeti" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "No results" +msgstr "Bez rezultata" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "No updates" +msgstr "Azuriranje" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Texture packs" +msgstr "Pakovanja tekstura" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Uninstall" +msgstr "Deinstaliraj" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update" +msgstr "Azuriranje" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "A world named \"$1\" already exists" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Additional terrain" +msgstr "Dodatni teren" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Altitude chill" +msgstr "Nadmorska visina" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Altitude dry" +msgstr "Visina suva" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biome blending" +msgstr "Mesanje bioma" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Biomes" +msgstr "Biomi" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caverns" +msgstr "Pecine" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Caves" +msgstr "Pecine" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Create" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Decorations" +msgstr "Dekoracije" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Development Test is meant for developers." +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Dungeons" +msgstr "Tamnice" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Flat terrain" +msgstr "Ravan teren" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floating landmasses in the sky" +msgstr "Lebdece zemaljske mase na nebu" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Floatlands (experimental)" +msgstr "Lebdece zemlje (eksperimentalno)" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Generate non-fractal terrain: Oceans and underground" +msgstr "Stvaranje ne-fraktalnog terena: Okeani i podzemlje" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Hills" +msgstr "Brda" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Humid rivers" +msgstr "Vlazne reke" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Increases humidity around rivers" +msgstr "Povecana vlaznost oko reka" + +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Instalirati" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Lakes" +msgstr "Jezera" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Low humidity and high heat causes shallow or dry rivers" +msgstr "Niska vlaga i visoka toplota uzrokuju plitke ili suve reke" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +msgid "Mapgen flags" +msgstr "Mapgen zastave" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mapgen-specific flags" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mountains" +msgstr "Planine" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Mud flow" +msgstr "Protok blata" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Network of tunnels and caves" +msgstr "Mreza tunela i pecina" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "No game selected" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces heat with altitude" +msgstr "Smanjuje toplotu sa visinom" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Reduces humidity with altitude" +msgstr "Smanjuje vlaznost sa visinom" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Rivers" +msgstr "Reke" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Sea level rivers" +msgstr "Reke na nivou mora" + +#: builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Seed" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Smooth transition between biomes" +msgstr "Glatki prelaz izmedju bioma" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "" +"Structures appearing on the terrain (no effect on trees and jungle grass " +"created by v6)" +msgstr "" +"Konstrukcije koje se pojavljuju na terenu (nema efekta na drveca i travu " +"dzungle koje je stvorio v6)" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Structures appearing on the terrain, typically trees and plants" +msgstr "Konstrukcije koje se pojavljuju na terenu , obicno drvece i biljke" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert" +msgstr "Umereno,Pustinja" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle" +msgstr "Umereno,Pustinja,Dzungla" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Temperate, Desert, Jungle, Tundra, Taiga" +msgstr "Umereno,Pustinja,Dzungla,Tundra,Tajga" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Terrain surface erosion" +msgstr "Povrsinska erozija terena" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Trees and jungle grass" +msgstr "Drveca i trava dzungle" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Vary river depth" +msgstr "Razlicita dubina reke" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Very large caverns deep in the underground" +msgstr "Veoma velike pecine duboko ispod zemlje" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "World name" +msgstr "" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "You have no games installed." +msgstr "Nema instaliranih igara." + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "Are you sure you want to delete \"$1\"?" +msgstr "" + +#: builtin/mainmenu/dlg_delete_content.lua +#: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua +#: src/client/keycode.cpp +msgid "Delete" +msgstr "" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: failed to delete \"$1\"" +msgstr "" + +#: builtin/mainmenu/dlg_delete_content.lua +msgid "pkgmgr: invalid path \"$1\"" +msgstr "" + +#: builtin/mainmenu/dlg_delete_world.lua +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 +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 "" + +#: builtin/mainmenu/dlg_rename_modpack.lua +msgid "Rename Modpack:" +msgstr "" + +#: 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 "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "(No description of setting given)" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "2D Noise" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "< Back to Settings page" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +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 "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Edit" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Enabled" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Lacunarity" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Octaves" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Offset" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Persistence" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid integer." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Please enter a valid number." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Restore Default" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Scale" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Trazi" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select directory" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Select file" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +msgid "Show technical names" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must be at least $1." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "The value must not be larger than $1." +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "X spread" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Y spread" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z" +msgstr "" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Z spread" +msgstr "" + +#. ~ "absvalue" is a noise parameter flag. +#. It is short for "absolute value". +#. It can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "absvalue" +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 "" + +#. ~ "eased" is a noise parameter flag. +#. It is used to make the map smoother and +#. can be enabled in noise settings in +#. main menu -> "All Settings". +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "eased" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 (Enabled)" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "$1 mods" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Failed to install $1 to $2" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find real mod name for: $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Install Mod: Unable to find suitable folder name for modpack $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to find a valid mod or modpack" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a $1 as a texture pack" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a game as a $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a mod as a $1" +msgstr "" + +#: builtin/mainmenu/pkgmgr.lua +msgid "Unable to install a modpack as a $1" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Ucitavanje..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Pokusajte ponovo omoguciti javnu listu servera i proverite vasu internet " +"vezu." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 +msgid "Browse online content" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Content" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Disable Texture Pack" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Information:" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Installed Packages:" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "No dependencies." +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "No package description available" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Rename" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Uninstall Package" +msgstr "" + +#: builtin/mainmenu/tab_content.lua +msgid "Use Texture Pack" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Announce Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Bind Address" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Creative Mode" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Enable Damage" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Host Server" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Install games from ContentDB" +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 +msgid "Play Game" +msgstr "" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Select World:" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Server Port" +msgstr "" + +#: builtin/mainmenu/tab_local.lua +msgid "Start Game" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Address" +msgstr "" + +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Creative mode" +msgstr "" + +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Join Game" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +msgid "Ping" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Vlazne reke" + +#: builtin/mainmenu/tab_online.lua +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 "" + +#: builtin/mainmenu/tab_settings.lua +msgid "3D Clouds" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "4x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "8x" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "All Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Antialiasing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Autosave Screen Size" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Bilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/client/game.cpp +msgid "Change Keys" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Connected Glass" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Fancy Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Mipmap + Aniso. Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "No Mipmap" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Highlighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Node Outlining" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "None" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Opaque Water" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Particles" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Screen:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Settings" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Shaders" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "Lebdece zemlje (eksperimentalno)" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (unavailable)" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Simple Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Smooth Lighting" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Texturing:" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Tone Mapping" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Touch threshold (px):" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Trilinear Filter" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Liquids" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +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 "" + +#: src/client/client.cpp +msgid "Done!" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes" +msgstr "" + +#: src/client/client.cpp +msgid "Initializing nodes..." +msgstr "" + +#: src/client/client.cpp +msgid "Loading textures..." +msgstr "" + +#: src/client/client.cpp +msgid "Rebuilding shaders..." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Connection error (timed out?)" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Could not find or load game: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Invalid gamespec." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Main Menu" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "No world selected and no address provided. Nothing to do." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Player name too long." +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Please choose a name!" +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided password file failed to open: " +msgstr "" + +#: src/client/clientlauncher.cpp +msgid "Provided world path doesn't exist: " +msgstr "" + +#: src/client/game.cpp +msgid "" +"\n" +"Check debug.txt for details." +msgstr "" + +#: src/client/game.cpp +msgid "- Address: " +msgstr "" + +#: src/client/game.cpp +msgid "- Mode: " +msgstr "" + +#: src/client/game.cpp +msgid "- Port: " +msgstr "" + +#: src/client/game.cpp +msgid "- Public: " +msgstr "" + +#. ~ PvP = Player versus Player +#: src/client/game.cpp +msgid "- PvP: " +msgstr "" + +#: src/client/game.cpp +msgid "- Server Name: " +msgstr "" + +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Doslo je do greske:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + +#: src/client/game.cpp +msgid "Automatic forward disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Automatic forward enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Camera update enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + +#: src/client/game.cpp +msgid "Change Password" +msgstr "" + +#: src/client/game.cpp +msgid "Cinematic mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Cinematic mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + +#: src/client/game.cpp +msgid "Client side scripting is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Connecting to server..." +msgstr "" + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + +#: src/client/game.cpp +msgid "Continue" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "" +"Controls:\n" +"- %s: move forwards\n" +"- %s: move backwards\n" +"- %s: move left\n" +"- %s: move right\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" +"- %s: drop item\n" +"- %s: inventory\n" +"- Mouse: turn/look\n" +"- Mouse wheel: select item\n" +"- %s: chat\n" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + +#: src/client/game.cpp +msgid "Creating client..." +msgstr "" + +#: src/client/game.cpp +msgid "Creating server..." +msgstr "" + +#: src/client/game.cpp +msgid "Debug info and profiler graph hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info shown" +msgstr "" + +#: src/client/game.cpp +msgid "Debug info, profiler graph, and wireframe hidden" +msgstr "" + +#: src/client/game.cpp +msgid "" +"Default Controls:\n" +"No menu visible:\n" +"- single tap: button activate\n" +"- double tap: place/use\n" +"- slide finger: look around\n" +"Menu/Inventory visible:\n" +"- double tap (outside):\n" +" -->close\n" +"- touch stack, touch slot:\n" +" --> move stack\n" +"- touch&drag, tap 2nd finger\n" +" --> place single item to slot\n" +msgstr "" + +#: src/client/game.cpp +msgid "Disabled unlimited viewing range" +msgstr "" + +#: src/client/game.cpp +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 "" + +#: src/client/game.cpp +msgid "Exit to OS" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fast mode enabled (note: no 'fast' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fly mode enabled (note: no 'fly' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Fog disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Fog enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Game info:" +msgstr "" + +#: src/client/game.cpp +msgid "Game paused" +msgstr "" + +#: src/client/game.cpp +msgid "Hosting server" +msgstr "" + +#: src/client/game.cpp +msgid "Item definitions..." +msgstr "" + +#: src/client/game.cpp +msgid "KiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Media..." +msgstr "" + +#: src/client/game.cpp +msgid "MiB/s" +msgstr "" + +#: src/client/game.cpp +msgid "Minimap currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "Multiplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Noclip mode enabled (note: no 'noclip' privilege)" +msgstr "" + +#: src/client/game.cpp +msgid "Node definitions..." +msgstr "" + +#: src/client/game.cpp +msgid "Off" +msgstr "" + +#: src/client/game.cpp +msgid "On" +msgstr "" + +#: src/client/game.cpp +msgid "Pitch move mode disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Pitch move mode enabled" +msgstr "" + +#: src/client/game.cpp +msgid "Profiler graph shown" +msgstr "" + +#: src/client/game.cpp +msgid "Remote server" +msgstr "" + +#: src/client/game.cpp +msgid "Resolving address..." +msgstr "" + +#: src/client/game.cpp +msgid "Shutting down..." +msgstr "" + +#: src/client/game.cpp +msgid "Singleplayer" +msgstr "" + +#: src/client/game.cpp +msgid "Sound Volume" +msgstr "" + +#: src/client/game.cpp +msgid "Sound muted" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is disabled" +msgstr "" + +#: src/client/game.cpp +msgid "Sound system is not supported on this build" +msgstr "" + +#: src/client/game.cpp +msgid "Sound unmuted" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range changed to %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at maximum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Viewing range is at minimum: %d" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Volume changed to %d%%" +msgstr "" + +#: src/client/game.cpp +msgid "Wireframe shown" +msgstr "" + +#: src/client/game.cpp +msgid "Zoom currently disabled by game or mod" +msgstr "" + +#: src/client/game.cpp +msgid "ok" +msgstr "" + +#: src/client/gameui.cpp +msgid "Chat hidden" +msgstr "" + +#: src/client/gameui.cpp +msgid "Chat shown" +msgstr "" + +#: src/client/gameui.cpp +msgid "HUD hidden" +msgstr "" + +#: src/client/gameui.cpp +msgid "HUD shown" +msgstr "" + +#: src/client/gameui.cpp +msgid "Profiler hidden" +msgstr "" + +#: src/client/gameui.cpp +#, c-format +msgid "Profiler shown (page %d of %d)" +msgstr "" + +#: src/client/keycode.cpp +msgid "Apps" +msgstr "" + +#: src/client/keycode.cpp +msgid "Backspace" +msgstr "" + +#: src/client/keycode.cpp +msgid "Caps Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Down" +msgstr "" + +#: src/client/keycode.cpp +msgid "End" +msgstr "" + +#: src/client/keycode.cpp +msgid "Erase EOF" +msgstr "" + +#: src/client/keycode.cpp +msgid "Execute" +msgstr "" + +#: src/client/keycode.cpp +msgid "Help" +msgstr "" + +#: src/client/keycode.cpp +msgid "Home" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Accept" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Convert" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Escape" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Mode Change" +msgstr "" + +#: src/client/keycode.cpp +msgid "IME Nonconvert" +msgstr "" + +#: src/client/keycode.cpp +msgid "Insert" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Left" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Left Windows" +msgstr "" + +#. ~ Key name, common on Windows keyboards +#: src/client/keycode.cpp +msgid "Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Middle Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Num Lock" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad *" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad +" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad -" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad ." +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad /" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 0" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 2" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 3" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 4" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 5" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 6" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 7" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 8" +msgstr "" + +#: src/client/keycode.cpp +msgid "Numpad 9" +msgstr "" + +#: src/client/keycode.cpp +msgid "OEM Clear" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page down" +msgstr "" + +#: src/client/keycode.cpp +msgid "Page up" +msgstr "" + +#: src/client/keycode.cpp +msgid "Pause" +msgstr "" + +#: src/client/keycode.cpp +msgid "Play" +msgstr "" + +#. ~ "Print screen" key +#: src/client/keycode.cpp +msgid "Print" +msgstr "" + +#: src/client/keycode.cpp +msgid "Return" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Right" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Button" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Control" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Menu" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Right Windows" +msgstr "" + +#: src/client/keycode.cpp +msgid "Scroll Lock" +msgstr "" + +#. ~ Key name +#: src/client/keycode.cpp +msgid "Select" +msgstr "" + +#: src/client/keycode.cpp +msgid "Shift" +msgstr "" + +#: src/client/keycode.cpp +msgid "Sleep" +msgstr "" + +#: src/client/keycode.cpp +msgid "Snapshot" +msgstr "" + +#: src/client/keycode.cpp +msgid "Space" +msgstr "" + +#: src/client/keycode.cpp +msgid "Tab" +msgstr "" + +#: src/client/keycode.cpp +msgid "Up" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 1" +msgstr "" + +#: src/client/keycode.cpp +msgid "X Button 2" +msgstr "" + +#: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp +msgid "Zoom" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Neuspelo preuzimanje $1" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "" + +#: src/gui/guiFormSpecMenu.cpp +msgid "Proceed" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "\"Aux1\" = climb down" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Autoforward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Automatic jumping" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Backward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Change camera" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Chat" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Command" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Console" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Dec. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Double tap \"jump\" to toggle fly" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Drop" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Forward" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. range" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inc. volume" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Inventory" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Jump" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Key already in use" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Keybindings." +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Local command" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Mute" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Next item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Prev. item" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Range select" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp +msgid "Screenshot" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Sneak" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle HUD" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle chat log" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fast" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fly" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle fog" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle minimap" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle noclip" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Toggle pitchmove" +msgstr "" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "press key" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Change" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "New Password" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Old Password" +msgstr "" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +msgid "Exit" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +msgid "Muted" +msgstr "" + +#: src/gui/guiVolumeChange.cpp +#, c-format +msgid "Sound Volume: %d%%" +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). +#: src/network/clientpackethandler.cpp src/script/lua_api/l_client.cpp +msgid "LANG_CODE" +msgstr "sr_Latn" + +#: 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" +"If disabled, virtual joystick will center to first-touch's position." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" +"Can be used to move a desired point to (0, 0) to create a\n" +"suitable spawn point, or to allow 'zooming in' on a desired\n" +"point by increasing 'scale'.\n" +"The default is tuned for a suitable spawn point for Mandelbrot\n" +"sets with default parameters, it may need altering in other\n" +"situations.\n" +"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"(X,Y,Z) scale of fractal in nodes.\n" +"Actual fractal size will be 2 to 3 times larger.\n" +"These numbers can be made very large, the fractal does\n" +"not have to fit inside the world.\n" +"Increase these to 'zoom' into the detail of the fractal.\n" +"Default is for a vertically-squashed shape suitable for\n" +"an island, set all 3 numbers equal for the raw shape." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of ridged mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the shape/size of step mountains." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of ridged mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of rolling hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that controls the size/occurrence of step mountain ranges." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "2D noise that locates the river valleys and channels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D mode parallax strength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining mountain structure and height.\n" +"Also defines structure of floatland mountain terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D noise defining structure of floatlands.\n" +"If altered from the default, the noise 'scale' (0.7 by default) may need\n" +"to be adjusted, as floatland tapering functions best when this noise has\n" +"a value range of approximately -2.0 to 2.0." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining structure of river canyon walls." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise defining terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "3D noise that determines number of dungeons per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"3D support.\n" +"Currently supported:\n" +"- none: no 3d output.\n" +"- anaglyph: cyan/magenta color 3d.\n" +"- interlaced: odd/even line based polarisation screen support.\n" +"- topbottom: split screen top/bottom.\n" +"- sidebyside: split screen side by side.\n" +"- crossview: Cross-eyed 3d\n" +"- pageflip: quadbuffer based 3d.\n" +"Note that the interlaced mode requires shaders to be enabled." +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." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server crashes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "A message to be displayed to all clients when the server shuts down." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Absolute limit of queued blocks to emerge" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration in air" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Acceleration of gravity, in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block management interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active block range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Active object send range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Address to connect to.\n" +"Leave this blank to start a local server.\n" +"Note that the address field in the main menu overrides this setting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adds particles when digging a node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " +"screens." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + +#: src/settings_translation_file.cpp +#, c-format +msgid "" +"Adjusts the density of the floatland layer.\n" +"Increase value to increase density. Can be positive or negative.\n" +"Value = 0.0: 50% of volume is floatland.\n" +"Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" +"to be sure) creates a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Advanced" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Alters the light curve by applying 'gamma correction' to it.\n" +"Higher values make middle and lower light levels brighter.\n" +"Value '1.0' leaves the light curve unaltered.\n" +"This only has significant effect on daylight and artificial\n" +"light, it has very little effect on natural night light." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Always fly fast" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ambient occlusion gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amount of messages a player may send per 10 seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Amplifies the valleys." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Anisotropic filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Announce to this serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Append item name to tooltip." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Apple trees noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Arm inertia" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Arm inertia, gives a more realistic movement of\n" +"the arm when the camera moves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ask to reconnect after crash" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"At this distance the server will aggressively optimize which blocks are sent " +"to\n" +"clients.\n" +"Small values potentially improve performance a lot, at the expense of " +"visible\n" +"rendering glitches (some blocks will not be rendered under water and in " +"caves,\n" +"as well as sometimes on land).\n" +"Setting this to a value greater than max_block_send_distance disables this\n" +"optimization.\n" +"Stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatic forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Automatically report to the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autosave screen size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Autoscaling mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Backward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Base terrain height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Basic privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Beach noise threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bind address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome API noise parameters" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Biome noise" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Bold and italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Bold monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Build inside player" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Increasing can reduce artifacting on weaker GPUs.\n" +"0.1 = Default, 0.25 = Good value for weaker tablets." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera smoothing in cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Camera update toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #1" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave noise #2" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cave2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern taper" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cavern upper limit" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message count limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message kick threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat message max length" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat weblinks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chunk size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Cinematic mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clean transparent textures" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client and Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client modding" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Client side modding restrictions" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Cloud radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds are a client side effect." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Clouds in menu" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Comma-separated list of flags to hide in the content repository.\n" +"\"nonfree\" can be used to hide packages which do not qualify as 'free " +"software',\n" +"as defined by the Free Software Foundation.\n" +"You can also specify content ratings.\n" +"These flags are independent from Minetest versions,\n" +"so see a full list at https://content.minetest.net/help/content_flags/" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Command key" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Connect glass" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connect to external media server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Connects glass if supported by node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Console height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "ContentDB URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Continuous forward" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Controls" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls length of day/night cycle.\n" +"Examples:\n" +"72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Controls steepness/height of hills." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Controls width of tunnels, a smaller value creates wider tunnels.\n" +"Value >= 10.0 completely disables generation of tunnels and avoids the\n" +"intensive noise calculations." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crash message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Creative" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Damage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug info toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log file size threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debug log level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dec. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dedicated server step" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default game" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Default password" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default privileges" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default report format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Default stack size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas where trees have apples." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines areas with sandy beaches." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain and steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines distribution of higher terrain." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines full size of caverns, smaller values create larger caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines large-scale river channel structure." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines location and terrain of optional hills and lakes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the base ground level." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the depth of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river channel." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines the width of the river valley." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Defines tree areas and tree density." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Delay in sending blocks after building" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Delay showing tooltips, stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Deprecated Lua API handling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find giant caverns." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Depth below which you'll find large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Description of server, to be displayed when players join and in the " +"serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Desert noise threshold" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Desynchronize block animation" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Dekoracije" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Digging particles" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disable anticheat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Disallow empty passwords" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Double tap jump for fly" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Double-tapping the jump key toggles fly mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Drop item key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dump the mapgen debug information." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dungeon noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable IPv6 support (for both client and server).\n" +"Required for IPv6 connections to work at all." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Lua modding support on client.\n" +"This support is experimental and API can change." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +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 "" + +#: src/settings_translation_file.cpp +msgid "Enable mod security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable players getting damage and dying." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enable random user input (only used for testing)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable smooth lighting with simple ambient occlusion.\n" +"Disable for speed or for different looks." +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 " +"connecting\n" +"to new servers, but they may not support all new features that you are " +"expecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable usage of remote media server (if provided by server).\n" +"Remote servers offer a significantly faster way to download media (e.g. " +"textures)\n" +"when connecting to the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable vertex buffer objects.\n" +"This should greatly improve graphics performance." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable/disable running an IPv6 server.\n" +"Ignored if bind_address is set.\n" +"Needs enable_ipv6 to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables Hable's 'Uncharted 2' filmic tone mapping.\n" +"Simulates the tone curve of photographic film and how this approximates the\n" +"appearance of high dynamic range images. Mid-range contrast is slightly\n" +"enhanced, highlights and shadows are gradually compressed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables animation of inventory items." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables caching of facedir rotated meshes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Enables minimap." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enables the sound system.\n" +"If disabled, this completely disables all sounds everywhere and the in-game\n" +"sound controls will be non-functional.\n" +"Changing this setting requires a restart." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Exponent of the floatland tapering. Alters the tapering behaviour.\n" +"Value = 1.0 creates a uniform, linear tapering.\n" +"Values > 1.0 create a smooth tapering suitable for the default separated\n" +"floatlands.\n" +"Values < 1.0 (for example 0.25) create a more defined surface level with\n" +"flatter lowlands, suitable for a solid floatland layer." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FSAA" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Factor noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fall bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fallback font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode acceleration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast mode speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fast movement" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Fast movement (via the \"Aux1\" key).\n" +"This requires the \"fast\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Field of view in degrees." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"File in client/serverlist/ that contains your favorite servers displayed in " +"the\n" +"Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filler depth noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Filmic tone mapping" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Filtering and Antialiasing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "First of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed map seed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fixed virtual joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland density" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland maximum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland minimum Y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland taper exponent" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland tapering distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Floatland water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fly key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Flying" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog start" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fog toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font bold by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font italic by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font shadow alpha" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Format of player chat messages. The following strings are valid " +"placeholders:\n" +"@name, @message, @timestamp (optional)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Format of screenshots." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Default Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec Full-Screen Background Opacity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec default background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Formspec full-screen background opacity (between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Forward key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fourth of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fractal type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fraction of the visible distance at which fog starts to be rendered" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are generated for clients, stated in mapblocks (16 " +"nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far blocks are sent to clients, stated in mapblocks (16 nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"From how far clients know about objects, stated in mapblocks (16 nodes).\n" +"\n" +"Setting this larger than active_block_range will also cause the server\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Full screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUI scaling filter txr2img" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Igre" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Global callbacks" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at maximum light level.\n" +"Controls the contrast of the highest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Gradient of light curve at minimum light level.\n" +"Controls the contrast of the lowest light levels." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Ground level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ground noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HTTP mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD scaling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "HUD toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Handling for deprecated Lua API calls:\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" +"- error: abort on usage of deprecated call (suggested for mod developers)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Have the profiler instrument itself:\n" +"* Instrument an empty function.\n" +"This estimates the overhead, that instrumentation is adding (+1 function " +"call).\n" +"* Instrument the sampler being used to update the statistics." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Heat noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Height select noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hill threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness1 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness2 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness3 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hilliness4 noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Homepage of server, to be displayed in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal acceleration in air when jumping or falling,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration in fast mode,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Horizontal and vertical acceleration on ground or when climbing,\n" +"in nodes per second per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar next key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar previous key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 10 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 11 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 12 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 13 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 14 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 15 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 16 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 17 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 18 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 19 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 2 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 20 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 21 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 22 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 23 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 24 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 25 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 26 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 27 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 28 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 29 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 3 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 30 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 31 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 32 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 4 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 5 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 6 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 7 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 8 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Hotbar slot 9 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "How deep to make rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How fast liquid waves will move. Higher = faster.\n" +"If negative, liquid waves will move backwards.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"How long the server will wait before unloading unused mapblocks, stated in " +"seconds.\n" +"Higher value is smoother, but will use more RAM." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Humidity blend noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Humidity variation for biomes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "IPv6 server" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled the server will perform map block occlusion culling based on\n" +"on the eye position of the player. This can reduce the number of blocks\n" +"sent to the client 50-80%. The client will not longer receive most " +"invisible\n" +"so that the utility of noclip mode is reduced." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled together with fly mode, player is able to fly through solid " +"nodes.\n" +"This requires the \"noclip\" privilege on the server." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" +"descending." +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 "" + +#: src/settings_translation_file.cpp +msgid "If enabled, disable cheat prevention in multiplayer." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, makes move directions relative to the player's pitch when flying " +"or swimming." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If enabled, you can place blocks at the position (feet + eye level) where " +"you stand.\n" +"This is helpful when working with nodeboxes in small areas." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"If the CSM restriction for node range is enabled, get_node calls are " +"limited\n" +"to this distance from the player to the node." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"If the file size of debug.txt exceeds the number of megabytes specified in\n" +"this setting when it is opened, the file is moved to debug.txt.1,\n" +"deleting an older debug.txt.1 if it exists.\n" +"debug.txt is only moved if this setting is positive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "If this is set, players will always (re)spawn at the given position." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ignore world errors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console background color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "In-game chat console height, between 0.1 (10%) and 1.0 (100%)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inc. volume key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Initial vertical speed when jumping, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument builtin.\n" +"This is usually only needed by core/builtin contributors" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument chat commands on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument global callback functions on registration.\n" +"(anything you pass to a minetest.register_*() function)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Active Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Instrument the action function of Loading Block Modifiers on registration." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Instrument the methods of entities on registration." +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory items animations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Inventory key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert mouse" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Invert vertical mouse movement." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Italic monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Item entity TTL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Iterations" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Iterations of the recursive function.\n" +"Increasing this increases the amount of fine detail, but also\n" +"increases processing load.\n" +"At iterations = 20 this mapgen has a similar load to mapgen V7." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick ID" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick button repetition interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick frustum sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Joystick type" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"W component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"X component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Y component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Julia set only.\n" +"Z component of hypercomplex constant.\n" +"Alters the shape of the fractal.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia x" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia y" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Julia z" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jump key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Jumping speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for decreasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for dropping the currently selected item.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the viewing range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for increasing the volume.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for jumping.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving fast in fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player backward.\n" +"Will also disable autoforward, when active.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player forward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player left.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for moving the player right.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for muting the game.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window to type local commands.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the chat window.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for opening the inventory.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 11th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 12th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 13th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 14th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 15th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 16th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 17th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 18th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 19th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 20th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 21st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 22nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 23rd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 24th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 25th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 26th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 27th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 28th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 29th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 30th hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 31st hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the 32nd hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the eighth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fifth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the first hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the fourth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the next item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the ninth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the previous item in the hotbar.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the second hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the seventh hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the sixth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the tenth hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for selecting the third hotbar slot.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for sneaking.\n" +"Also used for climbing down and descending in water if aux1_descends is " +"disabled.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for switching between first- and third-person camera.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for taking screenshots.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling autoforward.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling cinematic mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling display of minimap.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling fast mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling flying.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling noclip mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling pitch move mode.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the camera update. Only used for development\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of chat.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of debug info.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of fog.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the HUD.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the large chat console.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling the display of the profiler. Used for development.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key for toggling unlimited view range.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Key to use view zoom when possible.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +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 "" + +#: src/settings_translation_file.cpp +msgid "Lake steepness" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lake threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Language" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large cave proportion flooded" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Large chat console key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Leaves style" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Leaves style:\n" +"- Fancy: all faces visible\n" +"- Simple: only outer faces, if defined special_tiles are used\n" +"- Opaque: disable transparency" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Left key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of a server tick and the interval at which objects are generally " +"updated over\n" +"network, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of liquid waves.\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +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, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Length of time between active block management cycles, stated in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Level of logging to be written to debug.txt:\n" +"- <nothing> (no logging)\n" +"- none (messages with no level)\n" +"- error\n" +"- warning\n" +"- action\n" +"- info\n" +"- verbose\n" +"- trace" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost center" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve boost spread" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Light curve high gradient" +msgstr "" + +#: src/settings_translation_file.cpp +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" +"Value is stored per-world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Limits number of parallel HTTP requests. Affects:\n" +"- Media fetch if server uses remote_media setting.\n" +"- Serverlist download and server announcement.\n" +"- Downloads performed by main menu (e.g. mod manager).\n" +"Only has an effect if compiled with cURL." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid fluidity smoothing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid loop max" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid queue purge time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid sinking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update interval in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Liquid update tick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Load the game profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Load the game profiler to collect game profiling data.\n" +"Provides a /profiler command to access the compiled profile.\n" +"Useful for mod developers and server operators." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Loading Block Modifiers" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Lower Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Main menu script" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Make fog and sky colors depend on daytime (dawn/sunset) and view direction." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Makes all liquids opaque" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map directory" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen Carpathian." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Fractal.\n" +"'terrain' enables the generation of non-fractal terrain:\n" +"ocean, islands and underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen Valleys.\n" +"'altitude_chill': Reduces heat with altitude.\n" +"'humid_rivers': Increases humidity around rivers.\n" +"'vary_river_depth': If enabled, low humidity and high heat causes rivers\n" +"to become shallower and occasionally dry.\n" +"'altitude_dry': Reduces humidity with altitude." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation attributes specific to Mapgen v5." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v6.\n" +"The 'snowbiomes' flag enables the new 5 biome system.\n" +"When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" +"the 'jungles' flag is ignored." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Map generation attributes specific to Mapgen v7.\n" +"'ridges': Rivers.\n" +"'floatlands': Floating land masses in the atmosphere.\n" +"'caverns': Giant caves deep underground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map generation limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map save interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock limit" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generation delay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock mesh generator's MapBlock cache size in MB" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapblock unload timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Carpathian specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Flat specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Fractal specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V5 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V6 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen V7 specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen Valleys specific flags" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen debug" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mapgen name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block generate distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max block send distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max liquids processed per step." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. clearobjects extra blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Max. packets per iteration" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum forceloaded blocks" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum hotbar width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum liquid resistance. Controls deceleration when entering liquid at\n" +"high speed." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of blocks that are simultaneously sent per client.\n" +"The maximum total count is calculated dynamically:\n" +"max_total = ceil((#clients + max_users) * per_client / 4)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of blocks that can be queued for loading." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of forceloaded mapblocks." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of packets sent per send step, if you have a slow connection\n" +"try reducing it, but don't reduce it to a number below double of targeted\n" +"client number." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of players that can be connected simultaneously." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of recent chat messages to show" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum number of statically stored objects in a block." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum objects per block" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Maximum simultaneous block sends per client" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum size of the out chat queue" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum users" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mesh cache" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Message of the day displayed to players connecting." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Method used to highlight selected object." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimal level of logging to be written to chat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimap scan height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of large caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum limit of random number of small caves per mapchunk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Minimum texture size" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Modifies the size of the HUD elements." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain height noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain variation noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mountain zero level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mouse sensitivity multiplier." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mud noise" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Mute key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Mute sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of map generator to be used when creating a new world.\n" +"Creating a world in the main menu will override this.\n" +"Current mapgens in a highly unstable state:\n" +"- The optional floatlands of v7 (disabled by default)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the player.\n" +"When running a server, clients connecting with this name are admins.\n" +"When starting from the main menu, this is overridden." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Name of the server, to be displayed when players join and in the serverlist." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Near plane" +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 "" + +#: src/settings_translation_file.cpp +msgid "Noclip" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noclip key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Node highlighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "NodeTimer interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Noises" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Number of emerge threads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Number of emerge threads to use.\n" +"Value 0:\n" +"- Automatic selection. The number of emerge threads will be\n" +"- 'number of processors - 2', with a lower limit of 1.\n" +"Any other value:\n" +"- Specifies the number of emerge threads, with a lower limit of 1.\n" +"WARNING: Increasing the number of emerge threads increases engine mapgen\n" +"speed, but this may harm game performance by interfering with other\n" +"processes, especially in singleplayer and/or when running Lua code in\n" +"'on_generated'. For many users the optimum setting may be '1'." +msgstr "" + +#: src/settings_translation_file.cpp +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 "Opaque liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Open the pause menu when the window's focus is lost. Does not pause if a " +"formspec is\n" +"open." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Optional override for chat weblink color." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Path to shader directory. If no path is defined, default location will be " +"used." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Path to texture directory. All textures are first searched from here." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Pause on lost window focus" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks load from disk" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Per-player limit of queued blocks to generate" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Physics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Pitch move mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + +#: 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 transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Player versus player" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Prevent mods from doing insecure things like running shell commands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Print the engine's profiling data in regular intervals (in seconds).\n" +"0 = disable. Useful for developers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Privileges that players with basic_privs can grant" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Profiler toggle key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Prometheus listener address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Prometheus listener address.\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"enable metrics listener for Prometheus on that address.\n" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Proportion of large caves that contain liquid." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Radius of cloud area stated in number of 64 node cloud squares.\n" +"Values larger than 26 will start to produce sharp cutoffs at cloud area " +"corners." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Raises terrain to make valleys around the rivers." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Random input" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Range select key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Recent Chat Messages" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Regular font path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote media" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Remote port" +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Replaces the default main menu with a custom one." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Report path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Restricts the access of certain client-side functions on servers.\n" +"Combine the byteflags below to restrict client-side features, or set to 0\n" +"for no restrictions:\n" +"LOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\n" +"CHAT_MESSAGES: 2 (disable send_chat_message call client-side)\n" +"READ_ITEMDEFS: 4 (disable get_item_def call client-side)\n" +"READ_NODEDEFS: 8 (disable get_node_def call client-side)\n" +"LOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (disable get_player_names call client-side)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridge underwater noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Ridged mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Right key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River channel width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "River valley width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rollback recording" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hill size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Rolling hills spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Round minimap" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Safe digging and placing" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sandy beaches occur when np_beach exceeds this value." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save the map received by the client on disk." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Save window size automatically when modified." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Saving map received from server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Scale GUI by a user specified value.\n" +"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n" +"This will smooth over some of the rough edges, and blend\n" +"pixels when scaling down, at the cost of blurring some\n" +"edge pixels when images are scaled by non-integer sizes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screen width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot folder" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot format" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshot quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Screenshot quality. Only used for JPEG format.\n" +"1 means worst quality; 100 means best quality.\n" +"Use 0 for default quality." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Seabed noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Second of two 3D noises that together define tunnels." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box border color (R,G,B)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Selection box width" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Selects one of 18 fractal types.\n" +"1 = 4D \"Roundy\" Mandelbrot set.\n" +"2 = 4D \"Roundy\" Julia set.\n" +"3 = 4D \"Squarry\" Mandelbrot set.\n" +"4 = 4D \"Squarry\" Julia set.\n" +"5 = 4D \"Mandy Cousin\" Mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" Julia set.\n" +"7 = 4D \"Variation\" Mandelbrot set.\n" +"8 = 4D \"Variation\" Julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" Mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" Julia set.\n" +"11 = 3D \"Christmas Tree\" Mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" Julia set.\n" +"13 = 3D \"Mandelbulb\" Mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" Julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" Mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" Julia set.\n" +"17 = 4D \"Mandelbulb\" Mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" Julia set." +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server" +msgstr "Vlazne reke" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server URL" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server address" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server description" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server name" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server port" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: 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 "" + +#: src/settings_translation_file.cpp +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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving leaves.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving liquids (like water).\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable waving plants.\n" +"Requires shaders to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shader path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shaders allow advanced visual effects and may increase performance on some " +"video\n" +"cards.\n" +"This only works with the OpenGL video backend." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Shadow offset (in pixels) of the default font. If 0, then shadow will not be " +"drawn." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow strength gamma" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shape of the minimap. Enabled = round, disabled = square." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show debug info" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show entity selection boxes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).\n" +"WARNING!: There is no benefit, and there are several dangers, in\n" +"increasing this value above 5.\n" +"Reducing this value increases cave and dungeon density.\n" +"Altering this value is for special usage, leaving it unchanged is\n" +"recommended." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Size of the MapBlock cache of the mesh generator. Increasing this will\n" +"increase the cache hit %, reducing the data being copied from the main\n" +"thread, thus reducing jitter." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slice w" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Slope and fill work together to modify the heights." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave maximum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small cave minimum number" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale humidity variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Small-scale temperature variation for blending biomes on borders." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooth lighting" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Smooths camera when looking around. Also called look or mouse smoothing.\n" +"Useful for recording videos." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera in cinematic mode. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Smooths rotation of camera. 0 to disable." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneak key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sneaking speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Sound" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Specifies URL from which client fetches media instead of using UDP.\n" +"$filename should be accessible from $remote_media$filename via cURL\n" +"(obviously, remote_media should end with a slash).\n" +"Files that are not present will be fetched the usual way." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Spread of light curve boost range.\n" +"Controls the width of the range to be boosted.\n" +"Standard deviation of the light curve boost Gaussian." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Static spawnpoint" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Steepness noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain size noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Step mountain spread noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strength of 3D mode parallax." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Strength of light curve boost.\n" +"The 3 'boost' parameters define a range of the light\n" +"curve that is boosted in brightness." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strict protocol checking" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Strip color codes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Surface level of optional water placed on a solid floatland layer.\n" +"Water is disabled by default and will only be placed if this value is set\n" +"to above 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' (the start of the\n" +"upper tapering).\n" +"***WARNING, POTENTIAL DANGER TO WORLDS AND SERVER PERFORMANCE***:\n" +"When enabling water placement the floatlands must be configured and tested\n" +"to be a solid layer by setting 'mgv7_floatland_density' to 2.0 (or other\n" +"required value depending on 'mgv7_np_floatland'), to avoid\n" +"server-intensive extreme water flow and to avoid vast flooding of the\n" +"world surface below." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Synchronous SQLite" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Terrain base noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain higher noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for hills.\n" +"Controls proportion of world area covered by hills.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Terrain noise threshold for lakes.\n" +"Controls proportion of world area covered by lakes.\n" +"Adjust towards 0.0 for a larger proportion." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Terrain persistence noise" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Texture path" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Textures on a node may be aligned either to the node or to the world.\n" +"The former mode suits better things like machines, furniture, etc., while\n" +"the latter makes stairs and microblocks fit surroundings better.\n" +"However, as this possibility is new, thus may not be used by older servers,\n" +"this option allows enforcing it for certain node types. Note though that\n" +"that is considered EXPERIMENTAL and may not work properly." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The URL for the content repository" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The default format in which profiles are being saved,\n" +"when calling `/profiler save [format]` without format." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The depth of dirt or other biome filler node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The file path relative to your worldpath in which profiles will be saved to." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The identifier of the joystick to use" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The length in pixels it takes for touch screen interaction to start." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The maximum height of the surface of waving liquids.\n" +"4.0 = Wave height is two nodes.\n" +"0.0 = Wave doesn't move at all.\n" +"Default is 1.0 (1/2 node).\n" +"Requires waving liquids to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The network interface that the server listens on." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The radius of the volume of blocks around every player that is subject to " +"the\n" +"active block stuff, stated in mapblocks (16 nodes).\n" +"In active blocks objects are loaded and ABMs run.\n" +"This is also the minimum range in which active objects (mobs) are " +"maintained.\n" +"This should be configured together with active_object_send_range_blocks." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The rendering back-end.\n" +"A restart is required after changing this.\n" +"Note: On Android, stick with OGLES1 if unsure! App may fail to start " +"otherwise.\n" +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The sensitivity of the joystick axes for moving the\n" +"in-game view frustum around." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The strength (darkness) of node ambient-occlusion shading.\n" +"Lower is darker, Higher is lighter. The valid range of values for this\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time (in seconds) that the liquids queue may grow beyond processing\n" +"capacity until an attempt is made to decrease its size by dumping old queue\n" +"items. A value of 0 disables the functionality." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated events\n" +"when holding down a joystick button combination." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "The type of joystick" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"The vertical distance over which heat drops by 20 if 'altitude_chill' is\n" +"enabled. Also the vertical distance over which humidity drops by 10 if\n" +"'altitude_dry' is enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Third of 4 2D noises that together define hill/mountain range height." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Time of day when a new world is started, in millihours (0-23999)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time send interval" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Time speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Timeout for client to remove unused map data from memory, in seconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"To reduce lag, block transfers are slowed down when a player is building " +"something.\n" +"This determines how long they are slowed down after placing or removing a " +"node." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Toggle camera mode key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Tooltip delay" +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "Trilinear filtering" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"True = 256\n" +"False = 128\n" +"Usable to make minimap smoother on slower machines." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Trusted mods" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "URL to the server list displayed in the Multiplayer Tab." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Undersampling" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Undersampling is similar to using a lower screen resolution, but it applies\n" +"to the game world only, keeping the GUI intact.\n" +"It should give a significant performance boost at the cost of less detailed " +"image.\n" +"Higher values result in a less detailed image." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unlimited player transfer distance" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Unload unused server data" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of dungeons." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Upper Y limit of floatlands." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use 3D cloud look instead of flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use a cloud animation for the main menu background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use anisotropic filtering when viewing at textures from an angle." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Use bilinear filtering when scaling textures." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "VSync" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley depth" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley fill" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley profile" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Valley slope" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of biome filler depth." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of maximum mountain height (in nodes)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Variation of number of caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Variation of terrain vertical scale.\n" +"When noise is < -0.55 terrain is near-flat." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies depth of biome surface nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Varies roughness of terrain.\n" +"Defines the 'persistence' value for terrain_base and terrain_alt noises." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Varies steepness of cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical climbing speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Vertical screen synchronization." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Video driver" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View bobbing factor" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View distance in nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range decrease key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View range increase key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "View zoom key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Viewing range" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Virtual joystick triggers Aux1 button" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Volume" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Volume of all sounds.\n" +"Requires the sound system to be enabled." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"W coordinate of the generated 3D slice of a 4D fractal.\n" +"Determines which 3D slice of the 4D shape is generated.\n" +"Alters the shape of the fractal.\n" +"Has no effect on 3D fractals.\n" +"Range roughly -2 to 2." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking and flying speed, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Walking, flying and climbing speed in fast mode, in nodes per second." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water level" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Water surface level of the world." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving Nodes" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving leaves" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave height" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wave speed" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving liquids wavelength" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Waving plants" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter is true, all GUI images need to be\n" +"filtered in software, but some images are generated directly\n" +"to hardware (e.g. render-to-texture for nodes in inventory)." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When gui_scaling_filter_txr2img is true, copy those images\n" +"from hardware to software for scaling. When false, fall back\n" +"to the old scaling method, for video drivers that don't\n" +"properly support downloading textures back from hardware." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" +"can be blurred, so automatically upscale them with nearest-neighbor\n" +"interpolation to preserve crisp pixels. This sets the minimum texture size\n" +"for the upscaled textures; higher values look sharper, but require more\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" +"This is also used as the base node texture size for world-aligned\n" +"texture autoscaling." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Whether node texture animations should be desynchronized per mapblock." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to allow players to damage and kill each other." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Whether to fog out the end of the visible area." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Whether to mute sounds. You can unmute sounds at any time, unless the\n" +"sound system is disabled (enable_sound=false).\n" +"In-game, you can toggle the mute state with the mute key or by using the\n" +"pause menu." +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 "" + +#: src/settings_translation_file.cpp +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Width of the selection box lines around nodes." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Windows systems only: Start Minetest with the command line window in the " +"background.\n" +"Contains the same information as the file debug.txt (default name)." +msgstr "" + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "World start time" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"World-aligned textures may be scaled to span several nodes. However,\n" +"the server may not send the scale you want, especially if you use\n" +"a specially-designed texture pack; with this option, the client tries\n" +"to determine the scale automatically basing on the texture size.\n" +"See also texture_min_size.\n" +"Warning: This option is EXPERIMENTAL!" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "World-aligned textures mode" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of flat ground." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y of mountain density gradient zero level. Used to shift mountains " +"vertically." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y of upper limit of large caves." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-distance over which caverns expand to full size." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Y-distance over which floatlands taper from full density to nothing.\n" +"Tapering starts at this distance from the Y limit.\n" +"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 "" + +#: src/settings_translation_file.cpp +msgid "Y-level of average terrain surface." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of cavern upper limit." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of higher terrain that creates cliffs." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Y-level of lower terrain and seabed." +msgstr "" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "cURL parallel limit" +msgstr "" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Preuzmi jednu sa minetest.net" + +#~ msgid "View" +#~ msgstr "Pogled" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Umro/la si." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/sv/minetest.po b/po/sv/minetest.po index 296e0b5bb..ccf9a1cd3 100644 --- a/po/sv/minetest.po +++ b/po/sv/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Swedish (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-03-31 10:14+0000\n" -"Last-Translator: sfan5 <sfan5@live.de>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-07-24 09:25+0000\n" +"Last-Translator: ROllerozxa <temporaryemail4meh+github@gmail.com>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/minetest/" "minetest/sv/>\n" "Language: sv\n" @@ -12,24 +12,90 @@ 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.0-dev\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Rensa chattkön" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Tomt kommando." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Avsluta till huvudmeny" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Ogiltigt kommando: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Utfärdat kommando: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Lista över spelare online" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Spelare online: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Den utgående chattkön är nu tom." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Detta kommando är inaktiverat av servern." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" -msgstr "Återföds" +msgstr "Återuppstå" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" msgstr "Du dog" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Tillgängliga kommandon:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Tillgängliga kommandon: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Kommando inte tillgängligt: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Få hjälp med kommandon" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Använd '.help <cmd>' för att få mer information, eller '.help all' för att " +"visa allt." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<inget tillgängligt>" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred in a Lua script:" -msgstr "Ett fel uppstod i ett Lua-skript, såsom en mod:" +msgstr "Ett fel uppstod i ett Lua-skript:" #: builtin/fstk/ui.lua msgid "An error occurred:" @@ -47,13 +113,37 @@ msgstr "Återanslut" msgid "The server has requested a reconnect:" msgstr "Servern har begärt en återanslutning:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Laddar..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "En ny $1version är tillgänglig" + +#: builtin/mainmenu/common.lua +msgid "Client Mods" +msgstr "Klientmoddar" + +#: 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 "" +"Installerad version: $1\n" +"Ny version: $2\n" +"Besök $3 och se hur man får den nyaste versionen och håller en uppdaterad " +"med funktioner och buggfixar." + +#: builtin/mainmenu/common.lua +msgid "Later" +msgstr "Senare" + +#: builtin/mainmenu/common.lua +msgid "Never" +msgstr "Aldrig" #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " -msgstr "Protokollversionen matchar ej. " +msgstr "Protokollversionen matchar inte. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " @@ -64,9 +154,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Servern stöder protokollversioner mellan $1 och $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "" -"Försök återaktivera allmän serverlista och kolla din internetanslutning." +msgid "Visit website" +msgstr "Besök hemsida" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,23 +165,32 @@ msgstr "Vi stöder endast protokollversion $1." msgid "We support protocol versions between version $1 and $2." msgstr "Vi stöder protokollversioner mellan version $1 och $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Enabled, has error)" +msgstr "(Aktiverad, har fel)" + +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Unsatisfied)" +msgstr "(Ej nöjd)" + +#: 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 "Avbryt" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Beroenden:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable all" -msgstr "Inaktivera allt" +msgstr "Avaktivera alla" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" @@ -100,7 +198,7 @@ msgstr "Avaktivera modpaket" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "Aktivera alla" +msgstr "Aktivera allt" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" @@ -116,34 +214,31 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Hitta Fler Moddar" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No (optional) dependencies" -msgstr "Valfria beroenden:" +msgstr "Inga (valfria) beroenden" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." msgstr "Ingen spelbeskrivning tillgänglig." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "Inga beroenden." +msgstr "Inga hårda beroenden" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." msgstr "Ingen modpaketsbeskrivning tillgänglig." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No optional dependencies" -msgstr "Valfria beroenden:" +msgstr "Inga valfria beroenden" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" @@ -162,29 +257,67 @@ msgstr "Värld:" msgid "enabled" msgstr "aktiverad" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" finns redan. Vill du skriva över den?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 och $2 beroende paket kommer installeras." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 till $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 laddas ner,\n" +"$2 köad" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 laddas ner..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 nödvändiga beroenden kunde inte hittas." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 kommer att installeras och $2 beroenden hoppas över." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Alla paket" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Redan installerad" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Tillbaka till huvudmeny" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "Basspel:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "ContentDB är inte tillgänglig när Minetest är kompilerad utan cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Laddar..." +msgstr "Laddar ner..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" msgstr "Misslyckades ladda ner $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Spel" @@ -193,7 +326,18 @@ msgid "Install" msgstr "Installera" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Installera $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Installera saknade beroenden" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Installation: Filtyp stöds inte eller trasigt arkiv" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Moddar" @@ -206,9 +350,24 @@ msgid "No results" msgstr "Inga resultat" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Sök" +msgid "No updates" +msgstr "Inga uppdateringar" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Hittades inte" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Skriv över" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Var snäll se att basspelet är korrekt." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Köad" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -223,8 +382,12 @@ msgid "Update" msgstr "Uppdatera" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Uppdatera Alla [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Visa mer information i en webbläsare" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -232,99 +395,91 @@ msgstr "En värld med namnet \"$1\" finns redan" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Ytterligare terräng" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -#, fuzzy msgid "Altitude chill" msgstr "Altitudkyla" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "Altitudkyla" +msgstr "Altitudtorka" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "Biotopoljud" +msgstr "Biotopblandning" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "Biotopoljud" +msgstr "Biotoper" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "Grottoljud" +msgstr "Grottor" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "Oktaver" +msgstr "Grottor" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "Skapa" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Modinformation:" +msgstr "Dekorationer" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Ladda ner ett spel, såsom Minetest Game, från minetest.net" +msgid "Development Test is meant for developers." +msgstr "Development Test är avsett för utvecklare." #: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Ladda ner ett från minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Dungeons" -msgstr "Grottoljud" +msgstr "Fängelsehålor" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Platt terräng" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "" +msgstr "Svävande landmassor i himlen" #: builtin/mainmenu/dlg_create_world.lua msgid "Floatlands (experimental)" -msgstr "" - -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Spel" +msgstr "Floatlands (experimentellt)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Generera icke-fraktal terräng: Oceaner och underjord" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Kullar" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" -msgstr "" +msgstr "Fuktiga floder" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" -msgstr "" +msgstr "Ökar luftfuktigheten runt floderna" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install a game" +msgstr "Installera ett spel" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "Installera ett annat spel" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "Sjöar" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgstr "Låg luftfuktighet och hög värme orsakar grunda eller torra floder" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" @@ -332,24 +487,23 @@ msgstr "Kartgenerator" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "" +msgstr "Kartgenerator-flaggor" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Kartgenerator" +msgstr "Kartgenerator-specifika flaggor" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "Berg" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Lerflöde" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Nätverk med tunnlar och grottor" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" @@ -357,20 +511,19 @@ msgstr "Inget spel valt" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Minskar värmen efter höjd" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Minskar luftfuktigheten efter höjd" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Rivers" -msgstr "Grottoljud" +msgstr "Floder" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Havsnivåfloder" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua @@ -379,50 +532,47 @@ msgstr "Frö" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Smidig övergång mellan biotoper" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Strukturer som förekommer i terrängen (ingen effekt på träd och djungelgräs " +"som skapats av v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Strukturer som förekommer i terrängen, vanligtvis träd och växter" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Tempererad, Öken" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Tempererad, Öken, Djungel" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Tempererad, Öken, Djungel, Tundra, Tajga" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "Erosion av terrängytan" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Träd- och djungelgräs" #: builtin/mainmenu/dlg_create_world.lua msgid "Vary river depth" -msgstr "" +msgstr "Varierande floddjup" #: 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 "Varning: Minimala utvecklingstestet är avsett för utvecklare." +msgstr "Mycket stora grottor djupt ner i underjorden" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -440,22 +590,50 @@ msgstr "Är du säker på att du vill radera \"$1\"?" #: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua #: src/client/keycode.cpp msgid "Delete" -msgstr "Radera" +msgstr "Ta bort" #: builtin/mainmenu/dlg_delete_content.lua -#, fuzzy msgid "pkgmgr: failed to delete \"$1\"" -msgstr "Modhanterare: misslyckades radera \"$1\"" +msgstr "pkgmgr: misslyckades att radera \"$1\"" #: builtin/mainmenu/dlg_delete_content.lua -#, fuzzy msgid "pkgmgr: invalid path \"$1\"" -msgstr "Modhanterare: ogiltig modsökväg \"$1\"" +msgstr "pkgmgr: ogiltig sökväg \"$1\"" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" msgstr "Radera värld \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Bekräfta Lösenord" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "Ansluter till $1" + +#: builtin/mainmenu/dlg_register.lua +msgid "Missing name" +msgstr "Namn saknas" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Name" +msgstr "Namn" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Lösenord" + +#: builtin/mainmenu/dlg_register.lua +msgid "Passwords do not match" +msgstr "Lösenorden passar inte" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "Registrera" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Acceptera" @@ -469,15 +647,16 @@ msgid "" "This modpack has an explicit name given in its modpack.conf which will " "override any renaming here." msgstr "" +"Detta moddpaket har ett uttryckligt namn angett i modpack.conf vilket går " +"före namnändring här." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" msgstr "(Ingen beskrivning av inställning angiven)" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "2D Noise" -msgstr "Grotta2 oljud" +msgstr "2D-Brus" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" @@ -488,6 +667,14 @@ msgid "Browse" msgstr "Bläddra" #: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Games" +msgstr "Innehåll: Spel" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Mods" +msgstr "Innehåll: Moddar" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Inaktiverad" @@ -512,7 +699,7 @@ msgid "Offset" msgstr "Förskjutning" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Persistens" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -531,16 +718,19 @@ msgstr "Återställ till Ursprungsvärden" msgid "Scale" msgstr "Skala" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Sök" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Välj katalog" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Select file" -msgstr "Välj modfil:" +msgstr "Välj fil" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Visa tekniska namn" @@ -582,15 +772,14 @@ msgstr "Z-spridning" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "absvalue" -msgstr "" +msgstr "absolutvärde" #. ~ "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 -#, fuzzy msgid "defaults" -msgstr "Standardspel" +msgstr "standarder" #. ~ "eased" is a noise parameter flag. #. It is used to make the map smoother and @@ -598,135 +787,140 @@ msgstr "Standardspel" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "eased" -msgstr "" +msgstr "lättad" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "$1 (Enabled)" -msgstr "Aktiverad" +msgstr "$1 (Aktiverad)" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "$1 mods" -msgstr "3D-läge" +msgstr "$1 moddar" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" msgstr "Misslyckades installera $1 till $2" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "Modinstallation: lyckas ej hitta riktiga modnamnet för: $1" +msgstr "Moddinstallation: Lyckades ej hitta riktiga moddnamnet för: $1" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Install Mod: Unable to find suitable folder name for modpack $1" -msgstr "Modinstallation: lyckas ej hitta lämpligt mappnamn för modpaket $1" +msgstr "Moddinstallation: lyckas ej hitta lämpligt mappnamn för moddpaket $1" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"\n" -"Modinstallation: ej stöd för filtyp \"$1\" eller trasigt arkiv" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: file: \"$1\"" -msgstr "Modinstallation: fil: \"$1\"" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to find a valid mod or modpack" -msgstr "Modinstallation: lyckas ej hitta lämpligt mappnamn för modpaket $1" +msgstr "Lyckades ej hitta lämplig modd eller moddpaket" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a $1 as a texture pack" -msgstr "Misslyckades installera $1 till $2" +msgstr "Misslyckades att installera $1 som ett texturpaket" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a game as a $1" -msgstr "Misslyckades installera $1 till $2" +msgstr "Misslyckades installera ett spel som en $1" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a mod as a $1" -msgstr "Misslyckades installera $1 till $2" +msgstr "Misslyckades installera en modd som en $1" #: builtin/mainmenu/pkgmgr.lua -#, fuzzy msgid "Unable to install a modpack as a $1" -msgstr "Misslyckades installera $1 till $2" +msgstr "Misslyckades installera moddpaket som en $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Laddar..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Den offentliga serverlistan är inaktiverad" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Försök återaktivera allmän serverlista och kolla din internetanslutning." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Om" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Aktiva bidragande" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Aktiv renderer:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Huvudutvecklare" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Öppna Användardatamappen" + +#: 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 "" +"Öppnar mappen som innehåller världar, spel, moddar,\n" +"och texturpaket i en filhanterare." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Före detta bidragande" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Före detta huvudutvecklare" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "Dela felsökningslogg" #: builtin/mainmenu/tab_content.lua msgid "Browse online content" -msgstr "" +msgstr "Bläddra bland onlineinnehåll" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Content" -msgstr "Fortsätt" +msgstr "Innehåll" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Disable Texture Pack" -msgstr "Välj texturpaket:" +msgstr "Inaktivera Texturpaket" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Information:" -msgstr "Modinformation:" +msgstr "Information:" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Installed Packages:" -msgstr "Installerade moddar:" +msgstr "Installerade paket:" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." msgstr "Inga beroenden." #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "No package description available" -msgstr "Ingen modbeskrivning tillgänglig" +msgstr "Ingen paketbeskrivning tillgänglig" #: builtin/mainmenu/tab_content.lua msgid "Rename" msgstr "Byt namn" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Uninstall Package" -msgstr "Avinstallera vald mod" +msgstr "Avinstallera Paket" #: builtin/mainmenu/tab_content.lua -#, fuzzy msgid "Use Texture Pack" -msgstr "Texturpaket" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Aktiva Bidragande" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Huvudutvecklare" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Medverkande" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Före detta bidragande" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Före detta huvudutvecklare" +msgstr "Använd Texturpaket" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" @@ -737,32 +931,24 @@ msgid "Bind Address" msgstr "Bindningsadress" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Konfigurera" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Kreativt läge" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" -msgstr "Aktivera Skada" +msgstr "Aktivera skada" #: builtin/mainmenu/tab_local.lua msgid "Host Game" -msgstr "Bilda Spel" +msgstr "Hosta spel" #: builtin/mainmenu/tab_local.lua msgid "Host Server" -msgstr "Bilda Server" +msgstr "Hosta server" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Namn/Lösenord" +msgstr "Installera spel från ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -773,14 +959,17 @@ msgid "No world created or selected!" msgstr "Ingen värld skapad eller vald!" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Play Game" msgstr "Starta spel" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Välj moddar" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Välj värld:" @@ -790,51 +979,65 @@ msgid "Server Port" msgstr "Serverport" #: builtin/mainmenu/tab_local.lua -#, fuzzy msgid "Start Game" -msgstr "Bilda Spel" +msgstr "Starta spel" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adress / Port" +msgid "Address" +msgstr "Adress" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Anslut" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Rensa" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Kreativt läge" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Skada aktiverat" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Radera Favorit" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favoritmarkera" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Skada / PvP" + +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Favoriter" + +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Inkompatibla servrar" #: builtin/mainmenu/tab_online.lua -#, fuzzy msgid "Join Game" -msgstr "Bilda Spel" +msgstr "Anslut till spel" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Namn / Lösenord" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "Logga in" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP aktiverat" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Offentliga servrar" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Uppdatera" + +#: builtin/mainmenu/tab_online.lua +msgid "Remove favorite" +msgstr "Radera favorit" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Serverbeskrivning" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "(kräver spelstöd)" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -853,20 +1056,14 @@ msgid "8x" msgstr "8x" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "All Settings" -msgstr "Inställningar" +msgstr "Alla inställningar" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" msgstr "Kantutjämning:" #: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Är du säker på att du vill starta om din enspelarvärld?" - -#: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Autosave Screen Size" msgstr "Spara fönsterstorlek automatiskt" @@ -874,25 +1071,37 @@ msgstr "Spara fönsterstorlek automatiskt" msgid "Bilinear Filter" msgstr "Bilinjärt filter" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Stötkartläggning" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Ändra Tangenter" #: builtin/mainmenu/tab_settings.lua msgid "Connected Glass" -msgstr "Sammankopplat glas" +msgstr "Sammanfogat glas" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dynamiska skuggor" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "Dynamiska skuggor:" #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" -msgstr "Fina Löv" +msgstr "Sofistikerade löv" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "" +msgid "High" +msgstr "Hög" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Låg" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Medium" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -902,10 +1111,6 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Aniso-filter" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Nej" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Inget filter" @@ -924,7 +1129,7 @@ msgstr "Nodkontur" #: builtin/mainmenu/tab_settings.lua msgid "None" -msgstr "Ingen" +msgstr "Inget" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" @@ -934,18 +1139,10 @@ msgstr "Ogenomskinliga löv" msgid "Opaque Water" msgstr "Ogenomskinligt vatten" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parrallax Ocklusion" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Partiklar" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Starta om enspelarvärld" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Skärm:" @@ -958,9 +1155,13 @@ msgstr "Inställningar" msgid "Shaders" msgstr "Shaders" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Shaders (experimentella)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" -msgstr "" +msgstr "Shaders (otillgängliga)" #: builtin/mainmenu/tab_settings.lua msgid "Simple Leaves" @@ -974,53 +1175,43 @@ msgstr "Utjämnad Belysning" msgid "Texturing:" msgstr "Texturering:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "För att aktivera shaders behöver OpenGL-drivern användas." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Tonmappning" #: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Touchthreshold: (px)" -msgstr "Touch-tröskel (px)" +msgid "Touch threshold (px):" +msgstr "Touch-tröskel (px):" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Trilinjärt filter" #: builtin/mainmenu/tab_settings.lua -msgid "Waving Leaves" -msgstr "Vajande Löv" +msgid "Very High" +msgstr "Extremt hög" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Väldigt Låg" + +#: builtin/mainmenu/tab_settings.lua +msgid "Waving Leaves" +msgstr "Vajande löv" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Waving Liquids" -msgstr "Vajande Löv" +msgstr "Vajande vätskor" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" -msgstr "Vajande Växter" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ja" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Konfigurera moddar" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Huvudsaklig" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Starta Enspelarläge" +msgstr "Vajande växter" #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "Anslutningsfel (protokollfel?)." + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Anslutningens tidsgräns nådd." @@ -1049,12 +1240,12 @@ msgid "Connection error (timed out?)" msgstr "Anslutningsfel (tidsgräns nådd?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Kunde inte hitta eller ladda spel \"" +msgid "Could not find or load game: " +msgstr "Kunde inte hitta eller ladda spel: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." -msgstr "Ogiltiga spelspecifikationer." +msgstr "Ogiltig spelspecifikation." #: src/client/clientlauncher.cpp msgid "Main Menu" @@ -1062,7 +1253,7 @@ msgstr "Huvudmeny" #: src/client/clientlauncher.cpp msgid "No world selected and no address provided. Nothing to do." -msgstr "Ingen värld vald och ingen adress försed. Inget kan göras." +msgstr "Ingen värld vald och ingen adress anginven. Inget att göra." #: src/client/clientlauncher.cpp msgid "Player name too long." @@ -1070,27 +1261,15 @@ msgstr "Spelarnamn för långt." #: src/client/clientlauncher.cpp msgid "Please choose a name!" -msgstr "Välj ett namn!" +msgstr "Vänligen välj ett namn!" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " -msgstr "" +msgstr "Den angivna lösenordsfilen kunde inte öppnas: " #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " -msgstr "Den angivna sökvägen för världen existerar inte: " - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" +msgstr "Angiven världssökväg existerar inte: " #: src/client/game.cpp msgid "" @@ -1098,31 +1277,19 @@ msgid "" "Check debug.txt for details." msgstr "" "\n" -"Läs debug.txt för detaljer." +"Se debug.txt för detaljer." #: src/client/game.cpp -#, fuzzy msgid "- Address: " -msgstr "Bindningsadress" - -#: src/client/game.cpp -#, fuzzy -msgid "- Creative Mode: " -msgstr "Kreativt läge" - -#: src/client/game.cpp -#, fuzzy -msgid "- Damage: " -msgstr "Aktivera skada" +msgstr "- Bindningsadress: " #: src/client/game.cpp msgid "- Mode: " msgstr "- Läge: " #: src/client/game.cpp -#, fuzzy msgid "- Port: " -msgstr "Port" +msgstr "- Port: " #: src/client/game.cpp msgid "- Public: " @@ -1138,47 +1305,78 @@ msgid "- Server Name: " msgstr "- Servernamn: " #: src/client/game.cpp -#, fuzzy +msgid "A serialization error occurred:" +msgstr "Ett serialiseringsfel uppstod:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Åtkomst nekad. Anledning: %s" + +#: src/client/game.cpp msgid "Automatic forward disabled" -msgstr "Tangent för filmiskt länge" +msgstr "Automatiskt framåt inaktiverad" #: src/client/game.cpp -#, fuzzy msgid "Automatic forward enabled" -msgstr "Tangent för filmiskt länge" +msgstr "Automatiskt framåt aktiverat" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Blockgränser dolda" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Blockgränser visas för alla block" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Blockgränser visas för det aktuella blocket" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Blockgränser visas för närliggande block" #: src/client/game.cpp -#, fuzzy msgid "Camera update disabled" -msgstr "Av/på-tangent för kamerauppdatering" +msgstr "Kamerauppdatering inaktiverad" #: src/client/game.cpp -#, fuzzy msgid "Camera update enabled" -msgstr "Av/på-tangent för kamerauppdatering" +msgstr "Kamerauppdatering aktiverat" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Kan inte visa blockgränser (avaktiverad av modd eller spel)" #: src/client/game.cpp msgid "Change Password" -msgstr "Ändra Lösenord" +msgstr "Ändra lösenord" #: src/client/game.cpp -#, fuzzy msgid "Cinematic mode disabled" -msgstr "Tangent för filmiskt länge" +msgstr "Filmiskt länge inaktiverad" #: src/client/game.cpp -#, fuzzy msgid "Cinematic mode enabled" -msgstr "Tangent för filmiskt länge" +msgstr "Filmiskt länge aktiverat" + +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Klienten frånkopplades" #: src/client/game.cpp msgid "Client side scripting is disabled" -msgstr "" +msgstr "Klientsidiga skriptar är inaktiverade" #: src/client/game.cpp msgid "Connecting to server..." msgstr "Ansluter till server..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Anslutningen misslyckades av okänd anledning" + #: src/client/game.cpp msgid "Continue" msgstr "Fortsätt" @@ -1191,13 +1389,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1207,15 +1405,20 @@ msgstr "" "- %s: rör dig åt vänster\n" "- %s: rör dig åt höger\n" "- %s: hoppa/klättra\n" +"- %s: gräv/slå\n" +"- %s: använd\n" "- %s: smyg/rör dig nedåt\n" "- %s: släpp föremål\n" "- %s: förråd\n" "- Mus: vänd/titta\n" -"- Vänsterklick: gräv/slå\n" -"- Högerklick: placera/använd\n" "- Mushjul: välj föremål\n" "- %s: chatt\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Kunde inte lösa adressen: %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "Skapar klient..." @@ -1226,16 +1429,15 @@ msgstr "Skapar server..." #: src/client/game.cpp msgid "Debug info and profiler graph hidden" -msgstr "" +msgstr "Felsökningsinfo och profileringsgraf gömd" #: src/client/game.cpp -#, fuzzy msgid "Debug info shown" -msgstr "Av/På tangent för debuginformation" +msgstr "Felsökningsinfo visas" #: src/client/game.cpp msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "" +msgstr "Felsökningsinfo, profileringsgraf och wireframe gömd" #: src/client/game.cpp msgid "" @@ -1267,11 +1469,16 @@ msgstr "" #: src/client/game.cpp msgid "Disabled unlimited viewing range" -msgstr "" +msgstr "Inaktiverat obegränsat visningsområde" #: src/client/game.cpp msgid "Enabled unlimited viewing range" -msgstr "" +msgstr "Aktiverat obegränsat visningsområde" + +#: src/client/game.cpp +#, c-format +msgid "Error creating client: %s" +msgstr "Fel vid skapande av klient: %s" #: src/client/game.cpp msgid "Exit to Menu" @@ -1279,43 +1486,39 @@ msgstr "Avsluta till Meny" #: src/client/game.cpp msgid "Exit to OS" -msgstr "Avsluta till Operativsystem" +msgstr "Avsluta till OS" #: src/client/game.cpp msgid "Fast mode disabled" -msgstr "" +msgstr "Snabbt läge inaktiverat" #: src/client/game.cpp -#, fuzzy msgid "Fast mode enabled" -msgstr "Skada aktiverat" +msgstr "Snabbläge aktiverat" #: src/client/game.cpp msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "" +msgstr "Snabbt läge aktiverat (notera: inget 'fast'-tillstånd)" #: src/client/game.cpp msgid "Fly mode disabled" -msgstr "" +msgstr "Flygläge inaktiverat" #: src/client/game.cpp -#, fuzzy msgid "Fly mode enabled" -msgstr "Skada aktiverat" +msgstr "Flygläge aktiverat" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "" +msgstr "Flygläge aktiverat (notera: inget 'fast'-tillstånd)" #: src/client/game.cpp -#, fuzzy msgid "Fog disabled" -msgstr "Inaktiverad" +msgstr "Dimma inaktiverad" #: src/client/game.cpp -#, fuzzy msgid "Fog enabled" -msgstr "aktiverad" +msgstr "Dimma aktiverat" #: src/client/game.cpp msgid "Game info:" @@ -1347,48 +1550,23 @@ msgstr "MiB/s" #: src/client/game.cpp msgid "Minimap currently disabled by game or mod" -msgstr "" +msgstr "Minimapp för närvarande inaktiverad av spel eller modd" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +msgstr "Flerspelarläge" #: src/client/game.cpp msgid "Noclip mode disabled" -msgstr "" +msgstr "Noclipläge inaktiverat" #: src/client/game.cpp -#, fuzzy msgid "Noclip mode enabled" -msgstr "Skada aktiverat" +msgstr "Noclipläge aktiverat" #: src/client/game.cpp msgid "Noclip mode enabled (note: no 'noclip' privilege)" -msgstr "" +msgstr "Noclipläge aktiverat (notera: inget 'noclip'-tillstånd)" #: src/client/game.cpp msgid "Node definitions..." @@ -1404,15 +1582,15 @@ msgstr "På" #: src/client/game.cpp msgid "Pitch move mode disabled" -msgstr "" +msgstr "Höjdförändringsläge avaktiverad" #: src/client/game.cpp msgid "Pitch move mode enabled" -msgstr "" +msgstr "Höjdförändringsläge aktiverad" #: src/client/game.cpp msgid "Profiler graph shown" -msgstr "" +msgstr "Profileringsgraf visas" #: src/client/game.cpp msgid "Remote server" @@ -1435,37 +1613,50 @@ msgid "Sound Volume" msgstr "Ljudvolym" #: src/client/game.cpp -#, fuzzy msgid "Sound muted" -msgstr "Ljudvolym" +msgstr "Ljudvolym avstängd" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Ljudsystem är inaktiverad" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Ljudsystem stöds inte i detta bygge" #: src/client/game.cpp -#, fuzzy msgid "Sound unmuted" -msgstr "Ljudvolym" +msgstr "Ljud påsatt" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Servern kör troligtvist en annan version av %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Kan inte ansluta till %s eftersom IPv6 är inaktiverad" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "Kan inte lyssna på %s eftersom IPv6 är inaktiverad" + +#: src/client/game.cpp +#, c-format msgid "Viewing range changed to %d" -msgstr "Volym ändrad till to %d%%" +msgstr "Visningsområde ändrad till %d" #: src/client/game.cpp #, c-format msgid "Viewing range is at maximum: %d" -msgstr "" +msgstr "Visningsområde är vid sitt maximala: %d" #: src/client/game.cpp #, c-format msgid "Viewing range is at minimum: %d" -msgstr "" +msgstr "Visningsområde är vid sitt minimala: %d" #: src/client/game.cpp #, c-format @@ -1474,59 +1665,53 @@ msgstr "Volym ändrad till to %d%%" #: src/client/game.cpp msgid "Wireframe shown" -msgstr "" +msgstr "Wireframe visas" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "" +msgstr "Zoom är för närvarande inaktiverad av spel eller modd" #: src/client/game.cpp msgid "ok" msgstr "ok" #: src/client/gameui.cpp -#, fuzzy msgid "Chat hidden" -msgstr "Chattangent" +msgstr "Chatt gömd" #: src/client/gameui.cpp msgid "Chat shown" -msgstr "" +msgstr "Chatt visas" #: src/client/gameui.cpp msgid "HUD hidden" -msgstr "" +msgstr "HUD gömd" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "" +msgstr "HUD visas" #: src/client/gameui.cpp msgid "Profiler hidden" -msgstr "" +msgstr "Profilering gömd" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" +msgstr "Profilering visas (sida %d av %d)" #: src/client/keycode.cpp msgid "Apps" msgstr "Appar" #: src/client/keycode.cpp -#, fuzzy msgid "Backspace" -msgstr "Tillbaka" +msgstr "Backspace" #: src/client/keycode.cpp msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Rensa" - #: src/client/keycode.cpp msgid "Control" msgstr "Kontroll" @@ -1682,11 +1867,11 @@ msgstr "Rensa OEM" #: src/client/keycode.cpp msgid "Page down" -msgstr "" +msgstr "Sida ner" #: src/client/keycode.cpp msgid "Page up" -msgstr "" +msgstr "Sida upp" #: src/client/keycode.cpp msgid "Pause" @@ -1774,52 +1959,65 @@ msgstr "X Knapp 2" msgid "Zoom" msgstr "Zoom" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Lösenorden matchar inte!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Minimapp gömd" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimapp i radarläge, Zoom x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimapp i ytläge, Zoom x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimapp i texturläge" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Misslyckades att öppna hemsida" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Öppnar hemsida" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Fortsätt" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy -msgid "\"Special\" = climb down" -msgstr "\"Använd\" = klättra neråt" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = klättra neråt" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Autoforward" -msgstr "Framåt" +msgstr "Autoframåt" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" -msgstr "" +msgstr "Automatiskt hopp" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Bakåt" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy -msgid "Change camera" -msgstr "Ändra tangenter" +msgid "Block bounds" +msgstr "Blockgränser" #: src/gui/guiKeyChangeMenu.cpp +msgid "Change camera" +msgstr "Ändra kamera" + +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Chatta" @@ -1833,7 +2031,7 @@ msgstr "Konsol" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. range" -msgstr "" +msgstr "Min. räckvidd" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. volume" @@ -1841,7 +2039,7 @@ msgstr "Sänk volym" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "Dubbeltryck \"hoppa\" för att slå på/av flygande" +msgstr "Dubbeltr. \"hoppa\" för att växla flygläge" #: src/gui/guiKeyChangeMenu.cpp msgid "Drop" @@ -1853,7 +2051,7 @@ msgstr "Framåt" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. range" -msgstr "" +msgstr "Höj räckvidd" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" @@ -1872,10 +2070,8 @@ msgid "Key already in use" msgstr "Tangent används redan" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "" -"Tangentbindningar. (Om den här menyn strular, radera saker från minetest." -"conf)" +msgid "Keybindings." +msgstr "Tagentbordsbindningar." #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1899,65 +2095,52 @@ msgstr "Välj räckvidd" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Screenshot" -msgstr "" +msgstr "Skärmdump" #: src/gui/guiKeyChangeMenu.cpp msgid "Sneak" msgstr "Smyg" #: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle HUD" -msgstr "Slå av/på flygläge" +msgstr "Växla HUD" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle chat log" -msgstr "Slå av/på snabb" +msgstr "Växla chattlog" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "Slå av/på snabb" +msgstr "Växla snabbläge" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fly" -msgstr "Slå av/på flygläge" +msgstr "Växla flygläge" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle fog" -msgstr "Slå av/på flygläge" +msgstr "Växla dimma" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle minimap" -msgstr "Slå av/på noclip" +msgstr "Växla minimapp" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle noclip" -msgstr "Slå av/på noclip" +msgstr "Växla noclip" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle pitchmove" -msgstr "Slå av/på snabb" +msgstr "Växla höjdförändr." #: src/gui/guiKeyChangeMenu.cpp msgid "press key" -msgstr "tryck på tangent" +msgstr "tryck på knapp" #: src/gui/guiPasswordChange.cpp msgid "Change" msgstr "Ändra" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Bekräfta Lösenord" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Nytt Lösenord" @@ -1966,24 +2149,22 @@ msgstr "Nytt Lösenord" msgid "Old Password" msgstr "Gammalt Lösenord" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Lösenorden matchar inte!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Avsluta" #: src/gui/guiVolumeChange.cpp -#, fuzzy msgid "Muted" -msgstr "Tysta" +msgstr "Tyst" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Ljudvolym: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Enter " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Ljudvolym: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1992,21 +2173,37 @@ msgstr "Enter " msgid "LANG_CODE" msgstr "sv" +#: src/network/clientpackethandler.cpp +msgid "" +"Name is not registered. To create an account on this server, click 'Register'" +msgstr "" +"Namnet är inte registrerat. För att skapa ett konto på servern, tryck " +"'Registrera'" + +#: src/network/clientpackethandler.cpp +msgid "Name is taken. Please choose another name" +msgstr "Namnet är redan taget. Var snäll välj ett annat namn" + #: 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) Fastställer den virtuella joystickens position.\n" +"Om inaktiverad centreras den virtuella joysticken till det första " +"fingertryckets position." #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Använd den virtuella joysticken för \"Aux1\"-knappen.\n" +"Om aktiverad kommer den virtuella joysticken att aktivera \"Aux1\"-knappen " +"när den är utanför huvudcirkeln." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "(X,Y,Z) offset of fractal from world center in units of 'scale'.\n" "Can be used to move a desired point to (0, 0) to create a\n" @@ -2018,10 +2215,13 @@ msgid "" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" "(X,Y,Z) förskjutning av fraktal från världscenter i enheten 'skala'.\n" -"Används för att flytta ett passande spawn-område av lågland nära (0, 0).\n" -"Ursprungsvärdena passar mandelbrotmängder, de behöver ändras för " -"juliamängder.\n" -"Värden mellan -2 to 2. Multiplicera med 'skala' för avvikelse i noder." +"Kan användas för att förflytta en punkt till (0, 0) för att skapa en\n" +"passande spawnpunkt, eller för att tillåta inzoomning på en specifik\n" +"punkt genom att höja 'scale'.\n" +"Ursprungsvärdena passar en spawnpunkt för mandelbrotmängder,\n" +"den kan behöva ändras i andra situationer.\n" +"Värdegräns mellan -2 och 2. Multiplicera med 'skala för avvikelse\n" +"i noder." #: src/settings_translation_file.cpp msgid "" @@ -2033,42 +2233,41 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax ocklusion med sluttningsinformation (snabbare).\n" -"1 = reliefmappning (långsammare, noggrannare)." +"(X,Y,Z) fraktalens skala i noder.\n" +"Den riktiga storleken kommer att vara 2 till 3 gånger större.\n" +"Siffrorna kan göras mycket stora, men fraktalen\n" +"behöver inte rymmas i världen.\n" +"Öka dessa för att 'zooma' in i fraktalens detaljer.\n" +"Standardvärdet är för en vertikalt mosad form som passar för\n" +"en ö, ställ in alla 3 siffrorna lika för den ursprungliga formen." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" +msgstr "2D-brus som styr formen/storleken på berg." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgstr "2D-brus som styr formen/storleken av rullande kullar." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgstr "2D-brus som styr formen/storleken på steppberg." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" +msgstr "2D-brus som styr storleken/förekomsten av bergskedjor med rågångar." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +msgstr "2D-brus som styr storleken/förekomsten av rullande kullar." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" +msgstr "2D-brus som styr storleken/förekomsten av bergskedjor med rågångar." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgstr "2D-brus som lokaliserar floddalar och kanaler." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2080,7 +2279,7 @@ msgstr "3D-läge" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" -msgstr "" +msgstr "Parallaxstyrka i 3D-läge" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2101,26 +2300,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-brus som definierar strukturen hos floatlands.\n" +"Om det ändras från standardvärdet kan brusets 'skala' (vanligtvist 0.7) " +"behöva\n" +"justeras, eftersom avsmalningen av floatlands fungerar bäst när detta brus " +"har\n" +"ett värdeintervall på ungefär -2.0 till 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." msgstr "3D oljudsdefiniering av strukturen av floddalsväggar." #: src/settings_translation_file.cpp -#, fuzzy msgid "3D noise defining terrain." -msgstr "3D oljudsdefinierade jättegrottor" +msgstr "3D brusdefinierad terräng." #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." -msgstr "" +msgstr "3D-brus för bergsöverhäng, klippor osv. Vanligtvist små variationer." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" +msgstr "3D-brus som bestämmer antalet fängelsehålor per mappchunk." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "3D support.\n" "Currently supported:\n" @@ -2140,7 +2343,13 @@ msgstr "" "- interlaced: skärmstöd för ojämn/jämn linjebaserad polarisering.\n" "- topbottom: split screen över/under.\n" "- sidebyside: split screen sida vid sida.\n" -"- pageflip: quadbufferbaserad 3d." +"- crossview: Korsögad 3d\n" +"- pageflip: quadbufferbaserad 3d.\n" +"Notera att 'interlaced'-läget kräver shaders." + +#: src/settings_translation_file.cpp +msgid "3d" +msgstr "3D" #: src/settings_translation_file.cpp msgid "" @@ -2160,12 +2369,15 @@ msgstr "Ett meddelande som visas för alla klienter när servern stängs ner." #: src/settings_translation_file.cpp msgid "ABM interval" -msgstr "" +msgstr "ABM-intervall" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "ABM-tidsbudget" #: src/settings_translation_file.cpp -#, fuzzy msgid "Absolute limit of queued blocks to emerge" -msgstr "Absolut gräns av emerge kö" +msgstr "Absolut gräns för köade block att framträda" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2173,16 +2385,15 @@ msgstr "Acceleration i luften" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "Accelerering av gravitation, i noder per sekund per sekund." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" msgstr "Aktiva Blockmodifierare" #: src/settings_translation_file.cpp -#, fuzzy msgid "Active block management interval" -msgstr "Aktivt Blockhanteringsintervall" +msgstr "Aktivt blockhanteringsintervall" #: src/settings_translation_file.cpp msgid "Active block range" @@ -2215,6 +2426,12 @@ msgstr "" "Justera dpi-konfigurationen för din skärm (endast icke X11/Android) t.ex. " "för 4k-skärmar." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Justera den identifierade skärmdensiteten, vilket används för skalning av " +"gränssnittet." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2224,6 +2441,15 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Justerar tätheten hos floatlandslagret.\n" +"Öka värdet för att öka tätheten. Kan vara positiv eller negativ.\n" +"Värde = 0.0: 50% av volymen är floatland.\n" +"Värde = 2.0 (kan vara högre beroende på 'mgv7_np_floatland', testa alltid\n" +"för att vara säker) skapar ett fast floatlandslager." + +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "Administratörsnamn" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2237,10 +2463,16 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" +"Ändrar ljuskurvan genom att tillämpa 'gammakorrigering' på den.\n" +"Högre värden leder till att de mellersta och lägre ljusnivåerna blir " +"ljusare.\n" +"Värdet '1.0' lämnar ljuskurvan oförändrad. Detta har endast betydande\n" +"effekt på dagsljus och konstgjort ljus, det har väldigt liten effekt på\n" +"naturligt nattljus." #: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "Alltid flygläge och snabb" +msgid "Always fly fast" +msgstr "Flyg alltid snabbt" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -2248,12 +2480,11 @@ msgstr "Ambient ocklusion gamma" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "Antal meddelanden en spelare får skicka per 10 sekunder." #: src/settings_translation_file.cpp -#, fuzzy msgid "Amplifies the valleys." -msgstr "Amplifiera dalgångar" +msgstr "Amplifierar dalgångarna." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" @@ -2264,17 +2495,16 @@ msgid "Announce server" msgstr "Offentliggör server" #: src/settings_translation_file.cpp -#, fuzzy msgid "Announce to this serverlist." -msgstr "Offentliggör server" +msgstr "Annonsera till serverlistan." #: src/settings_translation_file.cpp msgid "Append item name" -msgstr "" +msgstr "Infoga objektnamn" #: src/settings_translation_file.cpp msgid "Append item name to tooltip." -msgstr "" +msgstr "Infoga objektnamn till verktygstips." #: src/settings_translation_file.cpp msgid "Apple trees noise" @@ -2282,20 +2512,21 @@ msgstr "Äppelträdlojud" #: src/settings_translation_file.cpp msgid "Arm inertia" -msgstr "" +msgstr "Armtröghet" #: src/settings_translation_file.cpp msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" +"Armtröghet, ger mer realistisk rörelse av armen\n" +"när kameran förflyttar sig." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" msgstr "Förfråga att återkoppla efter krash" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "At this distance the server will aggressively optimize which blocks are sent " "to\n" @@ -2309,27 +2540,32 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" -"Vid detta avstånd kommer servern att aggressivt omtimera vilka block som " -"skickas till klienterna.\n" +"Vid detta avstånd kommer servern att aggressivt optimera vilka block som " +"skickas till\n" +"klienterna.\n" "Små värden kan potentiellt förbättra prestandan avsevärt, på bekostnaden av " -"synliga renderingsglitchar.\n" -"(vissa block kommer inte att renderas under vatten och i grottor, ibland " -"även på land)\n" +"synliga\n" +"renderingsglitchar (vissa block kommer inte att renderas under vatten och i " +"grottor,\n" +"ibland även på land).\n" "Sätts detta till ett värde större än max_block_send_distance inaktiveras " -"denna optimering.\n" -"Angiven i mapblocks (16 noder)" +"denna\n" +"optimering.\n" +"Angiven i mapblocks (16 noder)." + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "Ljud" #: src/settings_translation_file.cpp -#, fuzzy msgid "Automatic forward key" -msgstr "Tangent för filmiskt länge" +msgstr "Automatisk framåtknapp" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." -msgstr "" +msgstr "Hoppa automatiskt upp över enstaka noder hinder." #: src/settings_translation_file.cpp -#, fuzzy msgid "Automatically report to the serverlist." msgstr "Rapportera automatiskt till serverlistan." @@ -2339,7 +2575,15 @@ msgstr "Spara fönsterstorlek automatiskt" #: src/settings_translation_file.cpp msgid "Autoscaling mode" -msgstr "" +msgstr "Automatiskt skalningsläge" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1-knappen" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Aux1-knappen för klättring/sjunkning" #: src/settings_translation_file.cpp msgid "Backward key" @@ -2347,21 +2591,15 @@ msgstr "Bakåttangent" #: src/settings_translation_file.cpp msgid "Base ground level" -msgstr "" +msgstr "Grundnivå" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base terrain height." -msgstr "Bas för terränghöjd" +msgstr "Bas för terränghöjd." #: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Grundläggande" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Basic privileges" -msgstr "Grundläggande Privilegier" +msgstr "Grundläggande privilegier" #: src/settings_translation_file.cpp msgid "Beach noise" @@ -2380,7 +2618,7 @@ msgid "Bind address" msgstr "Bindesadress" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +msgid "Biome API noise parameters" msgstr "API temperatur- och fuktighetsoljudsparametrar för biotoper" #: src/settings_translation_file.cpp @@ -2388,28 +2626,28 @@ msgid "Biome noise" msgstr "Biotopoljud" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Bits per pixel (dvs färgdjup) i fullskärmsläge." +msgid "Block send optimize distance" +msgstr "Distans för optimering av blockskickning" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" -msgstr "" +msgid "Bobbing" +msgstr "Guppande" #: src/settings_translation_file.cpp msgid "Bold and italic font path" -msgstr "" +msgstr "Fet och kursiv typsnittssökväg" #: src/settings_translation_file.cpp msgid "Bold and italic monospace font path" -msgstr "" +msgstr "Fet och kursiv monospace-typsnittssökväg" #: src/settings_translation_file.cpp msgid "Bold font path" -msgstr "" +msgstr "Fet typsnittssökväg" #: src/settings_translation_file.cpp msgid "Bold monospace font path" -msgstr "" +msgstr "Fet monospace-typsnittssökväg" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2420,8 +2658,8 @@ msgid "Builtin" msgstr "Inbyggd" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bumpmappning" +msgid "Camera" +msgstr "Kamera" #: src/settings_translation_file.cpp msgid "" @@ -2430,6 +2668,11 @@ msgid "" "Increasing can reduce artifacting on weaker GPUs.\n" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" +"Kameraavståndet 'nära urklippsplan' i noder, mellan 0 och 0.25\n" +"Fungerar bara på GLES-plattformar. De flesta användare behöver inte ändra " +"detta.\n" +"Ökning kan minska artefakter på svagare GPU:er.\n" +"0.1 = Standard, 0.25 = Bra värde för svagare tabletter." #: src/settings_translation_file.cpp msgid "Camera smoothing" @@ -2441,7 +2684,7 @@ msgstr "Kamerautjämning i filmiskt läge" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "Av/på-tangent för kamerauppdatering" +msgstr "Växeltagent för kamerauppdatering" #: src/settings_translation_file.cpp msgid "Cave noise" @@ -2484,65 +2727,60 @@ msgid "Cavern threshold" msgstr "Grottröskel" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cavern upper limit" -msgstr "Grottbegränsning" +msgstr "Övre grottbegränsning" #: 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 "" +"Center för ljuskurvans förstärkningsområde.\n" +"0.0 är minsta ljusnivå, 1.0 är högsta ljusnivå." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +msgid "Chat command time message threshold" +msgstr "Chattkommando tidströskel" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Chattkommandon" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "Chunkstorlek" +msgstr "Chattens typsnittsstorlek" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "Chattangent" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Nivå av debuglogg" +msgstr "Chattens loggnivå" #: src/settings_translation_file.cpp msgid "Chat message count limit" -msgstr "" +msgstr "Gräns för antalet chattmeddelanden" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message format" -msgstr "Krashmeddelande" +msgstr "Chattmeddelandeformat" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message kick threshold" -msgstr "Oljudströskel för öken" +msgstr "Chattmeddelandens sparkningströskel" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "Högsta längd för chattmeddelande" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "Chattangent Av/På" +msgstr "Tagent för växling av chattangent" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Chattkommandon" +msgid "Chat weblinks" +msgstr "Weblänkar i chatt" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2560,6 +2798,14 @@ msgstr "Tangent för filmiskt länge" msgid "Clean transparent textures" msgstr "Rena transparenta texturer" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Klickbara weblänkar (mellanklicka eller Ctrl+vänsterklicka) aktiverad i " +"chattkonsolens utdata." + #: src/settings_translation_file.cpp msgid "Client" msgstr "Klient" @@ -2573,13 +2819,16 @@ msgid "Client modding" msgstr "Klientmoddande" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client side modding restrictions" -msgstr "Klientmoddande" +msgstr "Begränsningar för klientmoddning" #: src/settings_translation_file.cpp msgid "Client side node lookup range restriction" -msgstr "" +msgstr "Begränsing av klientsidig nodsökningsområde" + +#: src/settings_translation_file.cpp +msgid "Client-side Modding" +msgstr "Klientmoddande" #: src/settings_translation_file.cpp msgid "Climbing speed" @@ -2605,6 +2854,10 @@ msgstr "Moln i meny" msgid "Colored fog" msgstr "Färgad dimma" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Färgad dimma" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2615,6 +2868,13 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" +"Kommaseparerad lista av flaggar som ska döljas i innehållsdatabasen.\n" +"\"nonfree\" kan användas för att gömma paket som inte kvalifieras som 'fri " +"programvara',\n" +"per Free Software Foundations definition.\n" +"Du kan även specifiera innehållsvarningar.\n" +"Dessa flaggor är oberoende från Minetest-versioner,\n" +"så en full lista finns på https://content.minetest.net/help/content_flags/" #: src/settings_translation_file.cpp msgid "" @@ -2638,6 +2898,30 @@ msgstr "" msgid "Command key" msgstr "Kommandotangent" +#: src/settings_translation_file.cpp +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 "" +"Komprimeringsnivå att använda när mappblock sparas till disk.\n" +"-1 - använd standardnivå\n" +"0 - minst komprimering, snabbast\n" +"9 - bäst komprimering, långsammast" + +#: src/settings_translation_file.cpp +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 "" +"Komprimeringsnivå att använda när mappblock skickas till klienten.\n" +"-1 - använd standardnivå\n" +"0 - minst komprimering, snabbast\n" +"9 - bäst komprimering, långsammast" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Sammankoppla glas" @@ -2663,13 +2947,20 @@ msgid "Console height" msgstr "Konsolhöjd" #: src/settings_translation_file.cpp -msgid "ContentDB Flag Blacklist" -msgstr "" +msgid "Content Repository" +msgstr "Innehållsdatabas" + +#: src/settings_translation_file.cpp +msgid "ContentDB Flag Blacklist" +msgstr "ContentDB Flaggsvartlista" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB Högsta Parallella Nedladdningar" #: src/settings_translation_file.cpp -#, fuzzy msgid "ContentDB URL" -msgstr "Fortsätt" +msgstr "ContentDB URL" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -2680,25 +2971,33 @@ msgid "" "Continuous forward movement, toggled by autoforward key.\n" "Press the autoforward key again or the backwards movement to disable." msgstr "" +"Kontinuerlig framåtgående rörelse, växlas med hjälp av autoforward-" +"tagenten.\n" +"Tryck på autoforward-knappen igen eller på bakåtknappen för att inaktivera." #: src/settings_translation_file.cpp msgid "Controls" msgstr "Kontrollerar" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Controls length of day/night cycle.\n" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" -"Kontrollerar längden av cyklerna för dag/natt\n" -"Exempel: 72 = 20min, 360 = 4min, 1 = 24timme, 0 = dag/natt/whatever förblir " +"Kontrollerar längden av cyklerna för dag/natt.\n" +"Exempel:\n" +"72 = 20min, 360 = 4min, 1 = 24timme, 0 = dag/natt/någonting förblir " "oförändrat." #: 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 "" +"Styr hastigheten för sjunkande när man står stilla. Negativa värden leder " +"till att\n" +"du flyter upp istället." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." @@ -2714,6 +3013,9 @@ msgid "" "Value >= 10.0 completely disables generation of tunnels and avoids the\n" "intensive noise calculations." msgstr "" +"Kontrollerar tunnlarnas bredd, ett mindre värde ger bredare tunnlar.\n" +"Värde >= 10.0 inaktiverar helt generering av tunnlar och undviker\n" +"intensiva brusberäkningar." #: src/settings_translation_file.cpp msgid "Crash message" @@ -2728,16 +3030,24 @@ msgid "Crosshair alpha" msgstr "Hårkorsalpha" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Hårkorsalpha (ogenomskinlighet, mellan 0 och 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Hårkorsalpha (ogenomskinlighet, mellan 0 och 255).\n" +"Kontrollerar även objektets hårkorsfärg." #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Hårkorsfärg" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Hårkorsförg (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Hårkorsfärg (R,G,B).\n" +"Styr även hårkorsets färg på objektet" #: src/settings_translation_file.cpp msgid "DPI" @@ -2752,21 +3062,20 @@ msgid "Debug info toggle key" msgstr "Av/På tangent för debuginformation" #: src/settings_translation_file.cpp -#, fuzzy msgid "Debug log file size threshold" -msgstr "Oljudströskel för öken" +msgstr "Felsökningslogg storlekströskel" #: src/settings_translation_file.cpp msgid "Debug log level" msgstr "Nivå av debuglogg" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Tangent för volymsänkning" +msgid "Debugging" +msgstr "Felsökning" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" +msgid "Dec. volume key" +msgstr "Tangent för volymsänkning" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2801,17 +3110,19 @@ msgid "Default report format" msgstr "Standardformat för rapporter" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Standardspel" +msgstr "Standardstapelstorlekar" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Standardtimeout för cURL, i millisekunder.\n" -"Har bara en effekt om kompilerat med cURL." +"Definiera kvaliteten på skuggfiltrering.\n" +"Detta simulerar den mjuka skuggeffekten genom att tillämpa en PCF- eller " +"Poisson-skiva\n" +"men använder också mer resurser." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2822,16 +3133,12 @@ msgid "Defines areas with sandy beaches." msgstr "Definierar områden med sandstränder." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" -"Definierar områden för högre (klipptopp-)terräng och påverkar sluttningen av " -"klippor." +msgstr "Definierar distribuering för högre terräng och sluttningen av klippor." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines distribution of higher terrain." -msgstr "Definierar områden för 'terrain_higher' (klipptoppsteräng)." +msgstr "Definierar områden för högre terräng." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." @@ -2847,22 +3154,12 @@ msgid "Defines location and terrain of optional hills and lakes." msgstr "Definierar plats och terräng för valfria kullar och sjöar." #: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Definierar samplingssteg av textur.\n" -"Högre värden resulterar i jämnare normalmappning." - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the base ground level." -msgstr "Definierar trädområden och trädtäthet." +msgstr "Definierar basnivån." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the depth of the river channel." -msgstr "Definierar trädområden och trädtäthet." +msgstr "Definierar djupet av älvkanalen." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." @@ -2870,14 +3167,12 @@ msgstr "" "Definierar maximal distans för spelarförflyttning i block (0 = oändligt)." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river channel." -msgstr "Definierar strukturen för storskaliga älvkanaler." +msgstr "Definierar bredden för älvkanaler." #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river valley." -msgstr "Definierar områden där träd har äpplen." +msgstr "Definierar bredden för floddalar." #: src/settings_translation_file.cpp msgid "Defines tree areas and tree density." @@ -2906,9 +3201,8 @@ msgid "Deprecated Lua API handling" msgstr "Obruklig Lua API hantering" #: src/settings_translation_file.cpp -#, fuzzy msgid "Depth below which you'll find giant caverns." -msgstr "Djup inunder du kan hitta stora grottor." +msgstr "Djup neråt där du kan hitta enorma grottor." #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." @@ -2926,18 +3220,25 @@ msgid "Desert noise threshold" msgstr "Oljudströskel för öken" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Deserts occur when np_biome exceeds this value.\n" "When the 'snowbiomes' flag is enabled, this is ignored." msgstr "" -"Öknar förekommer när np_biome överskridet detta värde.\n" -"När det nya biotopsystemet aktiveras så ignoreras detta." +"Öknar förekommer när np_biome överskrider detta värde.\n" +"Detta ignoreras när 'snowbiomes' flaggen är aktiverad." #: src/settings_translation_file.cpp msgid "Desynchronize block animation" msgstr "Desynkronisera blockanimation" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "Utvecklarinställningar" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Gräv-knapp" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Grävpartiklar" @@ -2950,94 +3251,125 @@ msgstr "Inaktivera antifusk" msgid "Disallow empty passwords" msgstr "Tillåt inte tomma lösenord" +#: src/settings_translation_file.cpp +msgid "Display Density Scaling Factor" +msgstr "Skalningsfaktor för displaytäthet" + +#: 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ännamn för server, att visas i serverlistan." #: src/settings_translation_file.cpp msgid "Double tap jump for fly" -msgstr "" +msgstr "Dubbeltryck på hoppknapp för att flyga" #: src/settings_translation_file.cpp msgid "Double-tapping the jump key toggles fly mode." -msgstr "" +msgstr "Om du trycker på hoppknappen aktiveras flygläge." #: src/settings_translation_file.cpp msgid "Drop item key" -msgstr "" +msgstr "Släpp objekt-tagent" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug information." -msgstr "" +msgstr "Dumpa felsökningsinformation för kartgeneratorn." #: src/settings_translation_file.cpp msgid "Dungeon maximum Y" -msgstr "" +msgstr "Maximalt Y för fängelsehålor" #: src/settings_translation_file.cpp msgid "Dungeon minimum Y" -msgstr "" +msgstr "Minimalt Y för fängelsehålor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Dungeon noise" -msgstr "Grottoljud" +msgstr "Grottbrus" #: src/settings_translation_file.cpp msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" +"Aktivera IPv6-stöd (för både klient och server).\n" +"Krävs för att IPv6-anslutningar ska fungera." #: src/settings_translation_file.cpp msgid "" "Enable Lua modding support on client.\n" "This support is experimental and API can change." msgstr "" +"Aktivera stöd för Lua-modifiering på klienten.\n" +"Detta är experimentellt och API:et kan ändras." + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Aktivera Poisson-diskfiltrering.\n" +"När aktiverad används Poisson-disk för att göra \"mjuka skuggor\". Annars " +"används PCF-filtrering." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Aktivera färgade skuggor.\n" +"När aktiverad kastar genomskinliga noder färgade skuggor. Detta är intensivt." #: src/settings_translation_file.cpp msgid "Enable console window" -msgstr "" +msgstr "Aktivera konsollfönster" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" +msgid "Enable creative mode for all players" +msgstr "Aktivera kreativt läge för alla spelare" #: src/settings_translation_file.cpp msgid "Enable joysticks" +msgstr "Aktivera 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 "Aktivera stöd för mod-kanaler." #: src/settings_translation_file.cpp msgid "Enable mod security" -msgstr "" +msgstr "Aktivera modsäkerhet" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." -msgstr "" +msgstr "Gör det möjligt för spelare att skadas och dö." #: 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 "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" +msgstr "Aktivera slumpmässig användarinmatning (används endast för testning)." #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." msgstr "" +"Möjliggör mjuk belysning med enkel omgivande ocklusion.\n" +"Inaktivera för prestanda eller för ett annat utseende." + +#: src/settings_translation_file.cpp +msgid "Enable split login/register" +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -3047,6 +3379,10 @@ msgid "" "to new servers, but they may not support all new features that you are " "expecting." msgstr "" +"Aktivera för att hindra gamla klienter från att ansluta.\n" +"Äldre klienter är kompatibla i och med att de inte krashar när de ansluter\n" +"till nya servrar, men de kanske inte stöder alla nya funktioner du förväntar " +"dig." #: src/settings_translation_file.cpp msgid "" @@ -3055,18 +3391,26 @@ msgid "" "textures)\n" "when connecting to the server." msgstr "" +"Aktivera användning av fjärrmedieserver (om tillhandahålld av servern).\n" +"Fjärrservrar är ett betydligt snabbare sätt att hämta media (t.ex. " +"texturer)\n" +"när du ansluter till servern." #: src/settings_translation_file.cpp msgid "" "Enable vertex buffer objects.\n" "This should greatly improve graphics performance." msgstr "" +"Aktivera vertexbuffertobjekt.\n" +"Detta bör avsevärt förbättra grafikprestandan." #: 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 "" +"Aktivera guppande och mängden guppande.\n" +"Till exempel: 0 för inget guppande, 1.0 för normalt, 2.0 för dubbla." #: src/settings_translation_file.cpp msgid "" @@ -3074,6 +3418,9 @@ msgid "" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" +"Aktivera/avaktivera en IPv6-server.\n" +"Ignoreras om bind_address är angedd.\n" +"Kräver att enable_ipv6 är aktiverat." #: src/settings_translation_file.cpp msgid "" @@ -3082,38 +3429,22 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" +"Aktiverar Hable's 'Uncharted 2' filmisk tonmappning.\n" +"Simulerar tonkurvan hos fotografisk film och hur den liknar utseendet\n" +"på bilder med högt dynamiskt omfång. Kontrasten i mitten av intervallet\n" +"förstärks något, ljuspunkter och skuggor komprimeras gradvis." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" +msgstr "Aktiverar animering av lagerföremål." #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." -msgstr "" +msgstr "Aktiverar cachning av facedirroterade mesher." #: src/settings_translation_file.cpp msgid "Enables minimap." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" +msgstr "Aktiverar minimap." #: src/settings_translation_file.cpp msgid "" @@ -3122,20 +3453,31 @@ msgid "" "sound controls will be non-functional.\n" "Changing this setting requires a restart." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Engine profiling data print interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Entity methods" -msgstr "" +"Aktiverar ljudsystemet.\n" +"När inaktiverat inaktiveras alla ljud överallt och spelets\n" +"ljudkontroller kommer inte fungera.\n" +"Omstart krävs för att ändra den här inställningen." #: src/settings_translation_file.cpp msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." +"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 "" +"Aktiverar kompromisser som reducerar CPU-belastning eller förbättrar " +"prestanda\n" +"fast som introducerar små visuella fel som inte påverkar spelbarheten." + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "Intervall för utskrift av motorprofileringsdata" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "Entitetsmetoder" #: src/settings_translation_file.cpp msgid "" @@ -3148,66 +3490,60 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" msgstr "" +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS när ofokuserad eller pausad" + #: src/settings_translation_file.cpp msgid "FSAA" -msgstr "" +msgstr "FSAA" #: src/settings_translation_file.cpp msgid "Factor noise" -msgstr "" +msgstr "Faktorbrus" #: src/settings_translation_file.cpp msgid "Fall bobbing factor" -msgstr "" +msgstr "Fallets bobbingfaktor" #: src/settings_translation_file.cpp msgid "Fallback font path" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" +msgstr "Sökväg för reservtypsnitt" #: src/settings_translation_file.cpp msgid "Fast key" -msgstr "" +msgstr "Snabbknapp" #: src/settings_translation_file.cpp msgid "Fast mode acceleration" -msgstr "" +msgstr "Acceleration i snabbt läge" #: src/settings_translation_file.cpp msgid "Fast mode speed" -msgstr "" +msgstr "Hastighet i snabbt läge" #: src/settings_translation_file.cpp msgid "Fast movement" -msgstr "" +msgstr "Snabb rörelse" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" +"Snabb rörelse (via \"Aux1\"-tagenten).\n" +"Detta kräver \"snabb\"-privilegiet på servern." #: src/settings_translation_file.cpp msgid "Field of view" -msgstr "" +msgstr "Synfält" #: src/settings_translation_file.cpp msgid "Field of view in degrees." -msgstr "" +msgstr "Synfält i grader." #: src/settings_translation_file.cpp msgid "" @@ -3215,133 +3551,153 @@ msgid "" "the\n" "Multiplayer Tab." msgstr "" +"Filen i client/serverlist/ som innehåller dina favoritservrar som visas i\n" +"fliken Anslut Spel." #: src/settings_translation_file.cpp msgid "Filler depth" -msgstr "" +msgstr "Fyllnadsdjup" #: src/settings_translation_file.cpp msgid "Filler depth noise" -msgstr "" +msgstr "Fyllnadsdjupbrus" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" -msgstr "" +msgstr "Filmisk tonmappning" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "" +msgid "Filtering and Antialiasing" +msgstr "Filtrering och kantutjämning" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." msgstr "" +"Första av 4 2D-brus som tillsammans definierar höjden på kullar och berg." #: src/settings_translation_file.cpp msgid "First of two 3D noises that together define tunnels." -msgstr "" +msgstr "Första av två 3D-brus som tillsammans definierar tunnlar." #: src/settings_translation_file.cpp msgid "Fixed map seed" -msgstr "" +msgstr "Fastställd kartseed" #: src/settings_translation_file.cpp msgid "Fixed virtual joystick" -msgstr "" +msgstr "Fast virtuell joystick" #: src/settings_translation_file.cpp msgid "Floatland density" -msgstr "" +msgstr "Floatlanddensitet" #: src/settings_translation_file.cpp msgid "Floatland maximum Y" -msgstr "" +msgstr "Floatlands högsta Y" #: src/settings_translation_file.cpp msgid "Floatland minimum Y" -msgstr "" +msgstr "Floatlands minsta Y" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "Grottoljud" +msgstr "Floatlandbrus" #: src/settings_translation_file.cpp msgid "Floatland taper exponent" -msgstr "" +msgstr "Floatlands avsmalningsexponent" #: src/settings_translation_file.cpp msgid "Floatland tapering distance" -msgstr "" +msgstr "Floatlands avsmalningsdistans" #: src/settings_translation_file.cpp msgid "Floatland water level" -msgstr "" +msgstr "Floatlands vattennivå" #: src/settings_translation_file.cpp msgid "Fly key" -msgstr "" +msgstr "Flygknapp" #: src/settings_translation_file.cpp msgid "Flying" -msgstr "" +msgstr "Flyga" #: src/settings_translation_file.cpp msgid "Fog" -msgstr "" +msgstr "Dimma" #: src/settings_translation_file.cpp msgid "Fog start" -msgstr "" +msgstr "Start av dimma" #: src/settings_translation_file.cpp msgid "Fog toggle key" -msgstr "" +msgstr "Växlingstagent för dimma" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "Typsnitt" #: src/settings_translation_file.cpp msgid "Font bold by default" -msgstr "" +msgstr "Fetstilat typsnitt som standard" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "" +msgstr "Kursivt typsnitt som standard" #: src/settings_translation_file.cpp msgid "Font shadow" -msgstr "" +msgstr "Typsnittsskugga" #: src/settings_translation_file.cpp msgid "Font shadow alpha" -msgstr "" +msgstr "Genomskinlighet för typsnittsskugga" #: src/settings_translation_file.cpp msgid "Font size" -msgstr "" +msgstr "Typsnittsstorlek" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" +msgid "Font size divisible by" +msgstr "Typsnittsstorlek delbar med" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "Storleken för standardtypsnittet där 1 enhet = 1 pixel när DPI är 96" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "Storleken för monospacetypsnittet där 1 enhet = 1 pixel när DPI är 96" #: 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 "" +"Typsnittsstorlek för den senaste chattexten och chattprompten i punkter " +"(pt).\n" +"Värdet 0 använder standardstorleken." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -3349,73 +3705,75 @@ msgid "" "placeholders:\n" "@name, @message, @timestamp (optional)" msgstr "" +"Formatet för spelares chattmeddelanden. De följande strängar är giltiga " +"platshållare:\n" +"@name, @message, @timestamp (ej obligatoriskt)" #: src/settings_translation_file.cpp msgid "Format of screenshots." -msgstr "" +msgstr "Format för skärmdumpar." #: src/settings_translation_file.cpp msgid "Formspec Default Background Color" -msgstr "" +msgstr "Formspec Standardbakgrundsfärg" #: src/settings_translation_file.cpp msgid "Formspec Default Background Opacity" -msgstr "" +msgstr "Formspec Standardbakgrundsopacitet" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Color" -msgstr "" +msgstr "Formspec Standardbakgrundsfärg för fullskärm" #: src/settings_translation_file.cpp msgid "Formspec Full-Screen Background Opacity" -msgstr "" +msgstr "Formspec Standardbakgrundsopacitet för fullskärm" #: src/settings_translation_file.cpp msgid "Formspec default background color (R,G,B)." -msgstr "" +msgstr "Formspec Standardbakgrundsfärg (R,G,B)." #: src/settings_translation_file.cpp msgid "Formspec default background opacity (between 0 and 255)." -msgstr "" +msgstr "Formspec standardbakgrundsopacitet (mellan 0 och 255)." #: src/settings_translation_file.cpp msgid "Formspec full-screen background color (R,G,B)." -msgstr "" +msgstr "Formspec bakgrundsfärg för fullskärm (R,G,B)." #: src/settings_translation_file.cpp msgid "Formspec full-screen background opacity (between 0 and 255)." -msgstr "" +msgstr "Formspec bakgrundsopacitet för fullskärm (mellan 0 och 255)." #: src/settings_translation_file.cpp msgid "Forward key" -msgstr "" +msgstr "Framåtknapp" #: src/settings_translation_file.cpp msgid "Fourth of 4 2D noises that together define hill/mountain range height." msgstr "" +"Fyra av 4 2D-brus som tillsammans definerar höjden för kullar och berg." #: src/settings_translation_file.cpp msgid "Fractal type" -msgstr "" +msgstr "Fraktaltyp" #: src/settings_translation_file.cpp msgid "Fraction of the visible distance at which fog starts to be rendered" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" +msgstr "Bråkdel av den synliga distansen som dimma börjar" #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." msgstr "" +"Hur långt bort block genereras för klienter, mätt i mappblock (16 noder)." #: src/settings_translation_file.cpp msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." msgstr "" +"Från hur långt block skickas till klienten, mätt i mappblock (16 noder)." #: src/settings_translation_file.cpp msgid "" @@ -3428,89 +3786,112 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Full screen" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" +msgstr "Fullskärm" #: src/settings_translation_file.cpp msgid "Fullscreen mode." -msgstr "" +msgstr "Fullskärmsläge." #: src/settings_translation_file.cpp msgid "GUI scaling" -msgstr "" +msgstr "Gränssnittsskalning" #: src/settings_translation_file.cpp msgid "GUI scaling filter" -msgstr "" +msgstr "Filter för Gränssnittsskalning" #: src/settings_translation_file.cpp msgid "GUI scaling filter txr2img" +msgstr "Filter för Gränssnittsskalning txr2img" + +#: src/settings_translation_file.cpp +msgid "GUIs" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "Gamepads" +msgstr "Gamepads" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp msgid "Global callbacks" -msgstr "" +msgstr "Globala återkallelser" #: src/settings_translation_file.cpp msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" +"Globala kartgeneratorattribut.\n" +"I kartgeneratorn v6 kontrollerar 'decorations'-flaggan alla dekorationer " +"förutom träd\n" +"och djungelgräd, i alla andra kartgeneratorer styr flaggan alla dekorationer." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." msgstr "" +"Gradienten av ljuskurvan vid högsta ljusnivå.\n" +"Styr kontrasten av de högsta ljusnivåerna." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." msgstr "" +"Gradienten av ljuskurvan vid minsta ljusnivå.\n" +"Styr kontrasten av de minsta ljusnivåerna." #: src/settings_translation_file.cpp msgid "Graphics" -msgstr "" +msgstr "Grafik" + +#: src/settings_translation_file.cpp +msgid "Graphics Effects" +msgstr "Grafikeffekter" + +#: src/settings_translation_file.cpp +msgid "Graphics and Audio" +msgstr "Grafik och ljud" #: src/settings_translation_file.cpp msgid "Gravity" -msgstr "" +msgstr "Gravitation" #: src/settings_translation_file.cpp msgid "Ground level" -msgstr "" +msgstr "Marknivå" #: src/settings_translation_file.cpp -#, fuzzy msgid "Ground noise" -msgstr "Grottoljud" +msgstr "Ytbrus" #: src/settings_translation_file.cpp msgid "HTTP mods" +msgstr "HTTP-moddar" + +#: src/settings_translation_file.cpp +msgid "HUD" msgstr "" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "" +msgid "HUD scaling" +msgstr "HUD-skalning" #: src/settings_translation_file.cpp msgid "HUD toggle key" -msgstr "" +msgstr "HUD-växlingsknapp" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3525,73 +3906,76 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Heat blend noise" -msgstr "" +msgstr "Värmeblandingsbrus" #: src/settings_translation_file.cpp msgid "Heat noise" -msgstr "" +msgstr "Värmebrus" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "" +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "Höjden av den inledande fönsterstorleken. Ignorerad i fullskärmsläge." #: src/settings_translation_file.cpp msgid "Height noise" -msgstr "" +msgstr "Höjdbrus" #: src/settings_translation_file.cpp msgid "Height select noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" +msgstr "Höjdvalbrus" #: src/settings_translation_file.cpp msgid "Hill steepness" -msgstr "" +msgstr "Kullslättning" #: src/settings_translation_file.cpp msgid "Hill threshold" -msgstr "" +msgstr "Kulltröskel" #: src/settings_translation_file.cpp msgid "Hilliness1 noise" -msgstr "" +msgstr "Kullig1 brus" #: src/settings_translation_file.cpp msgid "Hilliness2 noise" -msgstr "" +msgstr "Kullig2 brus" #: src/settings_translation_file.cpp msgid "Hilliness3 noise" -msgstr "" +msgstr "Kullig3 brus" #: src/settings_translation_file.cpp msgid "Hilliness4 noise" -msgstr "" +msgstr "Kullig4 brus" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." -msgstr "" +msgstr "Hemsida för servern, som visas i serverlistan." #: src/settings_translation_file.cpp msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" +"Horisontell acceleration i luften vid hopp eller fall,\n" +"i noder per sekund per sekund." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration in fast mode,\n" "in nodes per second per second." msgstr "" +"Horisontell och vertikal acceleration i snabbläge,\n" +"i noder per sekund per sekund." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration on ground or when climbing,\n" "in nodes per second per second." msgstr "" +"Horisontell och vertikal acceleration på marken eller klättrande\n" +"i noder per sekund per sekund." #: src/settings_translation_file.cpp msgid "Hotbar next key" @@ -3731,7 +4115,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "How deep to make rivers." -msgstr "" +msgstr "Hur djupt floder ska gå." #: src/settings_translation_file.cpp msgid "" @@ -3739,49 +4123,68 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"Hur snabbt vätskevågor förflyttas. Högre = snabbare.\n" +"Om negativt kommer vågorna förflyttas bakåt.\n" +"Kräver vajande vätskor för att aktiveras." #: 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 "" +"Hur länge servern kommer vänta innan den urladdar oanvända mappblock, i " +"sekunder.\n" +"Högre värde är smidigare, men använder mer 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 "" +"Hur mycket du saktas ner när du rör dig genom en vätska.\n" +"Minska detta för att öka vätskans motstånd mot rörelser." #: src/settings_translation_file.cpp msgid "How wide to make rivers." -msgstr "" +msgstr "Hur bred floder ska vara." #: src/settings_translation_file.cpp msgid "Humidity blend noise" -msgstr "" +msgstr "Luftfuktighetsblandbrus" #: src/settings_translation_file.cpp msgid "Humidity noise" -msgstr "" +msgstr "Luftfuktighetsbrus" #: src/settings_translation_file.cpp msgid "Humidity variation for biomes." -msgstr "" +msgstr "Variationen i luftfuktighet för biotoper." #: src/settings_translation_file.cpp msgid "IPv6" -msgstr "" +msgstr "IPv6" #: src/settings_translation_file.cpp msgid "IPv6 server" -msgstr "" +msgstr "IPv6-server" #: 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 "" +"Om FPS skulle gå högre än detta begränsas den genom\n" +"att sova för att inte slösa på resurser utan någon anledning." #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" +"Om avaktiverad används \"Aux1\"-knappen för att flyga snabbt om både flyg- " +"och snabbläge\n" +"är aktiverade." #: src/settings_translation_file.cpp msgid "" @@ -3801,11 +4204,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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 "" +"När aktiverad är kontoregistrering separat från login i gränsnittet.\n" +"När inaktiverad registreras ett nytt konto automatiskt." + #: src/settings_translation_file.cpp msgid "" "If enabled, actions are recorded for rollback.\n" @@ -3829,7 +4240,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 @@ -3846,6 +4259,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3860,11 +4279,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Ignore world errors" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "" +msgstr "Ignorera världfel" #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." @@ -3893,7 +4308,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3916,17 +4331,13 @@ msgstr "" 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." -msgstr "" +msgid "Interval of sending time of day to clients, stated in seconds." +msgstr "Intervall för att skicka tiden på dagen för klienter, i sekunder." #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -3976,6 +4387,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -4055,6 +4470,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4154,6 +4576,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4527,6 +4956,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4583,7 +5016,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 @@ -4593,15 +5026,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 @@ -4613,7 +5049,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4640,6 +5077,10 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +msgid "Lighting" +msgstr "Belysning" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4673,9 +5114,8 @@ msgid "Liquid queue purge time" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Liquid sinking" -msgstr "Nedstigande hastighet" +msgstr "Vätskesjunkning" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." @@ -4705,30 +5145,28 @@ msgid "Lower Y limit of dungeons." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "Absolut gräns av emerge kö" +msgstr "Nedre Y-gräns för floatlands." #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Huvudmeny" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4790,6 +5228,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4815,46 +5257,40 @@ msgid "Mapgen Carpathian specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Flat" -msgstr "Kartgenerator" +msgstr "Mapgen Platt" #: src/settings_translation_file.cpp msgid "Mapgen Flat specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal" -msgstr "Kartgenerator" +msgstr "Mapgen Fraktal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Kartgenerator" +msgstr "Specifika flaggar för fraktal" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V5" -msgstr "Kartgenerator" +msgstr "Kartgenerator V5" #: src/settings_translation_file.cpp msgid "Mapgen V5 specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V6" -msgstr "Kartgenerator" +msgstr "Kartgenerator V6" #: src/settings_translation_file.cpp msgid "Mapgen V6 specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen V7" -msgstr "Kartgenerator" +msgstr "Kartgenerator V7" #: src/settings_translation_file.cpp msgid "Mapgen V7 specific flags" @@ -4901,7 +5337,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4949,6 +5389,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -5003,17 +5450,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -5062,12 +5513,24 @@ msgstr "" 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 "Moddsäkerhet" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5078,6 +5541,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -5144,16 +5611,16 @@ msgstr "" 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 "" @@ -5166,6 +5633,10 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "Nod- och väsenmarkering" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5178,14 +5649,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5207,18 +5670,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5228,11 +5683,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5241,39 +5691,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Optional override for chat weblink color." msgstr "" -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Parrallax Ocklusion" - #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5296,17 +5719,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5327,24 +5746,27 @@ msgid "Physics" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Pitch move key" -msgstr "Tangent för filmiskt länge" +msgstr "" #: src/settings_translation_file.cpp msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Placeraknapp" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + #: 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 "" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5353,6 +5775,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Poissonfiltrering" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5387,10 +5813,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5398,9 +5820,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5490,10 +5912,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5507,9 +5925,8 @@ msgid "River depth" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "River noise" -msgstr "Grottoljud" +msgstr "Flodbrus" #: src/settings_translation_file.cpp msgid "River size" @@ -5564,6 +5981,10 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "Skärm" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5591,6 +6012,10 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "Skärmdumpar" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5603,10 +6028,6 @@ msgstr "" 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 "" @@ -5624,7 +6045,6 @@ msgid "Selection box width" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Selects one of 18 fractal types.\n" "1 = 4D \"Roundy\" Mandelbrot set.\n" @@ -5646,29 +6066,37 @@ msgid "" "17 = 4D \"Mandelbulb\" Mandelbrot set.\n" "18 = 4D \"Mandelbulb\" Julia set." msgstr "" -"Val av 18 fractaler från 9 formler.\n" -"1 = 4D \"Roundy\" mandelbrot set.\n" -"2 = 4D \"Roundy\" julia set.\n" -"3 = 4D \"Squarry\" mandelbrot set.\n" -"4 = 4D \"Squarry\" julia set.\n" -"5 = 4D \"Mandy Cousin\" mandelbrot set.\n" -"6 = 4D \"Mandy Cousin\" julia set.\n" -"7 = 4D \"Variation\" mandelbrot set.\n" -"8 = 4D \"Variation\" julia set.\n" -"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n" -"10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n" -"11 = 3D \"Christmas Tree\" mandelbrot set.\n" -"12 = 3D \"Christmas Tree\" julia set.\n" -"13 = 3D \"Mandelbulb\" mandelbrot set.\n" -"14 = 3D \"Mandelbulb\" julia set.\n" -"15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n" -"16 = 3D \"Cosine Mandelbulb\" julia set.\n" -"17 = 4D \"Mandelbulb\" mandelbrot set.\n" -"18 = 4D \"Mandelbulb\" julia set." +"Val av 18 fraktaler.\n" +"1 = 4D \"Roundy\" Mandelbrot set.\n" +"2 = 4D \"Roundy\" Julia set.\n" +"3 = 4D \"Squarry\" Mandelbrot set.\n" +"4 = 4D \"Squarry\" Julia set.\n" +"5 = 4D \"Mandy Cousin\" Mandelbrot set.\n" +"6 = 4D \"Mandy Cousin\" Julia set.\n" +"7 = 4D \"Variation\" Mandelbrot set.\n" +"8 = 4D \"Variation\" Julia set.\n" +"9 = 3D \"Mandelbrot/Mandelbar\" Mandelbrot set.\n" +"10 = 3D \"Mandelbrot/Mandelbar\" Julia set.\n" +"11 = 3D \"Christmas Tree\" Mandelbrot set.\n" +"12 = 3D \"Christmas Tree\" Julia set.\n" +"13 = 3D \"Mandelbulb\" Mandelbrot set.\n" +"14 = 3D \"Mandelbulb\" Julia set.\n" +"15 = 3D \"Cosine Mandelbulb\" Mandelbrot set.\n" +"16 = 3D \"Cosine Mandelbulb\" Julia set.\n" +"17 = 4D \"Mandelbulb\" Mandelbrot set.\n" +"18 = 4D \"Mandelbulb\" Julia set." #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" +msgid "Server" +msgstr "Server" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "Servergameplay" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "Serversäkerhet" #: src/settings_translation_file.cpp msgid "Server URL" @@ -5694,10 +6122,18 @@ msgstr "" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +msgid "Server/Env Performance" +msgstr "Server/Miljöprestanda" + #: 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 "" @@ -5709,7 +6145,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5731,9 +6195,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + +#: src/settings_translation_file.cpp msgid "Shader path" -msgstr "Välj sökväg" +msgstr "Shader-sökväg" #: src/settings_translation_file.cpp msgid "" @@ -5743,6 +6213,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5750,9 +6236,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5767,6 +6251,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5788,6 +6282,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5835,27 +6333,21 @@ msgid "Sneak key" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Sneaking speed" -msgstr "Nedstigande hastighet" +msgstr "Smyghastighet" #: src/settings_translation_file.cpp msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Radie för mjuk skugga" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "tryck på tangent" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5871,6 +6363,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5898,10 +6398,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5939,6 +6435,10 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Temporary Settings" +msgstr "Temporära inställningar" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -5948,9 +6448,8 @@ msgid "Terrain base noise" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain height" -msgstr "Bas för terränghöjd" +msgstr "Terränghöjd" #: src/settings_translation_file.cpp msgid "Terrain higher noise" @@ -5982,6 +6481,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5996,6 +6502,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6051,18 +6561,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -6080,6 +6590,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6088,9 +6604,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -6127,7 +6642,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 @@ -6147,9 +6662,20 @@ msgid "Tooltip delay" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touch screen threshold" -msgstr "Strandoljudströskel" +msgstr "Tröskelvärde för pekskärm" + +#: src/settings_translation_file.cpp +msgid "Touchscreen" +msgstr "Pekskärm" + +#: 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" @@ -6200,9 +6726,8 @@ msgid "Upper Y limit of dungeons." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "Absolut gräns av emerge kö" +msgstr "Övre Y-gräns för floatlands." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6222,15 +6747,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6324,7 +6864,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6375,29 +6915,29 @@ msgid "Waving leaves" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" -msgstr "Vajande Löv" +msgstr "Vajande vätskor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "Böljande Vatten" +msgstr "Våghöjd för vajande vätskor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" -msgstr "Vajande Löv" +msgstr "Våghastighet för vajande vätskor" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" -msgstr "Böljande Vatten" +msgstr "Våglängd för vajande vätskor" #: src/settings_translation_file.cpp msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6419,18 +6959,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6465,13 +7003,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6492,9 +7039,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "World start time" -msgstr "Världnamn" +msgstr "Världsstarttid" #: src/settings_translation_file.cpp msgid "" @@ -6521,9 +7067,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Y of upper limit of large caves." -msgstr "Absolut gräns av emerge kö" +msgstr "Y-nivå för högre gräns av stora grottor." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." @@ -6546,59 +7091,48 @@ msgid "Y-level of cavern upper limit." msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Y-level of higher terrain that creates cliffs." -msgstr "Y-nivå av lägre terräng och sjöbottnar." +msgstr "Y-nivå för högre terräng som skapar klippor." #: src/settings_translation_file.cpp -#, fuzzy msgid "Y-level of lower terrain and seabed." -msgstr "Y-nivå av lägre terräng och sjöbottnar." +msgstr "Y-nivå för lägre terräng och sjöbottnar." #: src/settings_translation_file.cpp msgid "Y-level of seabed." msgstr "Y-nivå av sjöbotten." +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL filhemladdning tidsgräns" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "cURL-interaktivtimeout" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL parallellgräns" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL-timeout" +#~ msgid "- Creative Mode: " +#~ msgstr "- Kreativt läge: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Slå av/på Filmisk Kamera" - -#, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Välj modfil:" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Y-nivå till vilket luftöars skuggor når." +#~ msgid "- Damage: " +#~ msgstr "- Aktivera skada: " #~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Definierar områden för luftöars jämna terräng.\n" -#~ "Jämna luftöar förekommer när oljud > 0." +#~ "0 = parallax ocklusion med sluttningsinformation (snabbare).\n" +#~ "1 = reliefmappning (långsammare, noggrannare)." -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Kontrollerar bredd av tunnlar, mindre värden skapar bredare tunnlar." - -#, fuzzy -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Kontrollerar densiteten av luftöars bergsterräng.\n" -#~ "Är en förskjutning adderad till oljudsvärdet för 'np_mountain'." +#~ msgid "Address / Port" +#~ msgstr "Adress / Port" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -6608,11 +7142,191 @@ msgstr "cURL-timeout" #~ "Justera gammakodningen för ljustabeller. Högre tal är ljusare.\n" #~ "Denna inställning påverkar endast klienten och ignoreras av servern." -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Laddar ner och installerar $1, vänligen vänta..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Är du säker på att du vill starta om din enspelarvärld?" #~ msgid "Back" #~ msgstr "Tillbaka" +#~ msgid "Basic" +#~ msgstr "Grundläggande" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Bits per pixel (dvs färgdjup) i fullskärmsläge." + +#~ msgid "Bump Mapping" +#~ msgstr "Stötkartläggning" + +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmappning" + +#~ msgid "Config mods" +#~ msgstr "Konfigurera moddar" + +#~ msgid "Configure" +#~ msgstr "Konfigurera" + +#~ msgid "Connect" +#~ msgstr "Anslut" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Styr sjunkhastigheten i vätska." + +#, fuzzy +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Kontrollerar densiteten av luftöars bergsterräng.\n" +#~ "Är en förskjutning adderad till oljudsvärdet för 'np_mountain'." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Kontrollerar bredd av tunnlar, mindre värden skapar bredare tunnlar." + +#~ msgid "Credits" +#~ msgstr "Medverkande" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Hårkorsförg (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Skada aktiverat" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Standardtimeout för cURL, i millisekunder.\n" +#~ "Har bara en effekt om kompilerat med cURL." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Definierar områden för luftöars jämna terräng.\n" +#~ "Jämna luftöar förekommer när oljud > 0." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Definierar samplingssteg av textur.\n" +#~ "Högre värden resulterar i jämnare normalmappning." + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Ladda ner ett spel, såsom Minetest Game, från minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Ladda ner ett från minetest.net" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "Laddar ner och installerar $1, vänligen vänta..." + +#~ msgid "Enable register confirmation" +#~ msgstr "Aktivera registreringsbekräftelse" + +#~ msgid "Enter " +#~ msgstr "Enter " + +#~ msgid "Filtering" +#~ msgstr "Filtrering" + +#~ msgid "FreeType fonts" +#~ msgstr "FreeType-typsnitt" + +#~ msgid "Game" +#~ msgstr "Spel" + +#~ msgid "HUD scale factor" +#~ msgstr "HUD-skalningsfaktor" + +#~ msgid "In-Game" +#~ msgstr "In-game" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Installera: fil: \"$1\"" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Tangentbindningar. (Om den här menyn strular, radera saker från minetest." +#~ "conf)" + +#~ msgid "Main" +#~ msgstr "Huvudsaklig" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Huvudmeny" + +#~ msgid "Name / Password" +#~ msgstr "Namn / Lösenord" + +#~ msgid "Name/Password" +#~ msgstr "Namn/Lösenord" + +#~ msgid "No" +#~ msgstr "Nej" + #~ msgid "Ok" #~ msgstr "Ok" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parrallax Ocklusion" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Parrallax Ocklusion" + +#~ msgid "PvP enabled" +#~ msgstr "PvP aktiverat" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Starta om enspelarvärld" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Välj modfil:" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "tryck på tangent" + +#~ msgid "Start Singleplayer" +#~ msgstr "Starta Enspelarläge" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "För att aktivera shaders behöver OpenGL-drivern användas." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Slå av/på Filmisk Kamera" + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Y-nivå till vilket luftöars skuggor når." + +#~ 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 "" +#~ "Du håller på att ansluta till den här servern med namnet \"%s\" för den " +#~ "första gången.\n" +#~ "Om du fortsätter kommer ett nytt konto med dina uppgifter skapas på " +#~ "servern.\n" +#~ "Var snäll och fyll i ditt lösenord och tryck på 'Registrera och Anslut' " +#~ "för att bekräfta kontoregistrering, eller tryck \"Avbryt\" för att " +#~ "avbryta." + +#~ msgid "You died." +#~ msgstr "Du dog." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/sw/minetest.po b/po/sw/minetest.po index a34b6c98b..ef3a237a9 100644 --- a/po/sw/minetest.po +++ b/po/sw/minetest.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Swahili (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\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: Swahili <https://hosted.weblate.org/projects/minetest/" @@ -14,6 +14,47 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.9-dev\n" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Empty command." +msgstr "Amri majadiliano" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Exit to main menu" +msgstr "Toka kwenye menyu" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Invalid command: " +msgstr "Amri majadiliano" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "List online players" +msgstr "Singleplayer" + +#: builtin/client/chatcommands.lua +#, fuzzy +msgid "Online players: " +msgstr "Singleplayer" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" msgstr "Respawn" @@ -22,10 +63,41 @@ msgstr "Respawn" msgid "You died" msgstr "Umekufa." +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands:" +msgstr "Amri majadiliano" + +#: builtin/common/chatcommands.lua +#, fuzzy +msgid "Available commands: " +msgstr "Amri majadiliano" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua #, fuzzy msgid "An error occurred in a Lua script:" @@ -48,9 +120,30 @@ msgstr "Unganisha upya" msgid "The server has requested a reconnect:" msgstr "Seva imeomba na Unganisha upya:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Inapakia..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Teua ulimwengu:" + +#: 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. " @@ -65,8 +158,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Seva inasaidia matoleo ya itifaki kati ya $1 na $2." #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "Jaribu reenabling serverlist umma na Kagua muunganisho wako wa tovuti." +msgid "Visit website" +msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +169,26 @@ msgstr "Sisi tu mkono itifaki toleo la $1." msgid "We support protocol versions between version $1 and $2." msgstr "Tunaunga mkono matoleo ya itifaki kati ya toleo la $1 na $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Katisha" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Mategemezi:" @@ -164,15 +266,56 @@ msgstr "Ulimwengu:" msgid "enabled" msgstr "kuwezeshwa" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "$1 downloading..." +msgstr "Inapakia..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Already installed" +msgstr "Muhimu tayari katika matumizi" + #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy msgid "Back to Main Menu" msgstr "Menyu kuu" +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Base Game:" +msgstr "Ficha mchezo" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -188,7 +331,6 @@ msgid "Failed to download $1" msgstr "Imeshindwa kusakinisha $1 hadi $2" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Michezo" @@ -197,7 +339,23 @@ msgid "Install" msgstr "Sakinisha" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Install $1" +msgstr "Sakinisha" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install missing dependencies" +msgstr "Inaanzilisha fundo" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "" +"\n" +"Sakinisha Moduli: filetype visivyotegemezwa \"$1\" au nyaraka kuvunjwa" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mods" @@ -210,9 +368,24 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Utafutaji" +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "" #: builtin/mainmenu/dlg_contentstore.lua #, fuzzy @@ -229,7 +402,11 @@ msgid "Update" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -281,12 +458,8 @@ msgstr "Instrumentation" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "Pakua subgame, kama vile minetest_game, kutoka minetest.net" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "Pakua moja kutoka minetest.net" +msgid "Development Test is meant for developers." +msgstr "Tahadhari: Mtihani wa maendeleo ndogo ni maana kwa watengenezaji." #: builtin/mainmenu/dlg_create_world.lua #, fuzzy @@ -306,10 +479,6 @@ msgstr "" msgid "Floatlands (experimental)" msgstr "Kiwango cha maji" -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Mchezo" - #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" msgstr "" @@ -327,6 +496,15 @@ msgstr "Kiendeshaji video" msgid "Increases humidity around rivers" msgstr "" +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "Sakinisha" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "" + #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" msgstr "" @@ -432,11 +610,6 @@ msgstr "Kina wa mto" 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 "Tahadhari: Mtihani wa maendeleo ndogo ni maana kwa watengenezaji." - #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "Jina la ulimwengu" @@ -470,6 +643,39 @@ msgstr "Modmgr: batili modpath \"$1\"" msgid "Delete World \"$1\"?" msgstr "Futa ulimwengu \"$1\"?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Thibitisha nywila" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Missing name" +msgstr "Mwandishi ramani jina" + +#: 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 "Nywila mpya" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "MaNenotambulishi hayaoani!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Kukubali" @@ -502,6 +708,16 @@ msgid "Browse" msgstr "Vinjari" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "Kuendelea" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "Kuendelea" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Walemavu" @@ -528,7 +744,7 @@ msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy -msgid "Persistance" +msgid "Persistence" msgstr "Umbali wa uhamisho wa mchezaji" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -547,6 +763,10 @@ msgstr "Rejesha chaguo-msingi" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Utafutaji" + #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy msgid "Select directory" @@ -557,7 +777,7 @@ msgstr "Orodha ya ramani" msgid "Select file" msgstr "Teua faili ya Moduli:" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Onyesha majina ya kiufundi" @@ -644,18 +864,6 @@ msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" "Sakinisha Moduli: haiwezi kupata foldername ya kufaa kwa ajili ya modpack $1" -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" -"\n" -"Sakinisha Moduli: filetype visivyotegemezwa \"$1\" au nyaraka kuvunjwa" - -#: builtin/mainmenu/pkgmgr.lua -#, fuzzy -msgid "Install: file: \"$1\"" -msgstr "Sakinisha Moduli: faili: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua #, fuzzy msgid "Unable to find a valid mod or modpack" @@ -682,6 +890,59 @@ msgstr "Imeshindwa kusakinisha $1 hadi $2" msgid "Unable to install a modpack as a $1" msgstr "Imeshindwa kusakinisha $1 hadi $2" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Inapakia..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "Jaribu reenabling serverlist umma na Kagua muunganisho wako wa tovuti." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Wachangiaji amilifu" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "Kiolwa amilifu Tuma masafa" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Watengenezaji wa msingi" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Open User Data Directory" +msgstr "Orodha ya ramani" + +#: 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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Wachangiaji wa awali" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Awali msingi watengenezaji" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Share debug log" +msgstr "Onyesha maelezo kuhusu marekebisho" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "" @@ -729,26 +990,6 @@ msgstr "Sakinusha Moduli teuliwa" msgid "Use Texture Pack" msgstr "Texturepacks" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Wachangiaji amilifu" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Watengenezaji wa msingi" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Mikopo" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Wachangiaji wa awali" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Awali msingi watengenezaji" - #: builtin/mainmenu/tab_local.lua #, fuzzy msgid "Announce Server" @@ -759,14 +1000,10 @@ msgid "Bind Address" msgstr "Kumfunga anwani" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Sanidi" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Hali ya ubunifu" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Wezesha uharibifu" @@ -784,10 +1021,6 @@ msgstr "Seva" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Jina/nenosiri" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Mpya" @@ -801,10 +1034,15 @@ msgstr "Duniani hakuna kuundwa au kuteuliwa!" msgid "Play Game" msgstr "Jina la mchezaji" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Bandari" +#: builtin/mainmenu/tab_local.lua +#, fuzzy +msgid "Select Mods" +msgstr "Teua ulimwengu:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Teua ulimwengu:" @@ -819,46 +1057,68 @@ msgid "Start Game" msgstr "Ficha mchezo" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Kushughulikia / bandari" +#, fuzzy +msgid "Address" +msgstr "Kumfunga anwani" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Kuunganisha" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Wazi" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Hali ya ubunifu" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Uharibifu kuwezeshwa" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Damage / PvP" +msgstr "Uharibifu" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Del. kipendwa" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Favorites" msgstr "Kipendwa" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "" + #: builtin/mainmenu/tab_online.lua #, fuzzy msgid "Join Game" msgstr "Ficha mchezo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Jina / nenosiri" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP kuwezeshwa" +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Public Servers" +msgstr "Kutangaza seva" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Bandari ya mbali" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Server Description" +msgstr "Maelezo ya seva" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -885,10 +1145,6 @@ msgstr "Vipimo vya" msgid "Antialiasing:" msgstr "Antialiasing:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Je, una hakika upya ulimwengu wako singleplayer?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -897,10 +1153,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "Kichujio bilinear" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Mapema ramani" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Badilisha funguo" @@ -909,14 +1161,31 @@ msgstr "Badilisha funguo" msgid "Connected Glass" msgstr "Kioo kushikamana" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +#, fuzzy +msgid "Dynamic shadows" +msgstr "Kivuli cha fonti" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Kivuli cha fonti" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Majani ya dhana" #: builtin/mainmenu/tab_settings.lua -#, fuzzy -msgid "Generate Normal Maps" -msgstr "Kuzalisha normalmaps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -926,10 +1195,6 @@ msgstr "Mipmap" msgid "Mipmap + Aniso. Filter" msgstr "Mipmap + Aniso. Kichujio" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "La" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Kichujio hakuna" @@ -958,18 +1223,10 @@ msgstr "Majani opaque" msgid "Opaque Water" msgstr "Maji opaque" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Parallax Occlusion" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Chembe" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Weka upya singleplayer ulimwengu" - #: builtin/mainmenu/tab_settings.lua #, fuzzy msgid "Screen:" @@ -983,6 +1240,11 @@ msgstr "Vipimo vya" msgid "Shaders" msgstr "Shaders" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Shaders (experimental)" +msgstr "Kiwango cha maji" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -999,23 +1261,27 @@ msgstr "Taa laini" msgid "Texturing:" msgstr "Texturing:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Ili kuwezesha shaders OpenGL ya kiendeshaji inahitaji kutumiwa." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Ramani ya toni" #: builtin/mainmenu/tab_settings.lua #, fuzzy -msgid "Touchthreshold: (px)" +msgid "Touch threshold (px):" msgstr "Touchthreshold (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Kichujio trilinear" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Waving majani" @@ -1029,23 +1295,12 @@ msgstr "Waving fundo" msgid "Waving Plants" msgstr "Waving mimea" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Ndio" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Mods Now" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Kuu" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Kuanza Singleplayer" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Kosa la muunganisho (wakati muafaka?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Muunganisho limekatika." @@ -1074,7 +1329,8 @@ msgid "Connection error (timed out?)" msgstr "Kosa la muunganisho (wakati muafaka?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +#, fuzzy +msgid "Could not find or load game: " msgstr "Haikuweza kupata wala kupakia mchezo\"" #: src/client/clientlauncher.cpp @@ -1106,18 +1362,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "Njia ya dunia iliyotolewa haipo:" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1131,16 +1375,6 @@ msgstr "" msgid "- Address: " msgstr "Kumfunga anwani" -#: src/client/game.cpp -#, fuzzy -msgid "- Creative Mode: " -msgstr "Hali ya ubunifu" - -#: src/client/game.cpp -#, fuzzy -msgid "- Damage: " -msgstr "Uharibifu" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1165,6 +1399,16 @@ msgstr "" msgid "- Server Name: " msgstr "Jina la seva" +#: src/client/game.cpp +#, fuzzy +msgid "A serialization error occurred:" +msgstr "Kosa limetokea:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Automatic forward disabled" @@ -1175,6 +1419,22 @@ msgstr "Ufunguo wa mbele" msgid "Automatic forward enabled" msgstr "Ufunguo wa mbele" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp #, fuzzy msgid "Camera update disabled" @@ -1185,6 +1445,10 @@ msgstr "Kibonye guro Usasishaji wa kamera" msgid "Camera update enabled" msgstr "Kibonye guro Usasishaji wa kamera" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Badilisha nywila" @@ -1199,6 +1463,11 @@ msgstr "Hali ya cinematic ufunguo" msgid "Cinematic mode enabled" msgstr "Hali ya cinematic ufunguo" +#: src/client/game.cpp +#, fuzzy +msgid "Client disconnected" +msgstr "Mteja" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1207,6 +1476,10 @@ msgstr "" msgid "Connecting to server..." msgstr "Inaunganisha seva..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "Kuendelea" @@ -1219,13 +1492,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1241,6 +1514,11 @@ msgstr "" "- kipanya gurudumu: Teua kipengee\n" "- T: mazungumzo\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Inaunda mteja..." @@ -1296,6 +1574,11 @@ msgstr "" msgid "Enabled unlimited viewing range" msgstr "" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "Inaunda mteja..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Toka kwenye menyu" @@ -1378,32 +1661,8 @@ msgstr "" #: src/client/game.cpp #, fuzzy -msgid "Minimap hidden" -msgstr "Ufunguo wa minimap" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +msgstr "Singleplayer" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1481,6 +1740,21 @@ msgstr "" msgid "Sound unmuted" msgstr "Kiwango cha sauti" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, fuzzy, c-format msgid "Viewing range changed to %d" @@ -1553,10 +1827,6 @@ msgstr "Nyuma" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Wazi" - #: src/client/keycode.cpp msgid "Control" msgstr "Udhibiti" @@ -1811,22 +2081,33 @@ msgstr "X kitufe 2" msgid "Zoom" msgstr "Kuza" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "MaNenotambulishi hayaoani!" +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap hidden" +msgstr "Ufunguo wa minimap" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" msgstr "" -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, fuzzy +msgid "Minimap in texture mode" +msgstr "Unamu wa kima cha chini cha ukubwa wa Vichujio" + +#: src/gui/guiChatConsole.cpp +#, fuzzy +msgid "Failed to open webpage" +msgstr "Imeshindwa kusakinisha $1 hadi $2" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1835,7 +2116,7 @@ msgstr "Kuendelea" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "\"Matumizi\" = kupanda chini" #: src/gui/guiKeyChangeMenu.cpp @@ -1847,16 +2128,24 @@ msgstr "Mbele" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Nyuma" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Change camera" msgstr "Badilisha funguo" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Kuzungumza" @@ -1912,8 +2201,8 @@ msgid "Key already in use" msgstr "Muhimu tayari katika matumizi" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "Keybindings. (Kama Menyu hii screws, Ondoa vitu kutoka minetest.conf)" +msgid "Keybindings." +msgstr "" #: src/gui/guiKeyChangeMenu.cpp #, fuzzy @@ -1945,10 +2234,6 @@ msgstr "Screenshot" msgid "Sneak" msgstr "Taarifa" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp #, fuzzy msgid "Toggle HUD" @@ -1994,10 +2279,6 @@ msgstr "Bonyeza Kibonye" msgid "Change" msgstr "Mabadiliko" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Thibitisha nywila" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Nywila mpya" @@ -2006,6 +2287,10 @@ msgstr "Nywila mpya" msgid "Old Password" msgstr "Nywila ya zamani" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "MaNenotambulishi hayaoani!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Toka" @@ -2016,15 +2301,10 @@ msgid "Muted" msgstr "Ufunguo wa matumizi" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " +#, fuzzy, c-format +msgid "Sound Volume: %d%%" msgstr "Kiwango sauti:" -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Ingiza" - #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's #. language code (e.g. "de" for German). @@ -2032,6 +2312,15 @@ msgstr "Ingiza" msgid "LANG_CODE" msgstr "sw" +#: 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" @@ -2040,8 +2329,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -2076,14 +2365,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = parallax occlusion na taarifa ya mteremko (haraka).\n" -"1 = ramani ya misaada (polepole, sahihi zaidi)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2181,6 +2462,10 @@ msgstr "" "-sidebyside: Baidisha skrini upande kwa upande.\n" "-pageflip: quadbuffer msingi 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" @@ -2203,6 +2488,10 @@ msgstr "Ujumbe kuonyeshwa kwa wateja wote wakati seva huzima." msgid "ABM interval" msgstr "Ramani hifadhi muda" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Absolute limit of queued blocks to emerge" @@ -2255,6 +2544,10 @@ msgstr "" "Rekebisha usakinishaji wa dpi kwenye kiwamba chako (yasiyo X11/Android tu) " "mfano kwa 4 k skrini." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2265,6 +2558,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Jina la ulimwengu" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Pevu" @@ -2279,7 +2577,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Daima kuruka na kufunga" #: src/settings_translation_file.cpp @@ -2349,6 +2648,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Automatic forward key" @@ -2371,6 +2674,16 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key" +msgstr "Ufunguo wa kuruka" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Aux1 key for climbing/descending" +msgstr "Matumizi muhimu kwa ajili ya kupanda/kushuka" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Ufunguo wa nyuma" @@ -2385,10 +2698,6 @@ msgstr "Mwandishi ramani gorofa ngazi ya chini" msgid "Base terrain height." msgstr "Mandhari ya msingi urefu" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Msingi" - #: src/settings_translation_file.cpp #, fuzzy msgid "Basic privileges" @@ -2412,7 +2721,7 @@ msgstr "Kumfunga anwani" #: src/settings_translation_file.cpp #, fuzzy -msgid "Biome API temperature and humidity noise parameters" +msgid "Biome API noise parameters" msgstr "Mwandishi ramani v6 unyevu kelele vigezo" #: src/settings_translation_file.cpp @@ -2420,16 +2729,15 @@ msgstr "Mwandishi ramani v6 unyevu kelele vigezo" msgid "Biome noise" msgstr "Kelele za mto" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" -"Biti kwa pikseli (a.k.a rangi kina) katika hali-tumizi ya skrini nzima." - #: src/settings_translation_file.cpp #, fuzzy msgid "Block send optimize distance" msgstr "Umbo la Max Tuma umbali" +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Bold and italic font path" @@ -2459,8 +2767,9 @@ msgid "Builtin" msgstr "Pamoja" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Bumpmapping" +#, fuzzy +msgid "Camera" +msgstr "Badilisha funguo" #: src/settings_translation_file.cpp msgid "" @@ -2540,14 +2849,14 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +#, fuzzy +msgid "Chat command time message threshold" +msgstr "Kilele cha mlima gorofa Mwandishi ramani" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Chat commands" +msgstr "Amri majadiliano" #: src/settings_translation_file.cpp #, fuzzy @@ -2586,8 +2895,8 @@ msgid "Chat toggle key" msgstr "Kibonye guro wa mazungumzo" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Amri majadiliano" +msgid "Chat weblinks" +msgstr "" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2605,6 +2914,12 @@ msgstr "Hali ya cinematic ufunguo" msgid "Clean transparent textures" msgstr "Unamu angavu safi" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Mteja" @@ -2627,6 +2942,11 @@ msgstr "Mteja" msgid "Client side node lookup range restriction" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "Mteja" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Kasi ya upandaji" @@ -2651,6 +2971,11 @@ msgstr "Mawingu katika Menyu" msgid "Colored fog" msgstr "Ukungu wa rangi" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Colored shadows" +msgstr "Ukungu wa rangi" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2683,6 +3008,22 @@ msgstr "" msgid "Command key" msgstr "Ufunguo wa amri" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Kuunganisha kioo" @@ -2708,10 +3049,18 @@ msgstr "Rangi ya Kiweko" msgid "Console height" msgstr "Muhimu ya Kiweko" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "ContentDB URL" @@ -2743,7 +3092,9 @@ msgstr "" "unchanged." #: 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 @@ -2775,7 +3126,10 @@ msgid "Crosshair alpha" msgstr "Crosshair Alfa" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "Crosshair Alfa (opaqueness kati ya 0 na 255)." #: src/settings_translation_file.cpp @@ -2783,8 +3137,10 @@ msgid "Crosshair color" msgstr "Rangi ya crosshair" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Rangi ya crosshair (R, G, B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" #: src/settings_translation_file.cpp msgid "DPI" @@ -2807,15 +3163,15 @@ msgstr "Rekebisha kiwango cha logi" msgid "Debug log level" msgstr "Rekebisha kiwango cha logi" +#: src/settings_translation_file.cpp +msgid "Debugging" +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Dec. volume key" msgstr "HUD kibonye" -#: 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 "Hatua ya seva ya kujitolea" @@ -2856,11 +3212,10 @@ msgstr "Chaguo-msingi mchezo" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"Chaguo-msingi muda wa kuisha kwa cURL, alisema katika milisekunde.\n" -"Tu ina athari kama alikusanya na Mkunjo." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2890,14 +3245,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Inafasili hatua ya sampuli ya unamu.\n" -"Thamani ya juu zaidi matokeo katika ramani ya laini ya kawaida." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2972,6 +3319,16 @@ msgstr "" msgid "Desynchronize block animation" msgstr "Desynchronize umbo la uhuishaji" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Instrumentation" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Dig key" +msgstr "Ufunguo sahihi" + #: src/settings_translation_file.cpp #, fuzzy msgid "Digging particles" @@ -2985,6 +3342,16 @@ msgstr "Lemaza anticheat" msgid "Disallow empty passwords" msgstr "Usiruhusu nywila tupu" +#: src/settings_translation_file.cpp +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 "Kikoa jina la seva, kuonyeshwa katika serverlist ya." @@ -3031,12 +3398,25 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" msgstr "" #: src/settings_translation_file.cpp @@ -3044,6 +3424,10 @@ msgstr "" msgid "Enable joysticks" msgstr "Wezesha vifimbocheza" +#: 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." @@ -3061,16 +3445,6 @@ msgstr "Wezesha wachezaji kupata uharibifu na kufa." msgid "Enable random user input (only used for testing)." msgstr "Wezesha ingizo la mtumiaji nasibu (kutumika tu kwa ajili ya kupima)." -#: 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" @@ -3079,6 +3453,10 @@ msgstr "" "Wezesha taa laini na rahisi iliyoko occlusion.\n" "Lemaza kwa kasi au kwa ajili ya inaonekana tofauti." +#: 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" @@ -3141,17 +3519,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "Huwezesha uhuishaji wa vitu inventering." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Inawezesha bumpmapping kwa ajili ya unamu. Normalmaps haja iwekwe kwa pakiti " -"ya unamu au haja ya kuwa yaliyozalishwa na otomatiki.\n" -"Inahitaji shaders kwa kuwezeshwa." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Huwezesha uwekaji kache kwa facedir Iliyozungushwa meshes." @@ -3160,22 +3527,6 @@ msgstr "Huwezesha uwekaji kache kwa facedir Iliyozungushwa meshes." msgid "Enables minimap." msgstr "Inawezesha minimap." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Huwezesha kwenye kizazi cha normalmap kuruka (Emboss athari).\n" -"Inahitaji bumpmapping kwa kuwezeshwa." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Huwezesha parallax occlusion uramanishi.\n" -"Inahitaji shaders kwa kuwezeshwa." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3184,6 +3535,17 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "Maelezo mafupi ya Bonde" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Injini ubainishaji wa data ya uchapaji nafasi" @@ -3192,14 +3554,6 @@ msgstr "Injini ubainishaji wa data ya uchapaji nafasi" msgid "Entity methods" msgstr "Mbinu ya chombo" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Chaguo majaribio, inaweza kusababisha nafasi inayoonekana kati ya vitalu " -"wakati kuweka namba ya juu zaidi kuliko 0." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3211,8 +3565,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "Ramprogrammen katika Menyu ya mapumziko" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "FPS when unfocused or paused" +msgstr "Ramprogrammen juu wakati mchezo umesitishwa." #: src/settings_translation_file.cpp msgid "FSAA" @@ -3232,18 +3591,6 @@ msgstr "Kuanguka bobbing" msgid "Fallback font path" msgstr "Fonti amebadilisha" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Fonti amebadilisha kivuli" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Fonti amebadilisha kivuli Alfa" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Ukubwa fonti amebadilisha" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Ufunguo kasi" @@ -3263,7 +3610,7 @@ msgstr "Kutembea haraka" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "Harakati haraka (kupitia matumizi muhimu).\n" @@ -3305,9 +3652,9 @@ msgstr "Ramani ya toni filmic" #, fuzzy msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Unamu kuchujwa wanaweza kujichanganya RGB thamani na majirani kikamilifu-" "uwazi, ambayo PNG optimizers kawaida Tupa, wakati mwingine kusababisha " @@ -3315,8 +3662,9 @@ msgstr "" "kusafisha kwamba wakati mzigo, unamu." #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Uchujaji" +#, 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." @@ -3387,6 +3735,11 @@ msgstr "" msgid "Fog toggle key" msgstr "Kibonye guro wa ukungu" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font" +msgstr "Ukubwa wa fonti" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3408,15 +3761,15 @@ msgid "Font size" msgstr "Ukubwa wa fonti" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3425,6 +3778,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3492,11 +3856,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "FreeType fonts" -msgstr "Fonti Freetype" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3525,10 +3884,6 @@ msgstr "" msgid "Full screen" msgstr "Kiwamba kizima" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Skrini BPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Hali-tumizi ya skrini nzima." @@ -3546,8 +3901,17 @@ msgid "GUI scaling filter txr2img" msgstr "GUI kipimo Kichujio txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Kuzalisha normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Michezo" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" #: src/settings_translation_file.cpp msgid "Global callbacks" @@ -3558,7 +3922,7 @@ msgstr "Callbacks ya kimataifa" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Ramani ya kimataifa kizazi sifa.\n" "Katika Mwandishi ramani v6 bendera ya 'kienyeji' udhibiti mapambo yote " @@ -3584,6 +3948,16 @@ msgstr "" msgid "Graphics" msgstr "Michoro" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Graphics Effects" +msgstr "Michoro" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Graphics and Audio" +msgstr "Michoro" + #: src/settings_translation_file.cpp msgid "Gravity" msgstr "Mvutano" @@ -3604,9 +3978,14 @@ msgid "HTTP mods" msgstr "HTTP Mods" #: src/settings_translation_file.cpp -msgid "HUD scale factor" +msgid "HUD" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "GUI kurekebisha" + #: src/settings_translation_file.cpp msgid "HUD toggle key" msgstr "HUD kibonye" @@ -3615,8 +3994,8 @@ msgstr "HUD kibonye" #, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "Utunzaji kwa deprecated lua ya API: - Rithi: (jaribu kwa) mimic zamani tabia " @@ -3650,7 +4029,9 @@ msgid "Heat noise" msgstr "Pango kelele #1" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "Kijenzi cha urefu wa ukubwa cha kidirisha awali." #: src/settings_translation_file.cpp @@ -3663,10 +4044,6 @@ msgstr "Windows kulia" msgid "Height select noise" msgstr "Mwandishi ramani v6 urefu Teua vigezo kelele" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "FPU kuu-usahihi" - #: src/settings_translation_file.cpp #, fuzzy msgid "Hill steepness" @@ -3868,13 +4245,21 @@ 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 "" "Seva kiasi kusubiri kabla ya kupakua mapblocks zisizotumika.\n" "Thamani ya juu zaidi ni laini, lakini kutumia RAM zaidi." +#: 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." @@ -3911,8 +4296,7 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" "Ikiwa kimelemazwa \"kutumia\" ufunguo ni kutumika kwa kuruka haraka kama " @@ -3940,13 +4324,19 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" "Ikiwa imewezeshwa, ufunguo wa \"kutumia\" badala ya \"sneak\" ufunguo ni " "kutumika kwa ajili ya kupanda na kushuka." +#: 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" @@ -3974,7 +4364,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 "Ikiwa imewezeshwa, wachezaji wapya haiwezi kujiunga na nywila wazi." #: src/settings_translation_file.cpp @@ -3994,6 +4387,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -4010,10 +4409,6 @@ msgstr "Kama hii ni kuweka, wachezaji mapenzi daima (re) spawn mahali fulani." msgid "Ignore world errors" msgstr "Kupuuza makosa ya ulimwengu" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "Katika mchezo" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -4049,7 +4444,8 @@ msgstr "" "Hii ni kawaida tu zinazohitajika kwa wachangiaji wa msingi/builtin" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Chombo chatcommands kwenye usajili." #: src/settings_translation_file.cpp @@ -4074,17 +4470,14 @@ msgstr "Ala ya kazi hatua ya kupakia fungu Modifiers kwenye usajili." msgid "Instrument the methods of entities on registration." msgstr "Instrument mbinu za vyombo kwenye usajili." -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "Instrumentation" - #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." msgstr "" "Muda wa kuhifadhi mabadiliko muhimu katika ulimwengu, alisema katika 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 "Muda wa kutuma wakati wa siku kwa wateja." #: src/settings_translation_file.cpp @@ -4138,6 +4531,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "Kifimbocheza kitufe marudio nafasi" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Kifimbocheza frustum unyeti" @@ -4237,6 +4634,17 @@ msgstr "" "Ona http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kuruka.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4382,6 +4790,17 @@ msgstr "" "Ona http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Muhimu kwa ajili ya kuruka.\n" +"Ona http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -4957,6 +5376,10 @@ msgstr "" "Ona http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -5019,7 +5442,7 @@ msgstr "Ufunguo wa kushoto" msgid "" "Length of a server tick and the interval at which objects are generally " "updated over\n" -"network." +"network, stated in seconds." msgstr "" "Urefu wa alama ya tiki seva na nafasi ambayo vitu ni kwa ujumla kusasaishwa " "kwenye mtandao." @@ -5035,19 +5458,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 "Urefu wa muda kati ya ABM utekelezaji mizunguko" #: 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 "Urefu wa muda kati ya mzunguko wa utekelezaji wa NodeTimer" #: 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 "Muda kati ya mizunguko ya usimamizi ya fungu amilifu" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- <nothing> (no logging)\n" @@ -5056,7 +5484,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "Kiwango cha ufunguaji kuandikwa kwa debug.txt:- <nothing>(Hakuna ufunguaji) " "- Hakuna (ujumbe na hakuna kiwango) - kosa - tahadhari - hatua - taarifa - " @@ -5086,6 +5515,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Taa laini" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -5167,11 +5601,6 @@ msgstr "Y ya upper kikomo ya kubwa pseudorandom cellars." msgid "Main menu script" msgstr "Hati ya Menyu kuu" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "Hati ya Menyu kuu" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5180,11 +5609,15 @@ msgstr "" "kuonyesha mwelekeo." #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "Hufanya DirectX kazi na LuaJIT. Lemaza ikiwa husababisha matatizo." +msgid "Makes all liquids opaque" +msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -5271,6 +5704,11 @@ msgstr "Kikomo cha kizazi cha ramani" msgid "Map save interval" msgstr "Ramani hifadhi muda" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Pata sasishi kioevu" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Kikomo cha Mapblock" @@ -5391,9 +5829,14 @@ msgid "Maximum FPS" msgstr "Ramprogrammen juu" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +#, fuzzy +msgid "Maximum FPS when the window is not focused, or when the game is paused." msgstr "Ramprogrammen juu wakati mchezo umesitishwa." +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" msgstr "Forceloaded upeo vitalu" @@ -5447,6 +5890,13 @@ msgstr "" "faili.\n" "Seti kwa wazi kwa kiasi sahihi ili uweze kuchaguliwa moja kwa moja." +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "Namba ya juu ya forceloaded mapblocks." @@ -5510,18 +5960,23 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +#, fuzzy +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" "Muda wa juu zaidi katika ms kupakua faili (kwa mfano upakuaji na Moduli) " "inaweza kuchukua." #: src/settings_translation_file.cpp -msgid "Maximum users" -msgstr "Watumiaji wa kiwango cha juu" +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" #: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Menyu" +msgid "Maximum users" +msgstr "Watumiaji wa kiwango cha juu" #: src/settings_translation_file.cpp msgid "Mesh cache" @@ -5572,12 +6027,26 @@ msgstr "Unamu wa kima cha chini cha ukubwa wa Vichujio" 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 "Usalama" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -5588,6 +6057,11 @@ msgstr "Monospace njia ya fonti" msgid "Monospace font size" msgstr "Ukubwa wa fonti wa Monospace" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "Ukubwa wa fonti wa Monospace" + #: src/settings_translation_file.cpp #, fuzzy msgid "Mountain height noise" @@ -5665,10 +6139,6 @@ msgstr "" msgid "Near plane" msgstr "" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Mtandao" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5677,6 +6147,11 @@ msgstr "" "Mtandao bandari kusikiliza (UDP).\n" "Thamani hii itakuwa kuuharibu wakati kuanzia Menyu kuu." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "Mtandao" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "Watumiaji wapya haja Ingiza nywila hii." @@ -5689,6 +6164,11 @@ msgstr "Noclip" msgid "Noclip key" msgstr "Ufunguo wa Noclip" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Fundo udhulisho" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "Fundo udhulisho" @@ -5701,14 +6181,6 @@ msgstr "Nafasi ya NodeTimer" msgid "Noises" msgstr "Kila" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Sampuli ya Normalmaps" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Nguvu ya Normalmaps" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Idadi ya nyuzi emerge" @@ -5728,23 +6200,16 @@ 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "Idadi ya vitalu ziada ambayo inaweza kupakiwa na /clearobjects mara moja.\n" "Hii ni mikinzano kati sqlite shughuli uendeshaji na matumizi ya kumbukumbu " "(4096 = 100 MB, kama kanuni ya thumb)." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Idadi ya parallax occlusion Marudiorudio." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5754,11 +6219,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5767,39 +6227,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Upendeleo wa jumla wa parallax occlusion athari, kawaida kipimo/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Kipimo cha jumla ya parallax occlusion athari." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Parallax occlusion" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Parallax occlusion upendeleo" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Parallax occlusion Marudiorudio" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Parallax occlusion hali" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "Parallax occlusion wadogo" +msgid "Optional override for chat weblink color." +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5822,17 +6255,13 @@ msgstr "Njia ya orodha ya unamu. Unamu wote vinatafutizwa kwanza kutoka hapa." #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5862,6 +6291,16 @@ msgstr "Kuruka ufunguo" msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "Kuruka ufunguo" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "Bofya kulia marudio nafasi" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5870,10 +6309,6 @@ msgstr "" "Mchezaji ni uwezo wa kuruka bila kuwa walioathirika na mvuto.\n" "Hii inahitaji upendeleo \"kuruka\" kwenye seva." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Jina la mchezaji" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Umbali wa uhamisho wa mchezaji" @@ -5883,6 +6318,11 @@ msgstr "Umbali wa uhamisho wa mchezaji" msgid "Player versus player" msgstr "Mchezaji dhidi ya mchezaji" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "Uchujaji wa bilinear" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5922,10 +6362,6 @@ msgstr "Profiler" msgid "Profiler toggle key" msgstr "Profiler kibonye" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Ubainishaji wa" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5933,9 +6369,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -6033,10 +6469,6 @@ msgstr "Mwandishi ramani v7 mlima urefu kelele vigezo" msgid "Right key" msgstr "Ufunguo sahihi" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Bofya kulia marudio nafasi" - #: src/settings_translation_file.cpp #, fuzzy msgid "River channel depth" @@ -6118,6 +6550,11 @@ msgstr "" "chini, wanatengeneza ukungu wa jinsia pikseli baadhi makali wakati picha ni " "yamesimamisha na ukubwa wa yasiyo ya takwimu." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Screenshot" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Urefu wa kiwamba" @@ -6148,6 +6585,11 @@ msgstr "" "1 maana ubora mbaya; 100 humaanisha ubora.\n" "Tumia 0 kwa ubora wa chaguo-msingi." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Screenshot" + #: src/settings_translation_file.cpp #, fuzzy msgid "Seabed noise" @@ -6161,10 +6603,6 @@ msgstr "" msgid "Second of two 3D noises that together define tunnels." msgstr "" -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "Usalama" - #: src/settings_translation_file.cpp #, fuzzy msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6226,8 +6664,19 @@ msgstr "" "18 = 4 D seti ya julia \"Mandelbulb\"." #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Seva / Singleplayer" +#, fuzzy +msgid "Server" +msgstr "URL ya seva" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "Jina la seva" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Maelezo ya seva" #: src/settings_translation_file.cpp msgid "Server URL" @@ -6253,10 +6702,20 @@ msgstr "Kituo tarishi cha seva" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Kituo tarishi cha seva" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "URL ya Serverlist" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "URL ya Serverlist" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Faili ya Serverlist" @@ -6270,9 +6729,40 @@ msgstr "" "Kuanza upya inahitajika baada ya kubadilisha hii." #: 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Kuweka huwezesha kweli waving majani.\n" +"Inahitaji shaders kwa kuwezeshwa." + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6300,6 +6790,13 @@ msgstr "" "Kuweka huwezesha kweli waving mimea.\n" "Inahitaji shaders kwa kuwezeshwa." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp #, fuzzy msgid "Shader path" @@ -6317,6 +6814,24 @@ msgstr "" "ya kadi ya video.\n" "Kazi yako tu na OpenGL video backend." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "Screenshot ubora" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "Unamu wa kima cha chini cha ukubwa wa Vichujio" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6325,11 +6840,8 @@ msgid "" msgstr "Fonti kivuli Sawazisha, kama 0 basi kivuli itakuwa kuchukuliwa." #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "Fonti kivuli Sawazisha, kama 0 basi kivuli itakuwa kuchukuliwa." +msgid "Shadow strength gamma" +msgstr "" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6343,6 +6855,19 @@ msgstr "Onyesha maelezo kuhusu marekebisho" msgid "Show entity selection boxes" msgstr "Onyesha chombo masanduku ya uteuzi" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Seti lugha. Acha tupu kwa kutumia lugha ya mfumo.\n" +"Kuanza upya inahitajika baada ya kubadilisha hii." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Uzimaji ujumbe" @@ -6364,6 +6889,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -6423,20 +6952,15 @@ msgstr "Kutembea kasi" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "Fonti kivuli Alfa" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Sauti" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "Zawadi muhimu" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key for climbing/descending" -msgstr "Matumizi muhimu kwa ajili ya kupanda/kushuka" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6457,6 +6981,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6487,10 +7019,6 @@ msgstr "Mwandishi ramani v7 mlima urefu kelele vigezo" msgid "Strength of 3D mode parallax." msgstr "Nguvu ya parallax." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Nguvu ya normalmaps inayozalishwa." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6528,6 +7056,11 @@ msgstr "SQLite Uvingirizi" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Vipimo vya" + #: src/settings_translation_file.cpp #, fuzzy msgid "Terrain alternative noise" @@ -6581,6 +7114,13 @@ msgstr "" msgid "Texture path" msgstr "Njia ya unamu" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6595,6 +7135,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6658,18 +7202,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "Unyeti wa Jira kifimbocheza kwa kuzunguka Mwoneko ingame frustum." #: src/settings_translation_file.cpp @@ -6694,6 +7239,12 @@ msgstr "" "uwezo hadi jaribio ni alifanya kupungua ukubwa wake na utupaji vipengee " "kongwe ya foleni. Thamani ya 0 Hulemaza utendaji." +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6705,9 +7256,8 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" "Wakati katika sekunde inachukua kati ya vibonyezo mara kwa mara sahihi " "wakati wa kufanya kitufe cha kulia." @@ -6748,7 +7298,8 @@ msgid "Time speed" msgstr "Kasi ya muda" #: 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 "" "Muda wa kuisha kwa mteja kuondoa data ya ramani zisizotumika kutoka kwa " "kumbukumbu." @@ -6777,6 +7328,19 @@ msgstr "Kidokezozana kuchelewa" msgid "Touch screen threshold" msgstr "Touchthreshold (px)" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Touchscreen" +msgstr "Touchthreshold (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 "" @@ -6852,15 +7416,30 @@ msgstr "Tumia uchujaji bilinear wakati upimaji unamu." #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." msgstr "Tumia uchujaji trilinear wakati upimaji unamu." +#: src/settings_translation_file.cpp +msgid "User Interfaces" +msgstr "" + #: src/settings_translation_file.cpp msgid "VBO" msgstr "VBO" @@ -6964,7 +7543,7 @@ msgid "Viewing range" msgstr "Kuonyesha masafa" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -7046,6 +7625,11 @@ msgstr "Waving maji urefu" msgid "Waving plants" msgstr "Waving mimea" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "Uteuzi kikasha rangi" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7075,9 +7659,8 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7090,14 +7673,10 @@ msgstr "" "anisotropic ni kuwezeshwa." #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Kama freetype fonti hutumiwa, inahitaji msaada wa freetype kuwa alikusanya " -"katika." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7135,6 +7714,15 @@ msgid "" "pause menu." 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)." @@ -7142,7 +7730,8 @@ msgstr "" "Kama kuonyesha mteja Rekebisha taarifa (ina athari sawa kama kupiga F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "Upana sehemu ya ukubwa cha kidirisha awali." #: src/settings_translation_file.cpp @@ -7231,71 +7820,40 @@ msgstr "" 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 muda wa upakuzi wa faili" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "muda wa kuisha wa cURL" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL kikomo sambamba" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "muda wa kuisha wa cURL" - -#~ msgid "Toggle Cinematic" -#~ msgstr "Togoa Cinematic" +#, fuzzy +#~ msgid "- Creative Mode: " +#~ msgstr "Hali ya ubunifu" #, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "Teua faili ya Moduli:" +#~ msgid "- Damage: " +#~ msgstr "Uharibifu" -#, fuzzy -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Y ya upper kikomo ya kubwa pseudorandom cellars." - -#~ msgid "Waving Water" -#~ msgstr "Waving maji" - -#~ msgid "Waving water" -#~ msgstr "Waving maji" - -#~ msgid "This font will be used for certain languages." -#~ msgstr "Fonti hii itatumika kwa lugha fulani." - -#, fuzzy -#~ msgid "Shadow limit" -#~ msgstr "Kikomo cha Mapblock" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "Njia ya TrueTypeFont au vitone michoro." - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "Kina ya pango kubwa" - -#~ msgid "IPv6 support." -#~ msgstr "IPv6 msaada." - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Fonti kivuli Alfa (opaqueness kati ya 0 na 255)." - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Huwezesha toni filmic ramani" - -#~ msgid "Enable VBO" -#~ msgstr "Wezesha VBO" - -#, fuzzy -#~ msgid "Darkness sharpness" -#~ msgstr "Mwandishi ramani ziwa gorofa mwinuko" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Vidhibiti vya upana wa vichuguu, thamani ndogo huunda vichuguu pana." +#~ "0 = parallax occlusion na taarifa ya mteremko (haraka).\n" +#~ "1 = ramani ya misaada (polepole, sahihi zaidi)." + +#~ msgid "Address / Port" +#~ msgstr "Kushughulikia / bandari" #, fuzzy #~ msgid "" @@ -7306,21 +7864,326 @@ msgstr "muda wa kuisha wa cURL" #~ "Rekebisha simbiko gamma kwa majedwali mwanga. Idadi ya chini ni mkali.\n" #~ "Kipimo hiki ni kwa ajili ya mteja tu na ni kupuuzwa na seva." -#~ msgid "Path to save screenshots at." -#~ msgstr "Njia ya kuokoa viwambo katika." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Je, una hakika upya ulimwengu wako singleplayer?" -#~ msgid "Parallax occlusion strength" -#~ msgstr "Parallax occlusion nguvu" +#~ msgid "Back" +#~ msgstr "Nyuma" -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Kikomo ya foleni emerge kwenye diski" +#~ msgid "Basic" +#~ msgstr "Msingi" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "" +#~ "Biti kwa pikseli (a.k.a rangi kina) katika hali-tumizi ya skrini nzima." + +#~ msgid "Bump Mapping" +#~ msgstr "Mapema ramani" + +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmapping" + +#~ msgid "Config mods" +#~ msgstr "Mods Now" + +#~ msgid "Configure" +#~ msgstr "Sanidi" + +#~ msgid "Connect" +#~ msgstr "Kuunganisha" + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Vidhibiti vya upana wa vichuguu, thamani ndogo huunda vichuguu pana." + +#~ msgid "Credits" +#~ msgstr "Mikopo" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Rangi ya crosshair (R, G, B)." + +#~ msgid "Damage enabled" +#~ msgstr "Uharibifu kuwezeshwa" + +#, fuzzy +#~ msgid "Darkness sharpness" +#~ msgstr "Mwandishi ramani ziwa gorofa mwinuko" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "Chaguo-msingi muda wa kuisha kwa cURL, alisema katika milisekunde.\n" +#~ "Tu ina athari kama alikusanya na Mkunjo." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Inafasili hatua ya sampuli ya unamu.\n" +#~ "Thamani ya juu zaidi matokeo katika ramani ya laini ya kawaida." + +#~ msgid "Del. Favorite" +#~ msgstr "Del. kipendwa" + +#, fuzzy +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "Pakua subgame, kama vile minetest_game, kutoka minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Pakua moja kutoka minetest.net" #, fuzzy #~ msgid "Downloading and installing $1, please wait..." #~ msgstr "Inapakua $1, Tafadhali subiri..." -#~ msgid "Back" -#~ msgstr "Nyuma" +#~ msgid "Enable VBO" +#~ msgstr "Wezesha VBO" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Inawezesha bumpmapping kwa ajili ya unamu. Normalmaps haja iwekwe kwa " +#~ "pakiti ya unamu au haja ya kuwa yaliyozalishwa na otomatiki.\n" +#~ "Inahitaji shaders kwa kuwezeshwa." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Huwezesha toni filmic ramani" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Huwezesha kwenye kizazi cha normalmap kuruka (Emboss athari).\n" +#~ "Inahitaji bumpmapping kwa kuwezeshwa." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Huwezesha parallax occlusion uramanishi.\n" +#~ "Inahitaji shaders kwa kuwezeshwa." + +#~ msgid "Enter " +#~ msgstr "Ingiza" + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Chaguo majaribio, inaweza kusababisha nafasi inayoonekana kati ya vitalu " +#~ "wakati kuweka namba ya juu zaidi kuliko 0." + +#~ msgid "FPS in pause menu" +#~ msgstr "Ramprogrammen katika Menyu ya mapumziko" + +#~ msgid "Fallback font shadow" +#~ msgstr "Fonti amebadilisha kivuli" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Fonti amebadilisha kivuli Alfa" + +#~ msgid "Fallback font size" +#~ msgstr "Ukubwa fonti amebadilisha" + +#~ msgid "Filtering" +#~ msgstr "Uchujaji" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Fonti kivuli Alfa (opaqueness kati ya 0 na 255)." + +#, fuzzy +#~ msgid "FreeType fonts" +#~ msgstr "Fonti Freetype" + +#~ msgid "Full screen BPP" +#~ msgstr "Skrini BPP" + +#~ msgid "Game" +#~ msgstr "Mchezo" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#, fuzzy +#~ msgid "Generate Normal Maps" +#~ msgstr "Kuzalisha normalmaps" + +#~ msgid "Generate normalmaps" +#~ msgstr "Kuzalisha normalmaps" + +#~ msgid "High-precision FPU" +#~ msgstr "FPU kuu-usahihi" + +#~ msgid "IPv6 support." +#~ msgstr "IPv6 msaada." + +#~ msgid "In-Game" +#~ msgstr "Katika mchezo" + +#, fuzzy +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Sakinisha Moduli: faili: \"$1\"" + +#~ msgid "Instrumentation" +#~ msgstr "Instrumentation" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Keybindings. (Kama Menyu hii screws, Ondoa vitu kutoka minetest.conf)" + +#, fuzzy +#~ msgid "Lava depth" +#~ msgstr "Kina ya pango kubwa" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Kikomo ya foleni emerge kwenye diski" + +#~ msgid "Main" +#~ msgstr "Kuu" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "Hati ya Menyu kuu" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "Hufanya DirectX kazi na LuaJIT. Lemaza ikiwa husababisha matatizo." + +#~ msgid "Menus" +#~ msgstr "Menyu" + +#~ msgid "Name / Password" +#~ msgstr "Jina / nenosiri" + +#~ msgid "Name/Password" +#~ msgstr "Jina/nenosiri" + +#~ msgid "No" +#~ msgstr "La" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Sampuli ya Normalmaps" + +#~ msgid "Normalmaps strength" +#~ msgstr "Nguvu ya Normalmaps" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Idadi ya parallax occlusion Marudiorudio." #~ msgid "Ok" #~ msgstr "Sawa kabisa" + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "Upendeleo wa jumla wa parallax occlusion athari, kawaida kipimo/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Kipimo cha jumla ya parallax occlusion athari." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax Occlusion" + +#~ msgid "Parallax occlusion" +#~ msgstr "Parallax occlusion" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Parallax occlusion upendeleo" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Parallax occlusion Marudiorudio" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Parallax occlusion hali" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "Parallax occlusion wadogo" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Parallax occlusion nguvu" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "Njia ya TrueTypeFont au vitone michoro." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Njia ya kuokoa viwambo katika." + +#~ msgid "Player name" +#~ msgstr "Jina la mchezaji" + +#~ msgid "Profiling" +#~ msgstr "Ubainishaji wa" + +#~ msgid "PvP enabled" +#~ msgstr "PvP kuwezeshwa" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Weka upya singleplayer ulimwengu" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "Teua faili ya Moduli:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Seva / Singleplayer" + +#, fuzzy +#~ msgid "Shadow limit" +#~ msgstr "Kikomo cha Mapblock" + +#, fuzzy +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "Fonti kivuli Sawazisha, kama 0 basi kivuli itakuwa kuchukuliwa." + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "Zawadi muhimu" + +#~ msgid "Start Singleplayer" +#~ msgstr "Kuanza Singleplayer" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Nguvu ya normalmaps inayozalishwa." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Fonti hii itatumika kwa lugha fulani." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Ili kuwezesha shaders OpenGL ya kiendeshaji inahitaji kutumiwa." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Togoa Cinematic" + +#~ msgid "Waving Water" +#~ msgstr "Waving maji" + +#~ msgid "Waving water" +#~ msgstr "Waving maji" + +#, fuzzy +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Kama freetype fonti hutumiwa, inahitaji msaada wa freetype kuwa " +#~ "alikusanya katika." + +#, fuzzy +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Y ya upper kikomo ya kubwa pseudorandom cellars." + +#~ msgid "Yes" +#~ msgstr "Ndio" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Umekufa." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/th/minetest.po b/po/th/minetest.po index 72490f111..03ce5e44d 100644 --- a/po/th/minetest.po +++ b/po/th/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Thai (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-07-08 08:41+0000\n" -"Last-Translator: TZTarzan <khunsatyptiphan@gmail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-03-18 01:05+0000\n" +"Last-Translator: Thomas Wiegand <weblate.org@wiegand.info>\n" "Language-Team: Thai <https://hosted.weblate.org/projects/minetest/minetest/" "th/>\n" "Language: th\n" @@ -12,7 +12,43 @@ 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.2-dev\n" +"X-Generator: Weblate 4.12-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "ขนาดสูงสุดของคิวการแชทนอก" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "คำสั่งว่างเปล่า" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "ออกไปยังเมนูหลัก" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "คำสั่งไม่ถูกต้อง: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "คำสั่งที่มีปัญหา: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "รายชื่อผู้เล่นที่ออนไลน์" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "ผู้เล่นที่ออนไลน์: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "คิวนอกแชทว่างเปล่า" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "คำสั่งนี้ถูกปิดการใช้งานโดยเซิร์ฟเวอร์" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,14 +58,43 @@ msgstr "เกิดใหม่" msgid "You died" msgstr "คุณตายแล้ว" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "คำสั่งที่ใช้ได้:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "คำสั่งที่ใช้ได้: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "ไม่มีคำสั่ง: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[ทั้งหมด | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "ตกลง" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<ไม่มี>" #: builtin/fstk/ui.lua -#, fuzzy msgid "An error occurred in a Lua script:" -msgstr "เกิดข้อผิดพลาดในสคริปต์ Lua เช่น mod:" +msgstr "เกิดข้อผิดพลาดในสคริปต์ลูอา เช่น ม็อด:" #: builtin/fstk/ui.lua msgid "An error occurred:" @@ -47,9 +112,30 @@ msgstr "เชื่อมต่อใหม่" msgid "The server has requested a reconnect:" msgstr "เซิร์ฟเวอร์ได้ร้องขอการเชื่อมต่อใหม่:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "กำลังโหลด..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "เลือก 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. " @@ -64,10 +150,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "เซิร์ฟเวอร์ที่สนับสนุนเวอร์ชันโพรโทคอลระหว่าง $1 และ $2 " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"ลองเปิดใช้งานเซิร์ฟเวอร์ลิสต์สาธารณะอีกครั้งและตรวจสอบการเชื่อมต่ออินเทอร์เน็" -"ต" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,17 +161,26 @@ msgstr "เราสนับสนุนโพรโทคอลเวอร์ msgid "We support protocol versions between version $1 and $2." msgstr "เราสนับสนุนโพรโทคอลระหว่างเวอร์ชัน $1 และ $2" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "ยกเลิก" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "ไฟล์อ้างอิง:" @@ -112,39 +205,36 @@ msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"ไม่สามารถเปิดใช้งานม็อด '$1' ซึ่งประกอบด้วยตัวอักษรที่ไม่ได้รับอนุญาต ตัวอั" -"กษร [a-z0-9_] เท่านั้นที่ได้รับอนุญาต" +"ไม่สามารถเปิดใช้งานม็อด '$1' ซึ่งประกอบด้วยตัวอักษรที่ไม่ได้รับอนุญาต ตัวอักษร [a-z0-9_] " +"เท่านั้นที่ได้รับอนุญาต" #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "ค้นหา Mods เพิ่มเติม" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "ม็อด:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No (optional) dependencies" -msgstr "เสริม อ้างอิง:" +msgstr "ไม่มีการพึ่งพา (ไม่จำเป็น)" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." msgstr "ไม่มีคำอธิบายของเกมที่ให้มา" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "ไม่มีการอ้างอิง." +msgstr "ไม่มีการอ้างอิง" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." msgstr "ไม่มีคำอธิบายของม็อดแพ็คที่ให้มา" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No optional dependencies" -msgstr "เสริม อ้างอิง:" +msgstr "เสริม อ้างอิง" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" @@ -163,20 +253,59 @@ msgstr "โลก:" msgid "enabled" msgstr "เปิดใช้งานแล้ว" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "มี \"$1\" อยู่แล้ว คุณต้องการเขียนทับหรือไม่ ?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "การอ้างอิง $1 และ $2 จะถูกติดตั้ง." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "$1 โหลด ..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 ไม่พบการพึ่งพาที่จำเป็น." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 จะถูกติดตั้ง และการขึ้นต่อกัน $2 จะถูกข้ามไป." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "แพคเกจทั้งหมด" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "ติดตั้งแล้ว" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "กลับไปยังเมนูหลัก" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +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 -#, fuzzy msgid "Downloading..." msgstr "โหลด ..." @@ -185,7 +314,6 @@ msgid "Failed to download $1" msgstr "ไม่สามารถดาวน์โหลด $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "เกม" @@ -194,7 +322,18 @@ msgid "Install" msgstr "ติดตั้ง" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "ติดตั้ง $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "ไฟล์อ้างอิงที่เลือกใช้ได้" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "ติดตั้ง: ประเภทไฟล์ที่ไม่รองรับหรือไฟล์เก็บถาวรที่ใช้งานไม่ได้" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "ม็อด" @@ -207,9 +346,24 @@ msgid "No results" msgstr "ไม่มีผลลัพธ์" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "ค้นหา" +msgid "No updates" +msgstr "ไม่มีการปรับปรุง" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "ไม่พบ" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "เขียนทับ" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "โปรดตรวจสอบว่าเกมหลักถูกต้อง." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "เข้าคิว" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -224,8 +378,12 @@ msgid "Update" msgstr "อัปเดต" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "อัปเดต All [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "ดูข้อมูลเพิ่มเติมในเว็บเบราว์เซอร์" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -233,119 +391,117 @@ 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" -msgstr "" +msgstr "การผสมไบโอม" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" -msgstr "" +msgstr "ไบโอมส์" #: builtin/mainmenu/dlg_create_world.lua msgid "Caverns" -msgstr "" +msgstr "ถ้ำ" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "ความละเอียดของการสุ่ม" +msgstr "ถ้ำ" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "สร้าง" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "ข้อมูล:" +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 "คำเตือน: การทดสอบพัฒนาน้อยที่สุดมีความหมายสำหรับนักพัฒนา." #: 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 "Floatlands (ทดลอง)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "สร้างภูมิประเทศที่ไม่เป็นเศษส่วน: มหาสมุทรและใต้ดิน" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "ฮิลส์" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 msgid "Lakes" -msgstr "" +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 -#, fuzzy msgid "Mapgen" -msgstr "Mapgen" +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" -msgstr "" +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" @@ -353,19 +509,19 @@ 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" -msgstr "" +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 @@ -374,50 +530,45 @@ msgstr "เมล็ดพันธุ์" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "การเปลี่ยนแปลงที่ราบรื่นระหว่างไบโอม" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" -msgstr "" +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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "คำเตือน: การทดสอบพัฒนาน้อยที่สุดมีความหมายสำหรับนักพัฒนา" +msgstr "ถ้ำขนาดใหญ่ที่อยู่ลึกลงไปใต้ดิน" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -429,7 +580,7 @@ msgstr "คุณไม่มีเกมที่ติดตั้ง" #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "คุณแน่ใจหรือไม่ที่จะต้องการลบ '$1'" +msgstr "คุณแน่ใจหรือไม่ที่จะต้องการลบ '$1' ?" #: builtin/mainmenu/dlg_delete_content.lua #: builtin/mainmenu/dlg_delete_world.lua builtin/mainmenu/tab_local.lua @@ -447,7 +598,40 @@ msgstr "pkgmgr: พาธของ \"$1\" ไม่ถูกต้อง" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "ลบโลก \"$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 +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" @@ -461,9 +645,7 @@ msgstr "เปลี่ยนชื่อม็อดแพ็ค:" msgid "" "This modpack has an explicit name given in its modpack.conf which will " "override any renaming here." -msgstr "" -"ม็อดแพ็คมีชื่อชื่อที่ถูกตั้งในไฟล์ modpack.conf " -"ซึ่งจะแทนที่ชื่อที่เปลี่ยนตรงนี้" +msgstr "ม็อดแพ็คมีชื่อชื่อที่ถูกตั้งในไฟล์ modpack.conf ซึ่งจะแทนที่ชื่อที่เปลี่ยนตรงนี้" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" @@ -482,6 +664,16 @@ 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 "ปิดการใช้งานแล้ว" @@ -494,9 +686,8 @@ msgid "Enabled" msgstr "เปิดใช้งานแล้ว" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Lacunarity" -msgstr "Lacunarity" +msgstr "ความไม่ชัดเจน" #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy @@ -508,8 +699,8 @@ msgid "Offset" msgstr "ค่าชดเชย" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" -msgstr "ความมีอยู่" +msgid "Persistence" +msgstr "วิริยะ" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." @@ -527,6 +718,10 @@ msgstr "คืนค่าเริ่มต้น" msgid "Scale" msgstr "ขนาด" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "ค้นหา" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "เลือกไดเรกทอรี" @@ -535,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 "แสดงชื่อทางเทคนิค" @@ -614,14 +809,6 @@ msgstr "ติดตั้ง Mod: ไม่สามารถค้นหาช msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "ติดตั้ง Mod: ไม่สามารถค้นหาชื่อของโฟลเดอร์ที่เหมาะสมสำหรับ modpack $1" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "ติดตั้ง: ชนิดแฟ้มที่ไม่สนับสนุน \"$1\" หรือเกิดการเสียหาย" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "ติดตั้ง: ไฟล์: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "ค้าหาไม่พบ mod หรือ modpack" @@ -636,12 +823,65 @@ msgstr "ไม่สามารถติดตั้งเกม $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" -msgstr "ไม่สามารถติดตั้ง mod $1" +msgstr "ไม่สามารถติดตั้ง mod $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a modpack as a $1" msgstr "ไม่สามารถติดตั้ง modpack ที่ $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "กำลังโหลด..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "รายชื่อเซิร์ฟเวอร์สาธารณะถูกปิดใช้งาน" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "ลองเปิดใช้งานเซิร์ฟเวอร์ลิสต์สาธารณะอีกครั้งและตรวจสอบการเชื่อมต่ออินเทอร์เน็ต" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "เกี่ยวกับ" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "ผู้ร่วมให้ข้อมูล" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "ตัวแสดงผลที่ใช้งานอยู่:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "นักพัฒนาหลัก" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "ผู้สนับสนุนก่อนหน้า" + +#: builtin/mainmenu/tab_about.lua +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 "เรียกดูเนื้อหาออนไลน์" @@ -682,26 +922,6 @@ msgstr "ถอนการติดตั้งแพคเกจ" msgid "Use Texture Pack" msgstr "ใช้พื้นผิว Texture" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "ผู้ร่วมให้ข้อมูล" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "นักพัฒนาหลัก" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "เครดิต" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "ผู้สนับสนุนก่อนหน้า" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "นักพัฒนาหลักก่อนหน้า" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "ประกาศ เซิร์ฟเวอร์" @@ -711,14 +931,10 @@ msgid "Bind Address" msgstr "ผูกที่อยู่" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "กำหนดค่า" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "โหมดสร้างสรรค์" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "เปิดใช้งานความเสียหาย" @@ -732,11 +948,7 @@ msgstr "เซิร์ฟเวอร์" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "ชื่อ/รหัสผ่าน" +msgstr "ติดตั้งเกมจาก ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -750,10 +962,14 @@ msgstr "ยังไม่มีการสร้างโลก หรือ msgid "Play Game" msgstr "เล่นเกม" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "พอร์ต" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "เลือก Mods" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "เลือกโลก:" @@ -767,45 +983,62 @@ msgid "Start Game" msgstr "เริ่มเกม" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "ที่อยู่ / พอร์ต" +msgid "Address" +msgstr "ที่อยู่" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "เชื่อมต่อ" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "ล้าง" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "โหมดสร้างสรรค์" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "ความเสียหาย ที่เปิดใช้งาน" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "ดาเมจ / ผู้เล่นผ่านเครื่องเล่น" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "ลบรายการโปรด" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "รายการโปรด" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "ชื่นชอบ" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "เซิร์ฟเวอร์ที่เข้ากันไม่ได้" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "เข้าร่วมเกม" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "ชื่อ / รหัสผ่าน" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "เวลาตอบสนอง" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "PvP เปิดใช้งาน" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "เซิฟเวอร์สาธารณะ" + +#: builtin/mainmenu/tab_online.lua +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" @@ -831,10 +1064,6 @@ msgstr "การตั้งค่าทั้งหมด" msgid "Antialiasing:" msgstr "ลบรอยหยัก:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "การตั้งค่าของคุณโลก singleplayer แน่ใจหรือไม่?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "ขนาดหน้าจอบันทึกอัตโนมัติ" @@ -843,10 +1072,6 @@ msgstr "ขนาดหน้าจอบันทึกอัตโนมัต msgid "Bilinear Filter" msgstr "กรอง bilinear" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "การแม็ป ชน" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "เปลี่ยนคีย์" @@ -855,13 +1080,30 @@ msgstr "เปลี่ยนคีย์" msgid "Connected Glass" msgstr "เชื่อมต่อแก้ว" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "เงาแบบไดนามิก" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "เงาแบบไดนามิก: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "ใบไม้" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "สร้างแผนที่ปกติ" +msgid "High" +msgstr "สูง" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "ต่ำ" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "ปานกลาง" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -871,10 +1113,6 @@ msgstr "แผนที่ย่อ" msgid "Mipmap + Aniso. Filter" msgstr "แผนที่ย่อ + Aniso.กรอง" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "ไม่" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "ไม่มีตัวกรอง" @@ -903,19 +1141,10 @@ msgstr "ใบทึบ" msgid "Opaque Water" msgstr "น้ำขุ่น" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax Occlusion" -msgstr "Parallax อุดตัน" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "อนุภาค" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "รีเซ็ต singleplayer โลก" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "หน้าจอ:" @@ -925,14 +1154,16 @@ msgid "Settings" msgstr "การตั้งค่า" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -#, fuzzy msgid "Shaders" -msgstr "Shaders" +msgstr "เฉดสี" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "เฉดสี (ไม่พร้อมใช้งาน)" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Shaders (unavailable)" -msgstr "Shaders (ไม่พร้อมใช้งาน)" +msgstr "เฉดสี (ไม่พร้อมใช้งาน)" #: builtin/mainmenu/tab_settings.lua msgid "Simple Leaves" @@ -946,53 +1177,46 @@ msgstr "โคมไฟเรียบ" msgid "Texturing:" msgstr "พื้นผิว:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "การเปิดใช้งานต้องมีโปรแกรมควบคุม OpenGL ของ shaders ใช้." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "การแมปโทน" #: builtin/mainmenu/tab_settings.lua #, fuzzy -msgid "Touchthreshold: (px)" -msgstr "Touchthreshold: (px)" +msgid "Touch threshold (px):" +msgstr "ขีด จำกัด: (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "กรอง trilinear" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "สูงเป็นพิเศษ" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "ต่ำมาก" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "ใบโบก" #: builtin/mainmenu/tab_settings.lua -#, fuzzy msgid "Waving Liquids" -msgstr "โบกโหนด" +msgstr "โบกของเหลว" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" msgstr "โบกไม้" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "ใช่" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "กำหนดค่าวัยรุ่น" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "หลัก" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "การเชื่อมต่อหมดเวลา" @@ -1021,8 +1245,8 @@ msgid "Connection error (timed out?)" msgstr "ข้อผิดพลาดการเชื่อมต่อ (หมดเวลา?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "ไม่สามารถค้นหา หรือโหลดเกม" +msgid "Could not find or load game: " +msgstr "ไม่พบหรือโหลดเกม: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1052,39 +1276,18 @@ msgstr "รหัสผ่านให้ไฟล์ไม่สามารถ msgid "Provided world path doesn't exist: " msgstr "โลกมีเส้นไม่มี: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp -#, fuzzy msgid "" "\n" "Check debug.txt for details." msgstr "" "\n" -"ตรวจสอบรายละเอียด debug.txt." +"ตรวจสอบรายละเอียด debug.txt." #: src/client/game.cpp msgid "- Address: " msgstr "-ที่อยู่: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "-โหมดสร้างสรรค์: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "-ความเสียหาย: " - #: src/client/game.cpp msgid "- Mode: " msgstr "-โหมด: " @@ -1099,14 +1302,22 @@ msgstr "-ประชาชน: " #. ~ PvP = Player versus Player #: src/client/game.cpp -#, fuzzy msgid "- PvP: " -msgstr "- PvP: " +msgstr "- ผู้เล่นวีซ่าผู้เล่น: " #: src/client/game.cpp msgid "- Server Name: " msgstr "-ชื่อเซิร์ฟเวอร์: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "เกิดข้อผิดพลาดในการทำให้เป็นอันดับ:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "ปฏิเสธการเข้าใช้. เหตุผล: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "ปิดใช้งานการส่งต่ออัตโนมัติ" @@ -1115,6 +1326,22 @@ msgstr "ปิดใช้งานการส่งต่ออัตโนม msgid "Automatic forward enabled" msgstr "เปิดใช้งานการส่งต่ออัตโนมัติ" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "บล็อกขอบเขตที่ซ่อนอยู่" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "แสดงขอบเขตบล็อกสำหรับบล็อกทั้งหมด" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "ขอบเขตบล็อกที่แสดงสำหรับบล็อกปัจจุบัน" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "แสดงขอบเขตบล็อกสำหรับบล็อกใกล้เคียง" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "ปิดใช้งานการอัปเดตกล้องแล้ว" @@ -1123,6 +1350,11 @@ msgstr "ปิดใช้งานการอัปเดตกล้องแ msgid "Camera update enabled" msgstr "เปิดใช้งานการอัปเดตกล้องแล้ว" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "ไม่สามารถแสดงขอบเขตการบล็อก (ต้องการสิทธิ์ 'basic_debug')" + #: src/client/game.cpp msgid "Change Password" msgstr "เปลี่ยนรหัสผ่าน" @@ -1135,6 +1367,10 @@ msgstr "ปิดใช้งานโหมดภาพยนตร์" msgid "Cinematic mode enabled" msgstr "เปิดใช้งานโหมดภาพยนตร์" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "ไคลเอ็นต์ถูกตัดการเชื่อมต่อ" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "การเขียนสคริปต์ฝั่งไคลเอ็นต์ถูกปิดใช้งาน" @@ -1143,42 +1379,51 @@ msgstr "การเขียนสคริปต์ฝั่งไคลเอ msgid "Connecting to server..." msgstr "เชื่อมต่อกับเซิร์ฟเวอร์" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "การเชื่อมต่อล้มเหลวโดยไม่ทราบสาเหตุ" + #: src/client/game.cpp msgid "Continue" msgstr "ต่อ" #: src/client/game.cpp -#, fuzzy, c-format +#, c-format msgid "" "Controls:\n" "- %s: move forwards\n" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" "การควบคุม:\n" -"-%s1: เลื่อนไปข้างหน้า\n" -"-%s2: เลื่อนไปข้างหลัง\n" -"-%s3: เลื่อนไปทางซ้าย\n" -"-%s4: เลื่อนไปทางขวา\n" -"-%s5: กระโดด / ปีน\n" -"-%s6: แอบดู / ลงไป\n" -"-%s7: วางรายการ\n" -"-%s8: สินค้าคงคลัง\n" -"- เมาส์: เลี้ยว / มอง\n" -"- เมาส์ซ้าย: ขุด / เจาะ\n" -"- เมาส์ขวา: สถานที่ / การใช้งาน\n" -"- ล้อเมาส์: เลือกรายการ\n" -"-%s9: แชท\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 "ไม่สามารถแก้ไขที่อยู่: %s" #: src/client/game.cpp msgid "Creating client..." @@ -1222,11 +1467,11 @@ msgstr "" "- นิ้วสไลด์: มองไปรอบ ๆ\n" "เมนู / คลังโฆษณาปรากฏ:\n" "- แตะสองครั้ง (นอก):\n" -" -> ใกล้\n" +"-> ใกล้\n" "- สแต็กสัมผัส, สล็อตสัมผัส:\n" -" -> ย้ายสแต็ก\n" +"-> ย้ายสแต็ก\n" "- แตะแล้วลากแตะนิ้วที่สอง\n" -" -> วางรายการเดียวไปยังสล็อต\n" +"-> วางรายการเดียวไปยังสล็อต\n" #: src/client/game.cpp msgid "Disabled unlimited viewing range" @@ -1236,6 +1481,11 @@ msgstr "ปิดใช้งานช่วงการดูไม่ จำ 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 "ออกจากเมนู" @@ -1309,35 +1559,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "แผนที่ย่อในปัจจุบันถูกปิดใช้งานโดยเกมหรือตัวดัดแปลง" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "แผนที่ย่อซ่อนอยู่" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "แผนที่ย่อในโหมดเรดาร์, ซูม x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "แผนที่ย่อในโหมดเรดาร์, ซูม x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "แผนที่ย่อในโหมดเรดาร์, ซูม x4" - -#: src/client/game.cpp -#, fuzzy -msgid "Minimap in surface mode, Zoom x1" -msgstr "แผนที่ย่อในโหมด surface, ซูม x1" - -#: src/client/game.cpp -#, fuzzy -msgid "Minimap in surface mode, Zoom x2" -msgstr "แผนที่ย่อในโหมด surface, ซูม x2" - -#: src/client/game.cpp -#, fuzzy -msgid "Minimap in surface mode, Zoom x4" -msgstr "แผนที่ย่อในโหมด surface, ซูม x4" +msgid "Multiplayer" +msgstr "ผู้เล่นหลายคน" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1372,7 +1595,6 @@ msgid "Pitch move mode enabled" msgstr "สนามย้ายเปิดใช้โหมด" #: src/client/game.cpp -#, fuzzy msgid "Profiler graph shown" msgstr "แสดงกราฟ Profiler" @@ -1402,16 +1624,31 @@ 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" msgstr "เสียงไม่ปิดเสียง" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +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" @@ -1430,7 +1667,7 @@ msgstr "ช่วงการดูเป็นอย่างน้อย: %d1" #: src/client/game.cpp #, c-format msgid "Volume changed to %d%%" -msgstr "ปริมาตรที่เปลี่ยนไป %d1%%2" +msgstr "ปริมาตรที่เปลี่ยนไป %d1%%2" #: src/client/game.cpp msgid "Wireframe shown" @@ -1453,12 +1690,10 @@ msgid "Chat shown" msgstr "สนทนาแสดง" #: src/client/gameui.cpp -#, fuzzy msgid "HUD hidden" msgstr "ผิวที่ซ่อน" #: src/client/gameui.cpp -#, fuzzy msgid "HUD shown" msgstr "ผิวแสดง" @@ -1476,18 +1711,12 @@ msgid "Apps" msgstr "แอ" #: src/client/keycode.cpp -#, fuzzy msgid "Backspace" -msgstr "Backspace" +msgstr "แบ็คสเปซ" #: src/client/keycode.cpp -#, fuzzy msgid "Caps Lock" -msgstr "Caps Lock" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "ล้าง" +msgstr "แคปล็อค" #: src/client/keycode.cpp msgid "Control" @@ -1558,9 +1787,8 @@ msgid "Left Menu" msgstr "ด้านซ้าย Menu" #: src/client/keycode.cpp -#, fuzzy msgid "Left Shift" -msgstr "ด้านซ้าย Shift" +msgstr "ข้อกะ" #: src/client/keycode.cpp msgid "Left Windows" @@ -1576,84 +1804,68 @@ msgid "Middle Button" msgstr "ปุ่มกลาง" #: src/client/keycode.cpp -#, fuzzy msgid "Num Lock" -msgstr "Num Lock" +msgstr "ล็อคหมายเลข" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad *" -msgstr "Numpad *" +msgstr "ตัวเลข *" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad +" -msgstr "Numpad +" +msgstr "ตัวเลข +" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad -" -msgstr "Numpad -" +msgstr "ตัวเลข -" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad ." -msgstr "Numpad ." +msgstr "ตัวเลข ." #: src/client/keycode.cpp -#, fuzzy msgid "Numpad /" -msgstr "Numpad /" +msgstr "ตัวเลข /" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 0" -msgstr "Numpad 0" +msgstr "ตัวเลข 0" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 1" -msgstr "Numpad 1" +msgstr "ตัวเลข 1" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 2" -msgstr "Numpad 2" +msgstr "ตัวเลข 2" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 3" -msgstr "Numpad 3" +msgstr "ตัวเลข 3" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 4" -msgstr "Numpad 4" +msgstr "ตัวเลข 4" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 5" -msgstr "Numpad 5" +msgstr "ตัวเลข 5" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 6" -msgstr "Numpad 6" +msgstr "ตัวเลข 6" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 7" -msgstr "Numpad 7" +msgstr "ตัวเลข 7" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 8" -msgstr "Numpad 8" +msgstr "ตัวเลข 8" #: src/client/keycode.cpp -#, fuzzy msgid "Numpad 9" -msgstr "Numpad 9" +msgstr "ตัวเลข 9" #: src/client/keycode.cpp msgid "OEM Clear" @@ -1709,9 +1921,8 @@ msgid "Right Windows" msgstr "หน้าต่างขวา" #: src/client/keycode.cpp -#, fuzzy msgid "Scroll Lock" -msgstr "Scroll Lock" +msgstr "ล็อคเลื่อน" #. ~ Key name #: src/client/keycode.cpp @@ -1731,12 +1942,10 @@ msgid "Snapshot" msgstr "ภาพรวม" #: src/client/keycode.cpp -#, fuzzy msgid "Space" -msgstr "Space พื้นที่" +msgstr "ช่องว่าง" #: src/client/keycode.cpp -#, fuzzy msgid "Tab" msgstr "แท็บ" @@ -1756,54 +1965,65 @@ msgstr "X ปุ่ม 2" msgid "Zoom" msgstr "ซูม" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "รหัสผ่านไม่ตรงกับ!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "แผนที่ย่อซ่อนอยู่" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "ลงทะเบียน และเข้าร่วม" +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in radar mode, Zoom x%d" +msgstr "แผนที่ย่อในโหมดเรดาร์, ซูม x%d" -#: src/gui/guiConfirmRegistration.cpp -#, fuzzy, 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 "" -"คุณกำลังจะเข้าร่วมเซิร์ฟเวอร์ที่ %1$s1 ด้วยชื่อ '%2$s2' เป็นครั้งแรก ถ้าคุณดำเนินการ " -"จะมีสร้างบัญชีใหม่โดยใช้ข้อมูลประจำตัวของคุณบนเซิร์ฟเวอร์นี้ \n" -"กรุณาพิมพ์รหัสผ่านของคุณ และคลิกที่ลงทะเบียนและเข้าร่วมเพื่อยืนยันการสร้างบัญชีผู้ใช้ " -"หรือคลิกยกเลิกเพื่อยกเลิก." +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "แผนที่ย่อในโหมด surface, ซูม x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "แผนที่ย่อในโหมดพื้นผิว" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "ไม่สามารถเปิดหน้าเว็บ" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "เปิดหน้าเว็บ" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "ดำเนินการ" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Special\" = ปีนลง" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = ปีนลง" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Autoforward" -msgstr "Autoforward" +msgstr "ส่งต่ออัตโนมัติ" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" msgstr "กระโดด อัตโนมัติ" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "ย้อนหลัง" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "บล็อกขอบเขต" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "เปลี่ยนกล้อง" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "แช" @@ -1856,8 +2076,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" @@ -1887,10 +2107,6 @@ msgstr "ภาพหน้าจอ" msgid "Sneak" msgstr "แอบ" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "พิเศษ" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "สลับ HUD" @@ -1920,9 +2136,8 @@ msgid "Toggle noclip" msgstr "สลับ noclip" #: src/gui/guiKeyChangeMenu.cpp -#, fuzzy msgid "Toggle pitchmove" -msgstr "บันทึกสนทนาสลับ" +msgstr "สลับ pitchmove" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" @@ -1932,10 +2147,6 @@ msgstr "กดปุ่ม" msgid "Change" msgstr "เปลี่ยน" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "ยืนยันรหัสผ่าน" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "รหัสผ่านใหม่" @@ -1944,6 +2155,10 @@ msgstr "รหัสผ่านใหม่" msgid "Old Password" msgstr "รหัสผ่านเก่า" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "รหัสผ่านไม่ตรงกับ!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "ออก" @@ -1953,14 +2168,9 @@ msgid "Muted" msgstr "เสียง" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "ระดับเสียง " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "ป้อน " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "ระดับเสียง: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1969,6 +2179,16 @@ msgstr "ป้อน " msgid "LANG_CODE" msgstr "th" +#: 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" @@ -1979,8 +2199,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) ใช้จอยสติ๊กเสมือนเพื่อเรียกปุ่ม \"aux\"\n" @@ -1997,6 +2217,14 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"(X,Y,Z) ออฟเซ็ตของเศษส่วนจากศูนย์กลางโลกในหน่วยของ 'มาตราส่วน'\n" +"สามารถใช้เพื่อย้ายจุดที่ต้องการไปที่ (0, 0) เพื่อสร้าง a\n" +"จุดวางไข่ที่เหมาะสม หรือเพื่อให้ 'ซูมเข้า' ได้ตามต้องการ\n" +"ชี้โดยการเพิ่ม 'มาตราส่วน'.\n" +"ค่าดีฟอลต์ได้รับการปรับแต่งสำหรับจุดเกิดที่เหมาะสมสำหรับ Mandelbrot\n" +"ตั้งค่าด้วยพารามิเตอร์เริ่มต้น อาจต้องแก้ไขใน other\n" +"สถานการณ์.\n" +"ช่วงประมาณ -2 ถึง 2 คูณด้วย 'มาตราส่วน' สำหรับออฟเซ็ตในโหนด." #: src/settings_translation_file.cpp msgid "" @@ -2008,42 +2236,41 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = การบดบังพารัลแลกซ์พร้อมข้อมูลความชัน (เร็วกว่า)\n" -"1 = การทำแผนที่นูน (ช้ากว่าแม่นยำกว่า)" +"(X,Y,Z) มาตราส่วนของเศษส่วนในโหนด.\n" +"ขนาดแฟร็กทัลจริงจะใหญ่กว่า 2 ถึง 3 เท่า.\n" +"ตัวเลขเหล่านี้สามารถสร้างได้มาก, เศษส่วนทำให้\n" +"ไม่จำเป็นต้องอยู่ในโลก.\n" +"เพิ่มสิ่งเหล่านี้เพื่อ 'ซูม' เข้าไปในรายละเอียดของเศษส่วน\n" +"ค่าเริ่มต้นคือสำหรับรูปร่างที่ถูกบีบอัดในแนวตั้งซึ่งเหมาะสำหรับ\n" +"เกาะตั้งทั้ง 3 ตัว เท่ากับรูปร่างดิบ." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" +msgstr "เสียง 2D ที่ควบคุมรูปร่าง/ขนาดของสันเขา." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgstr "เสียง 2D ที่ควบคุมรูปร่าง/ขนาดของเนินเขา." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgstr "เสียง 2D ที่ควบคุมรูปร่าง/ขนาดของขั้นบันได." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" +msgstr "เสียง 2D ที่ควบคุมขนาด/การเกิดขึ้นของทิวเขาที่เป็นแนวสันเขา." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +msgstr "เสียง 2D ที่ควบคุมขนาด/การเกิดขึ้นของเนินเขา." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" +msgstr "เสียง 2D ที่ควบคุมขนาด/การเกิดของทิวเขาขั้นบันได." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgstr "เสียง 2D ที่ระบุตำแหน่งหุบเขาและช่องแคบของแม่น้ำ." #: src/settings_translation_file.cpp msgid "3D clouds" @@ -2054,19 +2281,20 @@ msgid "3D mode" msgstr "โหมด 3D" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "Normalmaps แข็งแรง" +msgstr "ความแรงของพารัลแลกซ์โหมด 3 มิติ" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "" +msgstr "เสียง 3 มิติที่กำหนดถ้ำยักษ์." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" +"เสียงรบกวน 3 มิติที่กำหนดโครงสร้างและความสูงของภูเขา\n" +"ยังกำหนดโครงสร้างของภูมิประเทศภูเขาลอย." #: src/settings_translation_file.cpp msgid "" @@ -2075,22 +2303,27 @@ 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 "" +"โครงสร้างการกำหนดสัญญาณรบกวน 3 มิติของพื้นที่ลอยน้ำ.\n" +"หากเปลี่ยนจากค่าเริ่มต้น อาจจำเป็นต้องใช้ 'มาตราส่วน' ของเสียง (0.7 โดยค่าเริ่มต้น)\n" +"ที่จะปรับเปลี่ยนได้เนื่องจากการเรียวของทุ่นลอยน้ำทำงานได้ดีที่สุดเมื่อมีเสียงนี้\n" +"ช่วงค่าประมาณ -2.0 ถึง 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." -msgstr "" +msgstr "โครงสร้างกำหนดสัญญาณรบกวน 3 มิติของผนังหุบเขาแม่น้ำ." #: src/settings_translation_file.cpp msgid "3D noise defining terrain." -msgstr "" +msgstr "ภูมิประเทศที่กำหนดเสียงรบกวน 3 มิติ" #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." msgstr "" +"เสียงรบกวน 3 มิติสำหรับส่วนที่ยื่นออกมาจากภูเขา หน้าผา ฯลฯ โดยปกติแล้วจะมีความแตกต่างเล็กน้อย." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" +msgstr "เสียง 3 มิติที่กำหนดจำนวนดันเจี้ยนต่อแมปชังค์." #: src/settings_translation_file.cpp msgid "" @@ -2116,6 +2349,10 @@ msgstr "" "- pageflip: 3d จาก quadbuffer\n" "โปรดทราบว่าโหมด 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" @@ -2134,35 +2371,39 @@ msgstr "ข้อความที่จะแสดงต่อไคลเอ #: src/settings_translation_file.cpp msgid "ABM interval" -msgstr "" +msgstr "ABM ช่วงเวลา" + +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "งบประมาณเวลาของ ABM" #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "" +msgstr "ขีด จำกัด ที่แน่นอนของบล็อกที่เข้าคิวที่จะเกิดขึ้น" #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "ความเร่งในอากาศ" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "ความเร่งของแรงโน้มถ่วง เป็นโหนดต่อวินาทีต่อวินาที" #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "ตัวดัดแปลงบล็อกที่ใช้งานอยู่" #: src/settings_translation_file.cpp msgid "Active block management interval" -msgstr "" +msgstr "ช่วงการจัดการบล็อกที่ใช้งานอยู่" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "" +msgstr "ช่วงบล็อกที่ใช้งานอยู่" #: src/settings_translation_file.cpp msgid "Active object send range" -msgstr "" +msgstr "ช่วงการส่งวัตถุที่ใช้งานอยู่" #: src/settings_translation_file.cpp msgid "" @@ -2186,6 +2427,10 @@ msgstr "" "ปรับการกำหนดค่า dpi ให้กับหน้าจอของคุณ (ไม่ใช่ X11 / Android เท่านั้น) เช่น สำหรับหน้าจอ " "4k." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "ปรับความหนาแน่นของการแสดงผลที่ตรวจพบ ซึ่งใช้สำหรับปรับขนาดองค์ประกอบ UI" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2195,6 +2440,16 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"ปรับความหนาแน่นของชั้นทุ่นลอยน้ำ.\n" +"เพิ่มมูลค่าเพื่อเพิ่มความหนาแน่น บวกหรือลบก็ได้.\n" +"มูลค่า = 0.0: 50% ของปริมาตรเป็นพื้นที่ลอยน้ำ.\n" +"ค่า = 2.0 (อาจสูงกว่านี้ขึ้นอยู่กับ 'mgv7_np_floatland' ให้ทดสอบเสมอ\n" +"เพื่อให้แน่ใจว่า) สร้างชั้นทุ่นลอยน้ำที่มั่นคง." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "ผนวกชื่อรายการ" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2208,9 +2463,15 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" +"เปลี่ยนเส้นโค้งแสงโดยใช้ 'การแก้ไขแกมมา'.\n" +"ค่าที่สูงขึ้นจะทำให้ระดับแสงกลางและแสงล่างสว่างขึ้น.\n" +"ค่า '1.0' ปล่อยให้เส้นโค้งแสงไม่เปลี่ยนแปลง.\n" +"สิ่งนี้มีผลอย่างมากต่อแสงแดดและประดิษฐ์\n" +"แสงมีผลน้อยมากต่อแสงธรรมชาติในตอนกลางคืน." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "บินเสมอ และรวดเร็ว" #: src/settings_translation_file.cpp @@ -2219,11 +2480,11 @@ msgstr "แกมมาบดเคี้ยวโดยรอบ" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "จำนวนข้อความที่ผู้เล่นสามารถส่งได้ต่อ 10 วินาที" #: src/settings_translation_file.cpp msgid "Amplifies the valleys." -msgstr "" +msgstr "ขยายหุบเขา." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" @@ -2247,7 +2508,7 @@ msgstr "ต่อท้ายชื่อรายการในคำแนะ #: src/settings_translation_file.cpp msgid "Apple trees noise" -msgstr "" +msgstr "เสียงต้นแอปเปิ้ล" #: src/settings_translation_file.cpp msgid "Arm inertia" @@ -2279,6 +2540,18 @@ msgid "" "optimization.\n" "Stated in mapblocks (16 nodes)." msgstr "" +"ในระยะนี้เซิร์ฟเวอร์จะปรับให้เหมาะสมที่สุดว่าจะส่งบล็อกใดบ้าง\n" +"ลูกค้า.\n" +"ค่าเล็กน้อยอาจช่วยปรับปรุงประสิทธิภาพได้มาก โดยที่ค่าใช้จ่ายที่มองเห็นได้\n" +"ข้อผิดพลาดในการแสดงผล (บางช่วงจะไม่แสดงใต้น้ำและในถ้ำ\n" +"และบางครั้งบนบก).\n" +"การตั้งค่านี้เป็นค่าที่มากกว่า max_block_send_distance ปิดการใช้งานนี้\n" +"การเพิ่มประสิทธิภาพ.\n" +"ระบุไว้ใน mapblocks (16 โหนด)." + +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" #: src/settings_translation_file.cpp msgid "Automatic forward key" @@ -2300,21 +2573,25 @@ msgstr "บันทึกขนาดหน้าจออัตโนมัต msgid "Autoscaling mode" msgstr "โหมดปรับอัตโนมัติ" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "ปุ่มกระโดด" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "คีย์พิเศษสำหรับการปีนขึ้น/ลง" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "ปุ่มย้อนกลับ" #: src/settings_translation_file.cpp msgid "Base ground level" -msgstr "" +msgstr "ระดับพื้นฐาน" #: src/settings_translation_file.cpp msgid "Base terrain height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "ขั้นพื้นฐาน" +msgstr "ความสูงของภูมิประเทศฐาน." #: src/settings_translation_file.cpp msgid "Basic privileges" @@ -2322,11 +2599,11 @@ msgstr "สิทธิพิเศษพื้นฐาน" #: src/settings_translation_file.cpp msgid "Beach noise" -msgstr "" +msgstr "เสียงชายหาด" #: src/settings_translation_file.cpp msgid "Beach noise threshold" -msgstr "" +msgstr "เกณฑ์เสียงชายหาด" #: src/settings_translation_file.cpp msgid "Bilinear filtering" @@ -2337,40 +2614,37 @@ msgid "Bind address" msgstr "ผูกที่อยู่" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" -msgstr "" +#, fuzzy +msgid "Biome API noise parameters" +msgstr "พารามิเตอร์เสียงอุณหภูมิและความชื้นของ Biome API" #: src/settings_translation_file.cpp msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "บิตต่อพิกเซล (ความลึกของสี aka) ในโหมดเต็มหน้าจอ." +msgstr "เสียงไบโอม" #: src/settings_translation_file.cpp 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 "เส้นทางฟอนต์ monospace" +msgstr "ไดเรกเตอรีฟอนต์หนาเอียง" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold and italic monospace font path" -msgstr "เส้นทางฟอนต์ monospace" +msgstr "ไดเรกเตอรีฟอนต์หนาเอียงสำหรับฟอนต์ขนาดคงที่" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold font path" -msgstr "เส้นทางแบบอักษร" +msgstr "ไดเรกเตอรีฟอนต์หนา" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold monospace font path" -msgstr "เส้นทางฟอนต์ monospace" +msgstr "ไดเรกเตอรีฟอนต์หนาแบบขนาดคงที่" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2378,15 +2652,14 @@ msgstr "สร้างภายในเครื่องเล่น" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "ในตัว" #: src/settings_translation_file.cpp #, fuzzy -msgid "Bumpmapping" -msgstr "Bumpmapping" +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" @@ -2394,9 +2667,9 @@ msgid "" "0.1 = Default, 0.25 = Good value for weaker tablets." msgstr "" "กล้องอยู่ใกล้ระยะทางระนาบในโหนดระหว่าง 0 ถึง 0.5\n" -"ผู้ใช้ส่วนใหญ่ไม่จำเป็นต้องเปลี่ยนแปลงสิ่งนี้\n" -"การเพิ่มขึ้นสามารถลดสิ่งประดิษฐ์ใน GPU ที่อ่อนแอกว่าได้\n" -"0.1 = ค่าเริ่มต้น, 0.25 = คุ้มค่าสำหรับแท็บเล็ตที่อ่อนแอกว่า" +"ผู้ใช้ส่วนใหญ่ไม่จำเป็นต้องเปลี่ยนแปลงสิ่งนี้.\n" +"การเพิ่มขึ้นสามารถลดสิ่งประดิษฐ์ใน GPU ที่อ่อนแอกว่าได้.\n" +"0.1 = ค่าเริ่มต้น, 0.25 = คุ้มค่าสำหรับแท็บเล็ตที่อ่อนแอกว่า." #: src/settings_translation_file.cpp msgid "Camera smoothing" @@ -2412,106 +2685,103 @@ msgstr "ปุ่มสลับการอัพเดตกล้อง" #: src/settings_translation_file.cpp msgid "Cave noise" -msgstr "" +msgstr "เสียงถ้ำ" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "" +msgstr "เสียงถ้ำ #1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "" +msgstr "เสียงถ้ำ #2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "ความกว้างของถ้ำ" #: src/settings_translation_file.cpp msgid "Cave1 noise" -msgstr "" +msgstr "ถ้ำ1เสียง" #: src/settings_translation_file.cpp msgid "Cave2 noise" -msgstr "" +msgstr "ถ้ำ2เสียง" #: src/settings_translation_file.cpp msgid "Cavern limit" -msgstr "" +msgstr "ขีดจำกัดของถ้ำ" #: src/settings_translation_file.cpp msgid "Cavern noise" -msgstr "" +msgstr "เสียงถ้ำ" #: src/settings_translation_file.cpp msgid "Cavern taper" -msgstr "" +msgstr "ถ้ำเทเปอร์" #: src/settings_translation_file.cpp msgid "Cavern threshold" -msgstr "" +msgstr "ธรณีประตูถ้ำ" #: src/settings_translation_file.cpp msgid "Cavern upper limit" -msgstr "" +msgstr "ขีดจำกัดบนของถ้ำ" #: 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 "" +"ศูนย์กลางของช่วงเพิ่มส่วนโค้งของแสง.\n" +"โดยที่ 0.0 คือระดับแสงต่ำสุด 1.0 คือระดับแสงสูงสุด." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +msgid "Chat command time message threshold" +msgstr "เกณฑ์ข้อความเวลาคำสั่งแชท" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "คำสั่งแชท" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "ขนาดตัวอักษร" +msgstr "ขนาดฟอนต์ในแชท" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "รหัสแชท" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" msgstr "ปุ่มสลับการแชท" #: src/settings_translation_file.cpp msgid "Chat message count limit" -msgstr "" +msgstr "ขีด จำกัด จำนวนข้อความแชท" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat message format" msgstr "ข้อความขัดข้อง" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" -msgstr "" +msgstr "เกณฑ์การเตะข้อความแชท" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "ความยาวสูงสุดของข้อความแชท" #: src/settings_translation_file.cpp msgid "Chat toggle key" msgstr "ปุ่มสลับการแชท" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "" +msgid "Chat weblinks" +msgstr "สนทนาแสดง" #: src/settings_translation_file.cpp msgid "Chunk size" -msgstr "" +msgstr "ขนาดก้อน" #: src/settings_translation_file.cpp msgid "Cinematic mode" @@ -2525,13 +2795,19 @@ msgstr "ปุ่มโหมดโรงภาพยนตร์" msgid "Clean transparent textures" msgstr "ทำความสะอาดพื้นผิวโปร่งใส" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "เว็บลิงก์ที่คลิกได้ (คลิกกลางหรือ Ctrl+คลิกซ้าย) เปิดใช้งานในเอาต์พุตคอนโซลแชท." + #: src/settings_translation_file.cpp msgid "Client" msgstr "ไคลเอนต์" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "ไคลเอนต์และเซิร์ฟเวอร์" #: src/settings_translation_file.cpp msgid "Client modding" @@ -2539,15 +2815,20 @@ msgstr "ลูกค้า modding" #: src/settings_translation_file.cpp msgid "Client side modding restrictions" -msgstr "" +msgstr "ข้อจำกัดในการปรับแต่งฝั่งไคลเอ็นต์" #: src/settings_translation_file.cpp msgid "Client side node lookup range restriction" -msgstr "" +msgstr "ข้อจำกัดช่วงการค้นหาโหนดฝั่งไคลเอ็นต์" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "ลูกค้า modding" #: src/settings_translation_file.cpp msgid "Climbing speed" -msgstr "" +msgstr "ความเร็วในการปีนเขา" #: src/settings_translation_file.cpp msgid "Cloud radius" @@ -2569,6 +2850,10 @@ msgstr "มีเมฆในเมนู" msgid "Colored fog" msgstr "หมอกสี" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "หมอกสี" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2579,23 +2864,58 @@ msgid "" "These flags are independent from Minetest versions,\n" "so see a full list at https://content.minetest.net/help/content_flags/" msgstr "" +"รายการแฟล็กที่คั่นด้วยเครื่องหมายจุลภาคเพื่อซ่อนในที่เก็บเนื้อหา.\n" +"สามารถใช้ \"nonfree\" เพื่อซ่อนแพ็คเกจที่ไม่เข้าข่ายเป็น 'ซอฟต์แวร์ฟรี'\n" +"ตามที่กำหนดโดยมูลนิธิซอฟต์แวร์เสรี.\n" +"คุณยังสามารถระบุการจัดประเภทเนื้อหา.\n" +"แฟล็กเหล่านี้ไม่ขึ้นกับเวอร์ชัน Minetest\n" +"เพื่อดูรายการทั้งหมดที่ 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 "" +"รายการม็อดคั่นด้วยเครื่องหมายจุลภาคที่อนุญาตให้เข้าถึง HTTP API ซึ่ง\n" +"อนุญาตให้อัปโหลดและดาวน์โหลดข้อมูลไปยัง/จากอินเทอร์เน็ต" #: 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 "" +"รายการที่คั่นด้วยเครื่องหมายจุลภาคของม็อดที่เชื่อถือได้ซึ่งได้รับอนุญาตให้เข้าถึงที่ไม่ปลอดภัย\n" +"ทำงานแม้ในขณะที่การรักษาความปลอดภัย mod เปิดอยู่ (ผ่าน " +"request_insecure_environment())." #: src/settings_translation_file.cpp msgid "Command key" msgstr "คีย์คำสั่ง" +#: src/settings_translation_file.cpp +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 "" +"ระดับการบีบอัดที่จะใช้เมื่อบันทึก mapblocks ไปยังดิสก์.\n" +"-1 - ใช้ระดับการบีบอัดเริ่มต้น\n" +"0 - บีบอัดน้อยที่สุด เร็วที่สุด\n" +"9 - การบีบอัดที่ดีที่สุด ช้าที่สุด" + +#: src/settings_translation_file.cpp +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 "" +"ระดับการบีบอัดที่จะใช้เมื่อส่ง mapblock ไปยังไคลเอนต์.\n" +"-1 - ใช้ระดับการบีบอัดเริ่มต้น\n" +"0 - บีบอัดน้อยที่สุด เร็วที่สุด\n" +"9 - การบีบอัดที่ดีที่สุด ช้าที่สุด" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "เชื่อมกระจก" @@ -2620,13 +2940,22 @@ msgstr "สีคอนโซล" msgid "Console height" msgstr "ความสูงของคอนโซล" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Content Repository" +msgstr "ที่เก็บเนื้อหาออนไลน์" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" -msgstr "" +msgstr "ContentDB ตั้งค่าสถานะบัญชีดำ" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ดาวน์โหลด ContentDB Max พร้อมกัน" #: src/settings_translation_file.cpp msgid "ContentDB URL" -msgstr "" +msgstr "url ฐานข้อมูลเนื้อหา" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -2650,18 +2979,23 @@ msgid "" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" +"ควบคุมความยาวของรอบกลางวัน/กลางคืน.\n" +"ตัวอย่าง:\n" +"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 msgid "Controls steepness/depth of lake depressions." -msgstr "" +msgstr "ควบคุมความชัน/ความลึกของความกดอากาศต่ำในทะเลสาบ." #: src/settings_translation_file.cpp msgid "Controls steepness/height of hills." -msgstr "" +msgstr "ควบคุมความชัน/ความสูงของเนินเขา." #: src/settings_translation_file.cpp msgid "" @@ -2669,6 +3003,9 @@ msgid "" "Value >= 10.0 completely disables generation of tunnels and avoids the\n" "intensive noise calculations." msgstr "" +"ควบคุมความกว้างของอุโมงค์ ค่าที่น้อยกว่าจะสร้างอุโมงค์ที่กว้างกว่า.\n" +"ค่า >= 10.0 ปิดใช้งานการสร้างช่องสัญญาณโดยสมบูรณ์และหลีกเลี่ยง\n" +"การคำนวณเสียงรบกวนอย่างเข้มข้น." #: src/settings_translation_file.cpp msgid "Crash message" @@ -2683,16 +3020,24 @@ msgid "Crosshair alpha" msgstr "Crosshair อัลฟา" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Crosshair อัลฟา (ความทึบแสงระหว่าง 0 ถึง 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Crosshair อัลฟา (ความทึบแสงระหว่าง 0 ถึง 255).\n" +"สิ่งนี้ใช้กับเป้าเล็งของวัตถุด้วย" #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "สีของครอสแฮร์" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "สีของครอสแฮร์ (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"สีเป้า (R,G,B).\n" +"ยังควบคุมสีเป้าเล็งของวัตถุ" #: src/settings_translation_file.cpp msgid "DPI" @@ -2708,27 +3053,27 @@ msgstr "แก้ไขคีย์การสลับข้อมูล" #: src/settings_translation_file.cpp msgid "Debug log file size threshold" -msgstr "" +msgstr "เกณฑ์ขนาดไฟล์บันทึกการดีบัก" #: src/settings_translation_file.cpp msgid "Debug log level" +msgstr "ระดับบันทึกดีบัก" + +#: src/settings_translation_file.cpp +msgid "Debugging" msgstr "" #: src/settings_translation_file.cpp msgid "Dec. volume key" msgstr "ลดระดับเสียงที่สำคัญ" -#: 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 "" +msgstr "ขั้นตอนเซิร์ฟเวอร์เฉพาะ" #: src/settings_translation_file.cpp msgid "Default acceleration" -msgstr "" +msgstr "ค่าความเร่งเริ่มต้น" #: src/settings_translation_file.cpp msgid "Default game" @@ -2752,62 +3097,57 @@ msgstr "สิทธิพิเศษเริ่มต้น" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "รูปแบบรายงานเริ่มต้น" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "เกมเริ่มต้น" +msgstr "ค่าขนาดสแต็คเริ่มต้น" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" +"กำหนดคุณภาพการกรองเงา\n" +"สิ่งนี้จำลองเอฟเฟกต์เงาอ่อนโดยใช้ PCF หรือดิสก์ปัวซอง\n" +"แต่ยังใช้ทรัพยากรมากขึ้น" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." -msgstr "" +msgstr "กำหนดพื้นที่ที่ต้นไม้มีแอปเปิ้ล." #: src/settings_translation_file.cpp msgid "Defines areas with sandy beaches." -msgstr "" +msgstr "กำหนดพื้นที่ที่มีหาดทราย." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain and steepness of cliffs." -msgstr "" +msgstr "กำหนดการกระจายของภูมิประเทศที่สูงขึ้นและความชันของหน้าผา." #: src/settings_translation_file.cpp msgid "Defines distribution of higher terrain." -msgstr "" +msgstr "กำหนดการกระจายของภูมิประเทศที่สูงขึ้น." #: src/settings_translation_file.cpp msgid "Defines full size of caverns, smaller values create larger caverns." -msgstr "" +msgstr "กำหนดขนาดเต็มของถ้ำ ค่าที่น้อยกว่าจะสร้างถ้ำที่ใหญ่ขึ้น." #: src/settings_translation_file.cpp msgid "Defines large-scale river channel structure." -msgstr "" +msgstr "กำหนดโครงสร้างช่องน้ำขนาดใหญ่." #: src/settings_translation_file.cpp msgid "Defines location and terrain of optional hills and lakes." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"กำหนดขั้นตอนการสุ่มตัวอย่างของพื้นผิว\n" -"ค่าที่สูงกว่าจะทำให้แผนที่ปกติราบรื่นขึ้น" +msgstr "กำหนดตำแหน่งและภูมิประเทศของเนินเขาและทะเลสาบที่เป็นตัวเลือก." #: src/settings_translation_file.cpp msgid "Defines the base ground level." -msgstr "" +msgstr "กำหนดระดับพื้นดินฐาน." #: src/settings_translation_file.cpp msgid "Defines the depth of the river channel." -msgstr "" +msgstr "กำหนดความลึกของช่องแม่น้ำ." #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." @@ -2815,15 +3155,15 @@ msgstr "กำหนดระยะถ่ายโอนผู้เล่นส #: src/settings_translation_file.cpp msgid "Defines the width of the river channel." -msgstr "" +msgstr "กำหนดความกว้างของช่องแม่น้ำ." #: src/settings_translation_file.cpp msgid "Defines the width of the river valley." -msgstr "" +msgstr "กำหนดความกว้างของหุบเขาแม่น้ำ." #: src/settings_translation_file.cpp msgid "Defines tree areas and tree density." -msgstr "" +msgstr "กำหนดพื้นที่ต้นไม้และความหนาแน่นของต้นไม้." #: src/settings_translation_file.cpp msgid "" @@ -2843,15 +3183,15 @@ msgstr "ความล่าช้าแสดงคำแนะนำเคร #: src/settings_translation_file.cpp msgid "Deprecated Lua API handling" -msgstr "" +msgstr "การจัดการ Lua API ที่เลิกใช้แล้ว" #: src/settings_translation_file.cpp msgid "Depth below which you'll find giant caverns." -msgstr "" +msgstr "ความลึกด้านล่างซึ่งคุณจะพบถ้ำขนาดยักษ์." #: src/settings_translation_file.cpp msgid "Depth below which you'll find large caves." -msgstr "" +msgstr "ความลึกด้านล่างซึ่งคุณจะพบถ้ำขนาดใหญ่." #: src/settings_translation_file.cpp msgid "" @@ -2861,18 +3201,29 @@ msgstr "คำอธิบายของเซิร์ฟเวอร์ที #: src/settings_translation_file.cpp msgid "Desert noise threshold" -msgstr "" +msgstr "ธรณีประตูเสียงทะเลทราย" #: 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 "" +"ทะเลทรายเกิดขึ้นเมื่อ np_biome เกินค่านี้.\n" +"เมื่อเปิดใช้งานแฟล็ก 'snowbiomes' สิ่งนี้จะถูกละเว้น." #: src/settings_translation_file.cpp msgid "Desynchronize block animation" msgstr "Desynchronize บล็อกภาพเคลื่อนไหว" +#: 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 "ขุดอนุภาค" @@ -2885,6 +3236,16 @@ msgstr "ปิดใช้งาน anticheat" msgid "Disallow empty passwords" msgstr "ไม่อนุญาตรหัสผ่านที่ว่างเปล่า" +#: src/settings_translation_file.cpp +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 "ชื่อโดเมนของเซิร์ฟเวอร์ที่จะแสดงในรายการเซิร์ฟเวอร์." @@ -2903,25 +3264,27 @@ msgstr "วางรหัสรายการ" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug information." -msgstr "" +msgstr "ดัมพ์ข้อมูลการดีบัก mapgen." #: src/settings_translation_file.cpp msgid "Dungeon maximum Y" -msgstr "" +msgstr "ดันเจี้ยนสูงสุด Y" #: src/settings_translation_file.cpp msgid "Dungeon minimum Y" -msgstr "" +msgstr "ดันเจี้ยนขั้นต่ำ Y" #: src/settings_translation_file.cpp msgid "Dungeon noise" -msgstr "" +msgstr "เสียงดันเจี้ยน" #: src/settings_translation_file.cpp msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" +"เปิดใช้งานการสนับสนุน IPv6 (สำหรับทั้งไคลเอนต์และเซิร์ฟเวอร์).\n" +"จำเป็นสำหรับการเชื่อมต่อ IPv6 เพื่อให้ทำงานได้ทั้งหมด." #: src/settings_translation_file.cpp msgid "" @@ -2931,25 +3294,46 @@ msgstr "" "เปิดใช้งานการสนับสนุน Lua modding บนไคลเอนต์\n" "การสนับสนุนนี้เป็นการทดลองและ API สามารถเปลี่ยนแปลงได้" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"เปิดใช้งานการกรองดิสก์ปัวซอง.\n" +"บนทรูใช้ดิสก์ปัวซองเพื่อสร้าง \"เงาอ่อน\" มิฉะนั้นจะใช้การกรอง PCF." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +".เปิดใช้งานเงาสี\n" +"บนโหนดโปร่งแสงที่แท้จริงจะทำให้เกิดเงาสี. นี้มีราคาแพง." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "เปิดใช้งานหน้าต่างคอนโซล" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "เปิดใช้งานโหมดสร้างสรรค์สำหรับแผนที่ที่สร้างขึ้นใหม่." +msgid "Enable creative mode for all players" +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 "เปิดใช้งานการรองรับช่องสัญญาณ mod." #: src/settings_translation_file.cpp msgid "Enable mod security" -msgstr "" +msgstr "เปิดใช้งานการรักษาความปลอดภัยม็อด" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." @@ -2959,18 +3343,6 @@ msgstr "ช่วยให้ผู้เล่นได้รับความ 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" @@ -2979,6 +3351,10 @@ msgstr "" "เปิดใช้งานแสงที่ราบรื่นด้วยการบดเคี้ยวอย่างง่าย.\n" "ปิดใช้งานสำหรับความเร็วหรือลักษณะที่แตกต่างกัน." +#: 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" @@ -3007,6 +3383,8 @@ msgid "" "Enable vertex buffer objects.\n" "This should greatly improve graphics performance." msgstr "" +"เปิดใช้งานวัตถุบัฟเฟอร์จุดยอด.\n" +"สิ่งนี้ควรปรับปรุงประสิทธิภาพกราฟิกอย่างมาก." #: src/settings_translation_file.cpp msgid "" @@ -3017,14 +3395,14 @@ msgstr "" "ตัวอย่างเช่น: 0 ที่ไม่มีการสั่น 1.0 สำหรับปกติ 2.0 สำหรับสองเท่า" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Enable/disable running an IPv6 server.\n" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" "เปิดใช้งาน / ปิดการใช้งานเซิร์ฟเวอร์ IPv6.\n" -"ข้ามไปหากตั้งค่า bind_address." +"ข้ามไปหากตั้งค่า bind_address.\n" +"ต้องการ enable_ipv6 เพื่อเปิดใช้งาน" #: src/settings_translation_file.cpp msgid "" @@ -3033,22 +3411,15 @@ msgid "" "appearance of high dynamic range images. Mid-range contrast is slightly\n" "enhanced, highlights and shadows are gradually compressed." msgstr "" +"เปิดใช้งานการจับคู่โทนภาพยนตร์ 'Uncharted 2' ของ Hable.\n" +"จำลองเส้นโทนสีของฟิล์มถ่ายภาพและค่านี้ใกล้เคียงกับ\n" +"ลักษณะของภาพช่วงไดนามิกสูง ความเปรียบต่างระดับกลางเล็กน้อย\n" +"ปรับปรุง ไฮไลท์และเงาจะค่อยๆ บีบอัด." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." msgstr "เปิดใช้งานภาพเคลื่อนไหวของรายการสินค้าคงคลัง." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"เปิดใช้งานการแมป bump สำหรับพื้นผิว แผนที่ปกติจะต้องมีการจัดหาโดยแพ็คพื้นผิว\n" -"หรือจำเป็นต้องสร้างขึ้นอัตโนมัติ\n" -"ต้องมี shaders เพื่อเปิดใช้งาน" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "เปิดใช้งานการแคชของตาข่ายที่หมุนได้." @@ -3057,22 +3428,6 @@ msgstr "เปิดใช้งานการแคชของตาข่า msgid "Enables minimap." msgstr "เปิดใช้งานย่อแผนที่." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"เปิดใช้งานการสร้างแผนที่ปกติแบบลอยตัว (เอฟเฟกต์นูน)\n" -"ต้องมีการเปิดใช้งาน bumpmapping" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"เปิดใช้งานการแมปการบดเคี้ยวของรัลแลกซ์\n" -"ต้องมี shaders เพื่อเปิดใช้งาน" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3080,22 +3435,31 @@ msgid "" "sound controls will be non-functional.\n" "Changing this setting requires a restart." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Engine profiling data print interval" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Entity methods" -msgstr "" +"เปิดใช้งานระบบเสียง.\n" +"หากปิดใช้งาน จะเป็นการปิดเสียงทั้งหมดในทุกที่และในเกม\n" +"การควบคุมเสียงจะไม่ทำงาน.\n" +"การเปลี่ยนการตั้งค่านี้ต้องรีสตาร์ท." #: src/settings_translation_file.cpp msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." +"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 "" -"ตัวเลือกการทดลองอาจทำให้เกิดช่องว่างระหว่างบล็อก\n" -"เมื่อตั้งค่าเป็นจำนวนที่สูงกว่า 0" +"เปิดใช้งานการแลกเปลี่ยนที่ลดโหลด CPU หรือเพิ่มประสิทธิภาพการเรนเดอร์\n" +"เนื่องจากความบกพร่องของภาพเล็กน้อยที่ไม่ส่งผลต่อการเล่นเกม." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "โปรไฟล์หุบเขา" + +#: src/settings_translation_file.cpp +msgid "Engine profiling data print interval" +msgstr "ช่วงเวลาการพิมพ์ข้อมูลโปรไฟล์เครื่องยนต์" + +#: src/settings_translation_file.cpp +msgid "Entity methods" +msgstr "วิธีการนิติบุคคล" #: src/settings_translation_file.cpp msgid "" @@ -3106,52 +3470,48 @@ 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 "" +"เลขชี้กำลังของการเรียวของทุ่นลอยน้ำ เปลี่ยนพฤติกรรมการเรียว.\n" +"ค่า = 1.0 สร้างการเรียวเชิงเส้นที่สม่ำเสมอ.\n" +"ค่า > 1.0 สร้างการเรียวที่ราบรื่นเหมาะสำหรับการแยกค่าเริ่มต้น\n" +"ทุ่นลอยน้ำ.\n" +"ค่า < 1.0 (เช่น 0.25) สร้างระดับพื้นผิวที่กำหนดมากขึ้นด้วย\n" +"ที่ราบลุ่มที่ราบเรียบเหมาะสำหรับชั้นทุ่นลอยน้ำที่เป็นของแข็ง." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "FPS ในเมนูหยุดชั่วคราว" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "เฟรมต่อวินาที (FPS) สูงสุดเมื่อเกมหยุดชั่วคราว" #: src/settings_translation_file.cpp -#, fuzzy msgid "FSAA" msgstr "FSAA" #: src/settings_translation_file.cpp msgid "Factor noise" -msgstr "" +msgstr "ปัจจัยเสียง" #: src/settings_translation_file.cpp msgid "Fall bobbing factor" msgstr "ตกปัจจัยผลุบๆโผล่ๆ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font path" msgstr "แบบอักษรสำรอง" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "เงาแบบอักษรทางเลือก" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "เงาตัวอักษรทางเลือกอัลฟา" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "ขนาดตัวอักษรทางเลือก" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "ปุ่มลัด" #: src/settings_translation_file.cpp msgid "Fast mode acceleration" -msgstr "" +msgstr "การเร่งความเร็วในโหมดเร็ว" #: src/settings_translation_file.cpp msgid "Fast mode speed" -msgstr "" +msgstr "ความเร็วโหมดเร็ว" #: src/settings_translation_file.cpp msgid "Fast movement" @@ -3159,7 +3519,7 @@ msgstr "การเคลื่อนไหวเร็ว" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "การเคลื่อนไหวที่รวดเร็ว (ผ่านคีย์ 'พิเศษ').\n" @@ -3184,11 +3544,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Filler depth" -msgstr "" +msgstr "ความลึกของฟิลเลอร์" #: src/settings_translation_file.cpp msgid "Filler depth noise" -msgstr "" +msgstr "เสียงความลึกของฟิลเลอร์" #: src/settings_translation_file.cpp msgid "Filmic tone mapping" @@ -3197,26 +3557,27 @@ msgstr "การทำแผนที่โทนภาพยนตร์" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" -"พื้นผิวที่ถูกกรองสามารถผสมผสานค่า RGB กับเพื่อนบ้านที่โปร่งใสได้อย่างสมบูรณ์\n" +"พื้นผิวที่ถูกกรองสามารถผสมผสานค่า RGB กับเพื่อนบ้านที่โปร่งใสได้อย่างสมบูรณ์.\n" "เครื่องมือเพิ่มประสิทธิภาพ PNG ใดที่มักจะละทิ้งซึ่งบางครั้งส่งผลให้มืดหรือ\n" "ขอบแสงเป็นพื้นผิวโปร่งใส ใช้ตัวกรองนี้เพื่อล้างข้อมูล\n" -"ที่เวลาโหลดพื้นผิว" +"ที่เวลาโหลดพื้นผิว." #: 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." -msgstr "" +msgstr "เสียง 2D แรกจาก 4 เสียงที่ร่วมกันกำหนดความสูงของช่วงเนินเขา/ภูเขา." #: src/settings_translation_file.cpp msgid "First of two 3D noises that together define tunnels." -msgstr "" +msgstr "เสียง 3D สองรายการแรกที่กำหนดอุโมงค์ร่วมกัน." #: src/settings_translation_file.cpp msgid "Fixed map seed" @@ -3228,37 +3589,35 @@ msgstr "แก้ไขจอยสติ๊กเสมือนจริง" #: src/settings_translation_file.cpp msgid "Floatland density" -msgstr "" +msgstr "ความหนาแน่นของพื้นที่ลุ่มน้ำ" #: src/settings_translation_file.cpp msgid "Floatland maximum Y" -msgstr "" +msgstr "Floatland สูงสุด Y" #: src/settings_translation_file.cpp msgid "Floatland minimum Y" -msgstr "" +msgstr "Floatland ขั้นต่ำ Y" #: src/settings_translation_file.cpp msgid "Floatland noise" -msgstr "" +msgstr "เสียงทุ่นลอยน้ำ" #: src/settings_translation_file.cpp msgid "Floatland taper exponent" -msgstr "" +msgstr "เลขชี้กำลังของ Floatland Taper" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" msgstr "ระยะถ่ายโอนผู้เล่น" #: src/settings_translation_file.cpp msgid "Floatland water level" -msgstr "" +msgstr "ระดับน้ำลอยน้ำ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fly key" -msgstr "ปุ่ม Fly" +msgstr "ปุ่มบิน" #: src/settings_translation_file.cpp msgid "Flying" @@ -3276,13 +3635,18 @@ msgstr "หมอกเริ่มต้น" msgid "Fog toggle key" msgstr "ปุ่มสลับ Fog" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font" +msgstr "ขนาดตัวอักษร" + #: src/settings_translation_file.cpp msgid "Font bold by default" -msgstr "" +msgstr "ตัวหนาตามค่าเริ่มต้น" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "" +msgstr "ตัวเอียงโดยค่าเริ่มต้น" #: src/settings_translation_file.cpp msgid "Font shadow" @@ -3297,22 +3661,39 @@ msgid "Font size" msgstr "ขนาดตัวอักษร" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." -msgstr "" +msgid "Font size divisible by" +msgstr "ขนาดตัวอักษรหารด้วย" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "" +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" +msgstr "ขนาดแบบอักษรของแบบอักษรเริ่มต้นโดยที่ 1 หน่วย = 1 พิกเซลที่ 96 DPI" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." -msgstr "" +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" +msgstr "ขนาดแบบอักษรของแบบอักษร monospace โดยที่ 1 หน่วย = 1 พิกเซลที่ 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 "" +"ขนาดตัวอักษรของข้อความแชทล่าสุดและข้อความแจ้งการแชทในจุด (pt).\n" +"ค่า 0 จะใช้ขนาดตัวอักษรเริ่มต้น." + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" +"สำหรับฟอนต์สไตล์พิกเซลที่ปรับขนาดได้ไม่ดี วิธีนี้จะช่วยให้ใช้ขนาดฟอนต์ได้\n" +"ด้วยแบบอักษรนี้จะหารด้วยค่านี้เป็นพิกเซลเสมอ ตัวอย่างเช่น.\n" +"แบบอักษรพิกเซลสูง 16 พิกเซลควรตั้งค่านี้เป็น 16 ดังนั้นมันจะเป็นเท่านั้น\n" +"ขนาด 16, 32, 48 เป็นต้น ดังนั้นม็อดที่ขอขนาด 25 จะได้รับ 32." #: src/settings_translation_file.cpp msgid "" @@ -3320,6 +3701,8 @@ msgid "" "placeholders:\n" "@name, @message, @timestamp (optional)" msgstr "" +"รูปแบบของข้อความแชทของผู้เล่น สตริงต่อไปนี้เป็นตัวยึดที่ถูกต้อง:\n" +"@name, @message, @timestamp (ไม่บังคับ)" #: src/settings_translation_file.cpp msgid "Format of screenshots." @@ -3363,30 +3746,26 @@ msgstr "ปุ่มส่งต่อ" #: src/settings_translation_file.cpp msgid "Fourth of 4 2D noises that together define hill/mountain range height." -msgstr "" +msgstr "เสียง 2D ที่สี่จากทั้งหมด 4 แบบที่ร่วมกันกำหนดความสูงของช่วงเนินเขา/ภูเขา." #: src/settings_translation_file.cpp msgid "Fractal type" -msgstr "" +msgstr "ประเภทเศษส่วน" #: src/settings_translation_file.cpp msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "เศษส่วนของระยะทางที่มองเห็นซึ่งมีหมอกเริ่มแสดง" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "แบบอักษรประเภท FreeType" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " "nodes)." -msgstr "" +msgstr "จากระยะการสร้างบล็อคสำหรับไคลเอนต์ ระบุไว้ใน mapblock (16 โหนด)." #: src/settings_translation_file.cpp msgid "" "From how far blocks are sent to clients, stated in mapblocks (16 nodes)." -msgstr "" +msgstr "จากระยะทางที่บล็อกถูกส่งไปยังไคลเอนต์ ระบุไว้ใน mapblock (16 โหนด)." #: src/settings_translation_file.cpp msgid "" @@ -3396,15 +3775,16 @@ 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 "" +"ไคลเอ็นต์รู้เกี่ยวกับอ็อบเจ็กต์มากแค่ไหน ระบุไว้ใน mapblock (16 โหนด).\n" +"\n" +"การตั้งค่านี้มีขนาดใหญ่กว่า active_block_range จะทำให้เซิร์ฟเวอร์\n" +"เพื่อรักษาวัตถุออกฤทธิ์ให้อยู่ในระยะนี้ในทิศทางที่\n" +"ผู้เล่นกำลังมองหา (สิ่งนี้สามารถหลีกเลี่ยงฝูงชนที่หายไปจากการมองเห็นทันที)" #: src/settings_translation_file.cpp msgid "Full screen" msgstr "เต็มจอ" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "BPP เต็มหน้าจอ" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "โหมดเต็มหน้าจอ" @@ -3422,57 +3802,86 @@ msgid "GUI scaling filter txr2img" msgstr "ตัวกรองการปรับขนาด GUI txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "สร้างแผนที่ปกติ" +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 "" +msgstr "โทรกลับทั่วโลก" #: src/settings_translation_file.cpp msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" +"คุณลักษณะการสร้างแผนที่โลก.\n" +"ใน Mapgen v6 ธง 'การตกแต่ง' จะควบคุมการตกแต่งทั้งหมดยกเว้นต้นไม้\n" +"และหญ้าป่า ในแผนที่อื่นๆ ธงนี้ควบคุมการตกแต่งทั้งหมด." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." -msgstr "ความชันของเส้นโค้งแสงที่ระดับแสงสูงสุด." +msgstr "" +"การไล่ระดับสีของเส้นโค้งแสงที่ระดับแสงสูงสุด\n" +"ควบคุมคอนทราสต์ของระดับแสงสูงสุด" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." -msgstr "ความชันของเส้นโค้งแสงที่ระดับแสงต่ำสุด." +msgstr "" +"การไล่ระดับสีของเส้นโค้งแสงที่ระดับแสงต่ำสุด\n" +"ควบคุมคอนทราสต์ของระดับแสงต่ำสุด" #: src/settings_translation_file.cpp 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 "" +msgstr "แรงโน้มถ่วง" #: src/settings_translation_file.cpp msgid "Ground level" -msgstr "" +msgstr "ระดับพื้นดิน" #: src/settings_translation_file.cpp msgid "Ground noise" -msgstr "" +msgstr "เสียงดิน" #: src/settings_translation_file.cpp msgid "HTTP mods" +msgstr "ม็อด HTTP" + +#: src/settings_translation_file.cpp +msgid "HUD" msgstr "" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "เครื่องชั่ง HUD" +#, fuzzy +msgid "HUD scaling" +msgstr "การปรับขนาด GUI" #: src/settings_translation_file.cpp msgid "HUD toggle key" @@ -3481,10 +3890,14 @@ msgstr "ปุ่มสลับ HUD" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" +"การจัดการสำหรับการเรียก Lua API ที่เลิกใช้แล้ว:\n" +"- ไม่มี: อย่าบันทึกการโทรที่เลิกใช้แล้ว\n" +"- บันทึก: เลียนแบบและบันทึก backtrace ของการโทรที่เลิกใช้แล้ว (ค่าเริ่มต้น).\n" +"- ข้อผิดพลาด: ยกเลิกการใช้งานการโทรที่เลิกใช้แล้ว (แนะนำสำหรับนักพัฒนา mod)." #: src/settings_translation_file.cpp msgid "" @@ -3494,54 +3907,55 @@ msgid "" "call).\n" "* Instrument the sampler being used to update the statistics." msgstr "" +"มีเครื่องมือสร้างโปรไฟล์เอง:\n" +"* เครื่องมือฟังก์ชันว่าง.\n" +"ค่านี้ประมาณค่าโสหุ้ย ที่เครื่องมือวัดกำลังเพิ่ม (การเรียกใช้ฟังก์ชัน +1).\n" +"* เครื่องมือสุ่มตัวอย่างที่ใช้ในการอัปเดตสถิติ." #: src/settings_translation_file.cpp msgid "Heat blend noise" -msgstr "" +msgstr "เสียงผสมความร้อน" #: src/settings_translation_file.cpp msgid "Heat noise" -msgstr "" +msgstr "เสียงความร้อน" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "องค์ประกอบความสูงของขนาดหน้าต่างเริ่มต้น" #: src/settings_translation_file.cpp msgid "Height noise" -msgstr "" +msgstr "เสียงสูง" #: src/settings_translation_file.cpp msgid "Height select noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" +msgstr "ความสูงเลือกเสียง" #: src/settings_translation_file.cpp msgid "Hill steepness" -msgstr "" +msgstr "ลาดชัน" #: src/settings_translation_file.cpp msgid "Hill threshold" -msgstr "" +msgstr "ธรณีสัณฐาน Hill" #: src/settings_translation_file.cpp msgid "Hilliness1 noise" -msgstr "" +msgstr "Hilliness1 เสียง" #: src/settings_translation_file.cpp msgid "Hilliness2 noise" -msgstr "" +msgstr "Hilliness2 เสียง" #: src/settings_translation_file.cpp msgid "Hilliness3 noise" -msgstr "" +msgstr "Hilliness3 เสียง" #: src/settings_translation_file.cpp msgid "Hilliness4 noise" -msgstr "" +msgstr "Hilliness4 เสียง" #: src/settings_translation_file.cpp msgid "Homepage of server, to be displayed in the serverlist." @@ -3552,18 +3966,24 @@ msgid "" "Horizontal acceleration in air when jumping or falling,\n" "in nodes per second per second." msgstr "" +"การเร่งความเร็วในอากาศในแนวนอนเมื่อกระโดดหรือล้ม,\n" +"ในโหนดต่อวินาทีต่อวินาที." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration in fast mode,\n" "in nodes per second per second." msgstr "" +"การเร่งความเร็วในแนวนอนและแนวตั้งในโหมดเร็ว,\n" +"ในโหนดต่อวินาทีต่อวินาที." #: src/settings_translation_file.cpp msgid "" "Horizontal and vertical acceleration on ground or when climbing,\n" "in nodes per second per second." msgstr "" +"การเร่งความเร็วในแนวนอนและแนวตั้งบนพื้นดินหรือเมื่อปีนเขา,\n" +"ในโหนดต่อวินาทีต่อวินาที." #: src/settings_translation_file.cpp msgid "Hotbar next key" @@ -3703,7 +4123,7 @@ msgstr "Hotbar สล็อต 9 สำคัญ" #: src/settings_translation_file.cpp msgid "How deep to make rivers." -msgstr "" +msgstr "สร้างแม่น้ำได้ลึกแค่ไหน." #: src/settings_translation_file.cpp msgid "" @@ -3711,32 +4131,46 @@ msgid "" "If negative, liquid waves will move backwards.\n" "Requires waving liquids to be enabled." msgstr "" +"คลื่นของเหลวจะเคลื่อนที่เร็วแค่ไหน สูงขึ้น = เร็วขึ้น.\n" +"หากเป็นลบ คลื่นของเหลวจะเคลื่อนที่ถอยหลัง.\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 "" +"เซิร์ฟเวอร์จะรอนานเท่าใดก่อนที่จะยกเลิกการโหลด mapblock ที่ไม่ได้ใช้.\n" +"ค่าที่สูงกว่านั้นราบรื่นกว่า แต่จะใช้ 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 "ลดค่านี้เพื่อเพิ่มแรงต้านทานของของเหลวต่อการเคลื่อนที่" #: src/settings_translation_file.cpp msgid "How wide to make rivers." -msgstr "" +msgstr "กว้างแค่ไหนจึงจะสร้างแม่น้ำได้." #: src/settings_translation_file.cpp msgid "Humidity blend noise" -msgstr "" +msgstr "เสียงผสมความชื้น" #: src/settings_translation_file.cpp msgid "Humidity noise" -msgstr "" +msgstr "เสียงความชื้น" #: src/settings_translation_file.cpp msgid "Humidity variation for biomes." -msgstr "" +msgstr "การเปลี่ยนแปลงความชื้นของไบโอม." #: src/settings_translation_file.cpp msgid "IPv6" -msgstr "" +msgstr "IPv6" #: src/settings_translation_file.cpp msgid "IPv6 server" @@ -3752,12 +4186,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" "ถ้าปิดใช้งาน ใช้คีย์ 'พิเศษ' บินถ้าทั้งบิน และโหมดที่รวดเร็วเป็น \n" -"ใช้งาน" +"ใช้งาน." #: src/settings_translation_file.cpp msgid "" @@ -3767,6 +4200,10 @@ msgid "" "invisible\n" "so that the utility of noclip mode is reduced." msgstr "" +"หากเปิดใช้งานเซิร์ฟเวอร์จะดำเนินการคัดแยกการบล็อกแผนที่ตาม\n" +"ในตำแหน่งสายตาของผู้เล่น ซึ่งสามารถลดจำนวนบล็อคได้\n" +"ส่งให้ลูกค้า 50-80% ลูกค้าจะไม่ได้รับการล่องหนอีกต่อไป\n" +"เพื่อให้อรรถประโยชน์ของโหมด noclip ลดลง." #: src/settings_translation_file.cpp msgid "" @@ -3779,10 +4216,21 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." -msgstr "ถ้าเปิดใช้งาน ใช้คีย์ 'พิเศษ' แทน 'แอบ' คีย์สำหรับปีนลงและ จาก." +msgstr "" +"หากเปิดใช้งาน ปุ่ม \"Aux1\" แทนปุ่ม \"แอบ\" จะใช้สำหรับการปีนลงและ\n" +"จากมากไปน้อย" + +#: 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 "" @@ -3801,6 +4249,8 @@ 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 "" +"หากเปิดใช้งาน ข้อมูลโลกที่ไม่ถูกต้องจะไม่ทำให้เซิร์ฟเวอร์ปิดตัวลง\n" +"เปิดใช้งานสิ่งนี้ก็ต่อเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่." #: src/settings_translation_file.cpp msgid "" @@ -3809,7 +4259,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 "หากเปิดใช้งานผู้เล่นใหม่จะไม่สามารถเข้าร่วมด้วยรหัสผ่านที่ว่างเปล่าได้." #: src/settings_translation_file.cpp @@ -3827,6 +4280,16 @@ msgid "" "limited\n" "to this distance from the player to the node." msgstr "" +"หากเปิดใช้งานข้อจำกัด CSM สำหรับช่วงโหนด การเรียก get_node จะถูกจำกัด\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 "" +"หากการดำเนินการคำสั่งแชทใช้เวลานานกว่าเวลาที่ระบุใน\n" +"วินาที เพิ่มข้อมูลเวลาในข้อความคำสั่งแชท" #: src/settings_translation_file.cpp msgid "" @@ -3835,6 +4298,10 @@ msgid "" "deleting an older debug.txt.1 if it exists.\n" "debug.txt is only moved if this setting is positive." msgstr "" +"หากขนาดไฟล์ของ debug.txt เกินจำนวนเมกะไบต์ที่ระบุใน\n" +"เมื่อเปิดการตั้งค่านี้ ไฟล์จะถูกย้ายไปยัง debug.txt.1,\n" +"การลบ debug.txt.1 ที่เก่ากว่า หากมี.\n" +"debug.txt จะถูกย้ายก็ต่อเมื่อการตั้งค่านี้เป็นค่าบวก." #: src/settings_translation_file.cpp msgid "If this is set, players will always (re)spawn at the given position." @@ -3842,11 +4309,7 @@ msgstr "หากตั้งค่าไว้ผู้เล่นจะวา #: src/settings_translation_file.cpp msgid "Ignore world errors" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "ในเกมส์" +msgstr "ละเว้นข้อผิดพลาดของโลก" #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." @@ -3866,49 +4329,50 @@ msgstr "เพิ่มปุ่มปรับระดับเสียง" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." -msgstr "" +msgstr "ความเร็วแนวตั้งเริ่มต้นเมื่อกระโดด เป็นโหนดต่อวินาที." #: src/settings_translation_file.cpp msgid "" "Instrument builtin.\n" "This is usually only needed by core/builtin contributors" msgstr "" +"เครื่องมือในตัว.\n" +"โดยปกติแล้วสิ่งนี้จำเป็นสำหรับผู้สนับสนุนหลัก/ในตัวเท่านั้น." #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." -msgstr "" +msgid "Instrument chat commands on registration." +msgstr "คำสั่งเครื่องมือแชทในการลงทะเบียน." #: src/settings_translation_file.cpp msgid "" "Instrument global callback functions on registration.\n" "(anything you pass to a minetest.register_*() function)" msgstr "" +"ฟังก์ชั่นโทรกลับทั่วโลกในการลงทะเบียน.\n" +"(ทุกสิ่งที่คุณส่งผ่านไปยังฟังก์ชัน minetest.register_*() function)" #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Active Block Modifiers on registration." -msgstr "" +msgstr "ควบคุมฟังก์ชันการทำงานของ Active Block Modifiers ในการลงทะเบียน." #: src/settings_translation_file.cpp msgid "" "Instrument the action function of Loading Block Modifiers on registration." -msgstr "" +msgstr "ควบคุมฟังก์ชันการทำงานของ Loading Block Modifiers ในการลงทะเบียน." #: src/settings_translation_file.cpp msgid "Instrument the methods of entities on registration." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "" +msgstr "เครื่องมือวิธีการของหน่วยงานในการลงทะเบียน." #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." -msgstr "" +msgstr "ช่วงเวลาของการบันทึกการเปลี่ยนแปลงที่สำคัญในโลก ระบุเป็นวินาที." #: 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 "ช่วงเวลาในการส่งช่วงเวลาของวันให้กับลูกค้า." #: src/settings_translation_file.cpp msgid "Inventory items animations" @@ -3927,14 +4391,12 @@ msgid "Invert vertical mouse movement." msgstr "กลับเคลื่อนไหวเมาส์แนวตั้ง." #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "เส้นทางฟอนต์ monospace" +msgstr "ไดเรกเตอรีฟอนต์ตัวเอียง" #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic monospace font path" -msgstr "เส้นทางฟอนต์ monospace" +msgstr "ไดเรกเตอรีฟอนต์ตัวเอียงแบบขนาดคงที่" #: src/settings_translation_file.cpp msgid "Item entity TTL" @@ -3942,7 +4404,7 @@ msgstr "รายการนิติบุคคล TTL" #: src/settings_translation_file.cpp msgid "Iterations" -msgstr "" +msgstr "การทำซ้ำ" #: src/settings_translation_file.cpp msgid "" @@ -3951,6 +4413,10 @@ msgid "" "increases processing load.\n" "At iterations = 20 this mapgen has a similar load to mapgen V7." msgstr "" +"การวนซ้ำของฟังก์ชันแบบเรียกซ้ำ.\n" +"การเพิ่มสิ่งนี้จะเพิ่มปริมาณของรายละเอียดเล็กๆ น้อยๆ แต่ยัง\n" +"เพิ่มภาระการประมวลผล.\n" +"เมื่อวนซ้ำ = 20 mapgen นี้มีภาระคล้ายกับ mapgen V7." #: src/settings_translation_file.cpp msgid "Joystick ID" @@ -3960,6 +4426,10 @@ msgstr "จอยสติ๊ก ID" msgid "Joystick button repetition interval" msgstr "ช่วงเวลาการทำซ้ำปุ่มจอยสติ๊ก" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "ประเภทของจอยสติ๊ก" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "ความไวของจอยสติ๊ก frustum" @@ -3976,6 +4446,11 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"จูเลียตั้งเท่านั้น.\n" +"ส่วนประกอบ W ของค่าคงที่ไฮเปอร์คอมเพล็กซ์.\n" +"เปลี่ยนรูปร่างของเศษส่วน.\n" +"ไม่มีผลกับแฟร็กทัล 3 มิติ.\n" +"ช่วงประมาณ -2 ถึง 2." #: src/settings_translation_file.cpp msgid "" @@ -3984,6 +4459,10 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" +"จูเลียตั้งเท่านั้น.\n" +"องค์ประกอบ X ของค่าคงที่ไฮเปอร์คอมเพล็กซ์.\n" +"เปลี่ยนรูปร่างของเศษส่วน.\n" +"ช่วงประมาณ -2 ถึง 2." #: src/settings_translation_file.cpp msgid "" @@ -3992,6 +4471,10 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" +"จูเลียตั้งเท่านั้น.\n" +"ส่วนประกอบ Y ของค่าคงที่ไฮเปอร์คอมเพล็กซ์.\n" +"เปลี่ยนรูปร่างของเศษส่วน.\n" +"ช่วงประมาณ -2 ถึง 2." #: src/settings_translation_file.cpp msgid "" @@ -4000,22 +4483,26 @@ msgid "" "Alters the shape of the fractal.\n" "Range roughly -2 to 2." msgstr "" +"จูเลียตั้งเท่านั้น\n" +"ส่วนประกอบ Z ของค่าคงที่ไฮเปอร์คอมเพล็กซ์\n" +"เปลี่ยนรูปร่างของเศษส่วน\n" +"ช่วงประมาณ -2 ถึง 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" @@ -4023,7 +4510,7 @@ msgstr "ปุ่มกระโดด" #: src/settings_translation_file.cpp msgid "Jumping speed" -msgstr "" +msgstr "ความเร็วในการกระโดด" #: src/settings_translation_file.cpp msgid "" @@ -4045,6 +4532,16 @@ msgstr "" "ดู http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"กุญแจสำหรับการกระโดด.\n" +"ดู http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4187,6 +4684,16 @@ msgstr "" "ดู http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"กุญแจสำหรับการกระโดด.\n" +"ดู http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4721,36 +5228,40 @@ msgstr "" "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 "เตะผู้เล่นที่ส่งข้อความมากกว่า X ต่อ 10 วินาที." + #: src/settings_translation_file.cpp msgid "Lake steepness" -msgstr "" +msgstr "ความชันของทะเลสาบ" #: src/settings_translation_file.cpp msgid "Lake threshold" -msgstr "" +msgstr "ทะเลสาบธรณีประตู" #: src/settings_translation_file.cpp msgid "Language" -msgstr "" +msgstr "ภาษา" #: src/settings_translation_file.cpp msgid "Large cave depth" -msgstr "" +msgstr "ความลึกของถ้ำขนาดใหญ่" #: src/settings_translation_file.cpp msgid "Large cave maximum number" -msgstr "" +msgstr "ถ้ำขนาดใหญ่จำนวนสูงสุด" #: src/settings_translation_file.cpp msgid "Large cave minimum number" -msgstr "" +msgstr "จำนวนขั้นต่ำของถ้ำขนาดใหญ่" #: src/settings_translation_file.cpp msgid "Large cave proportion flooded" -msgstr "" +msgstr "น้ำท่วมสัดส่วนถ้ำใหญ่" #: src/settings_translation_file.cpp msgid "Large chat console key" @@ -4777,34 +5288,43 @@ 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 "" +"ความยาวของขีดเซิร์ฟเวอร์และช่วงเวลาที่อ็อบเจ็กต์โดยทั่วไปจะอัปเดตมากกว่า\n" +"เครือข่าย" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Length of liquid waves.\n" "Requires waving liquids to be enabled." msgstr "" -"ตั้งค่าเป็นจริงช่วยให้ใบโบก\n" -"ต้องมี shaders เพื่อเปิดใช้งาน" +"ตั้งค่าเป็นจริงช่วยให้ใบโบก.\n" +"ต้องมี shaders เพื่อเปิดใช้งาน." #: 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 "ระยะเวลาระหว่างรอบการดำเนินการ Active Block Modifier (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 "ระยะเวลาระหว่างรอบการดำเนินการ 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 "ระยะเวลาระหว่างรอบการจัดการบล็อกที่ใช้งานอยู่" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- <nothing> (no logging)\n" @@ -4813,45 +5333,56 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" +"ระดับการบันทึกที่จะเขียนไปยัง debug.txt:\n" +"- <ไม่มีอะไร> (ไม่มีการบันทึก)\n" +"- ไม่มี (ข้อความที่ไม่มีระดับ)\n" +"- ข้อผิดพลาด\n" +"- คำเตือน\n" +"- หนังบู๊\n" +"- ข้อมูล\n" +"- ละเอียด" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost" msgstr "การเพิ่มความโค้งกลางของแสง" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost center" msgstr "ส่วนโค้งของแสงตรงกลางเพิ่ม" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve boost spread" msgstr "ส่วนโค้งเว้าเพิ่มระดับกลางแสง" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve gamma" msgstr "การเพิ่มความโค้งกลางของแสง" #: src/settings_translation_file.cpp -#, fuzzy msgid "Light curve high gradient" msgstr "การเพิ่มความโค้งกลางของแสง" #: src/settings_translation_file.cpp -#, fuzzy 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" "Value is stored per-world." msgstr "" +"ขีด จำกัด ของการสร้างแผนที่ในโหนดทั้ง 6 ทิศทางตั้งแต่ (0, 0, 0).\n" +"สร้างเฉพาะ mapchunks ภายในขีดจำกัด mapgen เท่านั้น.\n" +"ค่าจะถูกเก็บไว้สำหรับแต่ละโลก." #: src/settings_translation_file.cpp msgid "" @@ -4861,38 +5392,43 @@ msgid "" "- Downloads performed by main menu (e.g. mod manager).\n" "Only has an effect if compiled with cURL." msgstr "" +"จำกัดจำนวนคำขอ HTTP แบบขนาน ส่งผลกระทบต่อ:\n" +"- ดึงสื่อหากเซิร์ฟเวอร์ใช้การตั้งค่า remote_media.\n" +"- ดาวน์โหลดรายชื่อเซิร์ฟเวอร์และประกาศเซิร์ฟเวอร์.\n" +"- การดาวน์โหลดดำเนินการโดยเมนูหลัก (เช่น mod manager).\n" +"จะมีผลก็ต่อเมื่อคอมไพล์ด้วย cURL." #: src/settings_translation_file.cpp msgid "Liquid fluidity" -msgstr "" +msgstr "สภาพคล่อง" #: src/settings_translation_file.cpp msgid "Liquid fluidity smoothing" -msgstr "" +msgstr "การปรับความลื่นไหลของของเหลว" #: src/settings_translation_file.cpp msgid "Liquid loop max" -msgstr "" +msgstr "ลูปของเหลว max" #: src/settings_translation_file.cpp msgid "Liquid queue purge time" -msgstr "" +msgstr "เวลาล้างคิวของเหลว" #: src/settings_translation_file.cpp msgid "Liquid sinking" -msgstr "" +msgstr "ของเหลวจม" #: src/settings_translation_file.cpp msgid "Liquid update interval in seconds." -msgstr "" +msgstr "ช่วงเวลาการอัปเดตของเหลวในหน่วยวินาที." #: src/settings_translation_file.cpp msgid "Liquid update tick" -msgstr "" +msgstr "ติ๊กอัพเดทของเหลว" #: src/settings_translation_file.cpp msgid "Load the game profiler" -msgstr "" +msgstr "โหลดตัวสร้างโปรไฟล์เกม" #: src/settings_translation_file.cpp msgid "" @@ -4900,26 +5436,25 @@ msgid "" "Provides a /profiler command to access the compiled profile.\n" "Useful for mod developers and server operators." msgstr "" +"โหลดตัวสร้างโปรไฟล์เกมเพื่อรวบรวมข้อมูลโปรไฟล์เกม.\n" +"จัดเตรียมคำสั่ง /profiler เพื่อเข้าถึงโปรไฟล์ที่คอมไพล์.\n" +"มีประโยชน์สำหรับนักพัฒนา mod และตัวดำเนินการเซิร์ฟเวอร์." #: src/settings_translation_file.cpp msgid "Loading Block Modifiers" -msgstr "" +msgstr "กำลังโหลดตัวดัดแปลงบล็อก" #: src/settings_translation_file.cpp msgid "Lower Y limit of dungeons." -msgstr "" +msgstr "ขีด จำกัด Y ล่างของดันเจี้ยน." #: src/settings_translation_file.cpp msgid "Lower Y limit of floatlands." -msgstr "" +msgstr "ขีด จำกัด Y ล่างของทุ่นลอยน้ำ." #: src/settings_translation_file.cpp msgid "Main menu script" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" +msgstr "สคริปต์เมนูหลัก" #: src/settings_translation_file.cpp msgid "" @@ -4927,27 +5462,33 @@ msgid "" msgstr "" "ทำให้หมอกและสีของท้องฟ้าขึ้นอยู่กับเวลากลางวัน (รุ่งอรุณ / พระอาทิตย์ตก) และทิศทางการดู." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "ทำให้ของเหลวทั้งหมดขุ่น" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "ระดับการบีบอัดแผนที่สำหรับการจัดเก็บดิสก์" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "ระดับการบีบอัดแผนที่สำหรับการถ่ายโอนเครือข่าย" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "ไดเรกทอรีแผนที่" #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen Carpathian." -msgstr "" +msgstr "คุณลักษณะการสร้างแผนที่เฉพาะสำหรับ Mapgen Carpathian." #: 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 "" +"แอตทริบิวต์การสร้างแผนที่เฉพาะสำหรับ Mapgen Flat.\n" +"สามารถเพิ่มทะเลสาบและเนินเขาเป็นครั้งคราวในโลกที่ราบเรียบได้." #: src/settings_translation_file.cpp msgid "" @@ -4955,6 +5496,9 @@ msgid "" "'terrain' enables the generation of non-fractal terrain:\n" "ocean, islands and underground." msgstr "" +"คุณลักษณะการสร้างแผนที่เฉพาะสำหรับ Mapgen Fractal.\n" +"'ภูมิประเทศ' ทำให้เกิดภูมิประเทศที่ไม่เป็นเศษส่วน:\n" +"มหาสมุทร หมู่เกาะ และใต้ดิน." #: src/settings_translation_file.cpp msgid "" @@ -4965,10 +5509,16 @@ msgid "" "to become shallower and occasionally dry.\n" "'altitude_dry': Reduces humidity with altitude." msgstr "" +"คุณลักษณะการสร้างแผนที่เฉพาะสำหรับหุบเขา Mapgen Valleys.\n" +"'altitude_chill': ลดความร้อนด้วยระดับความสูง.\n" +"'humid_rivers': เพิ่มความชื้นรอบแม่น้ำ.\n" +"'vary_river_depth': หากเปิดใช้งาน ความชื้นต่ำและความร้อนสูงจะทำให้เกิดแม่น้ำ.\n" +"ให้ตื้นขึ้นและแห้งในบางครั้ง.\n" +"'altitude_dry': ลดความชื้นด้วยระดับความสูง." #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen v5." -msgstr "" +msgstr "แอตทริบิวต์การสร้างแผนที่เฉพาะสำหรับ Mapgen v5." #: src/settings_translation_file.cpp msgid "" @@ -4977,6 +5527,10 @@ msgid "" "When the 'snowbiomes' flag is enabled jungles are automatically enabled and\n" "the 'jungles' flag is ignored." msgstr "" +"แอตทริบิวต์การสร้างแผนที่เฉพาะสำหรับ Mapgen v6.\n" +"ธง 'สโนว์ไบโอม' เปิดใช้งาน 5 ระบบไบโอมใหม่.\n" +"เมื่อเปิดใช้งานแฟล็ก 'snowbiomes' ป่าจะถูกเปิดใช้งานโดยอัตโนมัติและ.\n" +"ธง 'ป่า' จะถูกละเว้น." #: src/settings_translation_file.cpp msgid "" @@ -4985,14 +5539,22 @@ msgid "" "'floatlands': Floating land masses in the atmosphere.\n" "'caverns': Giant caves deep underground." msgstr "" +"แอตทริบิวต์การสร้างแผนที่เฉพาะสำหรับ Mapgen v7.\n" +"'สันเขา': แม่น้ำ.\n" +"'ทุ่นลอยน้ำ': มวลดินที่ลอยอยู่ในชั้นบรรยากาศ.\n" +"'ถ้ำ': ถ้ำยักษ์ที่อยู่ลึกลงไปใต้ดิน." #: src/settings_translation_file.cpp msgid "Map generation limit" -msgstr "" +msgstr "ขีด จำกัด การสร้างแผนที่" #: src/settings_translation_file.cpp msgid "Map save interval" -msgstr "" +msgstr "ช่วงเวลาการบันทึกแผนที่" + +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "แผนที่เงาอัปเดตเฟรม" #: src/settings_translation_file.cpp msgid "Mapblock limit" @@ -5012,83 +5574,83 @@ msgstr "Mapblock ยกเลิกการโหลดหมดเวลา" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian" -msgstr "" +msgstr "แมพเก้น คาร์พาเทียน (Carpathian)" #: src/settings_translation_file.cpp msgid "Mapgen Carpathian specific flags" -msgstr "" +msgstr "ธงเฉพาะ Mapgen Carpathian" #: src/settings_translation_file.cpp msgid "Mapgen Flat" -msgstr "" +msgstr "แผนที่แบน (Mapgen Flat)" #: src/settings_translation_file.cpp msgid "Mapgen Flat specific flags" -msgstr "" +msgstr "mapgen แบนธงเฉพาะ" #: src/settings_translation_file.cpp msgid "Mapgen Fractal" -msgstr "" +msgstr "Mapgen Fractal (แผนที่สร้างเศษส่วน)" #: src/settings_translation_file.cpp msgid "Mapgen Fractal specific flags" -msgstr "" +msgstr "แฟล็กเฉพาะ Mapgen Fractal" #: src/settings_translation_file.cpp msgid "Mapgen V5" -msgstr "" +msgstr "Mapgen V5" #: src/settings_translation_file.cpp msgid "Mapgen V5 specific flags" -msgstr "" +msgstr "แฟล็กเฉพาะ Mapgen V5" #: src/settings_translation_file.cpp msgid "Mapgen V6" -msgstr "" +msgstr "Mapgen V6" #: src/settings_translation_file.cpp msgid "Mapgen V6 specific flags" -msgstr "" +msgstr "แฟล็กเฉพาะ Mapgen V6" #: src/settings_translation_file.cpp msgid "Mapgen V7" -msgstr "" +msgstr "Mapgen V7" #: src/settings_translation_file.cpp msgid "Mapgen V7 specific flags" -msgstr "" +msgstr "แฟล็กเฉพาะ Mapgen V7" #: src/settings_translation_file.cpp msgid "Mapgen Valleys" -msgstr "" +msgstr "Mapgen หุบเขา (Valleys)" #: src/settings_translation_file.cpp msgid "Mapgen Valleys specific flags" -msgstr "" +msgstr "ธงเฉพาะหุบเขา Mapgen (Valleys)" #: src/settings_translation_file.cpp msgid "Mapgen debug" -msgstr "" +msgstr "ดีบัก Mapgen" #: src/settings_translation_file.cpp msgid "Mapgen name" -msgstr "" +msgstr "ชื่อแมพเก็น" #: src/settings_translation_file.cpp msgid "Max block generate distance" -msgstr "" +msgstr "บล็อกสูงสุดสร้างระยะทาง" #: src/settings_translation_file.cpp msgid "Max block send distance" -msgstr "" +msgstr "ระยะการส่งบล็อคสูงสุด" #: src/settings_translation_file.cpp msgid "Max liquids processed per step." -msgstr "" +msgstr "ของเหลวสูงสุดที่ประมวลผลต่อขั้นตอน." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" -msgstr "" +msgstr "แม็กซ์ ล้างวัตถุบล็อกพิเศษ" #: src/settings_translation_file.cpp msgid "Max. packets per iteration" @@ -5099,12 +5661,16 @@ msgid "Maximum FPS" msgstr "FPS สูงสุด" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "FPS สูงสุดเมื่อเกมหยุดชั่วคราว" +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "เฟรมต่อวินาที (FPS) สูงสุดเมื่อเกมหยุดชั่วคราว" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "ระยะทางสูงสุดในการแสดงเงา." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" -msgstr "" +msgstr "บล็อกบังคับสูงสุด" #: src/settings_translation_file.cpp msgid "Maximum hotbar width" @@ -5112,17 +5678,19 @@ msgstr "ความกว้างของบาร์สูงสุด" #: src/settings_translation_file.cpp msgid "Maximum limit of random number of large caves per mapchunk." -msgstr "" +msgstr "ขีดจำกัดสูงสุดของจำนวนถ้ำขนาดใหญ่แบบสุ่มต่อ mapchunk." #: src/settings_translation_file.cpp msgid "Maximum limit of random number of small caves per mapchunk." -msgstr "" +msgstr "ขีดจำกัดสูงสุดของจำนวนถ้ำขนาดเล็กแบบสุ่มต่อ mapchunk." #: src/settings_translation_file.cpp msgid "" "Maximum liquid resistance. Controls deceleration when entering liquid at\n" "high speed." msgstr "" +"ความต้านทานของเหลวสูงสุด ควบคุมการชะลอตัวเมื่อเข้าสู่ของเหลวที่\n" +"ความเร็วสูง." #: src/settings_translation_file.cpp msgid "" @@ -5136,23 +5704,36 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum number of blocks that can be queued for loading." -msgstr "" +msgstr "จำนวนบล็อกสูงสุดที่สามารถเข้าคิวเพื่อโหลดได้." #: 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" +"ขีดจำกัดนี้บังคับใช้ต่อผู้เล่น." #: 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" +"ขีดจำกัดนี้บังคับใช้ต่อผู้เล่น." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"จำนวนการดาวน์โหลดพร้อมกันสูงสุด การดาวน์โหลดที่เกินขีดจำกัดนี้จะถูกจัดคิว.\n" +"ควรต่ำกว่า curl_parallel_limit." #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." -msgstr "" +msgstr "จำนวนสูงสุดของ mapblock ที่ถูกบังคับ." #: src/settings_translation_file.cpp msgid "" @@ -5182,11 +5763,11 @@ msgstr "จำนวนสูงสุดของข้อความแชท #: src/settings_translation_file.cpp msgid "Maximum number of statically stored objects in a block." -msgstr "" +msgstr "จำนวนสูงสุดของวัตถุที่จัดเก็บแบบคงที่ในบล็อก." #: src/settings_translation_file.cpp msgid "Maximum objects per block" -msgstr "" +msgstr "วัตถุสูงสุดต่อบล็อก" #: src/settings_translation_file.cpp msgid "" @@ -5213,17 +5794,23 @@ msgstr "" "0 เพื่อปิดใช้งานการจัดคิวและ -1 เพื่อทำให้ขนาดของคิวไม่ จำกัด." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" +"เวลาสูงสุดในการดาวน์โหลดไฟล์ (เช่น การดาวน์โหลดไฟล์ม็อด) อาจใช้เวลา โดยระบุเป็นมิลลิวินาที." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"เวลาสูงสุดที่คำขอแบบโต้ตอบ (เช่น การดึงข้อมูลรายการเซิร์ฟเวอร์) อาจใช้ โดยระบุเป็นมิลลิวินาที." #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "ผู้ใช้สูงสุด" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "เมนู" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "แคชตาข่าย" @@ -5242,7 +5829,7 @@ msgstr "วิธีการใช้เพื่อเน้นวัตถุ #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "ระดับการบันทึกขั้นต่ำที่จะเขียนในการแชท." #: src/settings_translation_file.cpp msgid "Minimap" @@ -5258,27 +5845,40 @@ msgstr "ความสูงการสแกนแผนที่ขั้น #: src/settings_translation_file.cpp msgid "Minimum limit of random number of large caves per mapchunk." -msgstr "" +msgstr "ขีดจำกัดขั้นต่ำของการสุ่มจำนวนถ้ำขนาดใหญ่ต่อ mapchunk." #: src/settings_translation_file.cpp msgid "Minimum limit of random number of small caves per mapchunk." -msgstr "" +msgstr "ขีดจำกัดขั้นต่ำของจำนวนถ้ำขนาดเล็กแบบสุ่มต่อ mapchunk." #: src/settings_translation_file.cpp msgid "Minimum texture size" msgstr "ขนาดพื้นผิวขั้นต่ำ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mipmapping" -msgstr "Mipmapping" +msgstr "Mipmapping (แมงป่อง)" + +#: 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 "ช่องทาง Mod" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "ปรับเปลี่ยนขนาดขององค์ประกอบ Hudbar." #: src/settings_translation_file.cpp @@ -5289,21 +5889,25 @@ msgstr "เส้นทางฟอนต์ monospace" msgid "Monospace font size" msgstr "ขนาดตัวอักษร Monospace" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "ขนาดตัวอักษร Monospace" + #: src/settings_translation_file.cpp msgid "Mountain height noise" -msgstr "" +msgstr "เสียงรบกวนจากความสูงของภูเขา" #: src/settings_translation_file.cpp msgid "Mountain noise" -msgstr "" +msgstr "เสียงภูเขา" #: src/settings_translation_file.cpp msgid "Mountain variation noise" -msgstr "" +msgstr "เสียงแปรผันของภูเขา" #: src/settings_translation_file.cpp msgid "Mountain zero level" -msgstr "" +msgstr "ระดับศูนย์ภูเขา" #: src/settings_translation_file.cpp msgid "Mouse sensitivity" @@ -5315,7 +5919,7 @@ msgstr "คูณความไวเมาส์." #: src/settings_translation_file.cpp msgid "Mud noise" -msgstr "" +msgstr "เสียงโคลน" #: src/settings_translation_file.cpp msgid "" @@ -5340,6 +5944,10 @@ msgid "" "Current mapgens in a highly unstable state:\n" "- The optional floatlands of v7 (disabled by default)." msgstr "" +"ชื่อของตัวสร้างแผนที่ที่จะใช้ในการสร้างโลกใหม่.\n" +"การสร้างโลกในเมนูหลักจะแทนที่สิ่งนี้\n" +"mapgens ปัจจุบันอยู่ในสถานะที่ไม่เสถียรสูง:\n" +"- floatlands เสริมของ v7 (ปิดใช้งานโดยค่าเริ่มต้น)." #: src/settings_translation_file.cpp msgid "" @@ -5347,6 +5955,9 @@ msgid "" "When running a server, clients connecting with this name are admins.\n" "When starting from the main menu, this is overridden." msgstr "" +"ชื่อผู้เล่น.\n" +"เมื่อใช้งานเซิร์ฟเวอร์ ไคลเอ็นต์ที่เชื่อมต่อกับชื่อนี้คือผู้ดูแลระบบ.\n" +"เมื่อเริ่มต้นจากเมนูหลัก สิ่งนี้จะถูกแทนที่." #: src/settings_translation_file.cpp msgid "" @@ -5354,13 +5965,8 @@ msgid "" msgstr "ชื่อของเซิร์ฟเวอร์ที่จะแสดงเมื่อผู้เล่นเข้าร่วมและในรายการเซิร์ฟเวอร์." #: src/settings_translation_file.cpp -#, fuzzy msgid "Near plane" -msgstr "ใกล้เครื่องบิน" - -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "เครือข่าย" +msgstr "ระนาบใกล้" #: src/settings_translation_file.cpp msgid "" @@ -5370,42 +5976,43 @@ msgstr "" "พอร์ตเครือข่ายเพื่อฟัง (UDP).\n" "ค่านี้จะถูกแทนที่เมื่อเริ่มต้นจากเมนูหลัก." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "เครือข่าย" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "ผู้ใช้ใหม่ต้องป้อนรหัสผ่านนี้." #: src/settings_translation_file.cpp -#, fuzzy msgid "Noclip" -msgstr "Noclip (? คลิปไม่)" +msgstr "โนคลิป (ทะลุผ่านบล็อก)" #: src/settings_translation_file.cpp msgid "Noclip key" msgstr "คีย์ Noclip" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "โหนที่เน้น" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "การเน้นโหนด" #: src/settings_translation_file.cpp msgid "NodeTimer interval" -msgstr "" +msgstr "ช่วงเวลา NodeTimer" #: src/settings_translation_file.cpp msgid "Noises" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "การสุ่มตัวอย่าง Normalmaps" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Normalmaps แข็งแรง" +msgstr "เสียงรบกวน" #: src/settings_translation_file.cpp msgid "Number of emerge threads" -msgstr "" +msgstr "จำนวนเธรดที่โผล่ออกมา" #: src/settings_translation_file.cpp msgid "" @@ -5420,21 +6027,26 @@ 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" +"ค่า 0:\n" +"- การเลือกอัตโนมัติ จำนวนเธรดที่โผล่ออกมาจะเป็น\n" +"- 'จำนวนโปรเซสเซอร์ - 2' โดยมีขีดจำกัดล่างที่ 1.\n" +"ค่าอื่นๆ:\n" +"- ระบุจำนวนเธรดที่โผล่ออกมา โดยมีขีดจำกัดล่างที่ 1.\n" +"คำเตือน: การเพิ่มจำนวนของเธรดที่โผล่ออกมาจะเพิ่มการแมปของเครื่องยนต์\n" +"ความเร็ว แต่อาจส่งผลเสียต่อประสิทธิภาพของเกมโดยการรบกวนผู้อื่น\n" +"กระบวนการ โดยเฉพาะอย่างยิ่งใน singleplayer และ/หรือเมื่อรันโค้ด Lua ใน\n" +"'on_generated' สำหรับผู้ใช้หลายคน การตั้งค่าที่เหมาะสมที่สุดอาจเป็น '1'." #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "จำนวนการวนซ้ำของการปิดกั้น parallax" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" +"จำนวนบล็อกพิเศษที่สามารถโหลดได้โดย /clear ออบเจ็กต์ในครั้งเดียว.\n" +"นี่คือการแลกเปลี่ยนระหว่างโอเวอร์เฮดของธุรกรรม SQLite และ\n" +"การใช้หน่วยความจำ (4096=100MB ตามหลักการทั่วไป)." #: src/settings_translation_file.cpp msgid "Opaque liquids" @@ -5443,62 +6055,37 @@ msgstr "ของเหลวทึบแสง" #: src/settings_translation_file.cpp msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" +msgstr "ความทึบ (อัลฟา) ของเงาด้านหลังแบบอักษรเริ่มต้น ระหว่าง 0 ถึง 255." #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " "formspec is\n" "open." -msgstr "เปิดเมนูหยุดชั่วคราวเมื่อโฟกัสของหน้าต่างหายไป ไม่หยุดถ้า formspec คือ เปิด." +msgstr "" +"เปิดเมนูหยุดชั่วคราวเมื่อโฟกัสของหน้าต่างหายไป ไม่หยุดถ้า formspec เป็น\n" +"เปิด." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "ความเอนเอียงโดยรวมของเอฟเฟ็กต์การบดเคี้ยวของ Parallax มักเป็นสเกล / 2" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "ขนาดโดยรวมของผลการบดเคี้ยวของรัลแลกซ์" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "การบดเคี้ยวของ Parallax" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "อคติการบดเคี้ยวของ Parallax" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "การวนซ้ำของ Parallax" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "โหมดการบดเคี้ยวของ Parallax" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "ขนาดการบดเคี้ยวของ Parallax" +msgid "Optional override for chat weblink color." +msgstr "ตัวเลือกการแทนที่สำหรับสีของเว็บลิงค์แชท." #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" +"เส้นทางของแบบอักษรทางเลือก ต้องเป็นแบบอักษร TrueType.\n" +"แบบอักษรนี้จะใช้สำหรับบางภาษาหรือหากไม่มีแบบอักษรเริ่มต้น." #: 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 "" +"เส้นทางบันทึกภาพหน้าจอได้ที่ สามารถเป็นเส้นทางสัมบูรณ์หรือสัมพัทธ์.\n" +"โฟลเดอร์จะถูกสร้างขึ้นหากไม่มีอยู่." #: src/settings_translation_file.cpp msgid "" @@ -5512,19 +6099,19 @@ msgstr "เส้นทางไปยังไดเรกทอรีพื้ #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" +"เส้นทางไปยังแบบอักษรเริ่มต้น ต้องเป็นแบบอักษร TrueType.\n" +"ระบบจะใช้แบบอักษรสำรองหากไม่สามารถโหลดแบบอักษรได้." #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" +"เส้นทางไปยังแบบอักษร monospace ต้องเป็นแบบอักษร TrueType.\n" +"แบบอักษรนี้ใช้สำหรับเช่น หน้าจอคอนโซลและตัวสร้างโปรไฟล์." #: src/settings_translation_file.cpp msgid "Pause on lost window focus" @@ -5532,15 +6119,15 @@ msgstr "หยุดการโฟกัสของหน้าต่างท #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" -msgstr "" +msgstr "ขีด จำกัด ต่อผู้เล่นของบล็อกที่เข้าคิวโหลดจากดิสก์" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks to generate" -msgstr "" +msgstr "ขีด จำกัด ต่อผู้เล่นของบล็อกที่เข้าคิวเพื่อสร้าง" #: src/settings_translation_file.cpp msgid "Physics" -msgstr "" +msgstr "ฟิสิกส์" #: src/settings_translation_file.cpp msgid "Pitch move key" @@ -5550,6 +6137,14 @@ msgstr "ปุ่มเลื่อนระดับเสียง" msgid "Pitch move mode" msgstr "โหมดย้ายสนาม" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "ปุ่มวาง" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "กระแทกซ้ำช่วง" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5558,10 +6153,6 @@ msgstr "" "ผู้เล่นสามารถบินโดยไม่ได้รับผลกระทบโดยแรงโน้มถ่วงได้.\n" "ต้องมีสิทธิ์ 'บิน' บนเซิร์ฟเวอร์." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "ระยะถ่ายโอนผู้เล่น" @@ -5570,6 +6161,10 @@ msgstr "ระยะถ่ายโอนผู้เล่น" msgid "Player versus player" msgstr "ผู้เล่นกับผู้เล่น" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "การกรองปัวซอง" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5588,13 +6183,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Prevent mods from doing insecure things like running shell commands." -msgstr "" +msgstr "ป้องกันไม่ให้ม็อดทำสิ่งต่าง ๆ ที่ไม่ปลอดภัย เช่น การรันคำสั่งเชลล์." #: src/settings_translation_file.cpp msgid "" "Print the engine's profiling data in regular intervals (in seconds).\n" "0 = disable. Useful for developers." msgstr "" +"พิมพ์ข้อมูลโปรไฟล์ของเครื่องยนต์ในช่วงเวลาปกติ (เป็นวินาที).\n" +"0 = ปิดการใช้งาน มีประโยชน์สำหรับนักพัฒนา." #: src/settings_translation_file.cpp msgid "Privileges that players with basic_privs can grant" @@ -5602,31 +6199,31 @@ msgstr "สิทธิพิเศษที่ผู้เล่นที่ม #: src/settings_translation_file.cpp msgid "Profiler" -msgstr "" +msgstr "ผู้สร้างโปรไฟล์" #: src/settings_translation_file.cpp msgid "Profiler toggle key" msgstr "ปุ่มสลับ Profiler" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" -msgstr "" +msgstr "ที่อยู่ผู้ฟัง Prometheus" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"ที่อยู่ผู้ฟังโพรมีธีอุส.\n" +"หาก Minetest ถูกคอมไพล์โดยเปิดใช้งานตัวเลือก ENABLE_PROMETHEUS,\n" +"เปิดใช้งานตัวฟังเมตริกสำหรับ Prometheus บนที่อยู่นั้น.\n" +"สามารถดึงข้อมูลเมตริกได้ที่ http://127.0.0.1:30000/metrics" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." -msgstr "" +msgstr "สัดส่วนของถ้ำขนาดใหญ่ที่มีของเหลว." #: src/settings_translation_file.cpp msgid "" @@ -5639,7 +6236,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Raises terrain to make valleys around the rivers." -msgstr "" +msgstr "ยกระดับภูมิประเทศให้เป็นหุบเขารอบแม่น้ำ." #: src/settings_translation_file.cpp msgid "Random input" @@ -5654,9 +6251,8 @@ msgid "Recent Chat Messages" msgstr "ข้อความแชทล่าสุด" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "เส้นทางแบบอักษร" +msgstr "ไดเรกเตอรีฟอนต์แบบปกติ" #: src/settings_translation_file.cpp msgid "Remote media" @@ -5676,11 +6272,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Replaces the default main menu with a custom one." -msgstr "" +msgstr "แทนที่เมนูหลักที่เป็นค่าเริ่มต้นด้วยเมนูแบบกำหนดเอง." #: src/settings_translation_file.cpp msgid "Report path" -msgstr "" +msgstr "รายงานเส้นทาง" #: src/settings_translation_file.cpp msgid "" @@ -5695,54 +6291,60 @@ msgid "" "csm_restriction_noderange)\n" "READ_PLAYERINFO: 32 (disable get_player_names call client-side)" msgstr "" +"จำกัดการเข้าถึงฟังก์ชันฝั่งไคลเอ็นต์บางอย่างบนเซิร์ฟเวอร์.\n" +"รวม byteflags ด้านล่างเพื่อจำกัดคุณลักษณะฝั่งไคลเอ็นต์ หรือตั้งค่าเป็น0\n" +"โดยไม่มีข้อจำกัด:\n" +"LOAD_CLIENT_MODS: 1 (ปิดใช้งานการโหลดม็อดที่ไคลเอ็นต์ให้มา)\n" +"CHAT_MESSAGES: 2 (ปิดการใช้งาน send_chat_message โทรฝั่งไคลเอ็นต์)\n" +"READ_ITEMDEFS: 4 (ปิดใช้งานการโทรฝั่งไคลเอ็นต์ get_item_def)\n" +"READ_NODEDEFS: 8 (ปิดใช้งานการโทรฝั่งไคลเอ็นต์ get_node_def)\n" +"LOOKUP_NODES_LIMIT: 16 (จำกัด get_node โทรฝั่งไคลเอ็นต์เป็น\n" +"csm_restriction_noderange)\n" +"READ_PLAYERINFO: 32 (ปิดการใช้งาน get_player_names โทรฝั่งไคลเอ็นต์)" #: src/settings_translation_file.cpp msgid "Ridge mountain spread noise" -msgstr "" +msgstr "สันเขากระจายเสียง" #: src/settings_translation_file.cpp msgid "Ridge noise" -msgstr "" +msgstr "เสียงสันเขา" #: src/settings_translation_file.cpp msgid "Ridge underwater noise" -msgstr "" +msgstr "เสียงใต้น้ำของสันเขา" #: src/settings_translation_file.cpp msgid "Ridged mountain size noise" -msgstr "" +msgstr "เสียงดังขนาดสันเขา" #: src/settings_translation_file.cpp msgid "Right key" msgstr "ปุ่มขวา" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "กระแทกซ้ำช่วง" - #: src/settings_translation_file.cpp msgid "River channel depth" -msgstr "" +msgstr "ความลึกของช่องแม่น้ำ" #: src/settings_translation_file.cpp msgid "River channel width" -msgstr "" +msgstr "ความกว้างของช่องแม่น้ำ" #: src/settings_translation_file.cpp msgid "River depth" -msgstr "" +msgstr "ความลึกของแม่น้ำ" #: src/settings_translation_file.cpp msgid "River noise" -msgstr "" +msgstr "เสียงแม่น้ำ" #: src/settings_translation_file.cpp msgid "River size" -msgstr "" +msgstr "ขนาดแม่น้ำ" #: src/settings_translation_file.cpp msgid "River valley width" -msgstr "" +msgstr "ความกว้างหุบเขาแม่น้ำ" #: src/settings_translation_file.cpp msgid "Rollback recording" @@ -5750,11 +6352,11 @@ msgstr "บันทึกย้อนกลับ" #: src/settings_translation_file.cpp msgid "Rolling hill size noise" -msgstr "" +msgstr "เสียงขนาดเนินกลิ้ง" #: src/settings_translation_file.cpp msgid "Rolling hills spread noise" -msgstr "" +msgstr "ภูเขากลิ้งกระจายเสียง" #: src/settings_translation_file.cpp msgid "Round minimap" @@ -5766,7 +6368,7 @@ msgstr "การขุดและการวางที่ปลอดภั #: src/settings_translation_file.cpp msgid "Sandy beaches occur when np_beach exceeds this value." -msgstr "" +msgstr "หาดทรายเกิดขึ้นเมื่อ np_beach มีค่าเกินกว่านี้." #: src/settings_translation_file.cpp msgid "Save the map received by the client on disk." @@ -5794,6 +6396,11 @@ msgstr "" "พิกเซลเมื่อลดขนาดลงทำให้มีการเบลอบ้าง\n" "พิกเซลขอบเมื่อปรับขนาดรูปภาพด้วยขนาดที่ไม่ใช่จำนวนเต็ม" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "หน้าจอ:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "ความสูงของหน้าจอ" @@ -5824,25 +6431,26 @@ msgstr "" "1 หมายถึงคุณภาพที่แย่ที่สุด 100 หมายถึงคุณภาพที่ดีที่สุด\n" "ใช้ 0 สำหรับคุณภาพเริ่มต้น" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "ภาพหน้าจอ" + #: src/settings_translation_file.cpp msgid "Seabed noise" -msgstr "" +msgstr "เสียงท้องทะเล" #: src/settings_translation_file.cpp msgid "Second of 4 2D noises that together define hill/mountain range height." -msgstr "" +msgstr "เสียง 2D จากทั้งหมด 4 เสียงที่ร่วมกันกำหนดความสูงของช่วงเนินเขา/ภูเขา." #: 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 "เสียง 3D ที่สองจากสองเสียงที่กำหนดอุโมงค์ร่วมกัน" #: src/settings_translation_file.cpp msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" -msgstr "" +msgstr "ดู https://www.sqlite.org/pragma.html#pragma_synchronous" #: src/settings_translation_file.cpp msgid "Selection box border color (R,G,B)." @@ -5878,10 +6486,40 @@ msgid "" "17 = 4D \"Mandelbulb\" Mandelbrot set.\n" "18 = 4D \"Mandelbulb\" Julia set." msgstr "" +"เลือกหนึ่งใน 18 ประเภทเศษส่วน\n" +"1 = 4D ชุด \"Roundy\" Mandelbrot\n" +"2 = 4D ชุด \"กลม\" จูเลีย\n" +"3 = 4D \"Squarry\" ชุด Mandelbrot\n" +"4 = 4D \"Squarry\" ชุดจูเลีย\n" +"5 = 4D ชุด \"ลูกพี่ลูกน้องแมนดี้\" แมนเดลบรอต\n" +"6 = 4D \"ลูกพี่ลูกน้องแมนดี้\" จูเลียตั้ง\n" +"7 = 4D \"รูปแบบ\" ชุด Mandelbrot\n" +"8 = 4D \"รูปแบบ\" ชุดจูเลีย\n" +"9 = 3D \"Mandelbrot/Mandelbar\" ชุด Mandelbrot\n" +"10 = 3D \"Mandelbrot/Mandelbar\" ชุดจูเลีย\n" +"11 = 3D \"ต้นคริสต์มาส\" ชุด Mandelbrot\n" +"12 = 3D \"ต้นคริสต์มาส\" ชุดจูเลีย\n" +"13 = 3D \"Mandelbulb\" ชุด Mandelbrot\n" +"14 = 3D \"Mandelbulb\" ชุดจูเลีย\n" +"15 = ชุด \"Cosine Mandelbulb\" 3 มิติ Mandelbrot\n" +"16 = 3D \"Cosine Mandelbulb\" ชุดจูเลีย\n" +"17 = 4D \"Mandelbulb\" ชุด Mandelbrot\n" +"18 = 4D \"Mandelbulb\" ชุดจูเลีย" #: 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" @@ -5905,12 +6543,22 @@ msgstr "พอร์ตเซิร์ฟเวอร์" #: src/settings_translation_file.cpp msgid "Server side occlusion culling" -msgstr "" +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 "ไฟล์เซิร์ฟเวอร์รายการ" @@ -5920,37 +6568,87 @@ msgid "" "Set the language. Leave empty to use the system language.\n" "A restart is required after changing this." msgstr "" - -#: src/settings_translation_file.cpp -msgid "Set the maximum character length of a chat message sent by clients." -msgstr "" +"ตั้งค่าภาษา เว้นว่างไว้เพื่อใช้ภาษาของระบบ.\n" +"จำเป็นต้องรีสตาร์ทหลังจากเปลี่ยนแปลงสิ่งนี้." #: src/settings_translation_file.cpp #, fuzzy msgid "" +"Set the maximum length of a chat message (in characters) sent by clients." +msgstr "กำหนดความยาวอักขระสูงสุดของข้อความแชทที่ส่งโดยลูกค้า." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"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 "" +"กำหนดความแรงของเงา.\n" +"ค่าที่ต่ำกว่าหมายถึงเงาที่สว่างกว่า ค่าที่สูงกว่าหมายถึงเงาที่เข้มกว่า." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"กำหนดขนาดรัศมีเงาที่นุ่มนวล.\n" +"ค่าที่ต่ำกว่าหมายถึงเงาที่คมชัดกว่า ค่าที่มากขึ้นหมายถึงเงาที่นุ่มนวลกว่า.\n" +"ค่าต่ำสุด: 1.0; มูลค่าสูงสุด: 10.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"ตั้งค่าความเอียงของวงโคจรของดวงอาทิตย์/ดวงจันทร์เป็นองศา.\n" +"ค่า 0 หมายถึงไม่มีวงโคจรเอียง/แนวตั้ง.\n" +"ค่าต่ำสุด: 0.0; ค่าสูงสุด: 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"ตั้งค่าเป็นจริงช่วยให้ใบโบก.\n" +"ต้องมี shaders เพื่อเปิดใช้งาน." + +#: src/settings_translation_file.cpp +msgid "" "Set to true to enable waving leaves.\n" "Requires shaders to be enabled." msgstr "" -"ตั้งค่าเป็นจริงช่วยให้ใบโบก\n" -"ต้องมี shaders เพื่อเปิดใช้งาน" +"ตั้งค่าเป็นจริงช่วยให้ใบโบก.\n" +"ต้องมี shaders เพื่อเปิดใช้งาน." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving liquids (like water).\n" "Requires shaders to be enabled." msgstr "" -"ตั้งค่าเป็นจริงช่วยให้น้ำโบก\n" -"ต้องมี shaders เพื่อเปิดใช้งาน" +"ตั้งค่าเป็นจริงช่วยให้น้ำโบก.\n" +"ต้องมี shaders เพื่อเปิดใช้งาน." #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Set to true to enable waving plants.\n" "Requires shaders to be enabled." msgstr "" -"การตั้งค่าเป็นจริงช่วยให้พืชโบก\n" -"ต้องมี shaders เพื่อเปิดใช้งาน" +"การตั้งค่าเป็นจริงช่วยให้พืชโบก.\n" +"ต้องมี shaders เพื่อเปิดใช้งาน." + +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"ตั้งค่าคุณภาพพื้นผิวเงาเป็น 32 บิต.\n" +"เท็จจะใช้พื้นผิว 16 บิต.\n" +"สิ่งนี้สามารถทำให้เกิดสิ่งประดิษฐ์จำนวนมากขึ้นในเงามืด." #: src/settings_translation_file.cpp msgid "Shader path" @@ -5968,7 +6666,22 @@ msgstr "" "ใช้งานได้กับแบ็กเอนด์วิดีโอ OpenGL เท่านั้น" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Shadow filter quality" +msgstr "คุณภาพของภาพหน้าจอ" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "แผนที่เงาระยะทางสูงสุดในโหนดเพื่อแสดงเงา" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "พื้นผิวแผนที่เงาใน 32 บิต" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "ขนาดพื้นผิวขั้นต่ำ" + +#: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " "drawn." @@ -5976,10 +6689,8 @@ msgstr "เงาแบบอักษรชดเชยถ้า 0 แล้ว #: src/settings_translation_file.cpp #, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "เงาแบบอักษรชดเชยถ้า 0 แล้วเงาจะไม่ถูกวาด." +msgid "Shadow strength gamma" +msgstr "ความแข็งแกร่งของเงา" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -5993,6 +6704,18 @@ msgstr "แสดงข้อมูลการดีบัก" msgid "Show entity selection boxes" msgstr "แสดงกล่องการเลือกเอนทิตี" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"แสดงกล่องการเลือกเอนทิตี\n" +"จำเป็นต้องรีสตาร์ทหลังจากเปลี่ยนแปลงสิ่งนี้." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "แสดงพื้นหลังแท็กชื่อโดยค่าเริ่มต้น" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "ข้อความปิดเครื่อง" @@ -6006,6 +6729,12 @@ msgid "" "Altering this value is for special usage, leaving it unchanged is\n" "recommended." msgstr "" +"ขนาดของ mapchunks ที่สร้างโดย mapgen ระบุไว้ใน mapblock (16 โหนด).\n" +"คำเตือน!: ไม่มีประโยชน์และมีอันตรายหลายประการใน\n" +"เพิ่มค่านี้ให้สูงกว่า 5.\n" +"การลดค่านี้จะเพิ่มความหนาแน่นของถ้ำและดันเจี้ยน.\n" +"การเปลี่ยนแปลงค่านี้มีไว้เพื่อการใช้งานพิเศษ ไม่เปลี่ยนแปลงคือ\n" +"ที่แนะนำ.." #: src/settings_translation_file.cpp msgid "" @@ -6017,29 +6746,33 @@ msgstr "" "เพิ่มแคชการเข้าชม% ลดการคัดลอกข้อมูลจากหลัก\n" "ด้ายจึงลดกระวนกระวายใจ" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "วงโคจรของท้องฟ้าเอียง" + #: src/settings_translation_file.cpp msgid "Slice w" -msgstr "" +msgstr "ฝาน w" #: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights." -msgstr "" +msgstr "ลาดและเติมทำงานร่วมกันเพื่อปรับเปลี่ยนความสูง." #: src/settings_translation_file.cpp msgid "Small cave maximum number" -msgstr "" +msgstr "จำนวนสูงสุดของถ้ำขนาดเล็ก" #: src/settings_translation_file.cpp msgid "Small cave minimum number" -msgstr "" +msgstr "จำนวนขั้นต่ำของถ้ำขนาดเล็ก" #: src/settings_translation_file.cpp msgid "Small-scale humidity variation for blending biomes on borders." -msgstr "" +msgstr "การเปลี่ยนแปลงความชื้นขนาดเล็กสำหรับการผสมไบโอมบนพรมแดน" #: src/settings_translation_file.cpp msgid "Small-scale temperature variation for blending biomes on borders." -msgstr "" +msgstr "ความแปรผันของอุณหภูมิขนาดเล็กสำหรับการผสมไบโอมบนพรมแดน." #: src/settings_translation_file.cpp msgid "Smooth lighting" @@ -6067,24 +6800,20 @@ msgstr "กุญแจแอบ" #: src/settings_translation_file.cpp msgid "Sneaking speed" -msgstr "" +msgstr "ด้อมความเร็ว" #: src/settings_translation_file.cpp msgid "Sneaking speed, in nodes per second." -msgstr "" +msgstr "ความเร็วในการด้อม ในโหนดต่อวินาที." + +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "ตัวอักษรเงาอัลฟา" #: src/settings_translation_file.cpp msgid "Sound" msgstr "เสียง" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "รหัสพิเศษ" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "คีย์พิเศษสำหรับการปีนเขา/เรียง" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6103,16 +6832,30 @@ msgid "" "Note that mods or games may explicitly set a stack for certain (or all) " "items." msgstr "" +"ระบุขนาดสแต็กเริ่มต้นของโหนด รายการ และเครื่องมือ.\n" +"โปรดทราบว่าม็อดหรือเกมอาจตั้งค่าสแต็กสำหรับบางรายการ (หรือทั้งหมด) อย่างชัดเจน." + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"อัปเดตแผนที่เงาโดยสมบูรณ์ตามจำนวนเฟรมที่กำหนด.\n" +"ค่าที่สูงขึ้นอาจทำให้เงาล้าหลัง ค่าที่ต่ำกว่า\n" +"จะใช้ทรัพยากรมากขึ้น.\n" +"ค่าต่ำสุด: 1; ค่าสูงสุด: 16" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Spread of light curve boost range.\n" "Controls the width of the range to be boosted.\n" "Standard deviation of the light curve boost Gaussian." msgstr "" -"การแพร่กระจายของแสงโค้งกลาง - เพิ่ม\n" -"ค่าเบี่ยงเบนมาตรฐานของ Gaussian กลางเร่ง" +"การแพร่กระจายของช่วงการเพิ่มของเส้นโค้งแสง\n" +"ควบคุมความกว้างของช่วงที่จะขยาย\n" +"ส่วนเบี่ยงเบนมาตรฐานของเส้นโค้งแสงเพิ่มค่าเกาส์เซียน" #: src/settings_translation_file.cpp msgid "Static spawnpoint" @@ -6120,24 +6863,19 @@ msgstr "จุดกำเนิดแบบคงที่" #: src/settings_translation_file.cpp msgid "Steepness noise" -msgstr "" +msgstr "เสียงสูงชัน" #: src/settings_translation_file.cpp msgid "Step mountain size noise" -msgstr "" +msgstr "เสียงรบกวนขนาดขั้นบันได" #: src/settings_translation_file.cpp msgid "Step mountain spread noise" -msgstr "" +msgstr "สเต็ปภูเขากระจายเสียง" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." -msgstr "ความแข็งแกร่งของพารัลแลกซ์" - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "ความแข็งแกร่งของแผนที่ปกติที่สร้างขึ้น" +msgstr "ความแข็งแกร่งของพารัลแลกซ์." #: src/settings_translation_file.cpp msgid "" @@ -6145,6 +6883,9 @@ msgid "" "The 3 'boost' parameters define a range of the light\n" "curve that is boosted in brightness." msgstr "" +"เพิ่มความแรงของเส้นโค้งแสง.\n" +"พารามิเตอร์ 'บูสต์' 3 ตัวกำหนดช่วงของแสง\n" +"เส้นโค้งที่เพิ่มขึ้นในความสว่าง." #: src/settings_translation_file.cpp msgid "Strict protocol checking" @@ -6167,34 +6908,49 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"ระดับพื้นผิวของน้ำเสริมที่วางอยู่บนชั้นลอยตัวที่เป็นของแข็ง.\n" +"น้ำถูกปิดใช้งานโดยค่าเริ่มต้นและจะถูกวางไว้ก็ต่อเมื่อค่านี้ถูกตั้งค่าไว้.\n" +"ไปด้านบน 'mgv7_floatland_ymax' - 'mgv7_floatland_taper' \n" +"(จุดเริ่มต้นของการเรียวบน).\n" +"***คำเตือน อันตรายที่อาจเกิดขึ้นกับโลกและประสิทธิภาพของเซิร์ฟเวอร์***:\n" +"เมื่อเปิดใช้งานการวางน้ำจะต้องกำหนดค่าและทดสอบพื้นที่ลอยน้ำ\n" +"ให้เป็นชั้นทึบโดยตั้งค่า 'mgv7_floatland_density' เป็น 2.0 (หรืออื่น ๆ\n" +"ค่าที่ต้องการขึ้นอยู่กับ 'mgv7_np_floatland') เพื่อหลีกเลี่ยง\n" +"การไหลของน้ำที่รุนแรงโดยเซิร์ฟเวอร์และเพื่อหลีกเลี่ยงน้ำท่วมใหญ่ของ\n" +"พื้นผิวโลกด้านล่าง." #: src/settings_translation_file.cpp msgid "Synchronous SQLite" -msgstr "" +msgstr "SQLite แบบซิงโครนัส" #: src/settings_translation_file.cpp msgid "Temperature variation for biomes." -msgstr "" +msgstr "การเปลี่ยนแปลงอุณหภูมิสำหรับไบโอม." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "การตั้งค่า" #: src/settings_translation_file.cpp msgid "Terrain alternative noise" -msgstr "" +msgstr "เสียงรบกวนทางเลือกของภูมิประเทศ" #: src/settings_translation_file.cpp msgid "Terrain base noise" -msgstr "" +msgstr "เสียงฐานภูมิประเทศ" #: src/settings_translation_file.cpp msgid "Terrain height" -msgstr "" +msgstr "ความสูงของภูมิประเทศ" #: src/settings_translation_file.cpp msgid "Terrain higher noise" -msgstr "" +msgstr "ภูมิประเทศเสียงที่สูงขึ้น" #: src/settings_translation_file.cpp msgid "Terrain noise" -msgstr "" +msgstr "เสียงภูมิประเทศ" #: src/settings_translation_file.cpp msgid "" @@ -6202,6 +6958,9 @@ msgid "" "Controls proportion of world area covered by hills.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"ธรณีประตูเสียงภูมิประเทศสำหรับเนินเขา.\n" +"ควบคุมสัดส่วนพื้นที่โลกที่ปกคลุมด้วยเนินเขา.\n" +"ปรับไปที่ 0.0 สำหรับสัดส่วนที่มากขึ้น." #: src/settings_translation_file.cpp msgid "" @@ -6209,15 +6968,28 @@ msgid "" "Controls proportion of world area covered by lakes.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"ธรณีประตูเสียงภูมิประเทศสำหรับทะเลสาบ.\n" +"ควบคุมสัดส่วนพื้นที่โลกที่ปกคลุมด้วยทะเลสาบ.\n" +"ปรับไปที่ 0.0 สำหรับสัดส่วนที่มากขึ้น." #: src/settings_translation_file.cpp msgid "Terrain persistence noise" -msgstr "" +msgstr "เสียงคงอยู่ของภูมิประเทศ" #: src/settings_translation_file.cpp msgid "Texture path" msgstr "เส้นทางพื้นผิว" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"ขนาดพื้นผิวเพื่อแสดงแผนที่เงา.\n" +"นี่ต้องเป็นกำลังสอง.\n" +"ตัวเลขที่ใหญ่กว่าจะสร้างเงาที่ดีกว่า แต่ก็มีราคาแพงกว่าเช่นกัน." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6236,22 +7008,28 @@ msgstr "" #: src/settings_translation_file.cpp msgid "The URL for the content repository" -msgstr "" +msgstr "URL สำหรับที่เก็บเนื้อหา" + +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "ตัวระบุของจอยสติ๊กที่จะใช้" #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" "when calling `/profiler save [format]` without format." msgstr "" +"รูปแบบเริ่มต้นที่จะบันทึกโปรไฟล์,\n" +"เมื่อเรียก `/profiler save [รูปแบบ]` โดยไม่มีรูปแบบ." #: src/settings_translation_file.cpp msgid "The depth of dirt or other biome filler node." -msgstr "" +msgstr "ความลึกของสิ่งสกปรกหรือโหนดเติมไบโอมอื่นๆ." #: src/settings_translation_file.cpp msgid "" "The file path relative to your worldpath in which profiles will be saved to." -msgstr "" +msgstr "เส้นทางของไฟล์ที่สัมพันธ์กับ worldpath ของคุณซึ่งโปรไฟล์จะถูกบันทึกไว้." #: src/settings_translation_file.cpp msgid "The identifier of the joystick to use" @@ -6269,6 +7047,11 @@ msgid "" "Default is 1.0 (1/2 node).\n" "Requires waving liquids to be enabled." msgstr "" +"ความสูงสูงสุดของพื้นผิวของเหลวโบก.\n" +"4.0 = ความสูงของคลื่นคือสองโหนด.\n" +"0.0 = คลื่นไม่เคลื่อนที่เลย.\n" +"ค่าเริ่มต้นคือ 1.0 (1/2 โหนด).\n" +"ต้องเปิดใช้งานโบกของเหลว." #: src/settings_translation_file.cpp msgid "The network interface that the server listens on." @@ -6292,26 +7075,31 @@ msgid "" "maintained.\n" "This should be configured together with active_object_send_range_blocks." msgstr "" +"รัศมีของปริมาตรของบล็อครอบ ๆ ผู้เล่นทุกคนที่อยู่ภายใต้\n" +"สิ่งที่บล็อกที่ใช้งานอยู่ระบุไว้ใน mapblocks (16 โหนด).\n" +"ในวัตถุบล็อกที่ใช้งานอยู่จะถูกโหลดและ ABMs ทำงาน.\n" +"นี่ยังเป็นช่วงขั้นต่ำที่วัตถุที่ใช้งานอยู่ (ม็อบ) ถูกรักษาไว้.\n" +"ควรกำหนดค่านี้ร่วมกับ active_object_send_range_blocks." #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"การแสดงผลแบ็กเอนด์สำหรับ Irrlicht\n" -"จำเป็นต้องรีสตาร์ทหลังจากเปลี่ยนสิ่งนี้\n" -"หมายเหตุ: สำหรับ Android ให้ใช้ OGLES1 หากไม่แน่ใจ! แอปอาจไม่สามารถเริ่มต้นได้\n" -"สำหรับแพลตฟอร์มอื่น ๆ ขอแนะนำให้ใช้ OpenGL และเป็นไดรเวอร์เดียวที่มี\n" -"รองรับ shader ในขณะนี้" +"แบ็กเอนด์การเรนเดอร์.\n" +"จำเป็นต้องรีสตาร์ทหลังจากเปลี่ยนแปลงสิ่งนี้.\n" +"หมายเหตุ: บน Android ให้ใช้ OGLES1 หากไม่แน่ใจ! แอปอาจไม่สามารถเริ่มต้นได้.\n" +"บนแพลตฟอร์มอื่น แนะนำให้ใช้ OpenGL.\n" +"Shaders ได้รับการสนับสนุนโดย OpenGL (เดสก์ท็อปเท่านั้น) และ OGLES2 (ทดลอง)" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "ความไวของแกนจอยสติ๊กสำหรับการเลื่อน\n" "มุมมอง ingame frustum รอบ ๆ." @@ -6334,6 +7122,17 @@ 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 "" +"เวลา (เป็นวินาที) ที่คิวของเหลวอาจขยายเกินการประมวลผล.\n" +"ความจุจนกว่าจะพยายามลดขนาดโดยการดัมพ์คิวเก่า\n" +"รายการ ค่า 0 ปิดใช้งานฟังก์ชันการทำงาน." + +#: 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 "" +"งบประมาณเวลาที่อนุญาตให้ ABM ดำเนินการในแต่ละขั้นตอน\n" +"(เป็นส่วนหนึ่งของช่วง ABM)" #: src/settings_translation_file.cpp msgid "" @@ -6345,10 +7144,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." -msgstr "วินาทีเวลาใช้ระหว่างการซ้ำขวาเมื่อกดปุ่มเมาส์ขวา" +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." +msgstr "" +"เวลาเป็นวินาทีที่ใช้ระหว่างตำแหน่งโหนดที่เกิดซ้ำเมื่อกดค้างไว้\n" +"ปุ่มสถานที่" #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6360,10 +7160,13 @@ msgid "" "enabled. Also the vertical distance over which humidity drops by 10 if\n" "'altitude_dry' is enabled." msgstr "" +"ระยะทางแนวตั้งที่ความร้อนลดลง 20 หาก 'altitude_chill' คือ\n" +"เปิดใช้งาน ระยะทางแนวตั้งที่ความชื้นลดลง 10 ถ้า\n" +"'altitude_dry' เปิดใช้งานอยู่." #: src/settings_translation_file.cpp msgid "Third of 4 2D noises that together define hill/mountain range height." -msgstr "" +msgstr "เสียง 2D จำนวน 3 จาก 4 เสียงที่ร่วมกันกำหนดความสูงของช่วงเนินเขา/ภูเขา." #: src/settings_translation_file.cpp msgid "" @@ -6375,18 +7178,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Time of day when a new world is started, in millihours (0-23999)." -msgstr "" +msgstr "เวลาของวันที่เริ่มต้นโลกใหม่ หน่วยเป็นมิลลิชั่วโมง (0-23999)." #: src/settings_translation_file.cpp msgid "Time send interval" -msgstr "" +msgstr "ช่วงเวลาการส่ง" #: src/settings_translation_file.cpp msgid "Time speed" -msgstr "" +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 @@ -6412,23 +7216,35 @@ msgid "Touch screen threshold" msgstr "ขีด จำกัด หน้าจอสัมผัส" #: src/settings_translation_file.cpp -msgid "Trees noise" +#, 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 "เสียงต้นไม้" + #: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "การกรอง Trilinear" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "True = 256\n" "False = 128\n" "Usable to make minimap smoother on slower machines." msgstr "" -"True = 256\n" -"เท็จ = 128\n" -"ใช้เพื่อทำให้แผนที่ย่อเรียบขึ้นบนเครื่องที่ช้าลง" +"จริง (True) = 256\n" +"เท็จ (False) = 128\n" +"ใช้เพื่อทำให้แผนที่ย่อเรียบขึ้นบนเครื่องที่ช้าลง." #: src/settings_translation_file.cpp msgid "Trusted mods" @@ -6439,12 +7255,10 @@ msgid "URL to the server list displayed in the Multiplayer Tab." msgstr "URL ไปยังรายการเซิร์ฟเวอร์ที่แสดงในแท็บผู้เล่นหลายคน." #: src/settings_translation_file.cpp -#, fuzzy msgid "Undersampling" -msgstr "Undersampling" +msgstr "สุ่มตัวอย่าง" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Undersampling is similar to using a lower screen resolution, but it applies\n" "to the game world only, keeping the GUI intact.\n" @@ -6452,9 +7266,10 @@ msgid "" "image.\n" "Higher values result in a less detailed image." msgstr "" -"Undersampling คล้ายกับการใช้ความละเอียดหน้าจอต่ำกว่า แต่ใช้\n" -"สู่โลกของเกมเท่านั้นทำให้ GUI ยังคงสภาพเดิม\n" -"ควรเพิ่มประสิทธิภาพที่สำคัญด้วยต้นทุนของภาพที่มีรายละเอียดน้อยกว่า" +"การสุ่มตัวอย่างต่ำจะคล้ายกับการใช้ความละเอียดหน้าจอที่ต่ำกว่า แต่ใช้ได้\n" +"ให้กับโลกของเกมเท่านั้น โดยรักษา GUI ไว้เหมือนเดิม\n" +"ควรเพิ่มประสิทธิภาพอย่างมากโดยเสียภาพที่มีรายละเอียดน้อย\n" +"ค่าที่สูงขึ้นส่งผลให้ภาพมีรายละเอียดน้อยลง" #: src/settings_translation_file.cpp msgid "Unlimited player transfer distance" @@ -6462,15 +7277,15 @@ msgstr "ระยะถ่ายโอนผู้เล่นไม่ จำ #: src/settings_translation_file.cpp msgid "Unload unused server data" -msgstr "" +msgstr "ยกเลิกการโหลดข้อมูลเซิร์ฟเวอร์ที่ไม่ได้ใช้" #: src/settings_translation_file.cpp msgid "Upper Y limit of dungeons." -msgstr "" +msgstr "ขีด จำกัด Y บนของดันเจี้ยน." #: src/settings_translation_file.cpp msgid "Upper Y limit of floatlands." -msgstr "" +msgstr "ขีด จำกัด Y บนของทุ่นลอยน้ำ." #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6490,79 +7305,103 @@ msgstr "ใช้การกรอง bilinear เมื่อปรับข #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" -"ใช้การทำแผนที่ mip เพื่อปรับขนาดพื้นผิว อาจเพิ่มประสิทธิภาพเล็กน้อย\n" -"โดยเฉพาะอย่างยิ่งเมื่อใช้แพ็คพื้นผิวที่มีความละเอียดสูง\n" -"ไม่รองรับการลดขนาดแกมมาแกมมาที่ถูกต้อง" +"ใช้การทำแผนที่ mip เพื่อปรับขนาดพื้นผิว อาจเพิ่มประสิทธิภาพเล็กน้อย,\n" +"โดยเฉพาะอย่างยิ่งเมื่อใช้แพ็คพื้นผิวที่มีความละเอียดสูง.\n" +"ไม่รองรับการลดขนาดแกมมาแกมมาที่ถูกต้อง." + +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"ใช้การลบรอยหยักหลายตัวอย่าง (MSAA) เพื่อทำให้ขอบบล็อกเรียบ.\n" +"อัลกอริธึมนี้ทำให้วิวพอร์ต 3 มิติเรียบขึ้นในขณะที่รักษาความคมชัดของภาพ,\n" +"แต่ไม่ส่งผลต่อเนื้อใน\n" +"(ซึ่งเห็นได้ชัดเจนเป็นพิเศษกับพื้นผิวโปร่งใส).\n" +"ช่องว่างที่มองเห็นได้ปรากฏขึ้นระหว่างโหนดเมื่อปิดใช้ shaders.\n" +"หากตั้งค่าเป็น 0 MSAA จะถูกปิดใช้งาน.\n" +"จำเป็นต้องรีสตาร์ทหลังจากเปลี่ยนตัวเลือกนี้." #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." msgstr "ใช้การกรอง trilinear เมื่อปรับขนาดพื้นผิว" #: src/settings_translation_file.cpp -#, fuzzy +msgid "User Interfaces" +msgstr "" + +#: src/settings_translation_file.cpp msgid "VBO" msgstr "VBO" #: src/settings_translation_file.cpp -#, fuzzy msgid "VSync" -msgstr "VSync" +msgstr "VSync / การซิงโครไนซ์แนวตั้ง" #: src/settings_translation_file.cpp msgid "Valley depth" -msgstr "" +msgstr "ความลึกของหุบเขา" #: src/settings_translation_file.cpp msgid "Valley fill" -msgstr "" +msgstr "เติมหุบเขา" #: src/settings_translation_file.cpp msgid "Valley profile" -msgstr "" +msgstr "โปรไฟล์หุบเขา" #: src/settings_translation_file.cpp msgid "Valley slope" -msgstr "" +msgstr "ความลาดชันของหุบเขา" #: src/settings_translation_file.cpp msgid "Variation of biome filler depth." -msgstr "" +msgstr "การเปลี่ยนแปลงความลึกของสารเติมแต่งไบโอม." #: src/settings_translation_file.cpp msgid "Variation of maximum mountain height (in nodes)." -msgstr "" +msgstr "ความสูงของภูเขาสูงสุด (เป็นโหนด)." #: src/settings_translation_file.cpp msgid "Variation of number of caves." -msgstr "" +msgstr "ความหลากหลายของจำนวนถ้ำ." #: src/settings_translation_file.cpp msgid "" "Variation of terrain vertical scale.\n" "When noise is < -0.55 terrain is near-flat." msgstr "" +"การเปลี่ยนแปลงของมาตราส่วนแนวตั้งของภูมิประเทศ.\n" +"เมื่อเสียงรบกวน < -0.55 ภูมิประเทศใกล้จะราบเรียบ." #: src/settings_translation_file.cpp msgid "Varies depth of biome surface nodes." -msgstr "" +msgstr "ความลึกของโหนดพื้นผิวไบโอมแตกต่างกัน." #: src/settings_translation_file.cpp msgid "" "Varies roughness of terrain.\n" "Defines the 'persistence' value for terrain_base and terrain_alt noises." msgstr "" +"ความขรุขระของภูมิประเทศแตกต่างกันไป.\n" +"กำหนดค่า 'การคงอยู่' สำหรับเสียง terrain_base และ terrain_alt." #: src/settings_translation_file.cpp msgid "Varies steepness of cliffs." -msgstr "" +msgstr "ความชันของหน้าผาแตกต่างกันไป." #: src/settings_translation_file.cpp msgid "Vertical climbing speed, in nodes per second." -msgstr "" +msgstr "ความเร็วในการปีนแนวตั้ง เป็นโหนดต่อวินาที." #: src/settings_translation_file.cpp msgid "Vertical screen synchronization." @@ -6597,7 +7436,7 @@ msgid "Viewing range" msgstr "ดูช่วง" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "จอยสติกเสมือนเรียกใช้ปุ่ม aux" #: src/settings_translation_file.cpp @@ -6605,13 +7444,12 @@ msgid "Volume" msgstr "ปริมาณ" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" -"เปิดใช้งานการแมปการบดเคี้ยวของรัลแลกซ์\n" -"ต้องมี shaders เพื่อเปิดใช้งาน" +"เปิดใช้งานการแมปการบดเคี้ยวของรัลแลกซ์.\n" +"ต้องมี shaders เพื่อเปิดใช้งาน." #: src/settings_translation_file.cpp msgid "" @@ -6621,18 +7459,23 @@ msgid "" "Has no effect on 3D fractals.\n" "Range roughly -2 to 2." msgstr "" +"พิกัด W ของชิ้นส่วน 3D ที่สร้างขึ้นของเศษส่วน 4D.\n" +"กำหนดส่วน 3D ของรูปร่าง 4D ที่ถูกสร้างขึ้น.\n" +"เปลี่ยนรูปร่างของเศษส่วน.\n" +"ไม่มีผลกับแฟร็กทัล 3 มิติ.\n" +"ช่วงประมาณ -2 ถึง 2." #: src/settings_translation_file.cpp msgid "Walking and flying speed, in nodes per second." -msgstr "" +msgstr "ความเร็วในการเดินและบิน เป็นโหนดต่อวินาที." #: src/settings_translation_file.cpp msgid "Walking speed" -msgstr "" +msgstr "ความเร็วในการเดิน" #: src/settings_translation_file.cpp msgid "Walking, flying and climbing speed in fast mode, in nodes per second." -msgstr "" +msgstr "ความเร็วในการเดิน บิน และปีนเขาในโหมดเร็ว ในโหนดต่อวินาที." #: src/settings_translation_file.cpp msgid "Water level" @@ -6651,22 +7494,18 @@ msgid "Waving leaves" msgstr "โบกใบไม้" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" msgstr "โบกโหนด" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" msgstr "โบกน้ำสูง" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" msgstr "โบกความเร็วน้ำ" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" msgstr "โบกมือกันยาว" @@ -6674,6 +7513,10 @@ msgstr "โบกมือกันยาว" msgid "Waving plants" msgstr "โบกต้นไม้" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "สีของกล่องที่เลือก" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6702,35 +7545,31 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" -"เมื่อใช้ตัวกรอง bilinear / trilinear / anisotropic พื้นผิวที่มีความละเอียดต่ำ\n" -"สามารถเบลอดังนั้นจึงทำการอัปเกรดโดยอัตโนมัติกับเพื่อนบ้านที่ใกล้ที่สุด\n" +"เมื่อใช้ฟิลเตอร์ bilinear/trilinear/anisotropic พื้นผิวความละเอียดต่ำ\n" +"สามารถเบลอได้ดังนั้นจึงเพิ่มขนาดโดยอัตโนมัติกับเพื่อนบ้านที่ใกล้ที่สุด\n" "การแก้ไขเพื่อรักษาพิกเซลที่คมชัด กำหนดขนาดพื้นผิวขั้นต่ำ\n" -"สำหรับพื้นผิวที่ลดอัตราสเกล; ค่าที่สูงกว่าจะดูคมชัดขึ้น แต่ต้องการมากขึ้น\n" -"หน่วยความจำ แนะนำให้ใช้กำลัง 2 การตั้งค่านี้สูงกว่า 1 อาจไม่\n" -"มีผลที่มองเห็นได้เว้นแต่ว่าการกรอง bilinear / trilinear / anisotropic\n" -"เปิดการใช้งาน\n" -"สิ่งนี้ยังใช้เป็นขนาดพื้นผิวโหนดโหนดสำหรับการจัดตำแหน่งโลก\n" -"การหมุนอัตโนมัติของพื้นผิว" +"สำหรับพื้นผิวที่ยกระดับ; ค่าที่สูงกว่าจะดูคมชัดกว่าแต่ต้องการมากกว่า\n" +"หน่วยความจำ. แนะนำให้ใช้กำลัง 2 การตั้งค่านี้ใช้เฉพาะในกรณีที่\n" +"เปิดใช้งานการกรอง bilinear/trilinear/anisotropic\n" +"นอกจากนี้ยังใช้เป็นขนาดพื้นผิวของโหนดฐานสำหรับการจัดตำแหน่งโลก\n" +"การปรับขนาดพื้นผิวอัตโนมัติ" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"ไม่ว่าจะใช้ฟอนต์ FreeType ต้องมีการสนับสนุน FreeType เพื่อรวบรวม\n" -"หากปิดใช้งาน ฟอนต์บิตแมปและเอ็กซ์เอ็มแอลเวกเตอร์จะใช้แทน" +"ควรแสดงพื้นหลังแท็กชื่อโดยค่าเริ่มต้นหรือไม่.\n" +"Mods อาจยังคงตั้งค่าพื้นหลัง." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." -msgstr "" -"ระบุว่าควรสร้างการซิงโครไนซ์ภาพเคลื่อนไหวพื้นผิวของโหนดต่อแม็ปบล็อกหรือไม่" +msgstr "ระบุว่าควรสร้างการซิงโครไนซ์ภาพเคลื่อนไหวพื้นผิวของโหนดต่อแม็ปบล็อกหรือไม่" #: src/settings_translation_file.cpp msgid "" @@ -6763,6 +7602,19 @@ msgid "" "In-game, you can toggle the mute state with the mute key or by using the\n" "pause menu." msgstr "" +"ไม่ว่าจะปิดเสียง คุณสามารถเปิดเสียงได้ตลอดเวลา เว้นแต่\n" +"ระบบเสียงถูกปิดใช้งาน (enable_sound=false).\n" +"ในเกม คุณสามารถสลับสถานะปิดเสียงด้วยปุ่มปิดเสียงหรือโดยใช้ปุ่ม\n" +"เมนูหยุดชั่วคราว." + +#: 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 "" @@ -6770,8 +7622,8 @@ msgid "" msgstr "ไม่ว่าจะแสดงข้อมูลการแก้ปัญหาลูกค้า (มีผลเช่นเดียวกับการกดปุ่ม F5)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "องค์ประกอบความกว้างของขนาดหน้าต่างเริ่มต้น" +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "องค์ประกอบความกว้างของขนาดหน้าต่างเริ่มต้น." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -6796,7 +7648,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "World start time" -msgstr "" +msgstr "เวลาเริ่มต้นของโลก" #: src/settings_translation_file.cpp msgid "" @@ -6812,7 +7664,7 @@ msgstr "" "เทกซ์เจอร์แพ็คที่ออกแบบเป็นพิเศษ ด้วยตัวเลือกนี้ไคลเอนต์พยายาม\n" "เพื่อกำหนดขนาดโดยอัตโนมัติตามขนาดเทกซ์เจอร์\n" "ดูเพิ่มเติมที่ texture_min_size\n" -"คำเตือน: ตัวเลือกนี้เป็นการทดลอง" +"คำเตือน: ตัวเลือกนี้เป็นการทดลอง!" #: src/settings_translation_file.cpp msgid "World-aligned textures mode" @@ -6820,21 +7672,21 @@ msgstr "โหมดพื้นผิวที่จัดชิดโลก" #: src/settings_translation_file.cpp msgid "Y of flat ground." -msgstr "" +msgstr "Y ของพื้นเรียบ." #: src/settings_translation_file.cpp msgid "" "Y of mountain density gradient zero level. Used to shift mountains " "vertically." -msgstr "" +msgstr "Y ของระดับการไล่ระดับความหนาแน่นของภูเขาเป็นศูนย์ ใช้ในการเลื่อนภูเขาในแนวตั้ง." #: src/settings_translation_file.cpp msgid "Y of upper limit of large caves." -msgstr "" +msgstr "Y ของขอบบนของถ้ำขนาดใหญ่." #: src/settings_translation_file.cpp msgid "Y-distance over which caverns expand to full size." -msgstr "" +msgstr "ระยะ Y ซึ่งถ้ำจะขยายเป็นขนาดเต็ม." #: src/settings_translation_file.cpp msgid "" @@ -6843,80 +7695,62 @@ 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 "" +"ระยะ Y ที่พื้นที่ลอยน้ำลดลงจากความหนาแน่นเต็มที่จนไม่มีเลย.\n" +"การเรียวเริ่มที่ระยะนี้จากขีด จำกัด Y.\n" +"สำหรับชั้นทุ่นลอยน้ำที่เป็นของแข็ง สิ่งนี้จะควบคุมความสูงของเนินเขา/ภูเขา.\n" +"ต้องน้อยกว่าหรือเท่ากับครึ่งหนึ่งของระยะห่างระหว่างขีดจำกัด Y." #: src/settings_translation_file.cpp msgid "Y-level of average terrain surface." -msgstr "" +msgstr "ระดับ Y ของพื้นผิวภูมิประเทศโดยเฉลี่ย." #: src/settings_translation_file.cpp msgid "Y-level of cavern upper limit." -msgstr "" +msgstr "ระดับ Y ของขีดจำกัดบนของถ้ำ." #: src/settings_translation_file.cpp msgid "Y-level of higher terrain that creates cliffs." -msgstr "" +msgstr "ระดับ Y ของภูมิประเทศที่สูงขึ้นซึ่งทำให้เกิดหน้าผา." #: src/settings_translation_file.cpp msgid "Y-level of lower terrain and seabed." -msgstr "" +msgstr "ระดับ Y ของภูมิประเทศด้านล่างและก้นทะเล." #: src/settings_translation_file.cpp 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 "" +msgstr "ไฟล์ cURL หมดเวลาดาวน์โหลดไฟล์" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "cURL หมดเวลาโต้ตอบ" #: src/settings_translation_file.cpp msgid "cURL parallel limit" -msgstr "" +msgstr "cURL ขีด จำกัด ขนาน" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "-โหมดสร้างสรรค์: " -#~ msgid "Toggle Cinematic" -#~ msgstr "สลับโรงภาพยนตร์" +#~ msgid "- Damage: " +#~ msgstr "-ความเสียหาย: " -#~ msgid "Select Package File:" -#~ msgstr "เลือกแฟ้มแพคเกจ:" +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." +#~ msgstr "" +#~ "0 = การบดบังพารัลแลกซ์พร้อมข้อมูลความชัน (เร็วกว่า)\n" +#~ "1 = การทำแผนที่นูน (ช้ากว่าแม่นยำกว่า)" -#~ msgid "Waving Water" -#~ msgstr "น้ำโบก" - -#~ msgid "Waving water" -#~ msgstr "โบกน้ำ" - -#~ msgid "This font will be used for certain languages." -#~ msgstr "แบบอักษรนี้จะใช้สำหรับบางภาษา" - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "ความแข็งแรงของแสงโค้งกลาง - เพิ่ม" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "เส้นทางแบบอักษร." - -#~ msgid "Lightness sharpness" -#~ msgstr "ความคมชัดของแสง" - -#~ msgid "Gamma" -#~ msgstr "แกมมา" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "ตัวอักษรเงาอัลฟา (ความทึบระหว่าง 0 และ 255)." - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "เปิดใช้งานการจับคู่โทนภาพยนตร์" - -#~ msgid "Enable VBO" -#~ msgstr "ทำให้สามารถ VBO" - -#~ msgid "Darkness sharpness" -#~ msgstr "ความมืดมิด" - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "กึ่งกลางของเส้นโค้งแสง - กลางเพิ่ม" +#~ msgid "Address / Port" +#~ msgstr "ที่อยู่ / พอร์ต" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -6926,17 +7760,326 @@ msgstr "" #~ "ปรับการเข้ารหัสแกมม่าสำหรับตารางแสง ตัวเลขที่สูงกว่านั้นจะสว่างกว่า\n" #~ "การตั้งค่านี้มีไว้สำหรับไคลเอ็นต์เท่านั้นและเซิร์ฟเวอร์จะเพิกเฉย" -#~ msgid "Path to save screenshots at." -#~ msgstr "พา ธ เพื่อบันทึกภาพหน้าจอที่ ..." - -#~ msgid "Parallax occlusion strength" -#~ msgstr "กำลังบดเคี้ยวของ Parallax" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "ดาวน์โหลด และติดตั้ง $1 กรุณารอสักครู่..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "การตั้งค่าของคุณโลก singleplayer แน่ใจหรือไม่?" #~ msgid "Back" #~ msgstr "หลัง" +#~ msgid "Basic" +#~ msgstr "ขั้นพื้นฐาน" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "บิตต่อพิกเซล (ความลึกของสี aka) ในโหมดเต็มหน้าจอ." + +#~ msgid "Bump Mapping" +#~ msgstr "การแม็ป ชน" + +#, fuzzy +#~ msgid "Bumpmapping" +#~ msgstr "Bumpmapping" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "กึ่งกลางของเส้นโค้งแสง - กลางเพิ่ม" + +#~ msgid "Config mods" +#~ msgstr "กำหนดค่าวัยรุ่น" + +#~ msgid "Configure" +#~ msgstr "กำหนดค่า" + +#~ msgid "Connect" +#~ msgstr "เชื่อมต่อ" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "ควบคุมความเร็วการจมในของเหลว." + +#~ msgid "Credits" +#~ msgstr "เครดิต" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "สีของครอสแฮร์ (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "ความเสียหาย ที่เปิดใช้งาน" + +#~ msgid "Darkness sharpness" +#~ msgstr "ความมืดมิด" + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "กำหนดขั้นตอนการสุ่มตัวอย่างของพื้นผิว\n" +#~ "ค่าที่สูงกว่าจะทำให้แผนที่ปกติราบรื่นขึ้น" + +#~ msgid "Del. Favorite" +#~ 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 "Enable VBO" +#~ msgstr "ทำให้สามารถ VBO" + +#~ msgid "Enable register confirmation" +#~ msgstr "เปิดใช้งานการยืนยันการลงทะเบียน" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "เปิดใช้งานการแมป bump สำหรับพื้นผิว แผนที่ปกติจะต้องมีการจัดหาโดยแพ็คพื้นผิว\n" +#~ "หรือจำเป็นต้องสร้างขึ้นอัตโนมัติ\n" +#~ "ต้องมี shaders เพื่อเปิดใช้งาน" + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "เปิดใช้งานการจับคู่โทนภาพยนตร์" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "เปิดใช้งานการสร้างแผนที่ปกติแบบลอยตัว (เอฟเฟกต์นูน)\n" +#~ "ต้องมีการเปิดใช้งาน bumpmapping" + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "เปิดใช้งานการแมปการบดเคี้ยวของรัลแลกซ์\n" +#~ "ต้องมี shaders เพื่อเปิดใช้งาน" + +#~ msgid "Enter " +#~ msgstr "ป้อน " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "ตัวเลือกการทดลองอาจทำให้เกิดช่องว่างระหว่างบล็อก\n" +#~ "เมื่อตั้งค่าเป็นจำนวนที่สูงกว่า 0" + +#~ msgid "FPS in pause menu" +#~ msgstr "FPS ในเมนูหยุดชั่วคราว" + +#~ msgid "Fallback font shadow" +#~ msgstr "เงาแบบอักษรทางเลือก" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "เงาตัวอักษรทางเลือกอัลฟา" + +#~ msgid "Fallback font size" +#~ msgstr "ขนาดตัวอักษรทางเลือก" + +#~ msgid "Filtering" +#~ msgstr "กรอง" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "ตัวอักษรเงาอัลฟา (ความทึบระหว่าง 0 และ 255)." + +#~ msgid "FreeType fonts" +#~ msgstr "แบบอักษรประเภท FreeType" + +#~ msgid "Full screen BPP" +#~ msgstr "BPP เต็มหน้าจอ" + +#~ msgid "Game" +#~ msgstr "เกม" + +#~ msgid "Gamma" +#~ msgstr "แกมมา" + +#~ msgid "Generate Normal Maps" +#~ msgstr "สร้างแผนที่ปกติ" + +#~ msgid "Generate normalmaps" +#~ msgstr "สร้างแผนที่ปกติ" + +#~ msgid "HUD scale factor" +#~ msgstr "เครื่องชั่ง HUD" + +#~ 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 "Lightness sharpness" +#~ msgstr "ความคมชัดของแสง" + +#~ msgid "Main" +#~ msgstr "หลัก" + +#~ msgid "Menus" +#~ msgstr "เมนู" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "แผนที่ย่อในโหมดเรดาร์, ซูม x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "แผนที่ย่อในโหมดเรดาร์, ซูม x4" + +#, fuzzy +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "แผนที่ย่อในโหมด surface, ซูม x2" + +#, fuzzy +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "แผนที่ย่อในโหมด surface, ซูม x4" + +#~ msgid "Name / Password" +#~ msgstr "ชื่อ / รหัสผ่าน" + +#~ msgid "Name/Password" +#~ msgstr "ชื่อ/รหัสผ่าน" + +#~ msgid "No" +#~ msgstr "ไม่" + +#~ msgid "Normalmaps sampling" +#~ msgstr "การสุ่มตัวอย่าง Normalmaps" + +#~ msgid "Normalmaps strength" +#~ msgstr "Normalmaps แข็งแรง" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "จำนวนการวนซ้ำของการปิดกั้น parallax" + #~ msgid "Ok" #~ msgstr "ตกลง" + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "ความเอนเอียงโดยรวมของเอฟเฟ็กต์การบดเคี้ยวของ Parallax มักเป็นสเกล / 2" + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "ขนาดโดยรวมของผลการบดเคี้ยวของรัลแลกซ์" + +#, fuzzy +#~ msgid "Parallax Occlusion" +#~ msgstr "Parallax อุดตัน" + +#~ msgid "Parallax occlusion" +#~ msgstr "การบดเคี้ยวของ Parallax" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "อคติการบดเคี้ยวของ Parallax" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "การวนซ้ำของ Parallax" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "โหมดการบดเคี้ยวของ Parallax" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "ขนาดการบดเคี้ยวของ Parallax" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "กำลังบดเคี้ยวของ Parallax" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "เส้นทางแบบอักษร." + +#~ msgid "Path to save screenshots at." +#~ msgstr "พา ธ เพื่อบันทึกภาพหน้าจอที่ ..." + +#~ msgid "Player name" +#~ msgstr "ชื่อผู้เล่น" + +#~ msgid "Profiling" +#~ msgstr "โปรไฟล์" + +#~ msgid "PvP enabled" +#~ msgstr "PvP เปิดใช้งาน" + +#~ msgid "Reset singleplayer world" +#~ msgstr "รีเซ็ต singleplayer โลก" + +#~ msgid "Select Package File:" +#~ msgstr "เลือกแฟ้มแพคเกจ:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "เซิร์ฟเวอร์ / ผู้เล่นเดี่ยว" + +#, fuzzy +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "เงาแบบอักษรชดเชยถ้า 0 แล้วเงาจะไม่ถูกวาด." + +#~ msgid "Special" +#~ msgstr "พิเศษ" + +#~ msgid "Special key" +#~ msgstr "รหัสพิเศษ" + +#~ msgid "Start Singleplayer" +#~ msgstr "เริ่มเล่นเดี่ยว" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "ความแข็งแกร่งของแผนที่ปกติที่สร้างขึ้น" + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "ความแข็งแรงของแสงโค้งกลาง - เพิ่ม" + +#~ msgid "This font will be used for certain languages." +#~ msgstr "แบบอักษรนี้จะใช้สำหรับบางภาษา" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "การเปิดใช้งานต้องมีโปรแกรมควบคุม OpenGL ของ shaders ใช้." + +#~ msgid "Toggle Cinematic" +#~ msgstr "สลับโรงภาพยนตร์" + +#~ msgid "Waving Water" +#~ msgstr "น้ำโบก" + +#~ msgid "Waving water" +#~ msgstr "โบกน้ำ" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "ไม่ว่าจะใช้ฟอนต์ FreeType ต้องมีการสนับสนุน FreeType เพื่อรวบรวม\n" +#~ "หากปิดใช้งาน ฟอนต์บิตแมปและเอ็กซ์เอ็มแอลเวกเตอร์จะใช้แทน" + +#~ 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 "คุณตายแล้ว" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/tr/minetest.po b/po/tr/minetest.po index 5101b66fa..bc2b5a9b9 100644 --- a/po/tr/minetest.po +++ b/po/tr/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Turkish (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-15 22:41+0000\n" -"Last-Translator: monolifed <monolifed@protonmail.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-02-01 11:39+0000\n" +"Last-Translator: Metehan Özyürek <metehanc8s9@yandex.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/minetest/" "minetest/tr/>\n" "Language: tr\n" @@ -12,7 +12,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.1\n" +"X-Generator: Weblate 4.11-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Dış sohbet kuyruğunu temizle" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Boş komut." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Ana menüye çık" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Geçersiz komut: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Verilen komut: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Çevrim içi oyuncuları listele" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Çevrim içi oyuncular: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Dış sohbet kuyruğu artık boş." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Bu komut sunucu tarafından devre dışı bırakıldı." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +58,41 @@ msgstr "Yeniden Canlan" msgid "You died" msgstr "Öldün" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Kullanılabilir komutlar:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Kullanılabilir komutlar: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Komut kullanılamıyor: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Komutlar için yardım alın" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Daha fazla bilgi almak için '.help <komut>' veya her şeyi listelemek için '." +"help all' kullanın." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <komut>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "Tamam" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<mevcut değil>" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "Lua betiğinde bir hata oluştu:" @@ -46,9 +113,30 @@ msgstr "Bağlan" msgid "The server has requested a reconnect:" msgstr "Bu sunucu yeniden bağlanma isteğinde bulundu:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Yükleniyor..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Mod seçin" + +#: 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. " @@ -63,10 +151,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Bu sunucu $1 ve $2 arası tüm protokol sürümlerini destekler. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Açık sunucu listesini tekrar etkinleştirmeyi deneyin ve internet " -"bağlantınızı doğrulayın." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +162,26 @@ msgstr "Yalnızca $1 protokol sürümü desteklenmektedir." msgid "We support protocol versions between version $1 and $2." msgstr "Yalnızca $1 ve $2 arası protokol sürümleri desteklenmektedir." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "İptal" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Bağımlılıklar:" @@ -159,17 +254,57 @@ msgstr "Dünya:" msgid "enabled" msgstr "etkin" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" zaten var.Değiştirilsin mi?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$ 1 ve $ 2 destek dosyaları yüklenecek." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "$1 'e $2" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 indiriliyor,\n" +"$2 sırada" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "$1 indiriliyor..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 için destek dosyaları bulanamadı." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 indirilecek, ve $2 destek dosyaları atlanacak." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Tüm paketler" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Zaten kuruldu" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "Ana Menüye Dön" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Yerel oyun:" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "Minetest cURL'siz derlediğinde ContentDB kullanılamaz" +msgstr "Minetest cURL olmadan derlendiğinde ContentDB kullanılamaz" #: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." @@ -180,7 +315,6 @@ msgid "Failed to download $1" msgstr "$1 indirilemedi" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Oyunlar" @@ -189,7 +323,18 @@ msgid "Install" msgstr "Kur" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "$1 kur" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Eksik bağımlılıkları kur" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Kur: Desteklenmeyen dosya türü veya bozuk arşiv" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Modlar" @@ -202,9 +347,24 @@ msgid "No results" msgstr "Sonuç yok" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Ara" +msgid "No updates" +msgstr "Güncelleme yok" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Bulunamadı" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Üzerine yaz" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Lütfen asıl oyunun doğru olup olmadığını gözden geçirin." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Sıraya alındı" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -216,11 +376,15 @@ msgstr "Kaldır" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "Güncelle" +msgstr "Güncelleme" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Görüntüle" +msgid "Update All [$1]" +msgstr "Hepsini güncelle [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Tarayıcı'da daha fazla bilgi edinin" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -263,12 +427,9 @@ msgid "Decorations" msgstr "Dekorasyonlar" #: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "minetest.net'den , Minetest Game gibi, bir oyun indirin" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "minetest.net adresinden indirin" +#, fuzzy +msgid "Development Test is meant for developers." +msgstr "Uyarı : Geliştirici testi geliştiriciler içindir." #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -286,10 +447,6 @@ msgstr "Gökyüzünde yüzenkara kütleleri" msgid "Floatlands (experimental)" msgstr "Yüzenkaralar (deneysel)" -#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp -msgid "Game" -msgstr "Oyun" - #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" msgstr "Fraktal olmayan arazi üret: Okyanuslar ve yeraltı" @@ -306,6 +463,15 @@ msgstr "Nemli nehirler" msgid "Increases humidity around rivers" msgstr "Nehirler etrafındaki nemi artırır" +#: builtin/mainmenu/dlg_create_world.lua +#, fuzzy +msgid "Install a game" +msgstr "$1 kur" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "" + #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" msgstr "Göller" @@ -407,10 +573,6 @@ msgstr "Nehir derinliğini değiştir" msgid "Very large caverns deep in the underground" msgstr "Yerin derinliklerinde çok büyük oyuklar" -#: builtin/mainmenu/dlg_create_world.lua -msgid "Warning: The Development Test is meant for developers." -msgstr "Uyarı : Geliştirici testi geliştiriciler içindir." - #: builtin/mainmenu/dlg_create_world.lua msgid "World name" msgstr "Dünya adı" @@ -441,6 +603,39 @@ msgstr "pkgmgr: \"$1\" konumu geçersiz" msgid "Delete World \"$1\"?" msgstr "\"$1\" dünyasını sil?" +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Parolayı Doğrula" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Missing name" +msgstr "Mapgen adı" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Name" +msgstr "Ad" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Parola" + +#: builtin/mainmenu/dlg_register.lua +#, fuzzy +msgid "Passwords do not match" +msgstr "Parolalar eşleşmiyor!" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Register" +msgstr "Kaydol ve Katıl" + #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" msgstr "Kabul et" @@ -474,6 +669,16 @@ msgid "Browse" msgstr "Gözat" #: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Games" +msgstr "İçerik" + +#: builtin/mainmenu/dlg_settings_advanced.lua +#, fuzzy +msgid "Content: Mods" +msgstr "İçerik" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" msgstr "Devre dışı" @@ -498,7 +703,7 @@ msgid "Offset" msgstr "Kaydırma" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "Süreklilik" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -517,6 +722,10 @@ msgstr "Öntanımlıyı Geri Yükle" msgid "Scale" msgstr "Boyut" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Ara" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "Dizin seç" @@ -525,7 +734,7 @@ msgstr "Dizin seç" msgid "Select file" msgstr "Dosya seç" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" msgstr "Teknik adları göster" @@ -604,14 +813,6 @@ msgstr "Mod Kur: $1 için gerçek mod adı bulunamadı" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "Mod Kur:$1 mod paketi için uygun bir klasör adı bulunamadı" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Kur: Desteklenmeyen dosya türü \"$1\" veya bozuk arşiv" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Kur: dosya: \"$1\"" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "Geçerli bir mod veya mod paketi bulunamadı" @@ -632,6 +833,61 @@ msgstr "Bir mod bir $1 olarak kurulamadı" msgid "Unable to install a modpack as a $1" msgstr "Bir mod paketi bir $1 olarak kurulamadı" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Yükleniyor..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Herkese açık sunucu listesi devre dışı" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Herkese açık sunucu listesini tekrar etkinleştirmeyi deneyin ve internet " +"bağlantınızı gözden geçirin." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Hakkında" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Etkin Katkıda Bulunanlar" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Etkin işleyici:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Çekirdek Geliştiriciler" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Kullanıcı Veri Dizinini Aç" + +#: 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 "" +"Bir dosya yöneticisi / gezgininde kullanıcı tarafından sağlanan dünyaları,\n" +"oyunları, modları ve doku paketlerini içeren dizini açar." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Önceki Katkıda Bulunanlar" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Önceki Çekirdek Geliştiriciler" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Share debug log" +msgstr "Hata ayıklama bilgisini göster" + #: builtin/mainmenu/tab_content.lua msgid "Browse online content" msgstr "Çevrim içi içeriğe göz at" @@ -672,26 +928,6 @@ msgstr "Paketi Kaldır" msgid "Use Texture Pack" msgstr "Doku Paketleri Kullan" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Etkin Katkıda Bulunanlar" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Çekirdek Geliştiriciler" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Hakkında" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Önceki Katkıda Bulunanlar" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Önceki Çekirdek Geliştiriciler" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "Sunucuyu Duyur" @@ -701,14 +937,10 @@ msgid "Bind Address" msgstr "Bağlı Adres" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Yapılandır" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "Yaratıcı Kip" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "Hasar Etkin" @@ -724,10 +956,6 @@ msgstr "Sunucu Barındır" msgid "Install games from ContentDB" msgstr "ContentDB'den oyunlar yükle" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Ad/Şifre" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "Yeni" @@ -740,10 +968,14 @@ msgstr "Dünya seçilmedi ya da yaratılmadı!" msgid "Play Game" msgstr "Oyunu Oyna" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Port" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Mod seçin" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Dünya Seç:" @@ -757,45 +989,62 @@ msgid "Start Game" msgstr "Oyun Başlat" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Adres / Port" +msgid "Address" +msgstr "Adres" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Bağlan" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Temizle" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "Yaratıcı kip" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Hasar etkin" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Hasar / Savaş (PvP)" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Favoriyi Sil" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Sık Kullanılanlar" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Favori" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Uyumsuz Sunucular" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "Oyuna Katıl" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Ad / Şifre" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Savaş etkin" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Herkese Açık Sunucular" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Yenile" + +#: builtin/mainmenu/tab_online.lua +#, fuzzy +msgid "Remove favorite" +msgstr "Uzak port" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Sunucu Açıklaması" + +#: builtin/mainmenu/tab_settings.lua +msgid "(game support required)" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "2x" @@ -821,10 +1070,6 @@ msgstr "Tüm Ayarlar" msgid "Antialiasing:" msgstr "Düzgünleştirme:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Tek oyunculu dünyayı sıfırlamak istediğinizden emin misiniz ?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Ekran Boyutunu Hatırla" @@ -833,10 +1078,6 @@ msgstr "Ekran Boyutunu Hatırla" msgid "Bilinear Filter" msgstr "Bilineer Filtre" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Tümsek Eşleme" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "Tuşları değiştir" @@ -845,13 +1086,30 @@ msgstr "Tuşları değiştir" msgid "Connected Glass" msgstr "Bitişik Cam" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Dinamik gölgeler" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "Dinamik gölgeler: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Şık Yapraklar" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Normal Eşlemeleri Üret" +msgid "High" +msgstr "Yüksek" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Düşük" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Orta" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -861,10 +1119,6 @@ msgstr "Mip eşleme" msgid "Mipmap + Aniso. Filter" msgstr "Mip eşleme + Aniso. Filtre" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Hayır" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "Filtre yok" @@ -893,18 +1147,10 @@ msgstr "Opak Yapraklar" msgid "Opaque Water" msgstr "Opak Su" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Paralaks Oklüzyon" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Parçacıklar" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Tek oyunculu dünyayı sıfırla" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Ekran:" @@ -917,6 +1163,10 @@ msgstr "Ayarlar" msgid "Shaders" msgstr "Gölgelemeler" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Gölgelendirme (deneysel)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "Gölgelemeler (kullanılamaz)" @@ -933,22 +1183,28 @@ msgstr "Yumuşak Aydınlatma" msgid "Texturing:" msgstr "Doku:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "OpenGL sürücüleri seçilmeden gölgelemeler etkinleştirilemez." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Ton Eşleme" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "Dokunuş eşiği: (px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Trilineer Filtre" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "Çok Yüksek" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Çok Düşük" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Dalgalanan Yapraklar" @@ -961,23 +1217,12 @@ msgstr "Dalgalanan Sıvılar" msgid "Waving Plants" msgstr "Dalgalanan Bitkiler" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Evet" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Modları yapılandır" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Ana" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Tek oyunculu başlat" - #: src/client/client.cpp +#, fuzzy +msgid "Connection aborted (protocol error?)." +msgstr "Bağlantı hatası (zaman aşımı?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Bağlantı zaman aşımına uğradı." @@ -1006,8 +1251,8 @@ msgid "Connection error (timed out?)" msgstr "Bağlantı hatası (zaman aşımı?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Oyun bulunamıyor veya yüklenemiyor \"" +msgid "Could not find or load game: " +msgstr "Oyun bulunamadı veya yüklenemedi: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1031,24 +1276,12 @@ msgstr "Lütfen bir ad seçin!" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " -msgstr "Sağlanan şifre dosyası açılamadı: " +msgstr "Sağlanan parola dosyası açılamadı: " #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " msgstr "Belirtilen dünya konumu yok: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1061,14 +1294,6 @@ msgstr "" msgid "- Address: " msgstr "- Adres: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Yaratıcı Kip: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Hasar: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- Kip: " @@ -1079,17 +1304,26 @@ msgstr "- Port: " #: src/client/game.cpp msgid "- Public: " -msgstr "- Herkes: " +msgstr "- Herkese Açık: " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "- Savaş: " +msgstr "- Savaş (PvP): " #: src/client/game.cpp msgid "- Server Name: " msgstr "- Sunucu Adı: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Serileştirme hatası oluştu:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Erişim reddedildi. Neden: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Kendiliğinden ileri devre dışı" @@ -1098,6 +1332,22 @@ msgstr "Kendiliğinden ileri devre dışı" msgid "Automatic forward enabled" msgstr "Kendiliğinden ileri etkin" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Blok sınırları gizli" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Blok sınırları tüm bloklar için gösteriliyor" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Blok sınırları geçerli blok için gösteriliyor" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Blok sınırları yakındaki bloklar için gösteriliyor" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Kamera güncelleme devre dışı" @@ -1106,9 +1356,14 @@ msgstr "Kamera güncelleme devre dışı" msgid "Camera update enabled" msgstr "Kamera güncelleme etkin" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Blok sınırları gösterilemiyor ('basic_debug' ayrıcalığına ihtiyaç var)" + #: src/client/game.cpp msgid "Change Password" -msgstr "Şifre değiştir" +msgstr "Parola değiştir" #: src/client/game.cpp msgid "Cinematic mode disabled" @@ -1118,6 +1373,10 @@ msgstr "Sinematik kip devre dışı" msgid "Cinematic mode enabled" msgstr "Sinematik kip etkin" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "İstemci bağlantısı kesildi" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "İstemci tarafı betik devre dışı" @@ -1126,6 +1385,10 @@ msgstr "İstemci tarafı betik devre dışı" msgid "Connecting to server..." msgstr "Sunucuya bağlanılıyor..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Bilinmeyen bir nedenle bağlantı başarısız oldu" + #: src/client/game.cpp msgid "Continue" msgstr "Devam et" @@ -1138,13 +1401,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1154,15 +1417,20 @@ msgstr "" "- %s: sola hareket\n" "- %s: sağa hareket\n" "- %s: zıpla/tırman\n" +"- %s: kaz/vur\n" +"- %s: yerleştir/kullan\n" "- %s: sız/aşağı in\n" "- %s: ögeyi at\n" "- %s: envanter\n" "- Fare: dön/bak\n" -"- Sol fare: kaz/vur\n" -"- Sağ fare: yerleştir/kullan\n" "- Fare tekerleği: öge seç\n" "- %s: sohbet\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Adres çözümlenemedi: %s" + #: src/client/game.cpp msgid "Creating client..." msgstr "İstemci yaratılıyor..." @@ -1219,6 +1487,11 @@ msgstr "Sınırsız görüntüleme uzaklığı devre dışı" msgid "Enabled unlimited viewing range" msgstr "Sınırsız görüntüleme uzaklığı etkin" +#: src/client/game.cpp +#, fuzzy, c-format +msgid "Error creating client: %s" +msgstr "İstemci yaratılıyor..." + #: src/client/game.cpp msgid "Exit to Menu" msgstr "Menüye Çık" @@ -1292,32 +1565,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Mini harita şu anda, oyun veya mod tarafından devre dışı" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Mini harita gizli" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Radar kipinde mini harita, Yakınlaştırma x1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Radar kipinde mini harita, Yakınlaştırma x2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Radar kipinde mini harita, Yakınlaştırma x4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Yüzey kipinde mini harita, Yakınlaştırma x1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Yüzey kipinde mini harita, Yakınlaştırma x2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Yüzey kipinde mini harita, Yakınlaştırma x4" +msgid "Multiplayer" +msgstr "Çok oyunculu" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1391,6 +1640,21 @@ msgstr "Bu inşada ses sistemi desteklenmiyor" msgid "Sound unmuted" msgstr "Ses açık" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Sunucu muhtemelen farklı bir %s sürümü çalıştırıyor." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "IPv6 devre dışı bırakıldığı için %s bağlantısı kurulamıyor" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "IPv6 devre dışı bırakıldığından %s adresinde dinlenemiyor" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1460,10 +1724,6 @@ msgstr "Backspace" msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Temizle" - #: src/client/keycode.cpp msgid "Control" msgstr "CTRL" @@ -1711,36 +1971,39 @@ msgstr "X Düğme 2" msgid "Zoom" msgstr "Yakınlaştır" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Şifreler aynı değil!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Mini harita gizli" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Kaydol ve Katıl" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" -"Bu sunucuya \"%s\" adıyla ilk kez katılmak üzeresiniz.\n" -"Devam ederseniz, kimlik bilgilerinizi kullanarak yeni bir hesap bu sunucuda " -"oluşturulur.\n" -"Lütfen şifrenizi tekrar yazın ve hesap oluşturmayı onaylamak için 'Kayıt Ol " -"ve Katıl' düğmesini tıklayın veya iptal etmek için 'İptal'i tıklayın." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Radar kipinde mini harita, Yakınlaştırma x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Yüzey kipinde mini harita, Yakınlaştırma x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Doku kipinde mini harita" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Web sayfası açılamadı" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Web sayfası açılıyor" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "İlerle" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Özel\" = aşağı in" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = aşağı in" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1750,15 +2013,23 @@ msgstr "Kendiliğinden-ileri" msgid "Automatic jumping" msgstr "Kendiliğinden zıplama" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Geri" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Blok sınırları" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Kamera değiştir" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Sohbet" @@ -1811,8 +2082,8 @@ msgid "Key already in use" msgstr "Tuş zaten kullanımda" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "Tuş ayaları. (Eğer bu menü çalışmaz ise, minetest.conf 'tan kaldırın)" +msgid "Keybindings." +msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" @@ -1842,10 +2113,6 @@ msgstr "Ekran yakala" msgid "Sneak" msgstr "Sız" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Özel" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "HUD'ı aç/kapa" @@ -1886,17 +2153,17 @@ msgstr "tuşa bas" msgid "Change" msgstr "Değiştir" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Şifreyi Doğrulayın" - #: src/gui/guiPasswordChange.cpp msgid "New Password" -msgstr "Yeni Şifre" +msgstr "Yeni Parola" #: src/gui/guiPasswordChange.cpp msgid "Old Password" -msgstr "Eski Şifre" +msgstr "Eski Parola" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Parolalar eşleşmiyor!" #: src/gui/guiVolumeChange.cpp msgid "Exit" @@ -1907,14 +2174,9 @@ msgid "Muted" msgstr "Ses Kısık" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Ses Seviyesi: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Gir " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Ses Seviyesi: %%%d" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1923,6 +2185,16 @@ msgstr "Gir " msgid "LANG_CODE" msgstr "tr" +#: 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 "Lütfen bir ad seçin!" + #: src/settings_translation_file.cpp msgid "" "(Android) Fixes the position of virtual joystick.\n" @@ -1933,12 +2205,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) \"aux\" düğmesini tetiklemek için sanal joystick kullanın.\n" -"Etkinleştirilirse, sanal joystick, ana çemberin dışındayken \"aux\" " +"(Android) \"Aux1\" düğmesini tetiklemek için sanal joystick kullanın.\n" +"Etkinleştirilirse, sanal joystick, ana çemberin dışındayken \"Aux1\" " "düğmesini de dinler." #: src/settings_translation_file.cpp @@ -1979,14 +2251,6 @@ msgstr "" "Öntanımlı, bir ada için uygun olan bir dikey-basık şekil\n" "içindir, kaba şekil için 3 sayıyı da eşit ayarlayın." -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = eğim bilgili paralaks oklüzyon (daha hızlı).\n" -"1 = kabartma eşleme (daha yavaş, daha doğru)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "Sırt dağların şeklini/boyutunu denetleyen 2D gürültü." @@ -2093,6 +2357,10 @@ msgstr "" "- pageflip: quadbuffer tabanlı 3d.\n" "Unutmayın ki interlaced kipi, gölgelendirmelerin etkin olmasını gerektirir." +#: 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" @@ -2113,6 +2381,10 @@ msgstr "Sunucu kapatıldığında tüm istemcilere görüntülenecek bir ileti." msgid "ABM interval" msgstr "ABM aralığı" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "ABM zаman gideri" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "Emerge için sıralanmış blokların mutlak sınırı" @@ -2163,6 +2435,12 @@ msgstr "" "Ekranınızın (yalnızca Android/X11 olmayan) dpi yapılandırmasını ayarlayın " "ör: 4k ekranlar için." +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Kullanıcı arayüzü öğelerini ölçeklemek için kullanılan algılanan görüntü " +"yoğunluğunu ayarlayın." + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2178,6 +2456,11 @@ msgstr "" "Değer = 2.0 ('mgv7_np_floatland' de daha yüksek olabilir, emin olmak\n" "için her zaman test edin) katı yüzenkara katmanı yaratır." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "Öge adını ekle" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "Gelişmiş" @@ -2197,7 +2480,8 @@ msgstr "" "doğal gece ışığı üzerinde çok az etkisi vardır." #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "Daima uçma ve hızlı" #: src/settings_translation_file.cpp @@ -2277,6 +2561,10 @@ msgstr "" "iyileştirmeyi devre dışı kılar.\n" "Harita bloğu (16 nod) cinsinden." +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Kendiliğinden ileri tuşu" @@ -2297,6 +2585,14 @@ msgstr "Ekran boyutunu hatırla" msgid "Autoscaling mode" msgstr "Kendiliğinden boyutlandırma kipi" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1 tuşu" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Tırmanma/alçalma için Aux1 tuşu" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "Geri tuşu" @@ -2309,10 +2605,6 @@ msgstr "Taban yer seviyesi" msgid "Base terrain height." msgstr "Taban arazi yüksekliği." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "Temel" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Temel yetkiler" @@ -2334,21 +2626,22 @@ msgid "Bind address" msgstr "Bağlı adres" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +#, fuzzy +msgid "Biome API noise parameters" msgstr "Biyom API sıcaklık ve nem gürültü parametreleri" #: src/settings_translation_file.cpp msgid "Biome noise" msgstr "Biyom Gürültüsü" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "Tam ekran kipinde piksel başına bit (renk derinliği)." - #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "Blok gönderme iyileştirme uzaklığı" +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "" + #: src/settings_translation_file.cpp msgid "Bold and italic font path" msgstr "Kalın ve italik yazı tipi konumu" @@ -2374,8 +2667,9 @@ msgid "Builtin" msgstr "Yerleşik" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Tümsek eşleme" +#, fuzzy +msgid "Camera" +msgstr "Kamera değiştir" #: src/settings_translation_file.cpp msgid "" @@ -2456,19 +2750,12 @@ msgstr "" "0.0 minimum, 1.0 maksimum ışık seviyesidir." #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"Ana Menü arayüzünü değiştirir:\n" -"- Full: Çoklu tek oyunculu dünyalar, oyun seçimi, doku paketi seçici, " -"vb.\n" -"- Simple: Bir tek oyunculu dünya, oyun veya doku paketi seçiciler yok.\n" -"Küçük ekranlar için gerekli olabilir." +msgid "Chat command time message threshold" +msgstr "Sohbet komutu zaman iletisi eşiği" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Sohbet komutları" #: src/settings_translation_file.cpp msgid "Chat font size" @@ -2503,8 +2790,8 @@ msgid "Chat toggle key" msgstr "Sohbet açma/kapama tuşu" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Sohbet komutları" +msgid "Chat weblinks" +msgstr "Sohbet web bağlantıları" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2522,6 +2809,14 @@ msgstr "Sinematik kip tuşu" msgid "Clean transparent textures" msgstr "Saydam dokuları temizle" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"Sohbet konsolu çıktısında etkinleştirilen tıklanabilir (orta tıklama veya " +"Ctrl+sol tıklama) web bağlantıları." + #: src/settings_translation_file.cpp msgid "Client" msgstr "İstemci" @@ -2542,6 +2837,11 @@ msgstr "İstemci tarafı modlama kısıtlamaları" msgid "Client side node lookup range restriction" msgstr "İstemci tarafı nod arama aralığı kısıtlaması" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "İstemci modlama" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "Tırmanma hızı" @@ -2566,6 +2866,10 @@ msgstr "Ana menüde bulutlar" msgid "Colored fog" msgstr "Renkli sis" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Renkli gölgeler" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2605,6 +2909,31 @@ msgstr "" msgid "Command key" msgstr "Komut tuşu" +#: src/settings_translation_file.cpp +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 "" +"Harita kütlerini diske kaydederken kullanılacak sıkıştırma düzeyi.\n" +"-1 - öntanımlı sıkıştırma düzeyini kullan\n" +"0 - hiçbir sıkıştırma yok, en hızlı\n" +"9 - en iyi sıkıştırma, en yavaş" + +#: src/settings_translation_file.cpp +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 "" +"Harita kütlerini istemciye(client) gönderirken kullanılacak sıkıştırma " +"düzeyi.\n" +"-1 - öntanımlı sıkıştırma düzeyini kullan\n" +"0 - hiçbir sıkıştırma yok, en hızlı\n" +"9 - en iyi sıkıştırma, en yavaş" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "Bitişik cam" @@ -2629,10 +2958,19 @@ msgstr "Konsol rengi" msgid "Console height" msgstr "Konsol yüksekliği" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Content Repository" +msgstr "Çevrim İçi İçerik Deposu" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "ContentDB: Kara Liste" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB aşırı eşzamanlı indirmeler" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "ContentDB URL" @@ -2664,8 +3002,10 @@ msgstr "" "72 = 20dk, 360 = 4dk, 1 = 24saat, 0 = gündüz/gece/herşey değişmeden kalır." #: src/settings_translation_file.cpp -msgid "Controls sinking speed in liquid." -msgstr "Sıvıdaki batma hızını denetler." +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." @@ -2700,16 +3040,24 @@ msgid "Crosshair alpha" msgstr "Artı saydamlığı" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "Artı saydamlığı (solukluk, 0 ile 255 arasında)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"Artı saydamlığı (solukluk, 0 ile 255 arasında).\n" +"Ayrıca nesne artı rengi için de geçerlidir" #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "Artı rengi" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "Artı rengi (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"Artı rengi (R,G,B).\n" +"Ayrıca nesne artı rengini de değiştirir" #: src/settings_translation_file.cpp msgid "DPI" @@ -2732,12 +3080,12 @@ msgid "Debug log level" msgstr "Hata ayıklama günlük düzeyi" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "Ses alçaltma tuşu" +msgid "Debugging" +msgstr "" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "Harekete karşı sıvı direncini artırmak için bunu azaltın." +msgid "Dec. volume key" +msgstr "Ses alçaltma tuşu" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2761,7 +3109,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Default password" -msgstr "Öntanımlı şifre" +msgstr "Öntanımlı parola" #: src/settings_translation_file.cpp msgid "Default privileges" @@ -2777,11 +3125,14 @@ msgstr "Öntanımlı yığın boyutu" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"CURL için öntanımlı zaman aşımı, milisaniye cinsinden.\n" -"Yalnızca cURL ile derlenmiş ise bir etkisi vardır." +"Gölge filtreleme kalitesini tanımla.\n" +"Bu, bir PCF veya Poisson diski uygulayarak yumuşak gölge efektini taklit " +"eder,\n" +"ancak aynı zamanda daha fazla kaynak kullanır." #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2813,14 +3164,6 @@ msgstr "Geniş çaplı nehir kanal yapısını belirler." msgid "Defines location and terrain of optional hills and lakes." msgstr "İsteğe bağlı tepelerin ve göllerin konumunu ve arazisini belirler." -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"Dokuların örnekleme adımını tanımlar.\n" -"Yüksek bir değer daha yumuşak normal eşlemeler verir." - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "Taban yer seviyesini belirler." @@ -2901,6 +3244,15 @@ msgstr "" msgid "Desynchronize block animation" msgstr "Blok animasyonlarını eşzamansız yap" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Developer Options" +msgstr "Dekorasyonlar" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Kazma tuşu" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Kazı parçacıkları" @@ -2911,7 +3263,17 @@ msgstr "Hile önleme devre dışı" #: src/settings_translation_file.cpp msgid "Disallow empty passwords" -msgstr "Boş şifrelere izin verme" +msgstr "Boş parolalara izin verme" + +#: src/settings_translation_file.cpp +msgid "Display Density Scaling Factor" +msgstr "Ekran Yoğunluğu Ölçekleme Faktörü" + +#: 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." @@ -2961,18 +3323,41 @@ msgstr "" "İstemcide Lua modlama desteğini etkinleştir.\n" "Bu destek deneyseldir ve API değişebilir." +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"Poisson disk filtrelemeyi etkinleştir.\n" +"Doğru ise \"yumuşak gölgeler\" yapmak için Poisson diski kullanır. Değilse " +"PCF filtreleme kullanır." + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"Renkli gölgeleri etkinleştir.\n" +"Doğru ise yarı saydam düğümlerde renkli gölgeler oluşturur. Bu fazla kaynak " +"kullanır." + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "Konsol penceresini etkinleştir" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "Yeni yaratılan haritalar için yaratıcı kipi etkinleştir." +msgid "Enable creative mode for all players" +msgstr "Tüm oyuncular için yaratıcı kipi etkinleştir" #: src/settings_translation_file.cpp msgid "Enable joysticks" msgstr "Joystick'leri etkinleştir" +#: 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 "Mod kanalları desteğini etkinleştir." @@ -2989,18 +3374,6 @@ msgstr "Oyuncuların hasar almasını ve ölmesini etkinleştir." msgid "Enable random user input (only used for testing)." msgstr "Rastgele kullanıcı girişini etkinleştir (yalnızca test için)." -#: src/settings_translation_file.cpp -msgid "Enable register confirmation" -msgstr "Kayıt onayını etkinleştir" - -#: src/settings_translation_file.cpp -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" -"Sunucuya bağlanırken kayıt onayını etkinleştir.\n" -"Devre dışı bırakılırsa, yeni hesap kendiliğinden kaydedilir." - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" @@ -3009,6 +3382,10 @@ msgstr "" "Basit ortam oklüzyon ile yumuşak aydınlatmayı etkinleştirir.\n" "Farklı görünüm veya hız için devre dışı bırakın." +#: 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" @@ -3066,27 +3443,15 @@ msgid "" "enhanced, highlights and shadows are gradually compressed." msgstr "" "Hable'ın 'Uncharted 2' film ton eşlemesini etkinleştirir.\n" -"Fotoğrafsal film ton eğrisini simüle eder ve bu\n" +"Fotoğrafsal film ton eğrisini taklit eder ve bu\n" "yüksek dinamik aralıklı görüntülerin görünümü yakınlaştırır. Orta-aralık\n" -"kontrast biraz geliştirilir, vurgular ve gölgeler kademeli olarak " +"karşıtlık biraz geliştirilir, vurgular ve gölgeler kademeli olarak " "sıkıştırılır." #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." msgstr "Envanter ögelerinin animasyonunu etkinleştirir." -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"Tümsek eşlemeyi dokular için etkinleştirir. Normal eşlemelerin doku paketi " -"tarafından sağlanması\n" -"veya kendiliğinden üretilmesi gerekir\n" -"Gölgelemelerin etkin olmasını gerektirir." - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "Yüz yönü döndürülmüş kafeslerin önbelleklenmesini etkinleştirir." @@ -3095,22 +3460,6 @@ msgstr "Yüz yönü döndürülmüş kafeslerin önbelleklenmesini etkinleştiri msgid "Enables minimap." msgstr "Mini haritayı etkinleştirir." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"Çalışma anı dikey eşleme üretimini (kabartma efekti) etkinleştirir.\n" -"Tümsek eşlemenin etkin olmasını gerektirir." - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"Paralaks oklüzyon eşlemeyi etkinleştirir.\n" -"Gölgelemelerin etkin olmasını gerektirir." - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3123,6 +3472,17 @@ msgstr "" "ses denetimlerinin işlevi olmaz.\n" "Bu ayarı değiştirmek, yeniden başlatma gerektirir." +#: 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 "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "Vadi profili" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "Motor profilleme veri yazdırma aralığı" @@ -3131,14 +3491,6 @@ msgstr "Motor profilleme veri yazdırma aralığı" msgid "Entity methods" msgstr "Varlık yöntemleri" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"Deneysel seçenek, 0'dan daha büyük bir sayıya ayarlandığında\n" -"bloklar arasında görünür boşluklara neden olabilir." - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3157,8 +3509,12 @@ msgstr "" "seviyesi oluşturur: katı bir yüzenkara katmanı için uygundur." #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "Duraklat menüsünde FPS" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "Odaklanmadığında veya duraklatıldığında FPS" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3176,18 +3532,6 @@ msgstr "Düşme sallanması çarpanı" msgid "Fallback font path" msgstr "Yedek yazı tipi konumu" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "Geri dönüş yazı tipi gölgesi" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "Geri dönüş yazı tipi gölge saydamlığı" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "Geri dönüş yazı tipi boyutu" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "Hızlı tuşu" @@ -3206,10 +3550,10 @@ msgstr "Hızlı hareket" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"Hızlı hareket (\"özel\" tuşu ile).\n" +"Hızlı hareket (\"Aux1\" tuşu ile).\n" "Bu, sunucu üzerinde \"hızlı\" yetkisi gerektirir." #: src/settings_translation_file.cpp @@ -3226,8 +3570,8 @@ msgid "" "the\n" "Multiplayer Tab." msgstr "" -"İstemci/sunucu listesi/ içinde Multiplayer Sekmesinde görüntülenen\n" -"favori sunucularızı içeren dosya." +"Çok Oyunculu Sekmesinde görüntülenen sık kullanılan sunucularızı içeren\n" +"istemci/sunucu listesi/ içindeki dosya." #: src/settings_translation_file.cpp msgid "Filler depth" @@ -3244,20 +3588,22 @@ msgstr "Filmsel ton eşleme" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "Filtrelenmiş dokular, genellikle PNG iyileştiricilerin dikkate almadığı, " "tamamen\n" "şeffaf komşuları ile RGB değerlerini kaynaştırabilir, bazen şeffaf " "dokularda\n" "karanlık veya aydınlık kenarlara neden olabilir. Bunu temizlemek için bu\n" -"filtreyi doku yükleme zamanında uygulayın." +"filtreyi doku yükleme zamanında uygulayın. Bu, mip eşleme etkinleştirilirse\n" +"otomatik olarak etkinleştirilir." #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Filtreleme" +#, fuzzy +msgid "Filtering and Antialiasing" +msgstr "Düzgünleştirme:" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3323,6 +3669,11 @@ msgstr "Sis başlangıcı" msgid "Fog toggle key" msgstr "Sis açma/kapama tuşu" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font" +msgstr "Yazı tipi boyutu" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "Öntanımlı kalın yazı tipi" @@ -3344,15 +3695,17 @@ msgid "Font size" msgstr "Yazı tipi boyutu" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "Öntanımlı yazı tipinin nokta (pt) olarak boyutu." #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "Yedek yazı tipinin nokta (pt) olarak boyutu." - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +#, fuzzy +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "Eş aralıklı yazı tipinin nokta (pt) olarak boyutu." #: src/settings_translation_file.cpp @@ -3360,10 +3713,21 @@ msgid "" "Font size of the recent chat text and chat prompt in point (pt).\n" "Value 0 will use the default font size." msgstr "" -"Son sohbet metninin ve sohbet isteminin nokta(pt) cinsinden yazı tipi boyutu." -"\n" +"Son sohbet metninin ve sohbet isteminin nokta(pt) cinsinden yazı tipi " +"boyutu.\n" "0 değer öntanımlı yazı tipi boyutunu kullanır." +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3426,10 +3790,6 @@ msgstr "Fraktal türü" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "Sisin işlenmeye başlayacağı görünebilir uzaklığın kesiri" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "Freetype yazı tipleri" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3464,10 +3824,6 @@ msgstr "" msgid "Full screen" msgstr "Tam ekran" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "Tam ekran BPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Tam ekran kipi." @@ -3485,18 +3841,28 @@ msgid "GUI scaling filter txr2img" msgstr "Arayüz boyutlandırma filtresi txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Normal eşlemeleri üret" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Oyunlar" + +#: src/settings_translation_file.cpp +msgid "General" +msgstr "" #: src/settings_translation_file.cpp msgid "Global callbacks" msgstr "Genel geri çağrılar" #: 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 junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "Genel harita üretim özellikleri.\n" "Mapgen v6'da 'decorations' bayrağı ağaçlar ve cangıl çimi hariç tüm " @@ -3508,21 +3874,31 @@ msgid "" "Gradient of light curve at maximum light level.\n" "Controls the contrast of the highest light levels." msgstr "" -"Maksimum ışık seviyesinde ışık eğrisinin gradyantı.\n" -"En yüksek ışık düzeylerinin kontrastını denetler." +"Azami ışık seviyesinde ışık eğrisinin gradyantı.\n" +"En yüksek ışık düzeylerinin karşıtlığını denetler." #: src/settings_translation_file.cpp msgid "" "Gradient of light curve at minimum light level.\n" "Controls the contrast of the lowest light levels." msgstr "" -"Minimum ışık seviyesinde ışık eğrisinin gradyantı.\n" -"En düşük ışık düzeylerinin kontrastını kontrol eder." +"Asgari ışık seviyesinde ışık eğrisinin gradyantı.\n" +"En düşük ışık düzeylerinin karşıtlığını denetler." #: src/settings_translation_file.cpp 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 "Yerçekimi" @@ -3540,8 +3916,13 @@ msgid "HTTP mods" msgstr "HTTP modları" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "HUD boyut çarpanı" +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "Arayüz boyutlandırma" #: src/settings_translation_file.cpp msgid "HUD toggle key" @@ -3550,15 +3931,15 @@ msgstr "HUD açma/kapama tuşu" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" -"Kullanım dışı lua API çağrılarının ele alınması:\n" -"- legacy: (eski) Eski davranış taklit etmeye çalışır (öntanımlı).\n" -"- log: (günlük) kullanım dışı çağrıları taklit eder ve günlükler (hata " -"ayıklama için öntanımlı).\n" -"- error: (hata) kullanım dışı çağrıların kullanımını iptal eder (mod " +"Kullanım dışı Lua API çağrılarının ele alınması:\n" +"- none: (yok) kullanım dışı çağrıları günlüğe kaydetmez.\n" +"- log: (günlük) kullanım dışı çağrıları taklit eder ve geri izlemesini " +"günlüğe kaydeder (öntanımlı).\n" +"- error: (hata) kullanım dışı çağrılar kullanıldığında iptal eder (mod " "geliştiricileri için önerilen)." #: src/settings_translation_file.cpp @@ -3583,8 +3964,10 @@ msgid "Heat noise" msgstr "Isı gürültüsü" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "İlk pencere boyutunun yükseklik bileşeni." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"İlk pencere boyutunun yükseklik bileşeni. Tam ekran kipinde yok sayılır." #: src/settings_translation_file.cpp msgid "Height noise" @@ -3594,10 +3977,6 @@ msgstr "Yükseklik gürültüsü" msgid "Height select noise" msgstr "Yükseklik seçme gürültüsü" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "Yüksek hassasiyetli FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "Tepe dikliği" @@ -3802,14 +4181,23 @@ msgstr "" "Dalgalanan sıvılar etkin kılınmalıdır." #: 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 "" "Sunucunun kullanılmayan harita bloklarını boşaltmadan önce ne kadar " "bekleyeceği.\n" "Daha yüksek değer daha düzgün olsa da daha çok RAM kullanır." +#: 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 "Harekete karşı sıvı direncini artırmak için bunu azaltın." + #: src/settings_translation_file.cpp msgid "How wide to make rivers." msgstr "Nehirlerin ne kadar geniş yapılacağı." @@ -3844,11 +4232,10 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" -"Devre dışı bırakılırsa \"özel\" tuşu, hem uçma hem de hızlı kipi etkin ise,\n" +"Devre dışı bırakılırsa \"Aux1\" tuşu, hem uçma hem de hızlı kipi etkin ise,\n" "hızlı uçma için kullanılır." #: src/settings_translation_file.cpp @@ -3876,14 +4263,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"Etkinleştirilirse, \"sızma\" tuşu yerine \"özel\" tuşu aşağı inme ve " +"Etkinleştirilirse, \"sızma\" tuşu yerine \"Aux1\" tuşu aşağı inme ve " "alçalma\n" "için kullanılır." +#: 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 "" +"Sunucuya bağlanırken kayıt onayını etkinleştir.\n" +"Devre dışı bırakılırsa, yeni hesap kendiliğinden kaydedilir." + #: src/settings_translation_file.cpp msgid "" "If enabled, actions are recorded for rollback.\n" @@ -3894,7 +4290,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "If enabled, disable cheat prevention in multiplayer." -msgstr "Etkinleştirilirse, multiplayer'da hile önleme devre dışı bırakılır." +msgstr "Etkinleştirilirse, çok oyunculuda hile önleme devre dışı bırakılır." #: src/settings_translation_file.cpp msgid "" @@ -3913,8 +4309,11 @@ msgstr "" "göre değiştirir." #: src/settings_translation_file.cpp -msgid "If enabled, new players cannot join with an empty password." -msgstr "Etkinleştirilirse, yeni oyuncular boş bir şifre ile katılamaz." +#, fuzzy +msgid "" +"If enabled, players cannot join without a password or change theirs to an " +"empty password." +msgstr "Etkinleştirilirse, yeni oyuncular boş bir parola ile katılamaz." #: src/settings_translation_file.cpp msgid "" @@ -3935,6 +4334,15 @@ msgstr "" "Nod uzaklığı için CSM sınırlaması etkinse, get_node çağrıları noddan\n" "oyuncuya olan bu uzaklığa sınırlanır." +#: 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 "" +"Bir sohbet komutunun yürütülmesi, saniye cinsinden bu belirtilen süreden " +"daha\n" +"uzun sürerse, zaman bilgisini sohbet komut iletisine ekle" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3956,10 +4364,6 @@ msgstr "" msgid "Ignore world errors" msgstr "Dünya hatalarını yok say" -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "Oyun içi" - #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." msgstr "" @@ -3990,7 +4394,8 @@ msgstr "" "Genellikle bu yalnızca çekirdek/yerleşik katkıda bulunanlar için gereklidir" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "Kayıt sırasında sohbet komutlarını belgele." #: src/settings_translation_file.cpp @@ -4017,16 +4422,13 @@ msgstr "" msgid "Instrument the methods of entities on registration." msgstr "Kayıt sırasında varlık yöntemlerini belgele." -#: src/settings_translation_file.cpp -msgid "Instrumentation" -msgstr "Belgeleme" - #: src/settings_translation_file.cpp msgid "Interval of saving important changes in the world, stated in seconds." msgstr "Dünyadaki önemli değişiklikleri kaydetme aralığı, saniye cinsinden." #: 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 "Günün saatini istemcilere gönderme aralığı." #: src/settings_translation_file.cpp @@ -4081,6 +4483,10 @@ msgstr "Joystick ID" msgid "Joystick button repetition interval" msgstr "Joystick düğmesi tekrarlama aralığı" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "Joystick ölü bölgesi" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "Joystick frustum duyarlılığı" @@ -4183,6 +4589,16 @@ msgstr "" "Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Kazma tuşu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4325,6 +4741,16 @@ msgstr "" "Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Yerleştirme tuşu.\n" +"Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4859,6 +5285,10 @@ msgstr "" "Bakın: http://irrlicht.sourceforge.net/docu/namespaceirr." "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 saniyede bir X iletiden çok gönderen oyuncuları at." @@ -4916,10 +5346,11 @@ msgid "Left key" msgstr "Sol tuş" #: 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 "" "Sunucunun tık uzunluğu ve nesnelerin genellikle ağ üzerinden güncelleneceği\n" "aralık." @@ -4933,18 +5364,25 @@ msgstr "" "Dalgalanan sıvılar etkin kılınmalı." #: 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 "Etkin Blok Değiştirici (ABM) yürütme döngüleri arasındaki süre" #: 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 "NodeTimer yürütme döngüleri arasındaki sürenin uzunluğunu" #: 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 "Etkin blok yönetimi döngüleri arasındaki süre" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- <nothing> (no logging)\n" @@ -4953,7 +5391,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "debug.txt'e yazılacak günlük düzeyi:\n" "- <nothing> (günlük yok)\n" @@ -4988,6 +5427,11 @@ msgstr "Işık eğrisi yüksek gradyan" msgid "Light curve low gradient" msgstr "Işık eğrisi düşük gradyan" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Yumuşak Aydınlatma" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -5070,10 +5514,6 @@ msgstr "Yüzenkaraların alt Y sınırı." msgid "Main menu script" msgstr "Ana menü betiği" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Ana menü stili" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." @@ -5081,16 +5521,18 @@ msgstr "" "Sis ve gökyüzü renklerini gün saatine (şafak/günbatımı) ve bakış yönüne " "bağlı değiştir." -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" -"DirectX'in LuaJIT ile çalışmasını sağlar. Sorunlara neden olursa devre dışı " -"bırakın." - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "Tüm sıvıları opak yapar" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "Hafıza deposu için harita sıkıştırma düzeyi" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "Ağ aktarma hızı için harita sıkıştırma düzeyi" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "Harita dizini" @@ -5170,6 +5612,11 @@ msgstr "Harita üretim sınırı" msgid "Map save interval" msgstr "Harita kaydetme aralığı" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "Harita güncelleme zamanı" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "Harita bloğu sınırı" @@ -5275,8 +5722,12 @@ msgid "Maximum FPS" msgstr "Maksimum FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "Oyun duraklatıldığında maksimum FPS." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "Pencere odaklanmadığında veya oyun duraklatıldığında en yüksek FPS." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "Gölgeleri işlemek için azami mesafe." #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5332,6 +5783,16 @@ msgstr "" "Bir dosyadan yüklenmesi için sıraya koyulacak maksimum blok sayısı.\n" "Bu sınır her oyuncu için zorunlu kılınır." +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"En yüksek eşzamanlı indirme sayısı.Bu sınırı aşan indirmeler sıraya " +"alınacaktır.\n" +"Bu curl_parallel_limit den daha az olmalıdır." + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "Zorla yüklenen harita bloklarının maksimum sayısı." @@ -5396,19 +5857,25 @@ msgstr "" "Kuyruğa almayı kapamak için 0 ve sınırsız kuyruk boyutu için -1." #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "" -"Bir dosya indirmesinin ms cinsinden alabileceği maksimum zaman (ör: mod " -"indirme)." +"Bir dosya indirmesinin (ör: mod indirme) alabileceği azami süre, milisaniye " +"cinsinden belirtilir." + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" +"Etkileşimli bir isteğin (ör: sunucu listesi getirme) alabileceği azami süre, " +"milisaniye cinsinden belirtilir." #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "Maksimum kullanıcı" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Menüler" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "Kafes önbelleği" @@ -5457,13 +5924,27 @@ msgstr "Minimum doku boyutu" msgid "Mipmapping" msgstr "Mip eşleme" +#: src/settings_translation_file.cpp +msgid "Misc" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Mod Profiler" +msgstr "Profilci" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Mod Security" +msgstr "Güvenlik" + #: src/settings_translation_file.cpp msgid "Mod channels" msgstr "Mod kanalları" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "Hudbar öğelerinin boyutunu değiştirir." +msgid "Modifies the size of the HUD elements." +msgstr "HUD ögelerinin boyutunu değiştirir." #: src/settings_translation_file.cpp msgid "Monospace font path" @@ -5473,6 +5954,11 @@ msgstr "Eş aralıklı yazı tipi konumu" msgid "Monospace font size" msgstr "Eş aralıklı yazı tipi boyutu" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "Eş aralıklı yazı tipi boyutu" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "Dağ yükseklik gürültüsü" @@ -5549,10 +6035,6 @@ msgstr "" msgid "Near plane" msgstr "Yakın kırpma düzlemi" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "Ağ" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5561,9 +6043,14 @@ msgstr "" "Dinlenecek ağ portu (UDP).\n" "Bu değer ana menüden başlatırken geçersiz kılınır." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "Ağ" + #: src/settings_translation_file.cpp msgid "New users need to input this password." -msgstr "Yeni kullanıcıların bu şifreyi girmesi gerekir." +msgstr "Yeni kullanıcıların bu parolayı girmesi gerekir." #: src/settings_translation_file.cpp msgid "Noclip" @@ -5573,6 +6060,11 @@ msgstr "Hayalet" msgid "Noclip key" msgstr "Hayalet tuşu" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Nod Vurgulama" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "Nod vurgulama" @@ -5585,14 +6077,6 @@ msgstr "NodeTimer aralığı" msgid "Noises" msgstr "Gürültüler" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "Normal eşleme örnekleme" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "Normal eşleme gücü" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "Emerge iş sayısı" @@ -5623,23 +6107,16 @@ msgstr "" "Birçok kullanıcı için en iyi ayar '1' olabilir." #: 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "/clearobjects tarafında tek seferde yüklenebilecek ek blokların sayısı.\n" "Bu sqlite işlem yükü ve bellek tüketimi (4096=100MB)\n" "arasında bir dengedir." -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "Paralaks oklüzyon yineleme sayısı." - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "Çevrimiçi İçerik Deposu" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "Opak sıvılar" @@ -5651,12 +6128,6 @@ msgstr "" "0 ile 255 arasında öntanımlı yazı tipinin arkasındaki gölgenin opaklığı " "(alfa)." -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" -"0 ile 255 arasında yedek yazı tipinin arkasındaki gölgenin opaklığı (alfa)." - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5667,38 +6138,13 @@ msgstr "" "duraklamaz." #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "Paralaks oklüzyon efektinin genel sapması, genellikle boyut/2." - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "Paralaks oklüzyon efektinin genel boyutu." - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Paralaks oklüzyon" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "Paralaks oklüzyon sapması" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "Paralaks oklüzyon yinelemesi" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "Paralaks oklüzyon kipi" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Paralaks oklüzyon boyutu" +msgid "Optional override for chat weblink color." +msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5729,10 +6175,9 @@ msgid "Path to texture directory. All textures are first searched from here." msgstr "Doku dizini konumu. Tüm dokular ilk burada aranır." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" "Öntanımlı yazı tipi konumu.\n" @@ -5741,10 +6186,9 @@ msgstr "" "Yazı tipi yüklenemiyorsa yedek yazı tipi kullanılır." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" "Eş aralıklı yazı tipi konumu.\n" @@ -5776,6 +6220,14 @@ msgstr "Eğim hareket tuşu" msgid "Pitch move mode" msgstr "Eğim hareket kipi" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Yerleştirme tuşu" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "Yerleştirme tekrarlama aralığı" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5784,10 +6236,6 @@ msgstr "" "Oyuncu yerçekimi tarafından etkilenmeden uçabilir.\n" "Bu, sunucuda \"uçma\" yetkisi gerektirir." -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "Oyuncu adı" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "Oyuncu transfer uzaklığı" @@ -5796,6 +6244,10 @@ msgstr "Oyuncu transfer uzaklığı" msgid "Player versus player" msgstr "Oyuncu oyuncuya karşı" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Poisson filtreleme" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5838,20 +6290,17 @@ msgstr "Profilci" msgid "Profiler toggle key" msgstr "Profilciyi açma/kapama tuşu" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "Profilleme" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "Prometheus dinleyici adresi" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" "Prometheus dinleyici adresi.\n" "Minetest ENABLE_PROMETHEUS seçeneği etkin olarak derlenmişse,\n" @@ -5960,10 +6409,6 @@ msgstr "Sırt dağ boyut gürültüsü" msgid "Right key" msgstr "Sağ tuş" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "Sağ tık tekrarlama aralığı" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "Nehir kanal derinliği" @@ -6038,6 +6483,11 @@ msgstr "" "pikselleri kaynaştırır, görüntüler tam sayı olmayan boyutlarla\n" "ölçeklendiğinde bazı kenar piksellerde bulanıklığa neden olur." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Ekran:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Ekran yüksekliği" @@ -6068,6 +6518,11 @@ msgstr "" "1 en kötü kalite; 100 en iyi kalite.\n" "Öntanımlı kalite için 0 kullanın." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Ekran yakala" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "Deniz yatağı gürültüsü" @@ -6081,10 +6536,6 @@ msgstr "" msgid "Second of two 3D noises that together define tunnels." msgstr "Birlikte tünelleri belirleyen iki 3D gürültüden ikincisi." -#: src/settings_translation_file.cpp -msgid "Security" -msgstr "Güvenlik" - #: src/settings_translation_file.cpp msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgstr "Bakın: https://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6144,8 +6595,19 @@ msgstr "" "18 = 4D \"Mandelbulb\" Julia seti." #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Sunucu / Tek oyunculu" +#, fuzzy +msgid "Server" +msgstr "Sunucu URL'si" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "Sunucu adı" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Sunucu Açıklaması" #: src/settings_translation_file.cpp msgid "Server URL" @@ -6171,10 +6633,20 @@ msgstr "Sunucu portu" msgid "Server side occlusion culling" msgstr "Sunucu tarafı oklüzyon ayırma" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Sunucu Portu" + #: src/settings_translation_file.cpp msgid "Serverlist URL" msgstr "Sunucu liste URL'si" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Serverlist and MOTD" +msgstr "Sunucu liste URL'si" + #: src/settings_translation_file.cpp msgid "Serverlist file" msgstr "Sunucu liste dosyası" @@ -6188,11 +6660,55 @@ msgstr "" "Bunu değiştirdikten sonra yeniden başlatmak gerekir." #: 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 "" "İstemcilerin gönderdiği sohbet iletilerinin maksimum karakter uzunluğunu " "ayarla." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"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 "" +"Gölge gücünü ayarla.\n" +"Daha düşük değer daha açık gölgeler, daha yüksek değer daha koyu gölgeler " +"anlamına gelir." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"Yumuşak gölge yarıçapı boyutunu ayarla.\n" +"Daha düşük değerler daha keskin, daha büyük değerler daha yumuşak gölgeler " +"anlamına gelir.\n" +"En düşük değer 1.0 ve en yüksek değer 10.0" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"Güneş/Ay yörüngesinin eğimini derece olarak ayarla\n" +"0 değeri, eğim / dikey yörünge olmadığı anlamına gelir.\n" +"En düşük değer 0.0 ve en yüksek değer 60.0" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"Gölge Eşlemeyi etkinleştirmek için doğru olarak ayarlayın.\n" +"Gölgelemelerin etkinleştirilmesini gerektirir." + #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving leaves.\n" @@ -6217,6 +6733,16 @@ msgstr "" "Dalgalanan bitkiler için doğru'ya ayarlayın.\n" "Gölgelemeler etkin kılınmalıdır." +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"Gölge dokusu kalitesini 32 bit olarak ayarlar.\n" +"Yanlış ise 16 bit doku kullanılacaktır.\n" +"Bu, gölgede çok daha fazla bozulmalara neden olabilir." + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Gölgeleme konumu" @@ -6233,6 +6759,22 @@ msgstr "" "artırabilir.\n" "Bu yalnızca OpenGL video arka ucu ile çalışır." +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "Gölge filtresi kalitesi" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "Gölgeleri işlemek için nodlardaki gölge eşleme azami mesafesi" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "32 bitte gölge eşleme dokusu" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "Gölge eşleme dokusu boyutu" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6241,11 +6783,9 @@ msgstr "" "Öntanımlı yazı tipinin gölge uzaklığı (piksel olarak). 0 ise, gölge çizilmez." #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "" -"Yedek yazı tipinin gölge uzaklığı (piksel olarak). 0 ise, gölge çizilmez." +#, fuzzy +msgid "Shadow strength gamma" +msgstr "Gölge gücü" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6259,6 +6799,19 @@ msgstr "Hata ayıklama bilgisini göster" msgid "Show entity selection boxes" msgstr "Varlık seçim kutularını göster" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"Varlık seçim kutularını göster.\n" +"Bunu değiştirdikten sonra yeniden başlatma gerekir." + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "Ad etiketi arka planlarını öntanımlı olarak göster" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "Kapatma iletisi" @@ -6289,6 +6842,10 @@ msgstr "" "vuruş yüzdesini artırır, ana işlem parçasından kopyalanan veriyi azaltır,\n" "sonuç olarak yırtılmayı azaltır." +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "Gökyüzü Gövdesi Yörünge Eğimi" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "Dilim w" @@ -6346,18 +6903,14 @@ msgstr "Sızma hızı" msgid "Sneaking speed, in nodes per second." msgstr "Sızma hızı, saniye başına nod cinsinden." +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Yumuşak gölge yarıçapı" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Ses" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Özel tuşu" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Tırmanma/alçalma için özel tuş" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6380,6 +6933,14 @@ msgstr "" "Modların veya oyunların belirli (veya tüm) ögeler için açıkça bir yığın " "ayarlayabileceğini unutmayın." +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6410,10 +6971,6 @@ msgstr "Step dağ yayılma gürültüsü" msgid "Strength of 3D mode parallax." msgstr "3D kipi paralaksın gücü." -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "Üretilen normal eşlemelerin gücü." - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6466,6 +7023,11 @@ msgstr "Eşzamanlı SQLite" msgid "Temperature variation for biomes." msgstr "Biyomlar için sıcaklık değişimi." +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Ayarlar" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "Arazi alternatif gürültüsü" @@ -6514,6 +7076,18 @@ msgstr "Arazi süreklilik gürültüsü" msgid "Texture path" msgstr "Doku konumu" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"Gölge eşlemenin işleneceği doku boyutu.\n" +"Bu, 2'nin bir kuvveti olmalıdır.\n" +"Daha büyük sayılar daha iyi gölgeler oluşturur ama aynı zamanda daha fazla " +"kaynak kullanır." + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6534,6 +7108,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "İçerik deposu için URL" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "Joystick'in ölü bölgesi" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6607,23 +7185,26 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" -"Irrlicht için işleme arka ucu.\n" -"Bunu değiştirdikten sonra tekrar başlatma gerekir.\n" -"Not: Android'de, emin değilseniz OGLES1 kullanın! Başka türlü, uygulama\n" -"başlayamayabilir. Diğer platformlarda, OpenGL önerilir ve şu anda gölgeleme\n" -"desteği olan tek sürücüdür." +"İşleme arka ucu.\n" +"Bunu değiştirdikten sonra yeniden başlatma gerekir.\n" +"Not: Android'de, emin değilseniz OGLES1 kullanın! Başka türlü, uygulama " +"başlayamayabilir.\n" +"Diğer platformlarda, OpenGL önerilir.\n" +"Gölgelendiriciler OpenGL (yalnızca masaüstü) ve OGLES2 (deneysel) tarafından " +"desteklenmektedir" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "Oyun-içi görünüm frustum'unu hareket ettirirken\n" "joystick eksenlerinin hassasiyeti." @@ -6652,6 +7233,14 @@ msgstr "" "cinsinden)\n" "0 değeri bu özelliği devre dışı bırakır." +#: 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 "" +"ABM'lerin her adımda yürütülmesi için izin verilen zaman gideri\n" +"(ABM aralığının bir parçası olarak)" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6662,13 +7251,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" -"Sağ fare tuşuna basılı tutarken tekrar eden sağ tıklar arasında saniye " -"cinsinden\n" -"geçen süre." +"Yerleştirme tuşuna basılı tutarken tekrarlanan düğüm yerleşimleri arasında " +"geçen\n" +"saniye cinsinden süre." #: src/settings_translation_file.cpp msgid "The type of joystick" @@ -6711,7 +7299,8 @@ msgid "Time speed" msgstr "Zaman hızı" #: 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 "" "İstemcinin kullanılmayan harita verilerini bellekten kaldırması için zaman " "aşımı." @@ -6740,6 +7329,19 @@ msgstr "İpucu gecikmesi" msgid "Touch screen threshold" msgstr "Dokunmatik ekran eşiği" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Touchscreen" +msgstr "Dokunmatik ekran eşiği" + +#: 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 "Ağaçlar gürültüsü" @@ -6764,7 +7366,7 @@ msgstr "Güvenilen modlar" #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." -msgstr "Multiplayer sekmesinde görüntülenen sunucu listesi URL'si." +msgstr "Çok oyunculu sekmesinde görüntülenen sunucu listesinin URL'si." #: src/settings_translation_file.cpp msgid "Undersampling" @@ -6817,8 +7419,9 @@ msgid "Use bilinear filtering when scaling textures." msgstr "Dokuları boyutlandırırken bilineer filtreleme kullan." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" @@ -6826,10 +7429,33 @@ msgstr "" "çözünürlüklü bir doku paketi kullanırken, performans biraz artabilir.\n" "Gamma doğruluklu küçültme desteklenmez." +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" +"Öbek/Küme kenarlarını düzeltmek için çok örnekli düzgünleştirmeyi(anti-" +"aliasing) kullanın.\n" +"Bu işlem görüntüyü keskinleştirirken 3 boyutlu görüş alanını düzeltir.\n" +"ama doku(texture) içindeki görüntüyü etkilemez.\n" +"(Saydam dokularda etkisi daha belirgindir)\n" +"Gölgelendirme kapalı ise düğüm arası(nod) boşluk görülür.\n" +"0'da ise düzgünleştirme kapalıdır.\n" +"Ayarları değiştirdikten sonra yenileme gereklidir." + #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." msgstr "Dokuları boyutlandırırken trilineer filtreleme kullan." +#: src/settings_translation_file.cpp +msgid "User Interfaces" +msgstr "" + #: src/settings_translation_file.cpp msgid "VBO" msgstr "VBO" @@ -6927,8 +7553,8 @@ msgid "Viewing range" msgstr "Görüntüleme uzaklığı" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" -msgstr "Sanal joystick aux düğmesini tetikler" +msgid "Virtual joystick triggers Aux1 button" +msgstr "Sanal joystick Aux1 düğmesini tetikler" #: src/settings_translation_file.cpp msgid "Volume" @@ -7005,6 +7631,10 @@ msgstr "Dalgalanan sıvılar dalga-boyu" msgid "Waving plants" msgstr "Dalgalanan bitkiler" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Web bağlantısı rengi" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -7028,14 +7658,14 @@ msgstr "" "sürücüleri için, eski boyutlandırma yöntemini kullan." #: src/settings_translation_file.cpp +#, fuzzy msgid "" "When using bilinear/trilinear/anisotropic filters, low-resolution textures\n" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -7045,23 +7675,20 @@ msgstr "" "pikselleri\n" "korumak için kendiliğinden büyütme yapılır. Bu minimum doku boyutunu\n" "büyütülmüş dokular için ayarlar; daha yüksek değerler daha net görünür,\n" -"ama daha fazla bellek gerektirir. 2'nin kuvvetleri tavsiye edilir. 1'den " -"daha\n" -"yükseğe ayarlamanın, bilineer/trilineer/anisotropik filtreler etkin " -"değilse,\n" -"görünür bit etkisi olmayabilir.\n" -"Bu, dünya hizalı doku kendilinden boyutlandırmada taban nod doku boyutu\n" +"ama daha fazla bellek gerektirir. 2'nin kuvvetleri tavsiye edilir. Bu ayar " +"YALNIZCA\n" +"bilineer/trilineer/anisotropik filtreler etkinse uygulanır.\n" +"Bu, dünya hizalı doku kendiliğinden boyutlandırmada taban nod doku boyutu\n" "olarak da kullanılır." #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" -"Freetype yazı tiplerinin kullanılıp kullanılmayacağını, freetype desteği ile " -"derlenmiş olmalıdır.\n" -"Devre dışı kılınırsa, yerine bitmap ve XML vektör yazı tipleri kullanılır." +"Ad etiketi arka planlarının öntanımlı olarak gösterilip gösterilmeyileceği.\n" +"Modlar yine de bir arka plan ayarlayabilir." #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -7110,6 +7737,15 @@ msgstr "" "Oyunda, ses kısma durumunu, ses kısma tuşuyla veya duraklatma menüsünü\n" "kullanarak belirleyebilirsiniz." +#: 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)." @@ -7118,8 +7754,9 @@ msgstr "" "ile aynı etkiye sahiptir)." #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." -msgstr "İlk pencere boyutunun genişlik bileşeni." +msgid "Width component of the initial window size. Ignored in fullscreen mode." +msgstr "" +"İlk pencere boyutunun genişlik bileşeni. Tam ekran kipinde yok sayılır." #: src/settings_translation_file.cpp msgid "Width of the selection box lines around nodes." @@ -7219,132 +7856,37 @@ msgstr "Daha alt arazinin ve göl yatağının Y-seviyesi." msgid "Y-level of seabed." msgstr "Deniz yatağının Y-seviyesi." +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" msgstr "cURL dosya indirme zaman aşımı" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "cURL etkileşimli zaman aşımı" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL paralel sınırı" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL zaman aşımı" +#~ msgid "- Creative Mode: " +#~ msgstr "- Yaratıcı Kip: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Sinematik Aç/Kapa" - -#~ msgid "Select Package File:" -#~ msgstr "Paket Dosyası Seç:" - -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "Büyük mağaralardaki lavın üst sınırının Y'si." - -#~ msgid "Waving Water" -#~ msgstr "Dalgalanan Su" - -#~ msgid "Whether dungeons occasionally project from the terrain." -#~ msgstr "Zindanların bazen araziden yansıyıp yansımayacağı." - -#~ msgid "Projecting dungeons" -#~ msgstr "İzdüşüm zindanlar" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "Yüzenkara gölgelerinin uzanacağı Y-seviyesi." - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "Yüzenkara orta noktasının ve göl yüzeyinin Y-seviyesi." - -#~ msgid "Waving water" -#~ msgstr "Dalgalanan su" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "" -#~ "Tepe yüksekliğinin ve göl derinliğinin yüzenkara düz arazide değişimi." +#~ msgid "- Damage: " +#~ msgstr "- Hasar: " #~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "Yüzenkara dağların, orta noktanın altındaki ve üstündeki, tipik maksimum " -#~ "yüksekliği." +#~ "0 = eğim bilgili paralaks oklüzyon (daha hızlı).\n" +#~ "1 = kabartma eşleme (daha yavaş, daha doğru)." -#~ msgid "This font will be used for certain languages." -#~ msgstr "Belirli diller için bu yazı tipi kullanılacak." - -#~ msgid "Strength of light curve mid-boost." -#~ msgstr "Işık eğrisi orta-artırmanın kuvveti." - -#~ msgid "Shadow limit" -#~ msgstr "Gölge sınırı" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "TrueTypeFont veya bitmap konumu." - -#~ msgid "Lightness sharpness" -#~ msgstr "Aydınlık keskinliği" - -#~ msgid "Lava depth" -#~ msgstr "Lav derinliği" - -#~ msgid "IPv6 support." -#~ msgstr "IPv6 desteği." - -#~ msgid "Gamma" -#~ msgstr "Gama" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "Yazı tipi gölge saydamlığı (solukluk, 0 ve 255 arası)." - -#~ msgid "Floatland mountain height" -#~ msgstr "Yüzenkara dağ yüksekliği" - -#~ msgid "Floatland base height noise" -#~ msgstr "Yüzenkara taban yükseklik gürültüsü" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "Filmsel ton eşlemeyi etkinleştirir" - -#~ msgid "Enable VBO" -#~ msgstr "VBO'yu etkinleştir" - -#~ msgid "" -#~ "Deprecated, define and locate cave liquids using biome definitions " -#~ "instead.\n" -#~ "Y of upper limit of lava in large caves." -#~ msgstr "" -#~ "Kullanılmıyor, bunun yerine biyom tanımlarını kullanarak mağara " -#~ "sıvılarını tanımlayın ve bulun.\n" -#~ "Büyük mağaralarda lav üst sınırının Y'si." - -#~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." -#~ msgstr "" -#~ "Yüzenkara düz arazilerin alanlarını belirler.\n" -#~ "Gürültü > 0 iken düz yüzenkaralar oluşur." - -#~ msgid "Darkness sharpness" -#~ msgstr "Karanlık keskinliği" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "" -#~ "Tünellerin genişliğini denetler, daha küçük bir değer daha geniş tüneller " -#~ "yaratır." - -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "Dağ-türü yüzenkaraların yoğunluğunu denetler.\n" -#~ "'mgv7_np_mountain' gürültü değerine eklenen bir gürültü kaydırmadır." - -#~ msgid "Center of light curve mid-boost." -#~ msgstr "Işık eğrisi orta-artırmanın merkezi." - -#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." -#~ msgstr "" -#~ "Dağ-türü yüzerkaraların orta noktanın üstünde ve altında nasıl " -#~ "konikleştiğini değiştirir." +#~ msgid "Address / Port" +#~ msgstr "Adres / Port" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7355,20 +7897,457 @@ msgstr "cURL zaman aşımı" #~ "aydınlıktır.\n" #~ "Bu ayar yalnızca istemci içindir ve sunucu tarafından yok sayılır." -#~ msgid "Path to save screenshots at." -#~ msgstr "Ekran yakalamaların kaydedileceği konum." +#~ msgid "Alters how mountain-type floatlands taper above and below midpoint." +#~ msgstr "" +#~ "Dağ-türü yüzerkaraların orta noktanın üstünde ve altında nasıl " +#~ "konikleştiğini değiştirir." -#~ msgid "Parallax occlusion strength" -#~ msgstr "Paralaks oklüzyon gücü" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "Diskte emerge sıralarının sınırı" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "$1 indiriliyor ve kuruluyor, lütfen bekleyin..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Tek oyunculu dünyayı sıfırlamak istediğinizden emin misiniz ?" #~ msgid "Back" #~ msgstr "Geri" +#~ msgid "Basic" +#~ msgstr "Temel" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Tam ekran kipinde piksel başına bit (renk derinliği)." + +#~ msgid "Bump Mapping" +#~ msgstr "Tümsek Eşleme" + +#~ msgid "Bumpmapping" +#~ msgstr "Tümsek eşleme" + +#~ msgid "Center of light curve mid-boost." +#~ msgstr "Işık eğrisi orta-artırmanın merkezi." + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "Ana Menü arayüzünü değiştirir:\n" +#~ "- Full: Çoklu tek oyunculu dünyalar, oyun seçimi, doku paketi seçici, " +#~ "vb.\n" +#~ "- Simple: Bir tek oyunculu dünya, oyun veya doku paketi seçiciler yok.\n" +#~ "Küçük ekranlar için gerekli olabilir." + +#~ msgid "Config mods" +#~ msgstr "Modları yapılandır" + +#~ msgid "Configure" +#~ msgstr "Yapılandır" + +#~ msgid "Connect" +#~ msgstr "Bağlan" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "Sıvıdaki batma hızını denetler." + +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "Dağ-türü yüzenkaraların yoğunluğunu denetler.\n" +#~ "'mgv7_np_mountain' gürültü değerine eklenen bir gürültü kaydırmadır." + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "" +#~ "Tünellerin genişliğini denetler, daha küçük bir değer daha geniş tüneller " +#~ "yaratır." + +#~ msgid "Credits" +#~ msgstr "Hakkında" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "Artı rengi (R,G,B)." + +#~ msgid "Damage enabled" +#~ msgstr "Hasar etkin" + +#~ msgid "Darkness sharpness" +#~ msgstr "Karanlık keskinliği" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "CURL için öntanımlı zaman aşımı, milisaniye cinsinden.\n" +#~ "Yalnızca cURL ile derlenmiş ise bir etkisi vardır." + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "Yüzenkara düz arazilerin alanlarını belirler.\n" +#~ "Gürültü > 0 iken düz yüzenkaralar oluşur." + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "Dokuların örnekleme adımını tanımlar.\n" +#~ "Yüksek bir değer daha yumuşak normal eşlemeler verir." + +#~ msgid "Del. Favorite" +#~ msgstr "Sık Kullanılanı Sil" + +#~ msgid "" +#~ "Deprecated, define and locate cave liquids using biome definitions " +#~ "instead.\n" +#~ "Y of upper limit of lava in large caves." +#~ msgstr "" +#~ "Kullanılmıyor, bunun yerine biyom tanımlarını kullanarak mağara " +#~ "sıvılarını tanımlayın ve bulun.\n" +#~ "Büyük mağaralarda lav üst sınırının Y'si." + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "minetest.net'den , Minetest Game gibi, bir oyun indirin" + +#~ msgid "Download one from minetest.net" +#~ msgstr "minetest.net adresinden indirin" + +#~ msgid "Downloading and installing $1, please wait..." +#~ msgstr "$1 indiriliyor ve kuruluyor, lütfen bekleyin..." + +#~ msgid "Enable VBO" +#~ msgstr "VBO'yu etkinleştir" + +#~ msgid "Enable register confirmation" +#~ msgstr "Kayıt onayını etkinleştir" + +#~ msgid "" +#~ "Enables bumpmapping for textures. Normalmaps need to be supplied by the " +#~ "texture pack\n" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Tümsek eşlemeyi dokular için etkinleştirir. Normal eşlemelerin doku " +#~ "paketi tarafından sağlanması\n" +#~ "veya kendiliğinden üretilmesi gerekir\n" +#~ "Gölgelemelerin etkin olmasını gerektirir." + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "Filmsel ton eşlemeyi etkinleştirir" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "Çalışma anı dikey eşleme üretimini (kabartma efekti) etkinleştirir.\n" +#~ "Tümsek eşlemenin etkin olmasını gerektirir." + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "Paralaks oklüzyon eşlemeyi etkinleştirir.\n" +#~ "Gölgelemelerin etkin olmasını gerektirir." + +#~ msgid "Enter " +#~ msgstr "Gir " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "Deneysel seçenek, 0'dan daha büyük bir sayıya ayarlandığında\n" +#~ "bloklar arasında görünür boşluklara neden olabilir." + +#~ msgid "FPS in pause menu" +#~ msgstr "Duraklat menüsünde FPS" + +#~ msgid "Fallback font shadow" +#~ msgstr "Geri dönüş yazı tipi gölgesi" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "Geri dönüş yazı tipi gölge saydamlığı" + +#~ msgid "Fallback font size" +#~ msgstr "Geri dönüş yazı tipi boyutu" + +#~ msgid "Filtering" +#~ msgstr "Filtreleme" + +#~ msgid "Floatland base height noise" +#~ msgstr "Yüzenkara taban yükseklik gürültüsü" + +#~ msgid "Floatland mountain height" +#~ msgstr "Yüzenkara dağ yüksekliği" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "Yazı tipi gölge saydamlığı (solukluk, 0 ve 255 arası)." + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "Yedek yazı tipinin nokta (pt) olarak boyutu." + +#~ msgid "FreeType fonts" +#~ msgstr "Freetype yazı tipleri" + +#~ msgid "Full screen BPP" +#~ msgstr "Tam ekran BPP" + +#~ msgid "Game" +#~ msgstr "Oyun" + +#~ msgid "Gamma" +#~ msgstr "Gama" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Normal Eşlemeleri Üret" + +#~ msgid "Generate normalmaps" +#~ msgstr "Normal eşlemeleri üret" + +#~ msgid "HUD scale factor" +#~ msgstr "HUD boyut çarpanı" + +#~ msgid "High-precision FPU" +#~ msgstr "Yüksek hassasiyetli FPU" + +#~ msgid "IPv6 support." +#~ msgstr "IPv6 desteği." + +#~ msgid "In-Game" +#~ msgstr "Oyun içi" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Kur: dosya: \"$1\"" + +#~ msgid "Instrumentation" +#~ msgstr "Belgeleme" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Tuş ayaları. (Eğer bu menü çalışmaz ise, minetest.conf 'tan kaldırın)" + +#~ msgid "Lava depth" +#~ msgstr "Lav derinliği" + +#~ msgid "Lightness sharpness" +#~ msgstr "Aydınlık keskinliği" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "Diskte emerge sıralarının sınırı" + +#~ msgid "Main" +#~ msgstr "Ana" + +#~ msgid "Main menu style" +#~ msgstr "Ana menü stili" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "" +#~ "DirectX'in LuaJIT ile çalışmasını sağlar. Sorunlara neden olursa devre " +#~ "dışı bırakın." + +#~ msgid "Menus" +#~ msgstr "Menüler" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Radar kipinde mini harita, Yakınlaştırma x2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Radar kipinde mini harita, Yakınlaştırma x4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Yüzey kipinde mini harita, Yakınlaştırma x2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Yüzey kipinde mini harita, Yakınlaştırma x4" + +#~ msgid "Name / Password" +#~ msgstr "Ad / Parola" + +#~ msgid "Name/Password" +#~ msgstr "Ad/Şifre" + +#~ msgid "No" +#~ msgstr "Hayır" + +#~ msgid "Normalmaps sampling" +#~ msgstr "Normal eşleme örnekleme" + +#~ msgid "Normalmaps strength" +#~ msgstr "Normal eşleme gücü" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "Paralaks oklüzyon yineleme sayısı." + #~ msgid "Ok" #~ msgstr "Tamam" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "" +#~ "0 ile 255 arasında yedek yazı tipinin arkasındaki gölgenin opaklığı " +#~ "(alfa)." + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "Paralaks oklüzyon efektinin genel sapması, genellikle boyut/2." + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "Paralaks oklüzyon efektinin genel boyutu." + +#~ msgid "Parallax Occlusion" +#~ msgstr "Paralaks Oklüzyon" + +#~ msgid "Parallax occlusion" +#~ msgstr "Paralaks oklüzyon" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "Paralaks oklüzyon sapması" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "Paralaks oklüzyon yinelemesi" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "Paralaks oklüzyon kipi" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Paralaks oklüzyon boyutu" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "Paralaks oklüzyon gücü" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "TrueTypeFont veya bitmap konumu." + +#~ msgid "Path to save screenshots at." +#~ msgstr "Ekran yakalamaların kaydedileceği konum." + +#~ msgid "Player name" +#~ msgstr "Oyuncu adı" + +#~ msgid "Profiling" +#~ msgstr "Profilleme" + +#~ msgid "Projecting dungeons" +#~ msgstr "İzdüşüm zindanlar" + +#~ msgid "PvP enabled" +#~ msgstr "Savaş etkin" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Tek oyunculu dünyayı sıfırla" + +#~ msgid "Select Package File:" +#~ msgstr "Paket Dosyası Seç:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Sunucu / Tek oyunculu" + +#~ msgid "" +#~ "Set the shadow update time.\n" +#~ "Lower value means shadows and map updates faster, but it consume more " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "Gölge güncelleme zamanını ayarla.\n" +#~ "Daha düşük değer, gölgeler ve harita güncellemelerinin daha hızlı olması " +#~ "anlamına gelir, ancak daha fazla kaynak tüketir.\n" +#~ "En düşük değer 0,001 saniye, en yüksek değer 0,2 saniyedir" + +#~ msgid "Shadow limit" +#~ msgstr "Gölge sınırı" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "" +#~ "Yedek yazı tipinin gölge uzaklığı (piksel olarak). 0 ise, gölge çizilmez." + +#~ msgid "Special" +#~ msgstr "Özel" + +#~ msgid "Special key" +#~ msgstr "Özel tuşu" + +#~ msgid "Start Singleplayer" +#~ msgstr "Tek oyunculu başlat" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "Üretilen normal eşlemelerin gücü." + +#~ msgid "Strength of light curve mid-boost." +#~ msgstr "Işık eğrisi orta-artırmanın kuvveti." + +#~ msgid "This font will be used for certain languages." +#~ msgstr "Belirli diller için bu yazı tipi kullanılacak." + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "OpenGL sürücüleri seçilmeden gölgelemeler etkinleştirilemez." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Sinematik Aç/Kapa" + +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "" +#~ "Yüzenkara dağların, orta noktanın altındaki ve üstündeki, tipik maksimum " +#~ "yüksekliği." + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "" +#~ "Tepe yüksekliğinin ve göl derinliğinin yüzenkara düz arazide değişimi." + +#~ msgid "View" +#~ msgstr "Görüntüle" + +#~ msgid "Waving Water" +#~ msgstr "Dalgalanan Su" + +#~ msgid "Waving water" +#~ msgstr "Dalgalanan su" + +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "" +#~ "Freetype yazı tiplerinin kullanılıp kullanılmayacağını, freetype desteği " +#~ "ile derlenmiş olmalıdır.\n" +#~ "Devre dışı kılınırsa, yerine bitmap ve XML vektör yazı tipleri kullanılır." + +#~ msgid "Whether dungeons occasionally project from the terrain." +#~ msgstr "Zindanların bazen araziden yansıyıp yansımayacağı." + +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "Büyük mağaralardaki lavın üst sınırının Y'si." + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "Yüzenkara orta noktasının ve göl yüzeyinin Y-seviyesi." + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "Yüzenkara gölgelerinin uzanacağı Y-seviyesi." + +#~ msgid "Yes" +#~ msgstr "Evet" + +#, 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 "" +#~ "Bu sunucuya \"%s\" adıyla ilk kez katılmak üzeresiniz.\n" +#~ "Devam ederseniz, kimlik bilgilerinizi kullanarak yeni bir hesap bu " +#~ "sunucuda oluşturulur.\n" +#~ "Lütfen parolanızı tekrar yazın ve hesap oluşturmayı onaylamak için 'Kayıt " +#~ "Ol ve Katıl' düğmesini tıklayın veya iptal etmek için 'İptal'i tıklayın." + +#~ msgid "You died." +#~ msgstr "Öldün." + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/ja_KS/minetest.po b/po/tt/minetest.po similarity index 86% rename from po/ja_KS/minetest.po rename to po/tt/minetest.po index 2bb9891ae..a755c05bd 100644 --- a/po/ja_KS/minetest.po +++ b/po/tt/minetest.po @@ -1,29 +1,99 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# msgid "" msgstr "" -"Project-Id-Version: Japanese (Kansai) (Minetest)\n" +"Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-01-11 18:26+0000\n" -"Last-Translator: rubenwardy <rubenwardy@gmail.com>\n" -"Language-Team: Japanese (Kansai) <https://hosted.weblate.org/projects/" -"minetest/minetest/ja_KS/>\n" -"Language: ja_KS\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2021-04-08 18:26+0000\n" +"Last-Translator: Timur Seber <seber.tatsoft@gmail.com>\n" +"Language-Team: Tatar <https://hosted.weblate.org/projects/minetest/minetest/" +"tt/>\n" +"Language: tt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.10.1\n" +"X-Generator: Weblate 4.6-dev\n" -#: builtin/client/death_formspec.lua src/client/game.cpp -msgid "Respawn" +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." msgstr "" +#: builtin/client/death_formspec.lua src/client/game.cpp +msgid "Respawn" +msgstr "Тергезелергә" + #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" +msgstr "Сез үлдегез" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" msgstr "" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" +msgstr "Ярый" + +#: builtin/fstk/ui.lua +msgid "<none available>" msgstr "" #: builtin/fstk/ui.lua @@ -46,8 +116,28 @@ msgstr "" msgid "The server has requested a reconnect:" msgstr "" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." +#: 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 @@ -63,7 +153,7 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" #: builtin/mainmenu/common.lua @@ -74,17 +164,26 @@ msgstr "" msgid "We support protocol versions between version $1 and $2." msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua -#: builtin/mainmenu/dlg_delete_content.lua -#: builtin/mainmenu/dlg_delete_world.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 -msgid "Cancel" +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Enabled, has error)" msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: 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_register.lua +#: builtin/mainmenu/dlg_rename_modpack.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/client/keycode.cpp +#: src/gui/guiKeyChangeMenu.cpp src/gui/guiPasswordChange.cpp +msgid "Cancel" +msgstr "Баш тарту" + +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "" @@ -145,24 +244,62 @@ msgstr "" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp msgid "Save" -msgstr "" +msgstr "Саклау" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" -msgstr "" +msgstr "Дөнья:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -176,7 +313,6 @@ msgid "Failed to download $1" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "" @@ -185,7 +321,18 @@ msgid "Install" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "" @@ -198,8 +345,23 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua @@ -215,7 +377,11 @@ msgid "Update" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -259,11 +425,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 @@ -282,10 +444,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 "" @@ -302,6 +460,14 @@ msgstr "" msgid "Increases humidity around rivers" msgstr "" +#: builtin/mainmenu/dlg_create_world.lua +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 "" @@ -401,10 +567,6 @@ msgstr "" 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 "" @@ -435,6 +597,36 @@ 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 +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 msgid "Accept" msgstr "" @@ -466,6 +658,14 @@ 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 "" @@ -490,7 +690,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -509,6 +709,10 @@ msgstr "" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Эзләү" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "" @@ -517,7 +721,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 "" @@ -596,14 +800,6 @@ msgstr "" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" @@ -624,6 +820,56 @@ msgstr "" msgid "Unable to install a modpack as a $1" msgstr "" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "" @@ -664,26 +910,6 @@ msgstr "" msgid "Use Texture Pack" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "" @@ -693,14 +919,10 @@ msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "" @@ -716,10 +938,6 @@ msgstr "" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "" @@ -732,10 +950,14 @@ msgstr "" msgid "Play Game" msgstr "" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "" @@ -749,44 +971,60 @@ msgid "Start Game" msgstr "" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" +msgid "Address" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" msgstr "" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_online.lua +msgid "Login" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +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 @@ -813,10 +1051,6 @@ msgstr "" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -825,10 +1059,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "" @@ -837,12 +1067,28 @@ msgstr "" msgid "Connected Glass" msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -853,10 +1099,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" @@ -885,18 +1127,10 @@ msgstr "" msgid "Opaque Water" msgstr "" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "" @@ -909,6 +1143,10 @@ msgstr "" msgid "Shaders" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -925,22 +1163,26 @@ msgstr "" msgid "Texturing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" - #: 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 "" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "" @@ -953,23 +1195,11 @@ msgstr "" msgid "Waving Plants" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "" @@ -998,7 +1228,7 @@ msgid "Connection error (timed out?)" msgstr "" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +msgid "Could not find or load game: " msgstr "" #: src/client/clientlauncher.cpp @@ -1029,18 +1259,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1051,14 +1269,6 @@ msgstr "" msgid "- Address: " msgstr "" -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1080,6 +1290,15 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "" @@ -1088,6 +1307,22 @@ msgstr "" msgid "Automatic forward enabled" msgstr "" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1096,6 +1331,10 @@ msgstr "" msgid "Camera update enabled" msgstr "" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "" @@ -1108,6 +1347,10 @@ msgstr "" msgid "Cinematic mode enabled" msgstr "" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1116,6 +1359,10 @@ msgstr "" msgid "Connecting to server..." msgstr "" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "" @@ -1128,17 +1375,22 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "" @@ -1183,6 +1435,11 @@ msgstr "" 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 "" @@ -1256,31 +1513,7 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" +msgid "Multiplayer" msgstr "" #: src/client/game.cpp @@ -1355,6 +1588,21 @@ msgstr "" msgid "Sound unmuted" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1424,10 +1672,6 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "" @@ -1675,22 +1919,30 @@ msgstr "" msgid "Zoom" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1698,7 +1950,7 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1709,15 +1961,23 @@ msgstr "" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "" @@ -1770,7 +2030,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 @@ -1801,10 +2061,6 @@ msgstr "" msgid "Sneak" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1845,10 +2101,6 @@ msgstr "" msgid "Change" msgstr "" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "" @@ -1857,6 +2109,10 @@ msgstr "" msgid "Old Password" msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "" @@ -1866,13 +2122,8 @@ msgid "Muted" msgstr "" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " +#, c-format +msgid "Sound Volume: %d%%" msgstr "" #. ~ DO NOT TRANSLATE THIS LITERALLY! @@ -1880,7 +2131,16 @@ msgstr "" #. language code (e.g. "de" for German). #: src/network/clientpackethandler.cpp src/script/lua_api/l_client.cpp msgid "LANG_CODE" -msgstr "ja_KS" +msgstr "" + +#: 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 "" @@ -1890,8 +2150,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1918,12 +2178,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2012,6 +2266,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2030,6 +2288,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2075,6 +2337,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2085,6 +2351,10 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2099,7 +2369,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2167,6 +2437,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2187,6 +2461,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2199,10 +2481,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2224,7 +2502,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 @@ -2232,11 +2510,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2264,7 +2542,7 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" +msgid "Camera" msgstr "" #: src/settings_translation_file.cpp @@ -2338,13 +2616,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" msgstr "" #: src/settings_translation_file.cpp @@ -2380,7 +2656,7 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp @@ -2399,6 +2675,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2419,6 +2701,10 @@ msgstr "" 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 "" @@ -2443,6 +2729,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2470,6 +2760,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2494,10 +2800,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2524,7 +2838,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 @@ -2555,7 +2871,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2563,7 +2881,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2587,11 +2907,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 @@ -2630,8 +2950,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2662,12 +2983,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2738,6 +3053,14 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "" @@ -2750,6 +3073,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2794,18 +3127,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2822,22 +3172,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2886,14 +3230,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2902,18 +3238,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2922,6 +3246,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2930,12 +3264,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2947,7 +3275,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2966,18 +3298,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -2996,7 +3316,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3030,13 +3350,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3103,6 +3423,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3124,15 +3448,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3141,6 +3465,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3200,10 +3535,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3228,10 +3559,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3249,7 +3576,15 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gamepads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3260,7 +3595,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3279,6 +3614,14 @@ msgstr "" 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 "" @@ -3296,7 +3639,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 @@ -3306,8 +3653,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3329,7 +3676,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3340,10 +3688,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3539,10 +3883,17 @@ 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 "" @@ -3575,8 +3926,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3598,11 +3948,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3626,7 +3982,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 @@ -3643,6 +4001,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3659,10 +4023,6 @@ msgstr "" 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 "" @@ -3690,7 +4050,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3713,16 +4073,12 @@ msgstr "" 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 @@ -3773,6 +4129,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3852,6 +4212,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3951,6 +4318,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4324,6 +4698,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4380,7 +4758,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 @@ -4390,15 +4768,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 @@ -4410,7 +4791,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4437,6 +4819,10 @@ msgstr "" 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" @@ -4508,21 +4894,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4584,6 +4970,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4689,7 +5079,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4737,6 +5131,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4791,17 +5192,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4850,12 +5255,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4866,6 +5283,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4932,16 +5353,16 @@ msgstr "" 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 "" @@ -4954,6 +5375,10 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -4966,14 +5391,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -4995,18 +5412,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5016,11 +5425,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5029,38 +5433,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5083,17 +5461,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5122,13 +5496,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5139,6 +5517,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5173,10 +5555,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5184,9 +5562,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5276,10 +5654,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5349,6 +5723,10 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5376,6 +5754,10 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5388,10 +5770,6 @@ msgstr "" 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 "" @@ -5432,7 +5810,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" +msgid "Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Security" msgstr "" #: src/settings_translation_file.cpp @@ -5459,10 +5845,18 @@ msgstr "" 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 "" @@ -5474,7 +5868,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5495,6 +5917,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5507,6 +5936,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5514,9 +5959,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5531,6 +5974,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5552,6 +6005,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5606,18 +6063,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5633,6 +6086,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5660,10 +6121,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5701,6 +6158,10 @@ msgstr "" 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 "" @@ -5743,6 +6204,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5757,6 +6225,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5812,18 +6284,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5841,6 +6313,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5849,9 +6327,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5888,7 +6365,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 @@ -5911,6 +6388,18 @@ msgstr "" 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 "" @@ -5981,15 +6470,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6083,7 +6587,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6153,6 +6657,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6174,18 +6682,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6220,13 +6726,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6310,14 +6825,22 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#, fuzzy +#~ msgid "You died." +#~ msgstr "Сез үлдегез" diff --git a/po/uk/minetest.po b/po/uk/minetest.po index a87362951..b6240e350 100644 --- a/po/uk/minetest.po +++ b/po/uk/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Ukrainian (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-26 10:41+0000\n" -"Last-Translator: Maksim Gamarnik <MoNTE48@mail.ua>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-07-31 17:28+0000\n" +"Last-Translator: Fixer <artem.brz@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/minetest/" "minetest/uk/>\n" "Language: uk\n" @@ -13,7 +13,43 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.2-dev\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Очистити чергу чату" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Порожня команда." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Вихід в основне меню" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Неправильна команда: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Введена команда: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Список гравців у мережі" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Гравці в мережі: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Ця команда вимкнена на сервері." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -23,13 +59,42 @@ msgstr "Переродитися" msgid "You died" msgstr "Ви загинули" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Доступні команди:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Доступні команди: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Команда не доступна: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Отримати довідку для команд" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "ОК" +msgstr "Добре" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" -msgstr "Трапилася помилка у Lua скрипті:" +msgstr "Трапилася помилка в скрипті Lua:" #: builtin/fstk/ui.lua msgid "An error occurred:" @@ -37,19 +102,39 @@ msgstr "Трапилася помилка:" #: builtin/fstk/ui.lua msgid "Main menu" -msgstr "Головне меню" +msgstr "Основне меню" #: builtin/fstk/ui.lua msgid "Reconnect" -msgstr "Повторне підключення" +msgstr "Перезʼєднання" #: builtin/fstk/ui.lua msgid "The server has requested a reconnect:" -msgstr "Сервер запросив перез'єднання:" +msgstr "Сервер запросив перезʼєднання:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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 msgid "Protocol version mismatch. " @@ -64,10 +149,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Сервер підтримує версії протоколу між $1 і $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" -"Спробуйте оновити список публічних серверів та перевірте своє Інтернет-" -"з'єднання." #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -77,19 +160,28 @@ msgstr "Ми підтримуємо тільки протокол версії $ msgid "We support protocol versions between version $1 and $2." msgstr "Ми підтримуємо протокол між версіями $1 і $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "Скасувати" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" -msgstr "Залежить від:" +msgstr "Залежності:" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable all" @@ -97,27 +189,27 @@ msgstr "Вимкнути все" #: builtin/mainmenu/dlg_config_world.lua msgid "Disable modpack" -msgstr "Вимкнути модпак" +msgstr "Вимкнути пакмод" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "Увімкнути все" +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 "" -"Не вдалося ввімкнути модифікацію \"$1\", тому що вона містить заборонені " -"символи. Дозволяється використання таких символів: [a-z0-9_]." +"Не вдалося ввімкнути мод \"$1\", тому що він містить не дозволені знаки. " +"Дозволяються такі знаки: [a-z0-9_]." #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "Знайти Більше Модів" +msgstr "Знайти більше модів" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -125,7 +217,7 @@ msgstr "Мод:" #: builtin/mainmenu/dlg_config_world.lua msgid "No (optional) dependencies" -msgstr "Необов'язкові залежності відсутні" +msgstr "Відсутні (необовʼязкові) залежності" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." @@ -133,19 +225,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 @@ -158,19 +250,59 @@ msgstr "Світ:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" -msgstr "увімкнено" +msgstr "дозволено" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" вже існує. Бажаєте перезаписати?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Встановиться $1 і $2 залежностей." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "$1 завантажується..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "$1 необхідних залежностей не знайдено." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 встановиться, і $2 залежностей буде пропущено." #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" -msgstr "Всі пакунки" +msgstr "Усі пакунки" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Уже встановлено" #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" -msgstr "Назад в Головне Меню" +msgstr "Назад до головного меню" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Базова гра:" #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "ContentDB не є доступним коли Minetest не містить підтримку cURL" +msgstr "ContentDB недоступний, коли Minetest скомпільований без CURL" #: builtin/mainmenu/dlg_contentstore.lua msgid "Downloading..." @@ -181,7 +313,6 @@ msgid "Failed to download $1" msgstr "Не вдалося завантажити $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Ігри" @@ -190,22 +321,48 @@ msgid "Install" msgstr "Встановити" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "Встановити $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Встановити відсутні залежності" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Установлення: Непідтримуваний тип файлу або пошкоджений архів" + +#: builtin/mainmenu/dlg_contentstore.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" msgstr "Нічого не знайдено" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "Пошук" +msgid "No updates" +msgstr "Нема оновлень" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Не знайдено" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Перезаписати" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Перевірте чи основна гра є правильною." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "У черзі" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -220,12 +377,16 @@ msgid "Update" msgstr "Оновити" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "Вид" +msgid "Update All [$1]" +msgstr "Оновити все [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Переглянути більше інформації у вебоглядачі" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "Світ з такою назвою \"$1\" вже існує" +msgstr "Світ з назвою \"$1\" вже існує" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" @@ -260,17 +421,12 @@ msgid "Create" msgstr "Створити" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "Інформація" +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" +msgid "Development Test is meant for developers." +msgstr "Увага: тестова розробка призначена для розробників." #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" @@ -286,15 +442,11 @@ 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 "Ґенерувати нефрактальну місцевість: океани і підземелля" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" @@ -308,6 +460,14 @@ msgstr "Вологі ріки" msgid "Increases humidity around rivers" msgstr "Підвищує вологість навколо річок" +#: builtin/mainmenu/dlg_create_world.lua +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 "Озера" @@ -318,15 +478,15 @@ 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" @@ -334,7 +494,7 @@ msgstr "Гори" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "Грязьовий потік" +msgstr "Болотяний потік" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" @@ -342,7 +502,7 @@ msgstr "Мережа тунелів і печер" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" -msgstr "Гру не вибрано" +msgstr "Не вибрано гру" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" @@ -358,7 +518,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 @@ -374,6 +534,8 @@ 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" @@ -385,33 +547,27 @@ 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 -#, fuzzy 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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "Увага: мінімальна тестова версія призначена для розробників." +msgstr "Дуже великі печери глибоко під землею" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -443,41 +599,78 @@ 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 +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 "Прийняти" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "Перейменувати збірку модифікацій:" +msgstr "Перейменувати пакмод:" #: 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.conf, " -"на що не вплине перейменування." +"Цей пакмод має явну назву в 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 "2D Шум" +msgstr "2D-шум" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "< Назад до Налаштувань" +msgstr "< Назад до налаштувань" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" -msgstr "Переглянути" +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 "Вимкнено" +msgstr "Заборонено" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" @@ -485,11 +678,11 @@ msgstr "Правити" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" -msgstr "Увімкнено" +msgstr "Дозволено" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Lacunarity" -msgstr "Лакунарність" +msgstr "Порожнистість" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Octaves" @@ -500,40 +693,44 @@ msgid "Offset" msgstr "Зсув" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" 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 "Шкала" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Пошук" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" -msgstr "Виберіть папку" +msgstr "Виберіть каталог" #: builtin/mainmenu/dlg_settings_advanced.lua 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 "Показувати технічні назви" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must be at least $1." -msgstr "Значення має бути як мінімум $1." +msgstr "Значенням має бути щонайменше $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must not be larger than $1." @@ -545,7 +742,7 @@ msgstr "Х" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X spread" -msgstr "Розкидання по X" +msgstr "Поширення по X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y" @@ -553,7 +750,7 @@ msgstr "Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y spread" -msgstr "Розкидання по Y" +msgstr "Поширення по Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z" @@ -561,7 +758,7 @@ msgstr "Z" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z spread" -msgstr "Розкидання по Z" +msgstr "Поширення по Z" #. ~ "absvalue" is a noise parameter flag. #. It is short for "absolute value". @@ -576,7 +773,7 @@ msgstr "Абс. величина" #. 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 @@ -588,11 +785,11 @@ msgstr "полегшений" #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" -msgstr "$1 (Увімкнено)" +msgstr "$1 (Дозволено)" #: builtin/mainmenu/pkgmgr.lua msgid "$1 mods" -msgstr "$1 модифікації" +msgstr "$1 модів" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" @@ -600,25 +797,16 @@ msgstr "Не вдалося встановити $1 в $2" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "Встановлення модифікації: не вдається знайти реальну назву для: $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 "Install: Unsupported file type \"$1\" or broken archive" -msgstr "Встановлення: тип файлу \"$1\" не підтримується або архів пошкоджено" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "Встановлення: файл: \"$1\"" +"Встановлення мода: неможливо знайти відповідну назву теки для пакмоду $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" @@ -636,13 +824,67 @@ msgstr "Не вдалося встановити мод як $1" msgid "Unable to install a modpack as a $1" msgstr "Не вдалося встановити модпак як $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Завантаження..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Список публічних серверів вимкнено" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" +"Спробуйте оновити список публічних серверів та перевірте своє Інтернет-" +"з'єднання." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Про" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Активні співрозробники" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Активний промальовувач:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Основні розробники" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "Попередні співрозробники" + +#: 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 msgid "Browse online content" -msgstr "Шукати додатки онлайн" +msgstr "Оглянути вміст у мережі" #: builtin/mainmenu/tab_content.lua msgid "Content" -msgstr "Додатки" +msgstr "Вміст" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" @@ -674,47 +916,23 @@ msgstr "Видалити пакунок" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" -msgstr "Увімкнути набір текстур" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "Активні учасники" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "Розробники двигуна" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "Подяки" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "Попередні учасники" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "Попередні розробники двигуна" +msgstr "Викор. набір текстур" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "Публічний" +msgstr "Анонсувати сервер" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" msgstr "Закріпити адресу" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "Налаштувати" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "Творчість" +msgstr "Творчий режим" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" -msgstr "Поранення" +msgstr "Дозволити пошкодження" #: builtin/mainmenu/tab_local.lua msgid "Host Game" @@ -726,11 +944,7 @@ msgstr "Сервер" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "Ім'я/Пароль" +msgstr "Встановити ігри з ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -742,12 +956,16 @@ msgstr "Світ не створено або не обрано!" #: builtin/mainmenu/tab_local.lua msgid "Play Game" -msgstr "Грати" +msgstr "Грати гру" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "Порт" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "Виберіть моди" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "Виберіть світ:" @@ -758,48 +976,64 @@ msgstr "Порт сервера" #: builtin/mainmenu/tab_local.lua msgid "Start Game" -msgstr "Грати" +msgstr "Почати гру" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "Адреса / Порт" +msgid "Address" +msgstr "Адреса" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "Під'єднатися" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Очистити" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" -msgstr "Творчість" +msgstr "Творчий режим" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "Поранення" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Пошкодження / ГпГ" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "Видалити мітку" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Відібрані" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "Улюблені" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Несумісні сервери" #: builtin/mainmenu/tab_online.lua msgid "Join Game" -msgstr "Мережа" +msgstr "Долучитися до гри" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "Ім'я / Пароль" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" -msgstr "Пінг" +msgstr "Пінґ" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "Бої увімкнено" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Публічні сервери" + +#: builtin/mainmenu/tab_online.lua +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" @@ -807,7 +1041,7 @@ msgstr "2x" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "Об'ємні хмари" +msgstr "3D хмари" #: builtin/mainmenu/tab_settings.lua msgid "4x" @@ -819,27 +1053,19 @@ msgstr "8x" #: builtin/mainmenu/tab_settings.lua msgid "All Settings" -msgstr "Всі налаштування" +msgstr "Усі налаштування" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" msgstr "Згладжування:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "Ви впевнені, що бажаєте скинути свій світ одиночної гри?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "Зберігати розмір вікна" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "Білінійна фільтрація" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "Бамп маппінг" +msgstr "Дволінійне фільтрування" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" @@ -847,15 +1073,31 @@ msgstr "Змінити клавіші" #: builtin/mainmenu/tab_settings.lua msgid "Connected Glass" -msgstr "З'єднувати скло" +msgstr "Зʼєднане скло" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Динамічні тіні" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "Динамічні тіні:" #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "Гарне листя" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "Генерувати мапи нормалів" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -865,13 +1107,9 @@ msgstr "Міпмапи" msgid "Mipmap + Aniso. Filter" msgstr "Міпмапи і анізотропний фільтр" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "Ні" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" -msgstr "Без фільтрації" +msgstr "Без фільтрування" #: builtin/mainmenu/tab_settings.lua msgid "No Mipmap" @@ -897,18 +1135,10 @@ msgstr "Непрозоре листя" msgid "Opaque Water" msgstr "Непрозора вода" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "Паралаксова оклюзія" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "Часточки" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "Скинути світ одиночної гри" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "Екран:" @@ -919,11 +1149,15 @@ msgstr "Налаштування" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" -msgstr "Шейдери" +msgstr "Відтінювачі" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Відтінювачі (експериментальне)" #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" -msgstr "Шейдери (недоступно)" +msgstr "Відтінювачі (недоступно)" #: builtin/mainmenu/tab_settings.lua msgid "Simple Leaves" @@ -937,22 +1171,26 @@ msgstr "Згладжене освітлення" msgid "Texturing:" msgstr "Текстурування:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "Для того, щоб увімкнути шейдери, потрібно мати драйвер OpenGL." - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "Тоновий шейдер" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "Чутливість дотику: (пкс)" +msgid "Touch threshold (px):" +msgstr "Чутливість дотику (пкс):" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "Трилінійна фільтрація" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "Коливати листя" @@ -965,37 +1203,25 @@ msgstr "Хвилясті Рідини" msgid "Waving Plants" msgstr "Коливати квіти" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "Так" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "Налаштувати модифікації" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "Головне Меню" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "Почати одиночну гру" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "Зʼєднання зупинено (помилка протоколу?)" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "Час очікування вийшов." #: src/client/client.cpp msgid "Done!" -msgstr "Виконано!" +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..." @@ -1007,11 +1233,11 @@ msgstr "Перебудова шейдерів..." #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "Помилка з'єднання (час вийшов?)" +msgstr "Помилка зʼєднання (час вийшов?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "Неможливо знайти або завантажити гру \"" +msgid "Could not find or load game: " +msgstr "Неможливо знайти або завантажити гру: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1019,19 +1245,19 @@ msgstr "Помилкова конфігурація gamespec." #: src/client/clientlauncher.cpp msgid "Main Menu" -msgstr "Головне Меню" +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!" -msgstr "Будь-ласка введіть ім'я!" +msgstr "Будь-ласка, оберіть імʼя!" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " @@ -1041,18 +1267,6 @@ msgstr "Не вдалося відкрити файл паролю: " msgid "Provided world path doesn't exist: " msgstr "Вказаний шлях до світу не існує: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "no" - #: src/client/game.cpp msgid "" "\n" @@ -1065,17 +1279,9 @@ msgstr "" msgid "- Address: " msgstr "- Адреса: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- Творчість: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- Поранення: " - #: src/client/game.cpp msgid "- Mode: " -msgstr "- Тип: " +msgstr "- Режим: " #: src/client/game.cpp msgid "- Port: " @@ -1088,12 +1294,21 @@ msgstr "- Публічний: " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "- PvP (бої): " +msgstr "- ГпГ (бої): " #: src/client/game.cpp msgid "- Server Name: " msgstr "- Назва сервера: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Трапилася помилка серіалізації:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Доступ відхилено. Причина: %s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "Автоматичний рух вперед вимкнено" @@ -1102,6 +1317,22 @@ msgstr "Автоматичний рух вперед вимкнено" msgid "Automatic forward enabled" msgstr "Автоматичний рух вперед увімкнено" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "Оновлення камери вимкнено" @@ -1110,6 +1341,10 @@ msgstr "Оновлення камери вимкнено" msgid "Camera update enabled" msgstr "Оновлення камери увімкнено" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "Змінити пароль" @@ -1122,6 +1357,10 @@ msgstr "Кінорежим вимкнено" msgid "Cinematic mode enabled" msgstr "Кінорежим увімкнено" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "Клієнта відʼєднано" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "Клієнтосторонні скрипти на клієнті вимкнено" @@ -1130,6 +1369,10 @@ msgstr "Клієнтосторонні скрипти на клієнті вим msgid "Connecting to server..." msgstr "Підключення до сервера..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Невдале зʼєднання з невідомих причин" + #: src/client/game.cpp msgid "Continue" msgstr "Продовжити" @@ -1142,31 +1385,36 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" -"Стандартне керування клавішами:\n" -"- %s: вперед\n" -"- %s: назад\n" -"- %s: ліворуч\n" -"- %s: праворуч\n" +"Керування:\n" +"- %s: рухатися вперед\n" +"- %s: рухатися назад\n" +"- %s: рухатися вліво\n" +"- %s: рухатися вправо\n" "- %s: стрибок/лізти вгору\n" +"- %s: копати/удар\n" +"- %s: поставити/використати\n" "- %s: крастися/лізти вниз\n" "- %s: кинути предмет\n" "- %s: інвентар\n" -"- Мишка: поворот/дивитися\n" -"- Ліва кнопка миші: копати/удар\n" -"- Права кнопка миші: поставити/зробити\n" -"- Колесо миші: вибір предмета\n" +"- Миша: поворот/дивитися\n" +"- Коліщатко миші: вибір предмета\n" "- %s: чат\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "Створення клієнта..." @@ -1223,13 +1471,18 @@ msgstr "Обмежена видимість" msgid "Enabled unlimited viewing range" msgstr "Необмежена видимість (повільно)" +#: src/client/game.cpp +#, c-format +msgid "Error creating client: %s" +msgstr "Помилка створення клієнта: %s" + #: src/client/game.cpp msgid "Exit to Menu" -msgstr "Вихід в меню" +msgstr "Вихід у меню" #: src/client/game.cpp msgid "Exit to OS" -msgstr "Вихід з гри" +msgstr "Вихід із гри" #: src/client/game.cpp msgid "Fast mode disabled" @@ -1296,32 +1549,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "Мінімапа вимкнена грою або модифікацією" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "Мінімапа вимкнена" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "Мінімапа в режимі радар. Наближення х1" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "Мінімапа в режимі радар. Наближення х2" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "Мінімапа в режимі радар. Наближення х4" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "Мінімапа в режимі поверхня. Наближення х1" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "Мінімапа в режимі поверхня. Наближення х2" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "Мінімапа в режимі поверхня. Наближення х4" +msgid "Multiplayer" +msgstr "Багатокористувацька гра" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1341,11 +1570,11 @@ msgstr "Визначення блоків..." #: src/client/game.cpp msgid "Off" -msgstr "Вимкнено" +msgstr "Вимк." #: src/client/game.cpp msgid "On" -msgstr "Увімкнено" +msgstr "Увім." #: src/client/game.cpp msgid "Pitch move mode disabled" @@ -1385,16 +1614,31 @@ 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" msgstr "Звук увімкнено" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1425,23 +1669,23 @@ msgstr "Наближення (бінокль) вимкнено грою або #: src/client/game.cpp msgid "ok" -msgstr "гаразд" +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" -msgstr "Позначки на екрані вимкнено" +msgstr "HUD приховано" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "Позначки на екрані увімкнено" +msgstr "HUD показано" #: src/client/gameui.cpp msgid "Profiler hidden" @@ -1458,16 +1702,12 @@ msgstr "Додатки" #: src/client/keycode.cpp msgid "Backspace" -msgstr "Назад (Backspace)" +msgstr "Backspace" #: src/client/keycode.cpp msgid "Caps Lock" msgstr "Caps Lock" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Очистити" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl" @@ -1490,7 +1730,7 @@ msgstr "Виконати" #: src/client/keycode.cpp msgid "Help" -msgstr "Допомога" +msgstr "Довідка" #: src/client/keycode.cpp msgid "Home" @@ -1618,9 +1858,8 @@ msgid "Numpad 9" msgstr "Num 9" #: src/client/keycode.cpp -#, fuzzy msgid "OEM Clear" -msgstr "Почистити OEM" +msgstr "Очистити OEM" #: src/client/keycode.cpp msgid "Page down" @@ -1678,7 +1917,7 @@ msgstr "Scroll Lock" #. ~ Key name #: src/client/keycode.cpp msgid "Select" -msgstr "Обрати" +msgstr "Вибрати" #: src/client/keycode.cpp msgid "Shift" @@ -1690,7 +1929,7 @@ msgstr "Сон" #: src/client/keycode.cpp msgid "Snapshot" -msgstr "Знімок" +msgstr "Зріз" #: src/client/keycode.cpp msgid "Space" @@ -1716,36 +1955,39 @@ msgstr "Додаткова кнопка 2" msgid "Zoom" msgstr "Збільшити" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "Паролі не збігаються!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Мінімапа вимкнена" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "Зареєструватися і увійти" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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" -"Будь-ласка введіть повторно ваш пароль і натисніть \"Зареєструватися і увійти" -"\", або \"Скасувати\", якщо ви проти." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Мінімапа в режимі радара. Наближення x%d" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Мінімапа в режимі поверхні. Наближення x%d" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Мінімапа в текстурному режимі" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Не вдалося завантажити вебсторінку" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Відкривання вебсторінки" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "Далі" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "Спеціальна = спускатися" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = лізти вниз" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1755,15 +1997,23 @@ msgstr "Автохід" msgid "Automatic jumping" msgstr "Автоматичне перестрибування" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "Назад" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "Змінити камеру" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "Чат" @@ -1816,14 +2066,12 @@ 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" -msgstr "Команда (локальна)" +msgstr "Локальна команда" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" @@ -1831,11 +2079,11 @@ msgstr "Вимкнути звук" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" -msgstr "Наступний слот" +msgstr "Наступний предмет" #: src/gui/guiKeyChangeMenu.cpp msgid "Prev. item" -msgstr "Попередній слот" +msgstr "Попередній предмет" #: src/gui/guiKeyChangeMenu.cpp msgid "Range select" @@ -1843,23 +2091,19 @@ msgstr "Вибір діапазону" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Screenshot" -msgstr "Знімок екрану" +msgstr "Знімок екрана" #: src/gui/guiKeyChangeMenu.cpp msgid "Sneak" msgstr "Крастися" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "Спеціальна" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "Увімкнути HUD" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle chat log" -msgstr "Увімкнути чат (журнал)" +msgstr "Увімкнути журнал чату" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" @@ -1887,16 +2131,12 @@ msgstr "Увімкнути висотний рух" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" -msgstr "виберіть" +msgstr "натисніть клавішу" #: src/gui/guiPasswordChange.cpp msgid "Change" msgstr "Змінити" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "Підтвердити новий пароль" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "Новий пароль" @@ -1905,6 +2145,10 @@ msgstr "Новий пароль" msgid "Old Password" msgstr "Старий пароль" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Паролі не збігаються!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "Вихід" @@ -1914,14 +2158,9 @@ msgid "Muted" msgstr "Звук вимкнено" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "Гучність звуку: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "Ввід " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Гучність звуку: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1930,6 +2169,15 @@ msgstr "Ввід " msgid "LANG_CODE" msgstr "uk" +#: 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" @@ -1941,14 +2189,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Використовувати віртуальний джойстик для активації кнопки \"aux" -"\".\n" -"Якщо увімкнено, віртуальний джойстик також натисне \"aux\", коли поза межами " -"головного кола." +"(Android) Використовувати віртуальний джойстик для активації кнопки " +"\"Aux1\".\n" +"Якщо ввімкнено, віртуальний джойстик також натисне \"Aux1\", коли поза " +"межами головного кола." #: src/settings_translation_file.cpp msgid "" @@ -1961,6 +2209,14 @@ msgid "" "situations.\n" "Range roughly -2 to 2. Multiply by 'scale' for offset in nodes." msgstr "" +"(X,Y,Z) зміщення фракталу від центру світа у одиницях 'масшабу'. \n" +"Використовується для пересування бажаної точки до (0, 0) щоб \n" +"створити придатну точку переродження або для 'наближення' \n" +"до бажаної точки шляхом збільшення 'масштабу'. Значення за \n" +"замовчанням налаштоване для придатної точки переродження \n" +"для множин Мандельбро з параметрами за замовчанням; може \n" +"потребувати зміни у інших ситуаціях. Діапазон приблизно від -2 \n" +"до 2. Помножте на 'масштаб' щоб отримати зміщення у блоках." #: src/settings_translation_file.cpp msgid "" @@ -1972,46 +2228,45 @@ msgid "" "Default is for a vertically-squashed shape suitable for\n" "an island, set all 3 numbers equal for the raw shape." msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = технологія \"parallax occlusion\" з інформацією про криві (швидше).\n" -"1 = технологія \"relief mapping\" (повільніше, більш акуратніше)." +"(X,Y,Z) масштаб фракталу у блоках.\n" +"Фактичний розмір фракталу буде у 2-3 рази більшим. Ці \n" +"числа можуть бути дуже великими, фрактал не обов'язково \n" +"має поміститися у світі. Збільшіть їх щоб 'наблизити' деталі \n" +"фракталу. Числа за замовчанням підходять для вертикально \n" +"стисненої форми, придатної для острова, встановіть усі три \n" +"числа рівними для форми без трансформації." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" +msgstr "2D шум що контролює форму/розмір гребенів гір." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgstr "2D шум що контролює форму/розмір невисоких пагорбів." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgstr "2D шум що контролює форму/розмір ступінчастих гір." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." -msgstr "" +msgstr "2D шум що контролює розмір/імовірність гребенів гірських масивів." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +msgstr "2D шум що контролює розмір/імовірність невисоких пагорбів." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." -msgstr "" +msgstr "2D шум що контролює розмір/імовірність ступінчастих гір." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgstr "2D шум що розміщує долини та русла річок." #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "Об'ємні хмари" +msgstr "Обʼємні хмари" #: src/settings_translation_file.cpp msgid "3D mode" @@ -2019,17 +2274,19 @@ msgstr "3D режим" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" -msgstr "" +msgstr "Величина паралаксу у 3D режимі" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "" +msgstr "3D шум що визначає гігантські каверни." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" +"3D шум що визначає структуру та висоті гір. \n" +"Також визначає структуру висячих островів." #: src/settings_translation_file.cpp msgid "" @@ -2038,22 +2295,26 @@ 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 шум що визначає структуру висячих островів.\n" +"Якщо змінити значення за замовчаням, 'масштаб' шуму (0.7 за замовчанням)\n" +"може потребувати корекції, оскільки функція конічної транформації висячих\n" +"островів має діапазон значень приблизно від -2.0 до 2.0." #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." -msgstr "" +msgstr "3D шум що визначає структуру стін каньйонів річок." #: src/settings_translation_file.cpp msgid "3D noise defining terrain." -msgstr "" +msgstr "3D шум що визначає місцевість." #: src/settings_translation_file.cpp msgid "3D noise for mountain overhangs, cliffs, etc. Usually small variations." -msgstr "" +msgstr "3D шум для виступів гір, скель та ін. Зазвичай невеликі варіації." #: src/settings_translation_file.cpp msgid "3D noise that determines number of dungeons per mapchunk." -msgstr "" +msgstr "3D шум що визначає кількість підземель на фрагмент карти." #: src/settings_translation_file.cpp msgid "" @@ -2068,52 +2329,74 @@ msgid "" "- pageflip: quadbuffer based 3d.\n" "Note that the interlaced mode requires shaders to be enabled." msgstr "" +"Підтримка 3D.\n" +"Зараз підтримуються:\n" +"- none: 3d вимкнено.\n" +"- anaglyph: 3d з блакитно-пурпурними кольорами.\n" +"- interlaced: підтримка полярізаційних екранів з непарними/парним " +"лініями.\n" +"- topbottom: поділ екрану вертикально.\n" +"- sidebyside: поділ екрану горизонтально.\n" +"- crossview: 3d на основі автостереограми.\n" +"- pageflip: 3d на основі quadbuffer.\n" +"Зверніть увагу що режим interlaced потребує ввімкнення шейдерів." + +#: 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 "" +"Вибране зерно карти для нової карти, залиште порожнім для випадково " +"вибраного числа.\n" +"Буде проігноровано якщо новий світ створюється з головного меню." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "Повідомлення що показується усім клієнтам якщо сервер зазнає збою." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" +msgstr "Повідомлення що показується усім клієнтам при вимкненні серверу." #: src/settings_translation_file.cpp msgid "ABM interval" msgstr "Інтервал ABM" #: src/settings_translation_file.cpp -msgid "Absolute limit of queued blocks to emerge" +msgid "ABM time budget" msgstr "" +#: src/settings_translation_file.cpp +msgid "Absolute limit of queued blocks to emerge" +msgstr "Абсолютний ліміт відображення блоків з черги" + #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "Прискорення в повітрі" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." -msgstr "" +msgstr "Прискорення гравітації, у блоках на секунду у квадраті." #: src/settings_translation_file.cpp msgid "Active Block Modifiers" -msgstr "" +msgstr "Модифікатори активних блоків" #: src/settings_translation_file.cpp msgid "Active block management interval" -msgstr "" +msgstr "Інтервал керування активним блоком" #: src/settings_translation_file.cpp msgid "Active block range" -msgstr "" +msgstr "Діапазон активних блоків" #: src/settings_translation_file.cpp msgid "Active object send range" -msgstr "" +msgstr "Діапазон відправлення активних блоків" #: src/settings_translation_file.cpp msgid "" @@ -2121,16 +2404,25 @@ msgid "" "Leave this blank to start a local server.\n" "Note that the address field in the main menu overrides this setting." msgstr "" +"Адреса для приєднання.\n" +"Залиште порожнім щоб запустити локальний сервер.\n" +"Зауважте що поле адреси у головному меню має пріоритет над цим налаштуванням." #: src/settings_translation_file.cpp msgid "Adds particles when digging a node." -msgstr "" +msgstr "Додавати часточки при копанні блока." #: src/settings_translation_file.cpp msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" +"Налаштувати dpi на вашому екрані (тільки не X11/Android), напр. для 4k-" +"екранів." + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" #: src/settings_translation_file.cpp #, c-format @@ -2141,6 +2433,17 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"Налаштувати щільність плавучого шару.\n" +"Збільшуйте значення, щоб збільшити щільність. Може бути позитивним або " +"негативним.\n" +"Значення = 0.0: 50% від обсягу плавучого острова.\n" +"Значення = 2.0 (можна збільшувати залежно від 'mgv7_np_floatland', завжди " +"перевіряйте,\n" +"щоб бути певними) створює твердий шар плавучої землі." + +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "Ім'я адміністратора" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2154,10 +2457,15 @@ msgid "" "This only has significant effect on daylight and artificial\n" "light, it has very little effect on natural night light." msgstr "" +"Змінює криву світла застосовуючи до неї 'гамма-корекцію'.\n" +"Більше значення робить середній і нижчий рівень яскравості освітлення.\n" +"Значення '1.0' залишає криву світла незмінною.\n" +"Це впливає лише на денне і штучне світло,\n" +"воно мало впливає на природне нічне світло." #: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "" +msgid "Always fly fast" +msgstr "Завжди літати швидко" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -2165,7 +2473,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "К-сть повідомлень, які гравець може надіслати протягом 10 секунд." #: src/settings_translation_file.cpp msgid "Amplifies the valleys." @@ -2185,29 +2493,31 @@ msgstr "Анонсувати сервер в цей перелік сервер #: src/settings_translation_file.cpp msgid "Append item name" -msgstr "" +msgstr "Додавати назви предметів" #: src/settings_translation_file.cpp msgid "Append item name to tooltip." -msgstr "" +msgstr "Додавати назви предметів до підказок." #: src/settings_translation_file.cpp msgid "Apple trees noise" -msgstr "" +msgstr "Шум яблунь" #: src/settings_translation_file.cpp msgid "Arm inertia" -msgstr "" +msgstr "Інерція руки" #: src/settings_translation_file.cpp msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" +"Інерція руки забезпечує реалістичніші рухи\n" +"під час руху камери." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" -msgstr "" +msgstr "Запитувати про перезʼєднання під час збою" #: src/settings_translation_file.cpp msgid "" @@ -2225,17 +2535,20 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Audio" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "Клавіша автоматичного руху вперед" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." -msgstr "" +msgstr "Автоматично стрибати на блок вище." #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." -msgstr "" +msgstr "Автоматично звітувати у список серверів." #: src/settings_translation_file.cpp msgid "Autosave screen size" @@ -2243,35 +2556,39 @@ msgstr "Зберігати розмір вікна" #: src/settings_translation_file.cpp msgid "Autoscaling mode" -msgstr "" +msgstr "Режим автомасштабування" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Клавіша Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Клавіша Aux1 для піднімання/спуску" #: src/settings_translation_file.cpp msgid "Backward key" -msgstr "Назад" +msgstr "Клавіша Назад" #: src/settings_translation_file.cpp msgid "Base ground level" -msgstr "" +msgstr "Базовий рівень землі" #: src/settings_translation_file.cpp msgid "Base terrain height." msgstr "Висота основної поверхні." -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "Стандартні права" #: src/settings_translation_file.cpp msgid "Beach noise" -msgstr "" +msgstr "Шум пляжу" #: src/settings_translation_file.cpp msgid "Beach noise threshold" -msgstr "" +msgstr "Поріг пляжного шуму" #: src/settings_translation_file.cpp msgid "Bilinear filtering" @@ -2282,37 +2599,36 @@ 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 msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" +msgstr "Шум біому" #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Bold and italic font path" +msgid "Bobbing" msgstr "" +#: src/settings_translation_file.cpp +msgid "Bold and italic font path" +msgstr "Шлях до жирного і курсивного шрифту" + #: src/settings_translation_file.cpp msgid "Bold and italic monospace font path" -msgstr "" +msgstr "Шлях до жирного і курсивного моноширного шрифту" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold font path" -msgstr "Шлях до шрифту" +msgstr "Шлях до жирного шрифту" #: src/settings_translation_file.cpp msgid "Bold monospace font path" -msgstr "" +msgstr "Шлях до жирного моноширного шрифту" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2323,8 +2639,8 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "Бамп-маппінг" +msgid "Camera" +msgstr "Камера" #: src/settings_translation_file.cpp msgid "" @@ -2348,35 +2664,35 @@ msgstr "Контроль оновлення камери" #: src/settings_translation_file.cpp msgid "Cave noise" -msgstr "" +msgstr "Шум печери" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "" +msgstr "Шум печери #1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "" +msgstr "Шум печери #2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "Ширина печери" #: src/settings_translation_file.cpp msgid "Cave1 noise" -msgstr "" +msgstr "Шум для Печера1" #: src/settings_translation_file.cpp msgid "Cave2 noise" -msgstr "" +msgstr "Шум для Печера2" #: src/settings_translation_file.cpp msgid "Cavern limit" -msgstr "" +msgstr "Обмеження каверни" #: src/settings_translation_file.cpp msgid "Cavern noise" -msgstr "" +msgstr "Шум каверни" #: src/settings_translation_file.cpp msgid "Cavern taper" @@ -2388,7 +2704,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Cavern upper limit" -msgstr "" +msgstr "Верхнє обмеження каверни" #: src/settings_translation_file.cpp msgid "" @@ -2397,36 +2713,32 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Chat commands" +msgstr "Команди чату" + +#: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "Розмір шрифту" +msgstr "Розмір шрифту чату" #: src/settings_translation_file.cpp msgid "Chat key" -msgstr "Чат" +msgstr "Клавіша чату" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "Чат" +msgstr "Рівень журналу чату" #: src/settings_translation_file.cpp msgid "Chat message count limit" -msgstr "" +msgstr "Обмеження к-сті повідомлень чату" #: src/settings_translation_file.cpp msgid "Chat message format" -msgstr "" +msgstr "Формат повідомлень чату" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" @@ -2434,15 +2746,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "Максимальна довжина повідомлення чату" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "Чат" +msgstr "Клавіша увімкнення чату" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "Команди чату" +msgid "Chat weblinks" +msgstr "Вебпосилання чату" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2454,12 +2766,18 @@ msgstr "Кінорежим" #: src/settings_translation_file.cpp msgid "Cinematic mode key" -msgstr "Кінорежим" +msgstr "Клавіша кінорежиму" #: src/settings_translation_file.cpp msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "Клієнт" @@ -2480,6 +2798,11 @@ msgstr "Обмеження можливостей клієнт-модифіка 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 "" @@ -2504,6 +2827,10 @@ msgstr "Хмари в меню" msgid "Colored fog" msgstr "Кольоровий туман" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Кольорові тіні" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2529,7 +2856,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Command key" -msgstr "Команда" +msgstr "Клавіша команди" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" #: src/settings_translation_file.cpp msgid "Connect glass" @@ -2555,14 +2898,21 @@ msgstr "Колір консолі" msgid "Console height" msgstr "Висота консолі" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "Репозиторій додатків" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + +#: src/settings_translation_file.cpp msgid "ContentDB URL" -msgstr "Додатки" +msgstr "URL ContentDB" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -2586,7 +2936,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 @@ -2606,7 +2958,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Crash message" -msgstr "" +msgstr "Повідомлення збою" #: src/settings_translation_file.cpp msgid "Creative" @@ -2617,7 +2969,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2625,7 +2979,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2638,7 +2994,7 @@ msgstr "Поранення" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "" +msgstr "Клавіша увімкнення даних налагодження" #: src/settings_translation_file.cpp msgid "Debug log file size threshold" @@ -2646,15 +3002,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Debug log level" +msgstr "Рівень журналу зневадження" + +#: src/settings_translation_file.cpp +msgid "Debugging" msgstr "" #: src/settings_translation_file.cpp msgid "Dec. volume key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" +msgstr "Клавіша зменш. гучності" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2686,17 +3042,17 @@ msgstr "Стандартні права" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "Типовий формат звіту" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "Стандартна гра" +msgstr "Типовий розмір стеку" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2727,12 +3083,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2803,6 +3153,14 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "Налаштування для розробників" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Клавіша Копати" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "Часточки при копанні" @@ -2815,6 +3173,16 @@ msgstr "Вимкнути античіт" msgid "Disallow empty passwords" msgstr "Заборонити порожні паролі" +#: src/settings_translation_file.cpp +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 "Доменне ім'я сервера, яке буде показуватися у списку серверів." @@ -2829,7 +3197,7 @@ msgstr "Подвійне натискання кнопки стрибка вми #: src/settings_translation_file.cpp msgid "Drop item key" -msgstr "Кнопка для викидання предметів" +msgstr "Клавіша викидання предметів" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug information." @@ -2860,17 +3228,34 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable console window" +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." msgstr "" +#: src/settings_translation_file.cpp +msgid "Enable console window" +msgstr "Дозволити вікно консолі" + +#: src/settings_translation_file.cpp +msgid "Enable creative mode for all players" +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 "" @@ -2887,22 +3272,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2949,15 +3328,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" +msgstr "Дозволити анімацію предметів інвентаря." #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." @@ -2967,18 +3338,6 @@ msgstr "" msgid "Enables minimap." msgstr "Вмикає мінімапу." -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2987,6 +3346,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2995,12 +3364,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3012,9 +3375,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" msgstr "" +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS, коли призупинено або поза фокусом" + #: src/settings_translation_file.cpp msgid "FSAA" msgstr "" @@ -3028,25 +3395,12 @@ msgid "Fall bobbing factor" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Fallback font path" -msgstr "Шлях до шрифту" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" +msgstr "Шлях до резервного шрифту" #: src/settings_translation_file.cpp msgid "Fast key" -msgstr "" +msgstr "Швидка клавіша" #: src/settings_translation_file.cpp msgid "Fast mode acceleration" @@ -3054,15 +3408,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Fast mode speed" -msgstr "" +msgstr "Швидкість швидкого режиму" #: src/settings_translation_file.cpp msgid "Fast movement" -msgstr "" +msgstr "Швидкі рухи" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3096,14 +3450,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" -msgstr "Фільтрація" +msgid "Filtering and Antialiasing" +msgstr "Фільтрування і Згладжування:" #: src/settings_translation_file.cpp msgid "First of 4 2D noises that together define hill/mountain range height." @@ -3151,11 +3505,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Fly key" -msgstr "Кнопка для польоту" +msgstr "Клавіша польоту" #: src/settings_translation_file.cpp msgid "Flying" -msgstr "" +msgstr "Політ" #: src/settings_translation_file.cpp msgid "Fog" @@ -3167,38 +3521,42 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Fog toggle key" -msgstr "" +msgstr "Клавіша ввімкнення туману" + +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "Шрифт" #: src/settings_translation_file.cpp msgid "Font bold by default" -msgstr "" +msgstr "Типовий грубий шрифт" #: src/settings_translation_file.cpp msgid "Font italic by default" -msgstr "" +msgstr "Типовий похилий шрифт" #: src/settings_translation_file.cpp msgid "Font shadow" -msgstr "" +msgstr "Тінь шрифту" #: src/settings_translation_file.cpp msgid "Font shadow alpha" -msgstr "" +msgstr "Альфа-тінь шрифту" #: src/settings_translation_file.cpp msgid "Font size" msgstr "Розмір шрифту" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3207,6 +3565,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3216,7 +3585,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Format of screenshots." -msgstr "" +msgstr "Формат знімків екрана." #: src/settings_translation_file.cpp msgid "Formspec Default Background Color" @@ -3252,7 +3621,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Forward key" -msgstr "Вперед" +msgstr "Клавіша Вперед" #: src/settings_translation_file.cpp msgid "Fourth of 4 2D noises that together define hill/mountain range height." @@ -3266,10 +3635,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3294,10 +3659,6 @@ msgstr "" msgid "Full screen" msgstr "Повний екран" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "Повноекранний режим." @@ -3315,8 +3676,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "Генерувати карти нормалів" +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" @@ -3326,7 +3695,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3345,6 +3714,14 @@ msgstr "" 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 "Гравітація" @@ -3362,18 +3739,22 @@ msgid "HTTP mods" msgstr "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 msgid "HUD toggle key" -msgstr "" +msgstr "Клавіша ввімкнення HUD" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3395,7 +3776,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3406,10 +3788,6 @@ msgstr "Висотний шум" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3466,135 +3844,135 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Hotbar slot 1 key" -msgstr "" +msgstr "Клавіша слоту 1 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 10 key" -msgstr "" +msgstr "Клавіша слоту 10 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 11 key" -msgstr "" +msgstr "Клавіша слоту 11 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 12 key" -msgstr "" +msgstr "Клавіша слоту 12 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 13 key" -msgstr "" +msgstr "Клавіша слоту 13 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 14 key" -msgstr "" +msgstr "Клавіша слоту 14 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 15 key" -msgstr "" +msgstr "Клавіша слоту 15 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 16 key" -msgstr "" +msgstr "Клавіша слоту 16 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 17 key" -msgstr "" +msgstr "Клавіша слоту 17 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 18 key" -msgstr "" +msgstr "Клавіша слоту 18 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 19 key" -msgstr "" +msgstr "Клавіша слоту 19 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 2 key" -msgstr "" +msgstr "Клавіша слоту 2 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 20 key" -msgstr "" +msgstr "Клавіша слоту 20 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 21 key" -msgstr "" +msgstr "Клавіша слоту 21 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 22 key" -msgstr "" +msgstr "Клавіша слоту 22 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 23 key" -msgstr "" +msgstr "Клавіша слоту 23 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 24 key" -msgstr "" +msgstr "Клавіша слоту 24 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 25 key" -msgstr "" +msgstr "Клавіша слоту 25 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 26 key" -msgstr "" +msgstr "Клавіша слоту 26 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 27 key" -msgstr "" +msgstr "Клавіша слоту 27 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 28 key" -msgstr "" +msgstr "Клавіша слоту 28 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 29 key" -msgstr "" +msgstr "Клавіша слоту 29 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 3 key" -msgstr "" +msgstr "Клавіша слоту 3 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 30 key" -msgstr "" +msgstr "Клавіша слоту 30 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 31 key" -msgstr "" +msgstr "Клавіша слоту 31 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 32 key" -msgstr "" +msgstr "Клавіша слоту 32 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 4 key" -msgstr "" +msgstr "Клавіша слоту 4 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 5 key" -msgstr "" +msgstr "Клавіша слоту 5 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 6 key" -msgstr "" +msgstr "Клавіша слоту 6 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 7 key" -msgstr "" +msgstr "Клавіша слоту 7 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 8 key" -msgstr "" +msgstr "Клавіша слоту 8 швидкої панелі" #: src/settings_translation_file.cpp msgid "Hotbar slot 9 key" -msgstr "" +msgstr "Клавіша слоту 9 швидкої панелі" #: src/settings_translation_file.cpp msgid "How deep to make rivers." -msgstr "" +msgstr "Як глибоко робити ріки." #: src/settings_translation_file.cpp msgid "" @@ -3605,14 +3983,21 @@ 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 wide to make rivers." +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 "Як широко робити ріки." + #: src/settings_translation_file.cpp msgid "Humidity blend noise" msgstr "" @@ -3641,8 +4026,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3664,11 +4048,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3692,7 +4082,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 @@ -3709,6 +4101,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3723,11 +4121,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Ignore world errors" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "In-Game" -msgstr "У грі" +msgstr "Ігнорувати помилки світу" #: src/settings_translation_file.cpp msgid "In-game chat console background alpha (opaqueness, between 0 and 255)." @@ -3743,7 +4137,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Inc. volume key" -msgstr "Збільшити гучність" +msgstr "Клавіша збільш. гучності" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." @@ -3756,7 +4150,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3779,42 +4173,37 @@ msgstr "" 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 msgid "Inventory items animations" -msgstr "" +msgstr "Анімація предметів інвентаря" #: src/settings_translation_file.cpp msgid "Inventory key" -msgstr "Інвентар" +msgstr "Клавіша інвентаря" #: src/settings_translation_file.cpp msgid "Invert mouse" -msgstr "" +msgstr "Інвертувати мишку" #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." -msgstr "" +msgstr "Інвертувати вертикальні рухи мишки." #: src/settings_translation_file.cpp -#, fuzzy msgid "Italic font path" -msgstr "Шлях до шрифту" +msgstr "Шлях до похилого шрифту" #: src/settings_translation_file.cpp msgid "Italic monospace font path" -msgstr "" +msgstr "Шлях до похилого моноширного шрифту" #: src/settings_translation_file.cpp msgid "Item entity TTL" @@ -3822,7 +4211,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Iterations" -msgstr "" +msgstr "Ітерації" #: src/settings_translation_file.cpp msgid "" @@ -3834,19 +4223,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Joystick ID" -msgstr "" +msgstr "ІД джойстика" #: src/settings_translation_file.cpp msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" #: src/settings_translation_file.cpp msgid "Joystick type" -msgstr "" +msgstr "Тип джойстика" #: src/settings_translation_file.cpp msgid "" @@ -3899,11 +4292,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Jump key" -msgstr "Стрибок" +msgstr "Клавіша Стрибок" #: src/settings_translation_file.cpp msgid "Jumping speed" -msgstr "" +msgstr "Швидкість стрибання" #: src/settings_translation_file.cpp msgid "" @@ -3911,6 +4304,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для зменшення видимості.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3918,6 +4314,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для зменшення гучності.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавіша для копання.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3925,6 +4334,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для кидання поточного предмета.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3932,6 +4344,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для збільшення видимості.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3939,6 +4354,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для збільшення гучності.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3946,6 +4364,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для стрибання.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3953,6 +4374,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для швидкого руху у швидкому режимі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3968,6 +4392,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для руху гравця вперед.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3975,6 +4402,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для руху гравця вліво.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3982,6 +4412,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для руху гравця вправо.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3989,6 +4422,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для приглушення гри.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -3996,6 +4432,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для відкривання вікна чату для введення команд.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4003,6 +4442,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для відкривання вікна чату для набирання локальних команд.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4010,6 +4452,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для відкривання вікна чату.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4017,6 +4462,19 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для відкривання інвентаря.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"Клавіша покласти.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4024,6 +4482,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 11-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4031,6 +4492,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 12-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4038,6 +4502,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 13-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4045,6 +4512,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 14-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4052,6 +4522,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 15-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4059,6 +4532,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 16-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4066,6 +4542,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 17-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4073,6 +4552,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 18-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4080,6 +4562,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 19-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4087,6 +4572,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша для вибору 20-го слоту швидкої панелі.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4362,6 +4850,9 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +"Клавіша ввімкнення відображення HUD.\n" +"Дивіться http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" #: src/settings_translation_file.cpp msgid "" @@ -4391,6 +4882,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4447,7 +4942,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 @@ -4457,15 +4952,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 @@ -4477,7 +4975,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4504,6 +5003,10 @@ msgstr "" 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" @@ -4573,28 +5076,28 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Main menu script" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "Стиль головного меню" +msgstr "Скрипт основного меню" #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "" - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + #: src/settings_translation_file.cpp msgid "Map directory" -msgstr "Тека мапи" +msgstr "Каталог мапи" #: src/settings_translation_file.cpp msgid "Map generation attributes specific to Mapgen Carpathian." @@ -4651,6 +5154,10 @@ msgstr "Межі генерації мапи" msgid "Map save interval" msgstr "Інтервал збереження мапи" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4688,9 +5195,8 @@ msgid "Mapgen Fractal" msgstr "Генератор світу: фрактальний" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen Fractal specific flags" -msgstr "Генератор світу: фрактальний" +msgstr "Мітки для фрактального ґенератора світу" #: src/settings_translation_file.cpp msgid "Mapgen V5" @@ -4725,14 +5231,12 @@ msgid "Mapgen Valleys specific flags" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen debug" -msgstr "Налагодження генерації світу" +msgstr "Налагодження ґенератора світу" #: src/settings_translation_file.cpp -#, fuzzy msgid "Mapgen name" -msgstr "Назва генерації світу" +msgstr "Назва ґенератора світу" #: src/settings_translation_file.cpp msgid "Max block generate distance" @@ -4743,28 +5247,28 @@ msgid "Max block send distance" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Max liquids processed per step." -msgstr "Максимальна кількість рідин, оброблених на крок." +msgstr "Найбільша кількість рідини на крок." #: src/settings_translation_file.cpp msgid "Max. clearobjects extra blocks" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy msgid "Max. packets per iteration" -msgstr "Максимальна кількість пакетів за одну ітерацію" +msgstr "Найбільша кількість пакетів на ітерацію" #: src/settings_translation_file.cpp -#, fuzzy msgid "Maximum FPS" -msgstr "Максимальна кількість кадрів в секунду (FPS)" +msgstr "Найбільша кількість FPS" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Maximum FPS when game is paused." -msgstr "Максимум FPS при паузі." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "Найбільша кількість FPS, коли вікно поза фокусом або гру призупинено." + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -4811,6 +5315,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4842,7 +5353,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Maximum objects per block" -msgstr "" +msgstr "Найбільша кількість обʼєктів на блок" #: src/settings_translation_file.cpp msgid "" @@ -4865,16 +5376,20 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" -msgstr "Максимум користувачів" - -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "Меню" +msgstr "Найбільше користувачів" #: src/settings_translation_file.cpp msgid "Mesh cache" @@ -4882,7 +5397,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Message of the day" -msgstr "" +msgstr "Повідомлення дня" #: src/settings_translation_file.cpp msgid "Message of the day displayed to players connecting." @@ -4902,7 +5417,7 @@ msgstr "Мінімапа" #: src/settings_translation_file.cpp msgid "Minimap key" -msgstr "" +msgstr "Клавіша мінімапи" #: src/settings_translation_file.cpp msgid "Minimap scan height" @@ -4924,20 +5439,36 @@ msgstr "" msgid "Mipmapping" msgstr "Mіп-текстурування" +#: 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." -msgstr "" +msgid "Modifies the size of the HUD elements." +msgstr "Змінює розмір елементів HUD." #: src/settings_translation_file.cpp msgid "Monospace font path" -msgstr "" +msgstr "Шлях до моноширного шрифту" #: src/settings_translation_file.cpp msgid "Monospace font size" +msgstr "Розмір моноширного шрифту" + +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" msgstr "" #: src/settings_translation_file.cpp @@ -4980,7 +5511,7 @@ msgstr "Вимкнути звук" #: src/settings_translation_file.cpp msgid "Mute sound" -msgstr "" +msgstr "Заглушити звук" #: src/settings_translation_file.cpp msgid "" @@ -5006,16 +5537,16 @@ msgstr "" 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 "" @@ -5028,6 +5559,10 @@ msgstr "Прохід крізь стіни" msgid "Noclip key" msgstr "Клавіша проходу крізь стіни" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "Підсвічування блоків і предметів" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -5038,15 +5573,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Noises" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" +msgstr "Шуми" #: src/settings_translation_file.cpp msgid "Number of emerge threads" @@ -5069,18 +5596,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5090,11 +5609,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5103,38 +5617,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." +msgid "Optional override for chat weblink color." msgstr "" -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "Паралаксова оклюзія" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "Ступінь паралаксової оклюзії" - #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5157,17 +5645,13 @@ msgstr "Шлях до теки з текстурами. Всі текстури #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5188,24 +5672,27 @@ msgid "Physics" msgstr "Фізика" #: src/settings_translation_file.cpp -#, fuzzy msgid "Pitch move key" -msgstr "Кнопка польоту" +msgstr "Клавіша зміни висоти" #: src/settings_translation_file.cpp msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Place key" +msgstr "Клавіша покласти" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "" + #: 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 "Ім'я гравця" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "" @@ -5214,6 +5701,10 @@ msgstr "" msgid "Player versus player" msgstr "Гравець проти гравця" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "Фільтрування Пуасона" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5248,10 +5739,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5259,9 +5746,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5289,20 +5776,19 @@ msgstr "Вибір діапазону" #: src/settings_translation_file.cpp msgid "Recent Chat Messages" -msgstr "" +msgstr "Останні повідомлення чату" #: src/settings_translation_file.cpp -#, fuzzy msgid "Regular font path" -msgstr "Шлях для звіту" +msgstr "Шлях до звичайного шрифту" #: src/settings_translation_file.cpp msgid "Remote media" -msgstr "" +msgstr "Віддалені ресурси" #: src/settings_translation_file.cpp msgid "Remote port" -msgstr "" +msgstr "Віддалений порт" #: src/settings_translation_file.cpp msgid "" @@ -5353,13 +5839,8 @@ msgid "Right key" msgstr "Права клавіша" #: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "River channel depth" -msgstr "Глибина великих печер" +msgstr "Глибина каналу річки" #: src/settings_translation_file.cpp msgid "River channel width" @@ -5367,7 +5848,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "River depth" -msgstr "" +msgstr "Глибина річки" #: src/settings_translation_file.cpp msgid "River noise" @@ -5375,7 +5856,7 @@ msgstr "Річковий шум" #: src/settings_translation_file.cpp msgid "River size" -msgstr "" +msgstr "Розмір річки" #: src/settings_translation_file.cpp msgid "River valley width" @@ -5426,6 +5907,10 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "Екран" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "Висота екрана" @@ -5436,7 +5921,7 @@ msgstr "Ширина екрана" #: src/settings_translation_file.cpp msgid "Screenshot folder" -msgstr "" +msgstr "Тека для знімків екрана" #: src/settings_translation_file.cpp msgid "Screenshot format" @@ -5453,6 +5938,10 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "Знімки екрана" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5465,10 +5954,6 @@ msgstr "" 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 "" @@ -5509,8 +5994,17 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "Сервер / Гра" +msgid "Server" +msgstr "Сервер" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "Геймплей Сервера" + +#: src/settings_translation_file.cpp +msgid "Server Security" +msgstr "Безпека Сервера" #: src/settings_translation_file.cpp msgid "Server URL" @@ -5536,13 +6030,22 @@ msgstr "Порт сервера" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Швидкість Сервера/Env" + #: src/settings_translation_file.cpp msgid "Serverlist URL" -msgstr "Адреса списку публічних серверів" +msgstr "Адреса списку серверів" + +#: src/settings_translation_file.cpp +msgid "Serverlist and MOTD" +msgstr "Список серверів і Повідомлення Дня" #: src/settings_translation_file.cpp msgid "Serverlist file" -msgstr "Файл списку публічних серверів" +msgstr "Файл списку серверів" #: src/settings_translation_file.cpp msgid "" @@ -5553,7 +6056,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5574,6 +6105,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "Шлях до шейдерів" @@ -5586,6 +6124,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "Якість фільтру тіні" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5593,9 +6147,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5604,15 +6156,27 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Show debug info" -msgstr "" +msgstr "Показати дані зневадження" #: src/settings_translation_file.cpp msgid "Show entity selection boxes" msgstr "" #: src/settings_translation_file.cpp -msgid "Shutdown message" +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." msgstr "" +"Показати поле виділення обʼєктів\n" +"Після зміни потрібно перезапустити." + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shutdown message" +msgstr "Вимкнути повідомлення" #: src/settings_translation_file.cpp msgid "" @@ -5631,6 +6195,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5685,18 +6253,14 @@ msgstr "Швидкість підкрадання" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "Радіус легких тіней" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "Звук" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "Спеціальна клавіша" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "Спеціальна клавіша для руху вгору/вниз" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5712,6 +6276,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5739,10 +6311,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5780,6 +6348,10 @@ msgstr "" 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 "" @@ -5822,6 +6394,13 @@ msgstr "" msgid "Texture path" msgstr "Шлях до текстури" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5836,6 +6415,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "Мертва зона джойстика" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5891,18 +6474,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5920,6 +6503,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5928,14 +6517,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp msgid "The type of joystick" -msgstr "" +msgstr "Тип джойстика" #: src/settings_translation_file.cpp msgid "" @@ -5960,14 +6548,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Time send interval" -msgstr "" +msgstr "Період надсилання часу" #: src/settings_translation_file.cpp msgid "Time speed" -msgstr "" +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 @@ -5991,9 +6579,21 @@ msgid "Touch screen threshold" msgstr "Межа чутливості дотику" #: src/settings_translation_file.cpp -msgid "Trees noise" +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 "Шум дерев" + #: src/settings_translation_file.cpp msgid "Trilinear filtering" msgstr "Трилінійна фільтрація" @@ -6060,15 +6660,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6162,18 +6777,20 @@ msgid "Viewing range" msgstr "Видимість" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp msgid "Volume" -msgstr "Гучність звуку" +msgstr "Гучність" #: src/settings_translation_file.cpp msgid "" "Volume of all sounds.\n" "Requires the sound system to be enabled." msgstr "" +"Гучність усіх звуків.\n" +"Вимагає увімкнення системи звуку." #: src/settings_translation_file.cpp msgid "" @@ -6186,11 +6803,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Walking and flying speed, in nodes per second." -msgstr "" +msgstr "Швидкість ходьби і польоту, в блоках за секунду." #: src/settings_translation_file.cpp msgid "Walking speed" -msgstr "" +msgstr "Швидкість ходьби" #: src/settings_translation_file.cpp msgid "Walking, flying and climbing speed in fast mode, in nodes per second." @@ -6198,7 +6815,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Water level" -msgstr "" +msgstr "Рівень води" #: src/settings_translation_file.cpp msgid "Water surface level of the world." @@ -6206,35 +6823,35 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Waving Nodes" -msgstr "Блоки, що коливаються" +msgstr "Коливання блоків" #: src/settings_translation_file.cpp msgid "Waving leaves" -msgstr "Листя, що коливається" +msgstr "Коливання листя" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" -msgstr "Хвилясті Рідини" +msgstr "Хвилясті рідини" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "Коливати воду" +msgstr "Висота хвилі хвилястих рідин" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" -msgstr "Коливати листя" +msgstr "Швидкість хвилі хвилястих рідин" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" -msgstr "Коливати воду" +msgstr "Довжина хвилі хвилястих рідин" #: src/settings_translation_file.cpp msgid "Waving plants" -msgstr "" +msgstr "Коливання рослин" + +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "Колір вебпосилання" #: src/settings_translation_file.cpp msgid "" @@ -6257,18 +6874,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6303,13 +6918,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6393,41 +7017,218 @@ msgstr "Y-Рівень нижнього рельєфу та морського 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- Творчість: " -#~ msgid "Toggle Cinematic" -#~ msgstr "Кінематографічний режим" +#~ msgid "- Damage: " +#~ msgstr "- Ушкодження: " -#~ msgid "Content Store" -#~ msgstr "Додатки" +#~ msgid "" +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." +#~ msgstr "" +#~ "0 = технологія \"parallax occlusion\" з інформацією про криві (швидше).\n" +#~ "1 = технологія \"relief mapping\" (повільніше, більш акуратніше)." -#~ msgid "Select Package File:" -#~ msgstr "Виберіть файл пакунку:" +#~ msgid "Address / Port" +#~ msgstr "Адреса / Порт" -#~ msgid "Lava depth" -#~ msgstr "Глибина лави" - -#~ msgid "IPv6 support." -#~ msgstr "Підтримка IPv6." - -#~ msgid "Enable VBO" -#~ msgstr "Увімкнути VBO" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "Завантаження і встановлення $1, зачекайте..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "Ви впевнені, що бажаєте скинути свій світ одиночної гри?" #~ msgid "Back" #~ msgstr "Назад" +#~ msgid "Basic" +#~ msgstr "Основи" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "Бітів на піксель (глибина кольору) в повноекранному режимі." + +#~ msgid "Bump Mapping" +#~ msgstr "Бамп-маппінг" + +#~ msgid "Bumpmapping" +#~ msgstr "Бамп-маппінг" + +#~ msgid "Config mods" +#~ msgstr "Налаштувати модифікації" + +#~ msgid "Configure" +#~ msgstr "Налаштувати" + +#~ msgid "Connect" +#~ msgstr "Зʼєднатися" + +#~ msgid "Content Store" +#~ msgstr "Додатки" + +#~ msgid "Credits" +#~ msgstr "Подяки" + +#~ msgid "Damage enabled" +#~ 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 "Downloading and installing $1, please wait..." +#~ msgstr "Завантаження і встановлення $1, зачекайте..." + +#~ msgid "Enable VBO" +#~ msgstr "Увімкнути VBO" + +#~ msgid "Enter " +#~ msgstr "Ввід " + +#~ msgid "Filtering" +#~ msgstr "Фільтрація" + +#~ msgid "Game" +#~ msgstr "Гра" + +#~ msgid "Generate Normal Maps" +#~ msgstr "Генерувати мапи нормалів" + +#~ msgid "Generate normalmaps" +#~ msgstr "Генерувати карти нормалів" + +#~ msgid "IPv6 support." +#~ msgstr "Підтримка IPv6." + +#~ msgid "In-Game" +#~ msgstr "У грі" + +#~ msgid "Install: file: \"$1\"" +#~ msgstr "Встановлення: файл: \"$1\"" + +#~ msgid "" +#~ "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" +#~ msgstr "" +#~ "Комбінації клавіш. (Якщо це меню зламалося, видаліть налаштування з " +#~ "minetest.conf)" + +#~ msgid "Lava depth" +#~ msgstr "Глибина лави" + +#~ msgid "Main" +#~ msgstr "Головне Меню" + +#~ msgid "Main menu style" +#~ msgstr "Стиль головного меню" + +#~ msgid "Menus" +#~ msgstr "Меню" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "Мінімапа в режимі радар. Наближення х2" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "Мінімапа в режимі радар. Наближення х4" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "Мінімапа в режимі поверхня. Наближення х2" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "Мінімапа в режимі поверхня. Наближення х4" + +#~ msgid "Name / Password" +#~ msgstr "Ім'я / Пароль" + +#~ msgid "Name/Password" +#~ msgstr "Ім'я/Пароль" + +#~ msgid "No" +#~ msgstr "Ні" + #~ msgid "Ok" #~ msgstr "Добре" + +#~ msgid "Parallax Occlusion" +#~ msgstr "Паралаксова оклюзія" + +#~ msgid "Parallax occlusion" +#~ msgstr "Паралаксова оклюзія" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "Ступінь паралаксової оклюзії" + +#~ msgid "Player name" +#~ msgstr "Імʼя гравця" + +#~ msgid "PvP enabled" +#~ msgstr "Бої увімкнено" + +#~ msgid "Reset singleplayer world" +#~ msgstr "Скинути світ одиночної гри" + +#~ msgid "Select Package File:" +#~ msgstr "Виберіть файл пакунку:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "Сервер / Одиночна гра" + +#~ msgid "Special" +#~ msgstr "Спеціальна" + +#~ msgid "Special key" +#~ msgstr "Спеціальна клавіша" + +#~ msgid "Start Singleplayer" +#~ msgstr "Почати одиночну гру" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "Для того, щоб увімкнути шейдери, потрібно мати драйвер OpenGL." + +#~ msgid "Toggle Cinematic" +#~ msgstr "Кінематографічний режим" + +#~ msgid "View" +#~ 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 "Ви загинули" + +#~ msgid "needs_fallback_font" +#~ msgstr "no" diff --git a/po/vi/minetest.po b/po/vi/minetest.po index f2574e132..aaaf891bf 100644 --- a/po/vi/minetest.po +++ b/po/vi/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Vietnamese (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-13 21:08+0000\n" -"Last-Translator: darkcloudcat <leducthn@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: Hùng Nguyễn <www.thuphan@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/minetest/" "minetest/vi/>\n" "Language: vi\n" @@ -12,7 +12,43 @@ 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.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "Xóa hàng đợi trò chuyện" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "Lệnh trống." + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "Thoát ra màn hình chính" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "Lệnh không hợp lệ: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "Lệnh đã dùng: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "Liệt kê người chơi đang trực tuyến" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "Người chơi đang trực tuyến: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "Hàng đợi trò chuyện đã trống." + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "Lệnh này đã bị cấm bởi máy chủ." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -20,23 +56,54 @@ msgstr "Hồi sinh" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "You died" -msgstr "Bạn đã chết" +msgstr "Bạn đã bị chết" + +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "Lệnh có sẵn:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "Lệnh có sẵn: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "Lệnh không có sẵn: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "Trợ giúp về lệnh" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" +"Dùng '.help <câu lệnh>' để có thêm thông tin về một câu lệnh hoặc dùng '." +"help all' để xem danh sách về những câu lệnh có sẵn." + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "[all | <câu lệnh>]" #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<không có sẵn>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" -msgstr "Đã xảy ra lỗi trong tập lệnh Lua:" +msgstr "Một lỗi đã xảy ra trong tập lệnh Lua:" #: builtin/fstk/ui.lua msgid "An error occurred:" -msgstr "Xảy ra lỗi:" +msgstr "Đã xảy ra lỗi:" #: builtin/fstk/ui.lua msgid "Main menu" -msgstr "Trình đơn chính" +msgstr "Màn hình chính" #: builtin/fstk/ui.lua msgid "Reconnect" @@ -46,13 +113,38 @@ msgstr "Kết nối lại" msgid "The server has requested a reconnect:" msgstr "Máy chủ đã yêu cầu kết nối lại:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "Đang tải..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "Phiên bản mới $1 hiện có sẵn" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "Mod đã chọ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 "" +"Phiên bản đã cài đặt: $1\n" +"Phiên bản mới: $2\n" +"Truy cập $3 để biết cách tải phiên bản mới nhất với các tính năng mới và bản " +"sửa lỗi." + +#: builtin/mainmenu/common.lua +msgid "Later" +msgstr "Để sau" + +#: builtin/mainmenu/common.lua +msgid "Never" +msgstr "Không bao giờ" #: builtin/mainmenu/common.lua msgid "Protocol version mismatch. " -msgstr "Phiên bản giao thức không khớp " +msgstr "Phiên bản giao thức không khớp. " #: builtin/mainmenu/common.lua msgid "Server enforces protocol version $1. " @@ -63,10 +155,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "Máy chủ hỗ trợ các phiên bản giao thức trong khoảng từ $1 đến $2. " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "" -"Hãy thử kích hoạt lại danh sách máy chủ công cộng và kiểm tra kết nối " -"internet của bạn." +msgid "Visit website" +msgstr "Truy cập website" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -76,17 +166,26 @@ msgstr "Chúng tôi chỉ hỗ trợ phiên bản giao thức $1." msgid "We support protocol versions between version $1 and $2." msgstr "Chúng tôi hỗ trợ các phiên bản giao thức giữa phiên bản $1 đến $2." -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: builtin/mainmenu/dlg_config_world.lua +msgid "(Enabled, has error)" +msgstr "(Đã kích hoạt, có lỗi)" + +#: 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 "Hủy bỏ" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "Phụ thuộc:" @@ -100,7 +199,7 @@ msgstr "Vô hiệu hóa modpack" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable all" -msgstr "Cho phép tất cả" +msgstr "Kích hoạt tất cả" #: builtin/mainmenu/dlg_config_world.lua msgid "Enable modpack" @@ -111,435 +210,546 @@ msgid "" "Failed to enable mod \"$1\" as it contains disallowed characters. Only " "characters [a-z0-9_] are allowed." msgstr "" -"Không thể bật mod \"$ 1\" vì nó chứa các ký tự không được phép. Chỉ cho phép " -"các ký tự [a-z0-9_]." +"Không thể kích hoạt mod \"$1\" vì chứa các ký tự không được phép. Các ký tự " +"được phép bao gồm chữ cái Latin, chữ số và ký tự \"_\"." #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "Tìm thêm mod" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" msgstr "Mod:" #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No (optional) dependencies" -msgstr "Phụ thuộc tùy chọn:" +msgstr "Không có phần phụ thuộc (tùy chọn) nào" #: builtin/mainmenu/dlg_config_world.lua msgid "No game description provided." msgstr "Không có mô tả trò chơi được cung cấp." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No hard dependencies" -msgstr "Phụ thuộc tùy chọn:" +msgstr "Không có phần phụ thuộc bắt buộc nào" #: builtin/mainmenu/dlg_config_world.lua msgid "No modpack description provided." msgstr "Không có mô tả modpack được cung cấp." #: builtin/mainmenu/dlg_config_world.lua -#, fuzzy msgid "No optional dependencies" -msgstr "Phụ thuộc tùy chọn:" +msgstr "Không có phần phụ thuộc tùy chọn nào" #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua msgid "Optional dependencies:" -msgstr "Phụ thuộc tùy chọn:" +msgstr "Phần phụ thuộc tùy chọn:" #: builtin/mainmenu/dlg_config_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua src/gui/guiKeyChangeMenu.cpp msgid "Save" -msgstr "Tiết kiệm" +msgstr "Lưu" #: builtin/mainmenu/dlg_config_world.lua msgid "World:" -msgstr "Thế giới" +msgstr "Thế giới:" #: builtin/mainmenu/dlg_config_world.lua msgid "enabled" -msgstr "kích hoạt" +msgstr "đã kích hoạt" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\" đã tồn tại. Bạn có muốn ghi đè nó không?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "Phần phụ thuộc $1 và $2 sẽ được cài đặt." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" +"$1 đang tải xuống,\n" +"$2 đã thêm vào hàng chờ" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "Đang tải xuống $1..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "Không tìm thấy phần phụ thuộc cần cho $1." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 sẽ được cài đặt, phần phụ thuộc $2 sẽ bị bỏ qua." #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "Tất cả các gói" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "Đã được cài đặt" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" -msgstr "" +msgstr "Trở về màn hình chính" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "Trò chơi cơ bản:" #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgstr "ContentDB không có sẵn khi Minetest được biên dịch mà không có cURL" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "Đang tải..." +msgstr "Đang tải xuống..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" -msgstr "" +msgstr "Đã xảy ra lỗi khi tải xuống $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "Trò chơi" #: builtin/mainmenu/dlg_contentstore.lua msgid "Install" -msgstr "" +msgstr "Cài đặt" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install $1" +msgstr "Cài đặt $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "Cài đặt phần phụ thuộc bị thiếu" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "Cài đặt: Loại tệp không được hỗ trợ hoặc tệp lưu trữ bị hỏng" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Mods" msgstr "Mod" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" -msgstr "" +msgstr "Không nhận được gói nào" #: builtin/mainmenu/dlg_contentstore.lua msgid "No results" -msgstr "" +msgstr "Không có kết quả" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "" +msgid "No updates" +msgstr "Không có cập nhật mới" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "Không tìm thấy" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "Ghi đè" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "Vui lòng kiểm tra xem trò chơi này có đúng không." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "Đã thêm vào hàng chờ" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" -msgstr "" +msgstr "Gói kết cấu" #: builtin/mainmenu/dlg_contentstore.lua msgid "Uninstall" -msgstr "" +msgstr "Gỡ cài đặt" #: builtin/mainmenu/dlg_contentstore.lua msgid "Update" -msgstr "" +msgstr "Cập nhật" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "Cập nhật tất cả [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "Xem thêm thông tin trên trình duyệt web của bạn" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "" +msgstr "Thế giới với tên \"$1\" đã tồn tại" #: builtin/mainmenu/dlg_create_world.lua msgid "Additional terrain" -msgstr "" +msgstr "Địa hình bổ sung" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Altitude chill" -msgstr "" +msgstr "Độ cao lạnh" #: builtin/mainmenu/dlg_create_world.lua msgid "Altitude dry" -msgstr "" +msgstr "Độ cao khô ráo" #: builtin/mainmenu/dlg_create_world.lua msgid "Biome blending" -msgstr "" +msgstr "Pha trộn quần xã" #: builtin/mainmenu/dlg_create_world.lua msgid "Biomes" -msgstr "" +msgstr "Quần xã" #: builtin/mainmenu/dlg_create_world.lua msgid "Caverns" -msgstr "" +msgstr "Hang động lớn" #: builtin/mainmenu/dlg_create_world.lua msgid "Caves" -msgstr "" +msgstr "Hang động" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" -msgstr "" +msgstr "Tạo" #: builtin/mainmenu/dlg_create_world.lua msgid "Decorations" -msgstr "" +msgstr "Vật trang trí" #: 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 "Cảnh báo: Kiểm tra Phát triển chỉ dành cho các nhà phát triển." #: builtin/mainmenu/dlg_create_world.lua msgid "Dungeons" -msgstr "" +msgstr "Ngục tối" #: builtin/mainmenu/dlg_create_world.lua msgid "Flat terrain" -msgstr "" +msgstr "Địa hình phẳng" #: builtin/mainmenu/dlg_create_world.lua msgid "Floating landmasses in the sky" -msgstr "" +msgstr "Vùng đất lơ lửng trên trời" #: 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 "Vùng đất lơ lửng (thử nghiệm)" #: builtin/mainmenu/dlg_create_world.lua msgid "Generate non-fractal terrain: Oceans and underground" -msgstr "" +msgstr "Tạo địa hình không phân dạng: Đại dương và lòng đất" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "Đồi" #: builtin/mainmenu/dlg_create_world.lua msgid "Humid rivers" -msgstr "" +msgstr "Sông ẩm ướt" #: builtin/mainmenu/dlg_create_world.lua msgid "Increases humidity around rivers" -msgstr "" +msgstr "Tăng độ ẩm xung quanh sông" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install a game" +msgstr "Cài đặt một trò chơi" + +#: builtin/mainmenu/dlg_create_world.lua +msgid "Install another game" +msgstr "Cài đặt một trò chơi khác" #: builtin/mainmenu/dlg_create_world.lua msgid "Lakes" -msgstr "" +msgstr "Hồ nước" #: builtin/mainmenu/dlg_create_world.lua msgid "Low humidity and high heat causes shallow or dry rivers" -msgstr "" +msgstr "Độ ẩm thấp và nhiệt độ cao làm cho sông cạn hoặc khô" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen" -msgstr "" +msgstr "Thế hệ bản đồ" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp +#, fuzzy msgid "Mapgen flags" -msgstr "" +msgstr "Cờ của Mapgen" #: builtin/mainmenu/dlg_create_world.lua +#, fuzzy msgid "Mapgen-specific flags" -msgstr "" +msgstr "Cờ cụ thể của Mapgen" #: builtin/mainmenu/dlg_create_world.lua msgid "Mountains" -msgstr "" +msgstr "Núi" #: builtin/mainmenu/dlg_create_world.lua msgid "Mud flow" -msgstr "" +msgstr "Suối bùn" #: builtin/mainmenu/dlg_create_world.lua msgid "Network of tunnels and caves" -msgstr "" +msgstr "Mạng lưới đường hầm và hang động" #: builtin/mainmenu/dlg_create_world.lua msgid "No game selected" -msgstr "" +msgstr "Không có trò chơi nào được chọn" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces heat with altitude" -msgstr "" +msgstr "Giảm nhiệt theo độ cao" #: builtin/mainmenu/dlg_create_world.lua msgid "Reduces humidity with altitude" -msgstr "" +msgstr "Giảm độ ẩm theo độ cao" #: builtin/mainmenu/dlg_create_world.lua msgid "Rivers" -msgstr "" +msgstr "Sông" #: builtin/mainmenu/dlg_create_world.lua msgid "Sea level rivers" -msgstr "" +msgstr "Sông theo mực nước biển" #: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Seed" -msgstr "" +msgstr "Mã khởi tạo" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "Chuyển đổi mượt mà giữa các quần xã" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" msgstr "" +"Các cấu trúc xuất hiện trên địa hình (không ảnh hưởng đến cây cối, cỏ rừng " +"và được tạo bởi v6)" #: builtin/mainmenu/dlg_create_world.lua msgid "Structures appearing on the terrain, typically trees and plants" -msgstr "" +msgstr "Các cấu trúc xuất hiện trên địa hình, điển hình là cây cối và thực vật" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert" -msgstr "" +msgstr "Ôn đới, sa mạc" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle" -msgstr "" +msgstr "Ôn đới, sa mạc, rừng rậm" #: builtin/mainmenu/dlg_create_world.lua msgid "Temperate, Desert, Jungle, Tundra, Taiga" -msgstr "" +msgstr "Ôn đới, sa mạc, rừng rậm, đồng cỏ, rừng taiga" #: builtin/mainmenu/dlg_create_world.lua msgid "Terrain surface erosion" -msgstr "" +msgstr "Xói mòn bề mặt địa hình" #: builtin/mainmenu/dlg_create_world.lua msgid "Trees and jungle grass" -msgstr "" +msgstr "Cây và cỏ rừng" #: builtin/mainmenu/dlg_create_world.lua msgid "Vary river depth" -msgstr "" +msgstr "Độ sâu sông thay đổi" #: 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 "Các hang động lớn nằm sâu trong lòng đất" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" -msgstr "" +msgstr "Tên thế giới" #: builtin/mainmenu/dlg_create_world.lua msgid "You have no games installed." -msgstr "" +msgstr "Bạn chưa cài đặt trò chơi nào." #: builtin/mainmenu/dlg_delete_content.lua msgid "Are you sure you want to delete \"$1\"?" -msgstr "" +msgstr "Bạn có chắc chắn muốn xóa \"$1\" không?" #: 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 "Xóa" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: failed to delete \"$1\"" -msgstr "" +msgstr "pkgmgr: đã xảy ra lỗi khi xóa \"$1\"" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: invalid path \"$1\"" -msgstr "" +msgstr "pkgmgr: đường dẫn \"$1\" không hợp lệ" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "" +msgstr "Xóa thế giới \"$1\"?" + +#: builtin/mainmenu/dlg_register.lua src/gui/guiPasswordChange.cpp +msgid "Confirm Password" +msgstr "Xác nhận mật khẩu" + +#: builtin/mainmenu/dlg_register.lua +msgid "Joining $1" +msgstr "Đang tham gia $1" + +#: builtin/mainmenu/dlg_register.lua +msgid "Missing name" +msgstr "Thiếu tên" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Name" +msgstr "Tên" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_online.lua +msgid "Password" +msgstr "Mật khẩu" + +#: builtin/mainmenu/dlg_register.lua +msgid "Passwords do not match" +msgstr "Mật khẩu không khớp" + +#: builtin/mainmenu/dlg_register.lua builtin/mainmenu/tab_online.lua +msgid "Register" +msgstr "Đăng kí" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Accept" -msgstr "" +msgstr "Chấp nhận" #: builtin/mainmenu/dlg_rename_modpack.lua msgid "Rename Modpack:" -msgstr "" +msgstr "Đổi tên 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 "" +"Modpack này có một tên rõ ràng được đưa ra trong tệp modpack.conf của nó, " +"tên này sẽ ghi đè bất kỳ sự đổi tên nào ở đây." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "(No description of setting given)" -msgstr "" +msgstr "(Không có mô tả về Cài đặt nào được đưa ra)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "2D Noise" -msgstr "" +msgstr "Nhiễu 2D" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" -msgstr "" +msgstr "< Về trang Cài đặt" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Browse" -msgstr "" +msgstr "Duyệt" #: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Games" +msgstr "Nội dung: Trò chơi" + +#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Content: Mods" +msgstr "Nội dung: Mod" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_settings.lua msgid "Disabled" -msgstr "" +msgstr "Đã vô hiệu" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Edit" -msgstr "" +msgstr "Chỉnh sửa" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Enabled" -msgstr "" +msgstr "Đã kích hoạt" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Lacunarity" -msgstr "" +msgstr "Khoảng cách" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Octaves" -msgstr "" +msgstr "Quãng tám" #: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp +#, fuzzy msgid "Offset" -msgstr "" +msgstr "Độ bù" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" -msgstr "" +msgid "Persistence" +msgstr "Sự bền bỉ" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." -msgstr "" +msgstr "Vui lòng nhập một số nguyên hợp lệ." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." -msgstr "" +msgstr "Vui lòng nhập một số hợp lệ." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" -msgstr "" +msgstr "Phục hồi Cài đặt mặc định" #: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Scale" -msgstr "" +msgstr "Tỉ lệ" + +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "Tìm kiếm" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" -msgstr "" +msgstr "Chọn thư mục" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select file" -msgstr "" +msgstr "Chọn tệp" -#: builtin/mainmenu/dlg_settings_advanced.lua +#: builtin/mainmenu/dlg_settings_advanced.lua src/settings_translation_file.cpp msgid "Show technical names" -msgstr "" +msgstr "Hiển thị tên kỹ thuật" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must be at least $1." -msgstr "" +msgstr "Giá trị ít nhất phải là $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "The value must not be larger than $1." -msgstr "" +msgstr "Giá trị không được lớn hơn $1." #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X" -msgstr "" +msgstr "X" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "X spread" @@ -547,7 +757,7 @@ msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y" -msgstr "" +msgstr "Y" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Y spread" @@ -555,7 +765,7 @@ msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z" -msgstr "" +msgstr "Z" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Z spread" @@ -567,14 +777,14 @@ msgstr "" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "absvalue" -msgstr "" +msgstr "Giá trị tuyệt đối" #. ~ "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 "Mặc định" #. ~ "eased" is a noise parameter flag. #. It is used to make the map smoother and @@ -582,551 +792,608 @@ msgstr "" #. main menu -> "All Settings". #: builtin/mainmenu/dlg_settings_advanced.lua msgid "eased" -msgstr "" +msgstr "Nới lỏng" #: builtin/mainmenu/pkgmgr.lua msgid "$1 (Enabled)" -msgstr "" +msgstr "$1 (đã kích hoạt)" #: builtin/mainmenu/pkgmgr.lua msgid "$1 mods" -msgstr "" +msgstr "$1 mod" #: builtin/mainmenu/pkgmgr.lua msgid "Failed to install $1 to $2" -msgstr "" +msgstr "Đã xảy ra lỗi khi cài đặt $1 đến $2" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find real mod name for: $1" -msgstr "" +msgstr "Cài đặt mod: Không thể tìm thấy tên mod thật cho: $1" #: builtin/mainmenu/pkgmgr.lua msgid "Install Mod: Unable to find suitable folder name for modpack $1" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" +msgstr "Cài đặt mod: Không thể tìm thấy tên thư mục phù hợp cho modpack $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" -msgstr "" +msgstr "Không thể tìm thấy một mod hoặc modpack hợp lệ" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a $1 as a texture pack" -msgstr "" +msgstr "Không thể cài đặt $1 dưới dạng gói kết cấu" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a game as a $1" -msgstr "" +msgstr "Không thể cài đặt trò chơi dưới dạng $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a mod as a $1" -msgstr "" +msgstr "Không thể cài đặt mod dưới dạng $1" #: builtin/mainmenu/pkgmgr.lua msgid "Unable to install a modpack as a $1" +msgstr "Không thể cài đặt modpack dưới dạng $1" + +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "Đang tải..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "Danh sách máy chủ công cộng đã bị vô hiệu" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." msgstr "" +"Hãy thử kích hoạt lại danh sách máy chủ công cộng và kiểm tra kết nối mạng " +"của bạn." + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "Giới thiệu" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "Những người đóng góp tích cực" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "Trình kết xuất hiện hoạt:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "Các nhà phát triển cốt lõi" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +msgstr "Mở thư mục Dữ liệu người dùng" + +#: 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 "" +"Mở thư mục chứa thế giới, trò chơi, bản mod do người dùng cung cấp\n" +"và các gói kết cấu trong trình quản lý tệp." + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "Những người đóng góp trước đây" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Core Developers" +msgstr "Các nhà phát triển cốt lõi trước đây" + +#: builtin/mainmenu/tab_about.lua +msgid "Share debug log" +msgstr "Chia sẻ nhật kí gỡ lỗi" #: builtin/mainmenu/tab_content.lua msgid "Browse online content" -msgstr "" +msgstr "Duyệt nội dung trực tuyến" #: builtin/mainmenu/tab_content.lua msgid "Content" -msgstr "" +msgstr "Nội dung" #: builtin/mainmenu/tab_content.lua msgid "Disable Texture Pack" -msgstr "" +msgstr "Vô hiệu gói kết cấu" #: builtin/mainmenu/tab_content.lua msgid "Information:" -msgstr "" +msgstr "Thông tin:" #: builtin/mainmenu/tab_content.lua msgid "Installed Packages:" -msgstr "" +msgstr "Các gói đã cài đặt:" #: builtin/mainmenu/tab_content.lua msgid "No dependencies." -msgstr "" +msgstr "Không có phần phụ thuộc nào." #: builtin/mainmenu/tab_content.lua msgid "No package description available" -msgstr "" +msgstr "Không có mô tả gói" #: builtin/mainmenu/tab_content.lua msgid "Rename" -msgstr "" +msgstr "Đổi tên" #: builtin/mainmenu/tab_content.lua msgid "Uninstall Package" -msgstr "" +msgstr "Gỡ cài đặt gói" #: builtin/mainmenu/tab_content.lua msgid "Use Texture Pack" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" +msgstr "Dùng gói kết cấu này" #: builtin/mainmenu/tab_local.lua msgid "Announce Server" -msgstr "" +msgstr "Thông báo máy chủ" #: builtin/mainmenu/tab_local.lua msgid "Bind Address" -msgstr "" +msgstr "Địa chỉ bắt buộc" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" -msgstr "" +msgstr "Chế độ sáng tạo" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" -msgstr "" +msgstr "Kích hoạt sát thương" #: builtin/mainmenu/tab_local.lua msgid "Host Game" -msgstr "" +msgstr "Lưu trữ trò chơi" #: builtin/mainmenu/tab_local.lua msgid "Host Server" -msgstr "" +msgstr "Lưu trữ máy chủ" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" +msgstr "Cài đặt trò chơi từ ContentDB" #: builtin/mainmenu/tab_local.lua msgid "New" -msgstr "" +msgstr "Mới" #: builtin/mainmenu/tab_local.lua msgid "No world created or selected!" -msgstr "" +msgstr "Không có thế giới nào được tạo hoặc được chọn." #: builtin/mainmenu/tab_local.lua msgid "Play Game" -msgstr "" +msgstr "Chơi trò chơi" + +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua +msgid "Port" +msgstr "Cổng" #: builtin/mainmenu/tab_local.lua -msgid "Port" -msgstr "" +msgid "Select Mods" +msgstr "Chọn Mod" #: builtin/mainmenu/tab_local.lua msgid "Select World:" -msgstr "" +msgstr "Chọn thế giới:" #: builtin/mainmenu/tab_local.lua msgid "Server Port" -msgstr "" +msgstr "Cổng máy chủ" #: builtin/mainmenu/tab_local.lua msgid "Start Game" -msgstr "" +msgstr "Bắt đầu trò chơi" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "" +msgid "Address" +msgstr "Địa chỉ" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Xóa" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" -msgstr "" +msgstr "Chế độ sáng tạo" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "Sát thương / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "Yêu thích" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "Máy chủ không tương thích" #: builtin/mainmenu/tab_online.lua msgid "Join Game" -msgstr "" +msgstr "Tham gia trò chơi" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "Đăng nhập" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" -msgstr "" +msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "Máy chủ công cộng" + +#: builtin/mainmenu/tab_online.lua +msgid "Refresh" +msgstr "Làm mới" + +#: builtin/mainmenu/tab_online.lua +msgid "Remove favorite" +msgstr "Xóa yêu thích" + +#: builtin/mainmenu/tab_online.lua +msgid "Server Description" +msgstr "Mô tả Máy chủ" + +#: 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 "Mây dạng 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 "Tất cả cài đặt" #: builtin/mainmenu/tab_settings.lua msgid "Antialiasing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" +msgstr "Khử răng cưa:" #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" -msgstr "" +msgstr "Tự động lưu kích cỡ màn hình" #: builtin/mainmenu/tab_settings.lua msgid "Bilinear Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" +msgstr "Bộ lọc song tuyến" #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" -msgstr "" +msgstr "Thay đổi khóa" #: builtin/mainmenu/tab_settings.lua msgid "Connected Glass" -msgstr "" +msgstr "Kính kết nối với nhau" + +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "Bóng kiểu động lực học" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "Bóng kiểu động lực học:" #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" -msgstr "" +msgstr "Lá đẹp" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "" +msgid "High" +msgstr "Cao" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "Thấp" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "Trung bình" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" -msgstr "" +msgstr "Mipmap" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap + Aniso. Filter" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" +msgstr "Mipmap + Bộ lọc bất đẳng hướng" #: builtin/mainmenu/tab_settings.lua msgid "No Filter" -msgstr "" +msgstr "Không dùng bộ lọc" #: builtin/mainmenu/tab_settings.lua msgid "No Mipmap" -msgstr "" +msgstr "Không dùng Mipmap" #: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Node Highlighting" -msgstr "" +msgstr "Đánh dấu node" #: builtin/mainmenu/tab_settings.lua +#, fuzzy msgid "Node Outlining" -msgstr "" +msgstr "Phác thảo node" #: builtin/mainmenu/tab_settings.lua msgid "None" -msgstr "" +msgstr "Không" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Leaves" -msgstr "" +msgstr "Lá đục" #: builtin/mainmenu/tab_settings.lua msgid "Opaque Water" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" +msgstr "Nước đục" #: builtin/mainmenu/tab_settings.lua msgid "Particles" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" +msgstr "Hạt hiệu ứng" #: builtin/mainmenu/tab_settings.lua msgid "Screen:" -msgstr "" +msgstr "Màn hình:" #: builtin/mainmenu/tab_settings.lua msgid "Settings" -msgstr "" +msgstr "Cài đặt" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Shaders" -msgstr "" +msgstr "Trình đổ bóng" + +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "Trình đổ bóng (thử nghiệm)" #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" -msgstr "" +msgstr "Trình đổ bóng (không tồn tại)" #: builtin/mainmenu/tab_settings.lua msgid "Simple Leaves" -msgstr "" +msgstr "Lá đơn giản" #: builtin/mainmenu/tab_settings.lua msgid "Smooth Lighting" -msgstr "" +msgstr "Ánh sáng mịn" #: builtin/mainmenu/tab_settings.lua msgid "Texturing:" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" +msgstr "Kết cấu:" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" -msgstr "" +msgstr "Tông màu" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" -msgstr "" +msgid "Touch threshold (px):" +msgstr "Ngưỡng chạm (px):" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" -msgstr "" +msgstr "Bộ lọc tam song" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "Cực cao" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "Cực thấp" #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" -msgstr "" +msgstr "Lá đung đưa" #: builtin/mainmenu/tab_settings.lua msgid "Waving Liquids" -msgstr "" +msgstr "Sóng" #: builtin/mainmenu/tab_settings.lua msgid "Waving Plants" -msgstr "" - -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" +msgstr "Thực vật đung đưa" #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "Lỗi kết nối (vấn đề với giao thức?)." + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." -msgstr "" +msgstr "Hết thời gian chờ kết nối." #: src/client/client.cpp msgid "Done!" -msgstr "" +msgstr "Đã xong!" #: src/client/client.cpp +#, fuzzy msgid "Initializing nodes" -msgstr "" +msgstr "Đang khởi tạo các node" #: src/client/client.cpp +#, fuzzy msgid "Initializing nodes..." -msgstr "" +msgstr "Đang khởi tạo các node..." #: src/client/client.cpp msgid "Loading textures..." -msgstr "" +msgstr "Đang tải kết cấu..." #: src/client/client.cpp msgid "Rebuilding shaders..." -msgstr "" +msgstr "Đang xây dựng lại trình đổ bóng..." #: src/client/clientlauncher.cpp msgid "Connection error (timed out?)" -msgstr "" +msgstr "Lỗi kết nối (hết thời gian chờ?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "" +msgid "Could not find or load game: " +msgstr "Không tìm thấy hoặc tải trò chơi: " #: src/client/clientlauncher.cpp +#, fuzzy msgid "Invalid gamespec." -msgstr "" +msgstr "Gamespec không hợp lệ." #: src/client/clientlauncher.cpp msgid "Main Menu" -msgstr "" +msgstr "Màn hình chính" #: src/client/clientlauncher.cpp msgid "No world selected and no address provided. Nothing to do." msgstr "" +"Không có thế giới nào được chọn và không có địa chỉ nào được cung cấp. Không " +"có gì để thực hiên." #: src/client/clientlauncher.cpp msgid "Player name too long." -msgstr "" +msgstr "Tên người chơi quá dài." #: src/client/clientlauncher.cpp msgid "Please choose a name!" -msgstr "" +msgstr "Vui lòng chọn một tên!" #: src/client/clientlauncher.cpp msgid "Provided password file failed to open: " -msgstr "" +msgstr "Không mở được tệp mật khẩu được cung cấp: " #: src/client/clientlauncher.cpp msgid "Provided world path doesn't exist: " -msgstr "" - -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "" +msgstr "Đường dẫn thế giới được cung cấp không tồn tại: " #: src/client/game.cpp msgid "" "\n" "Check debug.txt for details." msgstr "" +"\n" +"Hãy kiểm tra debug.txt để có thông tin chi tiết." #: src/client/game.cpp msgid "- Address: " -msgstr "" - -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" +msgstr "- Địa chỉ: " #: src/client/game.cpp msgid "- Mode: " -msgstr "" +msgstr "- Chế độ: " #: src/client/game.cpp msgid "- Port: " -msgstr "" +msgstr "- Cổng: " #: src/client/game.cpp msgid "- Public: " -msgstr "" +msgstr "- Công cộng: " #. ~ PvP = Player versus Player #: src/client/game.cpp msgid "- PvP: " -msgstr "" +msgstr "- PvP: " #: src/client/game.cpp msgid "- Server Name: " -msgstr "" +msgstr "- Tên máy chủ: " + +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "Đã xảy ra lỗi tuần tự hóa:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "Quyền truy cập bị từ chối với lý do: %s" #: src/client/game.cpp msgid "Automatic forward disabled" -msgstr "" +msgstr "Tự động chuyển tiếp bị tắt" #: src/client/game.cpp msgid "Automatic forward enabled" -msgstr "" +msgstr "Tự động chuyển tiếp đã bật" + +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "Các ranh giới khối đã ẩn" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "Đã hiển thị ranh giới cho tất cả các khối" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "Đã hiển thị ranh giới hiển thị cho khối hiện tại" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "Đã hiển thị ranh giới cho các khối gần bạn" #: src/client/game.cpp msgid "Camera update disabled" -msgstr "" +msgstr "Cập nhật máy ảnh đã tắt" #: src/client/game.cpp msgid "Camera update enabled" -msgstr "" +msgstr "Cập nhật máy ảnh đã bật" + +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "Không thể hiển thị ranh giới khối (bị tắt bởi mod hoặc trò chơi)" #: src/client/game.cpp msgid "Change Password" -msgstr "" +msgstr "Đổi mật khẩu" #: src/client/game.cpp msgid "Cinematic mode disabled" -msgstr "" +msgstr "Chế độ điện ảnh đã tắt" #: src/client/game.cpp msgid "Cinematic mode enabled" -msgstr "" +msgstr "Chế độ điện ảnh đã bật" #: src/client/game.cpp +msgid "Client disconnected" +msgstr "Máy khách đã ngắt kết nối" + +#: src/client/game.cpp +#, fuzzy msgid "Client side scripting is disabled" -msgstr "" +msgstr "Chạy kịch bản phía máy khách đã tắt" #: src/client/game.cpp msgid "Connecting to server..." -msgstr "" +msgstr "Đang kết nối tới máy chủ..." + +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "Kết nối không thành công vì lý do không xác định" #: src/client/game.cpp msgid "Continue" -msgstr "" +msgstr "Tiếp tục" #: src/client/game.cpp #, c-format @@ -1136,38 +1403,58 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +"Điền khiển:\n" +"- %s: tiến lên\n" +"- %s: lùi xuống\n" +"- %s: sang trái\n" +"- %s: sang phải\n" +"- %s: nhảy / leo lên\n" +"- %s: đào / đấm\n" +"- %s: đặt khối / sử dụng\n" +"- %s: đi rón rén / leo xuống\n" +"- %s: thả vật phẩm\n" +"- %s: túi đồ\n" +"- Di chuột: xoay / nhìn\n" +"- Lăn chuột: chọn vật phẩm\n" +"- %s: trò chuyện\n" + +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "Không thể giải mã địa chỉ: %s" #: src/client/game.cpp msgid "Creating client..." -msgstr "" +msgstr "Đang tạo máy khách..." #: src/client/game.cpp msgid "Creating server..." -msgstr "" +msgstr "Đang tạo máy chủ..." #: src/client/game.cpp msgid "Debug info and profiler graph hidden" -msgstr "" +msgstr "Thông tin gỡ lỗi và biểu đồ hồ sơ đã ẩn" #: src/client/game.cpp msgid "Debug info shown" -msgstr "" +msgstr "Thông tin gỡ lỗi đã hiển thị" #: src/client/game.cpp msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "" +msgstr "Thông tin gỡ lỗi, biểu đồ hồ sơ và khung dây đã ẩn" #: src/client/game.cpp +#, fuzzy msgid "" "Default Controls:\n" "No menu visible:\n" @@ -1182,74 +1469,91 @@ msgid "" "- touch&drag, tap 2nd finger\n" " --> place single item to slot\n" msgstr "" +"Điều khiển mặc định:\n" +"Khi menu không hiển thị:\n" +"- một lần nhấn: nút kích hoạt\n" +"- nhấn đúp: đặt khối / sử dụng\n" +"- trượt ngón tay: nhìn xung quanh\n" +"Khi Menu / Túi đồ hiển thị:\n" +"- nhấn đúp (bên ngoài):\n" +" -> đóng\n" +"- chạm ngăn xếp, chạm ô:\n" +" -> di chuyển ngăn xếp\n" +"- chạm và kéo, chạm vào ngón tay thứ 2\n" +" -> đặt một mục duy nhất vào vị trí\n" #: src/client/game.cpp msgid "Disabled unlimited viewing range" -msgstr "" +msgstr "Đã tắt phạm vi nhìn không giới hạn" #: src/client/game.cpp msgid "Enabled unlimited viewing range" -msgstr "" +msgstr "Đã bật phạm vi nhìn không giới hạn" + +#: src/client/game.cpp +#, c-format +msgid "Error creating client: %s" +msgstr "Đã xảy ra lỗi khi tạo máy khách: %s" #: src/client/game.cpp msgid "Exit to Menu" -msgstr "" +msgstr "Thoát ra màn hình chính" #: src/client/game.cpp msgid "Exit to OS" -msgstr "" +msgstr "Thoát Minetest" #: src/client/game.cpp msgid "Fast mode disabled" -msgstr "" +msgstr "Chế độ nhanh đã tắt" #: src/client/game.cpp msgid "Fast mode enabled" -msgstr "" +msgstr "Chế độ nhanh đã bật" #: src/client/game.cpp msgid "Fast mode enabled (note: no 'fast' privilege)" -msgstr "" +msgstr "Chế độ nhanh đã bật (ghi chú: không có ưu tiên cho 'nhanh')" #: src/client/game.cpp msgid "Fly mode disabled" -msgstr "" +msgstr "Chế độ bay đã tắt" #: src/client/game.cpp msgid "Fly mode enabled" -msgstr "" +msgstr "Chế độ bay đã bật" #: src/client/game.cpp msgid "Fly mode enabled (note: no 'fly' privilege)" -msgstr "" +msgstr "Chế độ bay đã bật (ghi chú: không có ưu tiên cho 'bay')" #: src/client/game.cpp msgid "Fog disabled" -msgstr "" +msgstr "Sương mù đã tắt" #: src/client/game.cpp msgid "Fog enabled" -msgstr "" +msgstr "Sương mù đã bật" #: src/client/game.cpp msgid "Game info:" -msgstr "" +msgstr "Thông tin trò chơi:" #: src/client/game.cpp msgid "Game paused" -msgstr "" +msgstr "Trò chơi đã được tạm dừng" #: src/client/game.cpp msgid "Hosting server" -msgstr "" +msgstr "Đang tải máy chủ" #: src/client/game.cpp msgid "Item definitions..." -msgstr "" +msgstr "Định nghĩa vật phẩm..." #: src/client/game.cpp msgid "KiB/s" -msgstr "" +msgstr "KiB/s" #: src/client/game.cpp msgid "Media..." @@ -1257,39 +1561,15 @@ msgstr "" #: 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 "Minimap đã bị vô hiệu bởi trò chơi hoặc mod" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "" +msgid "Multiplayer" +msgstr "Chơi mạng" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1309,11 +1589,11 @@ msgstr "" #: src/client/game.cpp msgid "Off" -msgstr "" +msgstr "Tắt" #: src/client/game.cpp msgid "On" -msgstr "" +msgstr "Bật" #: src/client/game.cpp msgid "Pitch move mode disabled" @@ -1325,144 +1605,155 @@ msgstr "" #: src/client/game.cpp msgid "Profiler graph shown" -msgstr "" +msgstr "Biểu đồ hồ sơ đã hiện" #: src/client/game.cpp msgid "Remote server" -msgstr "" +msgstr "Máy chủ từ xa" #: src/client/game.cpp msgid "Resolving address..." -msgstr "" +msgstr "Đang giải mã địa chỉ..." #: src/client/game.cpp msgid "Shutting down..." -msgstr "" +msgstr "Đang thoát..." #: src/client/game.cpp msgid "Singleplayer" -msgstr "" +msgstr "Chơi đơn" #: src/client/game.cpp msgid "Sound Volume" -msgstr "" +msgstr "Âm lượng" #: src/client/game.cpp msgid "Sound muted" -msgstr "" +msgstr "Đã tắt tiếng" #: src/client/game.cpp msgid "Sound system is disabled" -msgstr "" +msgstr "Hệ thống âm thanh đã bị vô hiệu" #: src/client/game.cpp msgid "Sound system is not supported on this build" -msgstr "" +msgstr "Hệ thống âm thanh không được hỗ trợ trong bản dựng này" #: src/client/game.cpp msgid "Sound unmuted" +msgstr "Đã bật tiếng" + +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "Có vẻ như máy chủ đang chạy một phiên bản khác của %s." + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "Không thể kết nối đến %s vì IPv6 đã bị vô hiệu" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" msgstr "" #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" -msgstr "" +msgstr "Phạm vi nhìn được đặt thành %d" #: src/client/game.cpp #, c-format msgid "Viewing range is at maximum: %d" -msgstr "" +msgstr "Phạm vi nhìn đang ở mức tối đa: %d" #: src/client/game.cpp #, c-format msgid "Viewing range is at minimum: %d" -msgstr "" +msgstr "Phạm vi nhìn đang ở mức tối thiểu: %d" #: src/client/game.cpp #, c-format msgid "Volume changed to %d%%" -msgstr "" +msgstr "Âm lượng được đặt thành %d%%" #: src/client/game.cpp msgid "Wireframe shown" -msgstr "" +msgstr "Hiện khung dây" #: src/client/game.cpp msgid "Zoom currently disabled by game or mod" -msgstr "" +msgstr "Thu phóng đã bị vô hiệu bởi trò chơi hoặc mod" #: src/client/game.cpp msgid "ok" -msgstr "" +msgstr "OK" #: src/client/gameui.cpp msgid "Chat hidden" -msgstr "" +msgstr "Trò chuyện đã bị ẩn" #: src/client/gameui.cpp msgid "Chat shown" -msgstr "" +msgstr "Trò chuyện đã được hiển thị" #: src/client/gameui.cpp msgid "HUD hidden" -msgstr "" +msgstr "HUD đã bị ẩn" #: src/client/gameui.cpp msgid "HUD shown" -msgstr "" +msgstr "HUD đã được hiển thị" #: src/client/gameui.cpp msgid "Profiler hidden" -msgstr "" +msgstr "Hồ sơ đã bị ẩn" #: src/client/gameui.cpp #, c-format msgid "Profiler shown (page %d of %d)" -msgstr "" +msgstr "Hồ sơ đã được hiển thị (trang thứ %d trên %d)" #: src/client/keycode.cpp msgid "Apps" -msgstr "" +msgstr "Ứng dụng" #: src/client/keycode.cpp msgid "Backspace" -msgstr "" +msgstr "Backspace" #: src/client/keycode.cpp msgid "Caps Lock" -msgstr "" - -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" +msgstr "Caps Lock" #: src/client/keycode.cpp msgid "Control" -msgstr "" +msgstr "Control" #: src/client/keycode.cpp msgid "Down" -msgstr "" +msgstr "Xuống" #: src/client/keycode.cpp msgid "End" -msgstr "" +msgstr "End" #: src/client/keycode.cpp msgid "Erase EOF" -msgstr "" +msgstr "Xóa bỏ EOF" #: src/client/keycode.cpp msgid "Execute" -msgstr "" +msgstr "Thực thi" #: src/client/keycode.cpp msgid "Help" -msgstr "" +msgstr "Trợ giúp" #: src/client/keycode.cpp msgid "Home" -msgstr "" +msgstr "Trang chủ" #: src/client/keycode.cpp msgid "IME Accept" @@ -1486,104 +1777,104 @@ msgstr "" #: src/client/keycode.cpp msgid "Insert" -msgstr "" +msgstr "Chèn" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Left" -msgstr "" +msgstr "Sang trái" #: src/client/keycode.cpp msgid "Left Button" -msgstr "" +msgstr "Nút trái" #: src/client/keycode.cpp msgid "Left Control" -msgstr "" +msgstr "Control trái" #: src/client/keycode.cpp msgid "Left Menu" -msgstr "" +msgstr "Menu trái" #: src/client/keycode.cpp msgid "Left Shift" -msgstr "" +msgstr "Shift trái" #: src/client/keycode.cpp msgid "Left Windows" -msgstr "" +msgstr "Windows trái" #. ~ Key name, common on Windows keyboards #: src/client/keycode.cpp msgid "Menu" -msgstr "" +msgstr "Menu" #: src/client/keycode.cpp msgid "Middle Button" -msgstr "" +msgstr "Nút giữa" #: src/client/keycode.cpp msgid "Num Lock" -msgstr "" +msgstr "Num Lock" #: src/client/keycode.cpp msgid "Numpad *" -msgstr "" +msgstr "* trên b.phím số" #: src/client/keycode.cpp msgid "Numpad +" -msgstr "" +msgstr "+ trên b.phím số" #: src/client/keycode.cpp msgid "Numpad -" -msgstr "" +msgstr "- trên b.phím số" #: src/client/keycode.cpp msgid "Numpad ." -msgstr "" +msgstr ". trên b.phím số" #: src/client/keycode.cpp msgid "Numpad /" -msgstr "" +msgstr "/ trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 0" -msgstr "" +msgstr "0 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 1" -msgstr "" +msgstr "1 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 2" -msgstr "" +msgstr "2 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 3" -msgstr "" +msgstr "3 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 4" -msgstr "" +msgstr "4 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 5" -msgstr "" +msgstr "5 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 6" -msgstr "" +msgstr "6 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 7" -msgstr "" +msgstr "7 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 8" -msgstr "" +msgstr "8 trên b.phím số" #: src/client/keycode.cpp msgid "Numpad 9" -msgstr "" +msgstr "9 trên b.phím số" #: src/client/keycode.cpp msgid "OEM Clear" @@ -1591,56 +1882,56 @@ msgstr "" #: 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 Screen" #: src/client/keycode.cpp msgid "Return" -msgstr "" +msgstr "Return" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Right" -msgstr "" +msgstr "Sang phải" #: src/client/keycode.cpp msgid "Right Button" -msgstr "" +msgstr "Nút phải" #: src/client/keycode.cpp msgid "Right Control" -msgstr "" +msgstr "Control phải" #: src/client/keycode.cpp msgid "Right Menu" -msgstr "" +msgstr "Menu phải" #: src/client/keycode.cpp msgid "Right Shift" -msgstr "" +msgstr "Shift phải" #: src/client/keycode.cpp msgid "Right Windows" -msgstr "" +msgstr "Windows phải" #: src/client/keycode.cpp msgid "Scroll Lock" -msgstr "" +msgstr "Scroll Lock" #. ~ Key name #: src/client/keycode.cpp @@ -1649,89 +1940,105 @@ msgstr "" #: src/client/keycode.cpp msgid "Shift" -msgstr "" +msgstr "Shift" #: src/client/keycode.cpp msgid "Sleep" -msgstr "" +msgstr "Ngủ" #: src/client/keycode.cpp msgid "Snapshot" -msgstr "" +msgstr "Ảnh chụp nhanh" #: src/client/keycode.cpp msgid "Space" -msgstr "" +msgstr "Phím cách" #: src/client/keycode.cpp msgid "Tab" -msgstr "" +msgstr "Tab" #: src/client/keycode.cpp msgid "Up" -msgstr "" +msgstr "Lên" #: src/client/keycode.cpp msgid "X Button 1" -msgstr "" +msgstr "Nút X 1" #: src/client/keycode.cpp msgid "X Button 2" -msgstr "" +msgstr "Nút X 2" #: src/client/keycode.cpp src/gui/guiKeyChangeMenu.cpp msgid "Zoom" -msgstr "" +msgstr "Thu phóng" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "Ẩn Minimap" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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 "" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "Minimap ở chế độ ra-đa, mức thu phóng %dx" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "Minimap ở chế độ mặt nền, mức thu phóng %dx" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "Minimap ở chế độ kết cấu" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "Đã xảy ra lỗi khi mở trang web" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "Đang mở trang web" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" -msgstr "" +msgstr "Tiến hành" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = leo xuống" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" -msgstr "" +msgstr "Tự động tiến" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Automatic jumping" -msgstr "" +msgstr "Tự động nhảy" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" -msgstr "" +msgstr "Lùi xuống" + +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "Ranh giới khối" #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" -msgstr "" +msgstr "Thay đổi camera" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" -msgstr "" +msgstr "Trò chuyện" #: src/gui/guiKeyChangeMenu.cpp msgid "Command" -msgstr "" +msgstr "Lệnh" #: src/gui/guiKeyChangeMenu.cpp msgid "Console" @@ -1739,103 +2046,99 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. range" -msgstr "" +msgstr "Giảm phạm vi" #: src/gui/guiKeyChangeMenu.cpp msgid "Dec. volume" -msgstr "" +msgstr "Giảm âm lượng" #: src/gui/guiKeyChangeMenu.cpp msgid "Double tap \"jump\" to toggle fly" -msgstr "" +msgstr "Nhấn đúp nút \"nhảy\" để chuyển đổi chế độ bay" #: src/gui/guiKeyChangeMenu.cpp msgid "Drop" -msgstr "" +msgstr "Thả" #: src/gui/guiKeyChangeMenu.cpp msgid "Forward" -msgstr "" +msgstr "Tiến lên" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. range" -msgstr "" +msgstr "Tăng phạm vi" #: src/gui/guiKeyChangeMenu.cpp msgid "Inc. volume" -msgstr "" +msgstr "Tăng âm lượng" #: src/gui/guiKeyChangeMenu.cpp msgid "Inventory" -msgstr "" +msgstr "Túi đồ" #: src/gui/guiKeyChangeMenu.cpp msgid "Jump" -msgstr "" +msgstr "Nhảy" #: src/gui/guiKeyChangeMenu.cpp msgid "Key already in use" -msgstr "" +msgstr "Phím đã được sử dụng" #: src/gui/guiKeyChangeMenu.cpp -msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)" -msgstr "" +msgid "Keybindings." +msgstr "Liên kết phím." #: src/gui/guiKeyChangeMenu.cpp msgid "Local command" -msgstr "" +msgstr "Lệnh cục bộ" #: src/gui/guiKeyChangeMenu.cpp msgid "Mute" -msgstr "" +msgstr "Tắt tiếng" #: src/gui/guiKeyChangeMenu.cpp msgid "Next item" -msgstr "" +msgstr "Vật phẩm tiếp theo" #: src/gui/guiKeyChangeMenu.cpp msgid "Prev. item" -msgstr "" +msgstr "Vật phẩm trước" #: src/gui/guiKeyChangeMenu.cpp msgid "Range select" -msgstr "" +msgstr "Lựa chọn phạm vi" #: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Screenshot" -msgstr "" +msgstr "Chụp màn hình" #: src/gui/guiKeyChangeMenu.cpp msgid "Sneak" -msgstr "" - -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" +msgstr "Đi rón rén" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" -msgstr "" +msgstr "Chuyển đổi HUD" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle chat log" -msgstr "" +msgstr "Chuyển đổi nhật kí trò chuyện" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "" +msgstr "Chuyển đổi chạy nhanh" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fly" -msgstr "" +msgstr "Chuyển đổi bay" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fog" -msgstr "" +msgstr "Chuyển đổi sương mù" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle minimap" -msgstr "" +msgstr "Chuyển đổi minimap" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle noclip" @@ -1847,41 +2150,36 @@ msgstr "" #: src/gui/guiKeyChangeMenu.cpp msgid "press key" -msgstr "" +msgstr "bấm phím" #: src/gui/guiPasswordChange.cpp msgid "Change" -msgstr "" - -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" +msgstr "Thay đổi" #: src/gui/guiPasswordChange.cpp msgid "New Password" -msgstr "" +msgstr "Mật khẩu mới" #: src/gui/guiPasswordChange.cpp msgid "Old Password" -msgstr "" +msgstr "Mật khẩu cũ" + +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "Mật khẩu không khớp!" #: src/gui/guiVolumeChange.cpp msgid "Exit" -msgstr "" +msgstr "Thoát" #: src/gui/guiVolumeChange.cpp msgid "Muted" -msgstr "" +msgstr "Đã tắt tiếng" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "" +#, c-format +msgid "Sound Volume: %d%%" +msgstr "Âm lượng: %d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1890,18 +2188,34 @@ msgstr "" msgid "LANG_CODE" msgstr "vi" +#: src/network/clientpackethandler.cpp +msgid "" +"Name is not registered. To create an account on this server, click 'Register'" +msgstr "" +"Tên chưa được đăng kí. Để tạo một tài khoản trên máy chủ này, hãy bấm \"Đăng " +"kí\"" + +#: src/network/clientpackethandler.cpp +msgid "Name is taken. Please choose another name" +msgstr "Tên đã được sử dụng. Vui lòng chọn một tên khác" + #: 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) Sửa vị trí của joystick ảo.\n" +"Nếu vô hiệu, joystick ảo sẽ ở vị trị giữa của lần chạm đầu tiên." #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) Dùng joystick ảo để kích hoạt nút \"Aux1\".\n" +"Khi kích hoạt, joystick ảo cũng sẽ nhấn nút \"Aux1\" khi ra khỏi vòng tròn " +"chính." #: src/settings_translation_file.cpp msgid "" @@ -1926,61 +2240,59 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." -msgstr "" +msgstr "Nhiễu 2D điều khiển hình dạng / kích thước của các sống núi." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of rolling hills." -msgstr "" +msgstr "Nhiễu 2D điều khiển hình dạng / kích thước của các ngọn đồi." #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of step mountains." -msgstr "" +msgstr "Nhiễu 2D điều khiển hình dạng / kích thước của các núi bậc thang." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." msgstr "" +"Nhiễu 2D điều khiển hình dạng / tần suất xuất hiện của các dãy sống núi." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of rolling hills." -msgstr "" +msgstr "Nhiễu 2D điều khiển hình dạng / tần suất xuất hiện của các ngọn đồi." #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of step mountain ranges." msgstr "" +"Nhiễu 2D điều khiển hình dạng / tần suất xuất hiện của các dãy núi bậc thang." #: src/settings_translation_file.cpp msgid "2D noise that locates the river valleys and channels." -msgstr "" +msgstr "Nhiễu 2D tạo vị trí cho các sông, thung lũng và kênh mương." #: src/settings_translation_file.cpp msgid "3D clouds" -msgstr "" +msgstr "Mây dạng 3D" #: src/settings_translation_file.cpp msgid "3D mode" -msgstr "" +msgstr "Chế độ 3D" #: src/settings_translation_file.cpp msgid "3D mode parallax strength" -msgstr "" +msgstr "Cường độ thị sai của Chế độ 3D" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." -msgstr "" +msgstr "Nhiễu 3D tạo ra các hang động lớn." #: src/settings_translation_file.cpp msgid "" "3D noise defining mountain structure and height.\n" "Also defines structure of floatland mountain terrain." msgstr "" +"Nhiễu 3D xác địch cấu trúc và độ cao của núi.\n" +"Nó cũng xác định cấu trúc của các địa hình đảo lơ lửng." #: src/settings_translation_file.cpp msgid "" @@ -2020,31 +2332,41 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." msgstr "" +#: 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." msgstr "" +"Một mã được chọn để tạo một thế giới mới, để trống để tạo mã ngẫu nhiên.\n" +"Nó sẽ được ghi đè khi tạo một thế giới mới trong màn hình chính." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server crashes." -msgstr "" +msgstr "Một tin nhắn được hiển thị ở các máy khách khi máy chủ gặp sự cố." #: src/settings_translation_file.cpp msgid "A message to be displayed to all clients when the server shuts down." -msgstr "" +msgstr "Một tin nhắn được hiển thị ở các máy khách khi máy chủ tắt." #: src/settings_translation_file.cpp msgid "ABM interval" msgstr "" #: src/settings_translation_file.cpp -msgid "Absolute limit of queued blocks to emerge" +msgid "ABM time budget" msgstr "" +#: src/settings_translation_file.cpp +msgid "Absolute limit of queued blocks to emerge" +msgstr "Giới hạn tuyệt đối của các khối ở hàng chờ để xuất hiện" + #: src/settings_translation_file.cpp msgid "Acceleration in air" -msgstr "" +msgstr "Tăng tốc trong không trung" #: src/settings_translation_file.cpp msgid "Acceleration of gravity, in nodes per second per second." @@ -2082,6 +2404,13 @@ msgid "" "Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k " "screens." msgstr "" +"Điều chỉnh cấu hình DPI cho màn hình của bạn (chỉ cho Android/không phải X11)" +", VD: cho màn hình 4K." + +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" +"Điều chỉnh mật độ điểm ảnh đã phát hiện, sử dụng để thu phóng các yếu tố UI." #: src/settings_translation_file.cpp #, c-format @@ -2093,9 +2422,13 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "Tên quản trị viên" + #: src/settings_translation_file.cpp msgid "Advanced" -msgstr "" +msgstr "Nâng cao" #: src/settings_translation_file.cpp msgid "" @@ -2107,8 +2440,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "" +msgid "Always fly fast" +msgstr "Luôn bay nhanh" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -2116,23 +2449,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Amount of messages a player may send per 10 seconds." -msgstr "" +msgstr "Số lượng tin nhắn của một người chơi có thể gửi trong 10 giây." #: src/settings_translation_file.cpp msgid "Amplifies the valleys." -msgstr "" +msgstr "Khuếch đại các thung lũng." #: src/settings_translation_file.cpp msgid "Anisotropic filtering" -msgstr "" +msgstr "Lọc bất đẳng hướng" #: src/settings_translation_file.cpp msgid "Announce server" -msgstr "" +msgstr "Thông báo máy chủ" #: src/settings_translation_file.cpp msgid "Announce to this serverlist." -msgstr "" +msgstr "Thông báo đến danh sách máy chủ này." #: src/settings_translation_file.cpp msgid "Append item name" @@ -2144,21 +2477,23 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Apple trees noise" -msgstr "" +msgstr "Nhiễu cho các cây táo" #: src/settings_translation_file.cpp msgid "Arm inertia" -msgstr "" +msgstr "Quán tính của cánh tay" #: src/settings_translation_file.cpp msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." msgstr "" +"Quán tính của cánh tay, mang lại chuyển động\n" +"chân thực hơn cho cánh tay khi máy ảnh di chuyển." #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" -msgstr "" +msgstr "Hỏi để kết nối lại sau khi gặp sự cố" #: src/settings_translation_file.cpp msgid "" @@ -2175,9 +2510,13 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "Âm thanh" + #: src/settings_translation_file.cpp msgid "Automatic forward key" -msgstr "" +msgstr "Phím tự động tiến" #: src/settings_translation_file.cpp msgid "Automatically jump up single-node obstacles." @@ -2185,19 +2524,27 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." -msgstr "" +msgstr "Tự động báo cáo đến danh sách máy chủ." #: src/settings_translation_file.cpp msgid "Autosave screen size" -msgstr "" +msgstr "Tự động lưu kích thước màn hình" #: src/settings_translation_file.cpp msgid "Autoscaling mode" -msgstr "" +msgstr "Chế độ tự động thay đổi tỉ lệ" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Phím Aux1" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "Phím Aux1 cho việc leo lên/leo xuống" #: src/settings_translation_file.cpp msgid "Backward key" -msgstr "" +msgstr "Phím lùi" #: src/settings_translation_file.cpp msgid "Base ground level" @@ -2205,19 +2552,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Base terrain height." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" +msgstr "Độ cao của địa hình cơ bản." #: src/settings_translation_file.cpp msgid "Basic privileges" -msgstr "" +msgstr "Các quyền cơ bản" #: src/settings_translation_file.cpp msgid "Beach noise" -msgstr "" +msgstr "Nhiễu cho biển" #: src/settings_translation_file.cpp msgid "Beach noise threshold" @@ -2225,31 +2568,31 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Bilinear filtering" -msgstr "" +msgstr "Lọc song tuyến" #: src/settings_translation_file.cpp msgid "Bind address" -msgstr "" +msgstr "Liên kết địa chỉ" #: src/settings_translation_file.cpp -msgid "Biome API temperature and humidity noise parameters" +msgid "Biome API noise parameters" msgstr "" #: src/settings_translation_file.cpp msgid "Biome noise" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "" +msgstr "Nhiễu quần xã" #: src/settings_translation_file.cpp msgid "Block send optimize distance" msgstr "" +#: src/settings_translation_file.cpp +msgid "Bobbing" +msgstr "Lay động" + #: src/settings_translation_file.cpp msgid "Bold and italic font path" -msgstr "" +msgstr "Đường dẫn đến phông đậm và nghiêng" #: src/settings_translation_file.cpp msgid "Bold and italic monospace font path" @@ -2257,7 +2600,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Bold font path" -msgstr "" +msgstr "Đường dẫn đến phông đậm" #: src/settings_translation_file.cpp msgid "Bold monospace font path" @@ -2269,11 +2612,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Builtin" -msgstr "" +msgstr "Được dựng sẵn" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "" +msgid "Camera" +msgstr "Máy ảnh" #: src/settings_translation_file.cpp msgid "" @@ -2285,39 +2628,39 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Camera smoothing" -msgstr "" +msgstr "Máy ảnh mượt mà" #: src/settings_translation_file.cpp msgid "Camera smoothing in cinematic mode" -msgstr "" +msgstr "Máy ảnh mượt mà trong chế độ điện ảnh" #: src/settings_translation_file.cpp msgid "Camera update toggle key" -msgstr "" +msgstr "Nút chuyển đổi cập nhật máy ảnh" #: src/settings_translation_file.cpp msgid "Cave noise" -msgstr "" +msgstr "Nhiễu hang động" #: src/settings_translation_file.cpp msgid "Cave noise #1" -msgstr "" +msgstr "Nhiễu hang động #1" #: src/settings_translation_file.cpp msgid "Cave noise #2" -msgstr "" +msgstr "Nhiễu hang động #2" #: src/settings_translation_file.cpp msgid "Cave width" -msgstr "" +msgstr "Độ rộng của hang" #: src/settings_translation_file.cpp msgid "Cave1 noise" -msgstr "" +msgstr "Nhiễu Hang 1" #: src/settings_translation_file.cpp msgid "Cave2 noise" -msgstr "" +msgstr "Nhiễu Hang 2" #: src/settings_translation_file.cpp msgid "Cavern limit" @@ -2346,22 +2689,20 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" msgstr "" +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "Lệnh trò chuyện" + #: src/settings_translation_file.cpp msgid "Chat font size" -msgstr "" +msgstr "K.thước phông chữ tr.chuyện" #: src/settings_translation_file.cpp msgid "Chat key" -msgstr "" +msgstr "Phím trò chuyện" #: src/settings_translation_file.cpp msgid "Chat log level" @@ -2373,7 +2714,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Chat message format" -msgstr "" +msgstr "Định dạng tin nhắn trò chuyện" #: src/settings_translation_file.cpp msgid "Chat message kick threshold" @@ -2381,39 +2722,45 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Chat message max length" -msgstr "" +msgstr "Độ dài tin nhắn trò chuyện tối đa" #: src/settings_translation_file.cpp msgid "Chat toggle key" -msgstr "" +msgstr "Phím chuyển đổi trò chuyện" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp msgid "Chunk size" -msgstr "" +msgstr "Kích thước đoạn khúc" #: src/settings_translation_file.cpp msgid "Cinematic mode" -msgstr "" +msgstr "Chế độ điện ảnh" #: src/settings_translation_file.cpp msgid "Cinematic mode key" -msgstr "" +msgstr "Phím chế độ điện ảnh" #: src/settings_translation_file.cpp msgid "Clean transparent textures" +msgstr "Xóa các kết cấu trong suốt" + +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." msgstr "" #: src/settings_translation_file.cpp msgid "Client" -msgstr "" +msgstr "Máy khách" #: src/settings_translation_file.cpp msgid "Client and Server" -msgstr "" +msgstr "Máy khách và máy chủ" #: src/settings_translation_file.cpp msgid "Client modding" @@ -2428,28 +2775,36 @@ msgid "Client side node lookup range restriction" msgstr "" #: src/settings_translation_file.cpp -msgid "Climbing speed" +msgid "Client-side Modding" msgstr "" +#: src/settings_translation_file.cpp +msgid "Climbing speed" +msgstr "Tốc độ leo" + #: src/settings_translation_file.cpp msgid "Cloud radius" -msgstr "" +msgstr "Bán kính mây" #: src/settings_translation_file.cpp msgid "Clouds" -msgstr "" +msgstr "Mây" #: src/settings_translation_file.cpp msgid "Clouds are a client side effect." -msgstr "" +msgstr "Mây là một hiệu ứng ở máy khách." #: src/settings_translation_file.cpp msgid "Clouds in menu" -msgstr "" +msgstr "Mây trong menu" #: src/settings_translation_file.cpp msgid "Colored fog" -msgstr "" +msgstr "Sương mù có màu" + +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "Bóng có màu" #: src/settings_translation_file.cpp msgid "" @@ -2476,15 +2831,31 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Command key" +msgstr "Phím lệnh" + +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" #: src/settings_translation_file.cpp msgid "Connect glass" -msgstr "" +msgstr "Kính kết nối với nhau" #: src/settings_translation_file.cpp msgid "Connect to external media server" -msgstr "" +msgstr "Kết nối đến máy chủ phương tiện bên ngoài" #: src/settings_translation_file.cpp msgid "Connects glass if supported by node." @@ -2502,10 +2873,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "Kho lưu trữ nội dung" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2522,18 +2901,27 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Controls" -msgstr "" +msgstr "Điều khiển" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Controls length of day/night cycle.\n" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" +"Điều chỉnh độ dài vòng lặp ngày/đêm.\n" +"Ví dụ:\n" +"72 = 20 phút, 360 = 4 phút, 1 = 24 giờ, 0 = day/night/whatever stays " +"unchanged." #: 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 "" +"Kiểm soát tốc độ chìm trong chất lỏng khi bạn đứng im. Trong khi đó,\n" +"giá trị âm sẽ làm bạn nổi lên." #: src/settings_translation_file.cpp msgid "Controls steepness/depth of lake depressions." @@ -2552,39 +2940,43 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Crash message" -msgstr "" +msgstr "Tin nhắn sự cố" #: src/settings_translation_file.cpp msgid "Creative" -msgstr "" +msgstr "Sáng tạo" #: src/settings_translation_file.cpp msgid "Crosshair alpha" -msgstr "" +msgstr "Độ trong suốt của tâm" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp msgid "Crosshair color" -msgstr "" +msgstr "Màu tâm" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: src/settings_translation_file.cpp msgid "Damage" -msgstr "" +msgstr "Sát thương" #: src/settings_translation_file.cpp msgid "Debug info toggle key" -msgstr "" +msgstr "Phím chuyển đổi thông tin gỡ lỗi" #: src/settings_translation_file.cpp msgid "Debug log file size threshold" @@ -2595,12 +2987,12 @@ msgid "Debug log level" msgstr "" #: src/settings_translation_file.cpp -msgid "Dec. volume key" -msgstr "" +msgid "Debugging" +msgstr "Gỡ lỗi" #: src/settings_translation_file.cpp -msgid "Decrease this to increase liquid resistance to movement." -msgstr "" +msgid "Dec. volume key" +msgstr "Phím giảm âm lượng" #: src/settings_translation_file.cpp msgid "Dedicated server step" @@ -2612,25 +3004,27 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Default game" -msgstr "" +msgstr "Trò chơi mặc định" #: 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 "" +"Trò chơi mặc định khi tạo thế giới mới.\n" +"Nó sẽ bị ghi đè khi tạo một thế giới từ màn hình chính." #: src/settings_translation_file.cpp msgid "Default password" -msgstr "" +msgstr "Mật khẩu mặc định" #: src/settings_translation_file.cpp msgid "Default privileges" -msgstr "" +msgstr "Quyền mặc định" #: src/settings_translation_file.cpp msgid "Default report format" -msgstr "" +msgstr "Định dạng báo cáo mặc định" #: src/settings_translation_file.cpp msgid "Default stack size" @@ -2638,8 +3032,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2670,12 +3065,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2731,6 +3120,8 @@ msgid "" "Description of server, to be displayed when players join and in the " "serverlist." msgstr "" +"Mô tả của máy chú, để hiển thị khi người chơi tham gia hay trong danh sách " +"máy chủ." #: src/settings_translation_file.cpp msgid "Desert noise threshold" @@ -2744,35 +3135,53 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Desynchronize block animation" -msgstr "" +msgstr "Không đồng bộ hoạt ảnh khối" + +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "Tùy chọn nhà phát triển" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "Phím đào" #: src/settings_translation_file.cpp msgid "Digging particles" -msgstr "" +msgstr "Hạt hiệu ứng khi đào" #: src/settings_translation_file.cpp msgid "Disable anticheat" -msgstr "" +msgstr "Vô hiệu trình chống gian lận" #: src/settings_translation_file.cpp msgid "Disallow empty passwords" +msgstr "Không cho phép mật khẩu trống" + +#: src/settings_translation_file.cpp +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 "" +msgstr "Tên miền của máy chủ, để hiển thị trong danh sách máy chủ." #: src/settings_translation_file.cpp msgid "Double tap jump for fly" -msgstr "" +msgstr "Nhấn đúp nút nhảy để bay" #: src/settings_translation_file.cpp msgid "Double-tapping the jump key toggles fly mode." -msgstr "" +msgstr "Nhấn đúp phím nhảy để chuyển đổi chế độ bay." #: src/settings_translation_file.cpp msgid "Drop item key" -msgstr "" +msgstr "Phím thả vật phẩm" #: src/settings_translation_file.cpp msgid "Dump the mapgen debug information." @@ -2780,39 +3189,60 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Dungeon maximum Y" -msgstr "" +msgstr "Y lớn nhất của ngục tối" #: src/settings_translation_file.cpp msgid "Dungeon minimum Y" -msgstr "" +msgstr "Y nhỏ nhất của ngục tối" #: src/settings_translation_file.cpp msgid "Dungeon noise" -msgstr "" +msgstr "Nhiễu ngục tối" #: src/settings_translation_file.cpp msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" +"Kích hoạt hỗ trợ IPv6 (cho cả máy khách và máy chủ).\n" +"Cần để việc kết nối IPv6 hoạt động." #: src/settings_translation_file.cpp msgid "" "Enable Lua modding support on client.\n" "This support is experimental and API can change." msgstr "" +"Kích hoạt hỗ trợ mod bằng Lua.\n" +"Đấy là tính năng thử nghiệm và API có thể sẽ thay đổi." + +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "" +msgid "Enable creative mode for all players" +msgstr "Kích hoạt chế độ sáng tạo cho tất cả người chơi" #: src/settings_translation_file.cpp msgid "Enable joysticks" -msgstr "" +msgstr "Kích hoạt joystick" + +#: src/settings_translation_file.cpp +msgid "Enable joysticks. Requires a restart to take effect" +msgstr "Kích hoạt joystick. Cần khởi động lại để có hiệu lực" #: src/settings_translation_file.cpp msgid "Enable mod channels support." @@ -2820,25 +3250,15 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enable mod security" -msgstr "" +msgstr "Kích hoạt bảo mật mod" #: src/settings_translation_file.cpp msgid "Enable players getting damage and dying." -msgstr "" +msgstr "Cho phép người chơi nhận sát thương và chết." #: 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 "" - -#: src/settings_translation_file.cpp -msgid "" -"Enable register confirmation when connecting to server.\n" -"If disabled, new account will be registered automatically." -msgstr "" +msgstr "Kích hoạt dữ liệu nhập ngẫu nhiên (chỉ cho việc thử nghiệm)." #: src/settings_translation_file.cpp msgid "" @@ -2846,6 +3266,10 @@ msgid "" "Disable for speed or for different looks." msgstr "" +#: src/settings_translation_file.cpp +msgid "Enable split login/register" +msgstr "Kích hoạt đăng nhập / đăng kí riêng lẻ" + #: src/settings_translation_file.cpp msgid "" "Enable to disallow old clients from connecting.\n" @@ -2854,6 +3278,12 @@ msgid "" "to new servers, but they may not support all new features that you are " "expecting." msgstr "" +"Kích hoạt để ngăn các máy khách sử dụng phiên bản cũ kết nối. Các máy khách " +"\n" +"cũ hơn tương thích trong trường hợp chúng không gặp sự cố khi kết nối vàomáy " +"chủ mới,\n" +"tuy nhiên chúng có thể không hỗ trợ tất cả các tính năng mới như bạn mong " +"đợi." #: src/settings_translation_file.cpp msgid "" @@ -2892,15 +3322,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enables animation of inventory items." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" +msgstr "Kích hoạt hoạt ảnh của các vật phẩm trong túi đồ." #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." @@ -2908,19 +3330,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Enables minimap." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" +msgstr "Kích hoạt minimap." #: src/settings_translation_file.cpp msgid "" @@ -2929,6 +3339,20 @@ msgid "" "sound controls will be non-functional.\n" "Changing this setting requires a restart." msgstr "" +"Kích hoạt hệ thống âm thanh.\n" +"Nếu vô hiệu hóa, điều này sẽ tắt hoàn toàn tất cả âm thanh trong trò chơi\n" +"điều khiển âm thanh sẽ không có tác dụng.\n" +"Thay đổi cài đặt này sẽ cần khởi động lại." + +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" @@ -2936,13 +3360,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Entity methods" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" +msgstr "Phương thức thực thể" #: src/settings_translation_file.cpp msgid "" @@ -2955,12 +3373,16 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "" +msgid "FPS" +msgstr "FPS" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "FPS khi cửa sổ đang hiện hoạt hoặc tạm dừng" #: src/settings_translation_file.cpp msgid "FSAA" -msgstr "" +msgstr "FSAA" #: src/settings_translation_file.cpp msgid "Factor noise" @@ -2974,18 +3396,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -3000,11 +3410,11 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Fast movement" -msgstr "" +msgstr "Đi nhanh" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3038,13 +3448,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3097,7 +3507,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Flying" -msgstr "" +msgstr "Bay" #: src/settings_translation_file.cpp msgid "Fog" @@ -3111,6 +3521,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3132,15 +3546,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3149,6 +3563,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3208,10 +3633,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3236,10 +3657,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3257,7 +3674,16 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Gamepads" +msgstr "Trò chơi" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3268,7 +3694,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3285,6 +3711,14 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Graphics" +msgstr "Đồ họa" + +#: src/settings_translation_file.cpp +msgid "Graphics Effects" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Graphics and Audio" msgstr "" #: src/settings_translation_file.cpp @@ -3304,7 +3738,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 @@ -3314,8 +3752,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3337,7 +3775,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3348,10 +3787,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3547,10 +3982,17 @@ 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 "" @@ -3583,8 +4025,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3606,11 +4047,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3634,7 +4081,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 @@ -3651,6 +4100,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3667,10 +4122,6 @@ msgstr "" 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 "" @@ -3685,7 +4136,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Inc. volume key" -msgstr "" +msgstr "Phím tăng âm lượng" #: src/settings_translation_file.cpp msgid "Initial vertical speed when jumping, in nodes per second." @@ -3698,7 +4149,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3721,16 +4172,12 @@ msgstr "" 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 @@ -3743,7 +4190,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Invert mouse" -msgstr "" +msgstr "Đảo ngược chuột" #: src/settings_translation_file.cpp msgid "Invert vertical mouse movement." @@ -3781,6 +4228,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3860,6 +4311,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3959,6 +4417,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4332,6 +4797,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4388,7 +4857,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 @@ -4398,15 +4867,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 @@ -4418,7 +4890,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4445,6 +4918,11 @@ msgstr "" msgid "Light curve low gradient" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Lighting" +msgstr "Ánh sáng mịn" + #: src/settings_translation_file.cpp msgid "" "Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\n" @@ -4516,21 +4994,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4592,6 +5070,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4697,7 +5179,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4745,6 +5231,16 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"Số lượt tải xuống đồng thời tối đa. Tải xuống vượt quá giới hạn sẽ được xếp " +"hàng đợi.\n" +"Giá trị này phải thấp hơn curl_parallel_limit." + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4799,17 +5295,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4858,12 +5358,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4874,6 +5386,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4892,7 +5408,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Mouse sensitivity" -msgstr "" +msgstr "Độ nhạy chuột" #: src/settings_translation_file.cpp msgid "Mouse sensitivity multiplier." @@ -4940,16 +5456,16 @@ msgstr "" 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 "" @@ -4962,6 +5478,11 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Node and Entity Highlighting" +msgstr "Đánh dấu node" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -4974,14 +5495,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -5003,18 +5516,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5024,11 +5529,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5037,38 +5537,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5091,17 +5565,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5130,13 +5600,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5147,6 +5621,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5181,10 +5659,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5192,9 +5666,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5284,10 +5758,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5357,6 +5827,11 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "Màn hình:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5384,6 +5859,11 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "Màn hình:" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5396,10 +5876,6 @@ msgstr "" 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 "" @@ -5440,8 +5916,19 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" -msgstr "" +#, fuzzy +msgid "Server" +msgstr "Lưu trữ máy chủ" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Gameplay" +msgstr "- Tên máy chủ: " + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server Security" +msgstr "Mô tả Máy chủ" #: src/settings_translation_file.cpp msgid "Server URL" @@ -5467,10 +5954,19 @@ msgstr "" msgid "Server side occlusion culling" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Server/Env Performance" +msgstr "Cổng máy chủ" + #: 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 "" @@ -5482,7 +5978,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5503,6 +6027,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5515,6 +6046,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5522,9 +6069,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5539,6 +6084,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5560,6 +6115,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5614,18 +6173,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5633,6 +6188,10 @@ msgid "" "(obviously, remote_media should end with a slash).\n" "Files that are not present will be fetched the usual way." msgstr "" +"Chỉ định URL mà từ đó ứng dụng khách tìm phương tiện thay vì sử dụng UDP.\n" +"$filename có thể truy cập được từ $remote_media$filename qua cURL\n" +"(trong đó, remote_media phải kết thúc bằng dấu gạch chéo).\n" +"Các tệp không có mặt sẽ được tìm theo cách thông thường." #: src/settings_translation_file.cpp msgid "" @@ -5641,6 +6200,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5668,10 +6235,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5709,6 +6272,11 @@ msgstr "" msgid "Temperature variation for biomes." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Temporary Settings" +msgstr "Cài đặt" + #: src/settings_translation_file.cpp msgid "Terrain alternative noise" msgstr "" @@ -5751,6 +6319,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5765,6 +6340,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5820,18 +6399,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5849,6 +6428,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5857,9 +6442,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5896,7 +6480,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 @@ -5919,6 +6503,18 @@ msgstr "" 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 "" @@ -5989,15 +6585,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6091,7 +6702,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6161,6 +6772,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6182,18 +6797,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6208,7 +6821,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Whether to allow players to damage and kill each other." -msgstr "" +msgstr "Có cho phép người chơi sát thương và giết lẫn nhau hay không." #: src/settings_translation_file.cpp msgid "" @@ -6228,13 +6841,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6256,7 +6878,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "World start time" -msgstr "" +msgstr "Thời gian khởi động thế giới" #: src/settings_translation_file.cpp msgid "" @@ -6318,17 +6940,44 @@ msgstr "" msgid "Y-level of seabed." msgstr "" +#: src/settings_translation_file.cpp +msgid "cURL" +msgstr "cURL" + #: src/settings_translation_file.cpp msgid "cURL file download timeout" -msgstr "" +msgstr "Hết thời gian chờ tải xuống tệp trong cURL" + +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "Hết thời gian tương tác với cURL" #: src/settings_translation_file.cpp msgid "cURL parallel limit" -msgstr "" +msgstr "Gặp giới hạn số lượng tệp tải xuống trong cURL" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" +#~ msgid "- Creative Mode: " +#~ msgstr "- Chế độ sáng tạo: " + +#~ msgid "- Damage: " +#~ msgstr "- Tổn hại: " + +#~ msgid "Connect" +#~ msgstr "Kết nối" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "" +#~ "Tải xuống một trò chơi, chẳng hạn như trò chơi Minetest, từ minetest.net" + +#~ msgid "Download one from minetest.net" +#~ msgstr "Tải xuống một trò chơi từ minetest.net" + +#~ msgid "Game" +#~ msgstr "Trò chơi" #~ msgid "Ok" #~ msgstr "Được" + +#, fuzzy +#~ msgid "You died." +#~ msgstr "Bạn đã chết" diff --git a/po/my/minetest.po b/po/yue/minetest.po similarity index 86% rename from po/my/minetest.po rename to po/yue/minetest.po index 549653ac5..536ba0e2f 100644 --- a/po/my/minetest.po +++ b/po/yue/minetest.po @@ -1,18 +1,56 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the minetest package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# msgid "" msgstr "" -"Project-Id-Version: Burmese (Minetest)\n" +"Project-Id-Version: minetest\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-01-11 18:26+0000\n" -"Last-Translator: rubenwardy <rubenwardy@gmail.com>\n" -"Language-Team: Burmese <https://hosted.weblate.org/projects/minetest/" -"minetest/my/>\n" -"Language: my\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: yue\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.10.1\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,10 +60,39 @@ msgstr "" msgid "You died" msgstr "" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "" +"Use '.help <cmd>' to get more information, or '.help all' to list everything." +msgstr "" + +#: builtin/common/chatcommands.lua +msgid "[all | <cmd>]" +msgstr "" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" msgstr "" +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "" + #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" msgstr "" @@ -46,8 +113,28 @@ msgstr "" msgid "The server has requested a reconnect:" msgstr "" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." +#: 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 @@ -63,7 +150,7 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "" #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." +msgid "Visit website" msgstr "" #: builtin/mainmenu/common.lua @@ -74,17 +161,26 @@ msgstr "" msgid "We support protocol versions between version $1 and $2." msgstr "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "" @@ -155,14 +251,52 @@ msgstr "" msgid "enabled" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "" +"$1 downloading,\n" +"$2 queued" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 downloading..." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Base Game:" +msgstr "" + #: builtin/mainmenu/dlg_contentstore.lua msgid "ContentDB is not available when Minetest was compiled without cURL" msgstr "" @@ -176,7 +310,6 @@ msgid "Failed to download $1" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "" @@ -185,7 +318,18 @@ msgid "Install" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "" @@ -198,8 +342,23 @@ msgid "No results" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" +msgid "No updates" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua @@ -215,7 +374,11 @@ msgid "Update" msgstr "" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" +msgid "Update All [$1]" +msgstr "" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" msgstr "" #: builtin/mainmenu/dlg_create_world.lua @@ -259,11 +422,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 @@ -282,10 +441,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 "" @@ -302,6 +457,14 @@ msgstr "" msgid "Increases humidity around rivers" msgstr "" +#: builtin/mainmenu/dlg_create_world.lua +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 "" @@ -401,10 +564,6 @@ msgstr "" 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 "" @@ -435,6 +594,36 @@ 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 +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 msgid "Accept" msgstr "" @@ -466,6 +655,14 @@ 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 "" @@ -490,7 +687,7 @@ msgid "Offset" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +msgid "Persistence" msgstr "" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -509,6 +706,10 @@ msgstr "" msgid "Scale" msgstr "" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "" @@ -517,7 +718,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 "" @@ -596,14 +797,6 @@ msgstr "" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "" @@ -624,6 +817,56 @@ msgstr "" msgid "Unable to install a modpack as a $1" msgstr "" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +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 msgid "Browse online content" msgstr "" @@ -664,26 +907,6 @@ msgstr "" msgid "Use Texture Pack" msgstr "" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "" @@ -693,14 +916,10 @@ msgid "Bind Address" msgstr "" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "" @@ -716,10 +935,6 @@ msgstr "" msgid "Install games from ContentDB" msgstr "" -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "" - #: builtin/mainmenu/tab_local.lua msgid "New" msgstr "" @@ -732,10 +947,14 @@ msgstr "" msgid "Play Game" msgstr "" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "" @@ -749,44 +968,60 @@ msgid "Start Game" msgstr "" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" +msgid "Address" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" msgstr "" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" +#: builtin/mainmenu/tab_online.lua +msgid "Login" msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "" + +#: builtin/mainmenu/tab_online.lua +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 @@ -813,10 +1048,6 @@ msgstr "" msgid "Antialiasing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "" @@ -825,10 +1056,6 @@ msgstr "" msgid "Bilinear Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "" @@ -837,12 +1064,28 @@ msgstr "" msgid "Connected Glass" msgstr "" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Dynamic shadows:" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" +msgid "High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" msgstr "" #: builtin/mainmenu/tab_settings.lua @@ -853,10 +1096,6 @@ msgstr "" msgid "Mipmap + Aniso. Filter" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "" @@ -885,18 +1124,10 @@ msgstr "" msgid "Opaque Water" msgstr "" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "" @@ -909,6 +1140,10 @@ msgstr "" msgid "Shaders" msgstr "" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "" @@ -925,22 +1160,26 @@ msgstr "" msgid "Texturing:" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "" - #: 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 "" +#: builtin/mainmenu/tab_settings.lua +msgid "Very High" +msgstr "" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "" @@ -953,23 +1192,11 @@ msgstr "" msgid "Waving Plants" msgstr "" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -msgstr "" - #: src/client/client.cpp +msgid "Connection aborted (protocol error?)." +msgstr "" + +#: src/client/client.cpp src/client/game.cpp msgid "Connection timed out." msgstr "" @@ -998,7 +1225,7 @@ msgid "Connection error (timed out?)" msgstr "" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" +msgid "Could not find or load game: " msgstr "" #: src/client/clientlauncher.cpp @@ -1029,18 +1256,6 @@ msgstr "" msgid "Provided world path doesn't exist: " msgstr "" -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1051,14 +1266,6 @@ msgstr "" msgid "- Address: " msgstr "" -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "" - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "" - #: src/client/game.cpp msgid "- Mode: " msgstr "" @@ -1080,6 +1287,15 @@ msgstr "" msgid "- Server Name: " msgstr "" +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "" @@ -1088,6 +1304,22 @@ msgstr "" msgid "Automatic forward enabled" msgstr "" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "" @@ -1096,6 +1328,10 @@ msgstr "" msgid "Camera update enabled" msgstr "" +#: src/client/game.cpp +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "" + #: src/client/game.cpp msgid "Change Password" msgstr "" @@ -1108,6 +1344,10 @@ msgstr "" msgid "Cinematic mode enabled" msgstr "" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "" @@ -1116,6 +1356,10 @@ msgstr "" msgid "Connecting to server..." msgstr "" +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "" + #: src/client/game.cpp msgid "Continue" msgstr "" @@ -1128,17 +1372,22 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "" + #: src/client/game.cpp msgid "Creating client..." msgstr "" @@ -1183,6 +1432,11 @@ msgstr "" 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 "" @@ -1256,31 +1510,7 @@ msgid "Minimap currently disabled by game or mod" msgstr "" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" +msgid "Multiplayer" msgstr "" #: src/client/game.cpp @@ -1355,6 +1585,21 @@ msgstr "" msgid "Sound unmuted" msgstr "" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to connect to %s because IPv6 is disabled" +msgstr "" + +#: src/client/game.cpp +#, c-format +msgid "Unable to listen on %s because IPv6 is disabled" +msgstr "" + #: src/client/game.cpp #, c-format msgid "Viewing range changed to %d" @@ -1424,10 +1669,6 @@ msgstr "" msgid "Caps Lock" msgstr "" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "" - #: src/client/keycode.cpp msgid "Control" msgstr "" @@ -1675,22 +1916,30 @@ msgstr "" msgid "Zoom" msgstr "" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" +#: src/client/minimap.cpp +msgid "Minimap hidden" msgstr "" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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." +msgid "Minimap in radar mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" msgstr "" #: src/gui/guiFormSpecMenu.cpp @@ -1698,7 +1947,7 @@ msgid "Proceed" msgstr "" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" +msgid "\"Aux1\" = climb down" msgstr "" #: src/gui/guiKeyChangeMenu.cpp @@ -1709,15 +1958,23 @@ msgstr "" msgid "Automatic jumping" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "" @@ -1770,7 +2027,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 @@ -1801,10 +2058,6 @@ msgstr "" msgid "Sneak" msgstr "" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "" @@ -1845,10 +2098,6 @@ msgstr "" msgid "Change" msgstr "" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "" @@ -1857,6 +2106,10 @@ msgstr "" msgid "Old Password" msgstr "" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "" @@ -1866,13 +2119,8 @@ msgid "Muted" msgstr "" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "" - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " +#, c-format +msgid "Sound Volume: %d%%" msgstr "" #. ~ DO NOT TRANSLATE THIS LITERALLY! @@ -1880,7 +2128,16 @@ msgstr "" #. language code (e.g. "de" for German). #: src/network/clientpackethandler.cpp src/script/lua_api/l_client.cpp msgid "LANG_CODE" -msgstr "my" +msgstr "" + +#: 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 "" @@ -1890,8 +2147,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" @@ -1918,12 +2175,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "" @@ -2012,6 +2263,10 @@ msgid "" "Note that the interlaced mode requires shaders to be enabled." 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" @@ -2030,6 +2285,10 @@ msgstr "" msgid "ABM interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "" + #: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" msgstr "" @@ -2075,6 +2334,10 @@ msgid "" "screens." msgstr "" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2085,6 +2348,10 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +msgid "Admin name" +msgstr "" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "" @@ -2099,7 +2366,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +msgid "Always fly fast" msgstr "" #: src/settings_translation_file.cpp @@ -2167,6 +2434,10 @@ msgid "" "Stated in mapblocks (16 nodes)." msgstr "" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "" @@ -2187,6 +2458,14 @@ msgstr "" msgid "Autoscaling mode" msgstr "" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "" @@ -2199,10 +2478,6 @@ msgstr "" msgid "Base terrain height." msgstr "" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "" @@ -2224,7 +2499,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 @@ -2232,11 +2507,11 @@ msgid "Biome noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." +msgid "Block send optimize distance" msgstr "" #: src/settings_translation_file.cpp -msgid "Block send optimize distance" +msgid "Bobbing" msgstr "" #: src/settings_translation_file.cpp @@ -2264,7 +2539,7 @@ msgid "Builtin" msgstr "" #: src/settings_translation_file.cpp -msgid "Bumpmapping" +msgid "Camera" msgstr "" #: src/settings_translation_file.cpp @@ -2338,13 +2613,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." +msgid "Chat command time message threshold" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Chat commands" msgstr "" #: src/settings_translation_file.cpp @@ -2380,7 +2653,7 @@ msgid "Chat toggle key" msgstr "" #: src/settings_translation_file.cpp -msgid "Chatcommands" +msgid "Chat weblinks" msgstr "" #: src/settings_translation_file.cpp @@ -2399,6 +2672,12 @@ msgstr "" msgid "Clean transparent textures" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" + #: src/settings_translation_file.cpp msgid "Client" msgstr "" @@ -2419,6 +2698,10 @@ msgstr "" 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 "" @@ -2443,6 +2726,10 @@ msgstr "" msgid "Colored fog" msgstr "" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2470,6 +2757,22 @@ msgstr "" msgid "Command key" msgstr "" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "" @@ -2494,10 +2797,18 @@ msgstr "" msgid "Console height" msgstr "" +#: src/settings_translation_file.cpp +msgid "Content Repository" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "" @@ -2524,7 +2835,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 @@ -2555,7 +2868,9 @@ msgid "Crosshair alpha" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." msgstr "" #: src/settings_translation_file.cpp @@ -2563,7 +2878,9 @@ msgid "Crosshair color" msgstr "" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" msgstr "" #: src/settings_translation_file.cpp @@ -2587,11 +2904,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 @@ -2630,8 +2947,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" #: src/settings_translation_file.cpp @@ -2662,12 +2980,6 @@ msgstr "" msgid "Defines location and terrain of optional hills and lakes." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "" @@ -2738,6 +3050,14 @@ msgstr "" msgid "Desynchronize block animation" msgstr "" +#: src/settings_translation_file.cpp +msgid "Developer Options" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Dig key" +msgstr "" + #: src/settings_translation_file.cpp msgid "Digging particles" msgstr "" @@ -2750,6 +3070,16 @@ msgstr "" msgid "Disallow empty passwords" msgstr "" +#: src/settings_translation_file.cpp +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 "" @@ -2794,18 +3124,35 @@ msgid "" "This support is experimental and API can change." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." +msgid "Enable creative mode for all players" 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 "" @@ -2822,22 +3169,16 @@ msgstr "" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" "Disable for speed or for different looks." 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" @@ -2886,14 +3227,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "" @@ -2902,18 +3235,6 @@ msgstr "" msgid "Enables minimap." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -2922,6 +3243,16 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +msgid "Engine profiler" +msgstr "" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "" @@ -2930,12 +3261,6 @@ msgstr "" msgid "Entity methods" msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -2947,7 +3272,11 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" msgstr "" #: src/settings_translation_file.cpp @@ -2966,18 +3295,6 @@ msgstr "" msgid "Fallback font path" msgstr "" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "" @@ -2996,7 +3313,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" @@ -3030,13 +3347,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" #: src/settings_translation_file.cpp -msgid "Filtering" +msgid "Filtering and Antialiasing" msgstr "" #: src/settings_translation_file.cpp @@ -3103,6 +3420,10 @@ msgstr "" msgid "Fog toggle key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Font" +msgstr "" + #: src/settings_translation_file.cpp msgid "Font bold by default" msgstr "" @@ -3124,15 +3445,15 @@ msgid "Font size" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3141,6 +3462,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3200,10 +3532,6 @@ msgstr "" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3228,10 +3556,6 @@ msgstr "" msgid "Full screen" msgstr "" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "" @@ -3249,7 +3573,15 @@ msgid "GUI scaling filter txr2img" msgstr "" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" +msgid "GUIs" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Gamepads" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "General" msgstr "" #: src/settings_translation_file.cpp @@ -3260,7 +3592,7 @@ msgstr "" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" #: src/settings_translation_file.cpp @@ -3279,6 +3611,14 @@ msgstr "" 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 "" @@ -3296,7 +3636,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 @@ -3306,8 +3650,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" @@ -3329,7 +3673,8 @@ msgid "Heat noise" msgstr "" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -3340,10 +3685,6 @@ msgstr "" msgid "Height select noise" msgstr "" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "" @@ -3539,10 +3880,17 @@ 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 "" @@ -3575,8 +3923,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "" @@ -3598,11 +3945,17 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." 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" @@ -3626,7 +3979,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 @@ -3643,6 +3998,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3659,10 +4020,6 @@ msgstr "" 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 "" @@ -3690,7 +4047,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +msgid "Instrument chat commands on registration." msgstr "" #: src/settings_translation_file.cpp @@ -3713,16 +4070,12 @@ msgstr "" 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 @@ -3773,6 +4126,10 @@ msgstr "" msgid "Joystick button repetition interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Joystick dead zone" +msgstr "" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "" @@ -3852,6 +4209,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -3951,6 +4315,13 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4324,6 +4695,10 @@ msgid "" "html#a54da2a0e231901735e3da1b0edf72eb3" 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 "" @@ -4380,7 +4755,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 @@ -4390,15 +4765,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 @@ -4410,7 +4788,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" #: src/settings_translation_file.cpp @@ -4437,6 +4816,10 @@ msgstr "" 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" @@ -4508,21 +4891,21 @@ msgstr "" msgid "Main menu script" msgstr "" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "" #: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +msgid "Makes all liquids opaque" msgstr "" #: src/settings_translation_file.cpp -msgid "Makes all liquids opaque" +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" msgstr "" #: src/settings_translation_file.cpp @@ -4584,6 +4967,10 @@ msgstr "" msgid "Map save interval" msgstr "" +#: src/settings_translation_file.cpp +msgid "Map shadows update frames" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "" @@ -4689,7 +5076,11 @@ msgid "Maximum FPS" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." msgstr "" #: src/settings_translation_file.cpp @@ -4737,6 +5128,13 @@ msgid "" "This limit is enforced per player." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "" @@ -4791,17 +5189,21 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." msgstr "" #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "" @@ -4850,12 +5252,24 @@ msgstr "" 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +msgid "Modifies the size of the HUD elements." msgstr "" #: src/settings_translation_file.cpp @@ -4866,6 +5280,10 @@ msgstr "" msgid "Monospace font size" msgstr "" +#: src/settings_translation_file.cpp +msgid "Monospace font size divisible by" +msgstr "" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "" @@ -4932,16 +5350,16 @@ msgstr "" 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 "" @@ -4954,6 +5372,10 @@ msgstr "" msgid "Noclip key" msgstr "" +#: src/settings_translation_file.cpp +msgid "Node and Entity Highlighting" +msgstr "" + #: src/settings_translation_file.cpp msgid "Node highlighting" msgstr "" @@ -4966,14 +5388,6 @@ msgstr "" msgid "Noises" msgstr "" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "" @@ -4995,18 +5409,10 @@ msgstr "" #: src/settings_translation_file.cpp 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" +"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 "Number of parallax occlusion iterations." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "" @@ -5016,11 +5422,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5029,38 +5430,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" +msgid "Optional override for chat weblink color." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5083,17 +5458,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5122,13 +5493,17 @@ msgid "Pitch move mode" msgstr "" #: 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." +msgid "Place key" msgstr "" #: src/settings_translation_file.cpp -msgid "Player name" +msgid "Place repetition interval" +msgstr "" + +#: 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 @@ -5139,6 +5514,10 @@ msgstr "" msgid "Player versus player" msgstr "" +#: src/settings_translation_file.cpp +msgid "Poisson filtering" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5173,10 +5552,6 @@ msgstr "" msgid "Profiler toggle key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5184,9 +5559,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5276,10 +5651,6 @@ msgstr "" msgid "Right key" msgstr "" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "" @@ -5349,6 +5720,10 @@ msgid "" "edge pixels when images are scaled by non-integer sizes." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screen" +msgstr "" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "" @@ -5376,6 +5751,10 @@ msgid "" "Use 0 for default quality." msgstr "" +#: src/settings_translation_file.cpp +msgid "Screenshots" +msgstr "" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "" @@ -5388,10 +5767,6 @@ msgstr "" 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 "" @@ -5432,7 +5807,15 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Server / Singleplayer" +msgid "Server" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Gameplay" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Server Security" msgstr "" #: src/settings_translation_file.cpp @@ -5459,10 +5842,18 @@ msgstr "" 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 "" @@ -5474,7 +5865,35 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." msgstr "" #: src/settings_translation_file.cpp @@ -5495,6 +5914,13 @@ msgid "" "Requires shaders to be enabled." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "" @@ -5507,6 +5933,22 @@ msgid "" "This only works with the OpenGL video backend." msgstr "" +#: src/settings_translation_file.cpp +msgid "Shadow filter quality" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture size" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -5514,9 +5956,7 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." +msgid "Shadow strength gamma" msgstr "" #: src/settings_translation_file.cpp @@ -5531,6 +5971,16 @@ msgstr "" msgid "Show entity selection boxes" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "" @@ -5552,6 +6002,10 @@ msgid "" "thread, thus reducing jitter." msgstr "" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "" @@ -5606,18 +6060,14 @@ msgstr "" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +msgid "Soft shadow radius" +msgstr "" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -5633,6 +6083,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -5660,10 +6118,6 @@ msgstr "" msgid "Strength of 3D mode parallax." msgstr "" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -5701,6 +6155,10 @@ msgstr "" 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 "" @@ -5743,6 +6201,13 @@ msgstr "" msgid "Texture path" msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -5757,6 +6222,10 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +msgid "The dead zone of the joystick" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -5812,18 +6281,18 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" #: src/settings_translation_file.cpp @@ -5841,6 +6310,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -5849,9 +6324,8 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp @@ -5888,7 +6362,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 @@ -5911,6 +6385,18 @@ msgstr "" 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 "" @@ -5981,15 +6467,30 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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 "" @@ -6083,7 +6584,7 @@ msgid "Viewing range" msgstr "" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6153,6 +6654,10 @@ msgstr "" msgid "Waving plants" msgstr "" +#: src/settings_translation_file.cpp +msgid "Weblink color" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6174,18 +6679,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6220,13 +6723,22 @@ msgid "" "pause menu." 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 "" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "" #: src/settings_translation_file.cpp @@ -6310,14 +6822,18 @@ msgstr "" 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 "" +#: src/settings_translation_file.cpp +msgid "cURL interactive timeout" +msgstr "" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "" - -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "" diff --git a/po/zh_CN/minetest.po b/po/zh_CN/minetest.po index 80f2d86fa..9bca847ff 100644 --- a/po/zh_CN/minetest.po +++ b/po/zh_CN/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-06-13 21:08+0000\n" -"Last-Translator: ferrumcccp <wushuzhen1975@icloud.com>\n" +"POT-Creation-Date: 2022-07-20 21:43+0200\n" +"PO-Revision-Date: 2022-05-19 18:13+0000\n" +"Last-Translator: GT-610 <myddz1005@163.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "minetest/minetest/zh_Hans/>\n" "Language: zh_CN\n" @@ -12,7 +12,43 @@ 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.1-dev\n" +"X-Generator: Weblate 4.13-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "清除聊天发送队列" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "空命令。" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "退出至主菜单" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "无效命令 " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "发送的命令 " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "列出联机玩家" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "在线玩家: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "聊天发送队列现在为空。" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "服务器已禁用该命令." #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,9 +58,39 @@ msgstr "重生" msgid "You died" msgstr "您已死亡" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "可用命令:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "可用命令: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "命令不可用: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[all | <命令>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<无可用命令>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -46,9 +112,30 @@ msgstr "重新连接" msgid "The server has requested a reconnect:" msgstr "服务器已请求重新连接:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -msgstr "载入中..." +#: builtin/mainmenu/common.lua +msgid "A new $1 version is available" +msgstr "" + +#: builtin/mainmenu/common.lua +#, fuzzy +msgid "Client Mods" +msgstr "选择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. " @@ -63,8 +150,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "服务器支持协议版本为 $1 至 $2。 " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "请尝试重新启用公共服务器列表并检查您的网络连接。" +msgid "Visit website" +msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -74,17 +161,26 @@ msgstr "我们只支持协议版本 $1。" msgid "We support protocol versions between version $1 and $2." msgstr "我们支持的协议版本为 $1 至 $2。" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "取消" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "依赖项:" @@ -112,7 +208,7 @@ msgstr "无法启用 mod \"$1\":因为包含有不支持的字符。只允许 #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "寻找更多mod" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -155,29 +251,67 @@ msgstr "世界:" msgid "enabled" msgstr "启用" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "\"$1\"已经存在,你想覆写吗?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 和 $2 依赖项将被安装." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "正在下载 $1 ……" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "有$1个依赖项没有找到。" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "$1 将被安装, $2 依赖项将被跳过." + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "所有包" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "已安装" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "返回主菜单" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "基础游戏:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "在没有cURL的情况下编译Minetest时,ContentDB不可用" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "载入中..." +msgstr "下载中..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" msgstr "下载 $1 失败" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "子游戏" @@ -186,7 +320,19 @@ msgid "Install" msgstr "安装" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "安装$1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "安装缺失的依赖项" + +#: builtin/mainmenu/dlg_contentstore.lua +#, fuzzy +msgid "Install: Unsupported file type or broken archive" +msgstr "安装:文件类型不支持或档案已损坏" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" msgstr "Mod" @@ -199,9 +345,24 @@ msgid "No results" msgstr "无结果" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "搜索" +msgid "No updates" +msgstr "没有更新" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "未找到" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "覆写" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "请查看游戏是否正确。" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "已加入队列" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -216,8 +377,12 @@ msgid "Update" msgstr "更新" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "更新所有 [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "在网络浏览器中查看更多信息" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" @@ -225,100 +390,93 @@ 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 "高地寒冷" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Altitude dry" -msgstr "高地寒冷" +msgstr "高地干燥" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biome blending" -msgstr "生物群系噪声" +msgstr "生物群系融合" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Biomes" -msgstr "生物群系噪声" +msgstr "生物群系" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "大型洞穴噪声" +msgstr "大型洞穴" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "八音" +msgstr "洞穴" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "创建" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "迭代" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "从 minetest.net 下载一个子游戏,例如 minetest_game" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "从 minetest.net 下载一个" +msgstr "装饰" #: builtin/mainmenu/dlg_create_world.lua #, fuzzy +msgid "Development Test is meant for developers." +msgstr "警告:开发测试是为开发者提供的。" + +#: 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 -#, fuzzy 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 "生成非分形地形:海洋和地底" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "丘陵" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 msgid "Lakes" -msgstr "" +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" @@ -329,22 +487,20 @@ msgid "Mapgen flags" msgstr "地图生成器标志" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "地图生成器 v5 标签" +msgstr "地图生成器专用标签" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mountains" -msgstr "山噪声" +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" @@ -352,20 +508,19 @@ 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 -#, fuzzy msgid "Rivers" -msgstr "河流大小" +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 @@ -374,52 +529,45 @@ msgstr "种子" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "生物群落之间的平滑过渡" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" -msgstr "" +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 -#, fuzzy 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 -#, fuzzy 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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "警告: 最小化开发测试是为开发者提供的。" +msgstr "地下深处的大型洞穴" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -451,6 +599,39 @@ msgstr "pkgmgr:MOD 路径 “$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 +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 "接受" @@ -483,6 +664,16 @@ 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 "禁用" @@ -507,7 +698,8 @@ msgid "Offset" msgstr "补偿" #: builtin/mainmenu/dlg_settings_advanced.lua -msgid "Persistance" +#, fuzzy +msgid "Persistence" msgstr "持续性" #: builtin/mainmenu/dlg_settings_advanced.lua @@ -526,6 +718,10 @@ msgstr "恢复初始设置" msgid "Scale" msgstr "比例" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "搜索" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "选择目录" @@ -534,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 "显示高级名称" @@ -613,14 +809,6 @@ msgstr "安装mod:无法找到$1的真实mod名称" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "安装mod:无法找到mod包$1的合适文件夹名" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "安装:“$1“为不支持的文件类型或已损坏" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "安装:文件:”$1“" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "无法找到mod或mod包" @@ -641,6 +829,59 @@ msgstr "无法将$1安装为mod" msgid "Unable to install a modpack as a $1" msgstr "无法将$1安装为mod包" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "载入中..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "已禁用公共服务器列表" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "请尝试重新启用公共服务器列表并检查您的网络连接。" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "关于" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "积极贡献者" + +#: builtin/mainmenu/tab_about.lua +msgid "Active renderer:" +msgstr "主动渲染器:" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "核心开发者" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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 "" +"在文件(资源)管理器中打开含有用户提供的世界,游戏,mods\n" +"和纹理包的目录。" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "前贡献者" + +#: builtin/mainmenu/tab_about.lua +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 "浏览在线内容" @@ -681,26 +922,6 @@ msgstr "删除包" msgid "Use Texture Pack" msgstr "使用材质包" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "积极贡献者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "核心开发者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "贡献者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "前贡献者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "前核心开发者" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "公开服务器" @@ -710,14 +931,10 @@ msgid "Bind Address" msgstr "绑定地址" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "配置" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "创造模式" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "开启伤害" @@ -731,11 +948,7 @@ msgstr "建立服务器" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "用户名/密码" +msgstr "从 ContentDB 安装游戏" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -749,10 +962,14 @@ msgstr "未创建或选择世界!" msgid "Play Game" msgstr "开始游戏" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "端口" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "选择Mod" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "选择世界:" @@ -766,45 +983,62 @@ msgid "Start Game" msgstr "启动游戏" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "地址/端口" +msgid "Address" +msgstr "地址" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "连接" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "Clear键" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "创造模式" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "伤害已启用" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "伤害 / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "删除收藏项" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" +msgstr "我的收藏" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" -msgstr "收藏项" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "不兼容的服务器" #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "加入游戏" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "用户名/密码" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "应答速度" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "启用玩家对战" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "公开服务器" + +#: builtin/mainmenu/tab_online.lua +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" @@ -830,10 +1064,6 @@ msgstr "所有设置" msgid "Antialiasing:" msgstr "抗锯齿:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "你确定要重置你的单人世界吗?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "自动保存屏幕尺寸" @@ -842,10 +1072,6 @@ msgstr "自动保存屏幕尺寸" msgid "Bilinear Filter" msgstr "双线性过滤" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "凹凸贴图" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "更改键位设置" @@ -854,13 +1080,30 @@ msgstr "更改键位设置" msgid "Connected Glass" msgstr "连通玻璃" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "动态阴影" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "动态阴影: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "华丽树叶" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "生成法线贴图" +msgid "High" +msgstr "高" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "低" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "中" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -870,10 +1113,6 @@ msgstr "Mip 贴图" msgid "Mipmap + Aniso. Filter" msgstr "Mip 贴图 + 各向异性过滤" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "否" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "无过滤" @@ -902,18 +1141,10 @@ msgstr "不透明树叶" msgid "Opaque Water" msgstr "不透明水" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "视差遮蔽" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "粒子效果" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "重置单人世界" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "屏幕:" @@ -926,6 +1157,10 @@ msgstr "设置" msgid "Shaders" msgstr "着色器" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "着色器(实验性)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "着色器 (不可用)" @@ -940,24 +1175,30 @@ msgstr "平滑光照" #: builtin/mainmenu/tab_settings.lua msgid "Texturing:" -msgstr "纹理:" - -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "启用着色器需要使用OpenGL驱动。" +msgstr "材质:" #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "色调映射" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "触控阈值:(px)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "三线性过滤" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "超出高度限制" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "过于低" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "飘动树叶" @@ -970,23 +1211,12 @@ msgstr "摇动流体" msgid "Waving Plants" msgstr "摇摆植物" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "是" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "配置 mod" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "主菜单" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "连接超时。" @@ -1015,8 +1245,8 @@ msgid "Connection error (timed out?)" msgstr "连接出错(超时?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "无法找到或者载入游戏 \"" +msgid "Could not find or load game: " +msgstr "找不到子游戏或者无法载入子游戏: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1046,18 +1276,6 @@ msgstr "提供的密码文件无法打开: " msgid "Provided world path doesn't exist: " msgstr "提供的世界路径不存在: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1070,14 +1288,6 @@ msgstr "" msgid "- Address: " msgstr "- 地址: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- 创造模式: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- 伤害: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- 模式: " @@ -1099,6 +1309,15 @@ msgstr "- 玩家对战: " msgid "- Server Name: " msgstr "- 服务器名称: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "序列化发生了错误:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "访问被拒绝。原因:%s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "自动前进已禁用" @@ -1107,6 +1326,22 @@ msgstr "自动前进已禁用" msgid "Automatic forward enabled" msgstr "自动前进已启用" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "已隐藏方块边界" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "已为所有方块描边" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "已为当前方块描边" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "已为周围方块描边" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "已禁用镜头更新" @@ -1115,6 +1350,11 @@ msgstr "已禁用镜头更新" msgid "Camera update enabled" msgstr "已启用镜头更新" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "无法显示方块的边界 (需要“basic_debug”权限)" + #: src/client/game.cpp msgid "Change Password" msgstr "更改密码" @@ -1127,6 +1367,10 @@ msgstr "电影模式已禁用" msgid "Cinematic mode enabled" msgstr "电影模式已启用" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "与客户端的连接已断开" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "客户端脚本已禁用" @@ -1135,6 +1379,10 @@ msgstr "客户端脚本已禁用" msgid "Connecting to server..." msgstr "正在连接服务器..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "连接失败,原因不明" + #: src/client/game.cpp msgid "Continue" msgstr "继续" @@ -1147,13 +1395,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1162,16 +1410,21 @@ msgstr "" "- %s:向后移动\n" "- %s:向左移动\n" "- %s:向右移动\n" -"- %s:跳/爬\n" -"- %s:潜行/向下\n" +"- %s:跳/向上(攀爬)\n" +"- %s:挖/打\n" +"- %s:放/使用\n" +"- %s:潜行/向下(攀爬)\n" "- %s:丢弃物品\n" "- %s:物品清单\n" "- 鼠标:转身/环顾\n" -"- 鼠标左键: 挖/打\n" -"- 鼠标右键: 放/使用\n" "- 鼠标滚轮: 选择物品\n" "- %s:聊天\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "地址无法解析:%s" + #: src/client/game.cpp msgid "Creating client..." msgstr "正在建立客户端..." @@ -1182,7 +1435,7 @@ msgstr "建立服务器...." #: src/client/game.cpp msgid "Debug info and profiler graph hidden" -msgstr "隐藏的调试信息和性能分析图" +msgstr "调试信息和性能分析图已隐藏" #: src/client/game.cpp msgid "Debug info shown" @@ -1190,7 +1443,7 @@ msgstr "调试信息已显示" #: src/client/game.cpp msgid "Debug info, profiler graph, and wireframe hidden" -msgstr "隐藏调试信息,性能分析图,和线框" +msgstr "调试信息、性能分析图和线框已隐藏" #: src/client/game.cpp msgid "" @@ -1228,6 +1481,11 @@ msgstr "禁用无限视野" 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 "退出至菜单" @@ -1242,7 +1500,7 @@ msgstr "快速模式已禁用" #: src/client/game.cpp msgid "Fast mode enabled" -msgstr "快速移动模式已启用" +msgstr "快速模式已启用" #: src/client/game.cpp msgid "Fast mode enabled (note: no 'fast' privilege)" @@ -1301,32 +1559,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "小地图被当前子游戏或者 mod 禁用" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "小地图已隐藏" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "雷达小地图,放大至一倍" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "雷达小地图,放大至两倍" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "雷达小地图, 放大至四倍" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "地表模式小地图, 放大至一倍" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "地表模式小地图, 放大至两倍" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "地表模式小地图, 放大至四倍" +msgid "Multiplayer" +msgstr "多人游戏" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1358,11 +1592,11 @@ msgstr "俯仰移动模式已禁用" #: src/client/game.cpp msgid "Pitch move mode enabled" -msgstr "俯仰移动模式已禁用" +msgstr "俯仰移动模式已启用" #: src/client/game.cpp msgid "Profiler graph shown" -msgstr "显示性能分析图" +msgstr "性能分析图已显示" #: src/client/game.cpp msgid "Remote server" @@ -1390,16 +1624,31 @@ 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" msgstr "已取消静音" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +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" @@ -1469,10 +1718,6 @@ msgstr "退格" msgid "Caps Lock" msgstr "大写锁定键" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "Clear键" - #: src/client/keycode.cpp msgid "Control" msgstr "Ctrl键" @@ -1720,33 +1965,39 @@ msgstr "X键2" msgid "Zoom" msgstr "缩放" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "密码不匹配!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "小地图已隐藏" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "注册并加入" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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" -"请重新输入你的密码然后点击“注册”或点击“取消”。" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "雷达小地图,放大至%d倍" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "地表模式小地图, 放大至%d倍" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "材质模式小地图" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "网页打不开" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "正在打开网页" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "继续" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "“特殊” = 向下爬" +msgid "\"Aux1\" = climb down" +msgstr "“Aux1” = 向下爬" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1756,15 +2007,23 @@ msgstr "自动向前" msgid "Automatic jumping" msgstr "自动跳跃" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "向后" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "地图块边界" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "改变相机" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "聊天" @@ -1817,8 +2076,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" @@ -1848,10 +2107,6 @@ msgstr "截图" msgid "Sneak" msgstr "潜行" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "特殊" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "启用/禁用HUD" @@ -1862,7 +2117,7 @@ msgstr "启用/禁用聊天记录" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fast" -msgstr "启用/禁用快速移动模式" +msgstr "启用/禁用快速模式" #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle fly" @@ -1892,10 +2147,6 @@ msgstr "按键" msgid "Change" msgstr "更改" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "确认密码" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "新密码" @@ -1904,6 +2155,10 @@ msgstr "新密码" msgid "Old Password" msgstr "旧密码" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "密码不匹配!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "退出" @@ -1913,14 +2168,9 @@ msgid "Muted" msgstr "静音" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "音量: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "输入 " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "音量:%d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1929,6 +2179,16 @@ msgstr "输入 " msgid "LANG_CODE" msgstr "zh_CN" +#: 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" @@ -1939,12 +2199,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(Android) Use virtual joystick to trigger \"Aux1\" button.\n" +"If enabled, virtual joystick will also tap \"Aux1\" button when out of main " "circle." msgstr "" -"(安卓)使用虚拟操纵杆触发\"aux\"按钮。\n" -"如果启用,虚拟操纵杆在主圆圈外会点击\"aux\"按钮。" +"(安卓)使用虚拟操纵杆触发\"Aux1\"按钮。\n" +"如果启用,虚拟操纵杆在主圆圈外会点击\"Aux1\"按钮。" #: src/settings_translation_file.cpp msgid "" @@ -1984,14 +2244,6 @@ msgstr "" "默认值为适合\n" "孤岛的垂直压扁形状,将所有3个数字设置为相等以呈现原始形状。" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = 利用梯度信息进行视差遮蔽 (较快).\n" -"1 = 浮雕映射 (较慢, 但准确)." - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "控制山脊形状/大小的2D噪声。" @@ -2029,9 +2281,8 @@ msgid "3D mode" msgstr "3D 模式" #: src/settings_translation_file.cpp -#, fuzzy msgid "3D mode parallax strength" -msgstr "法线贴图强度" +msgstr "3D模式视差强度" #: src/settings_translation_file.cpp msgid "3D noise defining giant caverns." @@ -2052,6 +2303,10 @@ 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噪波定义结构。\n" +"如果改变了默认值,噪波“scale”(默认为0.7)可能需要\n" +"调整,因为当这个噪波的值范围大约为-2.0到2.0时,\n" +"悬空岛逐渐变窄的函数最好。" #: src/settings_translation_file.cpp msgid "3D noise defining structure of river canyon walls." @@ -2093,6 +2348,10 @@ msgstr "" "- 翻页(pageflip):基于四重缓冲的 3D。\n" "注意交错模式需要启用着色器。" +#: 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" @@ -2114,9 +2373,12 @@ msgid "ABM interval" msgstr "ABM间隔" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ABM time budget" +msgstr "ABM 时间预算" + +#: src/settings_translation_file.cpp msgid "Absolute limit of queued blocks to emerge" -msgstr "生产队列绝对限制" +msgstr "待显示方块队列的绝对限制" #: src/settings_translation_file.cpp msgid "Acceleration in air" @@ -2162,6 +2424,11 @@ msgid "" "screens." msgstr "为支持4K等屏幕,调节像素点密度(非 X11/Android 环境才有效)。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "调整检测到的显示密度,用来缩放 UI 元素。" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2171,6 +2438,16 @@ msgid "" "Value = 2.0 (can be higher depending on 'mgv7_np_floatland', always test\n" "to be sure) creates a solid floatland layer." msgstr "" +"调整悬空岛层的密度。\n" +"增加值,就增加密度。可以是正值或负值。\n" +"值等于 0.0, 容积的 50% 是悬空岛。\n" +"值等于 2.0,(值可以更高,取决于“mgv7_np_floatland”,但一定要测试确定)\n" +"创建一个密实的悬空岛层。" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "添加物品名称" #: src/settings_translation_file.cpp msgid "Advanced" @@ -2191,8 +2468,9 @@ msgstr "" "在夜晚的自然光照下作用很小。" #: src/settings_translation_file.cpp -msgid "Always fly and fast" -msgstr "保持高速飞行" +#, fuzzy +msgid "Always fly fast" +msgstr "保持飞行和快速模式" #: src/settings_translation_file.cpp msgid "Ambient occlusion gamma" @@ -2269,6 +2547,10 @@ msgstr "" "将禁用此优化。\n" "在 mapblocks中声明(16 个节点)。" +#: src/settings_translation_file.cpp +msgid "Audio" +msgstr "" + #: src/settings_translation_file.cpp msgid "Automatic forward key" msgstr "自动前进键" @@ -2289,6 +2571,14 @@ msgstr "自动保存屏幕大小" msgid "Autoscaling mode" msgstr "自动缩放模式" +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1键" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "用于攀登/降落的Aux1键" + #: src/settings_translation_file.cpp msgid "Backward key" msgstr "后退键" @@ -2301,10 +2591,6 @@ msgstr "平地级别" msgid "Base terrain height." msgstr "基础地形高度。" -#: src/settings_translation_file.cpp -msgid "Basic" -msgstr "基础" - #: src/settings_translation_file.cpp msgid "Basic privileges" msgstr "基本权限" @@ -2326,21 +2612,22 @@ 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 msgid "Biome noise" msgstr "生物群系噪声" -#: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "全屏模式中的位每像素(又称色彩深度)。" - #: src/settings_translation_file.cpp 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 "粗斜体字体路径" @@ -2359,15 +2646,16 @@ msgstr "粗体等宽字体路径" #: src/settings_translation_file.cpp msgid "Build inside player" -msgstr "建立内部玩家" +msgstr "在玩家站着的地方搭建" #: src/settings_translation_file.cpp msgid "Builtin" msgstr "内置" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "凹凸贴图" +#, fuzzy +msgid "Camera" +msgstr "改变相机" #: src/settings_translation_file.cpp msgid "" @@ -2446,32 +2734,24 @@ msgstr "" "0.0为最小值时1.0为最大值。" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" -"主菜单UI的变化:\n" -"- 完整 多个单人世界,子游戏选择,材质包选择器等。\n" -"- 简单:单个单人世界,无子游戏材质包选择器。可能\n" -"需要用于小屏幕。" +msgid "Chat command time message threshold" +msgstr "显示聊天消息执行时间的阀值(秒)" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "聊天指令" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "字体大小" +msgstr "聊天字体大小" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "聊天键" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "调试日志级别" +msgstr "聊天日志级别" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2494,8 +2774,8 @@ msgid "Chat toggle key" msgstr "聊天启用/禁用键" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "聊天命令" +msgid "Chat weblinks" +msgstr "聊天网页链接" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2513,6 +2793,13 @@ msgstr "电影模式键" msgid "Clean transparent textures" msgstr "干净透明材质" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "" +"在聊天控制台输出中启用了可点击的网页链接(中键单击或 Ctrl + 左键单击)。" + #: src/settings_translation_file.cpp msgid "Client" msgstr "客户端" @@ -2533,6 +2820,11 @@ msgstr "客户端mod限制" msgid "Client side node lookup range restriction" msgstr "客户端方块查询范围限制" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "客户端mod" + #: src/settings_translation_file.cpp msgid "Climbing speed" msgstr "攀登速度" @@ -2557,6 +2849,10 @@ msgstr "主菜单显示云彩" msgid "Colored fog" msgstr "彩色雾" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "彩色阴影" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2594,6 +2890,26 @@ msgstr "" msgid "Command key" msgstr "命令键" +#: src/settings_translation_file.cpp +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 "" +"欲用来节约地图块占用的磁盘空间,所要使用的压缩等级。\n" +"-1 - 使用默认值\n" +"0 - 最小压缩,最快\n" +"9 - 最佳压缩,最慢" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "连接玻璃" @@ -2618,10 +2934,19 @@ msgstr "控制台颜色" msgid "Console height" msgstr "控制台高度" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Content Repository" +msgstr "在线内容仓库(ContentDB)" + #: src/settings_translation_file.cpp msgid "ContentDB Flag Blacklist" msgstr "ContentDB标签黑名单" +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB 最大并发下载量" + #: src/settings_translation_file.cpp msgid "ContentDB URL" msgstr "ContentDB网址" @@ -2653,8 +2978,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." @@ -2687,16 +3014,25 @@ msgid "Crosshair alpha" msgstr "准星透明" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "准星不透明度(0-255)。" +#, fuzzy +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"准星不透明度(0-255)。\n" +"实体准星的不透明度也会使用此值。" #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "准星颜色" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "准星颜色(红,绿,蓝)。" +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"准星颜色(R,G,B).\n" +"还控制对象准星颜色" #: src/settings_translation_file.cpp msgid "DPI" @@ -2719,12 +3055,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" @@ -2759,17 +3095,18 @@ msgid "Default report format" msgstr "默认报告格式" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "默认游戏" +msgstr "默认栈大小" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"cURL 的默认时限,单位毫秒。\n" -"仅使用 cURL 编译时有效果。" +"设定阴影滤镜的质量。\n" +"使用 PCF 或 泊松盘(Poisson disk)算法模拟软阴影效果\n" +"但也会使用更多的硬件资源。" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2799,14 +3136,6 @@ msgstr "定义大尺寸的河道结构。" msgid "Defines location and terrain of optional hills and lakes." msgstr "定义所选的山和湖的位置与地形。" -#: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"定义材质采样步骤。\n" -"数值越高常态贴图越平滑。" - #: src/settings_translation_file.cpp msgid "Defines the base ground level." msgstr "定义基准地面高度." @@ -2881,6 +3210,15 @@ msgstr "" 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 "挖掘粒子效果" @@ -2893,6 +3231,16 @@ msgstr "禁用反作弊" msgid "Disallow empty passwords" msgstr "禁止使用空密码" +#: src/settings_translation_file.cpp +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 "服务器域名,将显示在服务器列表。" @@ -2941,18 +3289,40 @@ msgstr "" "启用客户端Lua mod支持。\n" "该功能是实验性的,且API会变动。" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" +"启用泊松盘(Poisson disk)滤镜。\n" +"使用泊松盘算法来产生“软阴影”。不启用的话就会使用 PCF 滤镜。" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" +"启用彩色阴影。\n" +"在半透明节点上投射彩色阴影。会消耗超多的资源。" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "启用控制台窗口" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "为新建地图启用创造模式。" +msgid "Enable creative mode for all players" +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 "启用 mod 频道支持。" @@ -2969,18 +3339,6 @@ msgstr "启用玩家受到伤害和死亡。" 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" @@ -2989,6 +3347,10 @@ msgstr "" "启用简单环境光闭塞的平滑光照。\n" "禁用可影响速度或得到不同外观。" +#: 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" @@ -3054,17 +3416,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "启用物品清单动画。" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"启用材质的凹凸贴图效果。需要材质包支持法线贴图,\n" -"否则将自动生成法线。\n" -"需要启用着色器。" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "启用翻转网状物facedir的缓存。" @@ -3073,22 +3424,6 @@ msgstr "启用翻转网状物facedir的缓存。" msgid "Enables minimap." msgstr "启用小地图。" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"启用即时法线贴图生成(浮雕效果)。\n" -"需要启用凹凸贴图。" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"启用视差遮蔽贴图。\n" -"需要启用着色器。" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3101,6 +3436,17 @@ msgstr "" "游戏内声音控制将失效。\n" "改变此设置需要重启。" +#: 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 "允许不影响可玩性的轻微视觉错误,以此减少 CPU 负载,或提高渲染性能。" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "山谷轮廓" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "打印引擎性能分析数据间隔" @@ -3109,14 +3455,6 @@ msgstr "打印引擎性能分析数据间隔" msgid "Entity methods" msgstr "实体方法" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"实验性选项,设为大于 0 的数字时可能导致\n" -"块之间出现可见空间。" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3126,10 +3464,19 @@ 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 "" +"悬空岛锥度的指数,更改锥度的行为。\n" +"值等于1.0,创建一个统一的,线性锥度。\n" +"值大于1.0,创建一个平滑的、合适的锥度,默认分隔的悬空岛。\n" +"值小于1.0,(例如0.25)创建一个带有平坦低地的更加轮廓分明的表面级别,\n" +"适用于固体悬空岛层。" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "暂停菜单 FPS" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "FPS when unfocused or paused" +msgstr "游戏暂停时最高 FPS" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3147,21 +3494,9 @@ msgstr "坠落上下摆动系数" msgid "Fallback font path" msgstr "后备字体路径" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "后备字体阴影" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "后备字体阴影透明度" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "后备字体大小" - #: src/settings_translation_file.cpp msgid "Fast key" -msgstr "快速移动键" +msgstr "快速键" #: src/settings_translation_file.cpp msgid "Fast mode acceleration" @@ -3177,10 +3512,10 @@ msgstr "快速移动" #: src/settings_translation_file.cpp msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" -"快速移动(通过“特殊”键)。\n" +"快速移动(通过“Aux1”键)。\n" "这需要服务器的“fast”权限。" #: src/settings_translation_file.cpp @@ -3215,18 +3550,19 @@ msgstr "电影色调映射" #: src/settings_translation_file.cpp msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "经过滤的材质会与邻近的全透明材质混合RGB值,\n" "该值通常会被PNG优化器丢弃,某些时候会给透明材质产生暗色或\n" -"亮色的边缘。应用该过滤器将在材质加载时\n" -"移除该效果。" +"亮色的边缘。应用该过滤器将在材质加载时移除该效果。\n" +"该过滤器将在启用mipmapping的时候被自动应用。" #: 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." @@ -3245,39 +3581,32 @@ msgid "Fixed virtual joystick" msgstr "固定虚拟摇杆" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland density" -msgstr "水级别" +msgstr "悬空岛密度" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland maximum Y" -msgstr "地窖最大Y坐标" +msgstr "悬空岛最大Y坐标" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland minimum Y" -msgstr "地窖最小Y坐标" +msgstr "悬空岛最小Y坐标" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland noise" -msgstr "水级别" +msgstr "悬空岛噪声" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland taper exponent" -msgstr "水级别" +msgstr "悬空岛尖锐指数" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland tapering distance" -msgstr "玩家转移距离" +msgstr "悬空岛尖锐距离" #: src/settings_translation_file.cpp -#, fuzzy msgid "Floatland water level" -msgstr "水级别" +msgstr "悬空岛水位" #: src/settings_translation_file.cpp msgid "Fly key" @@ -3299,6 +3628,11 @@ msgstr "雾开始" 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 "默认粗体" @@ -3320,15 +3654,17 @@ msgid "Font size" msgstr "字体大小" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "默认字体大小,单位pt。" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." -msgstr "后备字体大小,单位pt。" - -#: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +#, fuzzy +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "等宽字体大小,单位pt。" #: src/settings_translation_file.cpp @@ -3336,6 +3672,19 @@ msgid "" "Font size of the recent chat text and chat prompt in point (pt).\n" "Value 0 will use the default font size." msgstr "" +"最近聊天文本和聊天提示的字体大小(pt)。\n" +"值为0将使用默认字体大小。" + +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" #: src/settings_translation_file.cpp msgid "" @@ -3398,10 +3747,6 @@ msgstr "分形类型" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "从雾起始点开始雾的可见距离分数" -#: src/settings_translation_file.cpp -msgid "FreeType fonts" -msgstr "FreeType 字体" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3431,10 +3776,6 @@ msgstr "" msgid "Full screen" msgstr "全屏" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "全屏 BPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "全屏模式。" @@ -3452,18 +3793,28 @@ msgid "GUI scaling filter txr2img" msgstr "GUI缩放过滤器 txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "生成发现贴图" +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 "全局回调" #: 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 junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "全局地图生成属性。\n" "在地图生成器 v6 中‘decorations’标签控制除树木和丛林草外所有装饰物。\n" @@ -3489,6 +3840,16 @@ msgstr "" 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 "重力" @@ -3506,8 +3867,13 @@ msgid "HTTP mods" msgstr "HTTP Mods" #: src/settings_translation_file.cpp -msgid "HUD scale factor" -msgstr "HUD 缩放比例系数" +msgid "HUD" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "HUD scaling" +msgstr "GUI缩放" #: src/settings_translation_file.cpp msgid "HUD toggle key" @@ -3516,14 +3882,14 @@ msgstr "HUD启用/禁用键" #: src/settings_translation_file.cpp msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "处理已弃用的 Lua API 调用:\n" -"- 兼容:(尝试)模拟旧的调用(发布版本的默认值)。\n" -"- 记录:模拟并记录已弃用的调用的回溯(调试的默认值)。\n" -"- 错误:停止使用已弃用的调用(Mod 开发人员推荐)。" +"- none:不记录废弃的调用。\n" +"- log:模拟并记录已弃用的调用的回溯(调试的默认值)。\n" +"- error:停止使用已弃用的调用(Mod 开发人员推荐)。" #: src/settings_translation_file.cpp msgid "" @@ -3547,8 +3913,9 @@ msgid "Heat noise" msgstr "热噪声" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." -msgstr "初始窗口高度。" +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." +msgstr "初始窗口高度,全屏模式下忽略该值。" #: src/settings_translation_file.cpp msgid "Height noise" @@ -3558,10 +3925,6 @@ msgstr "高度噪声" msgid "Height select noise" msgstr "高度选择噪声" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "高精度 FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "山丘坡度" @@ -3765,13 +4128,22 @@ 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" "值越高越平滑,但是会使用更多内存。" +#: 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 "生成河流多宽。" @@ -3806,12 +4178,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." -msgstr "" -"如果禁用,当飞行和快速模式同时启用时“特殊”键用于快速\n" -"飞行。" +msgstr "如果禁用,“Aux1”键将用于快速飞行(飞行和快速模式同时启用)。" #: src/settings_translation_file.cpp msgid "" @@ -3837,13 +4206,22 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "" -"如果启用,“特殊”键将代替潜行键的向下攀爬和\n" +"如果启用,“Aux1”键将代替潜行键的向下攀爬和\n" "下降。" +#: 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" @@ -3871,7 +4249,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 "如果启用,新玩家将无法使用空密码加入。" #: src/settings_translation_file.cpp @@ -3890,7 +4271,15 @@ msgid "" "to this distance from the player to the node." msgstr "" "如果客户端mod方块范围限制启用,限制get_node至玩家\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 "" +"如果聊天命令的执行时间长于此指定以秒为单位时间,请将时间信息添加到聊天命令消" +"息中。" #: src/settings_translation_file.cpp msgid "" @@ -3912,10 +4301,6 @@ msgstr "如果设置了此选项,玩家将始终在指定位置出(重)生 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 "游戏内聊天控制台背景 alpha 值(不透明度,0~255)。" @@ -3945,7 +4330,8 @@ msgstr "" "通常只有核心/内部构建者需要" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "登录时的聊天命令。" #: src/settings_translation_file.cpp @@ -3970,16 +4356,13 @@ msgstr "注册时计数LBM的行为函数。" 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 @@ -4034,6 +4417,11 @@ msgstr "摇杆 ID" msgid "Joystick button repetition interval" msgstr "摇杆按钮重复间隔" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "摇杆无效区" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "摇杆头灵敏度" @@ -4136,6 +4524,17 @@ msgstr "" "见http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"跳跃键。\n" +"见http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4278,6 +4677,17 @@ msgstr "" "见http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"跳跃键。\n" +"见http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4667,7 +5077,7 @@ msgid "" "See http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" msgstr "" -"开关电影模式键。\n" +"启用/禁用电影模式键。\n" "见http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" @@ -4811,6 +5221,10 @@ msgstr "" "见http://irrlicht.sourceforge.net/docu/namespaceirr." "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秒内发送超过X条消息的玩家。" @@ -4868,10 +5282,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 "" "服务器时钟节拍长度,通常也是对象通过网络更新的\n" "时间间隔。" @@ -4885,18 +5300,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 "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 "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 "活动方块管理循环时长" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- <nothing> (no logging)\n" @@ -4905,7 +5327,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "写入debug.txt的日志等级:\n" "- <无>(无日志)\n" @@ -4940,6 +5363,11 @@ msgstr "亮度曲线高梯度" 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" @@ -5015,31 +5443,30 @@ msgid "Lower Y limit of dungeons." msgstr "地窖的Y值下限。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Lower Y limit of floatlands." -msgstr "地窖的Y值下限。" +msgstr "悬空岛的Y值下限。" #: src/settings_translation_file.cpp msgid "Main menu script" msgstr "主菜单脚本" -#: src/settings_translation_file.cpp -msgid "Main menu style" -msgstr "主菜单样式" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "使雾和天空颜色依赖于一天中的时间(黎明/傍晚)和视线方向。" -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "使DirectX和LuaJIT一起工作。如果这导致了问题禁用它。" - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "使所有液体不透明" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "磁盘存储的映射压缩级别" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "网络传输的地图压缩级别" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "地图目录" @@ -5099,7 +5526,6 @@ msgstr "" "忽略'jungles'标签。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Map generation attributes specific to Mapgen v7.\n" "'ridges': Rivers.\n" @@ -5107,7 +5533,9 @@ msgid "" "'caverns': Giant caves deep underground." msgstr "" "针对v7地图生成器的属性。\n" -"'ridges'启用河流。" +"'ridges':启用河流。\n" +"'floatlands':漂浮于大气中的陆块。\n" +"'caverns':地下深处的巨大洞穴。" #: src/settings_translation_file.cpp msgid "Map generation limit" @@ -5117,6 +5545,11 @@ msgstr "地图生成限制" msgid "Map save interval" msgstr "地图保存间隔" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "液体更新时钟间隔" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "地图块限制" @@ -5222,8 +5655,12 @@ msgid "Maximum FPS" msgstr "最大 FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." -msgstr "游戏暂停时最高 FPS。" +msgid "Maximum FPS when the window is not focused, or when the game is paused." +msgstr "窗口未聚焦或游戏暂停时的最大 FPS。" + +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "最大渲染阴影距离。" #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" @@ -5264,22 +5701,29 @@ msgid "Maximum number of blocks that can be queued for loading." msgstr "可在加载时加入队列的最大方块数。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be generated.\n" "This limit is enforced per player." msgstr "" "在生成时加入队列的最大方块数。\n" -"设置为空白则自动选择合适的数值。" +"此限制对每位玩家强制执行。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Maximum number of blocks to be queued that are to be loaded from file.\n" "This limit is enforced per player." msgstr "" "在从文件中加载时加入队列的最大方块数。\n" -"设置为空白则自动选择合适的数值。" +"此限制对每位玩家强制执行。" + +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" +"最大并发下载数。 超过此限制的下载将排队。 这应该低于 curl_parallel_limit(卷" +"曲平行限制)。" #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." @@ -5344,17 +5788,22 @@ msgstr "" "0取消队列,-1使队列大小无限。" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +#, fuzzy +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "单个文件下载(如mod下载)的最大时间。" +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "交互式请求(例如服务器列表获取)可能需要的最长时间,以毫秒为单位。" + #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "最大用户数" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "菜单" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "Mesh 缓存" @@ -5373,7 +5822,7 @@ msgstr "用于高亮选定的对象的方法。" #: src/settings_translation_file.cpp msgid "Minimal level of logging to be written to chat." -msgstr "" +msgstr "写入聊天的最小日志级别。" #: src/settings_translation_file.cpp msgid "Minimap" @@ -5403,12 +5852,27 @@ msgstr "最小材质大小" 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 "mod频道" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +#, fuzzy +msgid "Modifies the size of the HUD elements." msgstr "更改hud栏元素大小。" #: src/settings_translation_file.cpp @@ -5419,6 +5883,11 @@ msgstr "等宽字体路径" msgid "Monospace font size" msgstr "等宽字体大小" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "等宽字体大小" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "山高度噪声" @@ -5494,10 +5963,6 @@ msgstr "服务器名称,将显示在提供给玩家的服务器列表。" msgid "Near plane" msgstr "近平面" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "网络" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5506,6 +5971,11 @@ msgstr "" "监听网络端口 (UDP)。\n" "从主菜单开始时此值将被覆盖。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "网络" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "新用户需要输入此密码。" @@ -5518,6 +5988,11 @@ msgstr "穿墙" 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 "方块高亮" @@ -5530,20 +6005,11 @@ msgstr "NodeTimer间隔" msgid "Noises" msgstr "噪声" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "法线贴图采样" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "法线贴图强度" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "生产线程数" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Number of emerge threads to use.\n" "Value 0:\n" @@ -5557,9 +6023,6 @@ msgid "" "'on_generated'. For many users the optimum setting may be '1'." msgstr "" "使用的生产线程数。\n" -"警告:当'num_emerge_threads'大于1时,目前有很\n" -"多bug会导致崩溃。\n" -"强烈建议在此警告被移除之前将此值设为默认值'1'。\n" "值0:\n" "- 自动选择。生产线程数会是‘处理器数-2’,\n" "- 下限为1。\n" @@ -5568,26 +6031,19 @@ msgstr "" "警告:增大此值会提高引擎地图生成器速度,但会由于\n" "干扰其他进程而影响游戏体验,尤其是单人模式或运行\n" "‘on_generated’中的Lua代码。对于大部分用户来说,最\n" -"佳值为1。" +"佳值为'1'。" #: 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "/clearobjects每次能加载的额外方块数。\n" "这是与sqlite交互和内存消耗的平衡。\n" "(4096=100MB,按经验法则)。" -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "视差遮蔽迭代数。" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "在线内容仓库(ContentDB)" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "不透明液体" @@ -5597,11 +6053,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "默认字体后阴影的透明度(alpha),取值范围0~255。" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "后备字体后阴影的透明度(alpha),取值范围0~255。" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5612,38 +6063,13 @@ msgstr "" "则不暂停。" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "视差遮蔽效果的整体斜纹,通常为比例/2。" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "视差遮蔽效果的总体比例。" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "视差遮蔽" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "视差遮蔽偏移" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "视差遮蔽迭代" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "视差遮蔽模式" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion scale" -msgstr "视差遮蔽比例" +msgid "Optional override for chat weblink color." +msgstr "替换聊天网页链接的颜色,可用可不用。" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5657,6 +6083,8 @@ 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 "" +"路径保存截图。可以是绝对路径或相对路径。\n" +"如果该文件夹不存在,将创建它。" #: src/settings_translation_file.cpp msgid "" @@ -5669,10 +6097,9 @@ msgid "Path to texture directory. All textures are first searched from here." msgstr "材质目录路径。所有材质都首先从此路径搜索。" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" "默认字体路径。\n" @@ -5681,10 +6108,9 @@ msgstr "" "后备字体用于不可用默认字体的语言。" #: src/settings_translation_file.cpp +#, fuzzy msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" "等宽字体路径。\n" @@ -5698,12 +6124,11 @@ msgstr "丢失窗口焦点时暂停" #: src/settings_translation_file.cpp msgid "Per-player limit of queued blocks load from disk" -msgstr "" +msgstr "每个玩家从磁盘加载的队列块的限制" #: src/settings_translation_file.cpp -#, fuzzy msgid "Per-player limit of queued blocks to generate" -msgstr "要生成的生产队列限制" +msgstr "每个玩家要生成的生产队列限制" #: src/settings_translation_file.cpp msgid "Physics" @@ -5717,6 +6142,15 @@ msgstr "俯仰移动键" msgid "Pitch move mode" msgstr "俯仰移动模式" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "飞行键" + +#: src/settings_translation_file.cpp +msgid "Place repetition interval" +msgstr "放置重复间隔" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5725,10 +6159,6 @@ msgstr "" "使玩家可以不受重力飞起。\n" "这需要服务器的“fly”权限。" -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "玩家名称" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "玩家转移距离" @@ -5737,6 +6167,11 @@ msgstr "玩家转移距离" msgid "Player versus player" msgstr "玩家对战" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "双线性过滤" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5777,21 +6212,22 @@ msgstr "性能分析" msgid "Profiler toggle key" msgstr "性能分析启用/禁用键" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "性能分析" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" -msgstr "" +msgstr "Prometheus 监听器地址" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" +"Prometheus 监听器地址。\n" +"如果minetest是在启用ENABLE_PROMETHEUS选项的情况下编译的,\n" +"在该地址上为 Prometheus 启用指标侦听器。\n" +"可以从 http://127.0.0.1:30000/metrics 获取指标" #: src/settings_translation_file.cpp msgid "Proportion of large caves that contain liquid." @@ -5894,10 +6330,6 @@ msgstr "山脊大小噪声" msgid "Right key" msgstr "右方向键" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "右击重复间隔" - #: src/settings_translation_file.cpp msgid "River channel depth" msgstr "河道深度" @@ -5956,7 +6388,7 @@ msgstr "当窗口大小改变时自动保存。" #: src/settings_translation_file.cpp msgid "Saving map received from server" -msgstr "保存从服务器收到的地图" +msgstr "正在保存从服务器收到的地图" #: src/settings_translation_file.cpp msgid "" @@ -5972,6 +6404,11 @@ msgstr "" "以在非整数缩放大小下模糊化部分边界\n" "为代价混合像素。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "屏幕:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "屏幕高度" @@ -6002,6 +6439,11 @@ msgstr "" "1 代表最差品质,100 代表最佳品质。\n" "使用 0 来使用预设品质。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "截图" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "海底噪声" @@ -6014,10 +6456,6 @@ msgstr "定义山/山丘范围高度的4个2D噪声的第二项。" msgid "Second of two 3D noises that together define tunnels." msgstr "定义通道的2个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" @@ -6077,8 +6515,19 @@ msgstr "" "18 = 4D \"Mandelbulb\" 朱利亚集." #: 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" @@ -6104,10 +6553,20 @@ msgstr "服务器端口" 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 "服务器列表文件" @@ -6121,9 +6580,52 @@ 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 +#, fuzzy +msgid "" +"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 "" +"设置阴影强度。\n" +"较低的值表示较亮的阴影,较高的值表示较暗的阴影。" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" +"设置软阴影半径大小。\n" +"较低的值意味着更清晰的阴影更大的值更柔和。\n" +"最小值 1.0 和最大值 10.0" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" +"以度为单位设置太阳/月亮轨道的倾斜度\n" +"值 0 表示没有倾斜/垂直轨道。\n" +"最小值 0.0 和最大值 60.0" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"设置为真以启用飘动树叶。\n" +"需要启用着色器。" + #: src/settings_translation_file.cpp msgid "" "Set to true to enable waving leaves.\n" @@ -6148,6 +6650,16 @@ msgstr "" "设置为真以启用摆动植物。\n" "需要启用着色器。" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" +"将阴影纹理质量设置为 32 位。\n" +"如果为 false(否),将使用 16 位纹理。\n" +"这可能会导致阴影中出现更多阴影。" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "着色器路径" @@ -6163,6 +6675,24 @@ msgstr "" "性能。\n" "仅用于OpenGL视频后端。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "截图品质" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "渲染阴影的节点中的阴影贴图最大距离" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "32 位阴影贴图纹理" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "最小材质大小" + #: src/settings_translation_file.cpp msgid "" "Shadow offset (in pixels) of the default font. If 0, then shadow will not be " @@ -6170,10 +6700,9 @@ msgid "" msgstr "默认字体阴影偏移(单位为像素),0 表示不绘制阴影。" #: src/settings_translation_file.cpp -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "后备字体阴影偏移(单位为像素),0 表示不绘制阴影。" +#, fuzzy +msgid "Shadow strength gamma" +msgstr "阴影强度" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6187,6 +6716,20 @@ msgstr "显示调试信息" msgid "Show entity selection boxes" msgstr "显示实体选择框" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"设定语言。留空以使用系统语言。\n" +"变更后须重新启动。" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Show name tag backgrounds by default" +msgstr "默认显示名称标签背景" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "关闭消息" @@ -6217,13 +6760,17 @@ msgstr "" "增加缓存命中率,减少从主线程复制数据,从而\n" "减少抖动。" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "天体轨道倾斜" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "切片 w" #: src/settings_translation_file.cpp msgid "Slope and fill work together to modify the heights." -msgstr "" +msgstr "斜率和填充共同工作来修改高度。" #: src/settings_translation_file.cpp msgid "Small cave maximum number" @@ -6273,18 +6820,15 @@ msgstr "潜行速度" msgid "Sneaking speed, in nodes per second." msgstr "潜行速度,以方块每秒为单位。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "字体阴影透明度" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "音效" -#: src/settings_translation_file.cpp -msgid "Special key" -msgstr "特殊键" - -#: src/settings_translation_file.cpp -msgid "Special key for climbing/descending" -msgstr "用于攀登/降落的特殊键" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6303,6 +6847,20 @@ msgid "" "Note that mods or games may explicitly set a stack for certain (or all) " "items." msgstr "" +"指定节点、物品和工具的默认堆叠数量。\n" +"请注意,mod或游戏可能会为某些(或所有)项目明确设置堆栈。" + +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" +"把完整地更新一次阴影贴图这项任务分配给多少帧去完成。\n" +"较高的值可能会使阴影滞后,较低的值\n" +"将消耗更多硬件资源。\n" +"最小值:1;最大值:16" #: src/settings_translation_file.cpp msgid "" @@ -6310,6 +6868,9 @@ msgid "" "Controls the width of the range to be boosted.\n" "Standard deviation of the light curve boost Gaussian." msgstr "" +"光曲线提升范围的分布。\n" +"控制要提升的范围的宽度。\n" +"光曲线的标准偏差可提升高斯。" #: src/settings_translation_file.cpp msgid "Static spawnpoint" @@ -6317,25 +6878,19 @@ msgstr "静态重生点" #: src/settings_translation_file.cpp msgid "Steepness noise" -msgstr "" +msgstr "陡度噪声" #: src/settings_translation_file.cpp -#, fuzzy msgid "Step mountain size noise" -msgstr "地形高度" +msgstr "单步山峰高度噪声" #: src/settings_translation_file.cpp msgid "Step mountain spread noise" -msgstr "" +msgstr "单步山峰广度噪声" #: src/settings_translation_file.cpp -#, fuzzy msgid "Strength of 3D mode parallax." -msgstr "视差强度。" - -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "生成的一般地图强度。" +msgstr "3D 模式视差的强度。" #: src/settings_translation_file.cpp msgid "" @@ -6343,6 +6898,9 @@ msgid "" "The 3 'boost' parameters define a range of the light\n" "curve that is boosted in brightness." msgstr "" +"光照曲线提升的强度。\n" +"3 个'boost'参数定义了在亮度上提升的\n" +"光照曲线的范围。" #: src/settings_translation_file.cpp msgid "Strict protocol checking" @@ -6350,7 +6908,7 @@ msgstr "严格协议检查" #: src/settings_translation_file.cpp msgid "Strip color codes" -msgstr "" +msgstr "条形颜色代码" #: src/settings_translation_file.cpp msgid "" @@ -6365,6 +6923,16 @@ msgid "" "server-intensive extreme water flow and to avoid vast flooding of the\n" "world surface below." msgstr "" +"放置在固体浮地层的可选水的表面水平。\n" +"默认情况下,水处于禁用状态,并且仅在设置此值时才放置\n" +"在'mgv7_floatland_ymax' - 'mgv7_floatland_taper'上(\n" +"上部逐渐变细的开始)。\n" +"***警告,世界存档和服务器性能的潜在危险***:\n" +"启用水放置时,必须配置和测试悬空岛\n" +"通过将\"mgv7_floatland_density\"设置为 2.0(或其他\n" +"所需的值,具体取决于mgv7_np_floatland\"),确保是固体层,\n" +"以避免服务器密集的极端水流,\n" +"并避免地表的巨大的洪水。" #: src/settings_translation_file.cpp msgid "Synchronous SQLite" @@ -6372,32 +6940,32 @@ msgstr "同步 SQLite" #: src/settings_translation_file.cpp msgid "Temperature variation for biomes." -msgstr "" +msgstr "生物群系的温度变化。" #: src/settings_translation_file.cpp #, fuzzy +msgid "Temporary Settings" +msgstr "设置" + +#: src/settings_translation_file.cpp msgid "Terrain alternative noise" -msgstr "地形高度" +msgstr "地形替代噪声" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain base noise" -msgstr "地形高度" +msgstr "地形基准高度噪声" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain height" msgstr "地形高度" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain higher noise" -msgstr "地形高度" +msgstr "地形增高噪声" #: src/settings_translation_file.cpp -#, fuzzy msgid "Terrain noise" -msgstr "地形高度" +msgstr "地形噪声" #: src/settings_translation_file.cpp msgid "" @@ -6405,6 +6973,9 @@ msgid "" "Controls proportion of world area covered by hills.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"丘陵的地形噪声阈值。\n" +"控制山丘覆盖的世界区域的比例。\n" +"朝0.0调整较大的比例。" #: src/settings_translation_file.cpp msgid "" @@ -6412,14 +6983,27 @@ msgid "" "Controls proportion of world area covered by lakes.\n" "Adjust towards 0.0 for a larger proportion." msgstr "" +"湖泊的地形噪声阈值。\n" +"控制被湖泊覆盖的世界区域的比例。\n" +"朝0.0调整较大的比例。" #: src/settings_translation_file.cpp msgid "Terrain persistence noise" -msgstr "" +msgstr "地形持久性噪声" #: src/settings_translation_file.cpp msgid "Texture path" -msgstr "纹理路径" +msgstr "材质路径" + +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" +"用于渲染阴影贴图的材质尺寸。\n" +"数值必须是 2 的幂。\n" +"数值更大,阴影更好,但运算也更加复杂。" #: src/settings_translation_file.cpp msgid "" @@ -6433,7 +7017,12 @@ msgstr "" #: src/settings_translation_file.cpp msgid "The URL for the content repository" -msgstr "" +msgstr "内容存储库的 URL" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "The dead zone of the joystick" +msgstr "摇杆的无效区" #: src/settings_translation_file.cpp msgid "" @@ -6442,8 +7031,9 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "The depth of dirt or other biome filler node." -msgstr "泥土深度或其他生物群系过滤节点" +msgstr "泥土深度或其他生物群系过滤节点。" #: src/settings_translation_file.cpp msgid "" @@ -6456,7 +7046,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "The length in pixels it takes for touch screen interaction to start." -msgstr "" +msgstr "开始触摸屏交互所需的长度(以像素为单位)。" #: src/settings_translation_file.cpp msgid "" @@ -6492,19 +7082,21 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" +"摇杆轴灵敏度(用于移动子游戏中棱台体形状的\n" +"可见区域的摇杆轴)。" #: src/settings_translation_file.cpp msgid "" @@ -6521,6 +7113,12 @@ msgid "" "items. A value of 0 disables the functionality." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6529,14 +7127,13 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "" #: src/settings_translation_file.cpp msgid "The type of joystick" -msgstr "" +msgstr "摇杆类型" #: src/settings_translation_file.cpp msgid "" @@ -6544,6 +7141,9 @@ msgid "" "enabled. Also the vertical distance over which humidity drops by 10 if\n" "'altitude_dry' is enabled." msgstr "" +"如果'altitude_chill'开启,则热量下降20的垂直距离\n" +"已启用。如果湿度下降的垂直距离也是10\n" +"已启用“ altitude_dry”。" #: src/settings_translation_file.cpp #, fuzzy @@ -6555,10 +7155,12 @@ msgid "" "Time in seconds for item entity (dropped items) to live.\n" "Setting it to -1 disables the feature." msgstr "" +"项目实体(删除的项目)生存的时间(以秒为单位)。\n" +"将其设置为 -1 将禁用该功能。" #: src/settings_translation_file.cpp msgid "Time of day when a new world is started, in millihours (0-23999)." -msgstr "" +msgstr "一天中开始一个新世界的时间,以毫小时为单位(0-23999)。" #: src/settings_translation_file.cpp msgid "Time send interval" @@ -6569,7 +7171,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 @@ -6589,13 +7192,25 @@ msgid "Tooltip delay" msgstr "工具提示延迟" #: src/settings_translation_file.cpp -#, fuzzy msgid "Touch screen threshold" -msgstr "海滩噪音阈值" +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 "" +msgstr "树木噪声" #: src/settings_translation_file.cpp msgid "Trilinear filtering" @@ -6607,6 +7222,9 @@ msgid "" "False = 128\n" "Usable to make minimap smoother on slower machines." msgstr "" +"True = 256\n" +"False = 128\n" +"可用于在较慢的机器上使最小地图更平滑。" #: src/settings_translation_file.cpp msgid "Trusted mods" @@ -6614,11 +7232,11 @@ msgstr "可信 mod" #: src/settings_translation_file.cpp msgid "URL to the server list displayed in the Multiplayer Tab." -msgstr "" +msgstr "显示在“多人游戏”选项卡中的服务器列表的URL。" #: src/settings_translation_file.cpp msgid "Undersampling" -msgstr "" +msgstr "欠采样" #: src/settings_translation_file.cpp msgid "" @@ -6642,9 +7260,8 @@ msgid "Upper Y limit of dungeons." msgstr "地窖的Y值上限。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Upper Y limit of floatlands." -msgstr "地窖的Y值上限。" +msgstr "悬空岛的Y值上限。" #: src/settings_translation_file.cpp msgid "Use 3D cloud look instead of flat." @@ -6652,7 +7269,7 @@ msgstr "使用 3D 云彩,而不是看起来是平面的。" #: src/settings_translation_file.cpp msgid "Use a cloud animation for the main menu background." -msgstr "" +msgstr "主菜单背景使用云动画。" #: src/settings_translation_file.cpp msgid "Use anisotropic filtering when viewing at textures from an angle." @@ -6660,17 +7277,32 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Use bilinear filtering when scaling textures." -msgstr "" +msgstr "缩放材质时使用双线过滤。" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp msgid "Use trilinear filtering when scaling textures." +msgstr "缩放材质时使用三线过滤。" + +#: src/settings_translation_file.cpp +msgid "User Interfaces" msgstr "" #: src/settings_translation_file.cpp @@ -6678,12 +7310,10 @@ msgid "VBO" msgstr "VBO" #: src/settings_translation_file.cpp -#, fuzzy msgid "VSync" msgstr "垂直同步" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley depth" msgstr "山谷深度" @@ -6693,26 +7323,24 @@ msgid "Valley fill" msgstr "山谷弥漫" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley profile" msgstr "山谷轮廓" #: src/settings_translation_file.cpp -#, fuzzy msgid "Valley slope" msgstr "山谷坡度" #: src/settings_translation_file.cpp msgid "Variation of biome filler depth." -msgstr "" +msgstr "生物群落填充物深度的变化。" #: src/settings_translation_file.cpp msgid "Variation of maximum mountain height (in nodes)." -msgstr "" +msgstr "最大山体高度的变化(以节点为单位)。" #: src/settings_translation_file.cpp msgid "Variation of number of caves." -msgstr "" +msgstr "洞口数量的变化。" #: src/settings_translation_file.cpp msgid "" @@ -6748,16 +7376,12 @@ msgid "Video driver" msgstr "视频驱动程序" #: src/settings_translation_file.cpp -#, fuzzy msgid "View bobbing factor" -msgstr "范围摇动" +msgstr "视野晃动系数" #: src/settings_translation_file.cpp -#, fuzzy msgid "View distance in nodes." -msgstr "" -"节点间可视距离。\n" -"最小 = 20" +msgstr "可视距离(以节点方块为单位)。" #: src/settings_translation_file.cpp msgid "View range decrease key" @@ -6776,7 +7400,7 @@ msgid "Viewing range" msgstr "可视范围" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6803,7 +7427,7 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Walking and flying speed, in nodes per second." -msgstr "" +msgstr "步行和飞行速度,单位为方块每秒。" #: src/settings_translation_file.cpp msgid "Walking speed" @@ -6811,13 +7435,14 @@ msgstr "步行速度" #: src/settings_translation_file.cpp msgid "Walking, flying and climbing speed in fast mode, in nodes per second." -msgstr "" +msgstr "快速模式下的步行、飞行和攀爬速度,单位为方块每秒。" #: src/settings_translation_file.cpp msgid "Water level" -msgstr "水级别" +msgstr "水位" #: src/settings_translation_file.cpp +#, fuzzy msgid "Water surface level of the world." msgstr "世界水平面级别。" @@ -6830,29 +7455,30 @@ msgid "Waving leaves" msgstr "摇动树叶" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids" -msgstr "摇动流体" +msgstr "波动流体" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave height" -msgstr "摇动水高度" +msgstr "波动液体波动高度" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wave speed" -msgstr "摇动水速度" +msgstr "波动液体波动速度" #: src/settings_translation_file.cpp -#, fuzzy msgid "Waving liquids wavelength" -msgstr "摇动水长度" +msgstr "波动液体波动长度" #: src/settings_translation_file.cpp msgid "Waving plants" msgstr "摇动植物" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "选择框颜色" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6874,18 +7500,16 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." msgstr "" #: src/settings_translation_file.cpp @@ -6922,13 +7546,23 @@ msgid "" "pause menu." 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 的效果相同)。" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "初始窗口大小的宽度。" #: src/settings_translation_file.cpp @@ -7010,90 +7644,44 @@ msgstr "" #: src/settings_translation_file.cpp msgid "Y-level of lower terrain and seabed." -msgstr "" +msgstr "较低地形与海底的Y坐标。" #: src/settings_translation_file.cpp 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 文件下载超时" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "cURL 超时" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL 并发限制" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL 超时" +#~ msgid "- Creative Mode: " +#~ msgstr "- 创造模式: " -#~ msgid "Toggle Cinematic" -#~ msgstr "切换电影模式" - -#~ msgid "Select Package File:" -#~ msgstr "选择包文件:" - -#, fuzzy -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "大型随机洞穴的Y轴最大值。" - -#~ msgid "Waving Water" -#~ msgstr "流动的水面" - -#~ msgid "Waving water" -#~ msgstr "摇动水" - -#~ msgid "This font will be used for certain languages." -#~ msgstr "用于特定语言的字体。" - -#, fuzzy -#~ msgid "Shadow limit" -#~ msgstr "地图块限制" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "TrueType 字体或位图的路径。" - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "巨大洞穴深度" - -#~ msgid "IPv6 support." -#~ msgstr "IPv6 支持。" - -#~ msgid "Gamma" -#~ msgstr "伽马" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "字体阴影不透明度(0-255)。" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "启用电影基调映射" - -#~ msgid "Enable VBO" -#~ msgstr "启用 VBO" +#~ msgid "- Damage: " +#~ msgstr "- 伤害: " #~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "定义 floatland 平滑地形的区域。\n" -#~ "当噪音0时, 平滑的 floatlands 发生。" +#~ "0 = 利用梯度信息进行视差遮蔽 (较快).\n" +#~ "1 = 浮雕映射 (较慢, 但准确)." -#, fuzzy -#~ msgid "Darkness sharpness" -#~ msgstr "地图生成器平面湖坡度" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "控制隧道宽度,较小的值创建更宽的隧道。" - -#, fuzzy -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "控制 floatland 地形的密度。\n" -#~ "是添加到 \"np_mountain\" 噪声值的偏移量。" +#~ msgid "Address / Port" +#~ msgstr "地址/端口" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7103,20 +7691,389 @@ msgstr "cURL 超时" #~ "调整亮度表的伽玛编码。较高的数值会较亮。\n" #~ "这个设定是给客户端使用的,会被服务器忽略。" -#~ msgid "Path to save screenshots at." -#~ msgstr "屏幕截图保存路径。" - -#~ msgid "Parallax occlusion strength" -#~ msgstr "视差遮蔽强度" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "磁盘上的生产队列限制" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "正在下载和安装 $1,请稍等..." +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "你确定要重置你的单人世界吗?" #~ msgid "Back" #~ msgstr "后退" +#~ msgid "Basic" +#~ msgstr "基础" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "全屏模式中的位每像素(又称色彩深度)。" + +#~ msgid "Bump Mapping" +#~ msgstr "凹凸贴图" + +#~ msgid "Bumpmapping" +#~ msgstr "凹凸贴图" + +#~ msgid "" +#~ "Changes the main menu UI:\n" +#~ "- Full: Multiple singleplayer worlds, game choice, texture pack " +#~ "chooser, etc.\n" +#~ "- Simple: One singleplayer world, no game or texture pack choosers. May " +#~ "be\n" +#~ "necessary for smaller screens." +#~ msgstr "" +#~ "主菜单UI的变化:\n" +#~ "- 完整 多个单人世界,子游戏选择,材质包选择器等。\n" +#~ "- 简单:单个单人世界,无子游戏材质包选择器。可能\n" +#~ "需要用于小屏幕。" + +#~ msgid "Config mods" +#~ msgstr "配置 mod" + +#~ msgid "Configure" +#~ msgstr "配置" + +#~ msgid "Connect" +#~ msgstr "连接" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "控制在液体中的下沉速度。" + +#, fuzzy +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "控制 floatland 地形的密度。\n" +#~ "是添加到 \"np_mountain\" 噪声值的偏移量。" + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "控制隧道宽度,较小的值创建更宽的隧道。" + +#~ msgid "Credits" +#~ msgstr "贡献者" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "准星颜色(红,绿,蓝)。" + +#~ msgid "Damage enabled" +#~ msgstr "伤害已启用" + +#, fuzzy +#~ msgid "Darkness sharpness" +#~ msgstr "地图生成器平面湖坡度" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "cURL 的默认时限,单位毫秒。\n" +#~ "仅使用 cURL 编译时有效果。" + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "定义 floatland 平滑地形的区域。\n" +#~ "当噪音0时, 平滑的 floatlands 发生。" + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "定义材质采样步骤。\n" +#~ "数值越高常态贴图越平滑。" + +#~ msgid "Del. Favorite" +#~ msgstr "删除收藏项" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "从 minetest.net 下载一个子游戏,例如 minetest_game" + +#~ 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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "启用材质的凹凸贴图效果。需要材质包支持法线贴图,\n" +#~ "否则将自动生成法线。\n" +#~ "需要启用着色器。" + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "启用电影基调映射" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "启用即时法线贴图生成(浮雕效果)。\n" +#~ "需要启用凹凸贴图。" + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "启用视差遮蔽贴图。\n" +#~ "需要启用着色器。" + +#~ msgid "Enter " +#~ msgstr "输入 " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "实验性选项,设为大于 0 的数字时可能导致\n" +#~ "块之间出现可见空间。" + +#~ msgid "FPS in pause menu" +#~ msgstr "暂停菜单 FPS" + +#~ msgid "Fallback font shadow" +#~ msgstr "后备字体阴影" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "后备字体阴影透明度" + +#~ msgid "Fallback font size" +#~ msgstr "后备字体大小" + +#~ msgid "Filtering" +#~ msgstr "过滤" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "字体阴影不透明度(0-255)。" + +#~ msgid "Font size of the fallback font in point (pt)." +#~ msgstr "后备字体大小,单位pt。" + +#~ msgid "FreeType fonts" +#~ msgstr "FreeType 字体" + +#~ msgid "Full screen BPP" +#~ msgstr "全屏 BPP" + +#~ msgid "Game" +#~ msgstr "子游戏" + +#~ msgid "Gamma" +#~ msgstr "伽马" + +#~ msgid "Generate Normal Maps" +#~ msgstr "生成法线贴图" + +#~ msgid "Generate normalmaps" +#~ msgstr "生成发现贴图" + +#~ msgid "HUD scale factor" +#~ msgstr "HUD 缩放比例系数" + +#~ msgid "High-precision FPU" +#~ msgstr "高精度 FPU" + +#~ msgid "IPv6 support." +#~ msgstr "IPv6 支持。" + +#~ 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 中删掉点东西)" + +#, fuzzy +#~ msgid "Lava depth" +#~ msgstr "巨大洞穴深度" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "磁盘上的生产队列限制" + +#~ msgid "Main" +#~ msgstr "主菜单" + +#~ msgid "Main menu style" +#~ msgstr "主菜单样式" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "使DirectX和LuaJIT一起工作。如果这导致了问题禁用它。" + +#~ msgid "Menus" +#~ msgstr "菜单" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "雷达小地图,放大至两倍" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "雷达小地图, 放大至四倍" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "地表模式小地图, 放大至两倍" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "地表模式小地图, 放大至四倍" + +#~ msgid "Name / Password" +#~ msgstr "用户名/密码" + +#~ msgid "Name/Password" +#~ msgstr "用户名/密码" + +#~ msgid "No" +#~ msgstr "否" + +#~ msgid "Normalmaps sampling" +#~ msgstr "法线贴图采样" + +#~ msgid "Normalmaps strength" +#~ msgstr "法线贴图强度" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "视差遮蔽迭代数。" + #~ msgid "Ok" #~ msgstr "确定" + +#~ msgid "" +#~ "Opaqueness (alpha) of the shadow behind the fallback font, between 0 and " +#~ "255." +#~ msgstr "后备字体后阴影的透明度(alpha),取值范围0~255。" + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "视差遮蔽效果的整体斜纹,通常为比例/2。" + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "视差遮蔽效果的总体比例。" + +#~ msgid "Parallax Occlusion" +#~ msgstr "视差遮蔽" + +#~ msgid "Parallax occlusion" +#~ msgstr "视差遮蔽" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "视差遮蔽偏移" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "视差遮蔽迭代" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "视差遮蔽模式" + +#~ msgid "Parallax occlusion scale" +#~ msgstr "视差遮蔽比例" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "视差遮蔽强度" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "TrueType 字体或位图的路径。" + +#~ msgid "Path to save screenshots at." +#~ msgstr "屏幕截图保存路径。" + +#~ msgid "Player name" +#~ msgstr "玩家名称" + +#~ msgid "Profiling" +#~ msgstr "性能分析" + +#~ msgid "PvP enabled" +#~ msgstr "启用玩家对战" + +#~ msgid "Reset singleplayer world" +#~ msgstr "重置单人世界" + +#~ msgid "Select Package File:" +#~ msgstr "选择包文件:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "服务器 / 单人游戏" + +#~ msgid "" +#~ "Set the shadow update time.\n" +#~ "Lower value means shadows and map updates faster, but it consume more " +#~ "resources.\n" +#~ "Minimun value 0.001 seconds max value 0.2 seconds" +#~ msgstr "" +#~ "设置阴影更新时间。\n" +#~ "较低的值意味着阴影和贴图更新更快,但会消耗更多资源。\n" +#~ "最小值 0.001 秒 最大值 0.2 秒" + +#, fuzzy +#~ msgid "Shadow limit" +#~ msgstr "地图块限制" + +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "后备字体阴影偏移(单位为像素),0 表示不绘制阴影。" + +#~ msgid "Special" +#~ msgstr "特殊" + +#~ msgid "Special key" +#~ msgstr "特殊键" + +#~ msgid "Start Singleplayer" +#~ msgstr "单人游戏" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "生成的一般地图强度。" + +#~ msgid "This font will be used for certain languages." +#~ msgstr "用于特定语言的字体。" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "启用着色器需要使用OpenGL驱动。" + +#~ msgid "Toggle Cinematic" +#~ msgstr "切换电影模式" + +#~ msgid "View" +#~ msgstr "视野" + +#~ msgid "Waving Water" +#~ msgstr "流动的水面" + +#~ msgid "Waving water" +#~ msgstr "摇动水" + +#, fuzzy +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "大型随机洞穴的Y轴最大值。" + +#~ 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 "您已经死亡." + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/po/zh_TW/minetest.po b/po/zh_TW/minetest.po index 646c292b5..0c7081ace 100644 --- a/po/zh_TW/minetest.po +++ b/po/zh_TW/minetest.po @@ -2,9 +2,9 @@ msgid "" msgstr "" "Project-Id-Version: Chinese (Traditional) (Minetest)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-13 23:17+0200\n" -"PO-Revision-Date: 2020-01-29 13:50+0000\n" -"Last-Translator: pan93412 <pan93412@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: Ivon Huang <qj985n2@protonmail.com>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "minetest/minetest/zh_Hant/>\n" "Language: zh_TW\n" @@ -12,7 +12,43 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 3.11-dev\n" +"X-Generator: Weblate 4.13.1-dev\n" + +#: builtin/client/chatcommands.lua +msgid "Clear the out chat queue" +msgstr "清除聊天佇列" + +#: builtin/client/chatcommands.lua +msgid "Empty command." +msgstr "清空指令。" + +#: builtin/client/chatcommands.lua +msgid "Exit to main menu" +msgstr "離開並回到選單" + +#: builtin/client/chatcommands.lua +msgid "Invalid command: " +msgstr "無效的指令: " + +#: builtin/client/chatcommands.lua +msgid "Issued command: " +msgstr "發送的指令: " + +#: builtin/client/chatcommands.lua +msgid "List online players" +msgstr "列出線上玩家" + +#: builtin/client/chatcommands.lua +msgid "Online players: " +msgstr "線上玩家: " + +#: builtin/client/chatcommands.lua +msgid "The out chat queue is now empty." +msgstr "對外聊天佇列現在為空。" + +#: builtin/client/chatcommands.lua +msgid "This command is disabled by server." +msgstr "這個指令被伺服器停用。" #: builtin/client/death_formspec.lua src/client/game.cpp msgid "Respawn" @@ -22,9 +58,38 @@ msgstr "重生" msgid "You died" msgstr "您已死亡" +#: builtin/common/chatcommands.lua +msgid "Available commands:" +msgstr "可用的指令:" + +#: builtin/common/chatcommands.lua +msgid "Available commands: " +msgstr "可用的指令: " + +#: builtin/common/chatcommands.lua +msgid "Command not available: " +msgstr "指令無法使用: " + +#: builtin/common/chatcommands.lua +msgid "Get help for commands" +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 "[all | <cmd>]" + #: builtin/fstk/dialog.lua builtin/fstk/ui.lua src/gui/modalMenu.cpp msgid "OK" -msgstr "" +msgstr "OK" + +#: builtin/fstk/ui.lua +msgid "<none available>" +msgstr "<沒有可用的>" #: builtin/fstk/ui.lua msgid "An error occurred in a Lua script:" @@ -46,9 +111,30 @@ msgstr "重新連線" msgid "The server has requested a reconnect:" msgstr "伺服器已要求重新連線:" -#: builtin/mainmenu/common.lua src/client/game.cpp -msgid "Loading..." -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. " @@ -63,8 +149,8 @@ msgid "Server supports protocol versions between $1 and $2. " msgstr "伺服器支援協定版本 $1 到 $2。 " #: builtin/mainmenu/common.lua -msgid "Try reenabling public serverlist and check your internet connection." -msgstr "請嘗試重新啟用公共伺服器清單並檢查您的網際網路連線。" +msgid "Visit website" +msgstr "" #: builtin/mainmenu/common.lua msgid "We only support protocol version $1." @@ -74,17 +160,26 @@ msgstr "我們只支援協定版本 $1。" msgid "We support protocol versions between version $1 and $2." msgstr "我們支援協定版本 $1 到 $2。" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua +#: 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 "取消" -#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua +#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua +#: builtin/mainmenu/tab_content.lua msgid "Dependencies:" msgstr "相依元件:" @@ -112,7 +207,7 @@ msgstr "無法啟用 Mod「$1」,因為其包含了不允許的字元。只能 #: builtin/mainmenu/dlg_config_world.lua msgid "Find More Mods" -msgstr "" +msgstr "搜尋更多 Mod" #: builtin/mainmenu/dlg_config_world.lua msgid "Mod:" @@ -155,29 +250,67 @@ msgstr "世界:" msgid "enabled" msgstr "已啟用" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "\"$1\" already exists. Would you like to overwrite it?" +msgstr "“$1”已經存在。您要覆蓋它嗎?" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 and $2 dependencies will be installed." +msgstr "$1 和他的 $2 個依賴將會被安裝。" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 by $2" +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..." +msgstr "正在下載 $1..." + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 required dependencies could not be found." +msgstr "找不到 $1 所需的依賴項。" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "$1 will be installed, and $2 dependencies will be skipped." +msgstr "將安裝 $1,並且將跳過他的 $2 個依賴項。" + #: builtin/mainmenu/dlg_contentstore.lua msgid "All packages" msgstr "所有套件" +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Already installed" +msgstr "已安裝" + #: builtin/mainmenu/dlg_contentstore.lua msgid "Back to Main Menu" msgstr "返回主選單" #: builtin/mainmenu/dlg_contentstore.lua -msgid "ContentDB is not available when Minetest was compiled without cURL" -msgstr "" +msgid "Base Game:" +msgstr "主遊戲:" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "ContentDB is not available when Minetest was compiled without cURL" +msgstr "在沒有 cURL 的情況下編譯 Minetest 時,ContentDB 不可用" #: builtin/mainmenu/dlg_contentstore.lua -#, fuzzy msgid "Downloading..." -msgstr "正在載入..." +msgstr "正在下載..." #: builtin/mainmenu/dlg_contentstore.lua msgid "Failed to download $1" msgstr "無法下載 $1" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua msgid "Games" msgstr "遊戲" @@ -186,9 +319,20 @@ msgid "Install" msgstr "安裝" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua +msgid "Install $1" +msgstr "安裝 $1" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install missing dependencies" +msgstr "安裝缺少的依賴" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Install: Unsupported file type or broken archive" +msgstr "安裝:檔案類型不支援,或是封存檔損壞" + +#: builtin/mainmenu/dlg_contentstore.lua msgid "Mods" -msgstr "Mod" +msgstr "Mods" #: builtin/mainmenu/dlg_contentstore.lua msgid "No packages could be retrieved" @@ -199,9 +343,24 @@ msgid "No results" msgstr "無結果" #: builtin/mainmenu/dlg_contentstore.lua -#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua -msgid "Search" -msgstr "搜尋" +msgid "No updates" +msgstr "無更新" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Not found" +msgstr "找不到" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Overwrite" +msgstr "覆蓋" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Please check that the base game is correct." +msgstr "請檢查基礎遊戲是否正確。" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "Queued" +msgstr "已排程" #: builtin/mainmenu/dlg_contentstore.lua msgid "Texture packs" @@ -216,16 +375,20 @@ msgid "Update" msgstr "更新" #: builtin/mainmenu/dlg_contentstore.lua -msgid "View" -msgstr "" +msgid "Update All [$1]" +msgstr "全部更新 [$1]" + +#: builtin/mainmenu/dlg_contentstore.lua +msgid "View more information in a web browser" +msgstr "在網絡瀏覽器中查看更多信息" #: builtin/mainmenu/dlg_create_world.lua msgid "A world named \"$1\" already exists" -msgstr "名為「$1」的世界已存在" +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" @@ -247,40 +410,33 @@ msgid "Biomes" msgstr "生物雜訊" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caverns" -msgstr "洞穴雜訊" +msgstr "大洞穴" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Caves" -msgstr "倍頻程" +msgstr "洞穴" #: builtin/mainmenu/dlg_create_world.lua msgid "Create" msgstr "建立" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Decorations" -msgstr "迭代" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download a game, such as Minetest Game, from minetest.net" -msgstr "從 minetest.net 下載遊戲,例如 Minetest Game" - -#: builtin/mainmenu/dlg_create_world.lua -msgid "Download one from minetest.net" -msgstr "從 minetest.net 下載一個" +msgstr "裝飾物" #: builtin/mainmenu/dlg_create_world.lua #, 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 #, fuzzy @@ -288,38 +444,41 @@ msgid "Floating landmasses in the sky" msgstr "浮地山密度" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 "生成非破碎地形: 海洋與地底" #: builtin/mainmenu/dlg_create_world.lua msgid "Hills" -msgstr "" +msgstr "山" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy 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 msgid "Lakes" -msgstr "" +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" @@ -327,25 +486,23 @@ msgstr "地圖產生器" #: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp msgid "Mapgen flags" -msgstr "Mapgen 旗標" +msgstr "地圖產生器旗標" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mapgen-specific flags" -msgstr "Mapgen v5 特別旗標" +msgstr "v5 地圖產生器特別旗標" #: builtin/mainmenu/dlg_create_world.lua -#, fuzzy msgid "Mountains" -msgstr "山雜訊" +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" @@ -353,74 +510,66 @@ 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 -#, fuzzy msgid "Rivers" -msgstr "河流大小" +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 msgid "Seed" -msgstr "種子" +msgstr "種子碼" #: builtin/mainmenu/dlg_create_world.lua msgid "Smooth transition between biomes" -msgstr "" +msgstr "生態域之間的平穩過渡" #: builtin/mainmenu/dlg_create_world.lua msgid "" "Structures appearing on the terrain (no effect on trees and jungle grass " "created by v6)" -msgstr "" +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 -#, fuzzy 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 -#, fuzzy 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 -#, fuzzy -msgid "Warning: The Development Test is meant for developers." -msgstr "警告:最小化的開發測試僅供開發者使用。" +msgstr "地下深處的巨大洞穴" #: builtin/mainmenu/dlg_create_world.lua msgid "World name" @@ -428,7 +577,7 @@ 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\"?" @@ -446,11 +595,44 @@ msgstr "pkgmgr:無法刪除「$1」" #: builtin/mainmenu/dlg_delete_content.lua msgid "pkgmgr: invalid path \"$1\"" -msgstr "pkgmgr:「%1」路徑無效" +msgstr "pkgmgr:「$1」路徑無效" #: builtin/mainmenu/dlg_delete_world.lua msgid "Delete World \"$1\"?" -msgstr "刪除「$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 "Mapgen 名稱" + +#: 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" @@ -472,7 +654,7 @@ msgstr "(未提供設定描述)" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "2D Noise" -msgstr "2D 雜訊值" +msgstr "二維雜訊值" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "< Back to Settings page" @@ -483,6 +665,16 @@ 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 "已停用" @@ -495,9 +687,8 @@ msgid "Enabled" msgstr "已啟用" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy msgid "Lacunarity" -msgstr "Lacunarity" +msgstr "空隙" #: builtin/mainmenu/dlg_settings_advanced.lua #, fuzzy @@ -509,9 +700,8 @@ msgid "Offset" msgstr "補償" #: builtin/mainmenu/dlg_settings_advanced.lua -#, fuzzy -msgid "Persistance" -msgstr "暫留" +msgid "Persistence" +msgstr "持續性" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid integer." @@ -519,7 +709,7 @@ msgstr "請輸入有效的整數。" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Please enter a valid number." -msgstr "請輸入有效的數字。" +msgstr "請輸入一個有效的數字。" #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Restore Default" @@ -529,6 +719,10 @@ msgstr "還原至預設值" msgid "Scale" msgstr "規模" +#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua +msgid "Search" +msgstr "搜尋" + #: builtin/mainmenu/dlg_settings_advanced.lua msgid "Select directory" msgstr "選擇目錄" @@ -537,7 +731,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 "顯示技術名稱" @@ -616,14 +810,6 @@ msgstr "安裝 Mod:找不到下述項目的真實 Mod 名稱:$1" msgid "Install Mod: Unable to find suitable folder name for modpack $1" msgstr "安裝 Mod:找不到 $1 Mod 包適合的資料夾名稱" -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: Unsupported file type \"$1\" or broken archive" -msgstr "安裝:「%1」檔案類型不支援,或是封存檔損壞" - -#: builtin/mainmenu/pkgmgr.lua -msgid "Install: file: \"$1\"" -msgstr "安裝:檔案:「$1」" - #: builtin/mainmenu/pkgmgr.lua msgid "Unable to find a valid mod or modpack" msgstr "找不到有效的 Mod 或 Mod 包" @@ -644,6 +830,60 @@ msgstr "無法將 Mod 安裝為 $1" msgid "Unable to install a modpack as a $1" msgstr "無法將 Mod 包安裝為 $1" +#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp +msgid "Loading..." +msgstr "正在載入..." + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Public server list is disabled" +msgstr "已停用公開伺服器列表" + +#: builtin/mainmenu/serverlistmgr.lua +msgid "Try reenabling public serverlist and check your internet connection." +msgstr "請嘗試重新啟用公共伺服器清單並檢查您的網際網路連線。" + +#: builtin/mainmenu/tab_about.lua +msgid "About" +msgstr "關於" + +#: builtin/mainmenu/tab_about.lua +msgid "Active Contributors" +msgstr "活躍的貢獻者" + +#: builtin/mainmenu/tab_about.lua +#, fuzzy +msgid "Active renderer:" +msgstr "活動目標傳送範圍" + +#: builtin/mainmenu/tab_about.lua +msgid "Core Developers" +msgstr "核心開發者" + +#: builtin/mainmenu/tab_about.lua +msgid "Open User Data Directory" +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" +"用戶提供的世界、遊戲、mod、材質包的目錄。" + +#: builtin/mainmenu/tab_about.lua +msgid "Previous Contributors" +msgstr "先前的貢獻者" + +#: builtin/mainmenu/tab_about.lua +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 "瀏覽線上內容" @@ -684,26 +924,6 @@ msgstr "解除安裝套件" msgid "Use Texture Pack" msgstr "使用材質包" -#: builtin/mainmenu/tab_credits.lua -msgid "Active Contributors" -msgstr "活躍的貢獻者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Core Developers" -msgstr "核心開發者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Credits" -msgstr "感謝" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Contributors" -msgstr "先前的貢獻者" - -#: builtin/mainmenu/tab_credits.lua -msgid "Previous Core Developers" -msgstr "先前的核心開發者" - #: builtin/mainmenu/tab_local.lua msgid "Announce Server" msgstr "公佈伺服器" @@ -713,14 +933,10 @@ msgid "Bind Address" msgstr "綁定地址" #: builtin/mainmenu/tab_local.lua -msgid "Configure" -msgstr "設定" - -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua msgid "Creative Mode" msgstr "創造模式" -#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_local.lua msgid "Enable Damage" msgstr "啟用傷害" @@ -734,11 +950,7 @@ msgstr "主機伺服器" #: builtin/mainmenu/tab_local.lua msgid "Install games from ContentDB" -msgstr "" - -#: builtin/mainmenu/tab_local.lua -msgid "Name/Password" -msgstr "名稱/密碼" +msgstr "從 ContentDB 安裝遊戲" #: builtin/mainmenu/tab_local.lua msgid "New" @@ -752,10 +964,14 @@ msgstr "未建立或選取世界!" msgid "Play Game" msgstr "遊玩遊戲" -#: builtin/mainmenu/tab_local.lua +#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_online.lua msgid "Port" msgstr "連線埠" +#: builtin/mainmenu/tab_local.lua +msgid "Select Mods" +msgstr "選擇模組:" + #: builtin/mainmenu/tab_local.lua msgid "Select World:" msgstr "選取世界:" @@ -769,45 +985,62 @@ msgid "Start Game" msgstr "開始遊戲" #: builtin/mainmenu/tab_online.lua -msgid "Address / Port" -msgstr "地址/連線埠" +msgid "Address" +msgstr "地址" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Connect" -msgstr "連線" +#: builtin/mainmenu/tab_online.lua src/client/keycode.cpp +msgid "Clear" +msgstr "清除" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Creative mode" msgstr "創造模式" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Damage enabled" -msgstr "已啟用傷害" +#. ~ PvP = Player versus Player +#: builtin/mainmenu/tab_online.lua +msgid "Damage / PvP" +msgstr "傷害 / PvP" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Del. Favorite" -msgstr "刪除收藏" - -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Favorite" +#: builtin/mainmenu/tab_online.lua +msgid "Favorites" msgstr "收藏" +#: builtin/mainmenu/tab_online.lua +msgid "Incompatible Servers" +msgstr "不相容的伺服器" + #: builtin/mainmenu/tab_online.lua msgid "Join Game" msgstr "加入遊戲" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "Name / Password" -msgstr "名稱/密碼" +#: builtin/mainmenu/tab_online.lua +msgid "Login" +msgstr "" -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua +#: builtin/mainmenu/tab_online.lua msgid "Ping" msgstr "Ping" -#. ~ PvP = Player versus Player -#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua -msgid "PvP enabled" -msgstr "已啟用 PvP" +#: builtin/mainmenu/tab_online.lua +msgid "Public Servers" +msgstr "公開伺服器" + +#: builtin/mainmenu/tab_online.lua +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" @@ -815,7 +1048,7 @@ msgstr "2x" #: builtin/mainmenu/tab_settings.lua msgid "3D Clouds" -msgstr "3D 雲朵" +msgstr "三維雲朵" #: builtin/mainmenu/tab_settings.lua msgid "4x" @@ -833,10 +1066,6 @@ msgstr "所有設定" msgid "Antialiasing:" msgstr "反鋸齒:" -#: builtin/mainmenu/tab_settings.lua -msgid "Are you sure to reset your singleplayer world?" -msgstr "您確定要重設您的單人遊戲世界嗎?" - #: builtin/mainmenu/tab_settings.lua msgid "Autosave Screen Size" msgstr "自動儲存螢幕大小" @@ -845,10 +1074,6 @@ msgstr "自動儲存螢幕大小" msgid "Bilinear Filter" msgstr "雙線性過濾器" -#: builtin/mainmenu/tab_settings.lua -msgid "Bump Mapping" -msgstr "映射貼圖" - #: builtin/mainmenu/tab_settings.lua src/client/game.cpp msgid "Change Keys" msgstr "變更按鍵" @@ -857,13 +1082,30 @@ msgstr "變更按鍵" msgid "Connected Glass" msgstr "連接玻璃" +#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp +msgid "Dynamic shadows" +msgstr "動態陰影" + +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Dynamic shadows:" +msgstr "動態陰影: " + #: builtin/mainmenu/tab_settings.lua msgid "Fancy Leaves" msgstr "華麗葉子" #: builtin/mainmenu/tab_settings.lua -msgid "Generate Normal Maps" -msgstr "產生一般地圖" +msgid "High" +msgstr "高" + +#: builtin/mainmenu/tab_settings.lua +msgid "Low" +msgstr "低" + +#: builtin/mainmenu/tab_settings.lua +msgid "Medium" +msgstr "中" #: builtin/mainmenu/tab_settings.lua msgid "Mipmap" @@ -873,10 +1115,6 @@ msgstr "Mip 貼圖" msgid "Mipmap + Aniso. Filter" msgstr "Mip 貼圖 + Aniso. 過濾器" -#: builtin/mainmenu/tab_settings.lua -msgid "No" -msgstr "否" - #: builtin/mainmenu/tab_settings.lua msgid "No Filter" msgstr "沒有過濾器" @@ -887,11 +1125,11 @@ msgstr "沒有 Mip 貼圖" #: 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" @@ -905,18 +1143,10 @@ msgstr "不透明葉子" msgid "Opaque Water" msgstr "不透明水" -#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp -msgid "Parallax Occlusion" -msgstr "視差遮蔽" - #: builtin/mainmenu/tab_settings.lua msgid "Particles" msgstr "粒子" -#: builtin/mainmenu/tab_settings.lua -msgid "Reset singleplayer world" -msgstr "重設單人遊戲世界" - #: builtin/mainmenu/tab_settings.lua msgid "Screen:" msgstr "螢幕:" @@ -929,6 +1159,10 @@ msgstr "設定" msgid "Shaders" msgstr "著色器" +#: builtin/mainmenu/tab_settings.lua +msgid "Shaders (experimental)" +msgstr "著色器(實驗性)" + #: builtin/mainmenu/tab_settings.lua msgid "Shaders (unavailable)" msgstr "著色器(無法使用)" @@ -945,22 +1179,28 @@ msgstr "平滑光線" msgid "Texturing:" msgstr "紋理:" -#: builtin/mainmenu/tab_settings.lua -msgid "To enable shaders the OpenGL driver needs to be used." -msgstr "要啟用著色器,必須使用 OpenGL 驅動程式。" - #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp msgid "Tone Mapping" msgstr "色調映射" #: builtin/mainmenu/tab_settings.lua -msgid "Touchthreshold: (px)" +#, fuzzy +msgid "Touch threshold (px):" msgstr "觸控閾值:(像素)" #: builtin/mainmenu/tab_settings.lua msgid "Trilinear Filter" msgstr "三線性過濾器" +#: builtin/mainmenu/tab_settings.lua +#, fuzzy +msgid "Very High" +msgstr "超高" + +#: builtin/mainmenu/tab_settings.lua +msgid "Very Low" +msgstr "很低" + #: builtin/mainmenu/tab_settings.lua msgid "Waving Leaves" msgstr "葉子擺動" @@ -973,23 +1213,12 @@ msgstr "擺動液體" msgid "Waving Plants" msgstr "植物擺動" -#: builtin/mainmenu/tab_settings.lua -msgid "Yes" -msgstr "是" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Config mods" -msgstr "設定 Mod" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Main" -msgstr "主要" - -#: builtin/mainmenu/tab_simple_main.lua -msgid "Start Singleplayer" -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 "連線逾時。" @@ -1018,8 +1247,8 @@ msgid "Connection error (timed out?)" msgstr "連線錯誤(逾時?)" #: src/client/clientlauncher.cpp -msgid "Could not find or load game \"" -msgstr "找不到或無法載入遊戲 \"" +msgid "Could not find or load game: " +msgstr "找不到或無法載入遊戲: " #: src/client/clientlauncher.cpp msgid "Invalid gamespec." @@ -1049,18 +1278,6 @@ msgstr "無法開啟提供的密碼檔案: " msgid "Provided world path doesn't exist: " msgstr "提供的世界路徑不存在: " -#. ~ DO NOT TRANSLATE THIS LITERALLY! -#. This is a special string. Put either "no" or "yes" -#. into the translation field (literally). -#. Choose "yes" if the language requires use of the fallback -#. font, "no" otherwise. -#. The fallback font is (normally) required for languages with -#. non-Latin script, like Chinese. -#. When in doubt, test your translation. -#: src/client/fontengine.cpp -msgid "needs_fallback_font" -msgstr "yes" - #: src/client/game.cpp msgid "" "\n" @@ -1073,14 +1290,6 @@ msgstr "" msgid "- Address: " msgstr "- 地址: " -#: src/client/game.cpp -msgid "- Creative Mode: " -msgstr "- 創造模式: " - -#: src/client/game.cpp -msgid "- Damage: " -msgstr "- 傷害: " - #: src/client/game.cpp msgid "- Mode: " msgstr "- 模式: " @@ -1102,6 +1311,15 @@ msgstr "- PvP: " msgid "- Server Name: " msgstr "- 伺服器名稱: " +#: src/client/game.cpp +msgid "A serialization error occurred:" +msgstr "序列化時發生錯誤:" + +#: src/client/game.cpp +#, c-format +msgid "Access denied. Reason: %s" +msgstr "存取被拒絕。原因︰%s" + #: src/client/game.cpp msgid "Automatic forward disabled" msgstr "已停用自動前進" @@ -1110,6 +1328,22 @@ msgstr "已停用自動前進" msgid "Automatic forward enabled" msgstr "已啟用自動前進" +#: src/client/game.cpp +msgid "Block bounds hidden" +msgstr "區塊邊界隱藏" + +#: src/client/game.cpp +msgid "Block bounds shown for all blocks" +msgstr "區塊邊界顯示所有區塊" + +#: src/client/game.cpp +msgid "Block bounds shown for current block" +msgstr "區塊邊界顯示目前區塊" + +#: src/client/game.cpp +msgid "Block bounds shown for nearby blocks" +msgstr "區塊邊界顯示鄰接區塊" + #: src/client/game.cpp msgid "Camera update disabled" msgstr "已停用相機更新" @@ -1118,6 +1352,11 @@ msgstr "已停用相機更新" msgid "Camera update enabled" msgstr "已啟用相機更新" +#: src/client/game.cpp +#, fuzzy +msgid "Can't show block bounds (disabled by mod or game)" +msgstr "不能顯示區塊邊界 (需要「basic_debug」權限)" + #: src/client/game.cpp msgid "Change Password" msgstr "變更密碼" @@ -1130,6 +1369,10 @@ msgstr "已停用電影模式" msgid "Cinematic mode enabled" msgstr "已啟用電影模式" +#: src/client/game.cpp +msgid "Client disconnected" +msgstr "用戶端已斷線" + #: src/client/game.cpp msgid "Client side scripting is disabled" msgstr "已停用用戶端指令稿" @@ -1138,6 +1381,10 @@ msgstr "已停用用戶端指令稿" msgid "Connecting to server..." msgstr "正在連線至伺服器..." +#: src/client/game.cpp +msgid "Connection failed for unknown reason" +msgstr "連線失敗,原因不明" + #: src/client/game.cpp msgid "Continue" msgstr "繼續" @@ -1150,13 +1397,13 @@ msgid "" "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" -"- %s: jump/climb\n" -"- %s: sneak/go down\n" +"- %s: jump/climb up\n" +"- %s: dig/punch\n" +"- %s: place/use\n" +"- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" -"- Mouse left: dig/punch\n" -"- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" msgstr "" @@ -1165,16 +1412,21 @@ msgstr "" "- %s:向後移動\n" "- %s:向左移動\n" "- %s:向右移動\n" -"- %s:跳躍/攀爬\n" -"- %s:潛行/往下\n" +"- %s:跳躍/向上攀爬\n" +"- %s:挖/打\n" +"- %s:放置/使用\n" +"- %s:潛行/向下攀爬\n" "- %s:丟棄物品\n" "- %s:物品欄\n" "- 滑鼠:旋轉/觀看\n" -"- 滑鼠左鍵:挖/推擠\n" -"- 滑鼠右鍵:放置/使用\n" "- 滑鼠滾輪:選取物品\n" "- %s:聊天\n" +#: src/client/game.cpp +#, c-format +msgid "Couldn't resolve address: %s" +msgstr "無法解析位址︰%s" + #: src/client/game.cpp msgid "Creating client..." msgstr "正在建立用戶端..." @@ -1231,6 +1483,11 @@ msgstr "已停用無限視野" 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 "離開,回到選單" @@ -1304,32 +1561,8 @@ msgid "Minimap currently disabled by game or mod" msgstr "迷你地圖目前已被遊戲或 Mod 停用" #: src/client/game.cpp -msgid "Minimap hidden" -msgstr "已隱藏迷你地圖" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x1" -msgstr "雷達模式的迷你地圖,放大 1 倍" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x2" -msgstr "雷達模式的迷你地圖,放大 2 倍" - -#: src/client/game.cpp -msgid "Minimap in radar mode, Zoom x4" -msgstr "雷達模式的迷你地圖,放大 4 倍" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x1" -msgstr "表面模式的迷你地圖,放大 1 倍" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x2" -msgstr "表面模式的迷你地圖,放大 2 倍" - -#: src/client/game.cpp -msgid "Minimap in surface mode, Zoom x4" -msgstr "表面模式的迷你地圖,放大 4 倍" +msgid "Multiplayer" +msgstr "多人遊戲" #: src/client/game.cpp msgid "Noclip mode disabled" @@ -1393,16 +1626,31 @@ 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" msgstr "已取消靜音" +#: src/client/game.cpp +#, c-format +msgid "The server is probably running a different version of %s." +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" @@ -1472,10 +1720,6 @@ msgstr "退格鍵" msgid "Caps Lock" msgstr "大寫鎖定鍵" -#: src/client/keycode.cpp -msgid "Clear" -msgstr "清除" - #: src/client/keycode.cpp msgid "Control" msgstr "Control" @@ -1723,34 +1967,39 @@ msgstr "X 按鈕 2" msgid "Zoom" msgstr "遠近調整" -#: src/gui/guiConfirmRegistration.cpp src/gui/guiPasswordChange.cpp -msgid "Passwords do not match!" -msgstr "密碼不符合!" +#: src/client/minimap.cpp +msgid "Minimap hidden" +msgstr "已隱藏迷你地圖" -#: src/gui/guiConfirmRegistration.cpp -msgid "Register and Join" -msgstr "註冊並加入" - -#: src/gui/guiConfirmRegistration.cpp +#: src/client/minimap.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" -"請重新輸入您的密碼,後按下「註冊並加入」確認帳戶建立,或按「取消」中止。" +msgid "Minimap in radar mode, Zoom x%d" +msgstr "雷達模式的迷你地圖,放大 %d 倍" + +#: src/client/minimap.cpp +#, c-format +msgid "Minimap in surface mode, Zoom x%d" +msgstr "表面模式的迷你地圖,放大 %d 倍" + +#: src/client/minimap.cpp +msgid "Minimap in texture mode" +msgstr "材質模式的迷你地圖" + +#: src/gui/guiChatConsole.cpp +msgid "Failed to open webpage" +msgstr "無法開啟網頁" + +#: src/gui/guiChatConsole.cpp +msgid "Opening webpage" +msgstr "正在開啟網頁" #: src/gui/guiFormSpecMenu.cpp msgid "Proceed" msgstr "繼續" #: src/gui/guiKeyChangeMenu.cpp -msgid "\"Special\" = climb down" -msgstr "\"Special\" = 向下攀爬" +msgid "\"Aux1\" = climb down" +msgstr "\"Aux1\" = 向下攀爬" #: src/gui/guiKeyChangeMenu.cpp msgid "Autoforward" @@ -1760,15 +2009,23 @@ msgstr "自動前進" msgid "Automatic jumping" msgstr "自動跳躍" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Aux1" +msgstr "Aux1" + #: src/gui/guiKeyChangeMenu.cpp msgid "Backward" msgstr "後退" +#: src/gui/guiKeyChangeMenu.cpp +msgid "Block bounds" +msgstr "區塊邊界" + #: src/gui/guiKeyChangeMenu.cpp msgid "Change camera" msgstr "變更相機" -#: src/gui/guiKeyChangeMenu.cpp +#: src/gui/guiKeyChangeMenu.cpp src/settings_translation_file.cpp msgid "Chat" msgstr "聊天" @@ -1821,8 +2078,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" @@ -1852,10 +2109,6 @@ msgstr "螢幕擷取" msgid "Sneak" msgstr "潛行" -#: src/gui/guiKeyChangeMenu.cpp -msgid "Special" -msgstr "特殊" - #: src/gui/guiKeyChangeMenu.cpp msgid "Toggle HUD" msgstr "切換 HUD" @@ -1896,10 +2149,6 @@ msgstr "按下按鍵" msgid "Change" msgstr "變更" -#: src/gui/guiPasswordChange.cpp -msgid "Confirm Password" -msgstr "確認密碼" - #: src/gui/guiPasswordChange.cpp msgid "New Password" msgstr "新密碼" @@ -1908,6 +2157,10 @@ msgstr "新密碼" msgid "Old Password" msgstr "舊密碼" +#: src/gui/guiPasswordChange.cpp +msgid "Passwords do not match!" +msgstr "密碼不符合!" + #: src/gui/guiVolumeChange.cpp msgid "Exit" msgstr "離開" @@ -1917,14 +2170,9 @@ msgid "Muted" msgstr "已靜音" #: src/gui/guiVolumeChange.cpp -msgid "Sound Volume: " -msgstr "音量: " - -#. ~ Imperative, as in "Enter/type in text". -#. Don't forget the space. -#: src/gui/modalMenu.cpp -msgid "Enter " -msgstr "輸入 " +#, c-format +msgid "Sound Volume: %d%%" +msgstr "音量:%d%%" #. ~ DO NOT TRANSLATE THIS LITERALLY! #. This is a special string which needs to contain the translation's @@ -1933,6 +2181,16 @@ msgstr "輸入 " msgid "LANG_CODE" msgstr "zh_TW" +#: 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" @@ -1942,12 +2200,13 @@ msgstr "" "如停用,虛擬搖桿將會置中於第一個觸碰的位置。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"(Android) Use virtual joystick to trigger \"aux\" button.\n" -"If enabled, virtual joystick will also tap \"aux\" button when out of main " +"(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) 使用虛擬搖桿觸發 \"aux\" 按鍵。\n" +msgstr "" +"(Android) 使用虛擬搖桿觸發 \"Aux1\" 按鍵。\n" +"如果啟用,虛擬搖桿在離開主圓圈時也會觸發 \"Aux1\" 按鍵。" #: src/settings_translation_file.cpp #, fuzzy @@ -1977,14 +2236,6 @@ msgid "" "an island, set all 3 numbers equal for the raw shape." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"0 = parallax occlusion with slope information (faster).\n" -"1 = relief mapping (slower, more accurate)." -msgstr "" -"0 = 包含斜率資訊的視差遮蔽(較快)。\n" -"1 = 替換貼圖(較慢,較準確)。" - #: src/settings_translation_file.cpp msgid "2D noise that controls the shape/size of ridged mountains." msgstr "控制山脊之形狀或大小的 2D 雜訊值。" @@ -1994,9 +2245,8 @@ msgid "2D noise that controls the shape/size of rolling hills." msgstr "控制波狀丘陵地之形狀或大小的 2D 雜訊值。" #: src/settings_translation_file.cpp -#, fuzzy msgid "2D noise that controls the shape/size of step mountains." -msgstr "控制 Step mountains 之形狀或大小的 2D 雜訊值。" +msgstr "控制階梯山脈之形狀或大小的 2D 雜訊值。" #: src/settings_translation_file.cpp msgid "2D noise that controls the size/occurrence of ridged mountain ranges." @@ -2088,6 +2338,10 @@ msgstr "" "- pageflip:基於四重緩衝的 3D。\n" "註:interlaced 模式需要啟用著色器。" +#: 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" @@ -2108,6 +2362,10 @@ msgstr "當伺服器關機時要顯示在所有用戶端上的訊息。" msgid "ABM interval" msgstr "ABM 間隔" +#: src/settings_translation_file.cpp +msgid "ABM time budget" +msgstr "ABM 時間預算" + #: src/settings_translation_file.cpp #, fuzzy msgid "Absolute limit of queued blocks to emerge" @@ -2157,6 +2415,10 @@ msgid "" "screens." msgstr "調整您螢幕的 DPI 設定(並不只有 X11/Android)例如 4K 螢幕。" +#: src/settings_translation_file.cpp +msgid "Adjust the detected display density, used for scaling UI elements." +msgstr "調整偵測到的顯示密度,用來縮放 UI 元件。" + #: src/settings_translation_file.cpp #, c-format msgid "" @@ -2167,6 +2429,11 @@ msgid "" "to be sure) creates a solid floatland layer." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Admin name" +msgstr "將物品名稱加至末尾" + #: src/settings_translation_file.cpp msgid "Advanced" msgstr "進階" @@ -2181,7 +2448,8 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Always fly and fast" +#, fuzzy +msgid "Always fly fast" msgstr "總是啟用飛行與快速模式" #: src/settings_translation_file.cpp @@ -2221,16 +2489,16 @@ msgid "Apple trees noise" msgstr "蘋果樹雜訊" #: src/settings_translation_file.cpp -#, fuzzy msgid "Arm inertia" msgstr "慣性手臂" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Arm inertia, gives a more realistic movement of\n" "the arm when the camera moves." -msgstr "慣性手臂,當相機移動時提供更加真實的手臂運動。" +msgstr "" +"慣性手臂,當相機移動時提供\n" +"更加真實的手臂運動。" #: src/settings_translation_file.cpp msgid "Ask to reconnect after crash" @@ -2258,16 +2526,18 @@ msgstr "" "在地圖區塊中顯示(16 個節點)" #: src/settings_translation_file.cpp -#, fuzzy -msgid "Automatic forward key" -msgstr "前進鍵" - -#: src/settings_translation_file.cpp -msgid "Automatically jump up single-node obstacles." +msgid "Audio" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Automatic forward key" +msgstr "自動前進鍵" + +#: src/settings_translation_file.cpp +msgid "Automatically jump up single-node obstacles." +msgstr "自動跳過單個障礙物。" + +#: src/settings_translation_file.cpp msgid "Automatically report to the serverlist." msgstr "自動回報到伺服器列表。" @@ -2277,28 +2547,29 @@ msgstr "自動儲存視窗大小" #: src/settings_translation_file.cpp msgid "Autoscaling mode" -msgstr "" +msgstr "自動縮放模式" + +#: src/settings_translation_file.cpp +msgid "Aux1 key" +msgstr "Aux1 鍵" + +#: src/settings_translation_file.cpp +msgid "Aux1 key for climbing/descending" +msgstr "用於攀爬/下降的 Aux1 按鍵" #: src/settings_translation_file.cpp msgid "Backward key" msgstr "後退鍵" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base ground level" -msgstr "地面高度" +msgstr "基礎地平面" #: src/settings_translation_file.cpp -#, fuzzy msgid "Base terrain height." -msgstr "基礎地形高度" +msgstr "基礎地形高度。" #: src/settings_translation_file.cpp -msgid "Basic" -msgstr "基礎" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Basic privileges" msgstr "基礎特權" @@ -2319,7 +2590,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 @@ -2327,33 +2599,28 @@ msgid "Biome noise" msgstr "生物雜訊" #: src/settings_translation_file.cpp -msgid "Bits per pixel (aka color depth) in fullscreen mode." -msgstr "全螢幕模式中的位元/像素(又稱色彩深度)。" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Block send optimize distance" msgstr "區塊傳送最佳化距離" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Bobbing" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Bold and italic font path" -msgstr "等寬字型路徑" +msgstr "粗體與斜體字型路徑" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold and italic monospace font path" -msgstr "等寬字型路徑" +msgstr "粗體與斜體等寬字型路徑" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold font path" -msgstr "字型路徑" +msgstr "粗體字型路徑" #: src/settings_translation_file.cpp -#, fuzzy msgid "Bold monospace font path" -msgstr "等寬字型路徑" +msgstr "粗體等寬字型路徑" #: src/settings_translation_file.cpp msgid "Build inside player" @@ -2364,8 +2631,9 @@ msgid "Builtin" msgstr "內建" #: src/settings_translation_file.cpp -msgid "Bumpmapping" -msgstr "映射貼圖" +#, fuzzy +msgid "Camera" +msgstr "變更相機" #: src/settings_translation_file.cpp msgid "" @@ -2428,9 +2696,8 @@ msgid "Cavern threshold" msgstr "洞穴閾值" #: src/settings_translation_file.cpp -#, fuzzy msgid "Cavern upper limit" -msgstr "洞穴極限" +msgstr "洞穴上層極限" #: src/settings_translation_file.cpp msgid "" @@ -2439,28 +2706,25 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "" -"Changes the main menu UI:\n" -"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, " -"etc.\n" -"- Simple: One singleplayer world, no game or texture pack choosers. May " -"be\n" -"necessary for smaller screens." -msgstr "" +#, fuzzy +msgid "Chat command time message threshold" +msgstr "聊天訊息踢出閾值" + +#: src/settings_translation_file.cpp +msgid "Chat commands" +msgstr "聊天指令" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat font size" -msgstr "字型大小" +msgstr "聊天字型大小" #: src/settings_translation_file.cpp msgid "Chat key" msgstr "聊天按鍵" #: src/settings_translation_file.cpp -#, fuzzy msgid "Chat log level" -msgstr "除錯記錄等級" +msgstr "聊天記錄等級" #: src/settings_translation_file.cpp msgid "Chat message count limit" @@ -2483,8 +2747,8 @@ msgid "Chat toggle key" msgstr "聊天切換按鍵" #: src/settings_translation_file.cpp -msgid "Chatcommands" -msgstr "聊天指令" +msgid "Chat weblinks" +msgstr "顯示網頁連結" #: src/settings_translation_file.cpp msgid "Chunk size" @@ -2502,6 +2766,12 @@ msgstr "電影模式按鍵" msgid "Clean transparent textures" msgstr "清除透明材質" +#: src/settings_translation_file.cpp +msgid "" +"Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console " +"output." +msgstr "在聊天室主控台輸出中可以點選網頁連結 (滑鼠中鍵或 Ctrl+left-單擊)。" + #: src/settings_translation_file.cpp msgid "Client" msgstr "用戶端" @@ -2515,13 +2785,17 @@ msgid "Client modding" msgstr "用戶端修改" #: src/settings_translation_file.cpp -#, fuzzy msgid "Client side modding restrictions" -msgstr "用戶端修改" +msgstr "用戶端修改限制" #: src/settings_translation_file.cpp msgid "Client side node lookup range restriction" -msgstr "" +msgstr "用戶端節點查詢範圍限制" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Client-side Modding" +msgstr "用戶端修改" #: src/settings_translation_file.cpp msgid "Climbing speed" @@ -2547,6 +2821,10 @@ msgstr "選單中的雲朵" msgid "Colored fog" msgstr "彩色迷霧" +#: src/settings_translation_file.cpp +msgid "Colored shadows" +msgstr "彩色陰影" + #: src/settings_translation_file.cpp msgid "" "Comma-separated list of flags to hide in the content repository.\n" @@ -2578,6 +2856,22 @@ msgstr "" msgid "Command key" msgstr "指令按鍵" +#: src/settings_translation_file.cpp +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 "" + +#: src/settings_translation_file.cpp +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 "" + #: src/settings_translation_file.cpp msgid "Connect glass" msgstr "連接玻璃" @@ -2603,13 +2897,20 @@ msgid "Console height" msgstr "終端機高度" #: src/settings_translation_file.cpp -msgid "ContentDB Flag Blacklist" +msgid "Content Repository" msgstr "" #: src/settings_translation_file.cpp -#, fuzzy +msgid "ContentDB Flag Blacklist" +msgstr "ContentDB 旗標黑名單列表" + +#: src/settings_translation_file.cpp +msgid "ContentDB Max Concurrent Downloads" +msgstr "ContentDB 最大並行下載數" + +#: src/settings_translation_file.cpp msgid "ContentDB URL" -msgstr "繼續" +msgstr "ContentDB URL" #: src/settings_translation_file.cpp msgid "Continuous forward" @@ -2620,23 +2921,27 @@ msgid "" "Continuous forward movement, toggled by autoforward key.\n" "Press the autoforward key again or the backwards movement to disable." msgstr "" +"連續前進,通過自動前進鍵切換。\n" +"再次按自動前進鍵或向後移動即可禁用。" #: src/settings_translation_file.cpp msgid "Controls" msgstr "控制" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Controls length of day/night cycle.\n" "Examples:\n" "72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged." msgstr "" "控制日/夜循環的長度。\n" -"範例:72 = 20分鐘,360 = 4分鐘,1 = 24小時,0 = 日/夜/一切保持不變。" +"範例:\n" +"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 @@ -2653,6 +2958,9 @@ msgid "" "Value >= 10.0 completely disables generation of tunnels and avoids the\n" "intensive noise calculations." msgstr "" +"控制隧道的寬度,較小的值將創建較寬的隧道。\n" +"數值 > = 10.0 完全禁用了隧道的生成,並避免了\n" +"密集的噪聲計算。" #: src/settings_translation_file.cpp msgid "Crash message" @@ -2667,16 +2975,24 @@ msgid "Crosshair alpha" msgstr "十字 alpha 值" #: src/settings_translation_file.cpp -msgid "Crosshair alpha (opaqueness, between 0 and 255)." -msgstr "十字 alpha 值(不透明,0 至 255間)。" +msgid "" +"Crosshair alpha (opaqueness, between 0 and 255).\n" +"This also applies to the object crosshair." +msgstr "" +"十字 alpha 值(不透明,0 至 255間)。\n" +"這也會套用到物件十字。" #: src/settings_translation_file.cpp msgid "Crosshair color" msgstr "十字色彩" #: src/settings_translation_file.cpp -msgid "Crosshair color (R,G,B)." -msgstr "十字色彩 (R,G,B)。" +msgid "" +"Crosshair color (R,G,B).\n" +"Also controls the object crosshair color" +msgstr "" +"十字準線顏色(R,G,B)。\n" +"還控制物件的十字線顏色" #: src/settings_translation_file.cpp msgid "DPI" @@ -2691,21 +3007,20 @@ msgid "Debug info toggle key" msgstr "除錯資訊切換按鍵" #: src/settings_translation_file.cpp -#, fuzzy msgid "Debug log file size threshold" -msgstr "沙漠雜訊閾值" +msgstr "除錯紀錄檔案大小閾值" #: src/settings_translation_file.cpp 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" @@ -2740,17 +3055,15 @@ msgid "Default report format" msgstr "缺省報告格式" #: src/settings_translation_file.cpp -#, fuzzy msgid "Default stack size" -msgstr "預設遊戲" +msgstr "預設堆疊大小" #: src/settings_translation_file.cpp msgid "" -"Default timeout for cURL, stated in milliseconds.\n" -"Only has an effect if compiled with cURL." +"Define shadow filtering quality.\n" +"This simulates the soft shadows effect by applying a PCF or Poisson disk\n" +"but also uses more resources." msgstr "" -"cURL 的預設逾時,以毫秒計算。\n" -"只會在與 cURL 一同編譯的情況下才會有影響。" #: src/settings_translation_file.cpp msgid "Defines areas where trees have apples." @@ -2783,36 +3096,24 @@ msgid "Defines location and terrain of optional hills and lakes." msgstr "定義可選的山丘與湖泊的位置與地形。" #: src/settings_translation_file.cpp -msgid "" -"Defines sampling step of texture.\n" -"A higher value results in smoother normal maps." -msgstr "" -"定義材質的採樣步驟。\n" -"較高的值會有較平滑的一般地圖。" - -#: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the base ground level." -msgstr "定義樹木區與樹木密度。" +msgstr "定義基礎地面高度。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the depth of the river channel." -msgstr "定義樹木區與樹木密度。" +msgstr "定義河道的深度。" #: src/settings_translation_file.cpp msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)." msgstr "定義玩家最大可傳送的距離,以方塊計(0 = 不限制)。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river channel." -msgstr "定義大型河道結構。" +msgstr "定義河道寬度。" #: src/settings_translation_file.cpp -#, fuzzy msgid "Defines the width of the river valley." -msgstr "定義樹上有蘋果的區域。" +msgstr "定義河谷的寬度。" #: src/settings_translation_file.cpp msgid "Defines tree areas and tree density." @@ -2858,18 +3159,26 @@ msgid "Desert noise threshold" msgstr "沙漠雜訊閾值" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Deserts occur when np_biome exceeds this value.\n" "When the 'snowbiomes' flag is enabled, this is ignored." msgstr "" "當 np_biome 超過此值時,會產生沙漠。\n" -"當啟用新的生物群系統時,這個將會被忽略。" +"當啟用新的生物群系統'snowbiomes'時,這個將會被忽略。" #: src/settings_translation_file.cpp 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 "挖掘粒子" @@ -2882,6 +3191,16 @@ msgstr "停用反作弊" msgid "Disallow empty passwords" msgstr "不允許空密碼" +#: src/settings_translation_file.cpp +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 "伺服器的域名,將會在伺服器列表中顯示。" @@ -2905,11 +3224,11 @@ msgstr "轉儲 mapgen 的除錯資訊。" #: src/settings_translation_file.cpp msgid "Dungeon maximum Y" -msgstr "" +msgstr "地城最大 X" #: src/settings_translation_file.cpp msgid "Dungeon minimum Y" -msgstr "" +msgstr "地城最大 Y" #: src/settings_translation_file.cpp msgid "Dungeon noise" @@ -2920,6 +3239,8 @@ msgid "" "Enable IPv6 support (for both client and server).\n" "Required for IPv6 connections to work at all." msgstr "" +"啟用 IPv6 支援(針對客戶端和伺服器)。\n" +"IPv6 連線需要它才能運作。" #: src/settings_translation_file.cpp msgid "" @@ -2929,23 +3250,38 @@ msgstr "" "在用戶端上啟用 Lua 修改支援。\n" "這個支援是實驗性的,且 API 可能會變動。" +#: src/settings_translation_file.cpp +msgid "" +"Enable Poisson disk filtering.\n" +"On true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF " +"filtering." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Enable colored shadows.\n" +"On true translucent nodes cast colored shadows. This is expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "Enable console window" msgstr "啟用終端機視窗" #: src/settings_translation_file.cpp -msgid "Enable creative mode for new created maps." -msgstr "為新建立的地圖啟用創造模式。" +msgid "Enable creative mode for all players" +msgstr "為所有的玩家啟用創造模式" #: src/settings_translation_file.cpp -#, fuzzy msgid "Enable joysticks" msgstr "啟用搖桿" #: src/settings_translation_file.cpp -#, fuzzy +msgid "Enable joysticks. Requires a restart to take effect" +msgstr "" + +#: src/settings_translation_file.cpp msgid "Enable mod channels support." -msgstr "啟用 mod 安全性" +msgstr "啟用 mod 頻道支援。" #: src/settings_translation_file.cpp msgid "Enable mod security" @@ -2959,16 +3295,6 @@ msgstr "啟用玩家傷害及瀕死。" 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 "" - #: src/settings_translation_file.cpp msgid "" "Enable smooth lighting with simple ambient occlusion.\n" @@ -2977,6 +3303,10 @@ msgstr "" "啟用包含簡易環境光遮蔽的平滑光。\n" "停用以取得速度或不同的外觀。" +#: 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" @@ -3015,15 +3345,14 @@ msgstr "" "舉例來說:設為 0 就不會有視野晃動;1.0 是一般情況;2.0 為雙倍。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" "Enable/disable running an IPv6 server.\n" "Ignored if bind_address is set.\n" "Needs enable_ipv6 to be enabled." msgstr "" -"啟用/停用執行 IPv6 伺服器。IPv6 伺服器可能會限制只有\n" -"IPv6 用戶端才能連線,取決於系統設定。\n" -"當 bind_address 被設定時將會被忽略。" +"啟用/停用執行 IPv6 伺服器。\n" +"當 bind_address 被設定時將會被忽略。\n" +"需要啟用 enable_ipv6。" #: src/settings_translation_file.cpp msgid "" @@ -3037,17 +3366,6 @@ msgstr "" msgid "Enables animation of inventory items." msgstr "啟用物品欄物品動畫。" -#: src/settings_translation_file.cpp -msgid "" -"Enables bumpmapping for textures. Normalmaps need to be supplied by the " -"texture pack\n" -"or need to be auto-generated.\n" -"Requires shaders to be enabled." -msgstr "" -"為材質啟用貼圖轉儲。普通地圖需要材質包的支援\n" -"或是自動生成。\n" -"必須啟用著色器。" - #: src/settings_translation_file.cpp msgid "Enables caching of facedir rotated meshes." msgstr "啟用面旋轉方向的網格快取。" @@ -3056,22 +3374,6 @@ msgstr "啟用面旋轉方向的網格快取。" msgid "Enables minimap." msgstr "啟用小地圖。" -#: src/settings_translation_file.cpp -msgid "" -"Enables on the fly normalmap generation (Emboss effect).\n" -"Requires bumpmapping to be enabled." -msgstr "" -"啟用忙碌的一般地圖生成(浮雕效果)。\n" -"必須啟用貼圖轉儲。" - -#: src/settings_translation_file.cpp -msgid "" -"Enables parallax occlusion mapping.\n" -"Requires shaders to be enabled." -msgstr "" -"啟用視差遮蔽貼圖。\n" -"必須啟用著色器。" - #: src/settings_translation_file.cpp msgid "" "Enables the sound system.\n" @@ -3080,6 +3382,17 @@ msgid "" "Changing this setting requires a restart." msgstr "" +#: 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 "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Engine profiler" +msgstr "山谷分析" + #: src/settings_translation_file.cpp msgid "Engine profiling data print interval" msgstr "引擎性能資料印出間隔" @@ -3088,14 +3401,6 @@ msgstr "引擎性能資料印出間隔" msgid "Entity methods" msgstr "主體方法" -#: src/settings_translation_file.cpp -msgid "" -"Experimental option, might cause visible spaces between blocks\n" -"when set to higher number than 0." -msgstr "" -"實驗性選項,當設定到大於零的值時\n" -"也許會造成在方塊間有視覺空隙。" - #: src/settings_translation_file.cpp msgid "" "Exponent of the floatland tapering. Alters the tapering behaviour.\n" @@ -3107,8 +3412,13 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "FPS in pause menu" -msgstr "在暫停選單中的 FPS" +msgid "FPS" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "FPS when unfocused or paused" +msgstr "當遊戲暫停時的最高 FPS。" #: src/settings_translation_file.cpp msgid "FSAA" @@ -3127,18 +3437,6 @@ msgstr "墜落晃動因素" msgid "Fallback font path" msgstr "備用字型" -#: src/settings_translation_file.cpp -msgid "Fallback font shadow" -msgstr "後備字型陰影" - -#: src/settings_translation_file.cpp -msgid "Fallback font shadow alpha" -msgstr "後備字型陰影 alpha 值" - -#: src/settings_translation_file.cpp -msgid "Fallback font size" -msgstr "後備字型大小" - #: src/settings_translation_file.cpp msgid "Fast key" msgstr "快速按鍵" @@ -3158,7 +3456,7 @@ msgstr "快速移動" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"Fast movement (via the \"special\" key).\n" +"Fast movement (via the \"Aux1\" key).\n" "This requires the \"fast\" privilege on the server." msgstr "" "快速移動(透過使用鍵)。\n" @@ -3198,9 +3496,9 @@ msgstr "電影色調映射" #, fuzzy msgid "" "Filtered textures can blend RGB values with fully-transparent neighbors,\n" -"which PNG optimizers usually discard, sometimes resulting in a dark or\n" -"light edge to transparent textures. Apply this filter to clean that up\n" -"at texture load time." +"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 "" "已過濾的材質會與完全透明的鄰居混合 RGB 值,\n" "PNG 最佳化器通常會丟棄,有時候會導致透明材質\n" @@ -3208,8 +3506,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." @@ -3282,6 +3581,11 @@ msgstr "霧氣開始" 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 "" @@ -3303,15 +3607,15 @@ msgid "Font size" msgstr "字型大小" #: src/settings_translation_file.cpp -msgid "Font size of the default font in point (pt)." +msgid "Font size divisible by" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the fallback font in point (pt)." +msgid "Font size of the default font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp -msgid "Font size of the monospace font in point (pt)." +msgid "Font size of the monospace font where 1 unit = 1 pixel at 96 DPI" msgstr "" #: src/settings_translation_file.cpp @@ -3320,6 +3624,17 @@ msgid "" "Value 0 will use the default font size." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"For pixel-style fonts that do not scale well, this ensures that font sizes " +"used\n" +"with this font will always be divisible by this value, in pixels. For " +"instance,\n" +"a pixel font 16 pixels tall should have this set to 16, so it will only ever " +"be\n" +"sized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Format of player chat messages. The following strings are valid " @@ -3385,11 +3700,6 @@ msgstr "碎形類型" msgid "Fraction of the visible distance at which fog starts to be rendered" msgstr "開始呈現霧氣的可見距離分數" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "FreeType fonts" -msgstr "Freetype 字型" - #: src/settings_translation_file.cpp msgid "" "From how far blocks are generated for clients, stated in mapblocks (16 " @@ -3414,10 +3724,6 @@ msgstr "" msgid "Full screen" msgstr "全螢幕" -#: src/settings_translation_file.cpp -msgid "Full screen BPP" -msgstr "全螢幕 BPP" - #: src/settings_translation_file.cpp msgid "Fullscreen mode." msgstr "全螢幕模式。" @@ -3435,8 +3741,17 @@ msgid "GUI scaling filter txr2img" msgstr "圖形使用者介面縮放比例過濾器 txr2img" #: src/settings_translation_file.cpp -msgid "Generate normalmaps" -msgstr "生成一般地圖" +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" @@ -3447,7 +3762,7 @@ msgstr "全域回呼" msgid "" "Global map generation attributes.\n" "In Mapgen v6 the 'decorations' flag controls all decorations except trees\n" -"and junglegrass, in all other mapgens this flag controls all decorations." +"and jungle grass, in all other mapgens this flag controls all decorations." msgstr "" "全域地圖產生屬性。\n" "在 Mapgen v6 中,「decorations」旗標控制所有除了樹木\n" @@ -3471,6 +3786,16 @@ msgstr "" 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 "重力" @@ -3489,8 +3814,13 @@ msgid "HTTP mods" msgstr "HTTP Mod" #: 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" @@ -3500,8 +3830,8 @@ msgstr "HUD 切換鍵" #, fuzzy msgid "" "Handling for deprecated Lua API calls:\n" -"- legacy: (try to) mimic old behaviour (default for release).\n" -"- log: mimic and log backtrace of deprecated call (default for debug).\n" +"- none: Do not log deprecated calls\n" +"- log: mimic and log backtrace of deprecated call (default).\n" "- error: abort on usage of deprecated call (suggested for mod developers)." msgstr "" "處理已棄用的 Lua API 呼叫:\n" @@ -3531,7 +3861,9 @@ msgid "Heat noise" msgstr "熱 雜訊" #: src/settings_translation_file.cpp -msgid "Height component of the initial window size." +#, fuzzy +msgid "" +"Height component of the initial window size. Ignored in fullscreen mode." msgstr "初始視窗大小的高度組件。" #: src/settings_translation_file.cpp @@ -3542,10 +3874,6 @@ msgstr "高度雜訊" msgid "Height select noise" msgstr "高度 選擇 雜訊" -#: src/settings_translation_file.cpp -msgid "High-precision FPU" -msgstr "高精度 FPU" - #: src/settings_translation_file.cpp msgid "Hill steepness" msgstr "山丘坡度" @@ -3741,13 +4069,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 "" "在取消載入前要有多少未使用的地圖區塊。\n" "較高的值會較平滑,但會使用更多的記憶體。" +#: 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 #, fuzzy msgid "How wide to make rivers." @@ -3784,8 +4121,7 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"If disabled, \"special\" key is used to fly fast if both fly and fast mode " -"are\n" +"If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\n" "enabled." msgstr "若停用,在飛行與快速模式皆啟用時,「使用」鍵將用於快速飛行。" @@ -3814,11 +4150,20 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"If enabled, \"special\" key instead of \"sneak\" key is used for climbing " -"down and\n" +"If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down " +"and\n" "descending." msgstr "若啟用,向下爬與下降將使用「使用」鍵而非「潛行」鍵。" +#: 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" @@ -3846,7 +4191,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 "若啟用,新玩家將無法以空密碼加入。" #: src/settings_translation_file.cpp @@ -3865,6 +4213,12 @@ msgid "" "to this distance from the player to the node." msgstr "" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "If the file size of debug.txt exceeds the number of megabytes specified in\n" @@ -3881,10 +4235,6 @@ msgstr "如果設定了這個,玩家將會總是在指定的位置重生。" 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 "遊戲內聊天視窗背景 alpha 值(不透明度,介於 0 到 255 間)。" @@ -3914,7 +4264,8 @@ msgstr "" "這通常僅被核心/內建貢獻者需要" #: src/settings_translation_file.cpp -msgid "Instrument chatcommands on registration." +#, fuzzy +msgid "Instrument chat commands on registration." msgstr "分析登錄的聊天指令。" #: src/settings_translation_file.cpp @@ -3939,16 +4290,13 @@ msgstr "分析登錄的載入中區塊修飾器的動作函數。" 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 @@ -4001,6 +4349,11 @@ msgstr "搖桿 ID" msgid "Joystick button repetition interval" msgstr "搖桿按鈕重覆間隔" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Joystick dead zone" +msgstr "搖桿類型" + #: src/settings_translation_file.cpp msgid "Joystick frustum sensitivity" msgstr "搖桿靈敏度" @@ -4103,6 +4456,17 @@ msgstr "" "請見 http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for digging.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"跳躍的按鍵。\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for dropping the currently selected item.\n" @@ -4245,6 +4609,17 @@ msgstr "" "請見 http://irrlicht.sourceforge.net/docu/namespaceirr." "html#a54da2a0e231901735e3da1b0edf72eb3" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Key for placing.\n" +"See http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" +msgstr "" +"跳躍的按鍵。\n" +"請見 http://irrlicht.sourceforge.net/docu/namespaceirr." +"html#a54da2a0e231901735e3da1b0edf72eb3" + #: src/settings_translation_file.cpp msgid "" "Key for selecting the 11th hotbar slot.\n" @@ -4779,6 +5154,10 @@ msgstr "" "請見 http://irrlicht.sourceforge.net/docu/namespaceirr." "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 "" @@ -4840,7 +5219,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 "伺服器 tick 的長度與相關物件的間隔通常透過網路更新。" #: src/settings_translation_file.cpp @@ -4854,19 +5233,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 "在 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 "在 Node 計時器執行循環間的時間長度" #: 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 "在活躍方塊管理循環的時間中間" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "Level of logging to be written to debug.txt:\n" "- <nothing> (no logging)\n" @@ -4875,7 +5259,8 @@ msgid "" "- warning\n" "- action\n" "- info\n" -"- verbose" +"- verbose\n" +"- trace" msgstr "" "要被寫入到 debug.txt 的紀錄等級:\n" "- <nothing> (不記錄)\n" @@ -4910,6 +5295,11 @@ msgstr "" 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" @@ -4994,24 +5384,23 @@ msgstr "大型偽隨機洞穴的 Y 上限。" msgid "Main menu script" msgstr "主選單指令稿" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Main menu style" -msgstr "主選單指令稿" - #: src/settings_translation_file.cpp msgid "" "Make fog and sky colors depend on daytime (dawn/sunset) and view direction." msgstr "讓霧與天空的顏色取決於時間(黎明/日落)與觀看方向。" -#: src/settings_translation_file.cpp -msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." -msgstr "讓 DirectX 與 LuaJIT 一同運作。若其造成麻煩則請停用。" - #: src/settings_translation_file.cpp msgid "Makes all liquids opaque" msgstr "讓所有的液體不透明" +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Disk Storage" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Map Compression Level for Network Transfer" +msgstr "" + #: src/settings_translation_file.cpp msgid "Map directory" msgstr "地圖目錄" @@ -5093,6 +5482,11 @@ msgstr "地圖生成限制" msgid "Map save interval" msgstr "地圖儲存間隔" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Map shadows update frames" +msgstr "液體更新 tick" + #: src/settings_translation_file.cpp msgid "Mapblock limit" msgstr "地圖區塊限制" @@ -5212,9 +5606,14 @@ msgid "Maximum FPS" msgstr "最高 FPS" #: src/settings_translation_file.cpp -msgid "Maximum FPS when game is paused." +#, fuzzy +msgid "Maximum FPS when the window is not focused, or when the game is paused." msgstr "當遊戲暫停時的最高 FPS。" +#: src/settings_translation_file.cpp +msgid "Maximum distance to render shadows." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum forceloaded blocks" msgstr "強制載入區塊的最大值" @@ -5266,6 +5665,13 @@ msgstr "" "可被放進佇列內等待從檔案載入的最大區塊數。\n" "將其設定留空則會自動選擇適當的值。" +#: src/settings_translation_file.cpp +msgid "" +"Maximum number of concurrent downloads. Downloads exceeding this limit will " +"be queued.\n" +"This should be lower than curl_parallel_limit." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum number of forceloaded mapblocks." msgstr "強制載入地圖區塊的最大數量。" @@ -5328,17 +5734,22 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Maximum time in ms a file download (e.g. a mod download) may take." +#, fuzzy +msgid "" +"Maximum time a file download (e.g. a mod download) may take, stated in " +"milliseconds." msgstr "檔案下載(例如下載 mod)可花費的最大時間,以毫秒計。" +#: src/settings_translation_file.cpp +msgid "" +"Maximum time an interactive request (e.g. server list fetch) may take, " +"stated in milliseconds." +msgstr "" + #: src/settings_translation_file.cpp msgid "Maximum users" msgstr "最多使用者" -#: src/settings_translation_file.cpp -msgid "Menus" -msgstr "選單" - #: src/settings_translation_file.cpp msgid "Mesh cache" msgstr "網狀快取" @@ -5388,12 +5799,27 @@ msgstr "過濾器的最大材質大小" msgid "Mipmapping" msgstr "映射貼圖" +#: 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 "" #: src/settings_translation_file.cpp -msgid "Modifies the size of the hudbar elements." +#, fuzzy +msgid "Modifies the size of the HUD elements." msgstr "修改 hudbar 元素的大小。" #: src/settings_translation_file.cpp @@ -5404,6 +5830,11 @@ msgstr "等寬字型路徑" msgid "Monospace font size" msgstr "等寬字型大小" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Monospace font size divisible by" +msgstr "等寬字型大小" + #: src/settings_translation_file.cpp msgid "Mountain height noise" msgstr "山高度 雜訊" @@ -5476,10 +5907,6 @@ msgstr "伺服器名稱,當玩家加入時會顯示,也會顯示在伺服器 msgid "Near plane" msgstr "" -#: src/settings_translation_file.cpp -msgid "Network" -msgstr "網路" - #: src/settings_translation_file.cpp msgid "" "Network port to listen (UDP).\n" @@ -5488,6 +5915,11 @@ msgstr "" "要監聽的網路埠 (UDP)。\n" "當從主選單啟動時,這個值將會被覆寫。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Networking" +msgstr "網路" + #: src/settings_translation_file.cpp msgid "New users need to input this password." msgstr "新使用這需要輸入這個密碼。" @@ -5500,6 +5932,11 @@ msgstr "穿牆" 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 "突顯節點" @@ -5512,14 +5949,6 @@ msgstr "NodeTimer 間隔" msgid "Noises" msgstr "雜訊" -#: src/settings_translation_file.cpp -msgid "Normalmaps sampling" -msgstr "法線貼圖採樣" - -#: src/settings_translation_file.cpp -msgid "Normalmaps strength" -msgstr "法線貼圖強度" - #: src/settings_translation_file.cpp msgid "Number of emerge threads" msgstr "出現的執行緒數" @@ -5539,23 +5968,16 @@ 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" +"This is a trade-off between SQLite transaction overhead and\n" "memory consumption (4096=100MB, as a rule of thumb)." msgstr "" "可被 /clearobjects 一次載入的額外區塊數量。\n" "這是與 sqlite 處理耗費的折衷與\n" "記憶體耗費(根據經驗,4096=100MB)。" -#: src/settings_translation_file.cpp -msgid "Number of parallax occlusion iterations." -msgstr "視差遮蔽迭代次數。" - -#: src/settings_translation_file.cpp -msgid "Online Content Repository" -msgstr "" - #: src/settings_translation_file.cpp msgid "Opaque liquids" msgstr "不透明液體" @@ -5565,11 +5987,6 @@ msgid "" "Opaqueness (alpha) of the shadow behind the default font, between 0 and 255." msgstr "" -#: src/settings_translation_file.cpp -msgid "" -"Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255." -msgstr "" - #: src/settings_translation_file.cpp msgid "" "Open the pause menu when the window's focus is lost. Does not pause if a " @@ -5578,39 +5995,12 @@ msgid "" msgstr "" #: src/settings_translation_file.cpp -msgid "Overall bias of parallax occlusion effect, usually scale/2." -msgstr "視差遮蔽效果的總偏差,通常是規模/2。" - -#: src/settings_translation_file.cpp -msgid "Overall scale of parallax occlusion effect." -msgstr "視差遮蔽效果的總規模。" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion" -msgstr "視差遮蔽" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion bias" -msgstr "視差遮蔽偏差" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion iterations" -msgstr "視差遮蔽迭代" - -#: src/settings_translation_file.cpp -msgid "Parallax occlusion mode" -msgstr "視差遮蔽模式" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Parallax occlusion scale" -msgstr "視差遮蔽係數" +msgid "Optional override for chat weblink color." +msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path of the fallback font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"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 "" @@ -5633,17 +6023,13 @@ msgstr "材質目錄的路徑。所有材質都會先從這裡搜尋。" #: src/settings_translation_file.cpp msgid "" -"Path to the default font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the default font. Must be a TrueType font.\n" "The fallback font will be used if the font cannot be loaded." msgstr "" #: src/settings_translation_file.cpp msgid "" -"Path to the monospace font.\n" -"If “freetype” setting is enabled: Must be a TrueType font.\n" -"If “freetype” setting is disabled: Must be a bitmap or XML vectors font.\n" +"Path to the monospace font. Must be a TrueType font.\n" "This font is used for e.g. the console and profiler screen." msgstr "" @@ -5673,6 +6059,16 @@ msgstr "飛行按鍵" msgid "Pitch move mode" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place key" +msgstr "飛行按鍵" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Place repetition interval" +msgstr "右鍵點擊重覆間隔" + #: src/settings_translation_file.cpp msgid "" "Player is able to fly without being affected by gravity.\n" @@ -5681,10 +6077,6 @@ msgstr "" "玩家可以不受重力影響飛行。\n" "這需要在伺服器上啟用「飛行」特權。" -#: src/settings_translation_file.cpp -msgid "Player name" -msgstr "玩家名稱" - #: src/settings_translation_file.cpp msgid "Player transfer distance" msgstr "玩家傳送距離" @@ -5694,6 +6086,11 @@ msgstr "玩家傳送距離" msgid "Player versus player" msgstr "玩家對玩家" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Poisson filtering" +msgstr "雙線性過濾器" + #: src/settings_translation_file.cpp msgid "" "Port to connect to (UDP).\n" @@ -5731,10 +6128,6 @@ msgstr "分析器" msgid "Profiler toggle key" msgstr "分析器切換鍵" -#: src/settings_translation_file.cpp -msgid "Profiling" -msgstr "分析" - #: src/settings_translation_file.cpp msgid "Prometheus listener address" msgstr "" @@ -5742,9 +6135,9 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" "Prometheus listener address.\n" -"If minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" +"If Minetest is compiled with ENABLE_PROMETHEUS option enabled,\n" "enable metrics listener for Prometheus on that address.\n" -"Metrics can be fetch on http://127.0.0.1:30000/metrics" +"Metrics can be fetched on http://127.0.0.1:30000/metrics" msgstr "" #: src/settings_translation_file.cpp @@ -5840,10 +6233,6 @@ msgstr "山脊大小雜訊" msgid "Right key" msgstr "右鍵" -#: src/settings_translation_file.cpp -msgid "Rightclick repetition interval" -msgstr "右鍵點擊重覆間隔" - #: src/settings_translation_file.cpp #, fuzzy msgid "River channel depth" @@ -5924,6 +6313,11 @@ msgstr "" "比例縮小時會混合像素,代價是在模糊一些\n" "邊緣的像素時會以非整數的大小縮放。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screen" +msgstr "螢幕:" + #: src/settings_translation_file.cpp msgid "Screen height" msgstr "螢幕高度" @@ -5954,6 +6348,11 @@ msgstr "" "1 代表最差的品質,100 代表最佳品質。\n" "使用 0 來使用預設品質。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Screenshots" +msgstr "螢幕擷取" + #: src/settings_translation_file.cpp msgid "Seabed noise" msgstr "海底雜訊" @@ -5966,10 +6365,6 @@ msgstr "四之二 一同定義山丘範圍高度的 2D 雜訊。" 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 #, fuzzy msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" @@ -6031,8 +6426,19 @@ msgstr "" "18 = 4D \"Mandelbulb\" julia set." #: 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" @@ -6058,10 +6464,20 @@ msgstr "伺服器埠" 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 "伺服器清單檔" @@ -6075,9 +6491,41 @@ 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 gamma.\n" +"Adjusts the intensity of in-game dynamic shadows.\n" +"Lower value means lighter shadows, higher value means darker shadows." +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the soft shadow radius size.\n" +"Lower values mean sharper shadows, bigger values mean softer shadows.\n" +"Minimum value: 1.0; maximum value: 15.0" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "" +"Set the tilt of Sun/Moon orbit in degrees.\n" +"Value of 0 means no tilt / vertical orbit.\n" +"Minimum value: 0.0; maximum value: 60.0" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Set to true to enable Shadow Mapping.\n" +"Requires shaders to be enabled." +msgstr "" +"設定為真以啟用擺動的樹葉。\n" +"必須同時啟用著色器。" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6105,6 +6553,13 @@ msgstr "" "設定為真以啟用擺動的植物。\n" "必須同時啟用著色器。" +#: src/settings_translation_file.cpp +msgid "" +"Sets shadow texture quality to 32 bits.\n" +"On false, 16 bits texture will be used.\n" +"This can cause much more artifacts in the shadow." +msgstr "" + #: src/settings_translation_file.cpp msgid "Shader path" msgstr "著色器路徑" @@ -6120,6 +6575,24 @@ msgstr "" "著色器讓您可以有進階視覺效果並可能會在某些顯示卡上增強效能。\n" "這僅在 OpenGL 視訊後端上才能運作。" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow filter quality" +msgstr "螢幕截圖品質" + +#: src/settings_translation_file.cpp +msgid "Shadow map max distance in nodes to render shadows" +msgstr "" + +#: src/settings_translation_file.cpp +msgid "Shadow map texture in 32 bits" +msgstr "" + +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Shadow map texture size" +msgstr "過濾器的最大材質大小" + #: src/settings_translation_file.cpp #, fuzzy msgid "" @@ -6128,11 +6601,8 @@ msgid "" msgstr "字型陰影偏移,若為 0 則陰影將不會被繪製。" #: src/settings_translation_file.cpp -#, fuzzy -msgid "" -"Shadow offset (in pixels) of the fallback font. If 0, then shadow will not " -"be drawn." -msgstr "字型陰影偏移,若為 0 則陰影將不會被繪製。" +msgid "Shadow strength gamma" +msgstr "" #: src/settings_translation_file.cpp msgid "Shape of the minimap. Enabled = round, disabled = square." @@ -6146,6 +6616,19 @@ msgstr "顯示除錯資訊" msgid "Show entity selection boxes" msgstr "顯示物體選取方塊" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "" +"Show entity selection boxes\n" +"A restart is required after changing this." +msgstr "" +"設定語言。留空以使用系統語言。\n" +"變更後必須重新啟動以使其生效。" + +#: src/settings_translation_file.cpp +msgid "Show name tag backgrounds by default" +msgstr "" + #: src/settings_translation_file.cpp msgid "Shutdown message" msgstr "關閉訊息" @@ -6170,6 +6653,10 @@ msgstr "" "增加快取命中率,減少從主執行緒複製資料,從\n" "而減少抖動。" +#: src/settings_translation_file.cpp +msgid "Sky Body Orbit Tilt" +msgstr "" + #: src/settings_translation_file.cpp msgid "Slice w" msgstr "切片 w" @@ -6228,20 +6715,15 @@ msgstr "走路速度" msgid "Sneaking speed, in nodes per second." msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Soft shadow radius" +msgstr "字型陰影 alpha 值" + #: src/settings_translation_file.cpp msgid "Sound" msgstr "聲音" -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key" -msgstr "潛行按鍵" - -#: src/settings_translation_file.cpp -#, fuzzy -msgid "Special key for climbing/descending" -msgstr "用於攀爬/下降的按鍵" - #: src/settings_translation_file.cpp msgid "" "Specifies URL from which client fetches media instead of using UDP.\n" @@ -6261,6 +6743,14 @@ msgid "" "items." msgstr "" +#: src/settings_translation_file.cpp +msgid "" +"Spread a complete update of shadow map over given amount of frames.\n" +"Higher values might make shadows laggy, lower values\n" +"will consume more resources.\n" +"Minimum value: 1; maximum value: 16" +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Spread of light curve boost range.\n" @@ -6291,10 +6781,6 @@ msgstr "山雜訊" msgid "Strength of 3D mode parallax." msgstr "視差強度。" -#: src/settings_translation_file.cpp -msgid "Strength of generated normalmaps." -msgstr "生成之一般地圖的強度。" - #: src/settings_translation_file.cpp msgid "" "Strength of light curve boost.\n" @@ -6332,6 +6818,11 @@ msgstr "同步的 SQLite" 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 "地形替代雜訊" @@ -6381,6 +6872,13 @@ msgstr "地形持續性雜訊" msgid "Texture path" msgstr "材質路徑" +#: src/settings_translation_file.cpp +msgid "" +"Texture size to render the shadow map on.\n" +"This must be a power of two.\n" +"Bigger numbers create better shadows but it is also more expensive." +msgstr "" + #: src/settings_translation_file.cpp msgid "" "Textures on a node may be aligned either to the node or to the world.\n" @@ -6395,6 +6893,11 @@ msgstr "" msgid "The URL for the content repository" msgstr "" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "The dead zone of the joystick" +msgstr "要使用的搖桿的識別碼" + #: src/settings_translation_file.cpp msgid "" "The default format in which profiles are being saved,\n" @@ -6455,18 +6958,19 @@ msgstr "" #: src/settings_translation_file.cpp msgid "" -"The rendering back-end for Irrlicht.\n" +"The rendering back-end.\n" "A restart is required after changing this.\n" "Note: On Android, stick with OGLES1 if unsure! App may fail to start " "otherwise.\n" -"On other platforms, OpenGL is recommended, and it’s the only driver with\n" -"shader support currently." +"On other platforms, OpenGL is recommended.\n" +"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)" msgstr "" #: src/settings_translation_file.cpp +#, fuzzy msgid "" "The sensitivity of the joystick axes for moving the\n" -"ingame view frustum around." +"in-game view frustum around." msgstr "" "在遊戲中,視野四處移動時的\n" "搖桿靈敏度。" @@ -6493,6 +6997,12 @@ msgstr "" "超過時將會嘗試透過傾倒舊佇列項目減少其\n" "大小。將值設為 0 以停用此功能。" +#: 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 "" + #: src/settings_translation_file.cpp msgid "" "The time in seconds it takes between repeated events\n" @@ -6504,9 +7014,8 @@ msgstr "" #: src/settings_translation_file.cpp #, fuzzy msgid "" -"The time in seconds it takes between repeated right clicks when holding the " -"right\n" -"mouse button." +"The time in seconds it takes between repeated node placements when holding\n" +"the place button." msgstr "當按住滑鼠右鍵時,重覆右鍵點選的間隔以秒計。" #: src/settings_translation_file.cpp @@ -6545,7 +7054,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 @@ -6571,6 +7081,19 @@ msgstr "工具提示延遲" 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 "樹林雜訊" @@ -6650,15 +7173,30 @@ msgstr "當縮放材質時使用雙線性過濾。" #: src/settings_translation_file.cpp msgid "" -"Use mip mapping to scale textures. May slightly increase performance,\n" +"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 "" +#: src/settings_translation_file.cpp +msgid "" +"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n" +"This algorithm smooths out the 3D viewport while keeping the image sharp,\n" +"but it doesn't affect the insides of textures\n" +"(which is especially noticeable with transparent textures).\n" +"Visible spaces appear between nodes when shaders are disabled.\n" +"If set to 0, MSAA is disabled.\n" +"A restart is required after changing this option." +msgstr "" + #: src/settings_translation_file.cpp 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" @@ -6761,7 +7299,7 @@ msgid "Viewing range" msgstr "視野" #: src/settings_translation_file.cpp -msgid "Virtual joystick triggers aux button" +msgid "Virtual joystick triggers Aux1 button" msgstr "" #: src/settings_translation_file.cpp @@ -6843,6 +7381,11 @@ msgstr "波動的水長度" msgid "Waving plants" msgstr "植物擺動" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "Weblink color" +msgstr "色彩選取框" + #: src/settings_translation_file.cpp msgid "" "When gui_scaling_filter is true, all GUI images need to be\n" @@ -6872,9 +7415,8 @@ msgid "" "can be blurred, so automatically upscale them with nearest-neighbor\n" "interpolation to preserve crisp pixels. This sets the minimum texture size\n" "for the upscaled textures; higher values look sharper, but require more\n" -"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n" -"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n" -"enabled.\n" +"memory. Powers of 2 are recommended. This setting is ONLY applied if\n" +"bilinear/trilinear/anisotropic filtering is enabled.\n" "This is also used as the base node texture size for world-aligned\n" "texture autoscaling." msgstr "" @@ -6887,12 +7429,10 @@ msgstr "" "已啟用。" #: src/settings_translation_file.cpp -#, fuzzy msgid "" -"Whether FreeType fonts are used, requires FreeType support to be compiled " -"in.\n" -"If disabled, bitmap and XML vectors fonts are used instead." -msgstr "是否使用 freetype 字型,需要將 freetype 支援編譯進來。" +"Whether name tag backgrounds should be shown by default.\n" +"Mods may still set a background." +msgstr "" #: src/settings_translation_file.cpp msgid "Whether node texture animations should be desynchronized per mapblock." @@ -6930,13 +7470,23 @@ msgid "" "pause menu." 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 有同樣的效果)。" #: src/settings_translation_file.cpp -msgid "Width component of the initial window size." +#, fuzzy +msgid "Width component of the initial window size. Ignored in fullscreen mode." msgstr "初始視窗大小的寬度元素。" #: src/settings_translation_file.cpp @@ -7029,101 +7579,38 @@ msgstr "較低地形與湖底的 Y 高度。" 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 檔案下載逾時" +#: src/settings_translation_file.cpp +#, fuzzy +msgid "cURL interactive timeout" +msgstr "cURL 逾時" + #: src/settings_translation_file.cpp msgid "cURL parallel limit" msgstr "cURL 並行限制" -#: src/settings_translation_file.cpp -msgid "cURL timeout" -msgstr "cURL 逾時" +#~ msgid "- Creative Mode: " +#~ msgstr "- 創造模式: " -#~ msgid "Toggle Cinematic" -#~ msgstr "切換過場動畫" - -#, fuzzy -#~ msgid "Select Package File:" -#~ msgstr "選取 Mod 檔案:" - -#, fuzzy -#~ msgid "Y of upper limit of lava in large caves." -#~ msgstr "大型偽隨機洞穴的 Y 上限。" - -#~ msgid "Waving Water" -#~ msgstr "波動的水" - -#~ msgid "Y-level to which floatland shadows extend." -#~ msgstr "浮地陰影擴展的 Y 高度。" - -#~ msgid "Y-level of floatland midpoint and lake surface." -#~ msgstr "浮地中點與湖表面的 Y 高度。" - -#~ msgid "Waving water" -#~ msgstr "波動的水" - -#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." -#~ msgstr "在平整浮地地形的山丘高度與湖泊深度變化。" - -#, fuzzy -#~ msgid "" -#~ "Typical maximum height, above and below midpoint, of floatland mountains." -#~ msgstr "浮地山區域的典型最大高度,高於與低於中點。" - -#~ msgid "This font will be used for certain languages." -#~ msgstr "這個字型將會被用於特定的語言。" - -#~ msgid "Shadow limit" -#~ msgstr "陰影限制" - -#~ msgid "Path to TrueTypeFont or bitmap." -#~ msgstr "TrueType 字型或點陣字的路徑。" - -#, fuzzy -#~ msgid "Lava depth" -#~ msgstr "大型洞穴深度" - -#~ msgid "IPv6 support." -#~ msgstr "IPv6 支援。" - -#~ msgid "Gamma" -#~ msgstr "Gamma" - -#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." -#~ msgstr "字型陰影 alpha(不透明度,介於 0 到 255)。" - -#~ msgid "Floatland base height noise" -#~ msgstr "浮地基礎高度噪音" - -#~ msgid "Enables filmic tone mapping" -#~ msgstr "啟用電影色調映射" - -#~ msgid "Enable VBO" -#~ msgstr "啟用 VBO" +#~ msgid "- Damage: " +#~ msgstr "- 傷害: " #~ msgid "" -#~ "Defines areas of floatland smooth terrain.\n" -#~ "Smooth floatlands occur when noise > 0." +#~ "0 = parallax occlusion with slope information (faster).\n" +#~ "1 = relief mapping (slower, more accurate)." #~ msgstr "" -#~ "定義浮地的平整地形區。\n" -#~ "平整的浮地會在噪音 > 0 時產生。" +#~ "0 = 包含斜率資訊的視差遮蔽(較快)。\n" +#~ "1 = 替換貼圖(較慢,較準確)。" -#, fuzzy -#~ msgid "Darkness sharpness" -#~ msgstr "湖泊坡度" - -#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." -#~ msgstr "控制隧道的寬度,較小的值會創造出較寬的隧道。" - -#, fuzzy -#~ msgid "" -#~ "Controls the density of mountain-type floatlands.\n" -#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." -#~ msgstr "" -#~ "控制山地的浮地密度。\n" -#~ "是加入到 'np_mountain' 噪音值的補償。" +#~ msgid "Address / Port" +#~ msgstr "地址/連線埠" #~ msgid "" #~ "Adjust the gamma encoding for the light tables. Higher numbers are " @@ -7133,20 +7620,388 @@ msgstr "cURL 逾時" #~ "調整亮度表的伽瑪編碼。較高的數值會較亮。\n" #~ "這個設定是給客戶端使用的,會被伺服器忽略。" -#~ msgid "Path to save screenshots at." -#~ msgstr "儲存螢幕截圖的路徑。" - -#~ msgid "Parallax occlusion strength" -#~ msgstr "視差遮蔽強度" - -#~ msgid "Limit of emerge queues on disk" -#~ msgstr "在磁碟上出現佇列的限制" - -#~ msgid "Downloading and installing $1, please wait..." -#~ msgstr "正在下載並安裝 $1,請稍候……" +#~ msgid "Are you sure to reset your singleplayer world?" +#~ msgstr "您確定要重設您的單人遊戲世界嗎?" #~ msgid "Back" #~ msgstr "返回" +#~ msgid "Basic" +#~ msgstr "基礎" + +#~ msgid "Bits per pixel (aka color depth) in fullscreen mode." +#~ msgstr "全螢幕模式中的位元/像素(又稱色彩深度)。" + +#~ msgid "Bump Mapping" +#~ msgstr "映射貼圖" + +#~ msgid "Bumpmapping" +#~ msgstr "映射貼圖" + +#~ msgid "Config mods" +#~ msgstr "設定 Mod" + +#~ msgid "Configure" +#~ msgstr "設定" + +#~ msgid "Connect" +#~ msgstr "連線" + +#~ msgid "Controls sinking speed in liquid." +#~ msgstr "控制在液體中的下沉速度。" + +#, fuzzy +#~ msgid "" +#~ "Controls the density of mountain-type floatlands.\n" +#~ "Is a noise offset added to the 'mgv7_np_mountain' noise value." +#~ msgstr "" +#~ "控制山地的浮地密度。\n" +#~ "是加入到 'np_mountain' 噪音值的補償。" + +#~ msgid "Controls width of tunnels, a smaller value creates wider tunnels." +#~ msgstr "控制隧道的寬度,較小的值會創造出較寬的隧道。" + +#~ msgid "Credits" +#~ msgstr "感謝" + +#~ msgid "Crosshair color (R,G,B)." +#~ msgstr "十字色彩 (R,G,B)。" + +#~ msgid "Damage enabled" +#~ msgstr "已啟用傷害" + +#, fuzzy +#~ msgid "Darkness sharpness" +#~ msgstr "湖泊坡度" + +#~ msgid "" +#~ "Default timeout for cURL, stated in milliseconds.\n" +#~ "Only has an effect if compiled with cURL." +#~ msgstr "" +#~ "cURL 的預設逾時,以毫秒計算。\n" +#~ "只會在與 cURL 一同編譯的情況下才會有影響。" + +#~ msgid "" +#~ "Defines areas of floatland smooth terrain.\n" +#~ "Smooth floatlands occur when noise > 0." +#~ msgstr "" +#~ "定義浮地的平整地形區。\n" +#~ "平整的浮地會在噪音 > 0 時產生。" + +#~ msgid "" +#~ "Defines sampling step of texture.\n" +#~ "A higher value results in smoother normal maps." +#~ msgstr "" +#~ "定義材質的採樣步驟。\n" +#~ "較高的值會有較平滑的一般地圖。" + +#~ msgid "Del. Favorite" +#~ msgstr "刪除收藏" + +#~ msgid "Download a game, such as Minetest Game, from minetest.net" +#~ msgstr "從 minetest.net 下載遊戲,例如 Minetest Game" + +#~ 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" +#~ "or need to be auto-generated.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "為材質啟用貼圖轉儲。普通地圖需要材質包的支援\n" +#~ "或是自動生成。\n" +#~ "必須啟用著色器。" + +#~ msgid "Enables filmic tone mapping" +#~ msgstr "啟用電影色調映射" + +#~ msgid "" +#~ "Enables on the fly normalmap generation (Emboss effect).\n" +#~ "Requires bumpmapping to be enabled." +#~ msgstr "" +#~ "啟用忙碌的一般地圖生成(浮雕效果)。\n" +#~ "必須啟用貼圖轉儲。" + +#~ msgid "" +#~ "Enables parallax occlusion mapping.\n" +#~ "Requires shaders to be enabled." +#~ msgstr "" +#~ "啟用視差遮蔽貼圖。\n" +#~ "必須啟用著色器。" + +#~ msgid "Enter " +#~ msgstr "輸入 " + +#~ msgid "" +#~ "Experimental option, might cause visible spaces between blocks\n" +#~ "when set to higher number than 0." +#~ msgstr "" +#~ "實驗性選項,當設定到大於零的值時\n" +#~ "也許會造成在方塊間有視覺空隙。" + +#~ msgid "FPS in pause menu" +#~ msgstr "在暫停選單中的 FPS" + +#~ msgid "Fallback font shadow" +#~ msgstr "後備字型陰影" + +#~ msgid "Fallback font shadow alpha" +#~ msgstr "後備字型陰影 alpha 值" + +#~ msgid "Fallback font size" +#~ msgstr "後備字型大小" + +#~ msgid "Filtering" +#~ msgstr "過濾器" + +#~ msgid "Floatland base height noise" +#~ msgstr "浮地基礎高度噪音" + +#~ msgid "Font shadow alpha (opaqueness, between 0 and 255)." +#~ msgstr "字型陰影 alpha(不透明度,介於 0 到 255)。" + +#, fuzzy +#~ msgid "FreeType fonts" +#~ msgstr "Freetype 字型" + +#~ msgid "Full screen BPP" +#~ msgstr "全螢幕 BPP" + +#~ msgid "Game" +#~ msgstr "遊戲" + +#~ msgid "Gamma" +#~ msgstr "Gamma" + +#~ msgid "Generate Normal Maps" +#~ msgstr "產生一般地圖" + +#~ msgid "Generate normalmaps" +#~ msgstr "生成一般地圖" + +#~ msgid "HUD scale factor" +#~ msgstr "HUD 縮放係數" + +#~ msgid "High-precision FPU" +#~ msgstr "高精度 FPU" + +#~ msgid "IPv6 support." +#~ msgstr "IPv6 支援。" + +#~ 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 移除相關參數)" + +#, fuzzy +#~ msgid "Lava depth" +#~ msgstr "大型洞穴深度" + +#~ msgid "Limit of emerge queues on disk" +#~ msgstr "在磁碟上出現佇列的限制" + +#~ msgid "Main" +#~ msgstr "主要" + +#, fuzzy +#~ msgid "Main menu style" +#~ msgstr "主選單指令稿" + +#~ msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." +#~ msgstr "讓 DirectX 與 LuaJIT 一同運作。若其造成麻煩則請停用。" + +#~ msgid "Menus" +#~ msgstr "選單" + +#~ msgid "Minimap in radar mode, Zoom x2" +#~ msgstr "雷達模式的迷你地圖,放大 2 倍" + +#~ msgid "Minimap in radar mode, Zoom x4" +#~ msgstr "雷達模式的迷你地圖,放大 4 倍" + +#~ msgid "Minimap in surface mode, Zoom x2" +#~ msgstr "表面模式的迷你地圖,放大 2 倍" + +#~ msgid "Minimap in surface mode, Zoom x4" +#~ msgstr "表面模式的迷你地圖,放大 4 倍" + +#~ msgid "Name / Password" +#~ msgstr "名稱/密碼" + +#~ msgid "Name/Password" +#~ msgstr "名稱/密碼" + +#~ msgid "No" +#~ msgstr "否" + +#~ msgid "Normalmaps sampling" +#~ msgstr "法線貼圖採樣" + +#~ msgid "Normalmaps strength" +#~ msgstr "法線貼圖強度" + +#~ msgid "Number of parallax occlusion iterations." +#~ msgstr "視差遮蔽迭代次數。" + #~ msgid "Ok" #~ msgstr "確定" + +#~ msgid "Overall bias of parallax occlusion effect, usually scale/2." +#~ msgstr "視差遮蔽效果的總偏差,通常是規模/2。" + +#~ msgid "Overall scale of parallax occlusion effect." +#~ msgstr "視差遮蔽效果的總規模。" + +#~ msgid "Parallax Occlusion" +#~ msgstr "視差遮蔽" + +#~ msgid "Parallax occlusion" +#~ msgstr "視差遮蔽" + +#~ msgid "Parallax occlusion bias" +#~ msgstr "視差遮蔽偏差" + +#~ msgid "Parallax occlusion iterations" +#~ msgstr "視差遮蔽迭代" + +#~ msgid "Parallax occlusion mode" +#~ msgstr "視差遮蔽模式" + +#, fuzzy +#~ msgid "Parallax occlusion scale" +#~ msgstr "視差遮蔽係數" + +#~ msgid "Parallax occlusion strength" +#~ msgstr "視差遮蔽強度" + +#~ msgid "Path to TrueTypeFont or bitmap." +#~ msgstr "TrueType 字型或點陣字的路徑。" + +#~ msgid "Path to save screenshots at." +#~ msgstr "儲存螢幕截圖的路徑。" + +#~ msgid "Player name" +#~ msgstr "玩家名稱" + +#~ msgid "Profiling" +#~ msgstr "分析" + +#~ msgid "PvP enabled" +#~ msgstr "已啟用玩家對戰" + +#~ msgid "Reset singleplayer world" +#~ msgstr "重設單人遊戲世界" + +#, fuzzy +#~ msgid "Select Package File:" +#~ msgstr "選取 Mod 檔案:" + +#~ msgid "Server / Singleplayer" +#~ msgstr "伺服器/單人遊戲" + +#~ msgid "Shadow limit" +#~ msgstr "陰影限制" + +#, fuzzy +#~ msgid "" +#~ "Shadow offset (in pixels) of the fallback font. If 0, then shadow will " +#~ "not be drawn." +#~ msgstr "字型陰影偏移,若為 0 則陰影將不會被繪製。" + +#~ msgid "Special" +#~ msgstr "特殊" + +#, fuzzy +#~ msgid "Special key" +#~ msgstr "潛行按鍵" + +#~ msgid "Start Singleplayer" +#~ msgstr "開始單人遊戲" + +#~ msgid "Strength of generated normalmaps." +#~ msgstr "生成之一般地圖的強度。" + +#~ msgid "This font will be used for certain languages." +#~ msgstr "這個字型將會被用於特定的語言。" + +#~ msgid "To enable shaders the OpenGL driver needs to be used." +#~ msgstr "要啟用著色器,必須使用 OpenGL 驅動程式。" + +#~ msgid "Toggle Cinematic" +#~ msgstr "切換過場動畫" + +#, fuzzy +#~ msgid "" +#~ "Typical maximum height, above and below midpoint, of floatland mountains." +#~ msgstr "浮地山區域的典型最大高度,高於與低於中點。" + +#~ msgid "Variation of hill height and lake depth on floatland smooth terrain." +#~ msgstr "在平整浮地地形的山丘高度與湖泊深度變化。" + +#~ msgid "View" +#~ msgstr "查看" + +#~ msgid "Waving Water" +#~ msgstr "波動的水" + +#~ msgid "Waving water" +#~ msgstr "波動的水" + +#, fuzzy +#~ msgid "" +#~ "Whether FreeType fonts are used, requires FreeType support to be compiled " +#~ "in.\n" +#~ "If disabled, bitmap and XML vectors fonts are used instead." +#~ msgstr "是否使用 freetype 字型,需要將 freetype 支援編譯進來。" + +#, fuzzy +#~ msgid "Y of upper limit of lava in large caves." +#~ msgstr "大型偽隨機洞穴的 Y 上限。" + +#~ msgid "Y-level of floatland midpoint and lake surface." +#~ msgstr "浮地中點與湖表面的 Y 高度。" + +#~ msgid "Y-level to which floatland shadows extend." +#~ msgstr "浮地陰影擴展的 Y 高度。" + +#~ 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 "您已死亡" + +#~ msgid "needs_fallback_font" +#~ msgstr "yes" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7e1d0bd39..54dad55c6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,3 @@ -cmake_minimum_required(VERSION 2.6) - project(minetest) INCLUDE(CheckIncludeFiles) @@ -57,7 +55,7 @@ if(NOT USE_CURL) endif() -option(ENABLE_GETTEXT "Use GetText for internationalization" TRUE) +option(ENABLE_GETTEXT "Use GetText for internationalization" ${BUILD_CLIENT}) set(USE_GETTEXT FALSE) if(ENABLE_GETTEXT) @@ -65,14 +63,13 @@ if(ENABLE_GETTEXT) if(GETTEXTLIB_FOUND) if(WIN32) message(STATUS "GetText library: ${GETTEXT_LIBRARY}") - message(STATUS "GetText DLL: ${GETTEXT_DLL}") - message(STATUS "GetText iconv DLL: ${GETTEXT_ICONV_DLL}") + message(STATUS "GetText DLL(s): ${GETTEXT_DLL}") endif() set(USE_GETTEXT TRUE) message(STATUS "GetText enabled; locales found: ${GETTEXT_AVAILABLE_LOCALES}") endif(GETTEXTLIB_FOUND) else() - mark_as_advanced(GETTEXT_ICONV_DLL GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT) + mark_as_advanced(GETTEXT_INCLUDE_DIR GETTEXT_LIBRARY GETTEXT_MSGFMT) message(STATUS "GetText disabled.") endif() @@ -101,56 +98,18 @@ if(BUILD_CLIENT AND ENABLE_SOUND) endif() endif() - -option(ENABLE_GLES "Use OpenGL ES instead of OpenGL" FALSE) +# TODO: this should be removed one day, we can enable it unconditionally +option(ENABLE_GLES "Enable extra support code for OpenGL ES" FALSE) mark_as_advanced(ENABLE_GLES) -if(BUILD_CLIENT) - if(ENABLE_GLES) - find_package(OpenGLES2 REQUIRED) - else() - # transitive dependency from Irrlicht (see longer explanation below) - if(NOT WIN32) - set(OPENGL_GL_PREFERENCE "LEGACY" CACHE STRING - "See CMake Policy CMP0072 for reference. GLVND is broken on some nvidia setups") - set(OpenGL_GL_PREFERENCE ${OPENGL_GL_PREFERENCE}) - find_package(OpenGL REQUIRED) - endif() - endif() +option(ENABLE_TOUCH "Enable Touchscreen support" FALSE) +if(ENABLE_TOUCH) + add_definitions(-DHAVE_TOUCHSCREENGUI) endif() - -option(ENABLE_FREETYPE "Enable FreeType2 (TrueType fonts and basic unicode support)" TRUE) -set(USE_FREETYPE FALSE) - -if(ENABLE_FREETYPE) -## -## Note: FindFreetype.cmake seems to have been fixed in recent versions of -## CMake. If issues persist, re-enable this workaround specificially for the -## failing platforms. -## -# if(UNIX) -# include(FindPkgConfig) -# if(PKG_CONFIG_FOUND) -# pkg_check_modules(FREETYPE QUIET freetype2) -# if(FREETYPE_FOUND) -# SET(FREETYPE_PKGCONFIG_FOUND TRUE) -# SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARIES}) -# # Because CMake is idiotic -# string(REPLACE ";" " " FREETYPE_CFLAGS_STR ${FREETYPE_CFLAGS}) -# string(REPLACE ";" " " FREETYPE_LDFLAGS_STR ${FREETYPE_LDFLAGS}) -# endif(FREETYPE_FOUND) -# endif(PKG_CONFIG_FOUND) -# endif(UNIX) -# if(NOT FREETYPE_FOUND) -# find_package(Freetype) -# endif() - find_package(Freetype) - if(FREETYPE_FOUND) - message(STATUS "Freetype enabled.") - set(USE_FREETYPE TRUE) - endif() -endif(ENABLE_FREETYPE) +if(BUILD_CLIENT) + find_package(Freetype REQUIRED) +endif() option(ENABLE_CURSES "Enable ncurses console" TRUE) set(USE_CURSES FALSE) @@ -170,7 +129,18 @@ option(ENABLE_POSTGRESQL "Enable PostgreSQL backend" TRUE) set(USE_POSTGRESQL FALSE) if(ENABLE_POSTGRESQL) - find_package("PostgreSQL") + if(CMAKE_VERSION VERSION_LESS "3.20") + find_package(PostgreSQL QUIET) + # Before CMake 3.20 FindPostgreSQL.cmake always looked for server includes + # but we don't need them, so continue anyway if only those are missing. + if(PostgreSQL_INCLUDE_DIR AND PostgreSQL_LIBRARY) + set(PostgreSQL_FOUND TRUE) + set(PostgreSQL_INCLUDE_DIRS ${PostgreSQL_INCLUDE_DIR}) + set(PostgreSQL_LIBRARIES ${PostgreSQL_LIBRARY}) + endif() + else() + find_package(PostgreSQL) + endif() if(PostgreSQL_FOUND) set(USE_POSTGRESQL TRUE) @@ -217,6 +187,7 @@ endif(ENABLE_REDIS) find_package(SQLite3 REQUIRED) + OPTION(ENABLE_PROMETHEUS "Enable prometheus client support" FALSE) set(USE_PROMETHEUS FALSE) @@ -253,6 +224,10 @@ if(ENABLE_SPATIAL) endif(ENABLE_SPATIAL) +find_package(ZLIB REQUIRED) +find_package(Zstd REQUIRED) + + if(NOT MSVC) set(USE_GPROF FALSE CACHE BOOL "Use -pg flag for g++") endif() @@ -279,62 +254,34 @@ if(WIN32) else() # Probably MinGW = GCC set(PLATFORM_LIBS "") endif() - set(PLATFORM_LIBS ws2_32.lib version.lib shlwapi.lib ${PLATFORM_LIBS}) + set(PLATFORM_LIBS ws2_32.lib version.lib shlwapi.lib winmm.lib ${PLATFORM_LIBS}) - # Zlib stuff - find_path(ZLIB_INCLUDE_DIR "zlib.h" DOC "Zlib include directory") - find_library(ZLIB_LIBRARIES "zlib" DOC "Path to zlib library") + set(EXTRA_DLL "" CACHE FILEPATH "Optional paths to additional DLLs that should be packaged") - # Dll's are automatically copied to the output directory by vcpkg when VCPKG_APPLOCAL_DEPS=ON + # DLLs are automatically copied to the output directory by vcpkg when VCPKG_APPLOCAL_DEPS=ON if(NOT VCPKG_APPLOCAL_DEPS) - find_file(ZLIB_DLL NAMES "zlib.dll" "zlib1.dll" DOC "Path to zlib.dll for installation (optional)") + set(ZLIB_DLL "" CACHE FILEPATH "Path to Zlib DLL for installation (optional)") + set(ZSTD_DLL "" CACHE FILEPATH "Path to Zstd DLL for installation (optional)") if(ENABLE_SOUND) set(OPENAL_DLL "" CACHE FILEPATH "Path to OpenAL32.dll for installation (optional)") set(OGG_DLL "" CACHE FILEPATH "Path to libogg.dll for installation (optional)") - set(VORBIS_DLL "" CACHE FILEPATH "Path to libvorbis.dll for installation (optional)") - set(VORBISFILE_DLL "" CACHE FILEPATH "Path to libvorbisfile.dll for installation (optional)") + set(VORBIS_DLL "" CACHE FILEPATH "Path to Vorbis DLLs for installation (optional)") + endif() + if(USE_GETTEXT) + set(GETTEXT_DLL "" CACHE FILEPATH "Path to Intl/Iconv DLLs for installation (optional)") endif() if(USE_LUAJIT) set(LUA_DLL "" CACHE FILEPATH "Path to luajit-5.1.dll for installation (optional)") endif() endif() - else() # Unix probably if(BUILD_CLIENT) if(NOT HAIKU AND NOT APPLE) find_package(X11 REQUIRED) endif(NOT HAIKU AND NOT APPLE) + endif() - ## - # The following dependencies are transitive dependencies from Irrlicht. - # Minetest itself does not use them, but we link them so that statically - # linking Irrlicht works. - if(NOT HAIKU AND NOT APPLE) - # This way Xxf86vm is found on OpenBSD too - find_library(XXF86VM_LIBRARY Xxf86vm) - mark_as_advanced(XXF86VM_LIBRARY) - set(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${XXF86VM_LIBRARY}) - endif(NOT HAIKU AND NOT APPLE) - - find_package(JPEG REQUIRED) - find_package(BZip2 REQUIRED) - find_package(PNG REQUIRED) - if(APPLE) - find_library(CARBON_LIB Carbon REQUIRED) - find_library(COCOA_LIB Cocoa REQUIRED) - find_library(IOKIT_LIB IOKit REQUIRED) - mark_as_advanced( - CARBON_LIB - COCOA_LIB - IOKIT_LIB - ) - SET(CLIENT_PLATFORM_LIBS ${CLIENT_PLATFORM_LIBS} ${CARBON_LIB} ${COCOA_LIB} ${IOKIT_LIB}) - endif(APPLE) - ## - endif(BUILD_CLIENT) - - find_package(ZLIB REQUIRED) set(PLATFORM_LIBS -lpthread ${CMAKE_DL_LIBS}) if(APPLE) set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS}) @@ -384,6 +331,7 @@ add_subdirectory(mapgen) add_subdirectory(network) add_subdirectory(script) add_subdirectory(unittest) +add_subdirectory(benchmark) add_subdirectory(util) add_subdirectory(irrlicht_changes) add_subdirectory(server) @@ -466,6 +414,9 @@ if(BUILD_UNITTESTS) set(common_SRCS ${common_SRCS} ${UNITTEST_SRCS}) endif() +if(BUILD_BENCHMARKS) + set(common_SRCS ${common_SRCS} ${BENCHMARK_SRCS}) +endif() # This gives us the icon and file version information if(WIN32) @@ -506,6 +457,10 @@ if(BUILD_UNITTESTS) set(client_SRCS ${client_SRCS} ${UNITTEST_CLIENT_SRCS}) endif() +if(BUILD_BENCHMARKS) + set(client_SRCS ${client_SRCS} ${BENCHMARK_CLIENT_SRCS}) +endif() + list(SORT client_SRCS) # Server sources @@ -524,24 +479,28 @@ endif() include_directories( ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR} - ${IRRLICHT_INCLUDE_DIR} + ${PROJECT_SOURCE_DIR}/script +) +include_directories(SYSTEM ${ZLIB_INCLUDE_DIR} - ${PNG_INCLUDE_DIR} - ${SOUND_INCLUDE_DIRS} + ${ZSTD_INCLUDE_DIR} ${SQLITE3_INCLUDE_DIR} ${LUA_INCLUDE_DIR} ${GMP_INCLUDE_DIR} ${JSON_INCLUDE_DIR} - ${X11_INCLUDE_DIR} - ${PROJECT_SOURCE_DIR}/script + ${LUA_BIT_INCLUDE_DIR} ) if(USE_GETTEXT) include_directories(${GETTEXT_INCLUDE_DIR}) endif() -if(USE_FREETYPE) - include_directories(${FREETYPE_INCLUDE_DIRS}) +if(BUILD_CLIENT) + include_directories(SYSTEM + ${FREETYPE_INCLUDE_DIRS} + ${SOUND_INCLUDE_DIRS} + ${X11_INCLUDE_DIR} + ) endif() if(USE_CURL) @@ -549,43 +508,38 @@ if(USE_CURL) endif() -set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin") - +# When cross-compiling assume the user doesn't want to run the executable anyway, +# otherwise place it in <source dir>/bin/ since Minetest can only run from there. +if(NOT CMAKE_CROSSCOMPILING) + set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin") +endif() if(BUILD_CLIENT) add_executable(${PROJECT_NAME} ${client_SRCS} ${extra_windows_SRCS}) add_dependencies(${PROJECT_NAME} GenerateVersion) - set(client_LIBS + target_link_libraries( ${PROJECT_NAME} ${ZLIB_LIBRARIES} - ${IRRLICHT_LIBRARY} - ${JPEG_LIBRARIES} - ${BZIP2_LIBRARIES} - ${PNG_LIBRARIES} + IrrlichtMt::IrrlichtMt + ${ZSTD_LIBRARY} ${X11_LIBRARIES} ${SOUND_LIBRARIES} ${SQLITE3_LIBRARY} ${LUA_LIBRARY} ${GMP_LIBRARY} ${JSON_LIBRARY} + ${LUA_BIT_LIBRARY} + ${FREETYPE_LIBRARY} ${PLATFORM_LIBS} - ${CLIENT_PLATFORM_LIBS} ) - target_link_libraries( - ${client_LIBS} - ) - if(ENABLE_GLES) - target_link_libraries( - ${PROJECT_NAME} - ${OPENGLES2_LIBRARIES} - ${EGL_LIBRARIES} - ) - else() - target_link_libraries( - ${PROJECT_NAME} - ${OPENGL_LIBRARIES} + if(NOT USE_LUAJIT) + set_target_properties(${PROJECT_NAME} PROPERTIES + # This is necessary for dynamic Lua modules + # to work when Lua is statically linked (issue #10806) + ENABLE_EXPORTS 1 ) endif() + if(USE_GETTEXT) target_link_libraries( ${PROJECT_NAME} @@ -598,17 +552,11 @@ if(BUILD_CLIENT) ${CURL_LIBRARY} ) endif() - if(USE_FREETYPE) - if(FREETYPE_PKGCONFIG_FOUND) - set_target_properties(${PROJECT_NAME} - PROPERTIES - COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}" - ) - endif() - target_link_libraries( - ${PROJECT_NAME} - ${FREETYPE_LIBRARY} - ) + if(FREETYPE_PKGCONFIG_FOUND) + set_target_properties(${PROJECT_NAME} + PROPERTIES + COMPILE_FLAGS "${FREETYPE_CFLAGS_STR}" + ) endif() if (USE_CURSES) target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES}) @@ -628,23 +576,41 @@ if(BUILD_CLIENT) if (USE_SPATIAL) target_link_libraries(${PROJECT_NAME} ${SPATIAL_LIBRARY}) endif() + if(BUILD_BENCHMARKS) + target_link_libraries(${PROJECT_NAME} catch2) + endif() endif(BUILD_CLIENT) if(BUILD_SERVER) add_executable(${PROJECT_NAME}server ${server_SRCS} ${extra_windows_SRCS}) add_dependencies(${PROJECT_NAME}server GenerateVersion) + + get_target_property( + IRRLICHT_INCLUDES IrrlichtMt::IrrlichtMt INTERFACE_INCLUDE_DIRECTORIES) + # Doesn't work without PRIVATE/PUBLIC/INTERFACE mode specified. + target_include_directories(${PROJECT_NAME}server PRIVATE ${IRRLICHT_INCLUDES}) target_link_libraries( ${PROJECT_NAME}server ${ZLIB_LIBRARIES} + ${ZSTD_LIBRARY} ${SQLITE3_LIBRARY} ${JSON_LIBRARY} ${LUA_LIBRARY} + ${LUA_BIT_LIBRARY} ${GMP_LIBRARY} ${PLATFORM_LIBS} ) set_target_properties(${PROJECT_NAME}server PROPERTIES - COMPILE_DEFINITIONS "SERVER") + COMPILE_DEFINITIONS "SERVER") + if(NOT USE_LUAJIT) + set_target_properties(${PROJECT_NAME}server PROPERTIES + # This is necessary for dynamic Lua modules + # to work when Lua is statically linked (issue #10806) + ENABLE_EXPORTS 1 + ) + endif() + if (USE_GETTEXT) target_link_libraries(${PROJECT_NAME}server ${GETTEXT_LIBRARY}) endif() @@ -672,27 +638,35 @@ if(BUILD_SERVER) ${CURL_LIBRARY} ) endif() + if(BUILD_BENCHMARKS) + target_link_libraries(${PROJECT_NAME}server catch2) + endif() endif(BUILD_SERVER) # Blacklisted locales that don't work. # see issue #4638 set(GETTEXT_BLACKLISTED_LOCALES - be + ar + dv he - ko - ky + hi + kn + ms_Arab + th ) -option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE) +option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid known broken locales" TRUE) if (GETTEXTLIB_FOUND AND APPLY_LOCALE_BLACKLIST) set(GETTEXT_USED_LOCALES "") foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES}) - if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};") + if (NOT "${LOCALE}" IN_LIST GETTEXT_BLACKLISTED_LOCALES) list(APPEND GETTEXT_USED_LOCALES ${LOCALE}) endif() endforeach() message(STATUS "Locale blacklist applied; Locales used: ${GETTEXT_USED_LOCALES}") +elseif (GETTEXTLIB_FOUND) + set(GETTEXT_USED_LOCALES ${GETTEXT_AVAILABLE_LOCALES}) endif() # Set some optimizations and tweaks @@ -701,21 +675,14 @@ include(CheckCSourceCompiles) if(MSVC) # Visual Studio - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D WIN32_LEAN_AND_MEAN /MP") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D WIN32_LEAN_AND_MEAN") # EHa enables SEH exceptions (used for catching segfaults) - set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MD /GS- /Zi /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP") + set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /MD /GS- /Zi /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0") if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:SSE") endif() - - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF") - else() - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF") - endif() - - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1") @@ -726,17 +693,28 @@ if(MSVC) # Flags for C files (sqlite) # /MD = dynamically link to MSVCRxxx.dll set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MD") + + # Flags that cannot be shared between cl and clang-cl + # https://clang.llvm.org/docs/UsersManual.html#clang-cl + if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=lld") + + # Disable pragma-pack warning + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-pragma-pack") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /TP /FD /GL") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") + endif() else() # GCC or compatible compilers such as Clang - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(WARNING_FLAGS "-Wall -Wextra") + set(WARNING_FLAGS "${WARNING_FLAGS} -Wno-unused-parameter -Wno-implicit-fallthrough") if(WARN_ALL) - set(RELEASE_WARNING_FLAGS "-Wall") + set(RELEASE_WARNING_FLAGS "${WARNING_FLAGS}") else() set(RELEASE_WARNING_FLAGS "") endif() - if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - set(WARNING_FLAGS "${WARNING_FLAGS} -Wsign-compare") - endif() if(APPLE AND USE_LUAJIT) # required per http://luajit.org/install.html @@ -745,7 +723,16 @@ else() check_c_source_compiles("#ifndef __aarch64__\n#error\n#endif\nint main(){}" IS_AARCH64) if(IS_AARCH64) # Move text segment below LuaJIT's 47-bit limit (see issue #9367) - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Ttext-segment=0x200000000") + if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + # FreeBSD uses lld, and lld does not support -Ttext-segment, suggesting + # --image-base instead. Not sure if it's equivalent change for the purpose + # but at least if fixes build on FreeBSD/aarch64 + # XXX: the condition should also be changed to check for lld regardless of + # os, bit CMake doesn't have anything like CMAKE_LINKER_IS_LLD yet + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--image-base=0x200000000") + else() + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Ttext-segment=0x200000000") + endif() endif() endif() @@ -759,7 +746,17 @@ else() # - we don't deal with Inf/NaN or signed zero set(MATH_FLAGS "-fno-math-errno -fno-trapping-math -ffinite-math-only -fno-signed-zeros") - set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -Wall -pipe -funroll-loops") + # Enable SSE for floating point math on 32-bit x86 by default + # reasoning see minetest issue #11810 and https://gcc.gnu.org/wiki/FloatingPointMath + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + check_c_source_compiles("#ifndef __i686__\n#error\n#endif\nint main(){}" IS_I686) + if(IS_I686) + message(STATUS "Detected Intel x86: using SSE instead of x87 FPU") + set(OTHER_FLAGS "${OTHER_FLAGS} -mfpmath=sse -msse") + endif() + endif() + + set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${OTHER_FLAGS} -pipe -funroll-loops") if(CMAKE_SYSTEM_NAME MATCHES "(Darwin|BSD|DragonFly)") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os") else() @@ -771,10 +768,15 @@ else() else() set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${MATH_FLAGS}") endif() - endif(CMAKE_SYSTEM_NAME MATCHES "(Darwin|BSD|DragonFly)") - set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}") - set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall ${WARNING_FLAGS} ${OTHER_FLAGS}") + endif() + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -g") + set(CMAKE_CXX_FLAGS_SEMIDEBUG "-g -O1 ${WARNING_FLAGS} ${OTHER_FLAGS}") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 ${WARNING_FLAGS} ${OTHER_FLAGS}") + if(UNIX) + # enable assertions for libstdc++ or libc++ + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wp,-D_GLIBCXX_ASSERTIONS -Wp,-D_LIBCPP_ENABLE_ASSERTIONS=1") + endif() if(USE_GPROF) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg") endif() @@ -788,6 +790,9 @@ endif() # Installation if(WIN32) + if(EXTRA_DLL) + install(FILES ${EXTRA_DLL} DESTINATION ${BINDIR}) + endif() if(VCPKG_APPLOCAL_DEPS) # Collect the dll's from the output path install(DIRECTORY ${EXECUTABLE_OUTPUT_PATH}/Release/ @@ -808,7 +813,7 @@ if(WIN32) FILES_MATCHING PATTERN "*.dll") else() # Use the old-style way to install dll's - if(USE_SOUND) + if(BUILD_CLIENT AND USE_SOUND) if(OPENAL_DLL) install(FILES ${OPENAL_DLL} DESTINATION ${BINDIR}) endif() @@ -818,9 +823,6 @@ if(WIN32) if(VORBIS_DLL) install(FILES ${VORBIS_DLL} DESTINATION ${BINDIR}) endif() - if(VORBISFILE_DLL) - install(FILES ${VORBISFILE_DLL} DESTINATION ${BINDIR}) - endif() endif() if(CURL_DLL) install(FILES ${CURL_DLL} DESTINATION ${BINDIR}) @@ -828,7 +830,10 @@ if(WIN32) if(ZLIB_DLL) install(FILES ${ZLIB_DLL} DESTINATION ${BINDIR}) endif() - if(FREETYPE_DLL) + if(ZSTD_DLL) + install(FILES ${ZSTD_DLL} DESTINATION ${BINDIR}) + endif() + if(BUILD_CLIENT AND FREETYPE_DLL) install(FILES ${FREETYPE_DLL} DESTINATION ${BINDIR}) endif() if(SQLITE3_DLL) @@ -840,6 +845,13 @@ if(WIN32) if(LUA_DLL) install(FILES ${LUA_DLL} DESTINATION ${BINDIR}) endif() + if(BUILD_CLIENT AND USE_GETTEXT AND GETTEXT_DLL) + install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR}) + endif() + endif() + + if(BUILD_CLIENT AND IRRLICHT_DLL) + install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR}) endif() endif() @@ -867,29 +879,8 @@ if(BUILD_CLIENT) endforeach() endif() - if(USE_FREETYPE) - install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../fonts" DESTINATION "${SHAREDIR}" - FILES_MATCHING PATTERN "*.ttf" PATTERN "*.txt") - else() - install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../fonts" DESTINATION "${SHAREDIR}" - FILES_MATCHING PATTERN "*.png" PATTERN "*.xml") - endif() - - if(WIN32) - if(NOT VCPKG_APPLOCAL_DEPS) - if(DEFINED IRRLICHT_DLL) - install(FILES ${IRRLICHT_DLL} DESTINATION ${BINDIR}) - endif() - if(USE_GETTEXT) - if(DEFINED GETTEXT_DLL) - install(FILES ${GETTEXT_DLL} DESTINATION ${BINDIR}) - endif() - if(DEFINED GETTEXT_ICONV_DLL) - install(FILES ${GETTEXT_ICONV_DLL} DESTINATION ${BINDIR}) - endif() - endif() - endif() - endif() + install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../fonts" DESTINATION "${SHAREDIR}" + FILES_MATCHING PATTERN "*.ttf" PATTERN "*.txt") endif(BUILD_CLIENT) if(BUILD_SERVER) diff --git a/src/activeobject.h b/src/activeobject.h index 85e160d10..1d8a3712b 100644 --- a/src/activeobject.h +++ b/src/activeobject.h @@ -28,11 +28,11 @@ enum ActiveObjectType { ACTIVEOBJECT_TYPE_INVALID = 0, ACTIVEOBJECT_TYPE_TEST = 1, // Obsolete stuff - ACTIVEOBJECT_TYPE_ITEM = 2, -// ACTIVEOBJECT_TYPE_RAT = 3, -// ACTIVEOBJECT_TYPE_OERKKI1 = 4, -// ACTIVEOBJECT_TYPE_FIREFLY = 5, - ACTIVEOBJECT_TYPE_MOBV2 = 6, +// ACTIVEOBJECT_TYPE_ITEM = 2, +// ACTIVEOBJECT_TYPE_RAT = 3, +// ACTIVEOBJECT_TYPE_OERKKI1 = 4, +// ACTIVEOBJECT_TYPE_FIREFLY = 5, +// ACTIVEOBJECT_TYPE_MOBV2 = 6, // End obsolete stuff ACTIVEOBJECT_TYPE_LUAENTITY = 7, // Special type, not stored as a static object @@ -120,9 +120,9 @@ public: virtual void setAttachment(int parent_id, const std::string &bone, v3f position, - v3f rotation) {} + v3f rotation, bool force_visible) {} virtual void getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) const {} + v3f *rotation, bool *force_visible) const {} virtual void clearChildAttachments() {} virtual void clearParentAttachment() {} virtual void addAttachmentChild(int child_id) {} diff --git a/src/activeobjectmgr.h b/src/activeobjectmgr.h index 95e7d3344..aa0538e60 100644 --- a/src/activeobjectmgr.h +++ b/src/activeobjectmgr.h @@ -25,7 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., class TestClientActiveObjectMgr; class TestServerActiveObjectMgr; -template <typename T> class ActiveObjectMgr +template <typename T> +class ActiveObjectMgr { friend class ::TestClientActiveObjectMgr; friend class ::TestServerActiveObjectMgr; diff --git a/src/benchmark/CMakeLists.txt b/src/benchmark/CMakeLists.txt new file mode 100644 index 000000000..5feba345b --- /dev/null +++ b/src/benchmark/CMakeLists.txt @@ -0,0 +1,7 @@ +set (BENCHMARK_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/benchmark.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/benchmark_serialize.cpp + PARENT_SCOPE) + +set (BENCHMARK_CLIENT_SRCS + PARENT_SCOPE) diff --git a/src/unittest/test_player.cpp b/src/benchmark/benchmark.cpp similarity index 62% rename from src/unittest/test_player.cpp rename to src/benchmark/benchmark.cpp index 6990b4016..0bc2af368 100644 --- a/src/unittest/test_player.cpp +++ b/src/benchmark/benchmark.cpp @@ -1,6 +1,6 @@ /* Minetest -Copyright (C) 2010-2016 nerzhul, Loic Blot <loic.blot@unix-experience.fr> +Copyright (C) 2022 Minetest Authors 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 @@ -17,23 +17,16 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "test.h" +#include "benchmark/benchmark.h" -#include "exceptions.h" -#include "remoteplayer.h" -#include "server.h" +// This must be set in just this file +#define CATCH_CONFIG_RUNNER +#include "benchmark_setup.h" -class TestPlayer : public TestBase -{ -public: - TestPlayer() { TestManager::registerTestModule(this); } - const char *getName() { return "TestPlayer"; } - - void runTests(IGameDef *gamedef); -}; - -static TestPlayer g_test_instance; - -void TestPlayer::runTests(IGameDef *gamedef) +int run_benchmarks() { + int argc = 1; + const char *argv[] = { "MinetestBenchmark", NULL }; + int errCount = Catch::Session().run(argc, argv); + return errCount ? 1 : 0; } diff --git a/src/benchmark/benchmark.h b/src/benchmark/benchmark.h new file mode 100644 index 000000000..45dd9b6a4 --- /dev/null +++ b/src/benchmark/benchmark.h @@ -0,0 +1,26 @@ +/* +Minetest +Copyright (C) 2022 Minetest Authors + +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. +*/ + +#pragma once + +#include "config.h" + +#if BUILD_BENCHMARKS +extern int run_benchmarks(); +#endif diff --git a/src/benchmark/benchmark_serialize.cpp b/src/benchmark/benchmark_serialize.cpp new file mode 100644 index 000000000..97cc7d59d --- /dev/null +++ b/src/benchmark/benchmark_serialize.cpp @@ -0,0 +1,71 @@ +/* +Minetest +Copyright (C) 2022 Minetest Authors + +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. +*/ + +#include "benchmark_setup.h" +#include "util/serialize.h" +#include <sstream> +#include <ios> + +// Builds a string of exactly `length` characters by repeating `s` (rest cut off) +static std::string makeRepeatTo(const std::string &s, size_t length) +{ + std::string v; + v.reserve(length + s.size()); + for (size_t i = 0; i < length; i += s.size()) { + v += s; + } + v.resize(length); + return v; +} + +#define BENCH3(_label, _chars, _length, _lengthlabel) \ + BENCHMARK_ADVANCED("serializeJsonStringIfNeeded_" _lengthlabel "_" _label)(Catch::Benchmark::Chronometer meter) { \ + std::string s = makeRepeatTo(_chars, _length); \ + meter.measure([&] { return serializeJsonStringIfNeeded(s); }); \ + }; \ + BENCHMARK_ADVANCED("deSerializeJsonStringIfNeeded_" _lengthlabel "_" _label)(Catch::Benchmark::Chronometer meter) { \ + std::string s = makeRepeatTo(_chars, _length); \ + std::string serialized = serializeJsonStringIfNeeded(s); \ + std::istringstream is(serialized, std::ios::binary); \ + meter.measure([&] { \ + is.clear(); \ + is.seekg(0, std::ios::beg); \ + return deSerializeJsonStringIfNeeded(is); \ + }); \ + }; + +/* Both with and without a space character (' ') */ +#define BENCH2(_label, _chars, _length, _lengthlabel) \ + BENCH3(_label, _chars, _length, _lengthlabel) \ + BENCH3(_label "_with_space", " " _chars, _length, _lengthlabel) \ + +/* Iterate over input lengths */ +#define BENCH1(_label, _chars) \ + BENCH2(_label, _chars, 10, "small") \ + BENCH2(_label, _chars, 10000, "large") + +/* Iterate over character sets */ +#define BENCH_ALL() \ + BENCH1("alpha", "abcdefghijklmnopqrstuvwxyz") \ + BENCH1("escaped", "\"\\/\b\f\n\r\t") \ + BENCH1("nonascii", "\xf0\xff") + +TEST_CASE("benchmark_serialize") { + BENCH_ALL() +} diff --git a/src/benchmark/benchmark_setup.h b/src/benchmark/benchmark_setup.h new file mode 100644 index 000000000..34a4eca4c --- /dev/null +++ b/src/benchmark/benchmark_setup.h @@ -0,0 +1,22 @@ +/* +Minetest +Copyright (C) 2022 Minetest Authors + +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. +*/ + +#define CATCH_CONFIG_ENABLE_BENCHMARKING +#define CATCH_CONFIG_CONSOLE_WIDTH 160 +#include <catch.hpp> diff --git a/src/chat.cpp b/src/chat.cpp index c3ed59804..92df038e8 100644 --- a/src/chat.cpp +++ b/src/chat.cpp @@ -35,10 +35,23 @@ ChatBuffer::ChatBuffer(u32 scrollback): if (m_scrollback == 0) m_scrollback = 1; m_empty_formatted_line.first = true; + + m_cache_clickable_chat_weblinks = false; + // Curses mode cannot access g_settings here + if (g_settings != nullptr) { + m_cache_clickable_chat_weblinks = g_settings->getBool("clickable_chat_weblinks"); + if (m_cache_clickable_chat_weblinks) { + std::string colorval = g_settings->get("chat_weblink_color"); + parseColorString(colorval, m_cache_chat_weblink_color, false, 255); + m_cache_chat_weblink_color.setAlpha(255); + } + } } void ChatBuffer::addLine(const std::wstring &name, const std::wstring &text) { + m_lines_modified = true; + ChatLine line(name, text); m_unformatted.push_back(line); @@ -61,6 +74,7 @@ void ChatBuffer::clear() m_unformatted.clear(); m_formatted.clear(); m_scroll = 0; + m_lines_modified = true; } u32 ChatBuffer::getLineCount() const @@ -88,14 +102,11 @@ void ChatBuffer::deleteOldest(u32 count) u32 del_unformatted = 0; u32 del_formatted = 0; - while (count > 0 && del_unformatted < m_unformatted.size()) - { + while (count > 0 && del_unformatted < m_unformatted.size()) { ++del_unformatted; // keep m_formatted in sync - if (del_formatted < m_formatted.size()) - { - + if (del_formatted < m_formatted.size()) { sanity_check(m_formatted[del_formatted].first); ++del_formatted; while (del_formatted < m_formatted.size() && @@ -109,6 +120,9 @@ void ChatBuffer::deleteOldest(u32 count) m_unformatted.erase(m_unformatted.begin(), m_unformatted.begin() + del_unformatted); m_formatted.erase(m_formatted.begin(), m_formatted.begin() + del_formatted); + if (del_unformatted > 0) + m_lines_modified = true; + if (at_bottom) m_scroll = getBottomScrollPos(); else @@ -123,11 +137,6 @@ void ChatBuffer::deleteByAge(f32 maxAge) deleteOldest(count); } -u32 ChatBuffer::getColumns() const -{ - return m_cols; -} - u32 ChatBuffer::getRows() const { return m_rows; @@ -220,11 +229,6 @@ void ChatBuffer::scrollBottom() m_scroll = getBottomScrollPos(); } -void ChatBuffer::scrollTop() -{ - m_scroll = getTopScrollPos(); -} - u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols, std::vector<ChatFormattedLine>& destination) const { @@ -268,78 +272,144 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols, //EnrichedString line_text(line.text); next_line.first = true; - bool text_processing = false; + // Set/use forced newline after the last frag in each line + bool mark_newline = false; // Produce fragments and layout them into lines - while (!next_frags.empty() || in_pos < line.text.size()) - { + while (!next_frags.empty() || in_pos < line.text.size()) { + mark_newline = false; // now using this to USE line-end frag + // Layout fragments into lines - while (!next_frags.empty()) - { + while (!next_frags.empty()) { ChatFormattedFragment& frag = next_frags[0]; - if (frag.text.size() <= cols - out_column) - { + + // Force newline after this frag, if marked + if (frag.column == INT_MAX) + mark_newline = true; + + if (frag.text.size() <= cols - out_column) { // Fragment fits into current line frag.column = out_column; next_line.fragments.push_back(frag); out_column += frag.text.size(); next_frags.erase(next_frags.begin()); - } - else - { + } else { // Fragment does not fit into current line // So split it up temp_frag.text = frag.text.substr(0, cols - out_column); temp_frag.column = out_column; - //temp_frag.bold = frag.bold; + temp_frag.weblink = frag.weblink; + next_line.fragments.push_back(temp_frag); frag.text = frag.text.substr(cols - out_column); + frag.column = 0; out_column = cols; } - if (out_column == cols || text_processing) - { + + if (out_column == cols || mark_newline) { // End the current line destination.push_back(next_line); num_added++; next_line.fragments.clear(); next_line.first = false; - out_column = text_processing ? hanging_indentation : 0; + out_column = hanging_indentation; + mark_newline = false; } } - // Produce fragment - if (in_pos < line.text.size()) - { - u32 remaining_in_input = line.text.size() - in_pos; - u32 remaining_in_output = cols - out_column; + // Produce fragment(s) for next formatted line + if (!(in_pos < line.text.size())) + continue; + const std::wstring &linestring = line.text.getString(); + u32 remaining_in_output = cols - out_column; + size_t http_pos = std::wstring::npos; + mark_newline = false; // now using this to SET line-end frag + + // Construct all frags for next output line + while (!mark_newline) { // Determine a fragment length <= the minimum of // remaining_in_{in,out}put. Try to end the fragment // on a word boundary. - u32 frag_length = 1, space_pos = 0; + u32 frag_length = 0, space_pos = 0; + u32 remaining_in_input = line.text.size() - in_pos; + + if (m_cache_clickable_chat_weblinks) { + // Note: unsigned(-1) on fail + http_pos = linestring.find(L"https://", in_pos); + if (http_pos == std::wstring::npos) + http_pos = linestring.find(L"http://", in_pos); + if (http_pos != std::wstring::npos) + http_pos -= in_pos; + } + while (frag_length < remaining_in_input && - frag_length < remaining_in_output) - { - if (iswspace(line.text.getString()[in_pos + frag_length])) + frag_length < remaining_in_output) { + if (iswspace(linestring[in_pos + frag_length])) space_pos = frag_length; ++frag_length; } + + if (http_pos >= remaining_in_output) { + // Http not in range, grab until space or EOL, halt as normal. + // Note this works because (http_pos = npos) is unsigned(-1) + + mark_newline = true; + } else if (http_pos == 0) { + // At http, grab ALL until FIRST whitespace or end marker. loop. + // If at end of string, next loop will be empty string to mark end of weblink. + + frag_length = 6; // Frag is at least "http://" + + // Chars to mark end of weblink + // TODO? replace this with a safer (slower) regex whitelist? + static const std::wstring delim_chars = L"\'\";,"; + wchar_t tempchar = linestring[in_pos+frag_length]; + while (frag_length < remaining_in_input && + !iswspace(tempchar) && + delim_chars.find(tempchar) == std::wstring::npos) { + ++frag_length; + tempchar = linestring[in_pos+frag_length]; + } + + space_pos = frag_length - 1; + // This frag may need to be force-split. That's ok, urls aren't "words" + if (frag_length >= remaining_in_output) { + mark_newline = true; + } + } else { + // Http in range, grab until http, loop + + space_pos = http_pos - 1; + frag_length = http_pos; + } + + // Include trailing space in current frag if (space_pos != 0 && frag_length < remaining_in_input) frag_length = space_pos + 1; temp_frag.text = line.text.substr(in_pos, frag_length); - temp_frag.column = 0; - //temp_frag.bold = 0; + // A hack so this frag remembers mark_newline for the layout phase + temp_frag.column = mark_newline ? INT_MAX : 0; + + if (http_pos == 0) { + // Discard color stuff from the source frag + temp_frag.text = EnrichedString(temp_frag.text.getString()); + temp_frag.text.setDefaultColor(m_cache_chat_weblink_color); + // Set weblink in the frag meta + temp_frag.weblink = wide_to_utf8(temp_frag.text.getString()); + } else { + temp_frag.weblink.clear(); + } next_frags.push_back(temp_frag); in_pos += frag_length; - text_processing = true; + remaining_in_output -= std::min(frag_length, remaining_in_output); } } // End the last line - if (num_added == 0 || !next_line.fragments.empty()) - { + if (num_added == 0 || !next_line.fragments.empty()) { destination.push_back(next_line); num_added++; } @@ -490,8 +560,8 @@ void ChatPrompt::nickCompletion(const std::list<std::string>& names, bool backwa // find all names that start with the selected prefix std::vector<std::wstring> completions; for (const std::string &name : names) { - if (str_starts_with(narrow_to_wide(name), prefix, true)) { - std::wstring completion = narrow_to_wide(name); + std::wstring completion = utf8_to_wide(name); + if (str_starts_with(completion, prefix, true)) { if (prefix_start == 0) completion += L": "; completions.push_back(completion); diff --git a/src/chat.h b/src/chat.h index f84ece206..fc080f64b 100644 --- a/src/chat.h +++ b/src/chat.h @@ -57,6 +57,8 @@ struct ChatFormattedFragment EnrichedString text; // starting column u32 column; + // web link is empty for most frags + std::string weblink; // formatting //u8 bold:1; }; @@ -94,8 +96,6 @@ public: // Delete lines older than maxAge. void deleteByAge(f32 maxAge); - // Get number of columns, 0 if reformat has not been called yet. - u32 getColumns() const; // Get number of rows, 0 if reformat has not been called yet. u32 getRows() const; // Update console size and reformat all formatted lines. @@ -110,8 +110,13 @@ public: void scrollAbsolute(s32 scroll); // Scroll to bottom of buffer (newest) void scrollBottom(); - // Scroll to top of buffer (oldest) - void scrollTop(); + + // Functions for keeping track of whether the lines were modified by any + // preceding operations + // If they were not changed, getLineCount() and getLine() output the same as + // before + bool getLinesModified() const { return m_lines_modified; } + void resetLinesModified() { m_lines_modified = false; } // Format a chat line for the given number of columns. // Appends the formatted lines to the destination array and @@ -120,6 +125,7 @@ public: std::vector<ChatFormattedLine>& destination) const; void resize(u32 scrollback); + protected: s32 getTopScrollPos() const; s32 getBottomScrollPos() const; @@ -140,6 +146,16 @@ private: std::vector<ChatFormattedLine> m_formatted; // Empty formatted line, for error returns ChatFormattedLine m_empty_formatted_line; + + // Enable clickable chat weblinks + bool m_cache_clickable_chat_weblinks; + // Color of clickable chat weblinks + irr::video::SColor m_cache_chat_weblink_color; + + // Whether the lines were modified since last markLinesUnchanged() + // Is always set to true when m_unformatted is modified, because that's what + // determines the output of getLineCount() and getLine() + bool m_lines_modified = true; }; class ChatPrompt diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 140814911..656ad45ce 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -58,5 +58,9 @@ set(client_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/sky.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tile.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wieldmesh.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/shadows/dynamicshadows.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/shadows/dynamicshadowsrender.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/shadows/shadowsshadercallbacks.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/shadows/shadowsScreenQuad.cpp PARENT_SCOPE ) diff --git a/src/client/camera.cpp b/src/client/camera.cpp index 11f8a1c90..df75c52d6 100644 --- a/src/client/camera.cpp +++ b/src/client/camera.cpp @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "player.h" #include <cmath> #include "client/renderingengine.h" +#include "client/content_cao.h" #include "settings.h" #include "wieldmesh.h" #include "noise.h" // easeCurve @@ -36,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "constants.h" #include "fontengine.h" #include "script/scripting_client.h" +#include "gettext.h" #define CAMERA_OFFSET_STEP 200 #define WIELDMESH_OFFSET_X 55.0f @@ -43,11 +45,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #define WIELDMESH_AMPLITUDE_X 7.0f #define WIELDMESH_AMPLITUDE_Y 10.0f -Camera::Camera(MapDrawControl &draw_control, Client *client): +Camera::Camera(MapDrawControl &draw_control, Client *client, RenderingEngine *rendering_engine): m_draw_control(draw_control), - m_client(client) + m_client(client), + m_player_light_color(0xFFFFFFFF) { - scene::ISceneManager *smgr = RenderingEngine::get_scene_manager(); + auto smgr = rendering_engine->get_scene_manager(); // note: making the camera node a child of the player node // would lead to unexpected behaviour, so we don't do that. m_playernode = smgr->addEmptySceneNode(smgr->getRootSceneNode()); @@ -72,13 +75,14 @@ Camera::Camera(MapDrawControl &draw_control, Client *client): * (as opposed to the this local caching). This can be addressed in * a later release. */ - m_cache_fall_bobbing_amount = g_settings->getFloat("fall_bobbing_amount"); - m_cache_view_bobbing_amount = g_settings->getFloat("view_bobbing_amount"); + m_cache_fall_bobbing_amount = g_settings->getFloat("fall_bobbing_amount", 0.0f, 100.0f); + m_cache_view_bobbing_amount = g_settings->getFloat("view_bobbing_amount", 0.0f, 7.9f); // 45 degrees is the lowest FOV that doesn't cause the server to treat this // as a zoom FOV and load world beyond the set server limits. - m_cache_fov = std::fmax(g_settings->getFloat("fov"), 45.0f); + m_cache_fov = g_settings->getFloat("fov", 45.0f, 160.0f); m_arm_inertia = g_settings->getBool("arm_inertia"); m_nametags.clear(); + m_show_nametag_backgrounds = g_settings->getBool("show_nametag_backgrounds"); } Camera::~Camera() @@ -131,28 +135,6 @@ void Camera::notifyFovChange() } } -bool Camera::successfullyCreated(std::string &error_message) -{ - if (!m_playernode) { - error_message = "Failed to create the player scene node"; - } else if (!m_headnode) { - error_message = "Failed to create the head scene node"; - } else if (!m_cameranode) { - error_message = "Failed to create the camera scene node"; - } else if (!m_wieldmgr) { - error_message = "Failed to create the wielded item scene manager"; - } else if (!m_wieldnode) { - error_message = "Failed to create the wielded item scene node"; - } else { - error_message.clear(); - } - - if (m_client->modsLoaded()) - m_client->getScript()->on_camera_ready(this); - - return error_message.empty(); -} - // Returns the fractional part of x inline f32 my_modf(f32 x) { @@ -172,8 +154,10 @@ void Camera::step(f32 dtime) bool was_under_zero = m_wield_change_timer < 0; m_wield_change_timer = MYMIN(m_wield_change_timer + dtime, 0.125); - if (m_wield_change_timer >= 0 && was_under_zero) + if (m_wield_change_timer >= 0 && was_under_zero) { m_wieldnode->setItem(m_wield_item_next, m_client); + m_wieldnode->setNodeLightColor(m_player_light_color); + } if (m_view_bobbing_state != 0) { @@ -185,9 +169,7 @@ void Camera::step(f32 dtime) m_view_bobbing_anim -= offset; } else if (m_view_bobbing_anim > 0.75) { m_view_bobbing_anim += offset; - } - - if (m_view_bobbing_anim < 0.5) { + } else if (m_view_bobbing_anim < 0.5) { m_view_bobbing_anim += offset; if (m_view_bobbing_anim > 0.5) m_view_bobbing_anim = 0.5; @@ -329,7 +311,7 @@ void Camera::addArmInertia(f32 player_yaw) } } -void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_reload_ratio) +void Camera::update(LocalPlayer* player, f32 frametime, f32 tool_reload_ratio) { // Get player position // Smooth the movement when walking up stairs @@ -342,13 +324,16 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r if (player->getParent()) player_position = player->getParent()->getPosition(); - // Smooth the camera movement when the player instantly moves upward due to stepheight. - // To smooth the 'not touching_ground' stepheight, smoothing is necessary when jumping - // or swimming (for when moving from liquid to land). - // Disable smoothing if climbing or flying, to avoid upwards offset of player model - // when seen in 3rd person view. - bool flying = g_settings->getBool("free_move") && m_client->checkLocalPrivilege("fly"); - if (player_position.Y > old_player_position.Y && !player->is_climbing && !flying) { + // Smooth the camera movement after the player instantly moves upward due to stepheight. + // The smoothing usually continues until the camera position reaches the player position. + float player_stepheight = player->getCAO() ? player->getCAO()->getStepHeight() : HUGE_VALF; + float upward_movement = player_position.Y - old_player_position.Y; + if (upward_movement < 0.01f || upward_movement > player_stepheight) { + m_stepheight_smooth_active = false; + } else if (player->touching_ground) { + m_stepheight_smooth_active = true; + } + if (m_stepheight_smooth_active) { f32 oldy = old_player_position.Y; f32 newy = player_position.Y; f32 t = std::exp(-23 * frametime); @@ -377,7 +362,8 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r // Smoothen and invert the above fall_bobbing = sin(fall_bobbing * 0.5 * M_PI) * -1; // Amplify according to the intensity of the impact - fall_bobbing *= (1 - rangelim(50 / player->camera_impact, 0, 1)) * 5; + if (player->camera_impact > 0.0f) + fall_bobbing *= (1 - rangelim(50 / player->camera_impact, 0, 1)) * 5; fall_bobbing *= m_cache_fall_bobbing_amount; } @@ -408,41 +394,17 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r f32 bobfrac = my_modf(m_view_bobbing_anim * 2); f32 bobdir = (m_view_bobbing_anim < 0.5) ? 1.0 : -1.0; - #if 1 f32 bobknob = 1.2; f32 bobtmp = sin(pow(bobfrac, bobknob) * M_PI); - //f32 bobtmp2 = cos(pow(bobfrac, bobknob) * M_PI); v3f bobvec = v3f( 0.3 * bobdir * sin(bobfrac * M_PI), -0.28 * bobtmp * bobtmp, 0.); - //rel_cam_pos += 0.2 * bobvec; - //rel_cam_target += 0.03 * bobvec; - //rel_cam_up.rotateXYBy(0.02 * bobdir * bobtmp * M_PI); - float f = 1.0; - f *= m_cache_view_bobbing_amount; - rel_cam_pos += bobvec * f; - //rel_cam_target += 0.995 * bobvec * f; - rel_cam_target += bobvec * f; - rel_cam_target.Z -= 0.005 * bobvec.Z * f; - //rel_cam_target.X -= 0.005 * bobvec.X * f; - //rel_cam_target.Y -= 0.005 * bobvec.Y * f; - rel_cam_up.rotateXYBy(-0.03 * bobdir * bobtmp * M_PI * f); - #else - f32 angle_deg = 1 * bobdir * sin(bobfrac * M_PI); - f32 angle_rad = angle_deg * M_PI / 180; - f32 r = 0.05; - v3f off = v3f( - r * sin(angle_rad), - r * (cos(angle_rad) - 1), - 0); - rel_cam_pos += off; - //rel_cam_target += off; - rel_cam_up.rotateXYBy(angle_deg); - #endif - + rel_cam_pos += bobvec * m_cache_view_bobbing_amount; + rel_cam_target += bobvec * m_cache_view_bobbing_amount; + rel_cam_up.rotateXYBy(-0.03 * bobdir * bobtmp * M_PI * m_cache_view_bobbing_amount); } // Compute absolute camera position and target @@ -540,7 +502,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r m_curr_fov_degrees = rangelim(m_curr_fov_degrees, 1.0f, 160.0f); // FOV and aspect ratio - const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize(); + const v2u32 &window_size = RenderingEngine::getWindowSize(); m_aspect = (f32) window_size.X / (f32) window_size.Y; m_fov_y = m_curr_fov_degrees * M_PI / 180.0; // Increase vertical FOV on lower aspect ratios (<16:10) @@ -596,7 +558,8 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r m_wieldnode->setPosition(wield_position); m_wieldnode->setRotation(wield_rotation); - m_wieldnode->setNodeLightColor(player->light_color); + m_player_light_color = player->light_color; + m_wieldnode->setNodeLightColor(m_player_light_color); // Set render distance updateViewingRange(); @@ -611,6 +574,8 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r const bool walking = movement_XZ && player->touching_ground; const bool swimming = (movement_XZ || player->swimming_vertical) && player->in_liquid; const bool climbing = movement_Y && player->is_climbing; + const bool flying = g_settings->getBool("free_move") + && m_client->checkLocalPrivilege("fly"); if ((walking || swimming || climbing) && !flying) { // Start animation m_view_bobbing_state = 1; @@ -663,7 +628,7 @@ void Camera::wield(const ItemStack &item) void Camera::drawWieldedTool(irr::core::matrix4* translation) { // Clear Z buffer so that the wielded tool stays in front of world geometry - m_wieldmgr->getVideoDriver()->clearZBuffer(); + m_wieldmgr->getVideoDriver()->clearBuffers(video::ECBF_DEPTH); // Draw the wielded node (in a separate scene manager) scene::ICameraSceneNode* cam = m_wieldmgr->getActiveCamera(); @@ -691,46 +656,47 @@ void Camera::drawNametags() core::matrix4 trans = m_cameranode->getProjectionMatrix(); trans *= m_cameranode->getViewMatrix(); - for (std::list<Nametag *>::const_iterator - i = m_nametags.begin(); - i != m_nametags.end(); ++i) { - Nametag *nametag = *i; - if (nametag->nametag_color.getAlpha() == 0) { - // Enforce hiding nametag, - // because if freetype is enabled, a grey - // shadow can remain. - continue; - } - v3f pos = nametag->parent_node->getAbsolutePosition() + nametag->nametag_pos * BS; + gui::IGUIFont *font = g_fontengine->getFont(); + video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + v2u32 screensize = driver->getScreenSize(); + + for (const Nametag *nametag : m_nametags) { + // Nametags are hidden in GenericCAO::updateNametag() + + v3f pos = nametag->parent_node->getAbsolutePosition() + nametag->pos * BS; f32 transformed_pos[4] = { pos.X, pos.Y, pos.Z, 1.0f }; trans.multiplyWith1x4Matrix(transformed_pos); if (transformed_pos[3] > 0) { std::wstring nametag_colorless = - unescape_translate(utf8_to_wide(nametag->nametag_text)); - core::dimension2d<u32> textsize = - g_fontengine->getFont()->getDimension( + unescape_translate(utf8_to_wide(nametag->text)); + core::dimension2d<u32> textsize = font->getDimension( nametag_colorless.c_str()); f32 zDiv = transformed_pos[3] == 0.0f ? 1.0f : core::reciprocal(transformed_pos[3]); - v2u32 screensize = RenderingEngine::get_video_driver()->getScreenSize(); v2s32 screen_pos; screen_pos.X = screensize.X * (0.5 * transformed_pos[0] * zDiv + 0.5) - textsize.Width / 2; screen_pos.Y = screensize.Y * (0.5 - transformed_pos[1] * zDiv * 0.5) - textsize.Height / 2; core::rect<s32> size(0, 0, textsize.Width, textsize.Height); - g_fontengine->getFont()->draw( - translate_string(utf8_to_wide(nametag->nametag_text)).c_str(), - size + screen_pos, nametag->nametag_color); + core::rect<s32> bg_size(-2, 0, textsize.Width+2, textsize.Height); + + auto bgcolor = nametag->getBgColor(m_show_nametag_backgrounds); + if (bgcolor.getAlpha() != 0) + driver->draw2DRectangle(bgcolor, bg_size + screen_pos); + + font->draw( + translate_string(utf8_to_wide(nametag->text)).c_str(), + size + screen_pos, nametag->textcolor); } } } Nametag *Camera::addNametag(scene::ISceneNode *parent_node, - const std::string &nametag_text, video::SColor nametag_color, - const v3f &pos) + const std::string &text, video::SColor textcolor, + Optional<video::SColor> bgcolor, const v3f &pos) { - Nametag *nametag = new Nametag(parent_node, nametag_text, nametag_color, pos); + Nametag *nametag = new Nametag(parent_node, text, textcolor, bgcolor, pos); m_nametags.push_back(nametag); return nametag; } diff --git a/src/client/camera.h b/src/client/camera.h index 3a59637bc..cbf248d97 100644 --- a/src/client/camera.h +++ b/src/client/camera.h @@ -25,27 +25,48 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <ICameraSceneNode.h> #include <ISceneNode.h> #include <list> +#include "util/Optional.h" class LocalPlayer; struct MapDrawControl; class Client; +class RenderingEngine; class WieldMeshSceneNode; -struct Nametag { +struct Nametag +{ + scene::ISceneNode *parent_node; + std::string text; + video::SColor textcolor; + Optional<video::SColor> bgcolor; + v3f pos; + Nametag(scene::ISceneNode *a_parent_node, - const std::string &a_nametag_text, - const video::SColor &a_nametag_color, - const v3f &a_nametag_pos): + const std::string &text, + const video::SColor &textcolor, + const Optional<video::SColor> &bgcolor, + const v3f &pos): parent_node(a_parent_node), - nametag_text(a_nametag_text), - nametag_color(a_nametag_color), - nametag_pos(a_nametag_pos) + text(text), + textcolor(textcolor), + bgcolor(bgcolor), + pos(pos) { } - scene::ISceneNode *parent_node; - std::string nametag_text; - video::SColor nametag_color; - v3f nametag_pos; + + video::SColor getBgColor(bool use_fallback) const + { + if (bgcolor) + return bgcolor.value(); + else if (!use_fallback) + return video::SColor(0, 0, 0, 0); + else if (textcolor.getLuminance() > 186) + // Dark background for light text + return video::SColor(50, 50, 50, 50); + else + // Light background for dark text + return video::SColor(50, 255, 255, 255); + } }; enum CameraMode {CAMERA_MODE_FIRST, CAMERA_MODE_THIRD, CAMERA_MODE_THIRD_FRONT}; @@ -58,7 +79,7 @@ enum CameraMode {CAMERA_MODE_FIRST, CAMERA_MODE_THIRD, CAMERA_MODE_THIRD_FRONT}; class Camera { public: - Camera(MapDrawControl &draw_control, Client *client); + Camera(MapDrawControl &draw_control, Client *client, RenderingEngine *rendering_engine); ~Camera(); // Get camera scene node. @@ -115,16 +136,11 @@ public: // Notify about new server-sent FOV and initialize smooth FOV transition void notifyFovChange(); - // Checks if the constructor was able to create the scene nodes - bool successfullyCreated(std::string &error_message); - // Step the camera: updates the viewing range and view bobbing. void step(f32 dtime); // Update the camera from the local player's position. - // busytime is used to adjust the viewing range. - void update(LocalPlayer* player, f32 frametime, f32 busytime, - f32 tool_reload_ratio); + void update(LocalPlayer* player, f32 frametime, f32 tool_reload_ratio); // Update render distance void updateViewingRange(); @@ -164,13 +180,11 @@ public: } Nametag *addNametag(scene::ISceneNode *parent_node, - const std::string &nametag_text, video::SColor nametag_color, - const v3f &pos); + const std::string &text, video::SColor textcolor, + Optional<video::SColor> bgcolor, const v3f &pos); void removeNametag(Nametag *nametag); - const std::list<Nametag *> &getNametags() { return m_nametags; } - void drawNametags(); inline void addArmInertia(f32 player_yaw); @@ -199,6 +213,8 @@ private: // Camera offset v3s16 m_camera_offset; + bool m_stepheight_smooth_active = false; + // Server-sent FOV variables bool m_server_sent_fov = false; f32 m_curr_fov_degrees, m_old_fov_degrees, m_target_fov_degrees; @@ -247,4 +263,8 @@ private: bool m_arm_inertia; std::list<Nametag *> m_nametags; + bool m_show_nametag_backgrounds; + + // Last known light color of the player + video::SColor m_player_light_color; }; diff --git a/src/client/client.cpp b/src/client/client.cpp index d6e529c40..35634e77b 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -50,6 +50,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "clientmap.h" #include "clientmedia.h" #include "version.h" +#include "database/database-files.h" #include "database/database-sqlite3.h" #include "serialization.h" #include "guiscalingfilter.h" @@ -57,6 +58,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "game.h" #include "chatmessage.h" #include "translation.h" +#include "content/mod_configuration.h" extern gui::IGUIEnvironment* guienv; @@ -97,8 +99,10 @@ Client::Client( NodeDefManager *nodedef, ISoundManager *sound, MtEventManager *event, + RenderingEngine *rendering_engine, bool ipv6, - GameUI *game_ui + GameUI *game_ui, + ELoginRegister allow_login_or_register ): m_tsrc(tsrc), m_shsrc(shsrc), @@ -106,14 +110,16 @@ Client::Client( m_nodedef(nodedef), m_sound(sound), m_event(event), + m_rendering_engine(rendering_engine), m_mesh_update_thread(this), m_env( - new ClientMap(this, control, 666), + new ClientMap(this, rendering_engine, control, 666), tsrc, this ), m_particle_manager(&m_env), m_con(new con::Connection(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this)), m_address_name(address_name), + m_allow_login_or_register(allow_login_or_register), m_server_ser_ver(SER_FMT_VER_INVALID), m_last_chat_message_sent(time(NULL)), m_password(password), @@ -126,12 +132,45 @@ Client::Client( // Add local player m_env.setLocalPlayer(new LocalPlayer(this, playername)); + // Make the mod storage database and begin the save for later + m_mod_storage_database = + new ModMetadataDatabaseSQLite3(porting::path_user + DIR_DELIM + "client"); + m_mod_storage_database->beginSave(); + if (g_settings->getBool("enable_minimap")) { m_minimap = new Minimap(this); } + m_cache_save_interval = g_settings->getU16("server_map_save_interval"); } +void Client::migrateModStorage() +{ + std::string mod_storage_dir = porting::path_user + DIR_DELIM + "client"; + std::string old_mod_storage = mod_storage_dir + DIR_DELIM + "mod_storage"; + if (fs::IsDir(old_mod_storage)) { + infostream << "Migrating client mod storage to SQLite3 database" << std::endl; + { + ModMetadataDatabaseFiles files_db(mod_storage_dir); + std::vector<std::string> mod_list; + files_db.listMods(&mod_list); + for (const std::string &modname : mod_list) { + infostream << "Migrating client mod storage for mod " << modname << std::endl; + StringMap meta; + files_db.getModEntries(modname, &meta); + for (const auto &pair : meta) { + m_mod_storage_database->setModEntry(modname, pair.first, pair.second); + } + } + } + if (!fs::Rename(old_mod_storage, old_mod_storage + ".bak")) { + // Execution cannot move forward if the migration does not complete. + throw BaseException("Could not finish migrating client mod storage"); + } + infostream << "Finished migration of client mod storage" << std::endl; + } +} + void Client::loadMods() { // Don't load mods twice. @@ -158,25 +197,26 @@ void Client::loadMods() scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath()); m_script->loadModFromMemory(BUILTIN_MOD_NAME); - // TODO Uncomment when server-sent CSM and verifying of builtin are complete - /* - // Don't load client-provided mods if disabled by server - if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOAD_CLIENT_MODS)) { - warningstream << "Client-provided mod loading is disabled by server." << - std::endl; - // If builtin integrity is wrong, disconnect user - if (!checkBuiltinIntegrity()) { - // TODO disconnect user + ModConfiguration modconf; + { + std::unordered_map<std::string, std::string> paths; + std::string path_user = porting::path_user + DIR_DELIM + "clientmods"; + const auto modsPath = getClientModsLuaPath(); + if (modsPath != path_user) { + paths["share"] = modsPath; } - return; - } - */ + paths["mods"] = path_user; + + std::string settings_path = path_user + DIR_DELIM + "mods.conf"; + modconf.addModsFromConfig(settings_path, paths); + modconf.checkConflictsAndDeps(); + } - ClientModConfiguration modconf(getClientModsLuaPath()); m_mods = modconf.getMods(); + // complain about mods with unsatisfied dependencies if (!modconf.isConsistent()) { - modconf.printUnsatisfiedModsError(); + errorstream << modconf.getUnsatisfiedModsError() << std::endl; return; } @@ -188,11 +228,7 @@ void Client::loadMods() // Load "mod" scripts for (const ModSpec &mod : m_mods) { - if (!string_allowed(mod.name, MODNAME_ALLOWED_CHARS)) { - throw ModError("Error loading mod \"" + mod.name + - "\": Mod name does not follow naming conventions: " - "Only characters [a-z0-9_] are allowed."); - } + mod.checkAndLog(); scanModIntoMemory(mod.name, mod.path); } @@ -215,18 +251,15 @@ void Client::loadMods() m_script->on_minimap_ready(m_minimap); } -bool Client::checkBuiltinIntegrity() -{ - // TODO - return true; -} - void Client::scanModSubfolder(const std::string &mod_name, const std::string &mod_path, std::string mod_subpath) { std::string full_path = mod_path + DIR_DELIM + mod_subpath; std::vector<fs::DirListNode> mod = fs::GetDirListing(full_path); for (const fs::DirListNode &j : mod) { + if (j.name[0] == '.') + continue; + if (j.dir) { scanModSubfolder(mod_name, mod_path, mod_subpath + j.name + DIR_DELIM); continue; @@ -317,15 +350,19 @@ Client::~Client() } // cleanup 3d model meshes on client shutdown - while (RenderingEngine::get_mesh_cache()->getMeshCount() != 0) { - scene::IAnimatedMesh *mesh = RenderingEngine::get_mesh_cache()->getMeshByIndex(0); + m_rendering_engine->cleanupMeshCache(); - if (mesh) - RenderingEngine::get_mesh_cache()->removeMesh(mesh); - } + guiScalingCacheClear(); delete m_minimap; + m_minimap = nullptr; + delete m_media_downloader; + + // Write the changes and delete + if (m_mod_storage_database) + m_mod_storage_database->endSave(); + delete m_mod_storage_database; } void Client::connect(Address address, bool is_local_server) @@ -377,10 +414,6 @@ void Client::step(float dtime) initial_step = false; } else if(m_state == LC_Created) { - if (m_is_registration_confirmation_state) { - // Waiting confirmation - return; - } float &counter = m_connection_reinit_timer; counter -= dtime; if(counter <= 0.0) { @@ -407,7 +440,7 @@ void Client::step(float dtime) if(m_map_timer_and_unload_interval.step(dtime, map_timer_and_unload_dtime)) { std::vector<v3s16> deleted_blocks; m_env.getMap().timerUpdate(map_timer_and_unload_dtime, - g_settings->getFloat("client_unload_unused_data_timeout"), + std::max(g_settings->getFloat("client_unload_unused_data_timeout"), 0.0f), g_settings->getS32("client_mapblock_limit"), &deleted_blocks); @@ -476,6 +509,7 @@ void Client::step(float dtime) ClientEvent *event = new ClientEvent(); event->type = CE_PLAYER_DAMAGE; event->player_damage.amount = damage; + event->player_damage.effect = true; m_client_event_queue.push(event); } } @@ -511,6 +545,7 @@ void Client::step(float dtime) { int num_processed_meshes = 0; std::vector<v3s16> blocks_to_ack; + bool force_update_shadows = false; while (!m_mesh_update_thread.m_queue_out.empty()) { num_processed_meshes++; @@ -537,9 +572,12 @@ void Client::step(float dtime) if (is_empty) delete r.mesh; - else + else { // Replace with the new mesh block->mesh = r.mesh; + if (r.urgent) + force_update_shadows = true; + } } } else { delete r.mesh; @@ -564,6 +602,10 @@ void Client::step(float dtime) if (num_processed_meshes > 0) g_profiler->graphAdd("num_processed_meshes", num_processed_meshes); + + auto shadow_renderer = RenderingEngine::get_shadow_renderer(); + if (shadow_renderer && force_update_shadows) + shadow_renderer->setForceUpdateShadowMap(); } /* @@ -576,6 +618,29 @@ void Client::step(float dtime) m_media_downloader = NULL; } } + { + // Acknowledge dynamic media downloads to server + std::vector<u32> done; + for (auto it = m_pending_media_downloads.begin(); + it != m_pending_media_downloads.end();) { + assert(it->second->isStarted()); + it->second->step(this); + if (it->second->isDone()) { + done.emplace_back(it->first); + + it = m_pending_media_downloads.erase(it); + } else { + it++; + } + + if (done.size() == 255) { // maximum in one packet + sendHaveMedia(done); + done.clear(); + } + } + if (!done.empty()) + sendHaveMedia(done); + } /* If the server didn't update the inventory in a while, revert @@ -639,19 +704,12 @@ void Client::step(float dtime) } } + // Write changes to the mod storage m_mod_storage_save_timer -= dtime; if (m_mod_storage_save_timer <= 0.0f) { m_mod_storage_save_timer = g_settings->getFloat("server_map_save_interval"); - int n = 0; - for (std::unordered_map<std::string, ModMetadata *>::const_iterator - it = m_mod_storages.begin(); it != m_mod_storages.end(); ++it) { - if (it->second->isModified()) { - it->second->save(getModStoragePath()); - n++; - } - } - if (n > 0) - infostream << "Saved " << n << " modified mod storages." << std::endl; + m_mod_storage_database->endSave(); + m_mod_storage_database->beginSave(); } // Write server map @@ -677,15 +735,11 @@ bool Client::loadMedia(const std::string &data, const std::string &filename, TRACESTREAM(<< "Client: Attempting to load image " << "file \"" << filename << "\"" << std::endl); - io::IFileSystem *irrfs = RenderingEngine::get_filesystem(); - video::IVideoDriver *vdrv = RenderingEngine::get_video_driver(); + io::IFileSystem *irrfs = m_rendering_engine->get_filesystem(); + video::IVideoDriver *vdrv = m_rendering_engine->get_video_driver(); - // Silly irrlicht's const-incorrectness - Buffer<char> data_rw(data.c_str(), data.size()); - - // Create an irrlicht memory file io::IReadFile *rfile = irrfs->createMemoryReadFile( - *data_rw, data_rw.getSize(), "_tempreadfile"); + data.c_str(), data.size(), "_tempreadfile"); FATAL_ERROR_IF(!rfile, "Could not create irrlicht memory file."); @@ -755,16 +809,18 @@ void Client::peerAdded(con::Peer *peer) infostream << "Client::peerAdded(): peer->id=" << peer->id << std::endl; } + void Client::deletingPeer(con::Peer *peer, bool timeout) { infostream << "Client::deletingPeer(): " "Server Peer is getting deleted " << "(timeout=" << timeout << ")" << std::endl; - if (timeout) { - m_access_denied = true; + m_access_denied = true; + if (timeout) m_access_denied_reason = gettext("Connection timed out."); - } + else if (m_access_denied_reason.empty()) + m_access_denied_reason = gettext("Connection aborted (protocol error?)."); } /* @@ -795,7 +851,8 @@ void Client::request_media(const std::vector<std::string> &file_requests) Send(&pkt); infostream << "Client: Sending media request list to server (" - << file_requests.size() << " files. packet size)" << std::endl; + << file_requests.size() << " files, packet size " + << pkt.getSize() << ")" << std::endl; } void Client::initLocalMapSaving(const Address &address, @@ -878,7 +935,7 @@ void Client::ProcessData(NetworkPacket *pkt) */ if(sender_peer_id != PEER_ID_SERVER) { infostream << "Client::ProcessData(): Discarding data not " - "coming from server: peer_id=" << sender_peer_id + "coming from server: peer_id=" << sender_peer_id << " command=" << pkt->getCommand() << std::endl; return; } @@ -929,7 +986,7 @@ void writePlayerPos(LocalPlayer *myplayer, ClientMap *clientMap, NetworkPacket * v3f sf = myplayer->getSpeed() * 100; s32 pitch = myplayer->getPitch() * 100; s32 yaw = myplayer->getYaw() * 100; - u32 keyPressed = myplayer->keyPressed; + u32 keyPressed = myplayer->control.getKeysPressed(); // scaled by 80, so that pi can fit into a u8 u8 fov = clientMap->getCameraFov() * 80; u8 wanted_range = MYMIN(255, @@ -1037,18 +1094,6 @@ void Client::sendInit(const std::string &playerName) Send(&pkt); } -void Client::promptConfirmRegistration(AuthMechanism chosen_auth_mechanism) -{ - m_chosen_auth_mech = chosen_auth_mechanism; - m_is_registration_confirmation_state = true; -} - -void Client::confirmRegistration() -{ - m_is_registration_confirmation_state = false; - startAuth(m_chosen_auth_mech); -} - void Client::startAuth(AuthMechanism chosen_auth_mechanism) { m_chosen_auth_mech = chosen_auth_mechanism; @@ -1213,7 +1258,7 @@ void Client::sendChatMessage(const std::wstring &message) if (canSendChatMessage()) { u32 now = time(NULL); float time_passed = now - m_last_chat_message_sent; - m_last_chat_message_sent = time(NULL); + m_last_chat_message_sent = now; m_chat_message_allowance += time_passed * (CLIENT_CHAT_MESSAGE_LIMIT_PER_10S / 8.0f); if (m_chat_message_allowance > CLIENT_CHAT_MESSAGE_LIMIT_PER_10S) @@ -1226,7 +1271,7 @@ void Client::sendChatMessage(const std::wstring &message) pkt << message; Send(&pkt); - } else if (m_out_chat_queue.size() < (u16) max_queue_size || max_queue_size == -1) { + } else if (m_out_chat_queue.size() < (u16) max_queue_size || max_queue_size < 0) { m_out_chat_queue.push(message); } else { infostream << "Could not queue chat message because maximum out chat queue size (" @@ -1285,23 +1330,24 @@ void Client::sendPlayerPos() if (!player) return; + // Save bandwidth by only updating position when + // player is not dead and something changed + + if (m_activeobjects_received && player->isDead()) + return; + ClientMap &map = m_env.getClientMap(); u8 camera_fov = map.getCameraFov(); u8 wanted_range = map.getControl().wanted_range; - // Save bandwidth by only updating position when - // player is not dead and something changed - - // FIXME: This part causes breakages in mods like 3d_armor, and has been commented for now - // if (m_activeobjects_received && player->isDead()) - // return; + u32 keyPressed = player->control.getKeysPressed(); if ( player->last_position == player->getPosition() && player->last_speed == player->getSpeed() && player->last_pitch == player->getPitch() && player->last_yaw == player->getYaw() && - player->last_keyPressed == player->keyPressed && + player->last_keyPressed == keyPressed && player->last_camera_fov == camera_fov && player->last_wanted_range == wanted_range) return; @@ -1310,7 +1356,7 @@ void Client::sendPlayerPos() player->last_speed = player->getSpeed(); player->last_pitch = player->getPitch(); player->last_yaw = player->getYaw(); - player->last_keyPressed = player->keyPressed; + player->last_keyPressed = keyPressed; player->last_camera_fov = camera_fov; player->last_wanted_range = wanted_range; @@ -1321,6 +1367,19 @@ void Client::sendPlayerPos() Send(&pkt); } +void Client::sendHaveMedia(const std::vector<u32> &tokens) +{ + NetworkPacket pkt(TOSERVER_HAVE_MEDIA, 1 + tokens.size() * 4); + + sanity_check(tokens.size() < 256); + + pkt << static_cast<u8>(tokens.size()); + for (u32 token : tokens) + pkt << token; + + Send(&pkt); +} + void Client::removeNode(v3s16 p) { std::map<v3s16, MapBlock*> modified_blocks; @@ -1434,6 +1493,11 @@ bool Client::updateWieldedItem() return true; } +scene::ISceneManager* Client::getSceneManager() +{ + return m_rendering_engine->get_scene_manager(); +} + Inventory* Client::getInventory(const InventoryLocation &loc) { switch(loc.type){ @@ -1595,20 +1659,7 @@ void Client::addUpdateMeshTask(v3s16 p, bool ack_to_server, bool urgent) void Client::addUpdateMeshTaskWithEdge(v3s16 blockpos, bool ack_to_server, bool urgent) { - try{ - addUpdateMeshTask(blockpos, ack_to_server, urgent); - } - catch(InvalidPositionException &e){} - - // Leading edge - for (int i=0;i<6;i++) - { - try{ - v3s16 p = blockpos + g_6dirs[i]; - addUpdateMeshTask(p, false, urgent); - } - catch(InvalidPositionException &e){} - } + m_mesh_update_thread.updateBlock(&m_env.getMap(), blockpos, ack_to_server, urgent, true); } void Client::addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server, bool urgent) @@ -1620,38 +1671,16 @@ void Client::addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server, bool ur <<std::endl; } - v3s16 blockpos = getNodeBlockPos(nodepos); + v3s16 blockpos = getNodeBlockPos(nodepos); v3s16 blockpos_relative = blockpos * MAP_BLOCKSIZE; - - try{ - addUpdateMeshTask(blockpos, ack_to_server, urgent); - } - catch(InvalidPositionException &e) {} - + m_mesh_update_thread.updateBlock(&m_env.getMap(), blockpos, ack_to_server, urgent, false); // Leading edge - if(nodepos.X == blockpos_relative.X){ - try{ - v3s16 p = blockpos + v3s16(-1,0,0); - addUpdateMeshTask(p, false, urgent); - } - catch(InvalidPositionException &e){} - } - - if(nodepos.Y == blockpos_relative.Y){ - try{ - v3s16 p = blockpos + v3s16(0,-1,0); - addUpdateMeshTask(p, false, urgent); - } - catch(InvalidPositionException &e){} - } - - if(nodepos.Z == blockpos_relative.Z){ - try{ - v3s16 p = blockpos + v3s16(0,0,-1); - addUpdateMeshTask(p, false, urgent); - } - catch(InvalidPositionException &e){} - } + if (nodepos.X == blockpos_relative.X) + addUpdateMeshTask(blockpos + v3s16(-1, 0, 0), false, urgent); + if (nodepos.Y == blockpos_relative.Y) + addUpdateMeshTask(blockpos + v3s16(0, -1, 0), false, urgent); + if (nodepos.Z == blockpos_relative.Z) + addUpdateMeshTask(blockpos + v3s16(0, 0, -1), false, urgent); } ClientEvent *Client::getClientEvent() @@ -1664,11 +1693,6 @@ ClientEvent *Client::getClientEvent() return event; } -bool Client::connectedToServer() -{ - return m_con->Connected(); -} - const Address Client::getServerAddress() { return m_con->GetPeerAddress(PEER_ID_SERVER); @@ -1682,15 +1706,15 @@ float Client::mediaReceiveProgress() return 1.0; // downloader only exists when not yet done } -typedef struct TextureUpdateArgs { +struct TextureUpdateArgs { gui::IGUIEnvironment *guienv; u64 last_time_ms; u16 last_percent; const wchar_t* text_base; ITextureSource *tsrc; -} TextureUpdateArgs; +}; -void texture_update_progress(void *args, u32 progress, u32 max_progress) +void Client::showUpdateProgressTexture(void *args, u32 progress, u32 max_progress) { TextureUpdateArgs* targs = (TextureUpdateArgs*) args; u16 cur_percent = ceil(progress / (double) max_progress * 100.); @@ -1707,9 +1731,9 @@ void texture_update_progress(void *args, u32 progress, u32 max_progress) if (do_draw) { targs->last_time_ms = time_ms; - std::basic_stringstream<wchar_t> strm; - strm << targs->text_base << " " << targs->last_percent << "%..."; - RenderingEngine::draw_load_screen(strm.str(), targs->guienv, targs->tsrc, 0, + std::wostringstream strm; + strm << targs->text_base << L" " << targs->last_percent << L"%..."; + m_rendering_engine->draw_load_screen(strm.str(), targs->guienv, targs->tsrc, 0, 72 + (u16) ((18. / 100.) * (double) targs->last_percent), true); } } @@ -1730,21 +1754,21 @@ void Client::afterContentReceived() // Rebuild inherited images and recreate textures infostream<<"- Rebuilding images and textures"<<std::endl; - RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 70); + m_rendering_engine->draw_load_screen(text, guienv, m_tsrc, 0, 70); m_tsrc->rebuildImagesAndTextures(); delete[] text; // Rebuild shaders infostream<<"- Rebuilding shaders"<<std::endl; text = wgettext("Rebuilding shaders..."); - RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 71); + m_rendering_engine->draw_load_screen(text, guienv, m_tsrc, 0, 71); m_shsrc->rebuildShaders(); delete[] text; // Update node aliases infostream<<"- Updating node aliases"<<std::endl; text = wgettext("Initializing nodes..."); - RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 72); + m_rendering_engine->draw_load_screen(text, guienv, m_tsrc, 0, 72); m_nodedef->updateAliases(m_itemdef); for (const auto &path : getTextureDirs()) { TextureOverrideSource override_source(path + DIR_DELIM + "override.txt"); @@ -1761,9 +1785,9 @@ void Client::afterContentReceived() tu_args.guienv = guienv; tu_args.last_time_ms = porting::getTimeMs(); tu_args.last_percent = 0; - tu_args.text_base = wgettext("Initializing nodes"); + tu_args.text_base = wgettext("Initializing nodes"); tu_args.tsrc = m_tsrc; - m_nodedef->updateTextures(this, texture_update_progress, &tu_args); + m_nodedef->updateTextures(this, &tu_args); delete[] tu_args.text_base; // Start mesh update thread after setting up content definitions @@ -1777,7 +1801,7 @@ void Client::afterContentReceived() m_script->on_client_ready(m_env.getLocalPlayer()); text = wgettext("Done!"); - RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 100); + m_rendering_engine->draw_load_screen(text, guienv, m_tsrc, 0, 100); infostream<<"Client::afterContentReceived() done"<<std::endl; delete[] text; } @@ -1795,17 +1819,16 @@ float Client::getCurRate() void Client::makeScreenshot() { - irr::video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + irr::video::IVideoDriver *driver = m_rendering_engine->get_video_driver(); irr::video::IImage* const raw_image = driver->createScreenShot(); if (!raw_image) return; - time_t t = time(NULL); - struct tm *tm = localtime(&t); + const struct tm tm = mt_localtime(); char timetstamp_c[64]; - strftime(timetstamp_c, sizeof(timetstamp_c), "%Y%m%d_%H%M%S", tm); + strftime(timetstamp_c, sizeof(timetstamp_c), "%Y%m%d_%H%M%S", &tm); std::string screenshot_dir; @@ -1855,7 +1878,7 @@ void Client::makeScreenshot() sstr << "Failed to save screenshot '" << filename << "'"; } pushToChatQueue(new ChatMessage(CHATMESSAGE_TYPE_SYSTEM, - narrow_to_wide(sstr.str()))); + utf8_to_wide(sstr.str()))); infostream << sstr.str() << std::endl; image->drop(); } @@ -1937,16 +1960,17 @@ scene::IAnimatedMesh* Client::getMesh(const std::string &filename, bool cache) // Create the mesh, remove it from cache and return it // This allows unique vertex colors and other properties for each instance - Buffer<char> data_rw(data.c_str(), data.size()); // Const-incorrect Irrlicht - io::IReadFile *rfile = RenderingEngine::get_filesystem()->createMemoryReadFile( - *data_rw, data_rw.getSize(), filename.c_str()); + io::IReadFile *rfile = m_rendering_engine->get_filesystem()->createMemoryReadFile( + data.c_str(), data.size(), filename.c_str()); FATAL_ERROR_IF(!rfile, "Could not create/open RAM file"); - scene::IAnimatedMesh *mesh = RenderingEngine::get_scene_manager()->getMesh(rfile); + scene::IAnimatedMesh *mesh = m_rendering_engine->get_scene_manager()->getMesh(rfile); rfile->drop(); + if (!mesh) + return nullptr; mesh->grab(); if (!cache) - RenderingEngine::get_mesh_cache()->removeMesh(mesh); + m_rendering_engine->removeMesh(mesh); return mesh; } @@ -1983,16 +2007,8 @@ void Client::unregisterModStorage(const std::string &name) { std::unordered_map<std::string, ModMetadata *>::const_iterator it = m_mod_storages.find(name); - if (it != m_mod_storages.end()) { - // Save unconditionaly on unregistration - it->second->save(getModStoragePath()); + if (it != m_mod_storages.end()) m_mod_storages.erase(name); - } -} - -std::string Client::getModStoragePath() const -{ - return porting::path_user + DIR_DELIM + "client" + DIR_DELIM + "mod_storage"; } /* diff --git a/src/client/client.h b/src/client/client.h index 733634db1..bdcc2a3dd 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -37,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mesh_generator_thread.h" #include "network/address.h" #include "network/peerhandler.h" +#include "gameparams.h" #include <fstream> #define CLIENT_CHAT_MESSAGE_LIMIT_PER_10S 10.0f @@ -45,6 +46,7 @@ struct ClientEvent; struct MeshMakeData; struct ChatMessage; class MapBlockMesh; +class RenderingEngine; class IWritableTextureSource; class IWritableShaderSource; class IWritableItemDefManager; @@ -52,6 +54,7 @@ class ISoundManager; class NodeDefManager; //class IWritableCraftDefManager; class ClientMediaDownloader; +class SingleMediaDownloader; struct MapDrawControl; class ModChannelMgr; class MtEventManager; @@ -123,8 +126,10 @@ public: NodeDefManager *nodedef, ISoundManager *sound, MtEventManager *event, + RenderingEngine *rendering_engine, bool ipv6, - GameUI *game_ui + GameUI *game_ui, + ELoginRegister allow_login_or_register ); ~Client(); @@ -223,6 +228,8 @@ public: void handleCommand_CSMRestrictionFlags(NetworkPacket *pkt); void handleCommand_PlayerSpeed(NetworkPacket *pkt); void handleCommand_MediaPush(NetworkPacket *pkt); + void handleCommand_MinimapModes(NetworkPacket *pkt); + void handleCommand_SetLighting(NetworkPacket *pkt); void ProcessData(NetworkPacket *pkt); @@ -242,6 +249,7 @@ public: void sendDamage(u16 damage); void sendRespawn(); void sendReady(); + void sendHaveMedia(const std::vector<u32> &tokens); ClientEnvironment& getEnv() { return m_env; } ITextureSource *tsrc() { return getTextureSource(); } @@ -320,31 +328,33 @@ public: m_access_denied = true; m_access_denied_reason = reason; } + inline void setFatalError(const LuaError &e) + { + setFatalError(std::string("Lua: ") + e.what()); + } // Renaming accessDeniedReason to better name could be good as it's used to // disconnect client when CSM failed. const std::string &accessDeniedReason() const { return m_access_denied_reason; } - const bool itemdefReceived() const + bool itemdefReceived() const { return m_itemdef_received; } - const bool nodedefReceived() const + bool nodedefReceived() const { return m_nodedef_received; } - const bool mediaReceived() const + bool mediaReceived() const { return !m_media_downloader; } - const bool activeObjectsReceived() const + bool activeObjectsReceived() const { return m_activeobjects_received; } u16 getProtoVersion() { return m_proto_ver; } - bool connectedToServer(); - void confirmRegistration(); - bool m_is_registration_confirmation_state = false; bool m_simple_singleplayer_mode; float mediaReceiveProgress(); void afterContentReceived(); + void showUpdateProgressTexture(void *args, u32 progress, u32 max_progress); float getRTT(); float getCurRate(); @@ -353,6 +363,7 @@ public: void setCamera(Camera* camera) { m_camera = camera; } Camera* getCamera () { return m_camera; } + scene::ISceneManager *getSceneManager(); bool shouldShowMinimap() const; @@ -370,15 +381,19 @@ public: { return checkPrivilege(priv); } virtual scene::IAnimatedMesh* getMesh(const std::string &filename, bool cache = false); const std::string* getModFile(std::string filename); + ModMetadataDatabase *getModStorageDatabase() override { return m_mod_storage_database; } - std::string getModStoragePath() const override; bool registerModStorage(ModMetadata *meta) override; void unregisterModStorage(const std::string &name) override; + // Migrates away old files-based mod storage if necessary + void migrateModStorage(); + // The following set of functions is used by ClientMediaDownloader // Insert a media file appropriately into the appropriate manager bool loadMedia(const std::string &data, const std::string &filename, bool from_media_push = false); + // Send a request for conventional media transfer void request_media(const std::vector<std::string> &file_requests); @@ -392,7 +407,7 @@ public: } ClientScripting *getScript() { return m_script; } - const bool modsLoaded() const { return m_mods_loaded; } + bool modsLoaded() const { return m_mods_loaded; } void pushToEventQueue(ClientEvent *event); @@ -415,16 +430,6 @@ public: return m_csm_restriction_flags & flag; } - u32 getCSMNodeRangeLimit() const - { - return m_csm_restriction_noderange; - } - - inline std::unordered_map<u32, u32> &getHUDTranslationMap() - { - return m_hud_server_to_client; - } - bool joinModChannel(const std::string &channel) override; bool leaveModChannel(const std::string &channel) override; bool sendModChannelMessage(const std::string &channel, @@ -437,7 +442,6 @@ public: } private: void loadMods(); - bool checkBuiltinIntegrity(); // Virtual methods from con::PeerHandler void peerAdded(con::Peer *peer) override; @@ -456,7 +460,6 @@ private: static AuthMechanism choseAuthMech(const u32 mechs); void sendInit(const std::string &playerName); - void promptConfirmRegistration(AuthMechanism chosen_auth_mechanism); void startAuth(AuthMechanism chosen_auth_mechanism); void sendDeletedBlocks(std::vector<v3s16> &blocks); void sendGotBlocks(const std::vector<v3s16> &blocks); @@ -480,6 +483,7 @@ private: NodeDefManager *m_nodedef; ISoundManager *m_sound; MtEventManager *m_event; + RenderingEngine *m_rendering_engine; MeshUpdateThread m_mesh_update_thread; @@ -487,6 +491,7 @@ private: ParticleManager m_particle_manager; std::unique_ptr<con::Connection> m_con; std::string m_address_name; + ELoginRegister m_allow_login_or_register = ELoginRegister::Any; Camera *m_camera = nullptr; Minimap *m_minimap = nullptr; bool m_minimap_disabled_by_server = false; @@ -541,9 +546,13 @@ private: bool m_activeobjects_received = false; bool m_mods_loaded = false; + std::vector<std::string> m_remote_media_servers; + // Media downloader, only exists during init ClientMediaDownloader *m_media_downloader; // Set of media filenames pushed by server at runtime std::unordered_set<std::string> m_media_pushed_files; + // Pending downloads of dynamic media (key: token) + std::vector<std::pair<u32, std::shared_ptr<SingleMediaDownloader>>> m_pending_media_downloads; // time_of_day speed approximation for old protocol bool m_time_of_day_set = false; @@ -562,9 +571,6 @@ private: // Relation of client id to object id std::unordered_map<int, u16> m_sounds_to_objects; - // Map server hud ids to client hud ids - std::unordered_map<u32, u32> m_hud_server_to_client; - // Privileges std::unordered_set<std::string> m_privileges; @@ -587,8 +593,8 @@ private: // Client modding ClientScripting *m_script = nullptr; - bool m_modding_enabled; std::unordered_map<std::string, ModMetadata *> m_mod_storages; + ModMetadataDatabase *m_mod_storage_database = nullptr; float m_mod_storage_save_timer = 10.0f; std::vector<ModSpec> m_mods; StringMap m_mod_vfs; diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index 0b7e92325..d7b3c4950 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "shader.h" #include "content_cao.h" +#include "porting.h" #include <algorithm> #include "client/renderingengine.h" @@ -51,12 +52,8 @@ public: ~CAOShaderConstantSetter() override = default; - void onSetConstants(video::IMaterialRendererServices *services, - bool is_highlevel) override + void onSetConstants(video::IMaterialRendererServices *services) override { - if (!is_highlevel) - return; - // Ambient color video::SColorf emissive_color(m_emissive_color); @@ -183,86 +180,81 @@ void ClientEnvironment::step(float dtime) if(dtime > 0.5) dtime = 0.5; - f32 dtime_downcount = dtime; - /* Stuff that has a maximum time increment */ - u32 loopcount = 0; - do - { - loopcount++; + u32 steps = ceil(dtime / dtime_max_increment); + f32 dtime_part = dtime / steps; + for (; steps > 0; --steps) { + /* + Local player handling + */ - f32 dtime_part; - if(dtime_downcount > dtime_max_increment) - { - dtime_part = dtime_max_increment; - dtime_downcount -= dtime_part; - } - else - { - dtime_part = dtime_downcount; - /* - Setting this to 0 (no -=dtime_part) disables an infinite loop - when dtime_part is so small that dtime_downcount -= dtime_part - does nothing - */ - dtime_downcount = 0; + // Control local player + lplayer->applyControl(dtime_part, this); + + // Apply physics + if (!free_move) { + // Gravity + v3f speed = lplayer->getSpeed(); + if (!is_climbing && !lplayer->in_liquid) + speed.Y -= lplayer->movement_gravity * + lplayer->physics_override.gravity * dtime_part * 2.0f; + + // Liquid floating / sinking + if (!is_climbing && lplayer->in_liquid && + !lplayer->swimming_vertical && + !lplayer->swimming_pitch) + speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2.0f; + + // Movement resistance + if (lplayer->move_resistance > 0) { + // How much the node's move_resistance blocks movement, ranges + // between 0 and 1. Should match the scale at which liquid_viscosity + // increase affects other liquid attributes. + static const f32 resistance_factor = 0.3f; + + v3f d_wanted; + bool in_liquid_stable = lplayer->in_liquid_stable || lplayer->in_liquid; + if (in_liquid_stable) { + d_wanted = -speed / lplayer->movement_liquid_fluidity; + } else { + d_wanted = -speed / BS; + } + f32 dl = d_wanted.getLength(); + if (in_liquid_stable) { + if (dl > lplayer->movement_liquid_fluidity_smooth) + dl = lplayer->movement_liquid_fluidity_smooth; + } + + dl *= (lplayer->move_resistance * resistance_factor) + + (1 - resistance_factor); + v3f d = d_wanted.normalize() * (dl * dtime_part * 100.0f); + speed += d; + } + + lplayer->setSpeed(speed); } /* - Handle local player + Move the lplayer. + This also does collision detection. */ + lplayer->move(dtime_part, this, position_max_increment, + &player_collisions); + } - { - // Control local player - lplayer->applyControl(dtime_part, this); - - // Apply physics - if (!free_move && !is_climbing) { - // Gravity - v3f speed = lplayer->getSpeed(); - if (!lplayer->in_liquid) - speed.Y -= lplayer->movement_gravity * - lplayer->physics_override_gravity * dtime_part * 2.0f; - - // Liquid floating / sinking - if (lplayer->in_liquid && !lplayer->swimming_vertical && - !lplayer->swimming_pitch) - speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2.0f; - - // Liquid resistance - if (lplayer->in_liquid_stable || lplayer->in_liquid) { - // How much the node's viscosity blocks movement, ranges - // between 0 and 1. Should match the scale at which viscosity - // increase affects other liquid attributes. - static const f32 viscosity_factor = 0.3f; - - v3f d_wanted = -speed / lplayer->movement_liquid_fluidity; - f32 dl = d_wanted.getLength(); - if (dl > lplayer->movement_liquid_fluidity_smooth) - dl = lplayer->movement_liquid_fluidity_smooth; - - dl *= (lplayer->liquid_viscosity * viscosity_factor) + - (1 - viscosity_factor); - v3f d = d_wanted.normalize() * (dl * dtime_part * 100.0f); - speed += d; - } - - lplayer->setSpeed(speed); - } - - /* - Move the lplayer. - This also does collision detection. - */ - lplayer->move(dtime_part, this, position_max_increment, - &player_collisions); - } - } while (dtime_downcount > 0.001); - - bool player_immortal = lplayer->getCAO() && lplayer->getCAO()->isImmortal(); + bool player_immortal = false; + f32 player_fall_factor = 1.0f; + GenericCAO *playercao = lplayer->getCAO(); + if (playercao) { + player_immortal = playercao->isImmortal(); + int addp_p = itemgroup_get(playercao->getGroups(), + "fall_damage_add_percent"); + // convert armor group into an usable fall damage factor + player_fall_factor = 1.0f + (float)addp_p / 100.0f; + } for (const CollisionInfo &info : player_collisions) { v3f speed_diff = info.new_speed - info.old_speed;; @@ -275,17 +267,20 @@ void ClientEnvironment::step(float dtime) speed_diff.Z = 0; f32 pre_factor = 1; // 1 hp per node/s f32 tolerance = BS*14; // 5 without damage - f32 post_factor = 1; // 1 hp per node/s if (info.type == COLLISION_NODE) { const ContentFeatures &f = m_client->ndef()-> get(m_map->getNode(info.node_p)); - // Determine fall damage multiplier - int addp = itemgroup_get(f.groups, "fall_damage_add_percent"); - pre_factor = 1.0f + (float)addp / 100.0f; + // Determine fall damage modifier + int addp_n = itemgroup_get(f.groups, "fall_damage_add_percent"); + // convert node group to an usable fall damage factor + f32 node_fall_factor = 1.0f + (float)addp_n / 100.0f; + // combine both player fall damage modifiers + pre_factor = node_fall_factor * player_fall_factor; } float speed = pre_factor * speed_diff.getLength(); - if (speed > tolerance && !player_immortal) { - f32 damage_f = (speed - tolerance) / BS * post_factor; + + if (speed > tolerance && !player_immortal && pre_factor > 0.0f) { + f32 damage_f = (speed - tolerance) / BS; u16 damage = (u16)MYMIN(damage_f + 0.5, U16_MAX); if (damage != 0) { damageLocalPlayer(damage, true); @@ -311,6 +306,7 @@ void ClientEnvironment::step(float dtime) node_at_lplayer = m_map->getNode(p); u16 light = getInteriorLight(node_at_lplayer, 0, m_client->ndef()); + lplayer->light_color = encode_light(light, 0); // this transfers light.alpha final_color_blend(&lplayer->light_color, light, day_night_ratio); } @@ -361,35 +357,13 @@ GenericCAO* ClientEnvironment::getGenericCAO(u16 id) return NULL; } -bool isFreeClientActiveObjectId(const u16 id, - ClientActiveObjectMap &objects) -{ - return id != 0 && objects.find(id) == objects.end(); - -} - -u16 getFreeClientActiveObjectId(ClientActiveObjectMap &objects) -{ - // try to reuse id's as late as possible - static u16 last_used_id = 0; - u16 startid = last_used_id; - for(;;) { - last_used_id ++; - if (isFreeClientActiveObjectId(last_used_id, objects)) - return last_used_id; - - if (last_used_id == startid) - return 0; - } -} - u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) { // Register object. If failed return zero id if (!m_ao_manager.registerObject(object)) return 0; - object->addToScene(m_texturesource); + object->addToScene(m_texturesource, m_client->getSceneManager()); // Update lighting immediately object->updateLight(getDayNightRatio()); @@ -540,3 +514,8 @@ void ClientEnvironment::getSelectedActiveObjects( } } } + +void ClientEnvironment::updateFrameTime() +{ + m_frame_time = porting::getTimeMs(); +} diff --git a/src/client/clientenvironment.h b/src/client/clientenvironment.h index 864496a41..f737f33b4 100644 --- a/src/client/clientenvironment.h +++ b/src/client/clientenvironment.h @@ -141,6 +141,10 @@ public: void updateCameraOffset(const v3s16 &camera_offset) { m_camera_offset = camera_offset; } v3s16 getCameraOffset() const { return m_camera_offset; } + + void updateFrameTime(); + u64 getFrameTime() const { return m_frame_time; } + private: ClientMap *m_map; LocalPlayer *m_local_player = nullptr; @@ -153,4 +157,5 @@ private: IntervalLimiter m_active_object_light_update_interval; std::list<std::string> m_player_names; v3s16 m_camera_offset; + u64 m_frame_time; }; diff --git a/src/client/clientevent.h b/src/client/clientevent.h index 9bd31efce..243a94596 100644 --- a/src/client/clientevent.h +++ b/src/client/clientevent.h @@ -52,6 +52,31 @@ enum ClientEventType : u8 CLIENTEVENT_MAX, }; +struct ClientEventHudAdd +{ + u32 server_id; + u8 type; + v2f pos, scale; + std::string name; + std::string text, text2; + u32 number, item, dir, style; + v2f align, offset; + v3f world_pos; + v2s32 size; + s16 z_index; +}; + +struct ClientEventHudChange +{ + u32 id; + HudElementStat stat; + v2f v2fdata; + std::string sdata; + u32 data; + v3f v3fdata; + v2s32 v2s32data; +}; + struct ClientEvent { ClientEventType type; @@ -62,6 +87,7 @@ struct ClientEvent struct { u16 amount; + bool effect; } player_damage; struct { @@ -93,38 +119,12 @@ struct ClientEvent { u32 id; } delete_particlespawner; - struct - { - u32 server_id; - u8 type; - v2f *pos; - std::string *name; - v2f *scale; - std::string *text; - u32 number; - u32 item; - u32 dir; - v2f *align; - v2f *offset; - v3f *world_pos; - v2s32 *size; - s16 z_index; - std::string *text2; - } hudadd; + ClientEventHudAdd *hudadd; struct { u32 id; } hudrm; - struct - { - u32 id; - HudElementStat stat; - v2f *v2fdata; - std::string *sdata; - u32 data; - v3f *v3fdata; - v2s32 *v2s32data; - } hudchange; + ClientEventHudChange *hudchange; SkyboxParams *set_sky; struct { diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp index 29427f609..60c9525f3 100644 --- a/src/client/clientlauncher.cpp +++ b/src/client/clientlauncher.cpp @@ -38,9 +38,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #if USE_SOUND #include "sound_openal.h" #endif -#ifdef __ANDROID__ - #include "porting.h" -#endif /* mainmenumanager.h */ @@ -73,14 +70,14 @@ static void dump_start_data(const GameStartData &data) ClientLauncher::~ClientLauncher() { - delete receiver; - delete input; + delete receiver; + delete g_fontengine; delete g_gamecallback; - delete RenderingEngine::get_instance(); + delete m_rendering_engine; #if USE_SOUND g_sound_manager_singleton.reset(); @@ -99,10 +96,6 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) init_args(start_data, cmd_args); - // List video modes if requested - if (list_video_modes) - return RenderingEngine::print_video_modes(); - #if USE_SOUND if (g_settings->getBool("enable_sound")) g_sound_manager_singleton = createSoundManagerSingleton(); @@ -120,12 +113,12 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) return true; } - if (RenderingEngine::get_video_driver() == NULL) { + if (m_rendering_engine->get_video_driver() == NULL) { errorstream << "Could not initialize video driver." << std::endl; return false; } - RenderingEngine::get_instance()->setupTopLevelWindow(PROJECT_NAME_C); + m_rendering_engine->setupTopLevelWindow(PROJECT_NAME_C); /* This changes the minimum allowed number of vertices in a VBO. @@ -136,23 +129,23 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) // Create game callback for menus g_gamecallback = new MainGameCallback(); - RenderingEngine::get_instance()->setResizable(true); + m_rendering_engine->setResizable(true); init_input(); - RenderingEngine::get_scene_manager()->getParameters()-> + m_rendering_engine->get_scene_manager()->getParameters()-> setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); - guienv = RenderingEngine::get_gui_env(); - skin = RenderingEngine::get_gui_env()->getSkin(); + guienv = m_rendering_engine->get_gui_env(); + skin = guienv->getSkin(); skin->setColor(gui::EGDC_BUTTON_TEXT, video::SColor(255, 255, 255, 255)); skin->setColor(gui::EGDC_3D_LIGHT, video::SColor(0, 0, 0, 0)); skin->setColor(gui::EGDC_3D_HIGH_LIGHT, video::SColor(255, 30, 30, 30)); skin->setColor(gui::EGDC_3D_SHADOW, video::SColor(255, 0, 0, 0)); skin->setColor(gui::EGDC_HIGH_LIGHT, video::SColor(255, 70, 120, 50)); skin->setColor(gui::EGDC_HIGH_LIGHT_TEXT, video::SColor(255, 255, 255, 255)); -#ifdef __ANDROID__ - float density = porting::getDisplayDensity(); +#ifdef HAVE_TOUCHSCREENGUI + float density = RenderingEngine::getDisplayDensity(); skin->setSize(gui::EGDS_CHECK_BOX_WIDTH, (s32)(17.0f * density)); skin->setSize(gui::EGDS_SCROLLBAR_SIZE, (s32)(14.0f * density)); skin->setSize(gui::EGDS_WINDOW_BUTTON_WIDTH, (s32)(15.0f * density)); @@ -166,7 +159,7 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) sprite_path.append("checkbox_16.png"); // Texture dimensions should be a power of 2 gui::IGUISpriteBank *sprites = skin->getSpriteBank(); - video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + video::IVideoDriver *driver = m_rendering_engine->get_video_driver(); video::ITexture *sprite_texture = driver->getTexture(sprite_path.c_str()); if (sprite_texture) { s32 sprite_id = sprites->addTextureAsSprite(sprite_texture); @@ -175,18 +168,16 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) } } #endif - g_fontengine = new FontEngine(g_settings, guienv); + g_fontengine = new FontEngine(guienv); FATAL_ERROR_IF(g_fontengine == NULL, "Font engine creation failed."); -#if (IRRLICHT_VERSION_MAJOR >= 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR >= 2 // Irrlicht 1.8 input colours skin->setColor(gui::EGDC_EDITABLE, video::SColor(255, 128, 128, 128)); skin->setColor(gui::EGDC_FOCUSED_EDITABLE, video::SColor(255, 96, 134, 49)); -#endif // Create the menu clouds if (!g_menucloudsmgr) - g_menucloudsmgr = RenderingEngine::get_scene_manager()->createNewSceneManager(); + g_menucloudsmgr = m_rendering_engine->get_scene_manager()->createNewSceneManager(); if (!g_menuclouds) g_menuclouds = new Clouds(g_menucloudsmgr, -1, rand()); g_menuclouds->setHeight(100.0f); @@ -214,11 +205,11 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) bool retval = true; bool *kill = porting::signal_handler_killstatus(); - while (RenderingEngine::run() && !*kill && + while (m_rendering_engine->run() && !*kill && !g_gamecallback->shutdown_requested) { // Set the window caption const wchar_t *text = wgettext("Main Menu"); - RenderingEngine::get_raw_device()-> + m_rendering_engine->get_raw_device()-> setWindowCaption((utf8_to_wide(PROJECT_NAME_C) + L" " + utf8_to_wide(g_version_hash) + L" [" + text + L"]").c_str()); @@ -226,14 +217,14 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) try { // This is used for catching disconnects - RenderingEngine::get_gui_env()->clear(); + m_rendering_engine->get_gui_env()->clear(); /* We need some kind of a root node to be able to add custom gui elements directly on the screen. Otherwise they won't be automatically drawn. */ - guiroot = RenderingEngine::get_gui_env()->addStaticText(L"", + guiroot = m_rendering_engine->get_gui_env()->addStaticText(L"", core::rect<s32>(0, 0, 10000, 10000)); bool game_has_run = launch_game(error_message, reconnect_requested, @@ -256,36 +247,29 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) } // Break out of menu-game loop to shut down cleanly - if (!RenderingEngine::get_raw_device()->run() || *kill) { + if (!m_rendering_engine->run() || *kill) { if (!g_settings_path.empty()) g_settings->updateConfigFile(g_settings_path.c_str()); break; } - RenderingEngine::get_video_driver()->setTextureCreationFlag( + m_rendering_engine->get_video_driver()->setTextureCreationFlag( video::ETCF_CREATE_MIP_MAPS, g_settings->getBool("mip_map")); #ifdef HAVE_TOUCHSCREENGUI - receiver->m_touchscreengui = new TouchScreenGUI(RenderingEngine::get_raw_device(), receiver); + receiver->m_touchscreengui = new TouchScreenGUI(m_rendering_engine->get_raw_device(), receiver); g_touchscreengui = receiver->m_touchscreengui; #endif the_game( kill, input, + m_rendering_engine, start_data, error_message, chat_backend, &reconnect_requested ); - RenderingEngine::get_scene_manager()->clear(); - -#ifdef HAVE_TOUCHSCREENGUI - delete g_touchscreengui; - g_touchscreengui = NULL; - receiver->m_touchscreengui = NULL; -#endif - } //try catch (con::PeerNotFoundException &e) { error_message = gettext("Connection error (timed out?)"); @@ -301,6 +285,14 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) } #endif + m_rendering_engine->get_scene_manager()->clear(); + +#ifdef HAVE_TOUCHSCREENGUI + delete g_touchscreengui; + g_touchscreengui = NULL; + receiver->m_touchscreengui = NULL; +#endif + // If no main menu, show error and exit if (skip_main_menu) { if (!error_message.empty()) { @@ -337,8 +329,6 @@ void ClientLauncher::init_args(GameStartData &start_data, const Settings &cmd_ar if (cmd_args.exists("name")) start_data.name = cmd_args.get("name"); - list_video_modes = cmd_args.getFlag("videomodes"); - random_input = g_settings->getBool("random_input") || cmd_args.getFlag("random-input"); } @@ -346,8 +336,8 @@ void ClientLauncher::init_args(GameStartData &start_data, const Settings &cmd_ar bool ClientLauncher::init_engine() { receiver = new MyEventReceiver(); - new RenderingEngine(receiver); - return RenderingEngine::get_raw_device() != nullptr; + m_rendering_engine = new RenderingEngine(receiver); + return m_rendering_engine->get_raw_device() != nullptr; } void ClientLauncher::init_input() @@ -364,7 +354,7 @@ void ClientLauncher::init_input() // Make sure this is called maximum once per // irrlicht device, otherwise it will give you // multiple events for the same joystick. - if (RenderingEngine::get_raw_device()->activateJoysticks(infos)) { + if (m_rendering_engine->get_raw_device()->activateJoysticks(infos)) { infostream << "Joystick support enabled" << std::endl; joystick_infos.reserve(infos.size()); for (u32 i = 0; i < infos.size(); i++) { @@ -461,6 +451,7 @@ bool ClientLauncher::launch_game(std::string &error_message, start_data.name = menudata.name; start_data.password = menudata.password; start_data.address = std::move(menudata.address); + start_data.allow_login_or_register = menudata.allow_login_or_register; server_name = menudata.servername; server_description = menudata.serverdescription; @@ -471,7 +462,7 @@ bool ClientLauncher::launch_game(std::string &error_message, start_data.address.empty() && !start_data.name.empty(); } - if (!RenderingEngine::run()) + if (!m_rendering_engine->run()) return false; if (!start_data.isSinglePlayer() && start_data.name.empty()) { @@ -487,14 +478,6 @@ bool ClientLauncher::launch_game(std::string &error_message, start_data.socket_port = myrand_range(49152, 65535); } else { g_settings->set("name", start_data.name); - if (!start_data.address.empty()) { - ServerListSpec server; - server["name"] = server_name; - server["address"] = start_data.address; - server["port"] = itos(start_data.socket_port); - server["description"] = server_description; - ServerList::insert(server); - } } if (start_data.name.length() > PLAYERNAME_SIZE - 1) { @@ -527,8 +510,8 @@ bool ClientLauncher::launch_game(std::string &error_message, // Load gamespec for required game start_data.game_spec = findWorldSubgame(worldspec.path); if (!start_data.game_spec.isValid()) { - error_message = gettext("Could not find or load game \"") - + worldspec.gameid + "\""; + error_message = gettext("Could not find or load game: ") + + worldspec.gameid; errorstream << error_message << std::endl; return false; } @@ -551,14 +534,14 @@ bool ClientLauncher::launch_game(std::string &error_message, void ClientLauncher::main_menu(MainMenuData *menudata) { bool *kill = porting::signal_handler_killstatus(); - video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + video::IVideoDriver *driver = m_rendering_engine->get_video_driver(); infostream << "Waiting for other menus" << std::endl; - while (RenderingEngine::get_raw_device()->run() && !*kill) { + while (m_rendering_engine->run() && !*kill) { if (!isMenuActive()) break; driver->beginScene(true, true, video::SColor(255, 128, 128, 128)); - RenderingEngine::get_gui_env()->drawAll(); + m_rendering_engine->get_gui_env()->drawAll(); driver->endScene(); // On some computers framerate doesn't seem to be automatically limited sleep_ms(25); @@ -567,14 +550,14 @@ void ClientLauncher::main_menu(MainMenuData *menudata) // Cursor can be non-visible when coming from the game #ifndef ANDROID - RenderingEngine::get_raw_device()->getCursorControl()->setVisible(true); + m_rendering_engine->get_raw_device()->getCursorControl()->setVisible(true); #endif /* show main menu */ - GUIEngine mymenu(&input->joystick, guiroot, &g_menumgr, menudata, *kill); + GUIEngine mymenu(&input->joystick, guiroot, m_rendering_engine, &g_menumgr, menudata, *kill); /* leave scene manager in a clean state */ - RenderingEngine::get_scene_manager()->clear(); + m_rendering_engine->get_scene_manager()->clear(); } void ClientLauncher::speed_tests() @@ -582,6 +565,8 @@ void ClientLauncher::speed_tests() // volatile to avoid some potential compiler optimisations volatile static s16 temp16; volatile static f32 tempf; + // Silence compiler warning + (void)temp16; static v3f tempv3f1; static v3f tempv3f2; static std::string tempstring; diff --git a/src/client/clientlauncher.h b/src/client/clientlauncher.h index b280d8e6b..d1fd9a258 100644 --- a/src/client/clientlauncher.h +++ b/src/client/clientlauncher.h @@ -46,9 +46,9 @@ private: void speed_tests(); - bool list_video_modes = false; bool skip_main_menu = false; bool random_input = false; + RenderingEngine *m_rendering_engine = nullptr; InputHandler *input = nullptr; MyEventReceiver *receiver = nullptr; gui::IGUISkin *skin = nullptr; diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp index 3e4ab2e94..6764cf3ed 100644 --- a/src/client/clientmap.cpp +++ b/src/client/clientmap.cpp @@ -31,17 +31,57 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <algorithm> #include "client/renderingengine.h" +// struct MeshBufListList +void MeshBufListList::clear() +{ + for (auto &list : lists) + list.clear(); +} + +void MeshBufListList::add(scene::IMeshBuffer *buf, v3s16 position, u8 layer) +{ + // Append to the correct layer + std::vector<MeshBufList> &list = lists[layer]; + const video::SMaterial &m = buf->getMaterial(); + for (MeshBufList &l : list) { + // comparing a full material is quite expensive so we don't do it if + // not even first texture is equal + if (l.m.TextureLayer[0].Texture != m.TextureLayer[0].Texture) + continue; + + if (l.m == m) { + l.bufs.emplace_back(position, buf); + return; + } + } + MeshBufList l; + l.m = m; + l.bufs.emplace_back(position, buf); + list.emplace_back(l); +} + +// ClientMap + ClientMap::ClientMap( Client *client, + RenderingEngine *rendering_engine, MapDrawControl &control, s32 id ): - Map(dout_client, client), - scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(), - RenderingEngine::get_scene_manager(), id), + Map(client), + scene::ISceneNode(rendering_engine->get_scene_manager()->getRootSceneNode(), + rendering_engine->get_scene_manager(), id), m_client(client), - m_control(control) + m_rendering_engine(rendering_engine), + m_control(control), + m_drawlist(MapBlockComparer(v3s16(0,0,0))) { + + /* + * @Liso: Sadly C++ doesn't have introspection, so the only way we have to know + * the class is whith a name ;) Name property cames from ISceneNode base class. + */ + Name = "ClientMap"; m_box = aabb3f(-BS*1000000,-BS*1000000,-BS*1000000, BS*1000000,BS*1000000,BS*1000000); @@ -57,9 +97,32 @@ ClientMap::ClientMap( m_cache_trilinear_filter = g_settings->getBool("trilinear_filter"); m_cache_bilinear_filter = g_settings->getBool("bilinear_filter"); m_cache_anistropic_filter = g_settings->getBool("anisotropic_filter"); + m_cache_transparency_sorting_distance = g_settings->getU16("transparency_sorting_distance"); } +void ClientMap::updateCamera(v3f pos, v3f dir, f32 fov, v3s16 offset) +{ + v3s16 previous_node = floatToInt(m_camera_position, BS) + m_camera_offset; + v3s16 previous_block = getContainerPos(previous_node, MAP_BLOCKSIZE); + + m_camera_position = pos; + m_camera_direction = dir; + m_camera_fov = fov; + m_camera_offset = offset; + + v3s16 current_node = floatToInt(m_camera_position, BS) + m_camera_offset; + v3s16 current_block = getContainerPos(current_node, MAP_BLOCKSIZE); + + // reorder the blocks when camera crosses block boundary + if (previous_block != current_block) + m_needs_update_drawlist = true; + + // reorder transparent meshes when camera crosses node boundary + if (previous_node != current_node) + m_needs_update_transparent_meshes = true; +} + MapSector * ClientMap::emergeSector(v2s16 p2d) { // Check that it doesn't exist already @@ -83,12 +146,21 @@ void ClientMap::OnRegisterSceneNode() } ISceneNode::OnRegisterSceneNode(); + + if (!m_added_to_shadow_renderer) { + m_added_to_shadow_renderer = true; + if (auto shadows = m_rendering_engine->get_shadow_renderer()) + shadows->addNodeToShadowList(this); + } } void ClientMap::getBlocksInViewRange(v3s16 cam_pos_nodes, - v3s16 *p_blocks_min, v3s16 *p_blocks_max) + v3s16 *p_blocks_min, v3s16 *p_blocks_max, float range) { - v3s16 box_nodes_d = m_control.wanted_range * v3s16(1, 1, 1); + if (range <= 0.0f) + range = m_control.wanted_range; + + v3s16 box_nodes_d = range * v3s16(1, 1, 1); // Define p_nodes_min/max as v3s32 because 'cam_pos_nodes -/+ box_nodes_d' // can exceed the range of v3s16 when a large view range is used near the // world edges. @@ -116,41 +188,48 @@ void ClientMap::updateDrawList() { ScopeProfiler sp(g_profiler, "CM::updateDrawList()", SPT_AVG); + m_needs_update_drawlist = false; + for (auto &i : m_drawlist) { MapBlock *block = i.second; block->refDrop(); } m_drawlist.clear(); - v3f camera_position = m_camera_position; - v3f camera_direction = m_camera_direction; - f32 camera_fov = m_camera_fov; + const v3f camera_position = m_camera_position; + const v3f camera_direction = m_camera_direction; // Use a higher fov to accomodate faster camera movements. // Blocks are cropped better when they are drawn. - // Or maybe they aren't? Well whatever. - camera_fov *= 1.2; + const f32 camera_fov = m_camera_fov * 1.1f; v3s16 cam_pos_nodes = floatToInt(camera_position, BS); + v3s16 p_blocks_min; v3s16 p_blocks_max; getBlocksInViewRange(cam_pos_nodes, &p_blocks_min, &p_blocks_max); + // Read the vision range, unless unlimited range is enabled. + float range = m_control.range_all ? 1e7 : m_control.wanted_range; + + // Number of blocks currently loaded by the client + u32 blocks_loaded = 0; // Number of blocks with mesh in rendering range u32 blocks_in_range_with_mesh = 0; // Number of blocks occlusion culled u32 blocks_occlusion_culled = 0; - // No occlusion culling when free_move is on and camera is - // inside ground + // No occlusion culling when free_move is on and camera is inside ground bool occlusion_culling_enabled = true; - if (g_settings->getBool("free_move") && g_settings->getBool("noclip")) { + if (m_control.allow_noclip) { MapNode n = getNode(cam_pos_nodes); - if (n.getContent() == CONTENT_IGNORE || - m_nodedef->get(n).solidness == 2) + if (n.getContent() == CONTENT_IGNORE || m_nodedef->get(n).solidness == 2) occlusion_culling_enabled = false; } + v3s16 camera_block = getContainerPos(cam_pos_nodes, MAP_BLOCKSIZE); + m_drawlist = std::map<v3s16, MapBlock*, MapBlockComparer>(MapBlockComparer(camera_block)); + // Uncomment to debug occluded blocks in the wireframe mode // TODO: Include this as a flag for an extended debugging setting //if (occlusion_culling_enabled && m_control.show_wireframe) @@ -160,6 +239,7 @@ void ClientMap::updateDrawList() MapSector *sector = sector_it.second; v2s16 sp = sector->getPos(); + blocks_loaded += sector->size(); if (!m_control.range_all) { if (sp.X < p_blocks_min.X || sp.X > p_blocks_max.X || sp.Y < p_blocks_min.Z || sp.Y > p_blocks_max.Z) @@ -181,42 +261,39 @@ void ClientMap::updateDrawList() if not seen on display */ - if (block->mesh) - block->mesh->updateCameraOffset(m_camera_offset); - - float range = 100000 * BS; - if (!m_control.range_all) - range = m_control.wanted_range * BS; - - float d = 0.0; - if (!isBlockInSight(block->getPos(), camera_position, - camera_direction, camera_fov, range, &d)) + if (!block->mesh) { + // Ignore if mesh doesn't exist continue; + } + v3s16 block_coord = block->getPos(); + v3s16 block_position = block->getPosRelative() + MAP_BLOCKSIZE / 2; - /* - Ignore if mesh doesn't exist - */ - if (!block->mesh) - continue; + // First, perform a simple distance check, with a padding of one extra block. + if (!m_control.range_all && + block_position.getDistanceFrom(cam_pos_nodes) > range + MAP_BLOCKSIZE) + continue; // Out of range, skip. + // Keep the block alive as long as it is in range. + block->resetUsageTimer(); blocks_in_range_with_mesh++; - /* - Occlusion culling - */ + // Frustum culling + float d = 0.0; + if (!isBlockInSight(block_coord, camera_position, + camera_direction, camera_fov, range * BS, &d)) + continue; + + // Occlusion culling if ((!m_control.range_all && d > m_control.wanted_range * BS) || (occlusion_culling_enabled && isBlockOccluded(block, cam_pos_nodes))) { blocks_occlusion_culled++; continue; } - // This block is in range. Reset usage timer. - block->resetUsageTimer(); - // Add to set block->refGrab(); - m_drawlist[block->getPos()] = block; + m_drawlist[block_coord] = block; sector_blocks_drawn++; } // foreach sectorblocks @@ -228,52 +305,9 @@ void ClientMap::updateDrawList() g_profiler->avg("MapBlock meshes in range [#]", blocks_in_range_with_mesh); g_profiler->avg("MapBlocks occlusion culled [#]", blocks_occlusion_culled); g_profiler->avg("MapBlocks drawn [#]", m_drawlist.size()); + g_profiler->avg("MapBlocks loaded [#]", blocks_loaded); } -struct MeshBufList -{ - video::SMaterial m; - std::vector<scene::IMeshBuffer*> bufs; -}; - -struct MeshBufListList -{ - /*! - * Stores the mesh buffers of the world. - * The array index is the material's layer. - * The vector part groups vertices by material. - */ - std::vector<MeshBufList> lists[MAX_TILE_LAYERS]; - - void clear() - { - for (auto &list : lists) - list.clear(); - } - - void add(scene::IMeshBuffer *buf, u8 layer) - { - // Append to the correct layer - std::vector<MeshBufList> &list = lists[layer]; - const video::SMaterial &m = buf->getMaterial(); - for (MeshBufList &l : list) { - // comparing a full material is quite expensive so we don't do it if - // not even first texture is equal - if (l.m.TextureLayer[0].Texture != m.TextureLayer[0].Texture) - continue; - - if (l.m == m) { - l.bufs.push_back(buf); - return; - } - } - MeshBufList l; - l.m = m; - l.bufs.push_back(buf); - list.push_back(l); - } -}; - void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) { bool is_transparent_pass = pass == scene::ESNRP_TRANSPARENT; @@ -293,45 +327,51 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) /* Get animation parameters */ - float animation_time = m_client->getAnimationTime(); - int crack = m_client->getCrackLevel(); - u32 daynight_ratio = m_client->getEnv().getDayNightRatio(); + const float animation_time = m_client->getAnimationTime(); + const int crack = m_client->getCrackLevel(); + const u32 daynight_ratio = m_client->getEnv().getDayNightRatio(); - v3f camera_position = m_camera_position; - v3f camera_direction = m_camera_direction; - f32 camera_fov = m_camera_fov; + const v3f camera_position = m_camera_position; /* Get all blocks and draw all visible ones */ u32 vertex_count = 0; + u32 drawcall_count = 0; // For limiting number of mesh animations per frame u32 mesh_animate_count = 0; //u32 mesh_animate_count_far = 0; + /* + Update transparent meshes + */ + if (is_transparent_pass) + updateTransparentMeshBuffers(); + /* Draw the selected MapBlocks */ - MeshBufListList drawbufs; + MeshBufListList grouped_buffers; + std::vector<DrawDescriptor> draw_order; + video::SMaterial previous_material; for (auto &i : m_drawlist) { + v3s16 block_pos = i.first; MapBlock *block = i.second; // If the mesh of the block happened to get deleted, ignore it if (!block->mesh) continue; - float d = 0.0; - if (!isBlockInSight(block->getPos(), camera_position, - camera_direction, camera_fov, 100000 * BS, &d)) - continue; + v3f block_pos_r = intToFloat(block->getPosRelative() + MAP_BLOCKSIZE / 2, BS); + float d = camera_position.getDistanceFrom(block_pos_r); + d = MYMAX(0,d - BLOCK_MAX_RADIUS); // Mesh animation if (pass == scene::ESNRP_SOLID) { - //MutexAutoLock lock(block->mesh_mutex); MapBlockMesh *mapBlockMesh = block->mesh; assert(mapBlockMesh); // Pretty random but this should work somewhat nicely @@ -351,9 +391,15 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) /* Get the meshbuffers of the block */ - { - //MutexAutoLock lock(block->mesh_mutex); - + if (is_transparent_pass) { + // In transparent pass, the mesh will give us + // the partial buffers in the correct order + for (auto &buffer : block->mesh->getTransparentBuffers()) + draw_order.emplace_back(block_pos, &buffer); + } + else { + // otherwise, group buffers across meshes + // using MeshBufListList MapBlockMesh *mapBlockMesh = block->mesh; assert(mapBlockMesh); @@ -367,48 +413,82 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) video::SMaterial& material = buf->getMaterial(); video::IMaterialRenderer* rnd = - driver->getMaterialRenderer(material.MaterialType); + driver->getMaterialRenderer(material.MaterialType); bool transparent = (rnd && rnd->isTransparent()); - if (transparent == is_transparent_pass) { + if (!transparent) { if (buf->getVertexCount() == 0) errorstream << "Block [" << analyze_block(block) - << "] contains an empty meshbuf" << std::endl; + << "] contains an empty meshbuf" << std::endl; - material.setFlag(video::EMF_TRILINEAR_FILTER, - m_cache_trilinear_filter); - material.setFlag(video::EMF_BILINEAR_FILTER, - m_cache_bilinear_filter); - material.setFlag(video::EMF_ANISOTROPIC_FILTER, - m_cache_anistropic_filter); - material.setFlag(video::EMF_WIREFRAME, - m_control.show_wireframe); - - drawbufs.add(buf, layer); + grouped_buffers.add(buf, block_pos, layer); } } } } } - TimeTaker draw("Drawing mesh buffers"); - - // Render all layers in order - for (auto &lists : drawbufs.lists) { + // Capture draw order for all solid meshes + for (auto &lists : grouped_buffers.lists) { for (MeshBufList &list : lists) { - // Check and abort if the machine is swapping a lot - if (draw.getTimerTime() > 2000) { - infostream << "ClientMap::renderMap(): Rendering took >2s, " << - "returning." << std::endl; - return; - } - driver->setMaterial(list.m); - - for (scene::IMeshBuffer *buf : list.bufs) { - driver->drawMeshBuffer(buf); - vertex_count += buf->getVertexCount(); + // iterate in reverse to draw closest blocks first + for (auto it = list.bufs.rbegin(); it != list.bufs.rend(); ++it) { + draw_order.emplace_back(it->first, it->second, it != list.bufs.rbegin()); } } } + + TimeTaker draw("Drawing mesh buffers"); + + core::matrix4 m; // Model matrix + v3f offset = intToFloat(m_camera_offset, BS); + u32 material_swaps = 0; + + // Render all mesh buffers in order + drawcall_count += draw_order.size(); + + for (auto &descriptor : draw_order) { + scene::IMeshBuffer *buf = descriptor.getBuffer(); + + if (!descriptor.m_reuse_material) { + auto &material = buf->getMaterial(); + + // Apply filter settings + material.setFlag(video::EMF_TRILINEAR_FILTER, + m_cache_trilinear_filter); + material.setFlag(video::EMF_BILINEAR_FILTER, + m_cache_bilinear_filter); + material.setFlag(video::EMF_ANISOTROPIC_FILTER, + m_cache_anistropic_filter); + material.setFlag(video::EMF_WIREFRAME, + m_control.show_wireframe); + + // pass the shadow map texture to the buffer texture + ShadowRenderer *shadow = m_rendering_engine->get_shadow_renderer(); + if (shadow && shadow->is_active()) { + auto &layer = material.TextureLayer[ShadowRenderer::TEXTURE_LAYER_SHADOW]; + layer.Texture = shadow->get_texture(); + layer.TextureWrapU = video::E_TEXTURE_CLAMP::ETC_CLAMP_TO_EDGE; + layer.TextureWrapV = video::E_TEXTURE_CLAMP::ETC_CLAMP_TO_EDGE; + // Do not enable filter on shadow texture to avoid visual artifacts + // with colored shadows. + // Filtering is done in shader code anyway + layer.BilinearFilter = false; + layer.AnisotropicFilter = false; + layer.TrilinearFilter = false; + } + driver->setMaterial(material); + ++material_swaps; + material.TextureLayer[ShadowRenderer::TEXTURE_LAYER_SHADOW].Texture = nullptr; + } + + v3f block_wpos = intToFloat(descriptor.m_pos * MAP_BLOCKSIZE, BS); + m.setTranslation(block_wpos - offset); + + driver->setTransform(video::ETS_WORLD, m); + descriptor.draw(driver); + vertex_count += buf->getIndexCount(); + } + g_profiler->avg(prefix + "draw meshes [ms]", draw.stop(true)); // Log only on solid pass because values are the same @@ -416,7 +496,13 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) g_profiler->avg("renderMap(): animated meshes [#]", mesh_animate_count); } + if (pass == scene::ESNRP_TRANSPARENT) { + g_profiler->avg("renderMap(): transparent buffers [#]", draw_order.size()); + } + g_profiler->avg(prefix + "vertices drawn [#]", vertex_count); + g_profiler->avg(prefix + "drawcalls [#]", drawcall_count); + g_profiler->avg(prefix + "material swaps [#]", material_swaps); } static bool getVisibleBrightness(Map *map, const v3f &p0, v3f dir, float step, @@ -499,12 +585,12 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, static v3f z_directions[50] = { v3f(-100, 0, 0) }; - static f32 z_offsets[sizeof(z_directions)/sizeof(*z_directions)] = { + static f32 z_offsets[50] = { -1000, }; - if(z_directions[0].X < -99){ - for(u32 i=0; i<sizeof(z_directions)/sizeof(*z_directions); i++){ + if (z_directions[0].X < -99) { + for (u32 i = 0; i < ARRLEN(z_directions); i++) { // Assumes FOV of 72 and 16/9 aspect ratio z_directions[i] = v3f( 0.02 * myrand_range(-100, 100), @@ -520,7 +606,8 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor, if(sunlight_min_d > 35*BS) sunlight_min_d = 35*BS; std::vector<int> values; - for(u32 i=0; i<sizeof(z_directions)/sizeof(*z_directions); i++){ + values.reserve(ARRLEN(z_directions)); + for (u32 i = 0; i < ARRLEN(z_directions); i++) { v3f z_dir = z_directions[i]; core::CMatrix4<f32> a; a.buildRotateFromTo(v3f(0,1,0), z_dir); @@ -583,19 +670,17 @@ void ClientMap::renderPostFx(CameraMode cam_mode) MapNode n = getNode(floatToInt(m_camera_position, BS)); - // - If the player is in a solid node, make everything black. - // - If the player is in liquid, draw a semi-transparent overlay. - // - Do not if player is in third person mode const ContentFeatures& features = m_nodedef->get(n); video::SColor post_effect_color = features.post_effect_color; - if(features.solidness == 2 && !(g_settings->getBool("noclip") && - m_client->checkLocalPrivilege("noclip")) && - cam_mode == CAMERA_MODE_FIRST) - { + + // If the camera is in a solid node, make everything black. + // (first person mode only) + if (features.solidness == 2 && cam_mode == CAMERA_MODE_FIRST && + !m_control.allow_noclip) { post_effect_color = video::SColor(255, 0, 0, 0); } - if (post_effect_color.getAlpha() != 0) - { + + if (post_effect_color.getAlpha() != 0) { // Draw a full-screen rectangle video::IVideoDriver* driver = SceneManager->getVideoDriver(); v2u32 ss = driver->getScreenSize(); @@ -609,4 +694,257 @@ void ClientMap::PrintInfo(std::ostream &out) out<<"ClientMap: "; } +void ClientMap::renderMapShadows(video::IVideoDriver *driver, + const video::SMaterial &material, s32 pass, int frame, int total_frames) +{ + bool is_transparent_pass = pass != scene::ESNRP_SOLID; + std::string prefix; + if (is_transparent_pass) + prefix = "renderMap(SHADOW TRANS): "; + else + prefix = "renderMap(SHADOW SOLID): "; + u32 drawcall_count = 0; + u32 vertex_count = 0; + + MeshBufListList grouped_buffers; + std::vector<DrawDescriptor> draw_order; + + + int count = 0; + int low_bound = is_transparent_pass ? 0 : m_drawlist_shadow.size() / total_frames * frame; + int high_bound = is_transparent_pass ? m_drawlist_shadow.size() : m_drawlist_shadow.size() / total_frames * (frame + 1); + + // transparent pass should be rendered in one go + if (is_transparent_pass && frame != total_frames - 1) { + return; + } + + for (auto &i : m_drawlist_shadow) { + // only process specific part of the list & break early + ++count; + if (count <= low_bound) + continue; + if (count > high_bound) + break; + + v3s16 block_pos = i.first; + MapBlock *block = i.second; + + // If the mesh of the block happened to get deleted, ignore it + if (!block->mesh) + continue; + + /* + Get the meshbuffers of the block + */ + if (is_transparent_pass) { + // In transparent pass, the mesh will give us + // the partial buffers in the correct order + for (auto &buffer : block->mesh->getTransparentBuffers()) + draw_order.emplace_back(block_pos, &buffer); + } + else { + // otherwise, group buffers across meshes + // using MeshBufListList + MapBlockMesh *mapBlockMesh = block->mesh; + assert(mapBlockMesh); + + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + scene::IMesh *mesh = mapBlockMesh->getMesh(layer); + assert(mesh); + + u32 c = mesh->getMeshBufferCount(); + for (u32 i = 0; i < c; i++) { + scene::IMeshBuffer *buf = mesh->getMeshBuffer(i); + + video::SMaterial &mat = buf->getMaterial(); + auto rnd = driver->getMaterialRenderer(mat.MaterialType); + bool transparent = rnd && rnd->isTransparent(); + if (!transparent) + grouped_buffers.add(buf, block_pos, layer); + } + } + } + } + + u32 buffer_count = 0; + for (auto &lists : grouped_buffers.lists) + for (MeshBufList &list : lists) + buffer_count += list.bufs.size(); + + draw_order.reserve(draw_order.size() + buffer_count); + + // Capture draw order for all solid meshes + for (auto &lists : grouped_buffers.lists) { + for (MeshBufList &list : lists) { + // iterate in reverse to draw closest blocks first + for (auto it = list.bufs.rbegin(); it != list.bufs.rend(); ++it) + draw_order.emplace_back(it->first, it->second, it != list.bufs.rbegin()); + } + } + + TimeTaker draw("Drawing shadow mesh buffers"); + + core::matrix4 m; // Model matrix + v3f offset = intToFloat(m_camera_offset, BS); + u32 material_swaps = 0; + + // Render all mesh buffers in order + drawcall_count += draw_order.size(); + + for (auto &descriptor : draw_order) { + scene::IMeshBuffer *buf = descriptor.getBuffer(); + + if (!descriptor.m_reuse_material) { + // override some material properties + video::SMaterial local_material = buf->getMaterial(); + local_material.MaterialType = material.MaterialType; + local_material.BackfaceCulling = material.BackfaceCulling; + local_material.FrontfaceCulling = material.FrontfaceCulling; + local_material.BlendOperation = material.BlendOperation; + local_material.Lighting = false; + driver->setMaterial(local_material); + ++material_swaps; + } + + v3f block_wpos = intToFloat(descriptor.m_pos * MAP_BLOCKSIZE, BS); + m.setTranslation(block_wpos - offset); + + driver->setTransform(video::ETS_WORLD, m); + descriptor.draw(driver); + vertex_count += buf->getIndexCount(); + } + + // restore the driver material state + video::SMaterial clean; + clean.BlendOperation = video::EBO_ADD; + driver->setMaterial(clean); // reset material to defaults + driver->draw3DLine(v3f(), v3f(), video::SColor(0)); + + g_profiler->avg(prefix + "draw meshes [ms]", draw.stop(true)); + g_profiler->avg(prefix + "vertices drawn [#]", vertex_count); + g_profiler->avg(prefix + "drawcalls [#]", drawcall_count); + g_profiler->avg(prefix + "material swaps [#]", material_swaps); +} + +/* + Custom update draw list for the pov of shadow light. +*/ +void ClientMap::updateDrawListShadow(v3f shadow_light_pos, v3f shadow_light_dir, float radius, float length) +{ + ScopeProfiler sp(g_profiler, "CM::updateDrawListShadow()", SPT_AVG); + + v3s16 cam_pos_nodes = floatToInt(shadow_light_pos, BS); + v3s16 p_blocks_min; + v3s16 p_blocks_max; + getBlocksInViewRange(cam_pos_nodes, &p_blocks_min, &p_blocks_max, radius + length); + + std::vector<v2s16> blocks_in_range; + + for (auto &i : m_drawlist_shadow) { + MapBlock *block = i.second; + block->refDrop(); + } + m_drawlist_shadow.clear(); + + // Number of blocks currently loaded by the client + u32 blocks_loaded = 0; + // Number of blocks with mesh in rendering range + u32 blocks_in_range_with_mesh = 0; + // Number of blocks occlusion culled + u32 blocks_occlusion_culled = 0; + + for (auto §or_it : m_sectors) { + MapSector *sector = sector_it.second; + if (!sector) + continue; + blocks_loaded += sector->size(); + + MapBlockVect sectorblocks; + sector->getBlocks(sectorblocks); + + /* + Loop through blocks in sector + */ + for (MapBlock *block : sectorblocks) { + if (!block->mesh) { + // Ignore if mesh doesn't exist + continue; + } + + v3f block_pos = intToFloat(block->getPos() * MAP_BLOCKSIZE, BS); + v3f projection = shadow_light_pos + shadow_light_dir * shadow_light_dir.dotProduct(block_pos - shadow_light_pos); + if (projection.getDistanceFrom(block_pos) > radius) + continue; + + blocks_in_range_with_mesh++; + + // This block is in range. Reset usage timer. + block->resetUsageTimer(); + + // Add to set + if (m_drawlist_shadow.find(block->getPos()) == m_drawlist_shadow.end()) { + block->refGrab(); + m_drawlist_shadow[block->getPos()] = block; + } + } + } + + g_profiler->avg("SHADOW MapBlock meshes in range [#]", blocks_in_range_with_mesh); + g_profiler->avg("SHADOW MapBlocks occlusion culled [#]", blocks_occlusion_culled); + g_profiler->avg("SHADOW MapBlocks drawn [#]", m_drawlist_shadow.size()); + g_profiler->avg("SHADOW MapBlocks loaded [#]", blocks_loaded); +} + +void ClientMap::updateTransparentMeshBuffers() +{ + ScopeProfiler sp(g_profiler, "CM::updateTransparentMeshBuffers", SPT_AVG); + u32 sorted_blocks = 0; + u32 unsorted_blocks = 0; + f32 sorting_distance_sq = pow(m_cache_transparency_sorting_distance * BS, 2.0f); + + + // Update the order of transparent mesh buffers in each mesh + for (auto it = m_drawlist.begin(); it != m_drawlist.end(); it++) { + MapBlock* block = it->second; + if (!block->mesh) + continue; + + if (m_needs_update_transparent_meshes || + block->mesh->getTransparentBuffers().size() == 0) { + + v3s16 block_pos = block->getPos(); + v3f block_pos_f = intToFloat(block_pos * MAP_BLOCKSIZE + MAP_BLOCKSIZE / 2, BS); + f32 distance = m_camera_position.getDistanceFromSQ(block_pos_f); + if (distance <= sorting_distance_sq) { + block->mesh->updateTransparentBuffers(m_camera_position, block_pos); + ++sorted_blocks; + } + else { + block->mesh->consolidateTransparentBuffers(); + ++unsorted_blocks; + } + } + } + + g_profiler->avg("CM::Transparent Buffers - Sorted", sorted_blocks); + g_profiler->avg("CM::Transparent Buffers - Unsorted", unsorted_blocks); + m_needs_update_transparent_meshes = false; +} + +scene::IMeshBuffer* ClientMap::DrawDescriptor::getBuffer() +{ + return m_use_partial_buffer ? m_partial_buffer->getBuffer() : m_buffer; +} + +void ClientMap::DrawDescriptor::draw(video::IVideoDriver* driver) +{ + if (m_use_partial_buffer) { + m_partial_buffer->beforeDraw(); + driver->drawMeshBuffer(m_partial_buffer->getBuffer()); + m_partial_buffer->afterDraw(); + } else { + driver->drawMeshBuffer(m_buffer); + } +} diff --git a/src/client/clientmap.h b/src/client/clientmap.h index 172e3a1d6..8c45b5382 100644 --- a/src/client/clientmap.h +++ b/src/client/clientmap.h @@ -27,16 +27,38 @@ with this program; if not, write to the Free Software Foundation, Inc., struct MapDrawControl { - // Overrides limits by drawing everything - bool range_all = false; // Wanted drawing range float wanted_range = 0.0f; + // Overrides limits by drawing everything + bool range_all = false; + // Allow rendering out of bounds + bool allow_noclip = false; // show a wire frame for debugging bool show_wireframe = false; }; +struct MeshBufList +{ + video::SMaterial m; + std::vector<std::pair<v3s16,scene::IMeshBuffer*>> bufs; +}; + +struct MeshBufListList +{ + /*! + * Stores the mesh buffers of the world. + * The array index is the material's layer. + * The vector part groups vertices by material. + */ + std::vector<MeshBufList> lists[MAX_TILE_LAYERS]; + + void clear(); + void add(scene::IMeshBuffer *buf, v3s16 position, u8 layer); +}; + class Client; class ITextureSource; +class PartialMeshBuffer; /* ClientMap @@ -49,72 +71,118 @@ class ClientMap : public Map, public scene::ISceneNode public: ClientMap( Client *client, + RenderingEngine *rendering_engine, MapDrawControl &control, s32 id ); virtual ~ClientMap() = default; - s32 mapType() const + bool maySaveBlocks() override { - return MAPTYPE_CLIENT; + return false; } - void drop() + void drop() override { - ISceneNode::drop(); + ISceneNode::drop(); // calls destructor } - void updateCamera(const v3f &pos, const v3f &dir, f32 fov, const v3s16 &offset) - { - m_camera_position = pos; - m_camera_direction = dir; - m_camera_fov = fov; - m_camera_offset = offset; - } + void updateCamera(v3f pos, v3f dir, f32 fov, v3s16 offset); /* Forcefully get a sector from somewhere */ - MapSector * emergeSector(v2s16 p); - - //void deSerializeSector(v2s16 p2d, std::istream &is); + MapSector * emergeSector(v2s16 p) override; /* ISceneNode methods */ - virtual void OnRegisterSceneNode(); + virtual void OnRegisterSceneNode() override; - virtual void render() + virtual void render() override { video::IVideoDriver* driver = SceneManager->getVideoDriver(); driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); renderMap(driver, SceneManager->getSceneNodeRenderPass()); } - virtual const aabb3f &getBoundingBox() const + virtual const aabb3f &getBoundingBox() const override { return m_box; } void getBlocksInViewRange(v3s16 cam_pos_nodes, - v3s16 *p_blocks_min, v3s16 *p_blocks_max); + v3s16 *p_blocks_min, v3s16 *p_blocks_max, float range=-1.0f); void updateDrawList(); + void updateDrawListShadow(v3f shadow_light_pos, v3f shadow_light_dir, float radius, float length); + // Returns true if draw list needs updating before drawing the next frame. + bool needsUpdateDrawList() { return m_needs_update_drawlist; } void renderMap(video::IVideoDriver* driver, s32 pass); + void renderMapShadows(video::IVideoDriver *driver, + const video::SMaterial &material, s32 pass, int frame, int total_frames); + int getBackgroundBrightness(float max_d, u32 daylight_factor, int oldvalue, bool *sunlight_seen_result); void renderPostFx(CameraMode cam_mode); // For debug printing - virtual void PrintInfo(std::ostream &out); + void PrintInfo(std::ostream &out) override; const MapDrawControl & getControl() const { return m_control; } + f32 getWantedRange() const { return m_control.wanted_range; } f32 getCameraFov() const { return m_camera_fov; } + private: + + // update the vertex order in transparent mesh buffers + void updateTransparentMeshBuffers(); + + // Orders blocks by distance to the camera + class MapBlockComparer + { + public: + MapBlockComparer(const v3s16 &camera_block) : m_camera_block(camera_block) {} + + bool operator() (const v3s16 &left, const v3s16 &right) const + { + auto distance_left = left.getDistanceFromSQ(m_camera_block); + auto distance_right = right.getDistanceFromSQ(m_camera_block); + return distance_left > distance_right || (distance_left == distance_right && left > right); + } + + private: + v3s16 m_camera_block; + }; + + + // reference to a mesh buffer used when rendering the map. + struct DrawDescriptor { + v3s16 m_pos; + union { + scene::IMeshBuffer *m_buffer; + const PartialMeshBuffer *m_partial_buffer; + }; + bool m_reuse_material:1; + bool m_use_partial_buffer:1; + + DrawDescriptor(v3s16 pos, scene::IMeshBuffer *buffer, bool reuse_material) : + m_pos(pos), m_buffer(buffer), m_reuse_material(reuse_material), m_use_partial_buffer(false) + {} + + DrawDescriptor(v3s16 pos, const PartialMeshBuffer *buffer) : + m_pos(pos), m_partial_buffer(buffer), m_reuse_material(false), m_use_partial_buffer(true) + {} + + scene::IMeshBuffer* getBuffer(); + void draw(video::IVideoDriver* driver); + }; + Client *m_client; + RenderingEngine *m_rendering_engine; aabb3f m_box = aabb3f(-BS * 1000000, -BS * 1000000, -BS * 1000000, BS * 1000000, BS * 1000000, BS * 1000000); @@ -125,12 +193,17 @@ private: v3f m_camera_direction = v3f(0,0,1); f32 m_camera_fov = M_PI; v3s16 m_camera_offset; + bool m_needs_update_transparent_meshes = true; - std::map<v3s16, MapBlock*> m_drawlist; + std::map<v3s16, MapBlock*, MapBlockComparer> m_drawlist; + std::map<v3s16, MapBlock*> m_drawlist_shadow; + bool m_needs_update_drawlist; std::set<v2s16> m_last_drawn_sectors; bool m_cache_trilinear_filter; bool m_cache_bilinear_filter; bool m_cache_anistropic_filter; + bool m_added_to_shadow_renderer{false}; + u16 m_cache_transparency_sorting_distance; }; diff --git a/src/client/clientmedia.cpp b/src/client/clientmedia.cpp index c4c08c05d..6c5d4a8bf 100644 --- a/src/client/clientmedia.cpp +++ b/src/client/clientmedia.cpp @@ -49,7 +49,6 @@ bool clientMediaUpdateCache(const std::string &raw_hash, const std::string &file */ ClientMediaDownloader::ClientMediaDownloader(): - m_media_cache(getMediaCacheDir()), m_httpfetch_caller(HTTPFETCH_DISCARD) { } @@ -66,6 +65,12 @@ ClientMediaDownloader::~ClientMediaDownloader() delete remote; } +bool ClientMediaDownloader::loadMedia(Client *client, const std::string &data, + const std::string &name) +{ + return client->loadMedia(data, name); +} + void ClientMediaDownloader::addFile(const std::string &name, const std::string &sha1) { assert(!m_initial_step_done); // pre-condition @@ -105,7 +110,7 @@ void ClientMediaDownloader::addRemoteServer(const std::string &baseurl) { assert(!m_initial_step_done); // pre-condition - #ifdef USE_CURL +#ifdef USE_CURL if (g_settings->getBool("enable_remote_media_server")) { infostream << "Client: Adding remote server \"" @@ -117,13 +122,13 @@ void ClientMediaDownloader::addRemoteServer(const std::string &baseurl) m_remotes.push_back(remote); } - #else +#else infostream << "Client: Ignoring remote server \"" << baseurl << "\" because cURL support is not compiled in" << std::endl; - #endif +#endif } void ClientMediaDownloader::step(Client *client) @@ -172,36 +177,21 @@ void ClientMediaDownloader::initialStep(Client *client) // Check media cache m_uncached_count = m_files.size(); for (auto &file_it : m_files) { - std::string name = file_it.first; + const std::string &name = file_it.first; FileStatus *filestatus = file_it.second; const std::string &sha1 = filestatus->sha1; - std::ostringstream tmp_os(std::ios_base::binary); - bool found_in_cache = m_media_cache.load(hex_encode(sha1), tmp_os); - - // If found in cache, try to load it from there - if (found_in_cache) { - bool success = checkAndLoad(name, sha1, - tmp_os.str(), true, client); - if (success) { - filestatus->received = true; - m_uncached_count--; - } + if (tryLoadFromCache(name, sha1, client)) { + filestatus->received = true; + m_uncached_count--; } } assert(m_uncached_received_count == 0); // Create the media cache dir if we are likely to write to it - if (m_uncached_count != 0) { - bool did = fs::CreateAllDirs(getMediaCacheDir()); - if (!did) { - errorstream << "Client: " - << "Could not create media cache directory: " - << getMediaCacheDir() - << std::endl; - } - } + if (m_uncached_count != 0) + createCacheDirs(); // If we found all files in the cache, report this fact to the server. // If the server reported no remote servers, immediately start @@ -216,7 +206,6 @@ void ClientMediaDownloader::initialStep(Client *client) // This is the first time we use httpfetch, so alloc a caller ID m_httpfetch_caller = httpfetch_caller_alloc(); - m_httpfetch_timeout = g_settings->getS32("curl_timeout"); // Set the active fetch limit to curl_parallel_limit or 84, // whichever is greater. This gives us some leeway so that @@ -258,8 +247,6 @@ void ClientMediaDownloader::initialStep(Client *client) remote->baseurl + MTHASHSET_FILE_NAME; fetch_request.caller = m_httpfetch_caller; fetch_request.request_id = m_httpfetch_next_id; // == i - fetch_request.timeout = m_httpfetch_timeout; - fetch_request.connect_timeout = m_httpfetch_timeout; fetch_request.method = HTTP_POST; fetch_request.raw_data = required_hash_set; fetch_request.extra_headers.emplace_back( @@ -304,8 +291,7 @@ void ClientMediaDownloader::remoteHashSetReceived( // available on this server, add this server // to the available_remotes array - for(std::map<std::string, FileStatus*>::iterator - it = m_files.upper_bound(m_name_bound); + for(auto it = m_files.upper_bound(m_name_bound); it != m_files.end(); ++it) { FileStatus *f = it->second; if (!f->received && sha1_set.count(f->sha1)) @@ -331,8 +317,7 @@ void ClientMediaDownloader::remoteMediaReceived( std::string name; { - std::unordered_map<unsigned long, std::string>::iterator it = - m_remote_file_transfers.find(fetch_result.request_id); + auto it = m_remote_file_transfers.find(fetch_result.request_id); assert(it != m_remote_file_transfers.end()); name = it->second; m_remote_file_transfers.erase(it); @@ -401,8 +386,7 @@ void ClientMediaDownloader::startRemoteMediaTransfers() { bool changing_name_bound = true; - for (std::map<std::string, FileStatus*>::iterator - files_iter = m_files.upper_bound(m_name_bound); + for (auto files_iter = m_files.upper_bound(m_name_bound); files_iter != m_files.end(); ++files_iter) { // Abort if active fetch limit is exceeded @@ -432,9 +416,8 @@ void ClientMediaDownloader::startRemoteMediaTransfers() fetch_request.url = url; fetch_request.caller = m_httpfetch_caller; fetch_request.request_id = m_httpfetch_next_id; - fetch_request.timeout = 0; // no data timeout! - fetch_request.connect_timeout = - m_httpfetch_timeout; + fetch_request.timeout = + g_settings->getS32("curl_file_download_timeout"); httpfetch_async(fetch_request); m_remote_file_transfers.insert(std::make_pair( @@ -481,19 +464,18 @@ void ClientMediaDownloader::startConventionalTransfers(Client *client) } } -void ClientMediaDownloader::conventionalTransferDone( +bool ClientMediaDownloader::conventionalTransferDone( const std::string &name, const std::string &data, Client *client) { // Check that file was announced - std::map<std::string, FileStatus*>::iterator - file_iter = m_files.find(name); + auto file_iter = m_files.find(name); if (file_iter == m_files.end()) { errorstream << "Client: server sent media file that was" << "not announced, ignoring it: \"" << name << "\"" << std::endl; - return; + return false; } FileStatus *filestatus = file_iter->second; assert(filestatus != NULL); @@ -503,7 +485,7 @@ void ClientMediaDownloader::conventionalTransferDone( errorstream << "Client: server sent media file that we already" << "received, ignoring it: \"" << name << "\"" << std::endl; - return; + return true; } // Mark file as received, regardless of whether loading it works and @@ -516,9 +498,45 @@ void ClientMediaDownloader::conventionalTransferDone( // Check that received file matches announced checksum // If so, load it checkAndLoad(name, filestatus->sha1, data, false, client); + + return true; } -bool ClientMediaDownloader::checkAndLoad( +/* + IClientMediaDownloader +*/ + +IClientMediaDownloader::IClientMediaDownloader(): + m_media_cache(getMediaCacheDir()), m_write_to_cache(true) +{ +} + +void IClientMediaDownloader::createCacheDirs() +{ + if (!m_write_to_cache) + return; + + std::string path = getMediaCacheDir(); + if (!fs::CreateAllDirs(path)) { + errorstream << "Client: Could not create media cache directory: " + << path << std::endl; + } +} + +bool IClientMediaDownloader::tryLoadFromCache(const std::string &name, + const std::string &sha1, Client *client) +{ + std::ostringstream tmp_os(std::ios_base::binary); + bool found_in_cache = m_media_cache.load(hex_encode(sha1), tmp_os); + + // If found in cache, try to load it from there + if (found_in_cache) + return checkAndLoad(name, sha1, tmp_os.str(), true, client); + + return false; +} + +bool IClientMediaDownloader::checkAndLoad( const std::string &name, const std::string &sha1, const std::string &data, bool is_from_cache, Client *client) { @@ -548,7 +566,7 @@ bool ClientMediaDownloader::checkAndLoad( } // Checksum is ok, try loading the file - bool success = client->loadMedia(data, name); + bool success = loadMedia(client, data, name); if (!success) { infostream << "Client: " << "Failed to load " << cached_or_received << " media: " @@ -563,7 +581,7 @@ bool ClientMediaDownloader::checkAndLoad( << std::endl; // Update cache (unless we just loaded the file from the cache) - if (!is_from_cache) + if (!is_from_cache && m_write_to_cache) m_media_cache.update(sha1_hex, data); return true; @@ -591,12 +609,10 @@ std::string ClientMediaDownloader::serializeRequiredHashSet() // Write list of hashes of files that have not been // received (found in cache) yet - for (std::map<std::string, FileStatus*>::iterator - it = m_files.begin(); - it != m_files.end(); ++it) { - if (!it->second->received) { - FATAL_ERROR_IF(it->second->sha1.size() != 20, "Invalid SHA1 size"); - os << it->second->sha1; + for (const auto &it : m_files) { + if (!it.second->received) { + FATAL_ERROR_IF(it.second->sha1.size() != 20, "Invalid SHA1 size"); + os << it.second->sha1; } } @@ -632,3 +648,145 @@ void ClientMediaDownloader::deSerializeHashSet(const std::string &data, result.insert(data.substr(pos, 20)); } } + +/* + SingleMediaDownloader +*/ + +SingleMediaDownloader::SingleMediaDownloader(bool write_to_cache): + m_httpfetch_caller(HTTPFETCH_DISCARD) +{ + m_write_to_cache = write_to_cache; +} + +SingleMediaDownloader::~SingleMediaDownloader() +{ + if (m_httpfetch_caller != HTTPFETCH_DISCARD) + httpfetch_caller_free(m_httpfetch_caller); +} + +bool SingleMediaDownloader::loadMedia(Client *client, const std::string &data, + const std::string &name) +{ + return client->loadMedia(data, name, true); +} + +void SingleMediaDownloader::addFile(const std::string &name, const std::string &sha1) +{ + assert(m_stage == STAGE_INIT); // pre-condition + + assert(!name.empty()); + assert(sha1.size() == 20); + + FATAL_ERROR_IF(!m_file_name.empty(), "Cannot add a second file"); + m_file_name = name; + m_file_sha1 = sha1; +} + +void SingleMediaDownloader::addRemoteServer(const std::string &baseurl) +{ + assert(m_stage == STAGE_INIT); // pre-condition + + if (g_settings->getBool("enable_remote_media_server")) + m_remotes.emplace_back(baseurl); +} + +void SingleMediaDownloader::step(Client *client) +{ + if (m_stage == STAGE_INIT) { + m_stage = STAGE_CACHE_CHECKED; + initialStep(client); + } + + // Remote media: check for completion of fetches + if (m_httpfetch_caller != HTTPFETCH_DISCARD) { + HTTPFetchResult fetch_result; + while (httpfetch_async_get(m_httpfetch_caller, fetch_result)) { + remoteMediaReceived(fetch_result, client); + } + } +} + +bool SingleMediaDownloader::conventionalTransferDone(const std::string &name, + const std::string &data, Client *client) +{ + if (name != m_file_name) + return false; + + // Mark file as received unconditionally and try to load it + m_stage = STAGE_DONE; + checkAndLoad(name, m_file_sha1, data, false, client); + return true; +} + +void SingleMediaDownloader::initialStep(Client *client) +{ + if (tryLoadFromCache(m_file_name, m_file_sha1, client)) + m_stage = STAGE_DONE; + if (isDone()) + return; + + createCacheDirs(); + + // If the server reported no remote servers, immediately fall back to + // conventional transfer. + if (!USE_CURL || m_remotes.empty()) { + startConventionalTransfer(client); + } else { + // Otherwise start by requesting the file from the first remote media server + m_httpfetch_caller = httpfetch_caller_alloc(); + m_current_remote = 0; + startRemoteMediaTransfer(); + } +} + +void SingleMediaDownloader::remoteMediaReceived( + const HTTPFetchResult &fetch_result, Client *client) +{ + sanity_check(!isDone()); + sanity_check(m_current_remote >= 0); + + // If fetch succeeded, try to load it + if (fetch_result.succeeded) { + bool success = checkAndLoad(m_file_name, m_file_sha1, + fetch_result.data, false, client); + if (success) { + m_stage = STAGE_DONE; + return; + } + } + + // Otherwise try the next remote server or fall back to conventional transfer + m_current_remote++; + if (m_current_remote >= (int)m_remotes.size()) { + infostream << "Client: Failed to remote-fetch \"" << m_file_name + << "\". Requesting it the usual way." << std::endl; + m_current_remote = -1; + startConventionalTransfer(client); + } else { + startRemoteMediaTransfer(); + } +} + +void SingleMediaDownloader::startRemoteMediaTransfer() +{ + std::string url = m_remotes.at(m_current_remote) + hex_encode(m_file_sha1); + verbosestream << "Client: Requesting remote media file " + << "\"" << m_file_name << "\" " << "\"" << url << "\"" << std::endl; + + HTTPFetchRequest fetch_request; + fetch_request.url = url; + fetch_request.caller = m_httpfetch_caller; + fetch_request.request_id = m_httpfetch_next_id; + fetch_request.timeout = g_settings->getS32("curl_file_download_timeout"); + httpfetch_async(fetch_request); + + m_httpfetch_next_id++; +} + +void SingleMediaDownloader::startConventionalTransfer(Client *client) +{ + std::vector<std::string> requests; + requests.emplace_back(m_file_name); + client->request_media(requests); +} diff --git a/src/client/clientmedia.h b/src/client/clientmedia.h index 5a918535b..c297d737f 100644 --- a/src/client/clientmedia.h +++ b/src/client/clientmedia.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" #include "filecache.h" +#include "util/basic_macros.h" #include <ostream> #include <map> #include <set> @@ -38,7 +39,62 @@ struct HTTPFetchResult; bool clientMediaUpdateCache(const std::string &raw_hash, const std::string &filedata); -class ClientMediaDownloader +// more of a base class than an interface but this name was most convenient... +class IClientMediaDownloader +{ +public: + DISABLE_CLASS_COPY(IClientMediaDownloader) + + virtual bool isStarted() const = 0; + + // If this returns true, the downloader is done and can be deleted + virtual bool isDone() const = 0; + + // Add a file to the list of required file (but don't fetch it yet) + virtual void addFile(const std::string &name, const std::string &sha1) = 0; + + // Add a remote server to the list; ignored if not built with cURL + virtual void addRemoteServer(const std::string &baseurl) = 0; + + // Steps the media downloader: + // - May load media into client by calling client->loadMedia() + // - May check media cache for files + // - May add files to media cache + // - May start remote transfers by calling httpfetch_async + // - May check for completion of current remote transfers + // - May start conventional transfers by calling client->request_media() + // - May inform server that all media has been loaded + // by calling client->received_media() + // After step has been called once, don't call addFile/addRemoteServer. + virtual void step(Client *client) = 0; + + // Must be called for each file received through TOCLIENT_MEDIA + // returns true if this file belongs to this downloader + virtual bool conventionalTransferDone(const std::string &name, + const std::string &data, Client *client) = 0; + +protected: + IClientMediaDownloader(); + virtual ~IClientMediaDownloader() = default; + + // Forwards the call to the appropriate Client method + virtual bool loadMedia(Client *client, const std::string &data, + const std::string &name) = 0; + + void createCacheDirs(); + + bool tryLoadFromCache(const std::string &name, const std::string &sha1, + Client *client); + + bool checkAndLoad(const std::string &name, const std::string &sha1, + const std::string &data, bool is_from_cache, Client *client); + + // Filesystem-based media cache + FileCache m_media_cache; + bool m_write_to_cache; +}; + +class ClientMediaDownloader : public IClientMediaDownloader { public: ClientMediaDownloader(); @@ -52,39 +108,29 @@ public: return 0.0f; } - bool isStarted() const { + bool isStarted() const override { return m_initial_step_done; } - // If this returns true, the downloader is done and can be deleted - bool isDone() const { + bool isDone() const override { return m_initial_step_done && m_uncached_received_count == m_uncached_count; } - // Add a file to the list of required file (but don't fetch it yet) - void addFile(const std::string &name, const std::string &sha1); + void addFile(const std::string &name, const std::string &sha1) override; - // Add a remote server to the list; ignored if not built with cURL - void addRemoteServer(const std::string &baseurl); + void addRemoteServer(const std::string &baseurl) override; - // Steps the media downloader: - // - May load media into client by calling client->loadMedia() - // - May check media cache for files - // - May add files to media cache - // - May start remote transfers by calling httpfetch_async - // - May check for completion of current remote transfers - // - May start conventional transfers by calling client->request_media() - // - May inform server that all media has been loaded - // by calling client->received_media() - // After step has been called once, don't call addFile/addRemoteServer. - void step(Client *client); + void step(Client *client) override; - // Must be called for each file received through TOCLIENT_MEDIA - void conventionalTransferDone( + bool conventionalTransferDone( const std::string &name, const std::string &data, - Client *client); + Client *client) override; + +protected: + bool loadMedia(Client *client, const std::string &data, + const std::string &name) override; private: struct FileStatus { @@ -107,13 +153,9 @@ private: void startRemoteMediaTransfers(); void startConventionalTransfers(Client *client); - bool checkAndLoad(const std::string &name, const std::string &sha1, - const std::string &data, bool is_from_cache, - Client *client); - - std::string serializeRequiredHashSet(); static void deSerializeHashSet(const std::string &data, std::set<std::string> &result); + std::string serializeRequiredHashSet(); // Maps filename to file status std::map<std::string, FileStatus*> m_files; @@ -121,9 +163,6 @@ private: // Array of remote media servers std::vector<RemoteServerStatus*> m_remotes; - // Filesystem-based media cache - FileCache m_media_cache; - // Has an attempt been made to load media files from the file cache? // Have hash sets been requested from remote servers? bool m_initial_step_done = false; @@ -135,13 +174,12 @@ private: s32 m_uncached_received_count = 0; // Status of remote transfers - unsigned long m_httpfetch_caller; - unsigned long m_httpfetch_next_id = 0; - long m_httpfetch_timeout = 0; + u64 m_httpfetch_caller; + u64 m_httpfetch_next_id = 0; s32 m_httpfetch_active = 0; s32 m_httpfetch_active_limit = 0; s32 m_outstanding_hash_sets = 0; - std::unordered_map<unsigned long, std::string> m_remote_file_transfers; + std::unordered_map<u64, std::string> m_remote_file_transfers; // All files up to this name have either been received from a // remote server or failed on all remote servers, so those files @@ -150,3 +188,63 @@ private: std::string m_name_bound = ""; }; + +// A media downloader that only downloads a single file. +// It does/doesn't do several things the normal downloader does: +// - won't fetch hash sets from remote servers +// - will mark loaded media as coming from file push +// - writing to file cache is optional +class SingleMediaDownloader : public IClientMediaDownloader +{ +public: + SingleMediaDownloader(bool write_to_cache); + ~SingleMediaDownloader(); + + bool isStarted() const override { + return m_stage > STAGE_INIT; + } + + bool isDone() const override { + return m_stage >= STAGE_DONE; + } + + void addFile(const std::string &name, const std::string &sha1) override; + + void addRemoteServer(const std::string &baseurl) override; + + void step(Client *client) override; + + bool conventionalTransferDone(const std::string &name, + const std::string &data, Client *client) override; + +protected: + bool loadMedia(Client *client, const std::string &data, + const std::string &name) override; + +private: + void initialStep(Client *client); + void remoteMediaReceived(const HTTPFetchResult &fetch_result, Client *client); + void startRemoteMediaTransfer(); + void startConventionalTransfer(Client *client); + + enum Stage { + STAGE_INIT, + STAGE_CACHE_CHECKED, // we have tried to load the file from cache + STAGE_DONE + }; + + // Information about the one file we want to fetch + std::string m_file_name; + std::string m_file_sha1; + s32 m_current_remote; + + // Array of remote media servers + std::vector<std::string> m_remotes; + + enum Stage m_stage = STAGE_INIT; + + // Status of remote transfers + unsigned long m_httpfetch_caller; + unsigned long m_httpfetch_next_id = 0; + +}; diff --git a/src/client/clientobject.h b/src/client/clientobject.h index ecd8059ef..b192f0dcd 100644 --- a/src/client/clientobject.h +++ b/src/client/clientobject.h @@ -39,7 +39,7 @@ public: ClientActiveObject(u16 id, Client *client, ClientEnvironment *env); virtual ~ClientActiveObject(); - virtual void addToScene(ITextureSource *tsrc) {} + virtual void addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) = 0; virtual void removeFromScene(bool permanent) {} virtual void updateLight(u32 day_night_ratio) {} diff --git a/src/client/clouds.cpp b/src/client/clouds.cpp index 887a62f25..c84c03034 100644 --- a/src/client/clouds.cpp +++ b/src/client/clouds.cpp @@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., // Menu clouds are created later class Clouds; Clouds *g_menuclouds = NULL; -irr::scene::ISceneManager *g_menucloudsmgr = NULL; +scene::ISceneManager *g_menucloudsmgr = NULL; // Constant for now static constexpr const float cloud_size = BS * 64.0f; @@ -170,8 +170,9 @@ void Clouds::render() // Read noise - bool *grid = new bool[m_cloud_radius_i * 2 * m_cloud_radius_i * 2]; - + std::vector<bool> grid(m_cloud_radius_i * 2 * m_cloud_radius_i * 2); + std::vector<video::S3DVertex> vertices; + vertices.reserve(16 * m_cloud_radius_i * m_cloud_radius_i); for(s16 zi = -m_cloud_radius_i; zi < m_cloud_radius_i; zi++) { u32 si = (zi + m_cloud_radius_i) * m_cloud_radius_i * 2 + m_cloud_radius_i; @@ -195,12 +196,7 @@ void Clouds::render() { s16 zi = zi0; s16 xi = xi0; - // Draw from front to back (needed for transparency) - /*if(zi <= 0) - zi = -m_cloud_radius_i - zi; - if(xi <= 0) - xi = -m_cloud_radius_i - xi;*/ - // Draw from back to front + // Draw from back to front for proper transparency if(zi >= 0) zi = m_cloud_radius_i - zi - 1; if(xi >= 0) @@ -220,17 +216,10 @@ void Clouds::render() video::S3DVertex(0,0,0, 0,0,0, c_top, 0, 0) }; - /*if(zi <= 0 && xi <= 0){ - v[0].Color.setBlue(255); - v[1].Color.setBlue(255); - v[2].Color.setBlue(255); - v[3].Color.setBlue(255); - }*/ - - f32 rx = cloud_size / 2.0f; + const f32 rx = cloud_size / 2.0f; // if clouds are flat, the top layer should be at the given height - f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f; - f32 rz = cloud_size / 2; + const f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f; + const f32 rz = cloud_size / 2; for(int i=0; i<num_faces_to_draw; i++) { @@ -320,15 +309,25 @@ void Clouds::render() v3f pos(p0.X, m_params.height * BS, p0.Y); pos -= intToFloat(m_camera_offset, BS); - for (video::S3DVertex &vertex : v) + for (video::S3DVertex &vertex : v) { vertex.Pos += pos; - u16 indices[] = {0,1,2,2,3,0}; - driver->drawVertexPrimitiveList(v, 4, indices, 2, - video::EVT_STANDARD, scene::EPT_TRIANGLES, video::EIT_16BIT); + vertices.push_back(vertex); + } } } - - delete[] grid; + int quad_count = vertices.size() / 4; + std::vector<u16> indices; + indices.reserve(quad_count * 6); + for (int k = 0; k < quad_count; k++) { + indices.push_back(4 * k + 0); + indices.push_back(4 * k + 1); + indices.push_back(4 * k + 2); + indices.push_back(4 * k + 2); + indices.push_back(4 * k + 3); + indices.push_back(4 * k + 0); + } + driver->drawVertexPrimitiveList(vertices.data(), vertices.size(), indices.data(), 2 * quad_count, + video::EVT_STANDARD, scene::EPT_TRIANGLES, video::EIT_16BIT); // Restore fog settings driver->setFog(fog_color, fog_type, fog_start, fog_end, fog_density, @@ -342,19 +341,18 @@ void Clouds::step(float dtime) void Clouds::update(const v3f &camera_p, const video::SColorf &color_diffuse) { + video::SColorf ambient(m_params.color_ambient); + video::SColorf bright(m_params.color_bright); m_camera_pos = camera_p; - m_color.r = MYMIN(MYMAX(color_diffuse.r * m_params.color_bright.getRed(), - m_params.color_ambient.getRed()), 255) / 255.0f; - m_color.g = MYMIN(MYMAX(color_diffuse.g * m_params.color_bright.getGreen(), - m_params.color_ambient.getGreen()), 255) / 255.0f; - m_color.b = MYMIN(MYMAX(color_diffuse.b * m_params.color_bright.getBlue(), - m_params.color_ambient.getBlue()), 255) / 255.0f; - m_color.a = m_params.color_bright.getAlpha() / 255.0f; + m_color.r = core::clamp(color_diffuse.r * bright.r, ambient.r, 1.0f); + m_color.g = core::clamp(color_diffuse.g * bright.g, ambient.g, 1.0f); + m_color.b = core::clamp(color_diffuse.b * bright.b, ambient.b, 1.0f); + m_color.a = bright.a; // is the camera inside the cloud mesh? m_camera_inside_cloud = false; // default if (m_enable_3d) { - float camera_height = camera_p.Y; + float camera_height = camera_p.Y - BS * m_camera_offset.Y; if (camera_height >= m_box.MinEdge.Y && camera_height <= m_box.MaxEdge.Y) { v2f camera_in_noise; @@ -368,7 +366,8 @@ void Clouds::update(const v3f &camera_p, const video::SColorf &color_diffuse) void Clouds::readSettings() { - m_cloud_radius_i = g_settings->getU16("cloud_radius"); + // Upper limit was chosen due to posible render bugs + m_cloud_radius_i = rangelim(g_settings->getU16("cloud_radius"), 1, 62); m_enable_3d = g_settings->getBool("enable_3d_clouds"); } diff --git a/src/client/clouds.h b/src/client/clouds.h index a4d810faa..6db88d93c 100644 --- a/src/client/clouds.h +++ b/src/client/clouds.h @@ -22,15 +22,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include <iostream> #include "constants.h" -#include "cloudparams.h" +#include "skyparams.h" // Menu clouds class Clouds; extern Clouds *g_menuclouds; // Scene manager used for menu clouds -namespace irr{namespace scene{class ISceneManager;}} -extern irr::scene::ISceneManager *g_menucloudsmgr; +extern scene::ISceneManager *g_menucloudsmgr; class Clouds : public scene::ISceneNode { diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 599139aa3..9bd1df1ab 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -20,7 +20,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_cao.h" #include <IBillboardSceneNode.h> #include <ICameraSceneNode.h> -#include <ITextSceneNode.h> #include <IMeshManipulator.h> #include <IAnimatedMeshSceneNode.h> #include "client/client.h" @@ -28,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/sound.h" #include "client/tile.h" #include "util/basic_macros.h" -#include "util/numeric.h" // For IntervalLimiter & setPitchYawRoll +#include "util/numeric.h" #include "util/serialize.h" #include "camera.h" // CameraModes #include "collision.h" @@ -39,14 +38,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map.h" #include "mesh.h" #include "nodedef.h" -#include "serialization.h" // For decompressZlib #include "settings.h" -#include "sound.h" #include "tool.h" #include "wieldmesh.h" #include <algorithm> #include <cmath> #include "client/shader.h" +#include "client/minimap.h" class Settings; struct ToolCapabilities; @@ -171,6 +169,20 @@ static void updatePositionRecursive(scene::ISceneNode *node) node->updateAbsolutePosition(); } +static bool logOnce(const std::ostringstream &from, std::ostream &log_to) +{ + thread_local std::vector<u64> logged; + + std::string message = from.str(); + u64 hash = murmur_hash_64_ua(message.data(), message.length(), 0xBADBABE); + + if (std::find(logged.begin(), logged.end(), hash) != logged.end()) + return false; + logged.push_back(hash); + log_to << message << std::endl; + return true; +} + /* TestCAO */ @@ -188,7 +200,7 @@ public: static ClientActiveObject* create(Client *client, ClientEnvironment *env); - void addToScene(ITextureSource *tsrc); + void addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr); void removeFromScene(bool permanent); void updateLight(u32 day_night_ratio); void updateNodePos(); @@ -219,7 +231,7 @@ ClientActiveObject* TestCAO::create(Client *client, ClientEnvironment *env) return new TestCAO(client, env); } -void TestCAO::addToScene(ITextureSource *tsrc) +void TestCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) { if(m_node != NULL) return; @@ -248,7 +260,7 @@ void TestCAO::addToScene(ITextureSource *tsrc) // Add to mesh mesh->addMeshBuffer(buf); buf->drop(); - m_node = RenderingEngine::get_scene_manager()->addMeshSceneNode(mesh, NULL); + m_node = smgr->addMeshSceneNode(mesh, NULL); mesh->drop(); updateNodePos(); } @@ -346,16 +358,6 @@ void GenericCAO::initialize(const std::string &data) infostream<<"GenericCAO: Got init data"<<std::endl; processInitData(data); - if (m_is_player) { - // Check if it's the current player - LocalPlayer *player = m_env->getLocalPlayer(); - if (player && strcmp(player->getName(), m_name.c_str()) == 0) { - m_is_local_player = true; - m_is_visible = false; - player->setCAO(this); - } - } - m_enable_shaders = g_settings->getBool("enable_shaders"); } @@ -371,17 +373,27 @@ void GenericCAO::processInitData(const std::string &data) } // PROTOCOL_VERSION >= 37 - m_name = deSerializeString(is); + m_name = deSerializeString16(is); m_is_player = readU8(is); m_id = readU16(is); m_position = readV3F32(is); m_rotation = readV3F32(is); m_hp = readU16(is); + if (m_is_player) { + // Check if it's the current player + LocalPlayer *player = m_env->getLocalPlayer(); + if (player && strcmp(player->getName(), m_name.c_str()) == 0) { + m_is_local_player = true; + m_is_visible = false; + player->setCAO(this); + } + } + const u8 num_messages = readU8(is); for (int i = 0; i < num_messages; i++) { - std::string message = deSerializeLongString(is); + std::string message = deSerializeString32(is); processMessage(message); } @@ -421,7 +433,7 @@ const v3f GenericCAO::getPosition() const return m_position; } -const bool GenericCAO::isImmortal() +bool GenericCAO::isImmortal() const { return itemgroup_get(getGroups(), "immortal"); } @@ -456,18 +468,21 @@ void GenericCAO::setChildrenVisible(bool toset) for (u16 cao_id : m_attachment_child_ids) { GenericCAO *obj = m_env->getGenericCAO(cao_id); if (obj) { - obj->setVisible(toset); + // Check if the entity is forced to appear in first person. + obj->setVisible(obj->m_force_visible ? true : toset); } } } -void GenericCAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) +void GenericCAO::setAttachment(int parent_id, const std::string &bone, + v3f position, v3f rotation, bool force_visible) { int old_parent = m_attachment_parent_id; m_attachment_parent_id = parent_id; m_attachment_bone = bone; m_attachment_position = position; m_attachment_rotation = rotation; + m_force_visible = force_visible; ClientActiveObject *parent = m_env->getActiveObject(parent_id); @@ -477,18 +492,31 @@ void GenericCAO::setAttachment(int parent_id, const std::string &bone, v3f posit if (parent) parent->addAttachmentChild(m_id); } - - updateAttachments(); + + // Forcibly show attachments if required by set_attach + if (m_force_visible) { + m_is_visible = true; + } else if (!m_is_local_player) { + // Objects attached to the local player should be hidden in first person + m_is_visible = !m_attached_to_local || + m_client->getCamera()->getCameraMode() != CAMERA_MODE_FIRST; + m_force_visible = false; + } else { + // Local players need to have this set, + // otherwise first person attachments fail. + m_is_visible = true; + } } void GenericCAO::getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) const + v3f *rotation, bool *force_visible) const { *parent_id = m_attachment_parent_id; *bone = m_attachment_bone; *position = m_attachment_position; *rotation = m_attachment_rotation; + *force_visible = m_force_visible; } void GenericCAO::clearChildAttachments() @@ -498,7 +526,7 @@ void GenericCAO::clearChildAttachments() int child_id = *m_attachment_child_ids.begin(); if (ClientActiveObject *child = m_env->getActiveObject(child_id)) - child->setAttachment(0, "", v3f(), v3f()); + child->setAttachment(0, "", v3f(), v3f(), false); removeAttachmentChild(child_id); } @@ -507,9 +535,9 @@ void GenericCAO::clearChildAttachments() void GenericCAO::clearParentAttachment() { if (m_attachment_parent_id) - setAttachment(0, "", m_attachment_position, m_attachment_rotation); + setAttachment(0, "", m_attachment_position, m_attachment_rotation, false); else - setAttachment(0, "", v3f(), v3f()); + setAttachment(0, "", v3f(), v3f(), false); } void GenericCAO::addAttachmentChild(int child_id) @@ -539,6 +567,9 @@ void GenericCAO::removeFromScene(bool permanent) clearParentAttachment(); } + if (auto shadow = RenderingEngine::get_shadow_renderer()) + shadow->removeNodeFromShadowList(getSceneNode()); + if (m_meshnode) { m_meshnode->remove(); m_meshnode->drop(); @@ -567,11 +598,14 @@ void GenericCAO::removeFromScene(bool permanent) m_client->getCamera()->removeNametag(m_nametag); m_nametag = nullptr; } + + if (m_marker && m_client->getMinimap()) + m_client->getMinimap()->removeMarker(&m_marker); } -void GenericCAO::addToScene(ITextureSource *tsrc) +void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) { - m_smgr = RenderingEngine::get_scene_manager(); + m_smgr = smgr; if (getSceneNode() != NULL) { return; @@ -603,8 +637,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc) } auto grabMatrixNode = [this] { - m_matrixnode = RenderingEngine::get_scene_manager()-> - addDummyTransformationSceneNode(); + m_matrixnode = m_smgr->addDummyTransformationSceneNode(); m_matrixnode->grab(); }; @@ -622,11 +655,11 @@ void GenericCAO::addToScene(ITextureSource *tsrc) if (m_prop.visual == "sprite") { grabMatrixNode(); - m_spritenode = RenderingEngine::get_scene_manager()->addBillboardSceneNode( + m_spritenode = m_smgr->addBillboardSceneNode( m_matrixnode, v2f(1, 1), v3f(0,0,0), -1); m_spritenode->grab(); m_spritenode->setMaterialTexture(0, - tsrc->getTextureForMesh("unknown_node.png")); + tsrc->getTextureForMesh("no_texture.png")); setSceneNodeMaterial(m_spritenode); @@ -707,18 +740,13 @@ void GenericCAO::addToScene(ITextureSource *tsrc) mesh->addMeshBuffer(buf); buf->drop(); } - m_meshnode = RenderingEngine::get_scene_manager()-> - addMeshSceneNode(mesh, m_matrixnode); + m_meshnode = m_smgr->addMeshSceneNode(mesh, m_matrixnode); m_meshnode->grab(); mesh->drop(); - // Set it to use the materials of the meshbuffers directly. - // This is needed for changing the texture in the future - m_meshnode->setReadOnlyMaterials(true); } else if (m_prop.visual == "cube") { grabMatrixNode(); scene::IMesh *mesh = createCubeMesh(v3f(BS,BS,BS)); - m_meshnode = RenderingEngine::get_scene_manager()-> - addMeshSceneNode(mesh, m_matrixnode); + m_meshnode = m_smgr->addMeshSceneNode(mesh, m_matrixnode); m_meshnode->grab(); mesh->drop(); @@ -731,11 +759,6 @@ void GenericCAO::addToScene(ITextureSource *tsrc) grabMatrixNode(); scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh, true); if (mesh) { - m_animated_meshnode = RenderingEngine::get_scene_manager()-> - addAnimatedMeshSceneNode(mesh, m_matrixnode); - m_animated_meshnode->grab(); - mesh->drop(); // The scene node took hold of it - if (!checkMeshNormals(mesh)) { infostream << "GenericCAO: recalculating normals for mesh " << m_prop.mesh << std::endl; @@ -743,6 +766,9 @@ void GenericCAO::addToScene(ITextureSource *tsrc) recalculateNormals(mesh, true, false); } + m_animated_meshnode = m_smgr->addAnimatedMeshSceneNode(mesh, m_matrixnode); + m_animated_meshnode->grab(); + mesh->drop(); // The scene node took hold of it m_animated_meshnode->animateJoints(); // Needed for some animations m_animated_meshnode->setScale(m_prop.visual_size); @@ -773,8 +799,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc) infostream << "serialized form: " << m_prop.wield_item << std::endl; item.deSerialize(m_prop.wield_item, m_client->idef()); } - m_wield_meshnode = new WieldMeshSceneNode( - RenderingEngine::get_scene_manager(), -1); + m_wield_meshnode = new WieldMeshSceneNode(m_smgr, -1); m_wield_meshnode->setItem(item, m_client, (m_prop.visual == "wielditem")); @@ -789,25 +814,53 @@ void GenericCAO::addToScene(ITextureSource *tsrc) if (m_reset_textures_timer < 0) updateTextures(m_current_texture_modifier); - scene::ISceneNode *node = getSceneNode(); + if (scene::ISceneNode *node = getSceneNode()) { + if (m_matrixnode) + node->setParent(m_matrixnode); - if (node && m_matrixnode) - node->setParent(m_matrixnode); + if (auto shadow = RenderingEngine::get_shadow_renderer()) + shadow->addNodeToShadowList(node); + } updateNametag(); + updateMarker(); updateNodePos(); updateAnimation(); updateBonePosition(); updateAttachments(); setNodeLight(m_last_light); + updateMeshCulling(); + + if (m_animated_meshnode) { + u32 mat_count = m_animated_meshnode->getMaterialCount(); + if (mat_count == 0 || m_prop.textures.empty()) { + // nothing + } else if (mat_count > m_prop.textures.size()) { + std::ostringstream oss; + oss << "GenericCAO::addToScene(): Model " + << m_prop.mesh << " loaded with " << mat_count + << " mesh buffers but only " << m_prop.textures.size() + << " texture(s) specifed, this is deprecated."; + logOnce(oss, warningstream); + + video::ITexture *last = m_animated_meshnode->getMaterial(0).TextureLayer[0].Texture; + for (u32 i = 1; i < mat_count; i++) { + auto &layer = m_animated_meshnode->getMaterial(i).TextureLayer[0]; + if (!layer.Texture) + layer.Texture = last; + last = layer.Texture; + } + } + } } void GenericCAO::updateLight(u32 day_night_ratio) { - if (m_glow < 0) + if (m_prop.glow < 0) return; - u8 light_at_pos = 0; + u16 light_at_pos = 0; + u8 light_at_pos_intensity = 0; bool pos_ok = false; v3s16 pos[3]; @@ -816,28 +869,33 @@ void GenericCAO::updateLight(u32 day_night_ratio) bool this_ok; MapNode n = m_env->getMap().getNode(pos[i], &this_ok); if (this_ok) { - u8 this_light = n.getLightBlend(day_night_ratio, m_client->ndef()); - light_at_pos = MYMAX(light_at_pos, this_light); + u16 this_light = getInteriorLight(n, 0, m_client->ndef()); + u8 this_light_intensity = MYMAX(this_light & 0xFF, this_light >> 8); + if (this_light_intensity > light_at_pos_intensity) { + light_at_pos = this_light; + light_at_pos_intensity = this_light_intensity; + } pos_ok = true; } } if (!pos_ok) - light_at_pos = blend_light(day_night_ratio, LIGHT_SUN, 0); + light_at_pos = LIGHT_SUN; + + video::SColor light = encode_light(light_at_pos, m_prop.glow); + if (!m_enable_shaders) + final_color_blend(&light, light_at_pos, day_night_ratio); - u8 light = decode_light(light_at_pos + m_glow); if (light != m_last_light) { m_last_light = light; setNodeLight(light); } } -void GenericCAO::setNodeLight(u8 light) +void GenericCAO::setNodeLight(const video::SColor &light_color) { - video::SColor color(255, light, light, light); - if (m_prop.visual == "wielditem" || m_prop.visual == "item") { if (m_wield_meshnode) - m_wield_meshnode->setNodeLightColor(color); + m_wield_meshnode->setNodeLightColor(light_color); return; } @@ -845,12 +903,8 @@ void GenericCAO::setNodeLight(u8 light) if (m_prop.visual == "upright_sprite") { if (!m_meshnode) return; - - scene::IMesh *mesh = m_meshnode->getMesh(); - for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) { - scene::IMeshBuffer *buf = mesh->getMeshBuffer(i); - buf->getMaterial().EmissiveColor = color; - } + for (u32 i = 0; i < m_meshnode->getMaterialCount(); ++i) + m_meshnode->getMaterial(i).EmissiveColor = light_color; } else { scene::ISceneNode *node = getSceneNode(); if (!node) @@ -858,16 +912,16 @@ void GenericCAO::setNodeLight(u8 light) for (u32 i = 0; i < node->getMaterialCount(); ++i) { video::SMaterial &material = node->getMaterial(i); - material.EmissiveColor = color; + material.EmissiveColor = light_color; } } } else { if (m_meshnode) { - setMeshColor(m_meshnode->getMesh(), color); + setMeshColor(m_meshnode->getMesh(), light_color); } else if (m_animated_meshnode) { - setAnimatedMeshColor(m_animated_meshnode, color); + setAnimatedMeshColor(m_animated_meshnode, light_color); } else if (m_spritenode) { - m_spritenode->setColor(color); + m_spritenode->setColor(light_color); } } } @@ -885,12 +939,32 @@ u16 GenericCAO::getLightPosition(v3s16 *pos) return 3; } +void GenericCAO::updateMarker() +{ + if (!m_client->getMinimap()) + return; + + if (!m_prop.show_on_minimap) { + if (m_marker) + m_client->getMinimap()->removeMarker(&m_marker); + return; + } + + if (m_marker) + return; + + scene::ISceneNode *node = getSceneNode(); + if (!node) + return; + m_marker = m_client->getMinimap()->addMarker(node); +} + void GenericCAO::updateNametag() { if (m_is_local_player) // No nametag for local player return; - if (m_prop.nametag.empty()) { + if (m_prop.nametag.empty() || m_prop.nametag_color.getAlpha() == 0) { // Delete nametag if (m_nametag) { m_client->getCamera()->removeNametag(m_nametag); @@ -908,12 +982,14 @@ void GenericCAO::updateNametag() if (!m_nametag) { // Add nametag m_nametag = m_client->getCamera()->addNametag(node, - m_prop.nametag, m_prop.nametag_color, pos); + m_prop.nametag, m_prop.nametag_color, + m_prop.nametag_bgcolor, pos); } else { // Update nametag - m_nametag->nametag_text = m_prop.nametag; - m_nametag->nametag_color = m_prop.nametag_color; - m_nametag->nametag_pos = pos; + m_nametag->text = m_prop.nametag; + m_nametag->textcolor = m_prop.nametag_color; + m_nametag->bgcolor = m_prop.nametag_bgcolor; + m_nametag->pos = pos; } } @@ -952,14 +1028,14 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) m_velocity = v3f(0,0,0); m_acceleration = v3f(0,0,0); const PlayerControl &controls = player->getPlayerControl(); + f32 new_speed = player->local_animation_speed; bool walking = false; - if (controls.up || controls.down || controls.left || controls.right || - controls.forw_move_joystick_axis != 0.f || - controls.sidew_move_joystick_axis != 0.f) + if (controls.movement_speed > 0.001f) { + new_speed *= controls.movement_speed; walking = true; + } - f32 new_speed = player->local_animation_speed; v2s32 new_anim = v2s32(0,0); bool allow_update = false; @@ -971,7 +1047,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) g_settings->getBool("free_move") && m_client->checkLocalPrivilege("fly")))) new_speed *= 1.5; - // slowdown speed if sneeking + // slowdown speed if sneaking if (controls.sneak && walking) new_speed /= 2; @@ -1028,7 +1104,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) } removeFromScene(false); - addToScene(m_client->tsrc()); + addToScene(m_client->tsrc(), m_smgr); // Attachments, part 2: Now that the parent has been refreshed, put its attachments back for (u16 cao_id : m_attachment_child_ids) { @@ -1096,7 +1172,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) // Reduce footstep gain, as non-local-player footsteps are // somehow louder. spec.gain *= 0.6f; - m_client->sound()->playSoundAt(spec, false, getPosition()); + m_client->sound()->playSoundAt(spec, getPosition()); } } } @@ -1121,7 +1197,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) } } - if (!getParent() && std::fabs(m_prop.automatic_rotate) > 0.001) { + if (node && fabs(m_prop.automatic_rotate) > 0.001f) { // This is the child node's rotation. It is only used for automatic_rotate. v3f local_rot = node->getRotation(); local_rot.Y = modulo360f(local_rot.Y - dtime * core::RADTODEG * @@ -1130,7 +1206,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) } if (!getParent() && m_prop.automatic_face_movement_dir && - (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)) { + (fabs(m_velocity.Z) > 0.001f || fabs(m_velocity.X) > 0.001f)) { float target_yaw = atan2(m_velocity.Z, m_velocity.X) * 180 / M_PI + m_prop.automatic_face_movement_dir_offset; float max_rotation_per_sec = @@ -1241,11 +1317,10 @@ void GenericCAO::updateTextures(std::string mod) m_previous_texture_modifier = m_current_texture_modifier; m_current_texture_modifier = mod; - m_glow = m_prop.glow; if (m_spritenode) { if (m_prop.visual == "sprite") { - std::string texturestring = "unknown_node.png"; + std::string texturestring = "no_texture.png"; if (!m_prop.textures.empty()) texturestring = m_prop.textures[0]; texturestring += mod; @@ -1324,7 +1399,7 @@ void GenericCAO::updateTextures(std::string mod) { for (u32 i = 0; i < 6; ++i) { - std::string texturestring = "unknown_node.png"; + std::string texturestring = "no_texture.png"; if(m_prop.textures.size() > i) texturestring = m_prop.textures[i]; texturestring += mod; @@ -1357,60 +1432,63 @@ void GenericCAO::updateTextures(std::string mod) } else if (m_prop.visual == "upright_sprite") { scene::IMesh *mesh = m_meshnode->getMesh(); { - std::string tname = "unknown_object.png"; + std::string tname = "no_texture.png"; if (!m_prop.textures.empty()) tname = m_prop.textures[0]; tname += mod; - scene::IMeshBuffer *buf = mesh->getMeshBuffer(0); - buf->getMaterial().setTexture(0, + auto& material = m_meshnode->getMaterial(0); + material.setTexture(0, tsrc->getTextureForMesh(tname)); // This allows setting per-material colors. However, until a real lighting // system is added, the code below will have no effect. Once MineTest // has directional lighting, it should work automatically. if(!m_prop.colors.empty()) { - buf->getMaterial().AmbientColor = m_prop.colors[0]; - buf->getMaterial().DiffuseColor = m_prop.colors[0]; - buf->getMaterial().SpecularColor = m_prop.colors[0]; + material.AmbientColor = m_prop.colors[0]; + material.DiffuseColor = m_prop.colors[0]; + material.SpecularColor = m_prop.colors[0]; } - buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter); - buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter); - buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter); + material.setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter); + material.setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter); + material.setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter); } { - std::string tname = "unknown_object.png"; + std::string tname = "no_texture.png"; if (m_prop.textures.size() >= 2) tname = m_prop.textures[1]; else if (!m_prop.textures.empty()) tname = m_prop.textures[0]; tname += mod; - scene::IMeshBuffer *buf = mesh->getMeshBuffer(1); - buf->getMaterial().setTexture(0, + auto& material = m_meshnode->getMaterial(1); + material.setTexture(0, tsrc->getTextureForMesh(tname)); // This allows setting per-material colors. However, until a real lighting // system is added, the code below will have no effect. Once MineTest // has directional lighting, it should work automatically. if (m_prop.colors.size() >= 2) { - buf->getMaterial().AmbientColor = m_prop.colors[1]; - buf->getMaterial().DiffuseColor = m_prop.colors[1]; - buf->getMaterial().SpecularColor = m_prop.colors[1]; + material.AmbientColor = m_prop.colors[1]; + material.DiffuseColor = m_prop.colors[1]; + material.SpecularColor = m_prop.colors[1]; } else if (!m_prop.colors.empty()) { - buf->getMaterial().AmbientColor = m_prop.colors[0]; - buf->getMaterial().DiffuseColor = m_prop.colors[0]; - buf->getMaterial().SpecularColor = m_prop.colors[0]; + material.AmbientColor = m_prop.colors[0]; + material.DiffuseColor = m_prop.colors[0]; + material.SpecularColor = m_prop.colors[0]; } - buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter); - buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter); - buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter); + material.setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter); + material.setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter); + material.setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter); } // Set mesh color (only if lighting is disabled) - if (!m_prop.colors.empty() && m_glow < 0) + if (!m_prop.colors.empty() && m_prop.glow < 0) setMeshColor(mesh, m_prop.colors[0]); } } + // Prevent showing the player after changing texture + if (m_is_local_player) + updateMeshCulling(); } void GenericCAO::updateAnimation() @@ -1424,11 +1502,8 @@ void GenericCAO::updateAnimation() if (m_animated_meshnode->getAnimationSpeed() != m_animation_speed) m_animated_meshnode->setAnimationSpeed(m_animation_speed); m_animated_meshnode->setTransitionTime(m_animation_blend); -// Requires Irrlicht 1.8 or greater -#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR > 1 if (m_animated_meshnode->getLoopMode() != m_animation_loop) m_animated_meshnode->setLoopMode(m_animation_loop); -#endif } void GenericCAO::updateAnimationSpeed() @@ -1444,10 +1519,10 @@ void GenericCAO::updateBonePosition() if (m_bone_position.empty() || !m_animated_meshnode) return; - m_animated_meshnode->setJointMode(irr::scene::EJUOR_CONTROL); // To write positions to the mesh on render + m_animated_meshnode->setJointMode(scene::EJUOR_CONTROL); // To write positions to the mesh on render for (auto &it : m_bone_position) { std::string bone_name = it.first; - irr::scene::IBoneSceneNode* bone = m_animated_meshnode->getJointNode(bone_name.c_str()); + scene::IBoneSceneNode* bone = m_animated_meshnode->getJointNode(bone_name.c_str()); if (bone) { bone->setPosition(it.second.X); bone->setRotation(it.second.Y); @@ -1456,7 +1531,7 @@ void GenericCAO::updateBonePosition() // search through bones to find mistakenly rotated bones due to bug in Irrlicht for (u32 i = 0; i < m_animated_meshnode->getJointCount(); ++i) { - irr::scene::IBoneSceneNode *bone = m_animated_meshnode->getJointNode(i); + scene::IBoneSceneNode *bone = m_animated_meshnode->getJointNode(i); if (!bone) continue; @@ -1580,6 +1655,8 @@ void GenericCAO::processMessage(const std::string &data) u8 cmd = readU8(is); if (cmd == AO_CMD_SET_PROPERTIES) { ObjectProperties newprops; + newprops.show_on_minimap = m_is_player; // default + newprops.deSerialize(is); // Check what exactly changed @@ -1613,6 +1690,8 @@ void GenericCAO::processMessage(const std::string &data) if ((m_is_player && !m_is_local_player) && m_prop.nametag.empty()) m_prop.nametag = m_name; + if (m_is_local_player) + m_prop.show_on_minimap = false; if (expire_visuals) { expireVisuals(); @@ -1625,6 +1704,7 @@ void GenericCAO::processMessage(const std::string &data) updateTextures(m_current_texture_modifier); } updateNametag(); + updateMarker(); } } else if (cmd == AO_CMD_UPDATE_POSITION) { // Not sent by the server if this object is an attachment. @@ -1657,7 +1737,7 @@ void GenericCAO::processMessage(const std::string &data) rot_translator.update(m_rotation, false, update_interval); updateNodePos(); } else if (cmd == AO_CMD_SET_TEXTURE_MOD) { - std::string mod = deSerializeString(is); + std::string mod = deSerializeString16(is); // immediately reset a engine issued texture modifier if a mod sends a different one if (m_reset_textures_timer > 0) { @@ -1673,6 +1753,7 @@ void GenericCAO::processMessage(const std::string &data) m_tx_basepos = p; m_anim_num_frames = num_frames; + m_anim_frame = 0; m_anim_framelength = framelength; m_tx_select_horiz_by_yawpitch = select_horiz_by_yawpitch; @@ -1681,21 +1762,20 @@ void GenericCAO::processMessage(const std::string &data) float override_speed = readF32(is); float override_jump = readF32(is); float override_gravity = readF32(is); - // these are sent inverted so we get true when the server sends nothing + // MT 0.4.10 legacy: send inverted for detault `true` if the server sends nothing bool sneak = !readU8(is); bool sneak_glitch = !readU8(is); bool new_move = !readU8(is); - if(m_is_local_player) - { - LocalPlayer *player = m_env->getLocalPlayer(); - player->physics_override_speed = override_speed; - player->physics_override_jump = override_jump; - player->physics_override_gravity = override_gravity; - player->physics_override_sneak = sneak; - player->physics_override_sneak_glitch = sneak_glitch; - player->physics_override_new_move = new_move; + if (m_is_local_player) { + auto &phys = m_env->getLocalPlayer()->physics_override; + phys.speed = override_speed; + phys.jump = override_jump; + phys.gravity = override_gravity; + phys.sneak = sneak; + phys.sneak_glitch = sneak_glitch; + phys.new_move = new_move; } } else if (cmd == AO_CMD_SET_ANIMATION) { // TODO: change frames send as v2s32 value @@ -1730,12 +1810,13 @@ void GenericCAO::processMessage(const std::string &data) { updateAnimation(); } + // FIXME: ^ This code is trash. It's also broken. } } else if (cmd == AO_CMD_SET_ANIMATION_SPEED) { m_animation_speed = readF32(is); updateAnimationSpeed(); } else if (cmd == AO_CMD_SET_BONE_POSITION) { - std::string bone = deSerializeString(is); + std::string bone = deSerializeString16(is); v3f position = readV3F32(is); v3f rotation = readV3F32(is); m_bone_position[bone] = core::vector2d<v3f>(position, rotation); @@ -1743,15 +1824,12 @@ void GenericCAO::processMessage(const std::string &data) // updateBonePosition(); now called every step } else if (cmd == AO_CMD_ATTACH_TO) { u16 parent_id = readS16(is); - std::string bone = deSerializeString(is); + std::string bone = deSerializeString16(is); v3f position = readV3F32(is); v3f rotation = readV3F32(is); + bool force_visible = readU8(is); // Returns false for EOF - setAttachment(parent_id, bone, position, rotation); - - // localplayer itself can't be attached to localplayer - if (!m_is_local_player) - m_is_visible = !m_attached_to_local; + setAttachment(parent_id, bone, position, rotation, force_visible); } else if (cmd == AO_CMD_PUNCHED) { u16 result_hp = readU16(is); @@ -1777,6 +1855,8 @@ void GenericCAO::processMessage(const std::string &data) m_reset_textures_timer = 0.05; if(damage >= 2) m_reset_textures_timer += 0.05 * damage; + // Cap damage overlay to 1 second + m_reset_textures_timer = std::min(m_reset_textures_timer, 1.0f); updateTextures(m_current_texture_modifier + m_prop.damage_texture_modifier); } } @@ -1793,7 +1873,7 @@ void GenericCAO::processMessage(const std::string &data) int armor_groups_size = readU16(is); for(int i=0; i<armor_groups_size; i++) { - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); int rating = readS16(is); m_armor_groups[name] = rating; } @@ -1824,7 +1904,8 @@ bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem, m_armor_groups, toolcap, punchitem, - time_from_last_punch); + time_from_last_punch, + punchitem->wear); if(result.did_punch && result.damage != 0) { @@ -1844,6 +1925,8 @@ bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem, m_reset_textures_timer = 0.05; if (result.damage >= 2) m_reset_textures_timer += 0.05 * result.damage; + // Cap damage overlay to 1 second + m_reset_textures_timer = std::min(m_reset_textures_timer, 1.0f); updateTextures(m_current_texture_modifier + m_prop.damage_texture_modifier); } } @@ -1865,5 +1948,40 @@ std::string GenericCAO::debugInfoText() return os.str(); } +void GenericCAO::updateMeshCulling() +{ + if (!m_is_local_player) + return; + + const bool hidden = m_client->getCamera()->getCameraMode() == CAMERA_MODE_FIRST; + + scene::ISceneNode *node = getSceneNode(); + + if (!node) + return; + + if (m_prop.visual == "upright_sprite") { + // upright sprite has no backface culling + node->setMaterialFlag(video::EMF_FRONT_FACE_CULLING, hidden); + return; + } + + if (hidden) { + // Hide the mesh by culling both front and + // back faces. Serious hackyness but it works for our + // purposes. This also preserves the skeletal armature. + node->setMaterialFlag(video::EMF_BACK_FACE_CULLING, + true); + node->setMaterialFlag(video::EMF_FRONT_FACE_CULLING, + true); + } else { + // Restore mesh visibility. + node->setMaterialFlag(video::EMF_BACK_FACE_CULLING, + m_prop.backface_culling); + node->setMaterialFlag(video::EMF_FRONT_FACE_CULLING, + false); + } +} + // Prototype GenericCAO proto_GenericCAO(NULL, NULL); diff --git a/src/client/content_cao.h b/src/client/content_cao.h index 974ff9a1e..5a8116c71 100644 --- a/src/client/content_cao.h +++ b/src/client/content_cao.h @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class Camera; class Client; struct Nametag; +struct MinimapMarker; /* SmoothTranslator @@ -84,6 +85,7 @@ private: scene::IBillboardSceneNode *m_spritenode = nullptr; scene::IDummyTransformationSceneNode *m_matrixnode = nullptr; Nametag *m_nametag = nullptr; + MinimapMarker *m_marker = nullptr; v3f m_position = v3f(0.0f, 10.0f * BS, 0); v3f m_velocity; v3f m_acceleration; @@ -109,6 +111,7 @@ private: v3f m_attachment_position; v3f m_attachment_rotation; bool m_attached_to_local = false; + bool m_force_visible = false; int m_anim_frame = 0; int m_anim_num_frames = 1; @@ -122,9 +125,8 @@ private: std::string m_current_texture_modifier = ""; bool m_visuals_expired = false; float m_step_distance_counter = 0.0f; - u8 m_last_light = 255; + video::SColor m_last_light = video::SColor(0xFFFFFFFF); bool m_is_visible = false; - s8 m_glow = 0; // Material video::E_MATERIAL_TYPE m_material_type; // Settings @@ -162,14 +164,11 @@ public: const v3f getPosition() const; - void setPosition(const v3f &pos) - { - pos_translator.val_current = pos; - } - inline const v3f &getRotation() const { return m_rotation; } - const bool isImmortal(); + bool isImmortal() const; + + inline const ObjectProperties &getProperties() const { return m_prop; } scene::ISceneNode *getSceneNode() const; @@ -216,9 +215,10 @@ public: } void setChildrenVisible(bool toset); - void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); + void setAttachment(int parent_id, const std::string &bone, v3f position, + v3f rotation, bool force_visible); void getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) const; + v3f *rotation, bool *force_visible) const; void clearChildAttachments(); void clearParentAttachment(); void addAttachmentChild(int child_id); @@ -230,7 +230,7 @@ public: void removeFromScene(bool permanent); - void addToScene(ITextureSource *tsrc); + void addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr); inline void expireVisuals() { @@ -239,7 +239,7 @@ public: void updateLight(u32 day_night_ratio); - void setNodeLight(u8 light); + void setNodeLight(const video::SColor &light); /* Get light position(s). * returns number of positions written into pos[], which must have space @@ -248,6 +248,8 @@ public: void updateNametag(); + void updateMarker(); + void updateNodePos(); void step(float dtime, ClientEnvironment *env); @@ -275,4 +277,6 @@ public: { return m_prop.infotext; } + + void updateMeshCulling(); }; diff --git a/src/client/content_mapblock.cpp b/src/client/content_mapblock.cpp index df2748212..0bac5e827 100644 --- a/src/client/content_mapblock.cpp +++ b/src/client/content_mapblock.cpp @@ -60,18 +60,16 @@ static constexpr u16 quad_indices[] = {0, 1, 2, 2, 3, 0}; const std::string MapblockMeshGenerator::raillike_groupname = "connect_to_raillike"; -MapblockMeshGenerator::MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output) +MapblockMeshGenerator::MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output, + scene::IMeshManipulator *mm): + data(input), + collector(output), + nodedef(data->m_client->ndef()), + meshmanip(mm), + blockpos_nodes(data->m_blockpos * MAP_BLOCKSIZE) { - data = input; - collector = output; - - nodedef = data->m_client->ndef(); - meshmanip = RenderingEngine::get_scene_manager()->getMeshManipulator(); - enable_mesh_cache = g_settings->getBool("enable_mesh_cache") && !data->m_smooth_lighting; // Mesh cache is not supported with smooth lighting - - blockpos_nodes = data->m_blockpos * MAP_BLOCKSIZE; } void MapblockMeshGenerator::useTile(int index, u8 set_flags, u8 reset_flags, bool special) @@ -152,8 +150,10 @@ void MapblockMeshGenerator::drawQuad(v3f *coords, const v3s16 &normal, // should be (2+2)*6=24 values in the list. The order of // the faces in the list is up-down-right-left-back-front // (compatible with ContentFeatures). +// mask - a bit mask that suppresses drawing of tiles. +// tile i will not be drawn if mask & (1 << i) is 1 void MapblockMeshGenerator::drawCuboid(const aabb3f &box, - TileSpec *tiles, int tilecount, const LightInfo *lights, const f32 *txc) + TileSpec *tiles, int tilecount, const LightInfo *lights, const f32 *txc, u8 mask) { assert(tilecount >= 1 && tilecount <= 6); // pre-condition @@ -276,6 +276,8 @@ void MapblockMeshGenerator::drawCuboid(const aabb3f &box, // Add to mesh collector for (int k = 0; k < 6; ++k) { + if (mask & (1 << k)) + continue; int tileindex = MYMIN(k, tilecount - 1); collector->append(tiles[tileindex], vertices + 4 * k, 4, quad_indices, 6); } @@ -365,7 +367,7 @@ void MapblockMeshGenerator::generateCuboidTextureCoords(const aabb3f &box, f32 * } void MapblockMeshGenerator::drawAutoLightedCuboid(aabb3f box, const f32 *txc, - TileSpec *tiles, int tile_count) + TileSpec *tiles, int tile_count, u8 mask) { bool scale = std::fabs(f->visual_scale - 1.0f) > 1e-3f; f32 texture_coord_buf[24]; @@ -402,12 +404,49 @@ void MapblockMeshGenerator::drawAutoLightedCuboid(aabb3f box, const f32 *txc, d.Z = (j & 1) ? dz2 : dz1; lights[j] = blendLight(d); } - drawCuboid(box, tiles, tile_count, lights, txc); + drawCuboid(box, tiles, tile_count, lights, txc, mask); } else { - drawCuboid(box, tiles, tile_count, nullptr, txc); + drawCuboid(box, tiles, tile_count, nullptr, txc, mask); } } +u8 MapblockMeshGenerator::getNodeBoxMask(aabb3f box, u8 solid_neighbors, u8 sametype_neighbors) const +{ + const f32 NODE_BOUNDARY = 0.5 * BS; + + // For an oversized nodebox, return immediately + if (box.MaxEdge.X > NODE_BOUNDARY || + box.MinEdge.X < -NODE_BOUNDARY || + box.MaxEdge.Y > NODE_BOUNDARY || + box.MinEdge.Y < -NODE_BOUNDARY || + box.MaxEdge.Z > NODE_BOUNDARY || + box.MinEdge.Z < -NODE_BOUNDARY) + return 0; + + // We can skip faces at node boundary if the matching neighbor is solid + u8 solid_mask = + (box.MaxEdge.Y == NODE_BOUNDARY ? 1 : 0) | + (box.MinEdge.Y == -NODE_BOUNDARY ? 2 : 0) | + (box.MaxEdge.X == NODE_BOUNDARY ? 4 : 0) | + (box.MinEdge.X == -NODE_BOUNDARY ? 8 : 0) | + (box.MaxEdge.Z == NODE_BOUNDARY ? 16 : 0) | + (box.MinEdge.Z == -NODE_BOUNDARY ? 32 : 0); + + u8 sametype_mask = 0; + if (f->alpha == AlphaMode::ALPHAMODE_OPAQUE) { + // In opaque nodeboxes, faces on opposite sides can cancel + // each other out if there is a matching neighbor of the same type + sametype_mask = + ((solid_mask & 3) == 3 ? 3 : 0) | + ((solid_mask & 12) == 12 ? 12 : 0) | + ((solid_mask & 48) == 48 ? 48 : 0); + } + + // Combine masks with actual neighbors to get the faces to be skipped + return (solid_mask & solid_neighbors) | (sametype_mask & sametype_neighbors); +} + + void MapblockMeshGenerator::prepareLiquidNodeDrawing() { getSpecialTile(0, &tile_liquid_top); @@ -513,10 +552,10 @@ f32 MapblockMeshGenerator::getCornerLevel(int i, int k) count++; } else if (content == CONTENT_AIR) { air_count++; - if (air_count >= 2) - return -0.5 * BS + 0.2; } } + if (air_count >= 2) + return -0.5 * BS + 0.2; if (count > 0) return sum / count; return 0; @@ -960,15 +999,43 @@ void MapblockMeshGenerator::drawPlantlikeQuad(float rotation, float quad_offset, vertex.rotateXZBy(rotation + rotate_degree); vertex += offset; } + + u8 wall = n.getWallMounted(nodedef); + if (wall != DWM_YN) { + for (v3f &vertex : vertices) { + switch (wall) { + case DWM_YP: + vertex.rotateYZBy(180); + vertex.rotateXZBy(180); + break; + case DWM_XP: + vertex.rotateXYBy(90); + break; + case DWM_XN: + vertex.rotateXYBy(-90); + vertex.rotateYZBy(180); + break; + case DWM_ZP: + vertex.rotateYZBy(-90); + vertex.rotateXYBy(90); + break; + case DWM_ZN: + vertex.rotateYZBy(90); + vertex.rotateXYBy(90); + break; + } + } + } + drawQuad(vertices, v3s16(0, 0, 0), plant_height); } -void MapblockMeshGenerator::drawPlantlike() +void MapblockMeshGenerator::drawPlantlike(bool is_rooted) { draw_style = PLANT_STYLE_CROSS; scale = BS / 2 * f->visual_scale; offset = v3f(0, 0, 0); - rotate_degree = 0; + rotate_degree = 0.0f; random_offset_Y = false; face_num = 0; plant_height = 1.0; @@ -988,7 +1055,8 @@ void MapblockMeshGenerator::drawPlantlike() break; case CPT2_DEGROTATE: - rotate_degree = n.param2 * 2; + case CPT2_COLORED_DEGROTATE: + rotate_degree = 1.5f * n.getDegRotate(nodedef); break; case CPT2_LEVELED: @@ -999,6 +1067,22 @@ void MapblockMeshGenerator::drawPlantlike() break; } + if (is_rooted) { + u8 wall = n.getWallMounted(nodedef); + switch (wall) { + case DWM_YP: + offset.Y += BS*2; + break; + case DWM_XN: + case DWM_XP: + case DWM_ZN: + case DWM_ZP: + offset.X += -BS; + offset.Y += BS; + break; + } + } + switch (draw_style) { case PLANT_STYLE_CROSS: drawPlantlikeQuad(46); @@ -1049,7 +1133,7 @@ void MapblockMeshGenerator::drawPlantlikeRootedNode() MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + p); light = LightPair(getInteriorLight(ntop, 1, nodedef)); } - drawPlantlike(); + drawPlantlike(true); p.Y--; } @@ -1320,13 +1404,38 @@ void MapblockMeshGenerator::drawNodeboxNode() getTile(nodebox_tile_dirs[face], &tiles[face]); } + bool param2_is_rotation = + f->param_type_2 == CPT2_COLORED_FACEDIR || + f->param_type_2 == CPT2_COLORED_WALLMOUNTED || + f->param_type_2 == CPT2_FACEDIR || + f->param_type_2 == CPT2_WALLMOUNTED; + + bool param2_is_level = + f->param_type_2 == CPT2_LEVELED; + // locate possible neighboring nodes to connect to u8 neighbors_set = 0; - if (f->node_box.type == NODEBOX_CONNECTED) { - for (int dir = 0; dir != 6; dir++) { - u8 flag = 1 << dir; - v3s16 p2 = blockpos_nodes + p + nodebox_connection_dirs[dir]; - MapNode n2 = data->m_vmanip.getNodeNoEx(p2); + u8 solid_neighbors = 0; + u8 sametype_neighbors = 0; + for (int dir = 0; dir != 6; dir++) { + u8 flag = 1 << dir; + v3s16 p2 = blockpos_nodes + p + nodebox_tile_dirs[dir]; + MapNode n2 = data->m_vmanip.getNodeNoEx(p2); + + // mark neighbors that are the same node type + // and have the same rotation or higher level stored as param2 + if (n2.param0 == n.param0 && + (!param2_is_rotation || n.param2 == n2.param2) && + (!param2_is_level || n.param2 <= n2.param2)) + sametype_neighbors |= flag; + + // mark neighbors that are simple solid blocks + if (nodedef->get(n2).drawtype == NDT_NORMAL) + solid_neighbors |= flag; + + if (f->node_box.type == NODEBOX_CONNECTED) { + p2 = blockpos_nodes + p + nodebox_connection_dirs[dir]; + n2 = data->m_vmanip.getNodeNoEx(p2); if (nodedef->nodeboxConnects(n, n2, flag)) neighbors_set |= flag; } @@ -1334,8 +1443,63 @@ void MapblockMeshGenerator::drawNodeboxNode() std::vector<aabb3f> boxes; n.getNodeBoxes(nodedef, &boxes, neighbors_set); - for (auto &box : boxes) - drawAutoLightedCuboid(box, nullptr, tiles, 6); + + bool isTransparent = false; + + for (const TileSpec &tile : tiles) { + if (tile.layers[0].isTransparent()) { + isTransparent = true; + break; + } + } + + if (isTransparent) { + std::vector<float> sections; + // Preallocate 8 default splits + Min&Max for each nodebox + sections.reserve(8 + 2 * boxes.size()); + + for (int axis = 0; axis < 3; axis++) { + // identify sections + + if (axis == 0) { + // Default split at node bounds, up to 3 nodes in each direction + for (float s = -3.5f * BS; s < 4.0f * BS; s += 1.0f * BS) + sections.push_back(s); + } + else { + // Avoid readding the same 8 default splits for Y and Z + sections.resize(8); + } + + // Add edges of existing node boxes, rounded to 1E-3 + for (size_t i = 0; i < boxes.size(); i++) { + sections.push_back(std::floor(boxes[i].MinEdge[axis] * 1E3) * 1E-3); + sections.push_back(std::floor(boxes[i].MaxEdge[axis] * 1E3) * 1E-3); + } + + // split the boxes at recorded sections + // limit splits to avoid runaway crash if inner loop adds infinite splits + // due to e.g. precision problems. + // 100 is just an arbitrary, reasonably high number. + for (size_t i = 0; i < boxes.size() && i < 100; i++) { + aabb3f *box = &boxes[i]; + for (float section : sections) { + if (box->MinEdge[axis] < section && box->MaxEdge[axis] > section) { + aabb3f copy(*box); + copy.MinEdge[axis] = section; + box->MaxEdge[axis] = section; + boxes.push_back(copy); + box = &boxes[i]; // find new address of the box in case of reallocation + } + } + } + } + } + + for (auto &box : boxes) { + u8 mask = getNodeBoxMask(box, solid_neighbors, sametype_neighbors); + drawAutoLightedCuboid(box, nullptr, tiles, 6, mask); + } } void MapblockMeshGenerator::drawMeshNode() @@ -1343,6 +1507,7 @@ void MapblockMeshGenerator::drawMeshNode() u8 facedir = 0; scene::IMesh* mesh; bool private_mesh; // as a grab/drop pair is not thread-safe + int degrotate = 0; if (f->param_type_2 == CPT2_FACEDIR || f->param_type_2 == CPT2_COLORED_FACEDIR) { @@ -1354,9 +1519,12 @@ void MapblockMeshGenerator::drawMeshNode() facedir = n.getWallMounted(nodedef); if (!enable_mesh_cache) facedir = wallmounted_to_facedir[facedir]; + } else if (f->param_type_2 == CPT2_DEGROTATE || + f->param_type_2 == CPT2_COLORED_DEGROTATE) { + degrotate = n.getDegRotate(nodedef); } - if (!data->m_smooth_lighting && f->mesh_ptr[facedir]) { + if (!data->m_smooth_lighting && f->mesh_ptr[facedir] && !degrotate) { // use cached meshes private_mesh = false; mesh = f->mesh_ptr[facedir]; @@ -1364,7 +1532,10 @@ void MapblockMeshGenerator::drawMeshNode() // no cache, clone and rotate mesh private_mesh = true; mesh = cloneMesh(f->mesh_ptr[0]); - rotateMeshBy6dFacedir(mesh, facedir); + if (facedir) + rotateMeshBy6dFacedir(mesh, facedir); + else if (degrotate) + rotateMeshXZby(mesh, 1.5f * degrotate); recalculateBoundingBox(mesh); meshmanip->recalculateNormals(mesh, true, false); } else diff --git a/src/client/content_mapblock.h b/src/client/content_mapblock.h index 487d84a07..b13748cbc 100644 --- a/src/client/content_mapblock.h +++ b/src/client/content_mapblock.h @@ -100,10 +100,11 @@ public: // cuboid drawing! void drawCuboid(const aabb3f &box, TileSpec *tiles, int tilecount, - const LightInfo *lights , const f32 *txc); + const LightInfo *lights , const f32 *txc, u8 mask = 0); void generateCuboidTextureCoords(aabb3f const &box, f32 *coords); void drawAutoLightedCuboid(aabb3f box, const f32 *txc = NULL, - TileSpec *tiles = NULL, int tile_count = 0); + TileSpec *tiles = NULL, int tile_count = 0, u8 mask = 0); + u8 getNodeBoxMask(aabb3f box, u8 solid_neighbors, u8 sametype_neighbors) const; // liquid-specific bool top_is_same_liquid; @@ -139,14 +140,14 @@ public: // plantlike-specific PlantlikeStyle draw_style; v3f offset; - int rotate_degree; + float rotate_degree; bool random_offset_Y; int face_num; float plant_height; void drawPlantlikeQuad(float rotation, float quad_offset = 0, bool offset_top_only = false); - void drawPlantlike(); + void drawPlantlike(bool is_rooted = false); // firelike-specific void drawFirelikeQuad(float rotation, float opening_angle, @@ -172,7 +173,8 @@ public: void drawNode(); public: - MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output); + MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output, + scene::IMeshManipulator *mm); void generate(); void renderSingle(content_t node, u8 param2 = 0x00); }; diff --git a/src/client/fontengine.cpp b/src/client/fontengine.cpp index a55420846..0ae50dfe2 100644 --- a/src/client/fontengine.cpp +++ b/src/client/fontengine.cpp @@ -24,10 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" #include "filesys.h" #include "gettext.h" - -#if USE_FREETYPE #include "irrlicht_changes/CGUITTFont.h" -#endif +#include "util/numeric.h" // rangelim /** maximum size distance for getting a "similar" font size */ #define MAX_FONT_SIZE_OFFSET 10 @@ -42,43 +40,32 @@ static void font_setting_changed(const std::string &name, void *userdata) } /******************************************************************************/ -FontEngine::FontEngine(Settings* main_settings, gui::IGUIEnvironment* env) : - m_settings(main_settings), +FontEngine::FontEngine(gui::IGUIEnvironment* env) : m_env(env) { - for (u32 &i : m_default_size) { - i = (FontMode) FONT_SIZE_UNSPECIFIED; + i = FONT_SIZE_UNSPECIFIED; } - assert(m_settings != NULL); // pre-condition + assert(g_settings != NULL); // pre-condition assert(m_env != NULL); // pre-condition assert(m_env->getSkin() != NULL); // pre-condition readSettings(); - if (m_currentMode == FM_Standard) { - m_settings->registerChangedCallback("font_size", font_setting_changed, NULL); - m_settings->registerChangedCallback("font_bold", font_setting_changed, NULL); - m_settings->registerChangedCallback("font_italic", font_setting_changed, NULL); - m_settings->registerChangedCallback("font_path", font_setting_changed, NULL); - m_settings->registerChangedCallback("font_path_bold", font_setting_changed, NULL); - m_settings->registerChangedCallback("font_path_italic", font_setting_changed, NULL); - m_settings->registerChangedCallback("font_path_bolditalic", font_setting_changed, NULL); - m_settings->registerChangedCallback("font_shadow", font_setting_changed, NULL); - m_settings->registerChangedCallback("font_shadow_alpha", font_setting_changed, NULL); - } - else if (m_currentMode == FM_Fallback) { - m_settings->registerChangedCallback("fallback_font_size", font_setting_changed, NULL); - m_settings->registerChangedCallback("fallback_font_path", font_setting_changed, NULL); - m_settings->registerChangedCallback("fallback_font_shadow", font_setting_changed, NULL); - m_settings->registerChangedCallback("fallback_font_shadow_alpha", font_setting_changed, NULL); - } + const char *settings[] = { + "font_size", "font_bold", "font_italic", "font_size_divisible_by", + "mono_font_size", "mono_font_size_divisible_by", + "font_shadow", "font_shadow_alpha", + "font_path", "font_path_bold", "font_path_italic", "font_path_bold_italic", + "mono_font_path", "mono_font_path_bold", "mono_font_path_italic", + "mono_font_path_bold_italic", + "fallback_font_path", + "screen_dpi", "gui_scaling", + }; - m_settings->registerChangedCallback("mono_font_path", font_setting_changed, NULL); - m_settings->registerChangedCallback("mono_font_size", font_setting_changed, NULL); - m_settings->registerChangedCallback("screen_dpi", font_setting_changed, NULL); - m_settings->registerChangedCallback("gui_scaling", font_setting_changed, NULL); + for (auto name : settings) + g_settings->registerChangedCallback(name, font_setting_changed, NULL); } /******************************************************************************/ @@ -90,11 +77,13 @@ FontEngine::~FontEngine() /******************************************************************************/ void FontEngine::cleanCache() { + RecursiveMutexAutoLock l(m_font_mutex); + for (auto &font_cache_it : m_font_cache) { for (auto &font_it : font_cache_it) { font_it.second->drop(); - font_it.second = NULL; + font_it.second = nullptr; } font_cache_it.clear(); } @@ -102,15 +91,16 @@ void FontEngine::cleanCache() /******************************************************************************/ irr::gui::IGUIFont *FontEngine::getFont(FontSpec spec) +{ + return getFont(spec, false); +} + +irr::gui::IGUIFont *FontEngine::getFont(FontSpec spec, bool may_fail) { if (spec.mode == FM_Unspecified) { spec.mode = m_currentMode; - } else if (m_currentMode == FM_Simple) { - // Freetype disabled -> Force simple mode - spec.mode = (spec.mode == FM_Mono || - spec.mode == FM_SimpleMono) ? - FM_SimpleMono : FM_Simple; - // Support for those could be added, but who cares? + } else if (spec.mode == _FM_Fallback) { + // Fallback font doesn't support these spec.bold = false; spec.italic = false; } @@ -119,17 +109,22 @@ irr::gui::IGUIFont *FontEngine::getFont(FontSpec spec) if (spec.size == FONT_SIZE_UNSPECIFIED) spec.size = m_default_size[spec.mode]; + RecursiveMutexAutoLock l(m_font_mutex); + const auto &cache = m_font_cache[spec.getHash()]; auto it = cache.find(spec.size); if (it != cache.end()) return it->second; // Font does not yet exist - gui::IGUIFont *font = nullptr; - if (spec.mode == FM_Simple || spec.mode == FM_SimpleMono) - font = initSimpleFont(spec); - else - font = initFont(spec); + gui::IGUIFont *font = initFont(spec); + + if (!font && !may_fail) { + errorstream << "Minetest cannot continue without a valid font. " + "Please correct the 'font_path' setting or install the font " + "file in the proper location." << std::endl; + abort(); + } m_font_cache[spec.getHash()][spec.size] = font; @@ -139,13 +134,7 @@ irr::gui::IGUIFont *FontEngine::getFont(FontSpec spec) /******************************************************************************/ unsigned int FontEngine::getTextHeight(const FontSpec &spec) { - irr::gui::IGUIFont *font = getFont(spec); - - // use current skin font as fallback - if (font == NULL) { - font = m_env->getSkin()->getFont(); - } - FATAL_ERROR_IF(font == NULL, "Could not get skin font"); + gui::IGUIFont *font = getFont(spec); return font->getDimension(L"Some unimportant example String").Height; } @@ -153,28 +142,15 @@ unsigned int FontEngine::getTextHeight(const FontSpec &spec) /******************************************************************************/ unsigned int FontEngine::getTextWidth(const std::wstring &text, const FontSpec &spec) { - irr::gui::IGUIFont *font = getFont(spec); - - // use current skin font as fallback - if (font == NULL) { - font = m_env->getSkin()->getFont(); - } - FATAL_ERROR_IF(font == NULL, "Could not get font"); + gui::IGUIFont *font = getFont(spec); return font->getDimension(text.c_str()).Width; } - /** get line height for a specific font (including empty room between lines) */ unsigned int FontEngine::getLineHeight(const FontSpec &spec) { - irr::gui::IGUIFont *font = getFont(spec); - - // use current skin font as fallback - if (font == NULL) { - font = m_env->getSkin()->getFont(); - } - FATAL_ERROR_IF(font == NULL, "Could not get font"); + gui::IGUIFont *font = getFont(spec); return font->getDimension(L"Some unimportant example String").Height + font->getKerningHeight(); @@ -188,13 +164,6 @@ unsigned int FontEngine::getDefaultFontSize() unsigned int FontEngine::getFontSize(FontMode mode) { - if (m_currentMode == FM_Simple) { - if (mode == FM_Mono || mode == FM_SimpleMono) - return m_default_size[FM_SimpleMono]; - else - return m_default_size[FM_Simple]; - } - if (mode == FM_Unspecified) return m_default_size[FM_Standard]; @@ -204,31 +173,12 @@ unsigned int FontEngine::getFontSize(FontMode mode) /******************************************************************************/ void FontEngine::readSettings() { - if (USE_FREETYPE && g_settings->getBool("freetype")) { - m_default_size[FM_Standard] = m_settings->getU16("font_size"); - m_default_size[FM_Fallback] = m_settings->getU16("fallback_font_size"); - m_default_size[FM_Mono] = m_settings->getU16("mono_font_size"); + m_default_size[FM_Standard] = rangelim(g_settings->getU16("font_size"), 5, 72); + m_default_size[_FM_Fallback] = m_default_size[FM_Standard]; + m_default_size[FM_Mono] = rangelim(g_settings->getU16("mono_font_size"), 5, 72); - /*~ DO NOT TRANSLATE THIS LITERALLY! - This is a special string. Put either "no" or "yes" - into the translation field (literally). - Choose "yes" if the language requires use of the fallback - font, "no" otherwise. - The fallback font is (normally) required for languages with - non-Latin script, like Chinese. - When in doubt, test your translation. */ - m_currentMode = is_yes(gettext("needs_fallback_font")) ? - FM_Fallback : FM_Standard; - - m_default_bold = m_settings->getBool("font_bold"); - m_default_italic = m_settings->getBool("font_italic"); - - } else { - m_currentMode = FM_Simple; - } - - m_default_size[FM_Simple] = m_settings->getU16("font_size"); - m_default_size[FM_SimpleMono] = m_settings->getU16("mono_font_size"); + m_default_bold = g_settings->getBool("font_bold"); + m_default_italic = g_settings->getBool("font_italic"); cleanCache(); updateFontCache(); @@ -239,22 +189,9 @@ void FontEngine::readSettings() void FontEngine::updateSkin() { gui::IGUIFont *font = getFont(); + assert(font); - if (font) - m_env->getSkin()->setFont(font); - else - errorstream << "FontEngine: Default font file: " << - "\n\t\"" << m_settings->get("font_path") << "\"" << - "\n\trequired for current screen configuration was not found" << - " or was invalid file format." << - "\n\tUsing irrlicht default font." << std::endl; - - // If we did fail to create a font our own make irrlicht find a default one - font = m_env->getSkin()->getFont(); - FATAL_ERROR_IF(font == NULL, "Could not create/get font"); - - u32 text_height = font->getDimension(L"Hello, world!").Height; - infostream << "FontEngine: measured text_height=" << text_height << std::endl; + m_env->getSkin()->setFont(font); } /******************************************************************************/ @@ -272,18 +209,8 @@ gui::IGUIFont *FontEngine::initFont(const FontSpec &spec) assert(spec.size != FONT_SIZE_UNSPECIFIED); std::string setting_prefix = ""; - - switch (spec.mode) { - case FM_Fallback: - setting_prefix = "fallback_"; - break; - case FM_Mono: - case FM_SimpleMono: - setting_prefix = "mono_"; - break; - default: - break; - } + if (spec.mode == FM_Mono) + setting_prefix = "mono_"; std::string setting_suffix = ""; if (spec.bold) @@ -291,121 +218,53 @@ gui::IGUIFont *FontEngine::initFont(const FontSpec &spec) if (spec.italic) setting_suffix.append("_italic"); - u32 size = std::floor(RenderingEngine::getDisplayDensity() * - m_settings->getFloat("gui_scaling") * spec.size); + // Font size in pixels for FreeType + u32 size = rangelim(spec.size * RenderingEngine::getDisplayDensity() * + g_settings->getFloat("gui_scaling"), 1U, 500U); - if (size == 0) { - errorstream << "FontEngine: attempt to use font size 0" << std::endl; - errorstream << " display density: " << RenderingEngine::getDisplayDensity() << std::endl; - abort(); + // Constrain the font size to a certain multiple, if necessary + u16 divisible_by = g_settings->getU16(setting_prefix + "font_size_divisible_by"); + if (divisible_by > 1) { + size = std::max<u32>( + std::round((double)size / divisible_by) * divisible_by, divisible_by); } + sanity_check(size != 0); + u16 font_shadow = 0; u16 font_shadow_alpha = 0; g_settings->getU16NoEx(setting_prefix + "font_shadow", font_shadow); g_settings->getU16NoEx(setting_prefix + "font_shadow_alpha", font_shadow_alpha); - std::string wanted_font_path; - wanted_font_path = g_settings->get(setting_prefix + "font_path" + setting_suffix); + std::string path_setting; + if (spec.mode == _FM_Fallback) + path_setting = "fallback_font_path"; + else + path_setting = setting_prefix + "font_path" + setting_suffix; std::string fallback_settings[] = { - wanted_font_path, - m_settings->get("fallback_font_path"), - m_settings->getDefault(setting_prefix + "font_path") + g_settings->get(path_setting), + Settings::getLayer(SL_DEFAULTS)->get(path_setting) }; -#if USE_FREETYPE for (const std::string &font_path : fallback_settings) { - irr::gui::IGUIFont *font = gui::CGUITTFont::createTTFont(m_env, + gui::CGUITTFont *font = gui::CGUITTFont::createTTFont(m_env, font_path.c_str(), size, true, true, font_shadow, font_shadow_alpha); - if (font) - return font; - - errorstream << "FontEngine: Cannot load '" << font_path << + if (!font) { + errorstream << "FontEngine: Cannot load '" << font_path << "'. Trying to fall back to another path." << std::endl; - } - - - // give up - errorstream << "minetest can not continue without a valid font. " - "Please correct the 'font_path' setting or install the font " - "file in the proper location" << std::endl; -#else - errorstream << "FontEngine: Tried to load freetype fonts but Minetest was" - " not compiled with that library." << std::endl; -#endif - abort(); -} - -/** initialize a font without freetype */ -gui::IGUIFont *FontEngine::initSimpleFont(const FontSpec &spec) -{ - assert(spec.mode == FM_Simple || spec.mode == FM_SimpleMono); - assert(spec.size != FONT_SIZE_UNSPECIFIED); - - const std::string &font_path = m_settings->get( - (spec.mode == FM_SimpleMono) ? "mono_font_path" : "font_path"); - - size_t pos_dot = font_path.find_last_of('.'); - std::string basename = font_path; - std::string ending = lowercase(font_path.substr(pos_dot)); - - if (ending == ".ttf") { - errorstream << "FontEngine: Found font \"" << font_path - << "\" but freetype is not available." << std::endl; - return nullptr; - } - - if (ending == ".xml" || ending == ".png") - basename = font_path.substr(0, pos_dot); - - u32 size = std::floor( - RenderingEngine::getDisplayDensity() * - m_settings->getFloat("gui_scaling") * - spec.size); - - irr::gui::IGUIFont *font = nullptr; - std::string font_extensions[] = { ".png", ".xml" }; - - // Find nearest matching font scale - // Does a "zig-zag motion" (positibe/negative), from 0 to MAX_FONT_SIZE_OFFSET - for (s32 zoffset = 0; zoffset < MAX_FONT_SIZE_OFFSET * 2; zoffset++) { - std::stringstream path; - - // LSB to sign - s32 sign = (zoffset & 1) ? -1 : 1; - s32 offset = zoffset >> 1; - - for (const std::string &ext : font_extensions) { - path.str(""); // Clear - path << basename << "_" << (size + offset * sign) << ext; - - if (!fs::PathExists(path.str())) - continue; - - font = m_env->getFont(path.str().c_str()); - - if (font) { - verbosestream << "FontEngine: found font: " << path.str() << std::endl; - break; - } + continue; } - if (font) - break; - } - - // try name direct - if (font == NULL) { - if (fs::PathExists(font_path)) { - font = m_env->getFont(font_path.c_str()); - if (font) - verbosestream << "FontEngine: found font: " << font_path << std::endl; + if (spec.mode != _FM_Fallback) { + FontSpec spec2(spec); + spec2.mode = _FM_Fallback; + font->setFallback(getFont(spec2, true)); } + return font; } - - return font; + return nullptr; } diff --git a/src/client/fontengine.h b/src/client/fontengine.h index c6efa0df4..78608e517 100644 --- a/src/client/fontengine.h +++ b/src/client/fontengine.h @@ -20,21 +20,20 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include <map> -#include <vector> #include "util/basic_macros.h" +#include "irrlichttypes.h" #include <IGUIFont.h> #include <IGUISkin.h> #include <IGUIEnvironment.h> #include "settings.h" +#include "threading/mutex_auto_lock.h" #define FONT_SIZE_UNSPECIFIED 0xFFFFFFFF enum FontMode : u8 { FM_Standard = 0, FM_Mono, - FM_Fallback, - FM_Simple, - FM_SimpleMono, + _FM_Fallback, // do not use directly FM_MaxMode, FM_Unspecified }; @@ -46,7 +45,7 @@ struct FontSpec { bold(bold), italic(italic) {} - u16 getHash() + u16 getHash() const { return (mode << 2) | (static_cast<u8>(bold) << 1) | static_cast<u8>(italic); } @@ -61,7 +60,7 @@ class FontEngine { public: - FontEngine(Settings* main_settings, gui::IGUIEnvironment* env); + FontEngine(gui::IGUIEnvironment* env); ~FontEngine(); @@ -127,34 +126,30 @@ public: /** get font size for a specific mode */ unsigned int getFontSize(FontMode mode); - /** initialize font engine */ - void initialize(Settings* main_settings, gui::IGUIEnvironment* env); - /** update internal parameters from settings */ void readSettings(); private: + irr::gui::IGUIFont *getFont(FontSpec spec, bool may_fail); + /** update content of font cache in case of a setting change made it invalid */ void updateFontCache(); - /** initialize a new font */ + /** initialize a new TTF font */ gui::IGUIFont *initFont(const FontSpec &spec); - /** initialize a font without freetype */ - gui::IGUIFont *initSimpleFont(const FontSpec &spec); - /** update current minetest skin with font changes */ void updateSkin(); /** clean cache */ void cleanCache(); - /** pointer to settings for registering callbacks or reading config */ - Settings* m_settings = nullptr; - /** pointer to irrlicht gui environment */ gui::IGUIEnvironment* m_env = nullptr; + /** mutex used to protect font init and cache */ + std::recursive_mutex m_font_mutex; + /** internal storage for caching fonts of different size */ std::map<unsigned int, irr::gui::IGUIFont*> m_font_cache[FM_MaxMode << 2]; @@ -165,8 +160,8 @@ private: bool m_default_bold = false; bool m_default_italic = false; - /** current font engine mode */ - FontMode m_currentMode = FM_Standard; + /** default font engine mode (fixed) */ + static const FontMode m_currentMode = FM_Standard; DISABLE_CLASS_COPY(FontEngine); }; diff --git a/src/client/game.cpp b/src/client/game.cpp index 920383aaf..34bfb5aa6 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -43,7 +43,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gameparams.h" #include "gettext.h" #include "gui/guiChatConsole.h" -#include "gui/guiConfirmRegistration.h" #include "gui/guiFormSpecMenu.h" #include "gui/guiKeyChangeMenu.h" #include "gui/guiPasswordChange.h" @@ -68,6 +67,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/pointedthing.h" #include "util/quicktune_shortcutter.h" #include "irrlicht_changes/static_text.h" +#include "irr_ptr.h" #include "version.h" #include "script/scripting_client.h" #include "hud.h" @@ -171,13 +171,7 @@ struct LocalFormspecHandler : public TextDest return; } - if (fields.find("quit") != fields.end()) { - return; - } - - if (fields.find("btn_continue") != fields.end()) { - return; - } + return; } if (m_formname == "MT_DEATH_SCREEN") { @@ -186,7 +180,7 @@ struct LocalFormspecHandler : public TextDest return; } - if (m_client && m_client->modsLoaded()) + if (m_client->modsLoaded()) m_client->getScript()->on_formspec_input(m_formname, fields); } @@ -288,7 +282,7 @@ public: if (m_player_step_timer <= 0 && m_player_step_sound.exists()) { m_player_step_timer = 0.03; if (makes_footstep_sound) - m_sound->playSound(m_player_step_sound, false); + m_sound->playSound(m_player_step_sound); } } @@ -296,7 +290,7 @@ public: { if (m_player_jump_timer <= 0.0f) { m_player_jump_timer = 0.2f; - m_sound->playSound(SimpleSoundSpec("player_jump", 0.5f), false); + m_sound->playSound(SimpleSoundSpec("player_jump", 0.5f)); } } @@ -321,32 +315,32 @@ public: static void cameraPunchLeft(MtEvent *e, void *data) { SoundMaker *sm = (SoundMaker *)data; - sm->m_sound->playSound(sm->m_player_leftpunch_sound, false); + sm->m_sound->playSound(sm->m_player_leftpunch_sound); } static void cameraPunchRight(MtEvent *e, void *data) { SoundMaker *sm = (SoundMaker *)data; - sm->m_sound->playSound(sm->m_player_rightpunch_sound, false); + sm->m_sound->playSound(sm->m_player_rightpunch_sound); } static void nodeDug(MtEvent *e, void *data) { SoundMaker *sm = (SoundMaker *)data; NodeDugEvent *nde = (NodeDugEvent *)e; - sm->m_sound->playSound(sm->m_ndef->get(nde->n).sound_dug, false); + sm->m_sound->playSound(sm->m_ndef->get(nde->n).sound_dug); } static void playerDamage(MtEvent *e, void *data) { SoundMaker *sm = (SoundMaker *)data; - sm->m_sound->playSound(SimpleSoundSpec("player_damage", 0.5), false); + sm->m_sound->playSound(SimpleSoundSpec("player_damage", 0.5)); } static void playerFallingDamage(MtEvent *e, void *data) { SoundMaker *sm = (SoundMaker *)data; - sm->m_sound->playSound(SimpleSoundSpec("player_falling_damage", 0.5), false); + sm->m_sound->playSound(SimpleSoundSpec("player_falling_damage", 0.5)); } void registerReceiver(MtEventManager *mgr) @@ -405,12 +399,7 @@ public: }; -// before 1.8 there isn't a "integer interface", only float -#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) -typedef f32 SamplerLayer_t; -#else typedef s32 SamplerLayer_t; -#endif class GameGlobalShaderConstantSetter : public IShaderConstantSetter @@ -424,6 +413,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter CachedVertexShaderSetting<float> m_animation_timer_vertex; CachedPixelShaderSetting<float> m_animation_timer_pixel; CachedPixelShaderSetting<float, 3> m_day_light; + CachedPixelShaderSetting<float, 4> m_star_color; CachedPixelShaderSetting<float, 3> m_eye_position_pixel; CachedVertexShaderSetting<float, 3> m_eye_position_vertex; CachedPixelShaderSetting<float, 3> m_minimap_yaw; @@ -458,6 +448,7 @@ public: m_animation_timer_vertex("animationTimer"), m_animation_timer_pixel("animationTimer"), m_day_light("dayLight"), + m_star_color("starColor"), m_eye_position_pixel("eyePosition"), m_eye_position_vertex("eyePosition"), m_minimap_yaw("yawVec"), @@ -477,12 +468,8 @@ public: g_settings->deregisterChangedCallback("enable_fog", settingsCallback, this); } - virtual void onSetConstants(video::IMaterialRendererServices *services, - bool is_highlevel) + void onSetConstants(video::IMaterialRendererServices *services) override { - if (!is_highlevel) - return; - // Background color video::SColor bgcolor = m_sky->getBgColor(); video::SColorf bgcolorf(bgcolor); @@ -511,45 +498,31 @@ public: sunlight.b }; m_day_light.set(dnc, services); - u32 animation_timer = porting::getTimeMs() % 1000000; + video::SColorf star_color = m_sky->getCurrentStarColor(); + float clr[4] = {star_color.r, star_color.g, star_color.b, star_color.a}; + m_star_color.set(clr, services); + + u32 animation_timer = m_client->getEnv().getFrameTime() % 1000000; float animation_timer_f = (float)animation_timer / 100000.f; m_animation_timer_vertex.set(&animation_timer_f, services); m_animation_timer_pixel.set(&animation_timer_f, services); float eye_position_array[3]; v3f epos = m_client->getEnv().getLocalPlayer()->getEyePosition(); -#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) - eye_position_array[0] = epos.X; - eye_position_array[1] = epos.Y; - eye_position_array[2] = epos.Z; -#else epos.getAs3Values(eye_position_array); -#endif m_eye_position_pixel.set(eye_position_array, services); m_eye_position_vertex.set(eye_position_array, services); if (m_client->getMinimap()) { float minimap_yaw_array[3]; v3f minimap_yaw = m_client->getMinimap()->getYawVec(); -#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) - minimap_yaw_array[0] = minimap_yaw.X; - minimap_yaw_array[1] = minimap_yaw.Y; - minimap_yaw_array[2] = minimap_yaw.Z; -#else minimap_yaw.getAs3Values(minimap_yaw_array); -#endif m_minimap_yaw.set(minimap_yaw_array, services); } float camera_offset_array[3]; v3f offset = intToFloat(m_client->getCamera()->getOffset(), BS); -#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) - camera_offset_array[0] = offset.X; - camera_offset_array[1] = offset.Y; - camera_offset_array[2] = offset.Z; -#else offset.getAs3Values(camera_offset_array); -#endif m_camera_offset_pixel.set(camera_offset_array, services); m_camera_offset_vertex.set(camera_offset_array, services); @@ -589,7 +562,7 @@ public: virtual IShaderConstantSetter* create() { - GameGlobalShaderConstantSetter *scs = new GameGlobalShaderConstantSetter( + auto *scs = new GameGlobalShaderConstantSetter( m_sky, m_force_fog_off, m_fog_range, m_client); if (!m_sky) created_nosky.push_back(scs); @@ -597,7 +570,7 @@ public: } }; -#ifdef __ANDROID__ +#ifdef HAVE_TOUCHSCREENGUI #define SIZE_TAG "size[11,5.5]" #else #define SIZE_TAG "size[11,5.5,true]" // Fixed size on desktop @@ -606,10 +579,19 @@ public: /**************************************************************************** ****************************************************************************/ -const float object_hit_delay = 0.2; +const static float object_hit_delay = 0.2; struct FpsControl { - u32 last_time, busy_time, sleep_time; + FpsControl() : last_time(0), busy_time(0), sleep_time(0) {} + + void reset(); + + void limit(IrrlichtDevice *device, f32 *dtime); + + u32 getBusyMs() const { return busy_time / 1000; } + + // all values in microseconds (us) + u64 last_time, busy_time, sleep_time; }; @@ -659,6 +641,8 @@ struct ClientEventHandler THE GAME ****************************************************************************/ +using PausedNodesList = std::vector<std::pair<irr_ptr<scene::IAnimatedMeshSceneNode>, float>>; + /* This is not intended to be a public class. If a public class becomes * desirable then it may be better to create another 'wrapper' class that * hides most of the stuff in this class (nothing in this class is required @@ -671,6 +655,7 @@ public: bool startup(bool *kill, InputHandler *input, + RenderingEngine *rendering_engine, const GameStartData &game_params, std::string &error_message, bool *reconnect, @@ -681,8 +666,6 @@ public: protected: - void extendedResourceCleanup(); - // Basic initialisation bool init(const std::string &map_dir, const std::string &address, u16 port, const SubgameSpec &gamespec); @@ -706,6 +689,7 @@ protected: bool handleCallbacks(); void processQueues(); void updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime); + void updateDebugState(); void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime); void updateProfilerGraphs(ProfilerGraph *graph); @@ -723,6 +707,7 @@ protected: void toggleFast(); void toggleNoClip(); void toggleCinematic(); + void toggleBlockBounds(); void toggleAutoforward(); void toggleMinimap(bool shift_pressed); @@ -740,9 +725,9 @@ protected: void updatePlayerControl(const CameraOrientation &cam); void step(f32 *dtime); void processClientEvents(CameraOrientation *cam); - void updateCamera(u32 busy_time, f32 dtime); + void updateCamera(f32 dtime); void updateSound(f32 dtime); - void processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug); + void processPlayerInteraction(f32 dtime, bool show_hud); /*! * Returns the object or node the player is pointing at. * Also updates the selected thing in the Hud. @@ -768,10 +753,9 @@ protected: const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime); void updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, const CameraOrientation &cam); + void updateShadows(); // Misc - void limitFps(FpsControl *fps_timings, f32 *dtime); - void showOverlayMessage(const char *msg, float dtime, int percent, bool draw_clouds = true); @@ -808,6 +792,9 @@ private: void showDeathFormspec(); void showPauseMenu(); + void pauseAnimation(); + void resumeAnimation(); + // ClientEvent handlers void handleClientEvent_None(ClientEvent *event, CameraOrientation *cam); void handleClientEvent_PlayerDamage(ClientEvent *event, CameraOrientation *cam); @@ -828,13 +815,15 @@ private: CameraOrientation *cam); void handleClientEvent_CloudParams(ClientEvent *event, CameraOrientation *cam); - void updateChat(f32 dtime, const v2u32 &screensize); + void updateChat(f32 dtime); bool nodePlacement(const ItemDefinition &selected_def, const ItemStack &selected_item, const v3s16 &nodepos, const v3s16 &neighbourpos, const PointedThing &pointed, const NodeMetadata *meta); static const ClientEventHandler clientEventHandler[CLIENTEVENT_MAX]; + f32 getSensitivityScaleFactor() const; + InputHandler *input = nullptr; Client *client = nullptr; @@ -857,7 +846,6 @@ private: EventManager *eventmgr = nullptr; QuicktuneShortcutter *quicktune = nullptr; - bool registration_confirmation_shown = false; std::unique_ptr<GameUI> m_game_ui; GUIChatConsole *gui_chat_console = nullptr; // Free using ->Drop() @@ -868,6 +856,9 @@ private: Hud *hud = nullptr; Minimap *mapper = nullptr; + // Map server hud ids to client hud ids + std::unordered_map<u32, u32> m_hud_server_to_client; + GameRunData runData; Flags m_flags; @@ -876,12 +867,14 @@ private: these items (e.g. device) */ IrrlichtDevice *device; + RenderingEngine *m_rendering_engine; video::IVideoDriver *driver; scene::ISceneManager *smgr; bool *kill; std::string *error_message; bool *reconnect_requested; scene::ISceneNode *skybox; + PausedNodesList paused_animated_nodes; bool simple_singleplayer_mode; /* End 'cache' */ @@ -917,8 +910,14 @@ private: bool m_does_lost_focus_pause_game = false; -#ifdef __ANDROID__ +#if IRRLICHT_VERSION_MT_REVISION < 5 + int m_reset_HW_buffer_counter = 0; +#endif + +#ifdef HAVE_TOUCHSCREENGUI bool m_cache_hold_aux1; +#endif +#ifdef __ANDROID__ bool m_android_chat_open; #endif }; @@ -956,7 +955,7 @@ Game::Game() : readSettings(); -#ifdef __ANDROID__ +#ifdef HAVE_TOUCHSCREENGUI m_cache_hold_aux1 = false; // This is initialised properly later #endif @@ -987,7 +986,7 @@ Game::~Game() delete itemdef_manager; delete draw_control; - extendedResourceCleanup(); + clearTextureNameCache(); g_settings->deregisterChangedCallback("doubletap_jump", &settingChangedCallback, this); @@ -1015,6 +1014,7 @@ Game::~Game() bool Game::startup(bool *kill, InputHandler *input, + RenderingEngine *rendering_engine, const GameStartData &start_data, std::string &error_message, bool *reconnect, @@ -1022,21 +1022,21 @@ bool Game::startup(bool *kill, { // "cache" - this->device = RenderingEngine::get_raw_device(); + m_rendering_engine = rendering_engine; + device = m_rendering_engine->get_raw_device(); this->kill = kill; this->error_message = &error_message; - this->reconnect_requested = reconnect; + reconnect_requested = reconnect; this->input = input; this->chat_backend = chat_backend; - this->simple_singleplayer_mode = start_data.isSinglePlayer(); + simple_singleplayer_mode = start_data.isSinglePlayer(); input->keycache.populate(); driver = device->getVideoDriver(); - smgr = RenderingEngine::get_scene_manager(); + smgr = m_rendering_engine->get_scene_manager(); - RenderingEngine::get_scene_manager()->getParameters()-> - setAttribute(scene::OBJ_LOADER_IGNORE_MATERIAL_FILES, true); + smgr->getParameters()->setAttribute(scene::OBJ_LOADER_IGNORE_MATERIAL_FILES, true); // Reinit runData runData = GameRunData(); @@ -1057,7 +1057,7 @@ bool Game::startup(bool *kill, if (!createClient(start_data)) return false; - RenderingEngine::initialize(client, hud); + m_rendering_engine->initialize(client, hud); return true; } @@ -1066,21 +1066,21 @@ bool Game::startup(bool *kill, void Game::run() { ProfilerGraph graph; - RunStats stats = { 0 }; - CameraOrientation cam_view_target = { 0 }; - CameraOrientation cam_view = { 0 }; - FpsControl draw_times = { 0 }; + RunStats stats = {}; + CameraOrientation cam_view_target = {}; + CameraOrientation cam_view = {}; + FpsControl draw_times; f32 dtime; // in seconds /* Clear the profiler */ Profiler::GraphValues dummyvalues; g_profiler->graphGet(dummyvalues); - draw_times.last_time = RenderingEngine::get_timer_time(); + draw_times.reset(); set_light_table(g_settings->getFloat("display_gamma")); -#ifdef __ANDROID__ +#ifdef HAVE_TOUCHSCREENGUI m_cache_hold_aux1 = g_settings->getBool("fast_move") && client->checkPrivilege("fast"); #endif @@ -1088,12 +1088,12 @@ void Game::run() irr::core::dimension2d<u32> previous_screen_size(g_settings->getU16("screen_w"), g_settings->getU16("screen_h")); - while (RenderingEngine::run() + while (m_rendering_engine->run() && !(*kill || g_gamecallback->shutdown_requested || (server && server->isShutdownRequested()))) { const irr::core::dimension2d<u32> ¤t_screen_size = - RenderingEngine::get_video_driver()->getScreenSize(); + m_rendering_engine->get_video_driver()->getScreenSize(); // Verify if window size has changed and save it if it's the case // Ensure evaluating settings->getBool after verifying screensize // First condition is cheaper @@ -1106,9 +1106,9 @@ void Game::run() } // Calculate dtime = - // RenderingEngine::run() from this iteration + // m_rendering_engine->run() from this iteration // + Sleep time until the wanted FPS are reached - limitFps(&draw_times, &dtime); + draw_times.limit(device, &dtime); // Prepare render data for next iteration @@ -1125,6 +1125,7 @@ void Game::run() m_game_ui->clearInfoText(); hud->resizeHotbar(); + updateProfilers(stats, draw_times, dtime); processUserInput(dtime); // Update camera before player movement to avoid camera lag of one frame @@ -1136,10 +1137,10 @@ void Game::run() updatePlayerControl(cam_view); step(&dtime); processClientEvents(&cam_view_target); - updateCamera(draw_times.busy_time, dtime); + updateDebugState(); + updateCamera(dtime); updateSound(dtime); - processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud, - m_game_ui->m_flags.show_debug); + processPlayerInteraction(dtime, m_game_ui->m_flags.show_hud); updateFrame(&graph, &stats, dtime, cam_view); updateProfilerGraphs(&graph); @@ -1155,7 +1156,7 @@ void Game::run() void Game::shutdown() { - RenderingEngine::finalize(); + m_rendering_engine->finalize(); #if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 8 if (g_settings->get("3d_mode") == "pageflip") { driver->setRenderTarget(irr::video::ERT_STEREO_BOTH_BUFFERS); @@ -1293,9 +1294,8 @@ bool Game::createSingleplayerServer(const std::string &map_dir, } if (bind_addr.isIPv6() && !g_settings->getBool("enable_ipv6")) { - *error_message = "Unable to listen on " + - bind_addr.serializeString() + - " because IPv6 is disabled"; + *error_message = fmtgettext("Unable to listen on %s because IPv6 is disabled", + bind_addr.serializeString().c_str()); errorstream << *error_message << std::endl; return false; } @@ -1311,7 +1311,7 @@ bool Game::createClient(const GameStartData &start_data) { showOverlayMessage(N_("Creating client..."), 0, 10); - draw_control = new MapDrawControl; + draw_control = new MapDrawControl(); if (!draw_control) return false; @@ -1328,7 +1328,7 @@ bool Game::createClient(const GameStartData &start_data) if (!could_connect) { if (error_message->empty() && !connect_aborted) { // Should not happen if error messages are set properly - *error_message = "Connection failed for unknown reason"; + *error_message = gettext("Connection failed for unknown reason"); errorstream << *error_message << std::endl; } return false; @@ -1337,13 +1337,13 @@ bool Game::createClient(const GameStartData &start_data) if (!getServerContent(&connect_aborted)) { if (error_message->empty() && !connect_aborted) { // Should not happen if error messages are set properly - *error_message = "Connection failed for unknown reason"; + *error_message = gettext("Connection failed for unknown reason"); errorstream << *error_message << std::endl; } return false; } - GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory( + auto *scsf = new GameGlobalShaderConstantSetterFactory( &m_flags.force_fog_off, &runData.fog_range, client); shader_src->addShaderConstantSetterFactory(scsf); @@ -1352,34 +1352,22 @@ bool Game::createClient(const GameStartData &start_data) /* Camera */ - camera = new Camera(*draw_control, client); - if (!camera || !camera->successfullyCreated(*error_message)) - return false; + camera = new Camera(*draw_control, client, m_rendering_engine); + if (client->modsLoaded()) + client->getScript()->on_camera_ready(camera); client->setCamera(camera); /* Clouds */ - if (m_cache_enable_clouds) { + if (m_cache_enable_clouds) clouds = new Clouds(smgr, -1, time(0)); - if (!clouds) { - *error_message = "Memory allocation error (clouds)"; - errorstream << *error_message << std::endl; - return false; - } - } /* Skybox */ - sky = new Sky(-1, texture_src); + sky = new Sky(-1, m_rendering_engine, texture_src, shader_src); scsf->setSky(sky); skybox = NULL; // This is used/set later on in the main run loop - if (!sky) { - *error_message = "Memory allocation error sky"; - errorstream << *error_message << std::endl; - return false; - } - /* Pre-calculated values */ video::ITexture *t = texture_src->getTexture("crack_anylength.png"); @@ -1398,29 +1386,33 @@ bool Game::createClient(const GameStartData &start_data) std::wstring str = utf8_to_wide(PROJECT_NAME_C); str += L" "; str += utf8_to_wide(g_version_hash); + { + const wchar_t *text = nullptr; + if (simple_singleplayer_mode) + text = wgettext("Singleplayer"); + else + text = wgettext("Multiplayer"); + str += L" ["; + str += text; + str += L"]"; + delete[] text; + } str += L" ["; str += driver->getName(); str += L"]"; + device->setWindowCaption(str.c_str()); LocalPlayer *player = client->getEnv().getLocalPlayer(); player->hurt_tilt_timer = 0; player->hurt_tilt_strength = 0; - hud = new Hud(guienv, client, player, &player->inventory); - - if (!hud) { - *error_message = "Memory error: could not create HUD"; - errorstream << *error_message << std::endl; - return false; - } + hud = new Hud(client, player, &player->inventory); mapper = client->getMinimap(); - if (mapper) { - mapper->setMinimapMode(MINIMAP_MODE_OFF); - if (client->modsLoaded()) - client->getScript()->on_minimap_ready(mapper); - } + + if (mapper && client->modsLoaded()) + client->getScript()->on_minimap_ready(mapper); return true; } @@ -1438,11 +1430,6 @@ bool Game::initGui() // Chat backend and console gui_chat_console = new GUIChatConsole(guienv, guienv->getRootGUIElement(), -1, chat_backend, client, &g_menumgr); - if (!gui_chat_console) { - *error_message = "Could not allocate memory for chat console"; - errorstream << *error_message << std::endl; - return false; - } #ifdef HAVE_TOUCHSCREENGUI @@ -1469,7 +1456,6 @@ bool Game::connectToServer(const GameStartData &start_data, connect_address.Resolve(start_data.address.c_str()); if (connect_address.isZero()) { // i.e. INADDR_ANY, IN6ADDR_ANY - //connect_address.Resolve("localhost"); if (connect_address.isIPv6()) { IPv6AddressBytes addr_bytes; addr_bytes.bytes[15] = 1; @@ -1480,32 +1466,36 @@ bool Game::connectToServer(const GameStartData &start_data, local_server_mode = true; } } catch (ResolveError &e) { - *error_message = std::string("Couldn't resolve address: ") + e.what(); + *error_message = fmtgettext("Couldn't resolve address: %s", e.what()); + errorstream << *error_message << std::endl; return false; } if (connect_address.isIPv6() && !g_settings->getBool("enable_ipv6")) { - *error_message = "Unable to connect to " + - connect_address.serializeString() + - " because IPv6 is disabled"; + *error_message = fmtgettext("Unable to connect to %s because IPv6 is disabled", connect_address.serializeString().c_str()); errorstream << *error_message << std::endl; return false; } - client = new Client(start_data.name.c_str(), - start_data.password, start_data.address, - *draw_control, texture_src, shader_src, - itemdef_manager, nodedef_manager, sound, eventmgr, - connect_address.isIPv6(), m_game_ui.get()); - - if (!client) + try { + client = new Client(start_data.name.c_str(), + start_data.password, start_data.address, + *draw_control, texture_src, shader_src, + itemdef_manager, nodedef_manager, sound, eventmgr, + m_rendering_engine, connect_address.isIPv6(), m_game_ui.get(), + start_data.allow_login_or_register); + client->migrateModStorage(); + } catch (const BaseException &e) { + *error_message = fmtgettext("Error creating client: %s", e.what()); + errorstream << *error_message << std::endl; return false; + } client->m_simple_singleplayer_mode = simple_singleplayer_mode; infostream << "Connecting to server at "; - connect_address.print(&infostream); + connect_address.print(infostream); infostream << std::endl; client->connect(connect_address, @@ -1518,15 +1508,15 @@ bool Game::connectToServer(const GameStartData &start_data, try { input->clear(); - FpsControl fps_control = { 0 }; + FpsControl fps_control; f32 dtime; f32 wait_time = 0; // in seconds - fps_control.last_time = RenderingEngine::get_timer_time(); + fps_control.reset(); - while (RenderingEngine::run()) { + while (m_rendering_engine->run()) { - limitFps(&fps_control, &dtime); + fps_control.limit(device, &dtime); // Update client and server client->step(dtime); @@ -1545,8 +1535,7 @@ bool Game::connectToServer(const GameStartData &start_data, break; if (client->accessDenied()) { - *error_message = "Access denied. Reason: " - + client->accessDeniedReason(); + *error_message = fmtgettext("Access denied. Reason: %s", client->accessDeniedReason().c_str()); *reconnect_requested = client->reconnectRequested(); errorstream << *error_message << std::endl; break; @@ -1558,28 +1547,16 @@ bool Game::connectToServer(const GameStartData &start_data, break; } - if (client->m_is_registration_confirmation_state) { - if (registration_confirmation_shown) { - // Keep drawing the GUI - RenderingEngine::draw_menu_scene(guienv, dtime, true); - } else { - registration_confirmation_shown = true; - (new GUIConfirmRegistration(guienv, guienv->getRootGUIElement(), -1, - &g_menumgr, client, start_data.name, start_data.password, - connection_aborted, texture_src))->drop(); - } - } else { - wait_time += dtime; - // Only time out if we aren't waiting for the server we started - if (!start_data.isSinglePlayer() && wait_time > 10) { - *error_message = "Connection timed out."; - errorstream << *error_message << std::endl; - break; - } - - // Update status - showOverlayMessage(N_("Connecting to server..."), dtime, 20); + wait_time += dtime; + // Only time out if we aren't waiting for the server we started + if (!start_data.address.empty() && wait_time > 10) { + *error_message = gettext("Connection timed out."); + errorstream << *error_message << std::endl; + break; } + + // Update status + showOverlayMessage(N_("Connecting to server..."), dtime, 20); } } catch (con::PeerNotFoundException &e) { // TODO: Should something be done here? At least an info/error @@ -1594,14 +1571,14 @@ bool Game::getServerContent(bool *aborted) { input->clear(); - FpsControl fps_control = { 0 }; + FpsControl fps_control; f32 dtime; // in seconds - fps_control.last_time = RenderingEngine::get_timer_time(); + fps_control.reset(); - while (RenderingEngine::run()) { + while (m_rendering_engine->run()) { - limitFps(&fps_control, &dtime); + fps_control.limit(device, &dtime); // Update client and server client->step(dtime); @@ -1620,7 +1597,7 @@ bool Game::getServerContent(bool *aborted) return false; if (client->getState() < LC_Init) { - *error_message = "Client disconnected"; + *error_message = gettext("Client disconnected"); errorstream << *error_message << std::endl; return false; } @@ -1637,20 +1614,23 @@ bool Game::getServerContent(bool *aborted) if (!client->itemdefReceived()) { const wchar_t *text = wgettext("Item definitions..."); progress = 25; - RenderingEngine::draw_load_screen(text, guienv, texture_src, + m_rendering_engine->draw_load_screen(text, guienv, texture_src, dtime, progress); delete[] text; } else if (!client->nodedefReceived()) { const wchar_t *text = wgettext("Node definitions..."); progress = 30; - RenderingEngine::draw_load_screen(text, guienv, texture_src, + m_rendering_engine->draw_load_screen(text, guienv, texture_src, dtime, progress); delete[] text; } else { - std::stringstream message; + std::ostringstream message; std::fixed(message); message.precision(0); - message << gettext("Media...") << " " << (client->mediaReceiveProgress()*100) << "%"; + float receive = client->mediaReceiveProgress() * 100; + message << gettext("Media..."); + if (receive > 0) + message << " " << receive << "%"; message.precision(2); if ((USE_CURL == 0) || @@ -1667,7 +1647,7 @@ bool Game::getServerContent(bool *aborted) } progress = 30 + client->mediaReceiveProgress() * 35 + 0.5; - RenderingEngine::draw_load_screen(utf8_to_wide(message.str()), guienv, + m_rendering_engine->draw_load_screen(utf8_to_wide(message.str()), guienv, texture_src, dtime, progress); } } @@ -1699,8 +1679,7 @@ inline void Game::updateInteractTimers(f32 dtime) inline bool Game::checkConnection() { if (client->accessDenied()) { - *error_message = "Access denied. Reason: " - + client->accessDeniedReason(); + *error_message = fmtgettext("Access denied. Reason: %s", client->accessDeniedReason().c_str()); *reconnect_requested = client->reconnectRequested(); errorstream << *error_message << std::endl; return false; @@ -1753,6 +1732,29 @@ void Game::processQueues() shader_src->processQueue(); } +void Game::updateDebugState() +{ + LocalPlayer *player = client->getEnv().getLocalPlayer(); + + // debug UI and wireframe + bool has_debug = client->checkPrivilege("debug"); + bool has_basic_debug = has_debug || (player->hud_flags & HUD_FLAG_BASIC_DEBUG); + + if (m_game_ui->m_flags.show_basic_debug) { + if (!has_basic_debug) + m_game_ui->m_flags.show_basic_debug = false; + } else if (m_game_ui->m_flags.show_minimal_debug) { + if (has_basic_debug) + m_game_ui->m_flags.show_basic_debug = true; + } + if (!has_basic_debug) + hud->disableBlockBounds(); + if (!has_debug) + draw_control->show_wireframe = false; + + // noclip + draw_control->allow_noclip = m_cache_enable_noclip && client->checkPrivilege("noclip"); +} void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times, f32 dtime) @@ -1777,10 +1779,10 @@ void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times, } // Update update graphs - g_profiler->graphAdd("Time non-rendering [ms]", + g_profiler->graphAdd("Time non-rendering [us]", draw_times.busy_time - stats.drawtime); - g_profiler->graphAdd("Sleep [ms]", draw_times.sleep_time); + g_profiler->graphAdd("Sleep [us]", draw_times.sleep_time); g_profiler->graphAdd("FPS", 1.0f / dtime); } @@ -1813,9 +1815,9 @@ void Game::updateStats(RunStats *stats, const FpsControl &draw_times, /* Busytime average and jitter calculation */ jp = &stats->busy_time_jitter; - jp->avg = jp->avg + draw_times.busy_time * 0.02; + jp->avg = jp->avg + draw_times.getBusyMs() * 0.02; - jitter = draw_times.busy_time - jp->avg; + jitter = draw_times.getBusyMs() - jp->avg; if (jitter > jp->max) jp->max = jitter; @@ -1852,6 +1854,7 @@ void Game::processUserInput(f32 dtime) else if (g_touchscreengui) { /* on touchscreengui step may generate own input events which ain't * what we want in case we just did clear them */ + g_touchscreengui->show(); g_touchscreengui->step(dtime); } #endif @@ -1906,7 +1909,7 @@ void Game::processKeyInput() if (client->modsLoaded()) openConsole(0.2, L"."); else - m_game_ui->showStatusText(wgettext("Client side scripting is disabled")); + m_game_ui->showTranslatedStatusText("Client side scripting is disabled"); } else if (wasKeyDown(KeyType::CONSOLE)) { openConsole(core::clamp(g_settings->getFloat("console_height"), 0.1f, 1.0f)); } else if (wasKeyDown(KeyType::FREEMOVE)) { @@ -1933,25 +1936,19 @@ void Game::processKeyInput() } } else if (wasKeyDown(KeyType::INC_VOLUME)) { if (g_settings->getBool("enable_sound")) { - float new_volume = rangelim(g_settings->getFloat("sound_volume") + 0.1f, 0.0f, 1.0f); - wchar_t buf[100]; + float new_volume = g_settings->getFloat("sound_volume", 0.0f, 0.9f) + 0.1f; g_settings->setFloat("sound_volume", new_volume); - const wchar_t *str = wgettext("Volume changed to %d%%"); - swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, myround(new_volume * 100)); - delete[] str; - m_game_ui->showStatusText(buf); + std::wstring msg = fwgettext("Volume changed to %d%%", myround(new_volume * 100)); + m_game_ui->showStatusText(msg); } else { m_game_ui->showTranslatedStatusText("Sound system is disabled"); } } else if (wasKeyDown(KeyType::DEC_VOLUME)) { if (g_settings->getBool("enable_sound")) { - float new_volume = rangelim(g_settings->getFloat("sound_volume") - 0.1f, 0.0f, 1.0f); - wchar_t buf[100]; + float new_volume = g_settings->getFloat("sound_volume", 0.1f, 1.0f) - 0.1f; g_settings->setFloat("sound_volume", new_volume); - const wchar_t *str = wgettext("Volume changed to %d%%"); - swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, myround(new_volume * 100)); - delete[] str; - m_game_ui->showStatusText(buf); + std::wstring msg = fwgettext("Volume changed to %d%%", myround(new_volume * 100)); + m_game_ui->showStatusText(msg); } else { m_game_ui->showTranslatedStatusText("Sound system is disabled"); } @@ -1964,6 +1961,8 @@ void Game::processKeyInput() toggleCinematic(); } else if (wasKeyDown(KeyType::SCREENSHOT)) { client->makeScreenshot(); + } else if (wasKeyDown(KeyType::TOGGLE_BLOCK_BOUNDS)) { + toggleBlockBounds(); } else if (wasKeyDown(KeyType::TOGGLE_HUD)) { m_game_ui->toggleHud(); } else if (wasKeyDown(KeyType::MINIMAP)) { @@ -2020,15 +2019,11 @@ void Game::processItemSelection(u16 *new_playeritem) s32 dir = wheel; - if (input->joystick.wasKeyDown(KeyType::SCROLL_DOWN) || - wasKeyDown(KeyType::HOTBAR_NEXT)) { + if (wasKeyDown(KeyType::HOTBAR_NEXT)) dir = -1; - } - if (input->joystick.wasKeyDown(KeyType::SCROLL_UP) || - wasKeyDown(KeyType::HOTBAR_PREV)) { + if (wasKeyDown(KeyType::HOTBAR_PREV)) dir = 1; - } if (dir < 0) *new_playeritem = *new_playeritem < max_item ? *new_playeritem + 1 : 0; @@ -2076,15 +2071,22 @@ void Game::openInventory() InventoryLocation inventoryloc; inventoryloc.setCurrentPlayer(); - if (!client->modsLoaded() - || !client->getScript()->on_inventory_open(fs_src->m_client->getInventory(inventoryloc))) { - TextDest *txt_dst = new TextDestPlayerInventory(client); - auto *&formspec = m_game_ui->updateFormspec(""); - GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src, - txt_dst, client->getFormspecPrepend()); - - formspec->setFormSpec(fs_src->getForm(), inventoryloc); + if (client->modsLoaded() && client->getScript()->on_inventory_open(fs_src->m_client->getInventory(inventoryloc))) { + delete fs_src; + return; } + + if (fs_src->getForm().empty()) { + delete fs_src; + return; + } + + TextDest *txt_dst = new TextDestPlayerInventory(client); + auto *&formspec = m_game_ui->updateFormspec(""); + GUIFormSpecMenu::create(formspec, client, m_rendering_engine->get_gui_env(), + &input->joystick, fs_src, txt_dst, client->getFormspecPrepend(), sound); + + formspec->setFormSpec(fs_src->getForm(), inventoryloc); } @@ -2172,7 +2174,7 @@ void Game::toggleFast() m_game_ui->showTranslatedStatusText("Fast mode disabled"); } -#ifdef __ANDROID__ +#ifdef HAVE_TOUCHSCREENGUI m_cache_hold_aux1 = fast_move && has_fast_privs; #endif } @@ -2205,6 +2207,32 @@ void Game::toggleCinematic() m_game_ui->showTranslatedStatusText("Cinematic mode disabled"); } +void Game::toggleBlockBounds() +{ + LocalPlayer *player = client->getEnv().getLocalPlayer(); + if (!(client->checkPrivilege("debug") || (player->hud_flags & HUD_FLAG_BASIC_DEBUG))) { + m_game_ui->showTranslatedStatusText("Can't show block bounds (disabled by mod or game)"); + return; + } + enum Hud::BlockBoundsMode newmode = hud->toggleBlockBounds(); + switch (newmode) { + case Hud::BLOCK_BOUNDS_OFF: + m_game_ui->showTranslatedStatusText("Block bounds hidden"); + break; + case Hud::BLOCK_BOUNDS_CURRENT: + m_game_ui->showTranslatedStatusText("Block bounds shown for current block"); + break; + case Hud::BLOCK_BOUNDS_NEAR: + m_game_ui->showTranslatedStatusText("Block bounds shown for nearby blocks"); + break; + case Hud::BLOCK_BOUNDS_MAX: + m_game_ui->showTranslatedStatusText("Block bounds shown for all blocks"); + break; + default: + break; + } +} + // Autoforward by toggling continuous forward. void Game::toggleAutoforward() { @@ -2222,52 +2250,37 @@ void Game::toggleMinimap(bool shift_pressed) if (!mapper || !m_game_ui->m_flags.show_hud || !g_settings->getBool("enable_minimap")) return; - if (shift_pressed) { + if (shift_pressed) mapper->toggleMinimapShape(); - return; - } + else + mapper->nextMode(); + // TODO: When legacy minimap is deprecated, keep only HUD minimap stuff here + + // Not so satisying code to keep compatibility with old fixed mode system + // --> u32 hud_flags = client->getEnv().getLocalPlayer()->hud_flags; - MinimapMode mode = MINIMAP_MODE_OFF; - if (hud_flags & HUD_FLAG_MINIMAP_VISIBLE) { - mode = mapper->getMinimapMode(); - mode = (MinimapMode)((int)mode + 1); - // If radar is disabled and in, or switching to, radar mode - if (!(hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE) && mode > 3) - mode = MINIMAP_MODE_OFF; - } + if (!(hud_flags & HUD_FLAG_MINIMAP_VISIBLE)) { + m_game_ui->m_flags.show_minimap = false; + } else { - m_game_ui->m_flags.show_minimap = true; - switch (mode) { - case MINIMAP_MODE_SURFACEx1: - m_game_ui->showTranslatedStatusText("Minimap in surface mode, Zoom x1"); - break; - case MINIMAP_MODE_SURFACEx2: - m_game_ui->showTranslatedStatusText("Minimap in surface mode, Zoom x2"); - break; - case MINIMAP_MODE_SURFACEx4: - m_game_ui->showTranslatedStatusText("Minimap in surface mode, Zoom x4"); - break; - case MINIMAP_MODE_RADARx1: - m_game_ui->showTranslatedStatusText("Minimap in radar mode, Zoom x1"); - break; - case MINIMAP_MODE_RADARx2: - m_game_ui->showTranslatedStatusText("Minimap in radar mode, Zoom x2"); - break; - case MINIMAP_MODE_RADARx4: - m_game_ui->showTranslatedStatusText("Minimap in radar mode, Zoom x4"); - break; - default: - mode = MINIMAP_MODE_OFF; - m_game_ui->m_flags.show_minimap = false; - if (hud_flags & HUD_FLAG_MINIMAP_VISIBLE) - m_game_ui->showTranslatedStatusText("Minimap hidden"); - else - m_game_ui->showTranslatedStatusText("Minimap currently disabled by game or mod"); - } + // If radar is disabled, try to find a non radar mode or fall back to 0 + if (!(hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE)) + while (mapper->getModeIndex() && + mapper->getModeDef().type == MINIMAP_TYPE_RADAR) + mapper->nextMode(); - mapper->setMinimapMode(mode); + m_game_ui->m_flags.show_minimap = mapper->getModeDef().type != + MINIMAP_TYPE_OFF; + } + // <-- + // End of 'not so satifying code' + if ((hud_flags & HUD_FLAG_MINIMAP_VISIBLE) || + (hud && hud->hasElementOfType(HUD_ELEM_MINIMAP))) + m_game_ui->showStatusText(utf8_to_wide(mapper->getModeDef().label)); + else + m_game_ui->showTranslatedStatusText("Minimap currently disabled by game or mod"); } void Game::toggleFog() @@ -2283,27 +2296,44 @@ void Game::toggleFog() void Game::toggleDebug() { - // Initial / 4x toggle: Chat only - // 1x toggle: Debug text with chat + LocalPlayer *player = client->getEnv().getLocalPlayer(); + bool has_debug = client->checkPrivilege("debug"); + bool has_basic_debug = has_debug || (player->hud_flags & HUD_FLAG_BASIC_DEBUG); + // Initial: No debug info + // 1x toggle: Debug text // 2x toggle: Debug text with profiler graph - // 3x toggle: Debug text and wireframe - if (!m_game_ui->m_flags.show_debug) { - m_game_ui->m_flags.show_debug = true; + // 3x toggle: Debug text and wireframe (needs "debug" priv) + // Next toggle: Back to initial + // + // The debug text can be in 2 modes: minimal and basic. + // * Minimal: Only technical client info that not gameplay-relevant + // * Basic: Info that might give gameplay advantage, e.g. pos, angle + // Basic mode is used when player has the debug HUD flag set, + // otherwise the Minimal mode is used. + if (!m_game_ui->m_flags.show_minimal_debug) { + m_game_ui->m_flags.show_minimal_debug = true; + if (has_basic_debug) + m_game_ui->m_flags.show_basic_debug = true; m_game_ui->m_flags.show_profiler_graph = false; draw_control->show_wireframe = false; m_game_ui->showTranslatedStatusText("Debug info shown"); } else if (!m_game_ui->m_flags.show_profiler_graph && !draw_control->show_wireframe) { + if (has_basic_debug) + m_game_ui->m_flags.show_basic_debug = true; m_game_ui->m_flags.show_profiler_graph = true; m_game_ui->showTranslatedStatusText("Profiler graph shown"); } else if (!draw_control->show_wireframe && client->checkPrivilege("debug")) { + if (has_basic_debug) + m_game_ui->m_flags.show_basic_debug = true; m_game_ui->m_flags.show_profiler_graph = false; draw_control->show_wireframe = true; m_game_ui->showTranslatedStatusText("Wireframe shown"); } else { - m_game_ui->m_flags.show_debug = false; + m_game_ui->m_flags.show_minimal_debug = false; + m_game_ui->m_flags.show_basic_debug = false; m_game_ui->m_flags.show_profiler_graph = false; draw_control->show_wireframe = false; - if (client->checkPrivilege("debug")) { + if (has_debug) { m_game_ui->showTranslatedStatusText("Debug info, profiler graph, and wireframe hidden"); } else { m_game_ui->showTranslatedStatusText("Debug info and profiler graph hidden"); @@ -2327,20 +2357,13 @@ void Game::increaseViewRange() s16 range = g_settings->getS16("viewing_range"); s16 range_new = range + 10; - wchar_t buf[255]; - const wchar_t *str; if (range_new > 4000) { range_new = 4000; - str = wgettext("Viewing range is at maximum: %d"); - swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, range_new); - delete[] str; - m_game_ui->showStatusText(buf); - + std::wstring msg = fwgettext("Viewing range is at maximum: %d", range_new); + m_game_ui->showStatusText(msg); } else { - str = wgettext("Viewing range changed to %d"); - swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, range_new); - delete[] str; - m_game_ui->showStatusText(buf); + std::wstring msg = fwgettext("Viewing range changed to %d", range_new); + m_game_ui->showStatusText(msg); } g_settings->set("viewing_range", itos(range_new)); } @@ -2351,19 +2374,13 @@ void Game::decreaseViewRange() s16 range = g_settings->getS16("viewing_range"); s16 range_new = range - 10; - wchar_t buf[255]; - const wchar_t *str; if (range_new < 20) { range_new = 20; - str = wgettext("Viewing range is at minimum: %d"); - swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, range_new); - delete[] str; - m_game_ui->showStatusText(buf); + std::wstring msg = fwgettext("Viewing range is at minimum: %d", range_new); + m_game_ui->showStatusText(msg); } else { - str = wgettext("Viewing range changed to %d"); - swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, range_new); - delete[] str; - m_game_ui->showStatusText(buf); + std::wstring msg = fwgettext("Viewing range changed to %d", range_new); + m_game_ui->showStatusText(msg); } g_settings->set("viewing_range", itos(range_new)); } @@ -2386,7 +2403,6 @@ void Game::checkZoomEnabled() m_game_ui->showTranslatedStatusText("Zoom currently disabled by game or mod"); } - void Game::updateCameraDirection(CameraOrientation *cam, float dtime) { if ((device->isWindowActive() && device->isWindowFocused() @@ -2422,6 +2438,18 @@ void Game::updateCameraDirection(CameraOrientation *cam, float dtime) } } +// Get the factor to multiply with sensitivity to get the same mouse/joystick +// responsiveness independently of FOV. +f32 Game::getSensitivityScaleFactor() const +{ + f32 fov_y = client->getCamera()->getFovY(); + + // Multiply by a constant such that it becomes 1.0 at 72 degree FOV and + // 16:9 aspect ratio to minimize disruption of existing sensitivity + // settings. + return tan(fov_y / 2.0f) * 1.3763818698f; +} + void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) { #ifdef HAVE_TOUCHSCREENGUI @@ -2437,8 +2465,9 @@ void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) dist.Y = -dist.Y; } - cam->camera_yaw -= dist.X * m_cache_mouse_sensitivity; - cam->camera_pitch += dist.Y * m_cache_mouse_sensitivity; + f32 sens_scale = getSensitivityScaleFactor(); + cam->camera_yaw -= dist.X * m_cache_mouse_sensitivity * sens_scale; + cam->camera_pitch += dist.Y * m_cache_mouse_sensitivity * sens_scale; if (dist.X != 0 || dist.Y != 0) input->setMousePos(center.X, center.Y); @@ -2447,7 +2476,8 @@ void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) #endif if (m_cache_enable_joysticks) { - f32 c = m_cache_joystick_frustum_sensitivity * (1.f / 32767.f) * dtime; + f32 sens_scale = getSensitivityScaleFactor(); + f32 c = m_cache_joystick_frustum_sensitivity * dtime * sens_scale; cam->camera_yaw -= input->joystick.getAxisWithoutDead(JA_FRUSTUM_HORIZONTAL) * c; cam->camera_pitch += input->joystick.getAxisWithoutDead(JA_FRUSTUM_VERTICAL) * c; } @@ -2458,71 +2488,48 @@ void Game::updateCameraOrientation(CameraOrientation *cam, float dtime) void Game::updatePlayerControl(const CameraOrientation &cam) { + LocalPlayer *player = client->getEnv().getLocalPlayer(); + //TimeTaker tt("update player control", NULL, PRECISION_NANO); - // DO NOT use the isKeyDown method for the forward, backward, left, right - // buttons, as the code that uses the controls needs to be able to - // distinguish between the two in order to know when to use joysticks. - PlayerControl control( - input->isKeyDown(KeyType::FORWARD), - input->isKeyDown(KeyType::BACKWARD), - input->isKeyDown(KeyType::LEFT), - input->isKeyDown(KeyType::RIGHT), - isKeyDown(KeyType::JUMP), - isKeyDown(KeyType::SPECIAL1), + isKeyDown(KeyType::FORWARD), + isKeyDown(KeyType::BACKWARD), + isKeyDown(KeyType::LEFT), + isKeyDown(KeyType::RIGHT), + isKeyDown(KeyType::JUMP) || player->getAutojump(), + isKeyDown(KeyType::AUX1), isKeyDown(KeyType::SNEAK), isKeyDown(KeyType::ZOOM), isKeyDown(KeyType::DIG), isKeyDown(KeyType::PLACE), cam.camera_pitch, cam.camera_yaw, - input->joystick.getAxisWithoutDead(JA_SIDEWARD_MOVE), - input->joystick.getAxisWithoutDead(JA_FORWARD_MOVE) + input->getMovementSpeed(), + input->getMovementDirection() ); - u32 keypress_bits = ( - ( (u32)(isKeyDown(KeyType::FORWARD) & 0x1) << 0) | - ( (u32)(isKeyDown(KeyType::BACKWARD) & 0x1) << 1) | - ( (u32)(isKeyDown(KeyType::LEFT) & 0x1) << 2) | - ( (u32)(isKeyDown(KeyType::RIGHT) & 0x1) << 3) | - ( (u32)(isKeyDown(KeyType::JUMP) & 0x1) << 4) | - ( (u32)(isKeyDown(KeyType::SPECIAL1) & 0x1) << 5) | - ( (u32)(isKeyDown(KeyType::SNEAK) & 0x1) << 6) | - ( (u32)(isKeyDown(KeyType::DIG) & 0x1) << 7) | - ( (u32)(isKeyDown(KeyType::PLACE) & 0x1) << 8) | - ( (u32)(isKeyDown(KeyType::ZOOM) & 0x1) << 9) - ); + // autoforward if set: move at maximum speed + if (player->getPlayerSettings().continuous_forward && + client->activeObjectsReceived() && !player->isDead()) { + control.movement_speed = 1.0f; + // sideways movement only + float dx = sin(control.movement_direction); + control.movement_direction = atan2(dx, 1.0f); + } -#ifdef ANDROID - /* For Android, simulate holding down AUX1 (fast move) if the user has +#ifdef HAVE_TOUCHSCREENGUI + /* For touch, simulate holding down AUX1 (fast move) if the user has * the fast_move setting toggled on. If there is an aux1 key defined for - * Android then its meaning is inverted (i.e. holding aux1 means walk and + * touch then its meaning is inverted (i.e. holding aux1 means walk and * not fast) */ if (m_cache_hold_aux1) { control.aux1 = control.aux1 ^ true; - keypress_bits ^= ((u32)(1U << 5)); } #endif - LocalPlayer *player = client->getEnv().getLocalPlayer(); - - // autojump if set: simulate "jump" key - if (player->getAutojump()) { - control.jump = true; - keypress_bits |= 1U << 4; - } - - // autoforward if set: simulate "up" key - if (player->getPlayerSettings().continuous_forward && - client->activeObjectsReceived() && !player->isDead()) { - control.up = true; - keypress_bits |= 1U << 0; - } - client->setPlayerControl(control); - player->keyPressed = keypress_bits; //tt.stop(); } @@ -2536,6 +2543,9 @@ inline void Game::step(f32 *dtime) if (can_be_and_is_paused) { // This is for a singleplayer server *dtime = 0; // No time passes } else { + if (simple_singleplayer_mode && !paused_animated_nodes.empty()) + resumeAnimation(); + if (server) server->step(*dtime); @@ -2543,6 +2553,33 @@ inline void Game::step(f32 *dtime) } } +static void pauseNodeAnimation(PausedNodesList &paused, scene::ISceneNode *node) { + if (!node) + return; + for (auto &&child: node->getChildren()) + pauseNodeAnimation(paused, child); + if (node->getType() != scene::ESNT_ANIMATED_MESH) + return; + auto animated_node = static_cast<scene::IAnimatedMeshSceneNode *>(node); + float speed = animated_node->getAnimationSpeed(); + if (!speed) + return; + paused.push_back({grab(animated_node), speed}); + animated_node->setAnimationSpeed(0.0f); +} + +void Game::pauseAnimation() +{ + pauseNodeAnimation(paused_animated_nodes, smgr->getRootSceneNode()); +} + +void Game::resumeAnimation() +{ + for (auto &&pair: paused_animated_nodes) + pair.first->setAnimationSpeed(pair.second); + paused_animated_nodes.clear(); +} + const ClientEventHandler Game::clientEventHandler[CLIENTEVENT_MAX] = { {&Game::handleClientEvent_None}, {&Game::handleClientEvent_PlayerDamage}, @@ -2574,16 +2611,23 @@ void Game::handleClientEvent_PlayerDamage(ClientEvent *event, CameraOrientation if (client->modsLoaded()) client->getScript()->on_damage_taken(event->player_damage.amount); + if (!event->player_damage.effect) + return; + // Damage flash and hurt tilt are not used at death if (client->getHP() > 0) { - runData.damage_flash += 95.0f + 3.2f * event->player_damage.amount; - runData.damage_flash = MYMIN(runData.damage_flash, 127.0f); - LocalPlayer *player = client->getEnv().getLocalPlayer(); + f32 hp_max = player->getCAO() ? + player->getCAO()->getProperties().hp_max : PLAYER_MAX_HP_DEFAULT; + f32 damage_ratio = event->player_damage.amount / hp_max; + + runData.damage_flash += 95.0f + 64.f * damage_ratio; + runData.damage_flash = MYMIN(runData.damage_flash, 127.0f); + player->hurt_tilt_timer = 1.5f; player->hurt_tilt_strength = - rangelim(event->player_damage.amount / 4.0f, 1.0f, 4.0f); + rangelim(damage_ratio * 5.0f, 1.0f, 4.0f); } // Play damage sound @@ -2627,8 +2671,8 @@ void Game::handleClientEvent_ShowFormSpec(ClientEvent *event, CameraOrientation new TextDestPlayerInventory(client, *(event->show_formspec.formname)); auto *&formspec = m_game_ui->updateFormspec(*(event->show_formspec.formname)); - GUIFormSpecMenu::create(formspec, client, &input->joystick, - fs_src, txt_dst, client->getFormspecPrepend()); + GUIFormSpecMenu::create(formspec, client, m_rendering_engine->get_gui_env(), + &input->joystick, fs_src, txt_dst, client->getFormspecPrepend(), sound); } delete event->show_formspec.formspec; @@ -2640,8 +2684,8 @@ void Game::handleClientEvent_ShowLocalFormSpec(ClientEvent *event, CameraOrienta FormspecFormSource *fs_src = new FormspecFormSource(*event->show_formspec.formspec); LocalFormspecHandler *txt_dst = new LocalFormspecHandler(*event->show_formspec.formname, client); - GUIFormSpecMenu::create(m_game_ui->getFormspecGUI(), client, &input->joystick, - fs_src, txt_dst, client->getFormspecPrepend()); + GUIFormSpecMenu::create(m_game_ui->getFormspecGUI(), client, m_rendering_engine->get_gui_env(), + &input->joystick, fs_src, txt_dst, client->getFormspecPrepend(), sound); delete event->show_formspec.formspec; delete event->show_formspec.formname; @@ -2657,132 +2701,103 @@ void Game::handleClientEvent_HandleParticleEvent(ClientEvent *event, void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam) { LocalPlayer *player = client->getEnv().getLocalPlayer(); - auto &hud_server_to_client = client->getHUDTranslationMap(); - u32 server_id = event->hudadd.server_id; + u32 server_id = event->hudadd->server_id; // ignore if we already have a HUD with that ID - auto i = hud_server_to_client.find(server_id); - if (i != hud_server_to_client.end()) { - delete event->hudadd.pos; - delete event->hudadd.name; - delete event->hudadd.scale; - delete event->hudadd.text; - delete event->hudadd.align; - delete event->hudadd.offset; - delete event->hudadd.world_pos; - delete event->hudadd.size; - delete event->hudadd.text2; + auto i = m_hud_server_to_client.find(server_id); + if (i != m_hud_server_to_client.end()) { + delete event->hudadd; return; } HudElement *e = new HudElement; - e->type = (HudElementType)event->hudadd.type; - e->pos = *event->hudadd.pos; - e->name = *event->hudadd.name; - e->scale = *event->hudadd.scale; - e->text = *event->hudadd.text; - e->number = event->hudadd.number; - e->item = event->hudadd.item; - e->dir = event->hudadd.dir; - e->align = *event->hudadd.align; - e->offset = *event->hudadd.offset; - e->world_pos = *event->hudadd.world_pos; - e->size = *event->hudadd.size; - e->z_index = event->hudadd.z_index; - e->text2 = *event->hudadd.text2; - hud_server_to_client[server_id] = player->addHud(e); + e->type = static_cast<HudElementType>(event->hudadd->type); + e->pos = event->hudadd->pos; + e->name = event->hudadd->name; + e->scale = event->hudadd->scale; + e->text = event->hudadd->text; + e->number = event->hudadd->number; + e->item = event->hudadd->item; + e->dir = event->hudadd->dir; + e->align = event->hudadd->align; + e->offset = event->hudadd->offset; + e->world_pos = event->hudadd->world_pos; + e->size = event->hudadd->size; + e->z_index = event->hudadd->z_index; + e->text2 = event->hudadd->text2; + e->style = event->hudadd->style; + m_hud_server_to_client[server_id] = player->addHud(e); - delete event->hudadd.pos; - delete event->hudadd.name; - delete event->hudadd.scale; - delete event->hudadd.text; - delete event->hudadd.align; - delete event->hudadd.offset; - delete event->hudadd.world_pos; - delete event->hudadd.size; - delete event->hudadd.text2; + delete event->hudadd; } void Game::handleClientEvent_HudRemove(ClientEvent *event, CameraOrientation *cam) { LocalPlayer *player = client->getEnv().getLocalPlayer(); - HudElement *e = player->removeHud(event->hudrm.id); - delete e; + + auto i = m_hud_server_to_client.find(event->hudrm.id); + if (i != m_hud_server_to_client.end()) { + HudElement *e = player->removeHud(i->second); + delete e; + m_hud_server_to_client.erase(i); + } + } void Game::handleClientEvent_HudChange(ClientEvent *event, CameraOrientation *cam) { LocalPlayer *player = client->getEnv().getLocalPlayer(); - u32 id = event->hudchange.id; - HudElement *e = player->getHud(id); + HudElement *e = nullptr; - if (e == NULL) { - delete event->hudchange.v3fdata; - delete event->hudchange.v2fdata; - delete event->hudchange.sdata; - delete event->hudchange.v2s32data; + auto i = m_hud_server_to_client.find(event->hudchange->id); + if (i != m_hud_server_to_client.end()) { + e = player->getHud(i->second); + } + + if (e == nullptr) { + delete event->hudchange; return; } - switch (event->hudchange.stat) { - case HUD_STAT_POS: - e->pos = *event->hudchange.v2fdata; - break; +#define CASE_SET(statval, prop, dataprop) \ + case statval: \ + e->prop = event->hudchange->dataprop; \ + break - case HUD_STAT_NAME: - e->name = *event->hudchange.sdata; - break; + switch (event->hudchange->stat) { + CASE_SET(HUD_STAT_POS, pos, v2fdata); - case HUD_STAT_SCALE: - e->scale = *event->hudchange.v2fdata; - break; + CASE_SET(HUD_STAT_NAME, name, sdata); - case HUD_STAT_TEXT: - e->text = *event->hudchange.sdata; - break; + CASE_SET(HUD_STAT_SCALE, scale, v2fdata); - case HUD_STAT_NUMBER: - e->number = event->hudchange.data; - break; + CASE_SET(HUD_STAT_TEXT, text, sdata); - case HUD_STAT_ITEM: - e->item = event->hudchange.data; - break; + CASE_SET(HUD_STAT_NUMBER, number, data); - case HUD_STAT_DIR: - e->dir = event->hudchange.data; - break; + CASE_SET(HUD_STAT_ITEM, item, data); - case HUD_STAT_ALIGN: - e->align = *event->hudchange.v2fdata; - break; + CASE_SET(HUD_STAT_DIR, dir, data); - case HUD_STAT_OFFSET: - e->offset = *event->hudchange.v2fdata; - break; + CASE_SET(HUD_STAT_ALIGN, align, v2fdata); - case HUD_STAT_WORLD_POS: - e->world_pos = *event->hudchange.v3fdata; - break; + CASE_SET(HUD_STAT_OFFSET, offset, v2fdata); - case HUD_STAT_SIZE: - e->size = *event->hudchange.v2s32data; - break; + CASE_SET(HUD_STAT_WORLD_POS, world_pos, v3fdata); - case HUD_STAT_Z_INDEX: - e->z_index = event->hudchange.data; - break; + CASE_SET(HUD_STAT_SIZE, size, v2s32data); - case HUD_STAT_TEXT2: - e->text2 = *event->hudchange.sdata; - break; + CASE_SET(HUD_STAT_Z_INDEX, z_index, data); + + CASE_SET(HUD_STAT_TEXT2, text2, sdata); + + CASE_SET(HUD_STAT_STYLE, style, data); } - delete event->hudchange.v3fdata; - delete event->hudchange.v2fdata; - delete event->hudchange.sdata; - delete event->hudchange.v2s32data; +#undef CASE_SET + + delete event->hudchange; } void Game::handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam) @@ -2837,6 +2852,7 @@ void Game::handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam) "custom" ); } + delete event->set_sky; } @@ -2863,9 +2879,10 @@ void Game::handleClientEvent_SetMoon(ClientEvent *event, CameraOrientation *cam) void Game::handleClientEvent_SetStars(ClientEvent *event, CameraOrientation *cam) { sky->setStarsVisible(event->star_params->visible); - sky->setStarCount(event->star_params->count, false); + sky->setStarCount(event->star_params->count); sky->setStarColor(event->star_params->starcolor); sky->setStarScale(event->star_params->scale); + sky->setStarDayOpacity(event->star_params->day_opacity); delete event->star_params; } @@ -2900,7 +2917,7 @@ void Game::processClientEvents(CameraOrientation *cam) } } -void Game::updateChat(f32 dtime, const v2u32 &screensize) +void Game::updateChat(f32 dtime) { // Get new messages from error log buffer while (!m_chat_log_buf.empty()) @@ -2916,11 +2933,17 @@ void Game::updateChat(f32 dtime, const v2u32 &screensize) chat_backend->step(dtime); // Display all messages in a static text element - m_game_ui->setChatText(chat_backend->getRecentChat(), - chat_backend->getRecentBuffer().getLineCount()); + auto &buf = chat_backend->getRecentBuffer(); + if (buf.getLinesModified()) { + buf.resetLinesModified(); + m_game_ui->setChatText(chat_backend->getRecentChat(), buf.getLineCount()); + } + + // Make sure that the size is still correct + m_game_ui->updateChatSize(); } -void Game::updateCamera(u32 busy_time, f32 dtime) +void Game::updateCamera(f32 dtime) { LocalPlayer *player = client->getEnv().getLocalPlayer(); @@ -2950,7 +2973,8 @@ void Game::updateCamera(u32 busy_time, f32 dtime) camera->toggleCameraMode(); - playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); + // Make the player visible depending on camera mode. + playercao->updateMeshCulling(); playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); } @@ -2958,7 +2982,7 @@ void Game::updateCamera(u32 busy_time, f32 dtime) float tool_reload_ratio = runData.time_from_last_punch / full_punch_interval; tool_reload_ratio = MYMIN(tool_reload_ratio, 1.0); - camera->update(player, dtime, busy_time / 1000.0f, tool_reload_ratio); + camera->update(player, dtime, tool_reload_ratio); camera->step(dtime); v3f camera_position = camera->getPosition(); @@ -3021,7 +3045,7 @@ void Game::updateSound(f32 dtime) } -void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) +void Game::processPlayerInteraction(f32 dtime, bool show_hud) { LocalPlayer *player = client->getEnv().getLocalPlayer(); @@ -3075,10 +3099,12 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) !runData.btn_down_for_dig, camera_offset); - if (pointed != runData.pointed_old) { + if (pointed != runData.pointed_old) infostream << "Pointing at " << pointed.dump() << std::endl; - hud->updateSelectionMesh(camera_offset); - } + + // Note that updating the selection mesh every frame is not particularly efficient, + // but the halo rendering code is already inefficient so there's no point in optimizing it here + hud->updateSelectionMesh(camera_offset); // Allow digging again if button is not pressed if (runData.digging_blocked && !isKeyDown(KeyType::DIG)) @@ -3139,7 +3165,9 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) handlePointingAtNode(pointed, selected_item, hand_item, dtime); } else if (pointed.type == POINTEDTHING_OBJECT) { v3f player_position = player->getPosition(); - handlePointingAtObject(pointed, tool_item, player_position, show_debug); + bool basic_debug_allowed = client->checkPrivilege("debug") || (player->hud_flags & HUD_FLAG_BASIC_DEBUG); + handlePointingAtObject(pointed, tool_item, player_position, + m_game_ui->m_flags.show_basic_debug && basic_debug_allowed); } else if (isKeyDown(KeyType::DIG)) { // When button is held down in air, show continuous animation runData.punching = true; @@ -3157,12 +3185,15 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) input->clearWasKeyPressed(); input->clearWasKeyReleased(); + // Ensure DIG & PLACE are marked as handled + wasKeyDown(KeyType::DIG); + wasKeyDown(KeyType::PLACE); - input->joystick.clearWasKeyDown(KeyType::MOUSE_L); - input->joystick.clearWasKeyDown(KeyType::MOUSE_R); + input->joystick.clearWasKeyPressed(KeyType::DIG); + input->joystick.clearWasKeyPressed(KeyType::PLACE); - input->joystick.clearWasKeyReleased(KeyType::MOUSE_L); - input->joystick.clearWasKeyReleased(KeyType::MOUSE_R); + input->joystick.clearWasKeyReleased(KeyType::DIG); + input->joystick.clearWasKeyReleased(KeyType::PLACE); } @@ -3244,7 +3275,7 @@ PointedThing Game::updatePointedThing( final_color_blend(&c, light_level, daynight_ratio); // Modify final color a bit with time - u32 timer = porting::getTimeMs() % 5000; + u32 timer = client->getEnv().getFrameTime() % 5000; float timerf = (float) (irr::core::PI * ((timer / 2500.0) - 0.5)); float sin_r = 0.08f * std::sin(timerf); float sin_g = 0.08f * std::sin(timerf + irr::core::PI * 0.5f); @@ -3296,9 +3327,8 @@ void Game::handlePointingAtNode(const PointedThing &pointed, } else { MapNode n = map.getNode(nodepos); - if (nodedef_manager->get(n).tiledef[0].name == "unknown_node.png") { - m_game_ui->setInfoText(L"Unknown node: " + - utf8_to_wide(nodedef_manager->get(n).name)); + if (nodedef_manager->get(n).name == "unknown") { + m_game_ui->setInfoText(L"Unknown node"); } } @@ -3330,7 +3360,8 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, const ItemStack &selected_item, const v3s16 &nodepos, const v3s16 &neighbourpos, const PointedThing &pointed, const NodeMetadata *meta) { - std::string prediction = selected_def.node_placement_prediction; + const auto &prediction = selected_def.node_placement_prediction; + const NodeDefManager *nodedef = client->ndef(); ClientMap &map = client->getEnv().getClientMap(); MapNode node; @@ -3359,8 +3390,8 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client); auto *&formspec = m_game_ui->updateFormspec(""); - GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src, - txt_dst, client->getFormspecPrepend()); + GUIFormSpecMenu::create(formspec, client, m_rendering_engine->get_gui_env(), + &input->joystick, fs_src, txt_dst, client->getFormspecPrepend(), sound); formspec->setFormSpec(meta->getString("formspec"), inventoryloc); return false; @@ -3400,8 +3431,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, if (!found) { errorstream << "Node placement prediction failed for " - << selected_def.name << " (places " - << prediction + << selected_def.name << " (places " << prediction << ") - Name not known" << std::endl; // Handle this as if prediction was empty // Report to server @@ -3412,9 +3442,14 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, const ContentFeatures &predicted_f = nodedef->get(id); // Predict param2 for facedir and wallmounted nodes + // Compare core.item_place_node() for what the server does u8 param2 = 0; - if (predicted_f.param_type_2 == CPT2_WALLMOUNTED || + const u8 place_param2 = selected_def.place_param2; + + if (place_param2) { + param2 = place_param2; + } else if (predicted_f.param_type_2 == CPT2_WALLMOUNTED || predicted_f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { v3s16 dir = nodepos - neighbourpos; @@ -3425,9 +3460,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, } else { param2 = dir.Z < 0 ? 5 : 4; } - } - - if (predicted_f.param_type_2 == CPT2_FACEDIR || + } else if (predicted_f.param_type_2 == CPT2_FACEDIR || predicted_f.param_type_2 == CPT2_COLORED_FACEDIR) { v3s16 dir = nodepos - floatToInt(client->getEnv().getLocalPlayer()->getPosition(), BS); @@ -3438,11 +3471,9 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, } } - assert(param2 <= 5); - - //Check attachment if node is in group attached_node - if (((ItemGroupList) predicted_f.groups)["attached_node"] != 0) { - static v3s16 wallmounted_dirs[8] = { + // Check attachment if node is in group attached_node + if (itemgroup_get(predicted_f.groups, "attached_node") != 0) { + const static v3s16 wallmounted_dirs[8] = { v3s16(0, 1, 0), v3s16(0, -1, 0), v3s16(1, 0, 0), @@ -3467,11 +3498,11 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, } // Apply color - if ((predicted_f.param_type_2 == CPT2_COLOR + if (!place_param2 && (predicted_f.param_type_2 == CPT2_COLOR || predicted_f.param_type_2 == CPT2_COLORED_FACEDIR || predicted_f.param_type_2 == CPT2_COLORED_WALLMOUNTED)) { - const std::string &indexstr = selected_item.metadata.getString( - "palette_index", 0); + const auto &indexstr = selected_item.metadata. + getString("palette_index", 0); if (!indexstr.empty()) { s32 index = mystoi(indexstr); if (predicted_f.param_type_2 == CPT2_COLOR) { @@ -3511,11 +3542,10 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, soundmaker->m_player_rightpunch_sound = selected_def.sound_place_failed; return false; } - } catch (InvalidPositionException &e) { + } catch (const InvalidPositionException &e) { errorstream << "Node placement prediction failed for " << selected_def.name << " (places " - << prediction - << ") - Position not loaded" << std::endl; + << prediction << ") - Position not loaded" << std::endl; soundmaker->m_player_rightpunch_sound = selected_def.sound_place_failed; return false; } @@ -3585,7 +3615,8 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, // cheat detection. // Get digging parameters DigParams params = getDigParams(nodedef_manager->get(n).groups, - &selected_item.getToolCapabilities(itemdef_manager)); + &selected_item.getToolCapabilities(itemdef_manager), + selected_item.wear); // If can't dig, try hand if (!params.diggable) { @@ -3710,13 +3741,18 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, camera->setDigging(0); // Dig animation } - void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, const CameraOrientation &cam) { TimeTaker tt_update("Game::updateFrame()"); LocalPlayer *player = client->getEnv().getLocalPlayer(); + /* + Frame time + */ + + client->getEnv().updateFrameTime(); + /* Fog range */ @@ -3735,7 +3771,10 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, float direct_brightness; bool sunlight_seen; - if (m_cache_enable_noclip && m_cache_enable_free_move) { + // When in noclip mode force same sky brightness as above ground so you + // can see properly + if (draw_control->allow_noclip && m_cache_enable_free_move && + client->checkPrivilege("fly")) { direct_brightness = time_brightness; sunlight_seen = true; } else { @@ -3832,13 +3871,29 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, ); } + /* + Damage camera tilt + */ + if (player->hurt_tilt_timer > 0.0f) { + player->hurt_tilt_timer -= dtime * 6.0f; + + if (player->hurt_tilt_timer < 0.0f) + player->hurt_tilt_strength = 0.0f; + } + + /* + Update minimap pos and rotation + */ + if (mapper && m_game_ui->m_flags.show_hud) { + mapper->setPos(floatToInt(player->getPosition(), BS)); + mapper->setAngle(player->getYaw()); + } + /* Get chat messages from client */ - v2u32 screensize = driver->getScreenSize(); - - updateChat(dtime, screensize); + updateChat(dtime); /* Inventory @@ -3860,15 +3915,22 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, */ runData.update_draw_list_timer += dtime; + float update_draw_list_delta = 0.2f; + v3f camera_direction = camera->getDirection(); - if (runData.update_draw_list_timer >= 0.2 + if (runData.update_draw_list_timer >= update_draw_list_delta || runData.update_draw_list_last_cam_dir.getDistanceFrom(camera_direction) > 0.2 - || m_camera_offset_changed) { + || m_camera_offset_changed + || client->getEnv().getClientMap().needsUpdateDrawList()) { runData.update_draw_list_timer = 0; client->getEnv().getClientMap().updateDrawList(); runData.update_draw_list_last_cam_dir = camera_direction; } + if (RenderingEngine::get_shadow_renderer()) { + updateShadows(); + } + m_game_ui->update(*stats, client, draw_control, cam, runData.pointed_old, gui_chat_console, dtime); /* @@ -3900,11 +3962,11 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, } while (false); /* - Drawing begins + ==================== Drawing begins ==================== */ - const video::SColor &skycolor = sky->getSkyColor(); + const video::SColor skycolor = sky->getSkyColor(); - TimeTaker tt_draw("Draw scene"); + TimeTaker tt_draw("Draw scene", nullptr, PRECISION_MICRO); driver->beginScene(true, true, skycolor); bool draw_wield_tool = (m_game_ui->m_flags.show_hud && @@ -3919,12 +3981,14 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, } catch (SettingNotFoundException) { } #endif - RenderingEngine::draw_scene(skycolor, m_game_ui->m_flags.show_hud, + m_rendering_engine->draw_scene(skycolor, m_game_ui->m_flags.show_hud, m_game_ui->m_flags.show_minimap, draw_wield_tool, draw_crosshair); /* Profiler graph */ + v2u32 screensize = driver->getScreenSize(); + if (m_game_ui->m_flags.show_profiler_graph) graph->draw(10, screensize.Y - 10, driver, g_fontengine->getFont()); @@ -3941,31 +4005,37 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, } /* - Damage camera tilt + ==================== End scene ==================== */ - if (player->hurt_tilt_timer > 0.0f) { - player->hurt_tilt_timer -= dtime * 6.0f; +#if IRRLICHT_VERSION_MT_REVISION < 5 + if (++m_reset_HW_buffer_counter > 500) { + /* + Periodically remove all mesh HW buffers. - if (player->hurt_tilt_timer < 0.0f) - player->hurt_tilt_strength = 0.0f; + Work around for a quirk in Irrlicht where a HW buffer is only + released after 20000 iterations (triggered from endScene()). + + Without this, all loaded but unused meshes will retain their HW + buffers for at least 5 minutes, at which point looking up the HW buffers + becomes a bottleneck and the framerate drops (as much as 30%). + + Tests showed that numbers between 50 and 1000 are good, so picked 500. + There are no other public Irrlicht APIs that allow interacting with the + HW buffers without tracking the status of every individual mesh. + + The HW buffers for _visible_ meshes will be reinitialized in the next frame. + */ + infostream << "Game::updateFrame(): Removing all HW buffers." << std::endl; + driver->removeAllHardwareBuffers(); + m_reset_HW_buffer_counter = 0; } +#endif - /* - Update minimap pos and rotation - */ - if (mapper && m_game_ui->m_flags.show_minimap && m_game_ui->m_flags.show_hud) { - mapper->setPos(floatToInt(player->getPosition(), BS)); - mapper->setAngle(player->getYaw()); - } - - /* - End scene - */ driver->endScene(); stats->drawtime = tt_draw.stop(true); - g_profiler->avg("Game::updateFrame(): draw scene [ms]", stats->drawtime); - g_profiler->graphAdd("Update frame [ms]", tt_update.stop(true)); + g_profiler->graphAdd("Draw scene [us]", stats->drawtime); + g_profiler->avg("Game::updateFrame(): update frame [ms]", tt_update.stop(true)); } /* Log times and stuff for visualization */ @@ -3976,58 +4046,87 @@ inline void Game::updateProfilerGraphs(ProfilerGraph *graph) graph->put(values); } +/**************************************************************************** + * Shadows + *****************************************************************************/ +void Game::updateShadows() +{ + ShadowRenderer *shadow = RenderingEngine::get_shadow_renderer(); + if (!shadow) + return; + float in_timeofday = fmod(runData.time_of_day_smooth, 1.0f); + + float timeoftheday = getWickedTimeOfDay(in_timeofday); + bool is_day = timeoftheday > 0.25 && timeoftheday < 0.75; + bool is_shadow_visible = is_day ? sky->getSunVisible() : sky->getMoonVisible(); + shadow->setShadowIntensity(is_shadow_visible ? client->getEnv().getLocalPlayer()->getLighting().shadow_intensity : 0.0f); + + timeoftheday = fmod(timeoftheday + 0.75f, 0.5f) + 0.25f; + const float offset_constant = 10000.0f; + + v3f light = is_day ? sky->getSunDirection() : sky->getMoonDirection(); + + v3f sun_pos = light * offset_constant; + + if (shadow->getDirectionalLightCount() == 0) + shadow->addDirectionalLight(); + shadow->getDirectionalLight().setDirection(sun_pos); + shadow->setTimeOfDay(in_timeofday); + + shadow->getDirectionalLight().update_frustum(camera, client, m_camera_offset_changed); +} /**************************************************************************** Misc ****************************************************************************/ -/* On some computers framerate doesn't seem to be automatically limited - */ -inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime) +void FpsControl::reset() { - // not using getRealTime is necessary for wine - device->getTimer()->tick(); // Maker sure device time is up-to-date - u32 time = device->getTimer()->getTime(); - u32 last_time = fps_timings->last_time; + last_time = porting::getTimeUs(); +} - if (time > last_time) // Make sure time hasn't overflowed - fps_timings->busy_time = time - last_time; +/* + * On some computers framerate doesn't seem to be automatically limited + */ +void FpsControl::limit(IrrlichtDevice *device, f32 *dtime) +{ + const float fps_limit = (device->isWindowFocused() && !g_menumgr.pausesGame()) + ? g_settings->getFloat("fps_max") + : g_settings->getFloat("fps_max_unfocused"); + const u64 frametime_min = 1000000.0f / std::max(fps_limit, 1.0f); + + u64 time = porting::getTimeUs(); + + if (time > last_time) // Make sure time hasn't overflowed + busy_time = time - last_time; else - fps_timings->busy_time = 0; + busy_time = 0; - u32 frametime_min = 1000 / (g_menumgr.pausesGame() - ? g_settings->getFloat("pause_fps_max") - : g_settings->getFloat("fps_max")); - - if (fps_timings->busy_time < frametime_min) { - fps_timings->sleep_time = frametime_min - fps_timings->busy_time; - device->sleep(fps_timings->sleep_time); + if (busy_time < frametime_min) { + sleep_time = frametime_min - busy_time; + if (sleep_time > 1000) + sleep_ms(sleep_time / 1000); } else { - fps_timings->sleep_time = 0; + sleep_time = 0; } - /* Get the new value of the device timer. Note that device->sleep() may - * not sleep for the entire requested time as sleep may be interrupted and - * therefore it is arguably more accurate to get the new time from the - * device rather than calculating it by adding sleep_time to time. - */ + // Read the timer again to accurately determine how long we actually slept, + // rather than calculating it by adding sleep_time to time. + time = porting::getTimeUs(); - device->getTimer()->tick(); // Update device timer - time = device->getTimer()->getTime(); - - if (time > last_time) // Make sure last_time hasn't overflowed - *dtime = (time - last_time) / 1000.0; + if (time > last_time) // Make sure last_time hasn't overflowed + *dtime = (time - last_time) / 1000000.0f; else *dtime = 0; - fps_timings->last_time = time; + last_time = time; } void Game::showOverlayMessage(const char *msg, float dtime, int percent, bool draw_clouds) { const wchar_t *wmsg = wgettext(msg); - RenderingEngine::draw_load_screen(wmsg, guienv, texture_src, dtime, percent, + m_rendering_engine->draw_load_screen(wmsg, guienv, texture_src, dtime, percent, draw_clouds); delete[] wmsg; } @@ -4044,9 +4143,9 @@ void Game::readSettings() m_cache_enable_joysticks = g_settings->getBool("enable_joysticks"); m_cache_enable_particles = g_settings->getBool("enable_particles"); m_cache_enable_fog = g_settings->getBool("enable_fog"); - m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity"); - m_cache_joystick_frustum_sensitivity = g_settings->getFloat("joystick_frustum_sensitivity"); - m_repeat_place_time = g_settings->getFloat("repeat_place_time"); + m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity", 0.001f, 10.0f); + m_cache_joystick_frustum_sensitivity = std::max(g_settings->getFloat("joystick_frustum_sensitivity"), 0.001f); + m_repeat_place_time = g_settings->getFloat("repeat_place_time", 0.25f, 2.0); m_cache_enable_noclip = g_settings->getBool("noclip"); m_cache_enable_free_move = g_settings->getBool("free_move"); @@ -4072,27 +4171,6 @@ void Game::readSettings() ****************************************************************************/ /****************************************************************************/ -void Game::extendedResourceCleanup() -{ - // Extended resource accounting - infostream << "Irrlicht resources after cleanup:" << std::endl; - infostream << "\tRemaining meshes : " - << RenderingEngine::get_mesh_cache()->getMeshCount() << std::endl; - infostream << "\tRemaining textures : " - << driver->getTextureCount() << std::endl; - - for (unsigned int i = 0; i < driver->getTextureCount(); i++) { - irr::video::ITexture *texture = driver->getTextureByIndex(i); - infostream << "\t\t" << i << ":" << texture->getName().getPath().c_str() - << std::endl; - } - - clearTextureNameCache(); - infostream << "\tRemaining materials: " - << driver-> getMaterialRendererCount() - << " (note: irrlicht doesn't support removing renderers)" << std::endl; -} - void Game::showDeathFormspec() { static std::string formspec_str = @@ -4110,15 +4188,15 @@ void Game::showDeathFormspec() LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_DEATH_SCREEN", client); auto *&formspec = m_game_ui->getFormspecGUI(); - GUIFormSpecMenu::create(formspec, client, &input->joystick, - fs_src, txt_dst, client->getFormspecPrepend()); + GUIFormSpecMenu::create(formspec, client, m_rendering_engine->get_gui_env(), + &input->joystick, fs_src, txt_dst, client->getFormspecPrepend(), sound); formspec->setFocus("btn_respawn"); } #define GET_KEY_NAME(KEY) gettext(getKeySetting(#KEY).name()) void Game::showPauseMenu() { -#ifdef __ANDROID__ +#ifdef HAVE_TOUCHSCREENGUI static const std::string control_text = strgettext("Default Controls:\n" "No menu visible:\n" "- single tap: button activate\n" @@ -4218,16 +4296,18 @@ void Game::showPauseMenu() if (simple_singleplayer_mode || address.empty()) { static const std::string on = strgettext("On"); static const std::string off = strgettext("Off"); - const std::string &damage = g_settings->getBool("enable_damage") ? on : off; - const std::string &creative = g_settings->getBool("creative_mode") ? on : off; + // Note: Status of enable_damage and creative_mode settings is intentionally + // NOT shown here because the game might roll its own damage system and/or do + // a per-player Creative Mode, in which case writing it here would mislead. + bool damage = g_settings->getBool("enable_damage"); const std::string &announced = g_settings->getBool("server_announce") ? on : off; - os << strgettext("- Damage: ") << damage << "\n" - << strgettext("- Creative Mode: ") << creative << "\n"; if (!simple_singleplayer_mode) { - const std::string &pvp = g_settings->getBool("enable_pvp") ? on : off; - //~ PvP = Player versus Player - os << strgettext("- PvP: ") << pvp << "\n" - << strgettext("- Public: ") << announced << "\n"; + if (damage) { + const std::string &pvp = g_settings->getBool("enable_pvp") ? on : off; + //~ PvP = Player versus Player + os << strgettext("- PvP: ") << pvp << "\n"; + } + os << strgettext("- Public: ") << announced << "\n"; std::string server_name = g_settings->get("server_name"); str_formspec_escape(server_name); if (announced == on && !server_name.empty()) @@ -4244,10 +4324,13 @@ void Game::showPauseMenu() LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU"); auto *&formspec = m_game_ui->getFormspecGUI(); - GUIFormSpecMenu::create(formspec, client, &input->joystick, - fs_src, txt_dst, client->getFormspecPrepend()); + GUIFormSpecMenu::create(formspec, client, m_rendering_engine->get_gui_env(), + &input->joystick, fs_src, txt_dst, client->getFormspecPrepend(), sound); formspec->setFocus("btn_continue"); formspec->doPause = true; + + if (simple_singleplayer_mode) + pauseAnimation(); } /****************************************************************************/ @@ -4258,6 +4341,7 @@ void Game::showPauseMenu() void the_game(bool *kill, InputHandler *input, + RenderingEngine *rendering_engine, const GameStartData &start_data, std::string &error_message, ChatBackend &chat_backend, @@ -4272,20 +4356,21 @@ void the_game(bool *kill, try { - if (game.startup(kill, input, start_data, error_message, - reconnect_requested, &chat_backend)) { + if (game.startup(kill, input, rendering_engine, start_data, + error_message, reconnect_requested, &chat_backend)) { game.run(); } } catch (SerializationError &e) { - error_message = std::string("A serialization error occurred:\n") - + e.what() + "\n\nThe server is probably " - " running a different version of " PROJECT_NAME_C "."; + const std::string ver_err = fmtgettext("The server is probably running a different version of %s.", PROJECT_NAME_C); + error_message = strgettext("A serialization error occurred:") +"\n" + + e.what() + "\n\n" + ver_err; errorstream << error_message << std::endl; } catch (ServerError &e) { error_message = e.what(); errorstream << "ServerError: " << error_message << std::endl; } catch (ModError &e) { + // DO NOT TRANSLATE the `ModError`, it's used by ui.lua error_message = std::string("ModError: ") + e.what() + strgettext("\nCheck debug.txt for details."); errorstream << error_message << std::endl; diff --git a/src/client/game.h b/src/client/game.h index d04153271..d87e747c5 100644 --- a/src/client/game.h +++ b/src/client/game.h @@ -23,7 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <string> class InputHandler; -class ChatBackend; /* to avoid having to include chat.h */ +class ChatBackend; +class RenderingEngine; struct SubgameSpec; struct GameStartData; @@ -32,7 +33,7 @@ struct Jitter { }; struct RunStats { - u32 drawtime; + u64 drawtime; // (us) Jitter dtime_jitter, busy_time_jitter; }; @@ -45,6 +46,7 @@ struct CameraOrientation { void the_game(bool *kill, InputHandler *input, + RenderingEngine *rendering_engine, const GameStartData &start_data, std::string &error_message, ChatBackend &chat_backend, diff --git a/src/client/gameui.cpp b/src/client/gameui.cpp index 75e7d15b9..909719bbe 100644 --- a/src/client/gameui.cpp +++ b/src/client/gameui.cpp @@ -68,14 +68,17 @@ void GameUI::init() u16 chat_font_size = g_settings->getU16("chat_font_size"); if (chat_font_size != 0) { m_guitext_chat->setOverrideFont(g_fontengine->getFont( - chat_font_size, FM_Unspecified)); + rangelim(chat_font_size, 5, 72), FM_Unspecified)); } - // At the middle of the screen - // Object infos are shown in this + + // Infotext of nodes and objects. + // If in debug mode, object debug infos shown here, too. + // Located on the left on the screen, below chat. u32 chat_font_height = m_guitext_chat->getActiveFont()->getDimension(L"Ay").Height; m_guitext_info = gui::StaticText::add(guienv, L"", - core::rect<s32>(0, 0, 400, g_fontengine->getTextHeight() * 5 + 5) + + // Size is limited; text will be truncated after 6 lines. + core::rect<s32>(0, 0, 400, g_fontengine->getTextHeight() * 6) + v2s32(100, chat_font_height * (g_settings->getU16("recent_chat_messages") + 3)), false, true, guiroot); @@ -97,27 +100,28 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_ const CameraOrientation &cam, const PointedThing &pointed_old, const GUIChatConsole *chat_console, float dtime) { - v2u32 screensize = RenderingEngine::get_instance()->getWindowSize(); + v2u32 screensize = RenderingEngine::getWindowSize(); - if (m_flags.show_debug) { - static float drawtime_avg = 0; - drawtime_avg = drawtime_avg * 0.95 + stats.drawtime * 0.05; - u16 fps = 1.0 / stats.dtime_jitter.avg; + // Minimal debug text must only contain info that can't give a gameplay advantage + if (m_flags.show_minimal_debug) { + const u16 fps = 1.0 / stats.dtime_jitter.avg; + m_drawtime_avg *= 0.95f; + m_drawtime_avg += 0.05f * (stats.drawtime / 1000); std::ostringstream os(std::ios_base::binary); os << std::fixed << PROJECT_NAME_C " " << g_version_hash << " | FPS: " << fps << std::setprecision(0) - << " | drawtime: " << drawtime_avg << "ms" + << " | drawtime: " << m_drawtime_avg << "ms" << std::setprecision(1) << " | dtime jitter: " << (stats.dtime_jitter.max_fraction * 100.0) << "%" << std::setprecision(1) << " | view range: " << (draw_control->range_all ? "All" : itos(draw_control->wanted_range)) - << std::setprecision(3) - << " | RTT: " << client->getRTT() << "s"; + << std::setprecision(2) + << " | RTT: " << (client->getRTT() * 1000.0f) << "ms"; setStaticText(m_guitext, utf8_to_wide(os.str()).c_str()); m_guitext->setRelativePosition(core::rect<s32>(5, 5, screensize.X, @@ -125,9 +129,10 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_ } // Finally set the guitext visible depending on the flag - m_guitext->setVisible(m_flags.show_debug); + m_guitext->setVisible(m_flags.show_minimal_debug); - if (m_flags.show_debug) { + // Basic debug text also shows info that might give a gameplay advantage + if (m_flags.show_basic_debug) { LocalPlayer *player = client->getEnv().getLocalPlayer(); v3f player_position = player->getPosition(); @@ -146,9 +151,13 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_ const NodeDefManager *nodedef = client->getNodeDefManager(); MapNode n = map.getNode(pointed_old.node_undersurface); - if (n.getContent() != CONTENT_IGNORE && nodedef->get(n).name != "unknown") { - os << ", pointed: " << nodedef->get(n).name - << ", param2: " << (u64) n.getParam2(); + if (n.getContent() != CONTENT_IGNORE) { + if (nodedef->get(n).name == "unknown") { + os << ", pointed: <unknown node>"; + } else { + os << ", pointed: " << nodedef->get(n).name; + } + os << ", param2: " << (u64) n.getParam2(); } } @@ -160,7 +169,7 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_ )); } - m_guitext2->setVisible(m_flags.show_debug); + m_guitext2->setVisible(m_flags.show_basic_debug); setStaticText(m_guitext_info, m_infotext.c_str()); m_guitext_info->setVisible(m_flags.show_hud && g_menumgr.menuCount() == 0); @@ -204,7 +213,7 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_ void GameUI::initFlags() { m_flags = GameUI::Flags(); - m_flags.show_debug = g_settings->getBool("show_debug"); + m_flags.show_minimal_debug = g_settings->getBool("show_debug"); } void GameUI::showMinimap(bool show) @@ -221,26 +230,34 @@ void GameUI::showTranslatedStatusText(const char *str) void GameUI::setChatText(const EnrichedString &chat_text, u32 recent_chat_count) { - - // Update gui element size and position - s32 chat_y = 5; - - if (m_flags.show_debug) - chat_y += 2 * g_fontengine->getLineHeight(); - - const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize(); - - core::rect<s32> chat_size(10, chat_y, - window_size.X - 20, 0); - chat_size.LowerRightCorner.Y = std::min((s32)window_size.Y, - m_guitext_chat->getTextHeight() + chat_y); - - m_guitext_chat->setRelativePosition(chat_size); setStaticText(m_guitext_chat, chat_text); m_recent_chat_count = recent_chat_count; } +void GameUI::updateChatSize() +{ + // Update gui element size and position + s32 chat_y = 5; + + if (m_flags.show_minimal_debug) + chat_y += g_fontengine->getLineHeight(); + if (m_flags.show_basic_debug) + chat_y += g_fontengine->getLineHeight(); + + const v2u32 &window_size = RenderingEngine::getWindowSize(); + + core::rect<s32> chat_size(10, chat_y, window_size.X - 20, 0); + chat_size.LowerRightCorner.Y = std::min((s32)window_size.Y, + m_guitext_chat->getTextHeight() + chat_y); + + if (chat_size == m_current_chat_size) + return; + m_current_chat_size = chat_size; + + m_guitext_chat->setRelativePosition(chat_size); +} + void GameUI::updateProfiler() { if (m_profiler_current_page != 0) { @@ -260,7 +277,7 @@ void GameUI::updateProfiler() core::position2di upper_left(6, 50); core::position2di lower_right = upper_left; lower_right.X += size.Width + 10; - lower_right.Y += size.Height; + lower_right.Y += size.Height; m_guitext_profiler->setRelativePosition(core::rect<s32>(upper_left, lower_right)); } @@ -294,12 +311,9 @@ void GameUI::toggleProfiler() updateProfiler(); if (m_profiler_current_page != 0) { - wchar_t buf[255]; - const wchar_t* str = wgettext("Profiler shown (page %d of %d)"); - swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, - m_profiler_current_page, m_profiler_max_page); - delete[] str; - showStatusText(buf); + std::wstring msg = fwgettext("Profiler shown (page %d of %d)", + m_profiler_current_page, m_profiler_max_page); + showStatusText(msg); } else { showTranslatedStatusText("Profiler hidden"); } diff --git a/src/client/gameui.h b/src/client/gameui.h index 67c6a9921..cc9377bdc 100644 --- a/src/client/gameui.h +++ b/src/client/gameui.h @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once +#include "irrlichttypes.h" #include <IGUIEnvironment.h> #include "gui/guiFormSpecMenu.h" #include "util/enriched_string.h" @@ -57,7 +58,8 @@ public: bool show_chat = true; bool show_hud = true; bool show_minimap = false; - bool show_debug = true; + bool show_minimal_debug = false; + bool show_basic_debug = false; bool show_profiler_graph = false; }; @@ -82,11 +84,12 @@ public: void showTranslatedStatusText(const char *str); inline void clearStatusText() { m_statustext.clear(); } - const bool isChatVisible() + bool isChatVisible() { return m_flags.show_chat && m_recent_chat_count != 0 && m_profiler_current_page == 0; } void setChatText(const EnrichedString &chat_text, u32 recent_chat_count); + void updateChatSize(); void updateProfiler(); @@ -107,6 +110,8 @@ public: private: Flags m_flags; + float m_drawtime_avg = 0; + gui::IGUIStaticText *m_guitext = nullptr; // First line of debug text gui::IGUIStaticText *m_guitext2 = nullptr; // Second line of debug text @@ -120,6 +125,7 @@ private: gui::IGUIStaticText *m_guitext_chat = nullptr; // Chat text u32 m_recent_chat_count = 0; + core::rect<s32> m_current_chat_size{0, 0, 0, 0}; gui::IGUIStaticText *m_guitext_profiler = nullptr; // Profiler text u8 m_profiler_current_page = 0; diff --git a/src/client/guiscalingfilter.cpp b/src/client/guiscalingfilter.cpp index 406c096e6..42508259f 100644 --- a/src/client/guiscalingfilter.cpp +++ b/src/client/guiscalingfilter.cpp @@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" #include <cstdio> #include "client/renderingengine.h" -#include "client/tile.h" // hasNPotSupport() /* Maintain a static cache to store the images that correspond to textures * in a format that's manipulable by code. Some platforms exhibit issues @@ -44,6 +43,10 @@ void guiScalingCache(const io::path &key, video::IVideoDriver *driver, video::II { if (!g_settings->getBool("gui_scaling_filter")) return; + + if (g_imgCache.find(key) != g_imgCache.end()) + return; // Already cached. + video::IImage *copied = driver->createImage(value->getColorFormat(), value->getDimension()); value->copyTo(copied); @@ -91,18 +94,20 @@ video::ITexture *guiScalingResizeCached(video::IVideoDriver *driver, io::path scalename = origname + "@guiScalingFilter:" + rectstr; // Search for existing scaled texture. - video::ITexture *scaled = g_txrCache[scalename]; + auto it_txr = g_txrCache.find(scalename); + video::ITexture *scaled = (it_txr != g_txrCache.end()) ? it_txr->second : nullptr; if (scaled) return scaled; // Try to find the texture converted to an image in the cache. // If the image was not found, try to extract it from the texture. - video::IImage* srcimg = g_imgCache[origname]; - if (srcimg == NULL) { + auto it_img = g_imgCache.find(origname); + video::IImage *srcimg = (it_img != g_imgCache.end()) ? it_img->second : nullptr; + if (!srcimg) { if (!g_settings->getBool("gui_scaling_filter_txr2img")) return src; srcimg = driver->createImageFromData(src->getColorFormat(), - src->getSize(), src->lock(), false); + src->getSize(), src->lock(video::ETLM_READ_ONLY), false); src->unlock(); g_imgCache[origname] = srcimg; } @@ -117,7 +122,7 @@ video::ITexture *guiScalingResizeCached(video::IVideoDriver *driver, #if ENABLE_GLES // Some platforms are picky about textures being powers of 2, so expand // the image dimensions to the next power of 2, if necessary. - if (!hasNPotSupport()) { + if (!driver->queryFeature(video::EVDF_TEXTURE_NPOT)) { video::IImage *po2img = driver->createImage(src->getColorFormat(), core::dimension2d<u32>(npot2((u32)destrect.getWidth()), npot2((u32)destrect.getHeight()))); @@ -129,7 +134,7 @@ video::ITexture *guiScalingResizeCached(video::IVideoDriver *driver, #endif // Convert the scaled image back into a texture. - scaled = driver->addTexture(scalename, destimg, NULL); + scaled = driver->addTexture(scalename, destimg); destimg->drop(); g_txrCache[scalename] = scaled; @@ -171,52 +176,61 @@ void draw2DImageFilterScaled(video::IVideoDriver *driver, video::ITexture *txr, } void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture, - const core::rect<s32> &rect, const core::rect<s32> &middle, - const core::rect<s32> *cliprect, const video::SColor *const colors) + const core::rect<s32> &destrect, const core::rect<s32> &srcrect, + const core::rect<s32> &middlerect, const core::rect<s32> *cliprect, + const video::SColor *const colors) { - auto originalSize = texture->getOriginalSize(); - core::vector2di lowerRightOffset = core::vector2di(originalSize.Width, originalSize.Height) - middle.LowerRightCorner; + // `-x` is interpreted as `w - x` + core::rect<s32> middle = middlerect; + + if (middlerect.LowerRightCorner.X < 0) + middle.LowerRightCorner.X += srcrect.getWidth(); + if (middlerect.LowerRightCorner.Y < 0) + middle.LowerRightCorner.Y += srcrect.getHeight(); + + core::vector2di lower_right_offset = core::vector2di(srcrect.getWidth(), + srcrect.getHeight()) - middle.LowerRightCorner; for (int y = 0; y < 3; ++y) { for (int x = 0; x < 3; ++x) { - core::rect<s32> src({0, 0}, originalSize); - core::rect<s32> dest = rect; + core::rect<s32> src = srcrect; + core::rect<s32> dest = destrect; switch (x) { case 0: - dest.LowerRightCorner.X = rect.UpperLeftCorner.X + middle.UpperLeftCorner.X; - src.LowerRightCorner.X = middle.UpperLeftCorner.X; + dest.LowerRightCorner.X = destrect.UpperLeftCorner.X + middle.UpperLeftCorner.X; + src.LowerRightCorner.X = srcrect.UpperLeftCorner.X + middle.UpperLeftCorner.X; break; case 1: dest.UpperLeftCorner.X += middle.UpperLeftCorner.X; - dest.LowerRightCorner.X -= lowerRightOffset.X; - src.UpperLeftCorner.X = middle.UpperLeftCorner.X; - src.LowerRightCorner.X = middle.LowerRightCorner.X; + dest.LowerRightCorner.X -= lower_right_offset.X; + src.UpperLeftCorner.X += middle.UpperLeftCorner.X; + src.LowerRightCorner.X -= lower_right_offset.X; break; case 2: - dest.UpperLeftCorner.X = rect.LowerRightCorner.X - lowerRightOffset.X; - src.UpperLeftCorner.X = middle.LowerRightCorner.X; + dest.UpperLeftCorner.X = destrect.LowerRightCorner.X - lower_right_offset.X; + src.UpperLeftCorner.X = srcrect.LowerRightCorner.X - lower_right_offset.X; break; } switch (y) { case 0: - dest.LowerRightCorner.Y = rect.UpperLeftCorner.Y + middle.UpperLeftCorner.Y; - src.LowerRightCorner.Y = middle.UpperLeftCorner.Y; + dest.LowerRightCorner.Y = destrect.UpperLeftCorner.Y + middle.UpperLeftCorner.Y; + src.LowerRightCorner.Y = srcrect.UpperLeftCorner.Y + middle.UpperLeftCorner.Y; break; case 1: dest.UpperLeftCorner.Y += middle.UpperLeftCorner.Y; - dest.LowerRightCorner.Y -= lowerRightOffset.Y; - src.UpperLeftCorner.Y = middle.UpperLeftCorner.Y; - src.LowerRightCorner.Y = middle.LowerRightCorner.Y; + dest.LowerRightCorner.Y -= lower_right_offset.Y; + src.UpperLeftCorner.Y += middle.UpperLeftCorner.Y; + src.LowerRightCorner.Y -= lower_right_offset.Y; break; case 2: - dest.UpperLeftCorner.Y = rect.LowerRightCorner.Y - lowerRightOffset.Y; - src.UpperLeftCorner.Y = middle.LowerRightCorner.Y; + dest.UpperLeftCorner.Y = destrect.LowerRightCorner.Y - lower_right_offset.Y; + src.UpperLeftCorner.Y = srcrect.LowerRightCorner.Y - lower_right_offset.Y; break; } diff --git a/src/client/guiscalingfilter.h b/src/client/guiscalingfilter.h index 379a4bdb0..f2d2fce10 100644 --- a/src/client/guiscalingfilter.h +++ b/src/client/guiscalingfilter.h @@ -46,13 +46,13 @@ video::ITexture *guiScalingImageButton(video::IVideoDriver *driver, video::IText */ void draw2DImageFilterScaled(video::IVideoDriver *driver, video::ITexture *txr, const core::rect<s32> &destrect, const core::rect<s32> &srcrect, - const core::rect<s32> *cliprect = 0, const video::SColor *const colors = 0, - bool usealpha = false); + const core::rect<s32> *cliprect = nullptr, + const video::SColor *const colors = nullptr, bool usealpha = false); /* * 9-slice / segment drawing */ void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture, - const core::rect<s32> &rect, const core::rect<s32> &middle, - const core::rect<s32> *cliprect = nullptr, + const core::rect<s32> &destrect, const core::rect<s32> &srcrect, + const core::rect<s32> &middlerect, const core::rect<s32> *cliprect = nullptr, const video::SColor *const colors = nullptr); diff --git a/src/client/hud.cpp b/src/client/hud.cpp index d3038230c..c0c289608 100644 --- a/src/client/hud.cpp +++ b/src/client/hud.cpp @@ -20,6 +20,8 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "client/hud.h" +#include <string> +#include <iostream> #include <cmath> #include "settings.h" #include "util/numeric.h" @@ -36,6 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mesh.h" #include "wieldmesh.h" #include "client/renderingengine.h" +#include "client/minimap.h" #ifdef HAVE_TOUCHSCREENGUI #include "gui/touchscreengui.h" @@ -44,16 +47,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #define OBJECT_CROSSHAIR_LINE_SIZE 8 #define CROSSHAIR_LINE_SIZE 10 -Hud::Hud(gui::IGUIEnvironment *guienv, Client *client, LocalPlayer *player, +Hud::Hud(Client *client, LocalPlayer *player, Inventory *inventory) { driver = RenderingEngine::get_video_driver(); - this->guienv = guienv; this->client = client; this->player = player; this->inventory = inventory; - m_hud_scaling = g_settings->getFloat("hud_scaling"); + m_hud_scaling = g_settings->getFloat("hud_scaling", 0.5f, 20.0f); m_scale_factor = m_hud_scaling * RenderingEngine::getDisplayDensity(); m_hotbar_imagesize = std::floor(HOTBAR_IMAGE_SIZE * RenderingEngine::getDisplayDensity() + 0.5f); @@ -99,7 +101,7 @@ Hud::Hud(gui::IGUIEnvironment *guienv, Client *client, LocalPlayer *player, if (g_settings->getBool("enable_shaders")) { IShaderSource *shdrsrc = client->getShaderSource(); u16 shader_id = shdrsrc->getShader( - m_mode == HIGHLIGHT_HALO ? "selection_shader" : "default_shader", 1, 1); + m_mode == HIGHLIGHT_HALO ? "selection_shader" : "default_shader", TILE_MATERIAL_ALPHA); m_selection_material.MaterialType = shdrsrc->getShaderInfo(shader_id).material; } else { m_selection_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; @@ -222,6 +224,7 @@ void Hud::drawItem(const ItemStack &item, const core::rect<s32>& rect, } //NOTE: selectitem = 0 -> no selected; selectitem 1-based +// mainlist can be NULL, but draw the frame anyway. void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount, s32 inv_offset, InventoryList *mainlist, u16 selectitem, u16 direction) { @@ -269,7 +272,8 @@ void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount, // Draw items core::rect<s32> imgrect(0, 0, m_hotbar_imagesize, m_hotbar_imagesize); - for (s32 i = inv_offset; i < itemcount && (size_t)i < mainlist->getSize(); i++) { + const s32 list_size = mainlist ? mainlist->getSize() : 0; + for (s32 i = inv_offset; i < itemcount && i < list_size; i++) { s32 fullimglen = m_hotbar_imagesize + m_padding * 2; v2s32 steppos; @@ -297,12 +301,24 @@ void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount, } } +bool Hud::hasElementOfType(HudElementType type) +{ + for (size_t i = 0; i != player->maxHudId(); i++) { + HudElement *e = player->getHud(i); + if (!e) + continue; + if (e->type == type) + return true; + } + return false; +} + // Calculates screen position of waypoint. Returns true if waypoint is visible (in front of the player), else false. bool Hud::calculateScreenPos(const v3s16 &camera_offset, HudElement *e, v2s32 *pos) { v3f w_pos = e->world_pos * BS; scene::ICameraSceneNode* camera = - RenderingEngine::get_scene_manager()->getActiveCamera(); + client->getSceneManager()->getActiveCamera(); w_pos -= intToFloat(camera_offset, BS); core::matrix4 trans = camera->getProjectionMatrix(); trans *= camera->getViewMatrix(); @@ -319,65 +335,65 @@ bool Hud::calculateScreenPos(const v3s16 &camera_offset, HudElement *e, v2s32 *p void Hud::drawLuaElements(const v3s16 &camera_offset) { - u32 text_height = g_fontengine->getTextHeight(); - irr::gui::IGUIFont* font = g_fontengine->getFont(); + const u32 text_height = g_fontengine->getTextHeight(); + gui::IGUIFont *const font = g_fontengine->getFont(); // Reorder elements by z_index - std::vector<size_t> ids; + std::vector<HudElement*> elems; + elems.reserve(player->maxHudId()); for (size_t i = 0; i != player->maxHudId(); i++) { HudElement *e = player->getHud(i); if (!e) continue; - auto it = ids.begin(); - while (it != ids.end() && player->getHud(*it)->z_index <= e->z_index) + auto it = elems.begin(); + while (it != elems.end() && (*it)->z_index <= e->z_index) ++it; - ids.insert(it, i); + elems.insert(it, e); } - for (size_t i : ids) { - HudElement *e = player->getHud(i); + for (HudElement *e : elems) { v2s32 pos(floor(e->pos.X * (float) m_screensize.X + 0.5), floor(e->pos.Y * (float) m_screensize.Y + 0.5)); switch (e->type) { case HUD_ELEM_TEXT: { - irr::gui::IGUIFont *textfont = font; unsigned int font_size = g_fontengine->getDefaultFontSize(); if (e->size.X > 0) font_size *= e->size.X; - if (font_size != g_fontengine->getDefaultFontSize()) - textfont = g_fontengine->getFont(font_size); +#ifdef __ANDROID__ + // The text size on Android is not proportional with the actual scaling + // FIXME: why do we have such a weird unportable hack?? + if (font_size > 3 && e->offset.X < -20) + font_size -= 3; +#endif + auto textfont = g_fontengine->getFont(FontSpec(font_size, + (e->style & HUD_STYLE_MONO) ? FM_Mono : FM_Unspecified, + e->style & HUD_STYLE_BOLD, e->style & HUD_STYLE_ITALIC)); video::SColor color(255, (e->number >> 16) & 0xFF, (e->number >> 8) & 0xFF, (e->number >> 0) & 0xFF); std::wstring text = unescape_translate(utf8_to_wide(e->text)); core::dimension2d<u32> textsize = textfont->getDimension(text.c_str()); -#ifdef __ANDROID__ - // The text size on Android is not proportional with the actual scaling - irr::gui::IGUIFont *font_scaled = font_size <= 3 ? - textfont : g_fontengine->getFont(font_size - 3); - if (e->offset.X < -20) - textsize = font_scaled->getDimension(text.c_str()); -#endif - v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2), - (e->align.Y - 1.0) * (textsize.Height / 2)); + + v2s32 offset(0, (e->align.Y - 1.0) * (textsize.Height / 2)); core::rect<s32> size(0, 0, e->scale.X * m_scale_factor, - text_height * e->scale.Y * m_scale_factor); + text_height * e->scale.Y * m_scale_factor); v2s32 offs(e->offset.X * m_scale_factor, - e->offset.Y * m_scale_factor); -#ifdef __ANDROID__ - if (e->offset.X < -20) - font_scaled->draw(text.c_str(), size + pos + offset + offs, color); - else -#endif + e->offset.Y * m_scale_factor); + std::wstringstream wss(text); + std::wstring line; + while (std::getline(wss, line, L'\n')) { - textfont->draw(text.c_str(), size + pos + offset + offs, color); + core::dimension2d<u32> linesize = textfont->getDimension(line.c_str()); + v2s32 line_offset((e->align.X - 1.0) * (linesize.Width / 2), 0); + textfont->draw(line.c_str(), size + pos + offset + offs + line_offset, color); + offset.Y += linesize.Height; } break; } case HUD_ELEM_STATBAR: { @@ -387,6 +403,8 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) break; } case HUD_ELEM_INVENTORY: { InventoryList *inv = inventory->getList(e->text); + if (!inv) + warningstream << "HUD: Unknown inventory list. name=" << e->text << std::endl; drawItems(pos, v2s32(e->offset.X, e->offset.Y), e->number, 0, inv, e->item, e->dir); break; } @@ -462,7 +480,7 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) // Angle according to camera view v3f fore(0.f, 0.f, 1.f); - scene::ICameraSceneNode *cam = RenderingEngine::get_scene_manager()->getActiveCamera(); + scene::ICameraSceneNode *cam = client->getSceneManager()->getActiveCamera(); cam->getAbsoluteTransformation().rotateVect(fore); int angle = - fore.getHorizontalAngle().Y; @@ -491,11 +509,26 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) default: break; } - + break; } + case HUD_ELEM_MINIMAP: { + if (e->size.X <= 0 || e->size.Y <= 0) + break; + if (!client->getMinimap()) + break; + // Draw a minimap of size "size" + v2s32 dstsize(e->size.X * m_scale_factor, + e->size.Y * m_scale_factor); + // (no percent size as minimap would likely be anamorphosed) + v2s32 offset((e->align.X - 1.0) * dstsize.X / 2, + (e->align.Y - 1.0) * dstsize.Y / 2); + core::rect<s32> rect(0, 0, dstsize.X, dstsize.Y); + rect += pos + offset + v2s32(e->offset.X * m_scale_factor, + e->offset.Y * m_scale_factor); + client->getMinimap()->drawMinimap(rect); break; } default: - infostream << "Hud::drawLuaElements: ignoring drawform " << e->type << - " of hud element ID " << i << " due to unrecognized type" << std::endl; + infostream << "Hud::drawLuaElements: ignoring drawform " << e->type + << " due to unrecognized type" << std::endl; } } } @@ -543,8 +576,6 @@ void Hud::drawCompassTranslate(HudElement *e, video::ITexture *texture, void Hud::drawCompassRotate(HudElement *e, video::ITexture *texture, const core::rect<s32> &rect, int angle) { - core::dimension2di imgsize(texture->getOriginalSize()); - core::rect<s32> oldViewPort = driver->getViewPort(); core::matrix4 oldProjMat = driver->getTransform(video::ETS_PROJECTION); core::matrix4 oldViewMat = driver->getTransform(video::ETS_VIEW); @@ -645,7 +676,7 @@ void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, // Rectangles for 1/2 the "off state" texture core::rect<s32> srchalfrect2, dsthalfrect2; - if (count % 2 == 1) { + if (count % 2 == 1 || maxcount % 2 == 1) { // Need to draw halves: Calculate rectangles srchalfrect = calculate_clipping_rect(srcd, steppos); dsthalfrect = calculate_clipping_rect(dstd, steppos); @@ -680,7 +711,7 @@ void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, } } - if (stat_texture_bg && maxcount > count / 2) { + if (stat_texture_bg && maxcount > count) { // Draw "off state" textures s32 start_offset; if (count % 2 == 1) @@ -700,8 +731,7 @@ void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, if (maxcount % 2 == 1) { draw2DImageFilterScaled(driver, stat_texture_bg, - dsthalfrect + p, srchalfrect, - NULL, colors, true); + dsthalfrect + p, srchalfrect, NULL, colors, true); } } } @@ -721,7 +751,7 @@ void Hud::drawHotbar(u16 playeritem) { s32 width = hotbar_itemcount * (m_hotbar_imagesize + m_padding * 2); v2s32 pos = centerlowerpos - v2s32(width / 2, m_hotbar_imagesize + m_padding * 3); - const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize(); + const v2u32 &window_size = RenderingEngine::getWindowSize(); if ((float) width / (float) window_size.X <= g_settings->getFloat("hud_hotbar_max_width")) { if (player->hud_flags & HUD_FLAG_HOTBAR_VISIBLE) { @@ -836,6 +866,60 @@ void Hud::drawSelectionMesh() } } +enum Hud::BlockBoundsMode Hud::toggleBlockBounds() +{ + m_block_bounds_mode = static_cast<BlockBoundsMode>(m_block_bounds_mode + 1); + + if (m_block_bounds_mode >= BLOCK_BOUNDS_MAX) { + m_block_bounds_mode = BLOCK_BOUNDS_OFF; + } + return m_block_bounds_mode; +} + +void Hud::disableBlockBounds() +{ + m_block_bounds_mode = BLOCK_BOUNDS_OFF; +} + +void Hud::drawBlockBounds() +{ + if (m_block_bounds_mode == BLOCK_BOUNDS_OFF) { + return; + } + + video::SMaterial old_material = driver->getMaterial2D(); + driver->setMaterial(m_selection_material); + + v3s16 pos = player->getStandingNodePos(); + + v3s16 blockPos( + floorf((float) pos.X / MAP_BLOCKSIZE), + floorf((float) pos.Y / MAP_BLOCKSIZE), + floorf((float) pos.Z / MAP_BLOCKSIZE) + ); + + v3f offset = intToFloat(client->getCamera()->getOffset(), BS); + + s8 radius = m_block_bounds_mode == BLOCK_BOUNDS_NEAR ? 2 : 0; + + v3f halfNode = v3f(BS, BS, BS) / 2.0f; + + for (s8 x = -radius; x <= radius; x++) + for (s8 y = -radius; y <= radius; y++) + for (s8 z = -radius; z <= radius; z++) { + v3s16 blockOffset(x, y, z); + + aabb3f box( + intToFloat((blockPos + blockOffset) * MAP_BLOCKSIZE, BS) - offset - halfNode, + intToFloat(((blockPos + blockOffset) * MAP_BLOCKSIZE) + (MAP_BLOCKSIZE - 1), BS) - offset + halfNode + ); + + driver->draw3DBox(box, video::SColor(255, 255, 0, 0)); + } + + driver->setMaterial(old_material); +} + void Hud::updateSelectionMesh(const v3s16 &camera_offset) { m_camera_offset = camera_offset; @@ -882,7 +966,7 @@ void Hud::updateSelectionMesh(const v3s16 &camera_offset) } void Hud::resizeHotbar() { - const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize(); + const v2u32 &window_size = RenderingEngine::getWindowSize(); if (m_screensize != window_size) { m_hotbar_imagesize = floor(HOTBAR_IMAGE_SIZE * @@ -919,12 +1003,28 @@ void drawItemStack( return; } - const ItemDefinition &def = item.getDefinition(client->idef()); - ItemMesh *imesh = client->idef()->getWieldMesh(def.name, client); + const static thread_local bool enable_animations = + g_settings->getBool("inventory_items_animations"); - if (imesh && imesh->mesh) { + const ItemDefinition &def = item.getDefinition(client->idef()); + + bool draw_overlay = false; + + bool has_mesh = false; + ItemMesh *imesh; + + core::rect<s32> viewrect = rect; + if (clip != nullptr) + viewrect.clipAgainst(*clip); + + // Render as mesh if animated or no inventory image + if ((enable_animations && rotation_kind < IT_ROT_NONE) || def.inventory_image.empty()) { + imesh = client->idef()->getWieldMesh(def.name, client); + has_mesh = imesh && imesh->mesh; + } + if (has_mesh) { scene::IMesh *mesh = imesh->mesh; - driver->clearZBuffer(); + driver->clearBuffers(video::ECBF_DEPTH); s32 delta = 0; if (rotation_kind < IT_ROT_NONE) { MeshTimeInfo &ti = rotation_time_infos[rotation_kind]; @@ -938,9 +1038,6 @@ void drawItemStack( core::rect<s32> oldViewPort = driver->getViewPort(); core::matrix4 oldProjMat = driver->getTransform(video::ETS_PROJECTION); core::matrix4 oldViewMat = driver->getTransform(video::ETS_VIEW); - core::rect<s32> viewrect = rect; - if (clip) - viewrect.clipAgainst(*clip); core::matrix4 ProjMatrix; ProjMatrix.buildProjectionMatrixOrthoLH(2.0f, 2.0f, -1.0f, 100.0f); @@ -966,9 +1063,6 @@ void drawItemStack( core::matrix4 matrix; matrix.makeIdentity(); - static thread_local bool enable_animations = - g_settings->getBool("inventory_items_animations"); - if (enable_animations) { float timer_f = (float) delta / 5000.f; matrix.setRotationDegrees(v3f( @@ -1014,22 +1108,43 @@ void drawItemStack( driver->setTransform(video::ETS_PROJECTION, oldProjMat); driver->setViewPort(oldViewPort); - // draw the inventory_overlay - if (def.type == ITEM_NODE && def.inventory_image.empty() && - !def.inventory_overlay.empty()) { + draw_overlay = def.type == ITEM_NODE && def.inventory_image.empty(); + } else { // Otherwise just draw as 2D + video::ITexture *texture = client->idef()->getInventoryTexture(def.name, client); + video::SColor color; + if (texture) { + color = client->idef()->getItemstackColor(item, client); + } else { + color = video::SColor(255, 255, 255, 255); ITextureSource *tsrc = client->getTextureSource(); - video::ITexture *overlay_texture = tsrc->getTexture(def.inventory_overlay); - core::dimension2d<u32> dimens = overlay_texture->getOriginalSize(); - core::rect<s32> srcrect(0, 0, dimens.Width, dimens.Height); - draw2DImageFilterScaled(driver, overlay_texture, rect, srcrect, clip, 0, true); + texture = tsrc->getTexture("no_texture.png"); + if (!texture) + return; } + + const video::SColor colors[] = { color, color, color, color }; + + draw2DImageFilterScaled(driver, texture, rect, + core::rect<s32>({0, 0}, core::dimension2di(texture->getOriginalSize())), + clip, colors, true); + + draw_overlay = true; + } + + // draw the inventory_overlay + if (!def.inventory_overlay.empty() && draw_overlay) { + ITextureSource *tsrc = client->getTextureSource(); + video::ITexture *overlay_texture = tsrc->getTexture(def.inventory_overlay); + core::dimension2d<u32> dimens = overlay_texture->getOriginalSize(); + core::rect<s32> srcrect(0, 0, dimens.Width, dimens.Height); + draw2DImageFilterScaled(driver, overlay_texture, rect, srcrect, clip, 0, true); } if (def.type == ITEM_TOOL && item.wear != 0) { // Draw a progressbar - float barheight = rect.getHeight() / 16; - float barpad_x = rect.getWidth() / 16; - float barpad_y = rect.getHeight() / 16; + float barheight = static_cast<float>(rect.getHeight()) / 16; + float barpad_x = static_cast<float>(rect.getWidth()) / 16; + float barpad_y = static_cast<float>(rect.getHeight()) / 16; core::rect<s32> progressrect( rect.UpperLeftCorner.X + barpad_x, @@ -1066,24 +1181,68 @@ void drawItemStack( driver->draw2DRectangle(color, progressrect2, clip); } - if (font != NULL && item.count >= 2) { + const std::string &count_text = item.metadata.getString("count_meta"); + if (font != nullptr && (item.count >= 2 || !count_text.empty())) { // Get the item count as a string - std::string text = itos(item.count); - v2u32 dim = font->getDimension(utf8_to_wide(text).c_str()); + std::string text = count_text.empty() ? itos(item.count) : count_text; + v2u32 dim = font->getDimension(utf8_to_wide(unescape_enriched(text)).c_str()); v2s32 sdim(dim.X, dim.Y); core::rect<s32> rect2( - /*rect.UpperLeftCorner, - core::dimension2d<u32>(rect.getWidth(), 15)*/ rect.LowerRightCorner - sdim, - sdim + rect.LowerRightCorner ); - video::SColor bgcolor(128, 0, 0, 0); - driver->draw2DRectangle(bgcolor, rect2, clip); + // get the count alignment + s32 count_alignment = stoi(item.metadata.getString("count_alignment")); + if (count_alignment != 0) { + s32 a_x = count_alignment & 3; + s32 a_y = (count_alignment >> 2) & 3; + + s32 x1, x2, y1, y2; + switch (a_x) { + case 1: // left + x1 = rect.UpperLeftCorner.X; + x2 = x1 + sdim.X; + break; + case 2: // middle + x1 = (rect.UpperLeftCorner.X + rect.LowerRightCorner.X - sdim.X) / 2; + x2 = x1 + sdim.X; + break; + case 3: // right + x2 = rect.LowerRightCorner.X; + x1 = x2 - sdim.X; + break; + default: // 0 = default + x1 = rect2.UpperLeftCorner.X; + x2 = rect2.LowerRightCorner.X; + break; + } + + switch (a_y) { + case 1: // up + y1 = rect.UpperLeftCorner.Y; + y2 = y1 + sdim.Y; + break; + case 2: // middle + y1 = (rect.UpperLeftCorner.Y + rect.LowerRightCorner.Y - sdim.Y) / 2; + y2 = y1 + sdim.Y; + break; + case 3: // down + y2 = rect.LowerRightCorner.Y; + y1 = y2 - sdim.Y; + break; + default: // 0 = default + y1 = rect2.UpperLeftCorner.Y; + y2 = rect2.LowerRightCorner.Y; + break; + } + + rect2 = core::rect<s32>(x1, y1, x2, y2); + } video::SColor color(255, 255, 255, 255); - font->draw(text.c_str(), rect2, color, false, false, clip); + font->draw(utf8_to_wide(text).c_str(), rect2, color, false, false, &viewrect); } } diff --git a/src/client/hud.h b/src/client/hud.h index cf83cb16e..fd79183a0 100644 --- a/src/client/hud.h +++ b/src/client/hud.h @@ -35,13 +35,13 @@ struct ItemStack; class Hud { public: - video::IVideoDriver *driver; - scene::ISceneManager *smgr; - gui::IGUIEnvironment *guienv; - Client *client; - LocalPlayer *player; - Inventory *inventory; - ITextureSource *tsrc; + enum BlockBoundsMode + { + BLOCK_BOUNDS_OFF, + BLOCK_BOUNDS_CURRENT, + BLOCK_BOUNDS_NEAR, + BLOCK_BOUNDS_MAX + } m_block_bounds_mode = BLOCK_BOUNDS_OFF; video::SColor crosshair_argb; video::SColor selectionbox_argb; @@ -55,10 +55,14 @@ public: bool pointing_at_object = false; - Hud(gui::IGUIEnvironment *guienv, Client *client, LocalPlayer *player, + Hud(Client *client, LocalPlayer *player, Inventory *inventory); ~Hud(); + enum BlockBoundsMode toggleBlockBounds(); + void disableBlockBounds(); + void drawBlockBounds(); + void drawHotbar(u16 playeritem); void resizeHotbar(); void drawCrosshair(); @@ -81,6 +85,8 @@ public: m_selected_face_normal = face_normal; } + bool hasElementOfType(HudElementType type); + void drawLuaElements(const v3s16 &camera_offset); private: @@ -101,6 +107,12 @@ private: void drawCompassRotate(HudElement *e, video::ITexture *texture, const core::rect<s32> &rect, int way); + Client *client = nullptr; + video::IVideoDriver *driver = nullptr; + LocalPlayer *player = nullptr; + Inventory *inventory = nullptr; + ITextureSource *tsrc = nullptr; + float m_hud_scaling; // cached minetest setting float m_scale_factor; v3s16 m_camera_offset; diff --git a/src/client/imagefilters.cpp b/src/client/imagefilters.cpp index 0fa501410..c9d1504ad 100644 --- a/src/client/imagefilters.cpp +++ b/src/client/imagefilters.cpp @@ -19,63 +19,140 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "imagefilters.h" #include "util/numeric.h" #include <cmath> +#include <cassert> +#include <vector> +#include <algorithm> + +// Simple 2D bitmap class with just the functionality needed here +class Bitmap { + u32 linesize, lines; + std::vector<u8> data; + + static inline u32 bytepos(u32 index) { return index >> 3; } + static inline u8 bitpos(u32 index) { return index & 7; } + +public: + Bitmap(u32 width, u32 height) : linesize(width), lines(height), + data(bytepos(width * height) + 1) {} + + inline bool get(u32 x, u32 y) const { + u32 index = y * linesize + x; + return data[bytepos(index)] & (1 << bitpos(index)); + } + + inline void set(u32 x, u32 y) { + u32 index = y * linesize + x; + data[bytepos(index)] |= 1 << bitpos(index); + } + + inline bool all() const { + for (u32 i = 0; i < data.size() - 1; i++) { + if (data[i] != 0xff) + return false; + } + // last byte not entirely filled + for (u8 i = 0; i < bitpos(linesize * lines); i++) { + bool value_of_bit = data.back() & (1 << i); + if (!value_of_bit) + return false; + } + return true; + } + + inline void copy(Bitmap &to) const { + assert(to.linesize == linesize && to.lines == lines); + to.data = data; + } +}; /* Fill in RGB values for transparent pixels, to correct for odd colors * appearing at borders when blending. This is because many PNG optimizers * like to discard RGB values of transparent pixels, but when blending then - * with non-transparent neighbors, their RGB values will shpw up nonetheless. + * with non-transparent neighbors, their RGB values will show up nonetheless. * * This function modifies the original image in-place. * * Parameter "threshold" is the alpha level below which pixels are considered - * transparent. Should be 127 for 3d where alpha is threshold, but 0 for - * 2d where alpha is blended. + * transparent. Should be 127 when the texture is used with ALPHA_CHANNEL_REF, + * 0 when alpha blending is used. */ void imageCleanTransparent(video::IImage *src, u32 threshold) { core::dimension2d<u32> dim = src->getDimension(); - // Walk each pixel looking for fully transparent ones. + Bitmap bitmap(dim.Width, dim.Height); + + // First pass: Mark all opaque pixels // Note: loop y around x for better cache locality. for (u32 ctry = 0; ctry < dim.Height; ctry++) for (u32 ctrx = 0; ctrx < dim.Width; ctrx++) { + if (src->getPixel(ctrx, ctry).getAlpha() > threshold) + bitmap.set(ctrx, ctry); + } - // Ignore opaque pixels. - irr::video::SColor c = src->getPixel(ctrx, ctry); - if (c.getAlpha() > threshold) + // Exit early if all pixels opaque + if (bitmap.all()) + return; + + Bitmap newmap = bitmap; + + // Cap iterations to keep runtime reasonable, for higher-res textures we can + // get away with filling less pixels. + int iter_max = 11 - std::max(dim.Width, dim.Height) / 16; + iter_max = std::max(iter_max, 2); + + // Then repeatedly look for transparent pixels, filling them in until + // we're finished. + for (int iter = 0; iter < iter_max; iter++) { + + for (u32 ctry = 0; ctry < dim.Height; ctry++) + for (u32 ctrx = 0; ctrx < dim.Width; ctrx++) { + // Skip pixels we have already processed + if (bitmap.get(ctrx, ctry)) continue; - // Sample size and total weighted r, g, b values. + video::SColor c = src->getPixel(ctrx, ctry); + + // Sample size and total weighted r, g, b values u32 ss = 0, sr = 0, sg = 0, sb = 0; - // Walk each neighbor pixel (clipped to image bounds). + // Walk each neighbor pixel (clipped to image bounds) for (u32 sy = (ctry < 1) ? 0 : (ctry - 1); sy <= (ctry + 1) && sy < dim.Height; sy++) for (u32 sx = (ctrx < 1) ? 0 : (ctrx - 1); sx <= (ctrx + 1) && sx < dim.Width; sx++) { - - // Ignore transparent pixels. - irr::video::SColor d = src->getPixel(sx, sy); - if (d.getAlpha() <= threshold) + // Ignore pixels we haven't processed + if (!bitmap.get(sx, sy)) continue; - // Add RGB values weighted by alpha. - u32 a = d.getAlpha(); + // Add RGB values weighted by alpha IF the pixel is opaque, otherwise + // use full weight since we want to propagate colors. + video::SColor d = src->getPixel(sx, sy); + u32 a = d.getAlpha() <= threshold ? 255 : d.getAlpha(); ss += a; sr += a * d.getRed(); sg += a * d.getGreen(); sb += a * d.getBlue(); } - // If we found any neighbor RGB data, set pixel to average - // weighted by alpha. + // Set pixel to average weighted by alpha if (ss > 0) { c.setRed(sr / ss); c.setGreen(sg / ss); c.setBlue(sb / ss); src->setPixel(ctrx, ctry, c); + newmap.set(ctrx, ctry); } } + + if (newmap.all()) + return; + + // Apply changes to bitmap for next run. This is done so we don't introduce + // a bias in color propagation in the direction pixels are processed. + newmap.copy(bitmap); + + } } /* Scale a region of an image into another image, using nearest-neighbor with diff --git a/src/client/imagefilters.h b/src/client/imagefilters.h index 5676faf85..c9bdefbb6 100644 --- a/src/client/imagefilters.h +++ b/src/client/imagefilters.h @@ -23,13 +23,13 @@ with this program; if not, write to the Free Software Foundation, Inc., /* Fill in RGB values for transparent pixels, to correct for odd colors * appearing at borders when blending. This is because many PNG optimizers * like to discard RGB values of transparent pixels, but when blending then - * with non-transparent neighbors, their RGB values will shpw up nonetheless. + * with non-transparent neighbors, their RGB values will show up nonetheless. * * This function modifies the original image in-place. * * Parameter "threshold" is the alpha level below which pixels are considered - * transparent. Should be 127 for 3d where alpha is threshold, but 0 for - * 2d where alpha is blended. + * transparent. Should be 127 when the texture is used with ALPHA_CHANNEL_REF, + * 0 when alpha blending is used. */ void imageCleanTransparent(video::IImage *src, u32 threshold); diff --git a/src/client/inputhandler.cpp b/src/client/inputhandler.cpp index ee3e37ae9..a6ba87e8d 100644 --- a/src/client/inputhandler.cpp +++ b/src/client/inputhandler.cpp @@ -35,7 +35,7 @@ void KeyCache::populate() key[KeyType::LEFT] = getKeySetting("keymap_left"); key[KeyType::RIGHT] = getKeySetting("keymap_right"); key[KeyType::JUMP] = getKeySetting("keymap_jump"); - key[KeyType::SPECIAL1] = getKeySetting("keymap_special1"); + key[KeyType::AUX1] = getKeySetting("keymap_aux1"); key[KeyType::SNEAK] = getKeySetting("keymap_sneak"); key[KeyType::DIG] = getKeySetting("keymap_dig"); key[KeyType::PLACE] = getKeySetting("keymap_place"); @@ -60,6 +60,7 @@ void KeyCache::populate() key[KeyType::DEC_VOLUME] = getKeySetting("keymap_decrease_volume"); key[KeyType::CINEMATIC] = getKeySetting("keymap_cinematic"); key[KeyType::SCREENSHOT] = getKeySetting("keymap_screenshot"); + key[KeyType::TOGGLE_BLOCK_BOUNDS] = getKeySetting("keymap_toggle_block_bounds"); key[KeyType::TOGGLE_HUD] = getKeySetting("keymap_toggle_hud"); key[KeyType::TOGGLE_CHAT] = getKeySetting("keymap_toggle_chat"); key[KeyType::TOGGLE_FOG] = getKeySetting("keymap_toggle_fog"); @@ -112,23 +113,18 @@ bool MyEventReceiver::OnEvent(const SEvent &event) // Remember whether each key is down or up if (event.EventType == irr::EET_KEY_INPUT_EVENT) { const KeyPress &keyCode = event.KeyInput; - if (keysListenedFor.count(keyCode)) { - // If the key is being held down then the OS may - // send a continuous stream of keydown events. - // In this case, we don't want to let this - // stream reach the application as it will cause - // certain actions to repeat constantly. + if (keysListenedFor[keyCode]) { if (event.KeyInput.PressedDown) { - if (!IsKeyDown(keyCode)) { - keyWasDown.insert(keyCode); - keyWasPressed.insert(keyCode); - } - keyIsDown.insert(keyCode); + if (!IsKeyDown(keyCode)) + keyWasPressed.set(keyCode); + + keyIsDown.set(keyCode); + keyWasDown.set(keyCode); } else { if (IsKeyDown(keyCode)) - keyWasReleased.insert(keyCode); + keyWasReleased.set(keyCode); - keyIsDown.erase(keyCode); + keyIsDown.unset(keyCode); } return true; @@ -142,47 +138,44 @@ bool MyEventReceiver::OnEvent(const SEvent &event) #endif } else if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) { - /* TODO add a check like: - if (event.JoystickEvent != joystick_we_listen_for) - return false; - */ - return joystick->handleEvent(event.JoystickEvent); + // joystick may be nullptr if game is launched with '--random-input' parameter + return joystick && joystick->handleEvent(event.JoystickEvent); } else if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) { // Handle mouse events KeyPress key; switch (event.MouseInput.Event) { case EMIE_LMOUSE_PRESSED_DOWN: key = "KEY_LBUTTON"; - keyIsDown.insert(key); - keyWasDown.insert(key); - keyWasPressed.insert(key); + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); break; case EMIE_MMOUSE_PRESSED_DOWN: key = "KEY_MBUTTON"; - keyIsDown.insert(key); - keyWasDown.insert(key); - keyWasPressed.insert(key); + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); break; case EMIE_RMOUSE_PRESSED_DOWN: key = "KEY_RBUTTON"; - keyIsDown.insert(key); - keyWasDown.insert(key); - keyWasPressed.insert(key); + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); break; case EMIE_LMOUSE_LEFT_UP: key = "KEY_LBUTTON"; - keyIsDown.erase(key); - keyWasReleased.insert(key); + keyIsDown.unset(key); + keyWasReleased.set(key); break; case EMIE_MMOUSE_LEFT_UP: key = "KEY_MBUTTON"; - keyIsDown.erase(key); - keyWasReleased.insert(key); + keyIsDown.unset(key); + keyWasReleased.set(key); break; case EMIE_RMOUSE_LEFT_UP: key = "KEY_RBUTTON"; - keyIsDown.erase(key); - keyWasReleased.insert(key); + keyIsDown.unset(key); + keyWasReleased.set(key); break; case EMIE_MOUSE_WHEEL: mouse_wheel += event.MouseInput.Wheel; @@ -224,7 +217,7 @@ void RandomInputHandler::step(float dtime) { static RandomInputHandlerSimData rnd_data[] = { { "keymap_jump", 0.0f, 40 }, - { "keymap_special1", 0.0f, 40 }, + { "keymap_aux1", 0.0f, 40 }, { "keymap_forward", 0.0f, 40 }, { "keymap_left", 0.0f, 40 }, { "keymap_dig", 0.0f, 30 }, @@ -235,11 +228,7 @@ void RandomInputHandler::step(float dtime) i.counter -= dtime; if (i.counter < 0.0) { i.counter = 0.1 * Rand(1, i.time_max); - KeyPress k = getKeySetting(i.key.c_str()); - if (keydown.count(k)) - keydown.erase(k); - else - keydown.insert(k); + keydown.toggle(getKeySetting(i.key.c_str())); } } { @@ -251,4 +240,39 @@ void RandomInputHandler::step(float dtime) } } mousepos += mousespeed; + static bool useJoystick = false; + { + static float counterUseJoystick = 0; + counterUseJoystick -= dtime; + if (counterUseJoystick < 0.0) { + counterUseJoystick = 5.0; // switch between joystick and keyboard direction input + useJoystick = !useJoystick; + } + } + if (useJoystick) { + static float counterMovement = 0; + counterMovement -= dtime; + if (counterMovement < 0.0) { + counterMovement = 0.1 * Rand(1, 40); + movementSpeed = Rand(0,100)*0.01; + movementDirection = Rand(-100, 100)*0.01 * M_PI; + } + } else { + bool f = keydown[keycache.key[KeyType::FORWARD]], + l = keydown[keycache.key[KeyType::LEFT]]; + if (f || l) { + movementSpeed = 1.0f; + if (f && !l) + movementDirection = 0.0; + else if (!f && l) + movementDirection = -M_PI_2; + else if (f && l) + movementDirection = -M_PI_4; + else + movementDirection = 0.0; + } else { + movementSpeed = 0.0; + movementDirection = 0.0; + } + } } diff --git a/src/client/inputhandler.h b/src/client/inputhandler.h index 885f34e05..3db105c51 100644 --- a/src/client/inputhandler.h +++ b/src/client/inputhandler.h @@ -21,9 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "joystick_controller.h" +#include <list> #include "keycode.h" #include "renderingengine.h" -#include <unordered_set> #ifdef HAVE_TOUCHSCREENGUI #include "gui/touchscreengui.h" @@ -61,33 +61,105 @@ struct KeyCache InputHandler *handler; }; +class KeyList : private std::list<KeyPress> +{ + typedef std::list<KeyPress> super; + typedef super::iterator iterator; + typedef super::const_iterator const_iterator; + + virtual const_iterator find(const KeyPress &key) const + { + const_iterator f(begin()); + const_iterator e(end()); + + while (f != e) { + if (*f == key) + return f; + + ++f; + } + + return e; + } + + virtual iterator find(const KeyPress &key) + { + iterator f(begin()); + iterator e(end()); + + while (f != e) { + if (*f == key) + return f; + + ++f; + } + + return e; + } + +public: + void clear() { super::clear(); } + + void set(const KeyPress &key) + { + if (find(key) == end()) + push_back(key); + } + + void unset(const KeyPress &key) + { + iterator p(find(key)); + + if (p != end()) + erase(p); + } + + void toggle(const KeyPress &key) + { + iterator p(this->find(key)); + + if (p != end()) + erase(p); + else + push_back(key); + } + + bool operator[](const KeyPress &key) const { return find(key) != end(); } +}; + class MyEventReceiver : public IEventReceiver { public: // This is the one method that we have to implement virtual bool OnEvent(const SEvent &event); - bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown.count(keyCode); } + bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown[keyCode]; } // Checks whether a key was down and resets the state bool WasKeyDown(const KeyPress &keyCode) { - bool b = keyWasDown.count(keyCode); + bool b = keyWasDown[keyCode]; if (b) - keyWasDown.erase(keyCode); + keyWasDown.unset(keyCode); return b; } // Checks whether a key was just pressed. State will be cleared // in the subsequent iteration of Game::processPlayerInteraction - bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed.count(keycode); } + bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed[keycode]; } // Checks whether a key was just released. State will be cleared // in the subsequent iteration of Game::processPlayerInteraction - bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased.count(keycode); } + bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased[keycode]; } - void listenForKey(const KeyPress &keyCode) { keysListenedFor.insert(keyCode); } - void dontListenForKeys() { keysListenedFor.clear(); } + void listenForKey(const KeyPress &keyCode) + { + keysListenedFor.set(keyCode); + } + void dontListenForKeys() + { + keysListenedFor.clear(); + } s32 getMouseWheel() { @@ -123,8 +195,6 @@ public: #endif } - s32 mouse_wheel = 0; - JoystickController *joystick = nullptr; #ifdef HAVE_TOUCHSCREENGUI @@ -132,20 +202,26 @@ public: #endif private: - //! The current state of keys - std::unordered_set<KeyPress> keyIsDown; + s32 mouse_wheel = 0; - //! Whether a key was down - std::unordered_set<KeyPress> keyWasDown; + // The current state of keys + KeyList keyIsDown; - //! Whether a key has just been pressed - std::unordered_set<KeyPress> keyWasPressed; + // Like keyIsDown but only reset when that key is read + KeyList keyWasDown; - //! Whether a key has just been released - std::unordered_set<KeyPress> keyWasReleased; + // Whether a key has just been pressed + KeyList keyWasPressed; - //! List of keys we listen for - std::unordered_set<KeyPress> keysListenedFor; + // Whether a key has just been released + KeyList keyWasReleased; + + // List of keys we listen for + // TODO perhaps the type of this is not really + // performant as KeyList is designed for few but + // often changing keys, and keysListenedFor is expected + // to change seldomly but contain lots of keys. + KeyList keysListenedFor; }; class InputHandler @@ -170,6 +246,9 @@ public: virtual bool wasKeyReleased(GameKeyType k) = 0; virtual bool cancelPressed() = 0; + virtual float getMovementSpeed() = 0; + virtual float getMovementDirection() = 0; + virtual void clearWasKeyPressed() {} virtual void clearWasKeyReleased() {} @@ -199,6 +278,12 @@ public: { m_receiver->joystick = &joystick; } + + virtual ~RealInputHandler() + { + m_receiver->joystick = nullptr; + } + virtual bool isKeyDown(GameKeyType k) { return m_receiver->IsKeyDown(keycache.key[k]) || joystick.isKeyDown(k); @@ -209,16 +294,58 @@ public: } virtual bool wasKeyPressed(GameKeyType k) { - return m_receiver->WasKeyPressed(keycache.key[k]) || joystick.wasKeyReleased(k); + return m_receiver->WasKeyPressed(keycache.key[k]) || joystick.wasKeyPressed(k); } virtual bool wasKeyReleased(GameKeyType k) { return m_receiver->WasKeyReleased(keycache.key[k]) || joystick.wasKeyReleased(k); } + + virtual float getMovementSpeed() + { + bool f = m_receiver->IsKeyDown(keycache.key[KeyType::FORWARD]), + b = m_receiver->IsKeyDown(keycache.key[KeyType::BACKWARD]), + l = m_receiver->IsKeyDown(keycache.key[KeyType::LEFT]), + r = m_receiver->IsKeyDown(keycache.key[KeyType::RIGHT]); + if (f || b || l || r) + { + // if contradictory keys pressed, stay still + if (f && b && l && r) + return 0.0f; + else if (f && b && !l && !r) + return 0.0f; + else if (!f && !b && l && r) + return 0.0f; + return 1.0f; // If there is a keyboard event, assume maximum speed + } + return joystick.getMovementSpeed(); + } + + virtual float getMovementDirection() + { + float x = 0, z = 0; + + /* Check keyboard for input */ + if (m_receiver->IsKeyDown(keycache.key[KeyType::FORWARD])) + z += 1; + if (m_receiver->IsKeyDown(keycache.key[KeyType::BACKWARD])) + z -= 1; + if (m_receiver->IsKeyDown(keycache.key[KeyType::RIGHT])) + x += 1; + if (m_receiver->IsKeyDown(keycache.key[KeyType::LEFT])) + x -= 1; + + if (x != 0 || z != 0) /* If there is a keyboard event, it takes priority */ + return atan2(x, z); + else + return joystick.getMovementDirection(); + } + virtual bool cancelPressed() { return wasKeyDown(KeyType::ESC) || m_receiver->WasKeyDown(CancelKey); } + virtual void clearWasKeyPressed() { m_receiver->clearWasKeyPressed(); @@ -227,17 +354,21 @@ public: { m_receiver->clearWasKeyReleased(); } + virtual void listenForKey(const KeyPress &keyCode) { m_receiver->listenForKey(keyCode); } - virtual void dontListenForKeys() { m_receiver->dontListenForKeys(); } + virtual void dontListenForKeys() + { + m_receiver->dontListenForKeys(); + } + virtual v2s32 getMousePos() { - if (RenderingEngine::get_raw_device()->getCursorControl()) { - return RenderingEngine::get_raw_device() - ->getCursorControl() - ->getPosition(); + auto control = RenderingEngine::get_raw_device()->getCursorControl(); + if (control) { + return control->getPosition(); } return m_mousepos; @@ -245,16 +376,18 @@ public: virtual void setMousePos(s32 x, s32 y) { - if (RenderingEngine::get_raw_device()->getCursorControl()) { - RenderingEngine::get_raw_device() - ->getCursorControl() - ->setPosition(x, y); + auto control = RenderingEngine::get_raw_device()->getCursorControl(); + if (control) { + control->setPosition(x, y); } else { m_mousepos = v2s32(x, y); } } - virtual s32 getMouseWheel() { return m_receiver->getMouseWheel(); } + virtual s32 getMouseWheel() + { + return m_receiver->getMouseWheel(); + } void clear() { @@ -277,11 +410,13 @@ public: return true; } - virtual bool isKeyDown(GameKeyType k) { return keydown.count(keycache.key[k]); } + virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; } virtual bool wasKeyDown(GameKeyType k) { return false; } virtual bool wasKeyPressed(GameKeyType k) { return false; } virtual bool wasKeyReleased(GameKeyType k) { return false; } virtual bool cancelPressed() { return false; } + virtual float getMovementSpeed() { return movementSpeed; } + virtual float getMovementDirection() { return movementDirection; } virtual v2s32 getMousePos() { return mousepos; } virtual void setMousePos(s32 x, s32 y) { mousepos = v2s32(x, y); } @@ -292,7 +427,9 @@ public: s32 Rand(s32 min, s32 max); private: - std::unordered_set<KeyPress> keydown; + KeyList keydown; v2s32 mousepos; v2s32 mousespeed; + float movementSpeed; + float movementDirection; }; diff --git a/src/client/joystick_controller.cpp b/src/client/joystick_controller.cpp index c29e8b639..9e58b9f62 100644 --- a/src/client/joystick_controller.cpp +++ b/src/client/joystick_controller.cpp @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gettime.h" #include "porting.h" #include "util/string.h" +#include "util/numeric.h" bool JoystickButtonCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const { @@ -37,7 +38,7 @@ bool JoystickAxisCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const { s16 ax_val = ev.Axis[axis_to_compare]; - return (ax_val * direction < 0) && (thresh * direction > ax_val * direction); + return (ax_val * direction < -thresh); } // spares many characters @@ -48,7 +49,7 @@ JoystickLayout create_default_layout() { JoystickLayout jlo; - jlo.axes_dead_border = 1024; + jlo.axes_deadzone = g_settings->getU16("joystick_deadzone"); const JoystickAxisLayout axes[JA_COUNT] = { {0, 1}, // JA_SIDEWARD_MOVE @@ -74,18 +75,18 @@ JoystickLayout create_default_layout() // Accessible without four modifier button pressed // regardless whether start is pressed or not - JLO_B_PB(KeyType::MOUSE_L, fb | 1 << 4, 1 << 4); - JLO_B_PB(KeyType::MOUSE_R, fb | 1 << 5, 1 << 5); + JLO_B_PB(KeyType::DIG, fb | 1 << 4, 1 << 4); + JLO_B_PB(KeyType::PLACE, fb | 1 << 5, 1 << 5); // Accessible without any modifier pressed JLO_B_PB(KeyType::JUMP, bm | 1 << 0, 1 << 0); - JLO_B_PB(KeyType::SPECIAL1, bm | 1 << 1, 1 << 1); + JLO_B_PB(KeyType::AUX1, bm | 1 << 1, 1 << 1); // Accessible with start button not pressed, but four pressed // TODO find usage for button 0 - JLO_B_PB(KeyType::DROP, bm | 1 << 1, fb | 1 << 1); - JLO_B_PB(KeyType::SCROLL_UP, bm | 1 << 4, fb | 1 << 4); - JLO_B_PB(KeyType::SCROLL_DOWN,bm | 1 << 5, fb | 1 << 5); + JLO_B_PB(KeyType::DROP, bm | 1 << 1, fb | 1 << 1); + JLO_B_PB(KeyType::HOTBAR_PREV, bm | 1 << 4, fb | 1 << 4); + JLO_B_PB(KeyType::HOTBAR_NEXT, bm | 1 << 5, fb | 1 << 5); // Accessible with start button and four pressed // TODO find usage for buttons 0, 1 and 4, 5 @@ -93,14 +94,14 @@ JoystickLayout create_default_layout() // Now about the buttons simulated by the axes // Movement buttons, important for vessels - JLO_A_PB(KeyType::FORWARD, 1, 1, 1024); - JLO_A_PB(KeyType::BACKWARD, 1, -1, 1024); - JLO_A_PB(KeyType::LEFT, 0, 1, 1024); - JLO_A_PB(KeyType::RIGHT, 0, -1, 1024); + JLO_A_PB(KeyType::FORWARD, 1, 1, jlo.axes_deadzone); + JLO_A_PB(KeyType::BACKWARD, 1, -1, jlo.axes_deadzone); + JLO_A_PB(KeyType::LEFT, 0, 1, jlo.axes_deadzone); + JLO_A_PB(KeyType::RIGHT, 0, -1, jlo.axes_deadzone); // Scroll buttons - JLO_A_PB(KeyType::SCROLL_UP, 2, -1, 1024); - JLO_A_PB(KeyType::SCROLL_DOWN, 5, -1, 1024); + JLO_A_PB(KeyType::HOTBAR_PREV, 2, -1, jlo.axes_deadzone); + JLO_A_PB(KeyType::HOTBAR_NEXT, 5, -1, jlo.axes_deadzone); return jlo; } @@ -109,7 +110,7 @@ JoystickLayout create_xbox_layout() { JoystickLayout jlo; - jlo.axes_dead_border = 7000; + jlo.axes_deadzone = 7000; const JoystickAxisLayout axes[JA_COUNT] = { {0, 1}, // JA_SIDEWARD_MOVE @@ -126,18 +127,18 @@ JoystickLayout create_xbox_layout() // 4 Buttons JLO_B_PB(KeyType::JUMP, 1 << 0, 1 << 0); // A/green JLO_B_PB(KeyType::ESC, 1 << 1, 1 << 1); // B/red - JLO_B_PB(KeyType::SPECIAL1, 1 << 2, 1 << 2); // X/blue + JLO_B_PB(KeyType::AUX1, 1 << 2, 1 << 2); // X/blue JLO_B_PB(KeyType::INVENTORY, 1 << 3, 1 << 3); // Y/yellow // Analog Sticks - JLO_B_PB(KeyType::SPECIAL1, 1 << 11, 1 << 11); // left + JLO_B_PB(KeyType::AUX1, 1 << 11, 1 << 11); // left JLO_B_PB(KeyType::SNEAK, 1 << 12, 1 << 12); // right // Triggers - JLO_B_PB(KeyType::MOUSE_L, 1 << 6, 1 << 6); // lt - JLO_B_PB(KeyType::MOUSE_R, 1 << 7, 1 << 7); // rt - JLO_B_PB(KeyType::SCROLL_UP, 1 << 4, 1 << 4); // lb - JLO_B_PB(KeyType::SCROLL_DOWN, 1 << 5, 1 << 5); // rb + JLO_B_PB(KeyType::DIG, 1 << 6, 1 << 6); // lt + JLO_B_PB(KeyType::PLACE, 1 << 7, 1 << 7); // rt + JLO_B_PB(KeyType::HOTBAR_PREV, 1 << 4, 1 << 4); // lb + JLO_B_PB(KeyType::HOTBAR_NEXT, 1 << 5, 1 << 5); // rb // D-PAD JLO_B_PB(KeyType::ZOOM, 1 << 15, 1 << 15); // up @@ -146,20 +147,69 @@ JoystickLayout create_xbox_layout() JLO_B_PB(KeyType::FREEMOVE, 1 << 16, 1 << 16); // down // Movement buttons, important for vessels - JLO_A_PB(KeyType::FORWARD, 1, 1, 1024); - JLO_A_PB(KeyType::BACKWARD, 1, -1, 1024); - JLO_A_PB(KeyType::LEFT, 0, 1, 1024); - JLO_A_PB(KeyType::RIGHT, 0, -1, 1024); + JLO_A_PB(KeyType::FORWARD, 1, 1, jlo.axes_deadzone); + JLO_A_PB(KeyType::BACKWARD, 1, -1, jlo.axes_deadzone); + JLO_A_PB(KeyType::LEFT, 0, 1, jlo.axes_deadzone); + JLO_A_PB(KeyType::RIGHT, 0, -1, jlo.axes_deadzone); return jlo; } -JoystickController::JoystickController() : - doubling_dtime(g_settings->getFloat("repeat_joystick_button_time")) +JoystickLayout create_dragonrise_gamecube_layout() { + JoystickLayout jlo; + + jlo.axes_deadzone = 7000; + + const JoystickAxisLayout axes[JA_COUNT] = { + // Control Stick + {0, 1}, // JA_SIDEWARD_MOVE + {1, 1}, // JA_FORWARD_MOVE + + // C-Stick + {3, 1}, // JA_FRUSTUM_HORIZONTAL + {4, 1}, // JA_FRUSTUM_VERTICAL + }; + memcpy(jlo.axes, axes, sizeof(jlo.axes)); + + // The center button + JLO_B_PB(KeyType::ESC, 1 << 9, 1 << 9); // Start/Pause Button + + // Front right buttons + JLO_B_PB(KeyType::JUMP, 1 << 2, 1 << 2); // A Button + JLO_B_PB(KeyType::SNEAK, 1 << 3, 1 << 3); // B Button + JLO_B_PB(KeyType::DROP, 1 << 0, 1 << 0); // Y Button + JLO_B_PB(KeyType::AUX1, 1 << 1, 1 << 1); // X Button + + // Triggers + JLO_B_PB(KeyType::DIG, 1 << 4, 1 << 4); // L Trigger + JLO_B_PB(KeyType::PLACE, 1 << 5, 1 << 5); // R Trigger + JLO_B_PB(KeyType::INVENTORY, 1 << 6, 1 << 6); // Z Button + + // D-Pad + JLO_A_PB(KeyType::HOTBAR_PREV, 5, 1, jlo.axes_deadzone); // left + JLO_A_PB(KeyType::HOTBAR_NEXT, 5, -1, jlo.axes_deadzone); // right + // Axis are hard to actuate independantly, best to leave up and down unused. + //JLO_A_PB(0, 6, 1, jlo.axes_deadzone); // up + //JLO_A_PB(0, 6, -1, jlo.axes_deadzone); // down + + // Movements tied to Control Stick, important for vessels + JLO_A_PB(KeyType::LEFT, 0, 1, jlo.axes_deadzone); + JLO_A_PB(KeyType::RIGHT, 0, -1, jlo.axes_deadzone); + JLO_A_PB(KeyType::FORWARD, 1, 1, jlo.axes_deadzone); + JLO_A_PB(KeyType::BACKWARD, 1, -1, jlo.axes_deadzone); + + return jlo; +} + + +JoystickController::JoystickController() +{ + doubling_dtime = std::max(g_settings->getFloat("repeat_joystick_button_time"), 0.001f); for (float &i : m_past_pressed_time) { i = 0; } + m_layout.axes_deadzone = 0; clear(); } @@ -168,25 +218,28 @@ void JoystickController::onJoystickConnect(const std::vector<irr::SJoystickInfo> s32 id = g_settings->getS32("joystick_id"); std::string layout = g_settings->get("joystick_type"); - if (id < 0 || (u16)id >= joystick_infos.size()) { + if (id < 0 || id >= (s32)joystick_infos.size()) { // TODO: auto detection id = 0; } - if (id >= 0 && (u16)id < joystick_infos.size()) { + if (id >= 0 && id < (s32)joystick_infos.size()) { if (layout.empty() || layout == "auto") setLayoutFromControllerName(joystick_infos[id].Name.c_str()); else setLayoutFromControllerName(layout); } - m_joystick_id = id; + // Irrlicht restriction. + m_joystick_id = rangelim(id, 0, UINT8_MAX); } void JoystickController::setLayoutFromControllerName(const std::string &name) { if (lowercase(name).find("xbox") != std::string::npos) { m_layout = create_xbox_layout(); + } else if (lowercase(name).find("dragonrise_gamecube") != std::string::npos) { + m_layout = create_dragonrise_gamecube_layout(); } else { m_layout = create_default_layout(); } @@ -219,16 +272,19 @@ bool JoystickController::handleEvent(const irr::SEvent::SJoystickEvent &ev) for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) { if (keys_pressed[i]) { - if (!m_past_pressed_keys[i] && + if (!m_past_keys_pressed[i] && m_past_pressed_time[i] < m_internal_time - doubling_dtime) { - m_past_pressed_keys[i] = true; + m_past_keys_pressed[i] = true; m_past_pressed_time[i] = m_internal_time; } - } else if (m_pressed_keys[i]) { - m_past_released_keys[i] = true; + } else if (m_keys_down[i]) { + m_keys_released[i] = true; } - m_pressed_keys[i] = keys_pressed[i]; + if (keys_pressed[i] && !(m_keys_down[i])) + m_keys_pressed[i] = true; + + m_keys_down[i] = keys_pressed[i]; } for (size_t i = 0; i < JA_COUNT; i++) { @@ -236,23 +292,39 @@ bool JoystickController::handleEvent(const irr::SEvent::SJoystickEvent &ev) m_axes_vals[i] = ax_la.invert * ev.Axis[ax_la.axis_id]; } - return true; } void JoystickController::clear() { - m_pressed_keys.reset(); - m_past_pressed_keys.reset(); - m_past_released_keys.reset(); + m_keys_pressed.reset(); + m_keys_down.reset(); + m_past_keys_pressed.reset(); + m_keys_released.reset(); memset(m_axes_vals, 0, sizeof(m_axes_vals)); } -s16 JoystickController::getAxisWithoutDead(JoystickAxis axis) +float JoystickController::getAxisWithoutDead(JoystickAxis axis) { s16 v = m_axes_vals[axis]; - if (((v > 0) && (v < m_layout.axes_dead_border)) || - ((v < 0) && (v > -m_layout.axes_dead_border))) - return 0; - return v; + + if (abs(v) < m_layout.axes_deadzone) + return 0.0f; + + v += (v < 0 ? m_layout.axes_deadzone : -m_layout.axes_deadzone); + + return (float)v / ((float)(INT16_MAX - m_layout.axes_deadzone)); +} + +float JoystickController::getMovementDirection() +{ + return atan2(getAxisWithoutDead(JA_SIDEWARD_MOVE), -getAxisWithoutDead(JA_FORWARD_MOVE)); +} + +float JoystickController::getMovementSpeed() +{ + float speed = sqrt(pow(getAxisWithoutDead(JA_FORWARD_MOVE), 2) + pow(getAxisWithoutDead(JA_SIDEWARD_MOVE), 2)); + if (speed > 1.0f) + speed = 1.0f; + return speed; } diff --git a/src/client/joystick_controller.h b/src/client/joystick_controller.h index 7baacd81b..cbc60886c 100644 --- a/src/client/joystick_controller.h +++ b/src/client/joystick_controller.h @@ -96,7 +96,7 @@ struct JoystickLayout { std::vector<JoystickButtonCmb> button_keys; std::vector<JoystickAxisCmb> axis_keys; JoystickAxisLayout axes[JA_COUNT]; - s16 axes_dead_border; + s16 axes_deadzone; }; class JoystickController { @@ -111,37 +111,32 @@ public: bool wasKeyDown(GameKeyType b) { - bool r = m_past_pressed_keys[b]; - m_past_pressed_keys[b] = false; + bool r = m_past_keys_pressed[b]; + m_past_keys_pressed[b] = false; return r; } - bool getWasKeyDown(GameKeyType b) - { - return m_past_pressed_keys[b]; - } - void clearWasKeyDown(GameKeyType b) - { - m_past_pressed_keys[b] = false; - } bool wasKeyReleased(GameKeyType b) { - bool r = m_past_released_keys[b]; - m_past_released_keys[b] = false; - return r; - } - bool getWasKeyReleased(GameKeyType b) - { - return m_past_pressed_keys[b]; + return m_keys_released[b]; } void clearWasKeyReleased(GameKeyType b) { - m_past_pressed_keys[b] = false; + m_keys_released[b] = false; + } + + bool wasKeyPressed(GameKeyType b) + { + return m_keys_pressed[b]; + } + void clearWasKeyPressed(GameKeyType b) + { + m_keys_pressed[b] = false; } bool isKeyDown(GameKeyType b) { - return m_pressed_keys[b]; + return m_keys_down[b]; } s16 getAxis(JoystickAxis axis) @@ -149,7 +144,10 @@ public: return m_axes_vals[axis]; } - s16 getAxisWithoutDead(JoystickAxis axis); + float getAxisWithoutDead(JoystickAxis axis); + + float getMovementDirection(); + float getMovementSpeed(); f32 doubling_dtime; @@ -162,12 +160,13 @@ private: u8 m_joystick_id = 0; - std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_pressed_keys; + std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_keys_down; + std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_keys_pressed; f32 m_internal_time; f32 m_past_pressed_time[KeyType::INTERNAL_ENUM_COUNT]; - std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_pressed_keys; - std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_released_keys; + std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_keys_pressed; + std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_keys_released; }; diff --git a/src/client/keycode.cpp b/src/client/keycode.cpp index 6a0e9f569..fac077f0f 100644 --- a/src/client/keycode.cpp +++ b/src/client/keycode.cpp @@ -197,7 +197,6 @@ static const struct table_key table[] = { DEFINEKEY1(KEY_MODECHANGE, N_("IME Mode Change")) DEFINEKEY1(KEY_APPS, N_("Apps")) DEFINEKEY1(KEY_SLEEP, N_("Sleep")) -#if !(IRRLICHT_VERSION_MAJOR <= 1 && IRRLICHT_VERSION_MINOR <= 7 && IRRLICHT_VERSION_REVISION < 3) DEFINEKEY1(KEY_OEM_1, "OEM 1") // KEY_OEM_[0-9] and KEY_OEM_102 are assigned to multiple DEFINEKEY1(KEY_OEM_2, "OEM 2") // different chars (on different platforms too) and thus w/o char DEFINEKEY1(KEY_OEM_3, "OEM 3") @@ -208,7 +207,6 @@ static const struct table_key table[] = { DEFINEKEY1(KEY_OEM_8, "OEM 8") DEFINEKEY1(KEY_OEM_AX, "OEM AX") DEFINEKEY1(KEY_OEM_102, "OEM 102") -#endif DEFINEKEY1(KEY_ATTN, "Attn") DEFINEKEY1(KEY_CRSEL, "CrSel") DEFINEKEY1(KEY_EXSEL, "ExSel") @@ -316,7 +314,8 @@ KeyPress::KeyPress(const char *name) int chars_read = mbtowc(&Char, name, 1); FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character"); m_name = ""; - warningstream << "KeyPress: Unknown key '" << name << "', falling back to first char."; + warningstream << "KeyPress: Unknown key '" << name + << "', falling back to first char." << std::endl; } KeyPress::KeyPress(const irr::SEvent::SKeyInput &in, bool prefer_character) diff --git a/src/client/keycode.h b/src/client/keycode.h index 263b722c7..7036705d1 100644 --- a/src/client/keycode.h +++ b/src/client/keycode.h @@ -24,20 +24,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <IEventReceiver.h> #include <string> -class KeyPress; -namespace std -{ - template <> struct hash<KeyPress>; -} - /* A key press, consisting of either an Irrlicht keycode or an actual char */ class KeyPress { public: - friend struct std::hash<KeyPress>; - KeyPress() = default; KeyPress(const char *name); @@ -63,17 +55,6 @@ protected: std::string m_name = ""; }; -namespace std -{ - template <> struct hash<KeyPress> - { - size_t operator()(const KeyPress &key) const - { - return key.Key; - } - }; -} - extern const KeyPress EscapeKey; extern const KeyPress CancelKey; diff --git a/src/client/keys.h b/src/client/keys.h index b6ce59b4a..e120a2d92 100644 --- a/src/client/keys.h +++ b/src/client/keys.h @@ -32,7 +32,7 @@ public: LEFT, RIGHT, JUMP, - SPECIAL1, + AUX1, SNEAK, AUTOFORWARD, DIG, @@ -59,6 +59,7 @@ public: DEC_VOLUME, CINEMATIC, SCREENSHOT, + TOGGLE_BLOCK_BOUNDS, TOGGLE_HUD, TOGGLE_CHAT, TOGGLE_FOG, @@ -110,12 +111,6 @@ public: SLOT_31, SLOT_32, - // joystick specific keys - MOUSE_L, - MOUSE_R, - SCROLL_UP, - SCROLL_DOWN, - // Fake keycode for array size and internal checks INTERNAL_ENUM_COUNT diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index f3eb1a2dd..648a88642 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -117,7 +117,7 @@ bool LocalPlayer::updateSneakNode(Map *map, const v3f &position, continue; // And the node(s) above have to be nonwalkable bool ok = true; - if (!physics_override_sneak_glitch) { + if (!physics_override.sneak_glitch) { u16 height = ceilf((m_collisionbox.MaxEdge.Y - m_collisionbox.MinEdge.Y) / BS); for (u16 y = 1; y <= height; y++) { @@ -149,7 +149,7 @@ bool LocalPlayer::updateSneakNode(Map *map, const v3f &position, node.getCollisionBoxes(nodemgr, &nodeboxes); m_sneak_node_bb_top = getNodeBoundingBox(nodeboxes); - if (physics_override_sneak_glitch) { + if (physics_override.sneak_glitch) { // Detect sneak ladder: // Node two meters above sneak node must be solid node = map->getNode(m_sneak_node + v3s16(0, 2, 0), @@ -173,7 +173,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, m_standing_node = floatToInt(m_position, BS); // Temporary option for old move code - if (!physics_override_new_move) { + if (!physics_override.new_move) { old_move(dtime, env, pos_max_d, collision_info); return; } @@ -227,8 +227,9 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, pp = floatToInt(position + v3f(0.0f, BS * 0.1f, 0.0f), BS); node = map->getNode(pp, &is_valid_position); if (is_valid_position) { - in_liquid = nodemgr->get(node.getContent()).isLiquid(); - liquid_viscosity = nodemgr->get(node.getContent()).liquid_viscosity; + const ContentFeatures &cf = nodemgr->get(node.getContent()); + in_liquid = cf.liquid_move_physics; + move_resistance = cf.move_resistance; } else { in_liquid = false; } @@ -238,8 +239,9 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, pp = floatToInt(position + v3f(0.0f, BS * 0.5f, 0.0f), BS); node = map->getNode(pp, &is_valid_position); if (is_valid_position) { - in_liquid = nodemgr->get(node.getContent()).isLiquid(); - liquid_viscosity = nodemgr->get(node.getContent()).liquid_viscosity; + const ContentFeatures &cf = nodemgr->get(node.getContent()); + in_liquid = cf.liquid_move_physics; + move_resistance = cf.move_resistance; } else { in_liquid = false; } @@ -252,7 +254,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, pp = floatToInt(position + v3f(0.0f), BS); node = map->getNode(pp, &is_valid_position); if (is_valid_position) { - in_liquid_stable = nodemgr->get(node.getContent()).isLiquid(); + in_liquid_stable = nodemgr->get(node.getContent()).liquid_move_physics; } else { in_liquid_stable = false; } @@ -299,7 +301,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, &position, &m_speed, accel_f); bool could_sneak = control.sneak && !free_move && !in_liquid && - !is_climbing && physics_override_sneak; + !is_climbing && physics_override.sneak; // Add new collisions to the vector if (collision_info && !free_move) { @@ -374,7 +376,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, } if (y_diff > 0 && m_speed.Y <= 0.0f && - (physics_override_sneak_glitch || y_diff < BS * 0.6f)) { + (physics_override.sneak_glitch || y_diff < BS * 0.6f)) { // Move player to the maximal height when falling or when // the ledge is climbed on the next step. @@ -424,16 +426,6 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, camera_impact = getSpeed().Y * -1; } - { - camera_barely_in_ceiling = false; - v3s16 camera_np = floatToInt(getEyePosition(), BS); - MapNode n = map->getNode(camera_np); - if (n.getContent() != CONTENT_IGNORE) { - if (nodemgr->get(n).walkable && nodemgr->get(n).solidness == 2) - camera_barely_in_ceiling = true; - } - } - /* Check properties of the node on which the player is standing */ @@ -448,7 +440,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, // Jump key pressed while jumping off from a bouncy block if (m_can_jump && control.jump && itemgroup_get(f.groups, "bouncy") && m_speed.Y >= -0.5f * BS) { - float jumpspeed = movement_speed_jump * physics_override_jump; + float jumpspeed = movement_speed_jump * physics_override.jump; if (m_speed.Y > 1.0f) { // Reduce boost when speed already is high m_speed.Y += jumpspeed / (1.0f + (m_speed.Y / 16.0f)); @@ -566,23 +558,7 @@ void LocalPlayer::applyControl(float dtime, Environment *env) } } - if (control.up) - speedH += v3f(0.0f, 0.0f, 1.0f); - - if (control.down) - speedH -= v3f(0.0f, 0.0f, 1.0f); - - if (!control.up && !control.down) - speedH -= v3f(0.0f, 0.0f, 1.0f) * (control.forw_move_joystick_axis / 32767.f); - - if (control.left) - speedH += v3f(-1.0f, 0.0f, 0.0f); - - if (control.right) - speedH += v3f(1.0f, 0.0f, 0.0f); - - if (!control.left && !control.right) - speedH += v3f(1.0f, 0.0f, 0.0f) * (control.sidew_move_joystick_axis / 32767.f); + speedH = v3f(sin(control.movement_direction), 0.0f, cos(control.movement_direction)); if (m_autojump) { // release autojump after a given time @@ -612,7 +588,7 @@ void LocalPlayer::applyControl(float dtime, Environment *env) */ v3f speedJ = getSpeed(); if (speedJ.Y >= -0.5f * BS) { - speedJ.Y = movement_speed_jump * physics_override_jump; + speedJ.Y = movement_speed_jump * physics_override.jump; setSpeed(speedJ); m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::PLAYER_JUMP)); } @@ -639,6 +615,8 @@ void LocalPlayer::applyControl(float dtime, Environment *env) else speedH = speedH.normalize() * movement_speed_walk; + speedH *= control.movement_speed; /* Apply analog input */ + // Acceleration increase f32 incH = 0.0f; // Horizontal (X, Z) f32 incV = 0.0f; // Vertical (Y) @@ -669,8 +647,8 @@ void LocalPlayer::applyControl(float dtime, Environment *env) } // Accelerate to target speed with maximum increment - accelerate((speedH + speedV) * physics_override_speed, - incH * physics_override_speed * slip_factor, incV * physics_override_speed, + accelerate((speedH + speedV) * physics_override.speed, + incH * physics_override.speed * slip_factor, incV * physics_override.speed, pitch_move); } @@ -684,19 +662,21 @@ v3s16 LocalPlayer::getStandingNodePos() v3s16 LocalPlayer::getFootstepNodePos() { + v3f feet_pos = getPosition() + v3f(0.0f, m_collisionbox.MinEdge.Y, 0.0f); + // Emit swimming sound if the player is in liquid if (in_liquid_stable) - return floatToInt(getPosition(), BS); + return floatToInt(feet_pos, BS); // BS * 0.05 below the player's feet ensures a 1/16th height // nodebox is detected instead of the node below it. if (touching_ground) - return floatToInt(getPosition() - v3f(0.0f, BS * 0.05f, 0.0f), BS); + return floatToInt(feet_pos - v3f(0.0f, BS * 0.05f, 0.0f), BS); // A larger distance below is necessary for a footstep sound // when landing after a jump or fall. BS * 0.5 ensures water // sounds when swimming in 1 node deep water. - return floatToInt(getPosition() - v3f(0.0f, BS * 0.5f, 0.0f), BS); + return floatToInt(feet_pos - v3f(0.0f, BS * 0.5f, 0.0f), BS); } v3s16 LocalPlayer::getLightPosition() const @@ -706,8 +686,7 @@ v3s16 LocalPlayer::getLightPosition() const v3f LocalPlayer::getEyeOffset() const { - float eye_height = camera_barely_in_ceiling ? m_eye_height - 0.125f : m_eye_height; - return v3f(0.0f, BS * eye_height, 0.0f); + return v3f(0.0f, BS * m_eye_height, 0.0f); } ClientActiveObject *LocalPlayer::getParent() const @@ -814,8 +793,9 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, pp = floatToInt(position + v3f(0.0f, BS * 0.1f, 0.0f), BS); node = map->getNode(pp, &is_valid_position); if (is_valid_position) { - in_liquid = nodemgr->get(node.getContent()).isLiquid(); - liquid_viscosity = nodemgr->get(node.getContent()).liquid_viscosity; + const ContentFeatures &cf = nodemgr->get(node.getContent()); + in_liquid = cf.liquid_move_physics; + move_resistance = cf.move_resistance; } else { in_liquid = false; } @@ -824,8 +804,9 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, pp = floatToInt(position + v3f(0.0f, BS * 0.5f, 0.0f), BS); node = map->getNode(pp, &is_valid_position); if (is_valid_position) { - in_liquid = nodemgr->get(node.getContent()).isLiquid(); - liquid_viscosity = nodemgr->get(node.getContent()).liquid_viscosity; + const ContentFeatures &cf = nodemgr->get(node.getContent()); + in_liquid = cf.liquid_move_physics; + move_resistance = cf.move_resistance; } else { in_liquid = false; } @@ -837,7 +818,7 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, pp = floatToInt(position + v3f(0.0f), BS); node = map->getNode(pp, &is_valid_position); if (is_valid_position) - in_liquid_stable = nodemgr->get(node.getContent()).isLiquid(); + in_liquid_stable = nodemgr->get(node.getContent()).liquid_move_physics; else in_liquid_stable = false; @@ -874,7 +855,7 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, */ if (control.sneak && m_sneak_node_exists && !(fly_allowed && player_settings.free_move) && !in_liquid && - physics_override_sneak) { + physics_override.sneak) { f32 maxd = 0.5f * BS + sneak_max; v3f lwn_f = intToFloat(m_sneak_node, BS); position.X = rangelim(position.X, lwn_f.X - maxd, lwn_f.X + maxd); @@ -945,7 +926,7 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, m_need_to_get_new_sneak_node = true; } - if (m_need_to_get_new_sneak_node && physics_override_sneak) { + if (m_need_to_get_new_sneak_node && physics_override.sneak) { m_sneak_node_bb_ymax = 0.0f; v3s16 pos_i_bottom = floatToInt(position - v3f(0.0f, position_y_mod, 0.0f), BS); v2f player_p2df(position.X, position.Z); @@ -975,7 +956,7 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, if (!is_valid_position || nodemgr->get(node).walkable) continue; // If not 'sneak_glitch' the node 2 nodes above it has to be nonwalkable - if (!physics_override_sneak_glitch) { + if (!physics_override.sneak_glitch) { node = map->getNode(p + v3s16(0, 2, 0), &is_valid_position); if (!is_valid_position || nodemgr->get(node).walkable) continue; @@ -1033,16 +1014,6 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, camera_impact = getSpeed().Y * -1.0f; } - { - camera_barely_in_ceiling = false; - v3s16 camera_np = floatToInt(getEyePosition(), BS); - MapNode n = map->getNode(camera_np); - if (n.getContent() != CONTENT_IGNORE) { - if (nodemgr->get(n).walkable && nodemgr->get(n).solidness == 2) - camera_barely_in_ceiling = true; - } - } - /* Update the node last under the player */ @@ -1061,7 +1032,7 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, // Jump key pressed while jumping off from a bouncy block if (m_can_jump && control.jump && itemgroup_get(f.groups, "bouncy") && m_speed.Y >= -0.5f * BS) { - float jumpspeed = movement_speed_jump * physics_override_jump; + float jumpspeed = movement_speed_jump * physics_override.jump; if (m_speed.Y > 1.0f) { // Reduce boost when speed already is high m_speed.Y += jumpspeed / (1.0f + (m_speed.Y / 16.0f)); @@ -1106,12 +1077,8 @@ void LocalPlayer::handleAutojump(f32 dtime, Environment *env, if (m_autojump) return; - bool control_forward = control.up || - (!control.up && !control.down && - control.forw_move_joystick_axis < -0.05f); - bool could_autojump = - m_can_jump && !control.jump && !control.sneak && control_forward; + m_can_jump && !control.jump && !control.sneak && control.isMoving(); if (!could_autojump) return; diff --git a/src/client/localplayer.h b/src/client/localplayer.h index 345aec9d9..83ad3d1d3 100644 --- a/src/client/localplayer.h +++ b/src/client/localplayer.h @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "environment.h" #include "constants.h" #include "settings.h" +#include "lighting.h" #include <list> class Client; @@ -55,20 +56,12 @@ public: bool in_liquid = false; // This is more stable and defines the maximum speed of the player bool in_liquid_stable = false; - // Gets the viscosity of water to calculate friction - u8 liquid_viscosity = 0; + // Slows down the player when moving through + u8 move_resistance = 0; bool is_climbing = false; bool swimming_vertical = false; bool swimming_pitch = false; - float physics_override_speed = 1.0f; - float physics_override_jump = 1.0f; - float physics_override_gravity = 1.0f; - bool physics_override_sneak = true; - bool physics_override_sneak_glitch = false; - // Temporary option for old move code - bool physics_override_new_move = true; - void move(f32 dtime, Environment *env, f32 pos_max_d); void move(f32 dtime, Environment *env, f32 pos_max_d, std::vector<CollisionInfo> *collision_info); @@ -86,7 +79,7 @@ public: v3f last_speed; float last_pitch = 0.0f; float last_yaw = 0.0f; - unsigned int last_keyPressed = 0; + u32 last_keyPressed = 0; u8 last_camera_fov = 0; u8 last_wanted_range = 0; @@ -158,6 +151,8 @@ public: added_velocity += vel; } + inline Lighting& getLighting() { return m_lighting; } + private: void accelerate(const v3f &target_speed, const f32 max_increase_H, const f32 max_increase_V, const bool use_pitch); @@ -196,7 +191,6 @@ private: u16 m_breath = PLAYER_MAX_BREATH_DEFAULT; f32 m_yaw = 0.0f; f32 m_pitch = 0.0f; - bool camera_barely_in_ceiling = false; aabb3f m_collisionbox = aabb3f(-BS * 0.30f, 0.0f, -BS * 0.30f, BS * 0.30f, BS * 1.75f, BS * 0.30f); float m_eye_height = 1.625f; @@ -209,4 +203,5 @@ private: GenericCAO *m_cao = nullptr; Client *m_client; + Lighting m_lighting; }; diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 2f96ca61f..c730b9bf9 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -30,16 +30,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/meshgen/collector.h" #include "client/renderingengine.h" #include <array> +#include <algorithm> /* MeshMakeData */ -MeshMakeData::MeshMakeData(Client *client, bool use_shaders, - bool use_tangent_vertices): +MeshMakeData::MeshMakeData(Client *client, bool use_shaders): m_client(client), - m_use_shaders(use_shaders), - m_use_tangent_vertices(use_tangent_vertices) + m_use_shaders(use_shaders) {} void MeshMakeData::fillBlockDataBegin(const v3s16 &blockpos) @@ -81,33 +80,6 @@ void MeshMakeData::fill(MapBlock *block) } } -void MeshMakeData::fillSingleNode(MapNode *node) -{ - m_blockpos = v3s16(0,0,0); - - v3s16 blockpos_nodes = v3s16(0,0,0); - VoxelArea area(blockpos_nodes-v3s16(1,1,1)*MAP_BLOCKSIZE, - blockpos_nodes+v3s16(1,1,1)*MAP_BLOCKSIZE*2-v3s16(1,1,1)); - s32 volume = area.getVolume(); - s32 our_node_index = area.index(1,1,1); - - // Allocate this block + neighbors - m_vmanip.clear(); - m_vmanip.addArea(area); - - // Fill in data - MapNode *data = new MapNode[volume]; - for(s32 i = 0; i < volume; i++) - { - if (i == our_node_index) - data[i] = *node; - else - data[i] = MapNode(CONTENT_AIR, LIGHT_MAX, 0); - } - m_vmanip.copyFrom(data, area, area.MinEdge, area.MinEdge, area.getExtent()); - delete[] data; -} - void MeshMakeData::setCrack(int crack_level, v3s16 crack_pos) { if (crack_level >= 0) @@ -421,7 +393,9 @@ static void getNodeVertexDirs(const v3s16 &dir, v3s16 *vertex_dirs) #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push +#if __GNUC__ > 7 #pragma GCC diagnostic ignored "-Wclass-memaccess" +#endif #endif memcpy(vertex_dirs, &vertex_dirs_table[idx], 4 * sizeof(v3s16)); #if defined(__GNUC__) && !defined(__clang__) @@ -431,26 +405,26 @@ static void getNodeVertexDirs(const v3s16 &dir, v3s16 *vertex_dirs) static void getNodeTextureCoords(v3f base, const v3f &scale, const v3s16 &dir, float *u, float *v) { - if (dir.X > 0 || dir.Y > 0 || dir.Z < 0) + if (dir.X > 0 || dir.Y != 0 || dir.Z < 0) base -= scale; if (dir == v3s16(0,0,1)) { - *u = -base.X - 1; - *v = -base.Y - 1; + *u = -base.X; + *v = -base.Y; } else if (dir == v3s16(0,0,-1)) { *u = base.X + 1; - *v = -base.Y - 2; + *v = -base.Y - 1; } else if (dir == v3s16(1,0,0)) { *u = base.Z + 1; - *v = -base.Y - 2; - } else if (dir == v3s16(-1,0,0)) { - *u = -base.Z - 1; *v = -base.Y - 1; + } else if (dir == v3s16(-1,0,0)) { + *u = -base.Z; + *v = -base.Y; } else if (dir == v3s16(0,1,0)) { *u = base.X + 1; - *v = -base.Z - 2; + *v = -base.Z - 1; } else if (dir == v3s16(0,-1,0)) { - *u = base.X; - *v = base.Z; + *u = base.X + 1; + *v = base.Z + 1; } } @@ -887,6 +861,9 @@ static void updateFastFaceRow( g_settings->getBool("enable_shaders") && g_settings->getBool("enable_waving_water"); + static thread_local const bool force_not_tiling = + g_settings->getBool("enable_dynamic_shadows"); + v3s16 p = startpos; u16 continuous_tiles_count = 1; @@ -925,7 +902,8 @@ static void updateFastFaceRow( waving, next_tile); - if (next_makes_face == makes_face + if (!force_not_tiling + && next_makes_face == makes_face && next_p_corrected == p_corrected + translate_dir && next_face_dir_corrected == face_dir_corrected && memcmp(next_lights, lights, sizeof(lights)) == 0 @@ -1026,6 +1004,179 @@ static void applyTileColor(PreMeshBuffer &pmb) } } +/* + MapBlockBspTree +*/ + +void MapBlockBspTree::buildTree(const std::vector<MeshTriangle> *triangles) +{ + this->triangles = triangles; + + nodes.clear(); + + // assert that triangle index can fit into s32 + assert(triangles->size() <= 0x7FFFFFFFL); + std::vector<s32> indexes; + indexes.reserve(triangles->size()); + for (u32 i = 0; i < triangles->size(); i++) + indexes.push_back(i); + + if (!indexes.empty()) { + // Start in the center of the block with increment of one quarter in each direction + root = buildTree(v3f(1, 0, 0), v3f((MAP_BLOCKSIZE + 1) * 0.5f * BS), MAP_BLOCKSIZE * 0.25f * BS, indexes, 0); + } else { + root = -1; + } +} + +/** + * @brief Find a candidate plane to split a set of triangles in two + * + * The candidate plane is represented by one of the triangles from the set. + * + * @param list Vector of indexes of the triangles in the set + * @param triangles Vector of all triangles in the BSP tree + * @return Address of the triangle that represents the proposed split plane + */ +static const MeshTriangle *findSplitCandidate(const std::vector<s32> &list, const std::vector<MeshTriangle> &triangles) +{ + // find the center of the cluster. + v3f center(0, 0, 0); + size_t n = list.size(); + for (s32 i : list) { + center += triangles[i].centroid / n; + } + + // find the triangle with the largest area and closest to the center + const MeshTriangle *candidate_triangle = &triangles[list[0]]; + const MeshTriangle *ith_triangle; + for (s32 i : list) { + ith_triangle = &triangles[i]; + if (ith_triangle->areaSQ > candidate_triangle->areaSQ || + (ith_triangle->areaSQ == candidate_triangle->areaSQ && + ith_triangle->centroid.getDistanceFromSQ(center) < candidate_triangle->centroid.getDistanceFromSQ(center))) { + candidate_triangle = ith_triangle; + } + } + return candidate_triangle; +} + +s32 MapBlockBspTree::buildTree(v3f normal, v3f origin, float delta, const std::vector<s32> &list, u32 depth) +{ + // if the list is empty, don't bother + if (list.empty()) + return -1; + + // if there is only one triangle, or the delta is insanely small, this is a leaf node + if (list.size() == 1 || delta < 0.01) { + nodes.emplace_back(normal, origin, list, -1, -1); + return nodes.size() - 1; + } + + std::vector<s32> front_list; + std::vector<s32> back_list; + std::vector<s32> node_list; + + // split the list + for (s32 i : list) { + const MeshTriangle &triangle = (*triangles)[i]; + float factor = normal.dotProduct(triangle.centroid - origin); + if (factor == 0) + node_list.push_back(i); + else if (factor > 0) + front_list.push_back(i); + else + back_list.push_back(i); + } + + // define the new split-plane + v3f candidate_normal(normal.Z, normal.X, normal.Y); + float candidate_delta = delta; + if (depth % 3 == 2) + candidate_delta /= 2; + + s32 front_index = -1; + s32 back_index = -1; + + if (!front_list.empty()) { + v3f next_normal = candidate_normal; + v3f next_origin = origin + delta * normal; + float next_delta = candidate_delta; + if (next_delta < 5) { + const MeshTriangle *candidate = findSplitCandidate(front_list, *triangles); + next_normal = candidate->getNormal(); + next_origin = candidate->centroid; + } + front_index = buildTree(next_normal, next_origin, next_delta, front_list, depth + 1); + + // if there are no other triangles, don't create a new node + if (back_list.empty() && node_list.empty()) + return front_index; + } + + if (!back_list.empty()) { + v3f next_normal = candidate_normal; + v3f next_origin = origin - delta * normal; + float next_delta = candidate_delta; + if (next_delta < 5) { + const MeshTriangle *candidate = findSplitCandidate(back_list, *triangles); + next_normal = candidate->getNormal(); + next_origin = candidate->centroid; + } + + back_index = buildTree(next_normal, next_origin, next_delta, back_list, depth + 1); + + // if there are no other triangles, don't create a new node + if (front_list.empty() && node_list.empty()) + return back_index; + } + + nodes.emplace_back(normal, origin, node_list, front_index, back_index); + + return nodes.size() - 1; +} + +void MapBlockBspTree::traverse(s32 node, v3f viewpoint, std::vector<s32> &output) const +{ + if (node < 0) return; // recursion break; + + const TreeNode &n = nodes[node]; + float factor = n.normal.dotProduct(viewpoint - n.origin); + + if (factor > 0) + traverse(n.back_ref, viewpoint, output); + else + traverse(n.front_ref, viewpoint, output); + + if (factor != 0) + for (s32 i : n.triangle_refs) + output.push_back(i); + + if (factor > 0) + traverse(n.front_ref, viewpoint, output); + else + traverse(n.back_ref, viewpoint, output); +} + + + +/* + PartialMeshBuffer +*/ + +void PartialMeshBuffer::beforeDraw() const +{ + // Patch the indexes in the mesh buffer before draw + m_buffer->Indices = std::move(m_vertex_indexes); + m_buffer->setDirty(scene::EBT_INDEX); +} + +void PartialMeshBuffer::afterDraw() const +{ + // Take the data back + m_vertex_indexes = m_buffer->Indices.steal(); +} + /* MapBlockMesh */ @@ -1041,10 +1192,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): for (auto &m : m_mesh) m = new scene::SMesh(); m_enable_shaders = data->m_use_shaders; - m_use_tangent_vertices = data->m_use_tangent_vertices; m_enable_vbo = g_settings->getBool("enable_vbo"); - if (g_settings->getBool("enable_minimap")) { + if (data->m_client->getMinimap()) { m_minimap_mapblock = new MinimapMapblock; m_minimap_mapblock->getMinimapNodes( &data->m_vmanip, data->m_blockpos * MAP_BLOCKSIZE); @@ -1100,14 +1250,17 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): */ { - MapblockMeshGenerator generator(data, &collector); - generator.generate(); + MapblockMeshGenerator(data, &collector, + data->m_client->getSceneManager()->getMeshManipulator()).generate(); } /* Convert MeshCollector to SMesh */ + const bool desync_animations = g_settings->getBool( + "desynchronize_mapblock_texture_animation"); + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { for(u32 i = 0; i < collector.prebuffers[layer].size(); i++) { @@ -1137,18 +1290,18 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): // - Texture animation if (p.layer.material_flags & MATERIAL_FLAG_ANIMATION) { // Add to MapBlockMesh in order to animate these tiles - m_animation_tiles[std::pair<u8, u32>(layer, i)] = p.layer; - m_animation_frames[std::pair<u8, u32>(layer, i)] = 0; - if (g_settings->getBool( - "desynchronize_mapblock_texture_animation")) { + auto &info = m_animation_info[{layer, i}]; + info.tile = p.layer; + info.frame = 0; + if (desync_animations) { // Get starting position from noise - m_animation_frame_offsets[std::pair<u8, u32>(layer, i)] = + info.frame_offset = 100000 * (2.0 + noise3d( data->m_blockpos.X, data->m_blockpos.Y, data->m_blockpos.Z, 0)); } else { // Play all synchronized - m_animation_frame_offsets[std::pair<u8, u32>(layer, i)] = 0; + info.frame_offset = 0; } // Replace tile texture with the first animation frame p.layer.texture = (*p.layer.frames)[0].texture; @@ -1159,19 +1312,23 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): // Dummy sunlight to handle non-sunlit areas video::SColorf sunlight; get_sunlight_color(&sunlight, 0); - u32 vertex_count = p.vertices.size(); + + std::map<u32, video::SColor> colors; + const u32 vertex_count = p.vertices.size(); for (u32 j = 0; j < vertex_count; j++) { video::SColor *vc = &p.vertices[j].Color; video::SColor copy = *vc; if (vc->getAlpha() == 0) // No sunlight - no need to animate final_color_blend(vc, copy, sunlight); // Finalize color else // Record color to animate - m_daynight_diffs[std::pair<u8, u32>(layer, i)][j] = copy; + colors[j] = copy; // The sunlight ratio has been stored, // delete alpha (for the final rendering). vc->setAlpha(255); } + if (!colors.empty()) + m_daynight_diffs[{layer, i}] = std::move(colors); } // Create material @@ -1195,51 +1352,30 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): scene::SMesh *mesh = (scene::SMesh *)m_mesh[layer]; - // Create meshbuffer, add to mesh - if (m_use_tangent_vertices) { - scene::SMeshBufferTangents *buf = - new scene::SMeshBufferTangents(); - buf->Material = material; - buf->Vertices.reallocate(p.vertices.size()); - buf->Indices.reallocate(p.indices.size()); - for (const video::S3DVertex &v: p.vertices) - buf->Vertices.push_back(video::S3DVertexTangents(v.Pos, v.Color, v.TCoords)); - for (u16 i: p.indices) - buf->Indices.push_back(i); - buf->recalculateBoundingBox(); - mesh->addMeshBuffer(buf); - buf->drop(); + scene::SMeshBuffer *buf = new scene::SMeshBuffer(); + buf->Material = material; + if (p.layer.isTransparent()) { + buf->append(&p.vertices[0], p.vertices.size(), nullptr, 0); + + MeshTriangle t; + t.buffer = buf; + m_transparent_triangles.reserve(p.indices.size() / 3); + for (u32 i = 0; i < p.indices.size(); i += 3) { + t.p1 = p.indices[i]; + t.p2 = p.indices[i + 1]; + t.p3 = p.indices[i + 2]; + t.updateAttributes(); + m_transparent_triangles.push_back(t); + } } else { - scene::SMeshBuffer *buf = new scene::SMeshBuffer(); - buf->Material = material; buf->append(&p.vertices[0], p.vertices.size(), &p.indices[0], p.indices.size()); - mesh->addMeshBuffer(buf); - buf->drop(); } - } - - /* - Do some stuff to the mesh - */ - m_camera_offset = camera_offset; - translateMesh(m_mesh[layer], - intToFloat(data->m_blockpos * MAP_BLOCKSIZE - camera_offset, BS)); - - if (m_use_tangent_vertices) { - scene::IMeshManipulator* meshmanip = - RenderingEngine::get_scene_manager()->getMeshManipulator(); - meshmanip->recalculateTangents(m_mesh[layer], true, false, false); + mesh->addMeshBuffer(buf); + buf->drop(); } if (m_mesh[layer]) { -#if 0 - // Usually 1-700 faces and 1-7 materials - std::cout << "Updated MapBlock has " << fastfaces_new.size() - << " faces and uses " << m_mesh[layer]->getMeshBufferCount() - << " materials (meshbuffers)" << std::endl; -#endif - // Use VBO for mesh (this just would set this for ever buffer) if (m_enable_vbo) m_mesh[layer]->setHardwareMappingHint(scene::EHM_STATIC); @@ -1247,24 +1383,27 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): } //std::cout<<"added "<<fastfaces.getSize()<<" faces."<<std::endl; + m_bsp_tree.buildTree(&m_transparent_triangles); // Check if animation is required for this mesh m_has_animation = !m_crack_materials.empty() || !m_daynight_diffs.empty() || - !m_animation_tiles.empty(); + !m_animation_info.empty(); } MapBlockMesh::~MapBlockMesh() { for (scene::IMesh *m : m_mesh) { - if (m_enable_vbo && m) +#if IRRLICHT_VERSION_MT_REVISION < 5 + if (m_enable_vbo) { for (u32 i = 0; i < m->getMeshBufferCount(); i++) { scene::IMeshBuffer *buf = m->getMeshBuffer(i); RenderingEngine::get_video_driver()->removeHardwareBuffer(buf); } + } +#endif m->drop(); - m = NULL; } delete m_minimap_mapblock; } @@ -1284,25 +1423,22 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, for (auto &crack_material : m_crack_materials) { scene::IMeshBuffer *buf = m_mesh[crack_material.first.first]-> getMeshBuffer(crack_material.first.second); - std::string basename = crack_material.second; // Create new texture name from original - std::ostringstream os; - os << basename << crack; + std::string s = crack_material.second + itos(crack); u32 new_texture_id = 0; video::ITexture *new_texture = - m_tsrc->getTextureForMesh(os.str(), &new_texture_id); + m_tsrc->getTextureForMesh(s, &new_texture_id); buf->getMaterial().setTexture(0, new_texture); - // If the current material is also animated, - // update animation info - auto anim_iter = m_animation_tiles.find(crack_material.first); - if (anim_iter != m_animation_tiles.end()) { - TileLayer &tile = anim_iter->second; + // If the current material is also animated, update animation info + auto anim_it = m_animation_info.find(crack_material.first); + if (anim_it != m_animation_info.end()) { + TileLayer &tile = anim_it->second.tile; tile.texture = new_texture; tile.texture_id = new_texture_id; // force animation update - m_animation_frames[crack_material.first] = -1; + anim_it->second.frame = -1; } } @@ -1310,28 +1446,25 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, } // Texture animation - for (auto &animation_tile : m_animation_tiles) { - const TileLayer &tile = animation_tile.second; + for (auto &it : m_animation_info) { + const TileLayer &tile = it.second.tile; // Figure out current frame - int frameoffset = m_animation_frame_offsets[animation_tile.first]; - int frame = (int)(time * 1000 / tile.animation_frame_length_ms - + frameoffset) % tile.animation_frame_count; + int frameno = (int)(time * 1000 / tile.animation_frame_length_ms + + it.second.frame_offset) % tile.animation_frame_count; // If frame doesn't change, skip - if (frame == m_animation_frames[animation_tile.first]) + if (frameno == it.second.frame) continue; - m_animation_frames[animation_tile.first] = frame; + it.second.frame = frameno; - scene::IMeshBuffer *buf = m_mesh[animation_tile.first.first]-> - getMeshBuffer(animation_tile.first.second); + scene::IMeshBuffer *buf = m_mesh[it.first.first]->getMeshBuffer(it.first.second); - const FrameSpec &animation_frame = (*tile.frames)[frame]; - buf->getMaterial().setTexture(0, animation_frame.texture); + const FrameSpec &frame = (*tile.frames)[frameno]; + buf->getMaterial().setTexture(0, frame.texture); if (m_enable_shaders) { - if (animation_frame.normal_texture) - buf->getMaterial().setTexture(1, - animation_frame.normal_texture); - buf->getMaterial().setTexture(2, animation_frame.flags_texture); + if (frame.normal_texture) + buf->getMaterial().setTexture(1, frame.normal_texture); + buf->getMaterial().setTexture(2, frame.flags_texture); } } @@ -1358,16 +1491,64 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, return true; } -void MapBlockMesh::updateCameraOffset(v3s16 camera_offset) +void MapBlockMesh::updateTransparentBuffers(v3f camera_pos, v3s16 block_pos) { - if (camera_offset != m_camera_offset) { - for (scene::IMesh *layer : m_mesh) { - translateMesh(layer, - intToFloat(m_camera_offset - camera_offset, BS)); - if (m_enable_vbo) - layer->setDirty(); + // nothing to do if the entire block is opaque + if (m_transparent_triangles.empty()) + return; + + v3f block_posf = intToFloat(block_pos * MAP_BLOCKSIZE, BS); + v3f rel_camera_pos = camera_pos - block_posf; + + std::vector<s32> triangle_refs; + m_bsp_tree.traverse(rel_camera_pos, triangle_refs); + + // arrange index sequences into partial buffers + m_transparent_buffers.clear(); + + scene::SMeshBuffer *current_buffer = nullptr; + std::vector<u16> current_strain; + for (auto i : triangle_refs) { + const auto &t = m_transparent_triangles[i]; + if (current_buffer != t.buffer) { + if (current_buffer) { + m_transparent_buffers.emplace_back(current_buffer, std::move(current_strain)); + current_strain.clear(); + } + current_buffer = t.buffer; } - m_camera_offset = camera_offset; + current_strain.push_back(t.p1); + current_strain.push_back(t.p2); + current_strain.push_back(t.p3); + } + + if (!current_strain.empty()) + m_transparent_buffers.emplace_back(current_buffer, std::move(current_strain)); +} + +void MapBlockMesh::consolidateTransparentBuffers() +{ + m_transparent_buffers.clear(); + + scene::SMeshBuffer *current_buffer = nullptr; + std::vector<u16> current_strain; + + // use the fact that m_transparent_triangles is already arranged by buffer + for (const auto &t : m_transparent_triangles) { + if (current_buffer != t.buffer) { + if (current_buffer != nullptr) { + this->m_transparent_buffers.emplace_back(current_buffer, std::move(current_strain)); + current_strain.clear(); + } + current_buffer = t.buffer; + } + current_strain.push_back(t.p1); + current_strain.push_back(t.p2); + current_strain.push_back(t.p3); + } + + if (!current_strain.empty()) { + this->m_transparent_buffers.emplace_back(current_buffer, std::move(current_strain)); } } diff --git a/src/client/mapblock_mesh.h b/src/client/mapblock_mesh.h index 6af23a656..169b3a8c1 100644 --- a/src/client/mapblock_mesh.h +++ b/src/client/mapblock_mesh.h @@ -45,10 +45,8 @@ struct MeshMakeData Client *m_client; bool m_use_shaders; - bool m_use_tangent_vertices; - MeshMakeData(Client *client, bool use_shaders, - bool use_tangent_vertices = false); + MeshMakeData(Client *client, bool use_shaders); /* Copy block data manually (to allow optimizations by the caller) @@ -62,11 +60,6 @@ struct MeshMakeData */ void fill(MapBlock *block); - /* - Set up with only a single node at (1,1,1) - */ - void fillSingleNode(MapNode *node); - /* Set the (node) position of a crack */ @@ -78,6 +71,102 @@ struct MeshMakeData void setSmoothLighting(bool smooth_lighting); }; +// represents a triangle as indexes into the vertex buffer in SMeshBuffer +class MeshTriangle +{ +public: + scene::SMeshBuffer *buffer; + u16 p1, p2, p3; + v3f centroid; + float areaSQ; + + void updateAttributes() + { + v3f v1 = buffer->getPosition(p1); + v3f v2 = buffer->getPosition(p2); + v3f v3 = buffer->getPosition(p3); + + centroid = (v1 + v2 + v3) / 3; + areaSQ = (v2-v1).crossProduct(v3-v1).getLengthSQ() / 4; + } + + v3f getNormal() const { + v3f v1 = buffer->getPosition(p1); + v3f v2 = buffer->getPosition(p2); + v3f v3 = buffer->getPosition(p3); + + return (v2-v1).crossProduct(v3-v1); + } +}; + +/** + * Implements a binary space partitioning tree + * See also: https://en.wikipedia.org/wiki/Binary_space_partitioning + */ +class MapBlockBspTree +{ +public: + MapBlockBspTree() {} + + void buildTree(const std::vector<MeshTriangle> *triangles); + + void traverse(v3f viewpoint, std::vector<s32> &output) const + { + traverse(root, viewpoint, output); + } + +private: + // Tree node definition; + struct TreeNode + { + v3f normal; + v3f origin; + std::vector<s32> triangle_refs; + s32 front_ref; + s32 back_ref; + + TreeNode() = default; + TreeNode(v3f normal, v3f origin, const std::vector<s32> &triangle_refs, s32 front_ref, s32 back_ref) : + normal(normal), origin(origin), triangle_refs(triangle_refs), front_ref(front_ref), back_ref(back_ref) + {} + }; + + + s32 buildTree(v3f normal, v3f origin, float delta, const std::vector<s32> &list, u32 depth); + void traverse(s32 node, v3f viewpoint, std::vector<s32> &output) const; + + const std::vector<MeshTriangle> *triangles = nullptr; // this reference is managed externally + std::vector<TreeNode> nodes; // list of nodes + s32 root = -1; // index of the root node +}; + +/* + * PartialMeshBuffer + * + * Attach alternate `Indices` to an existing mesh buffer, to make it possible to use different + * indices with the same vertex buffer. + * + * Irrlicht does not currently support this: `CMeshBuffer` ties together a single vertex buffer + * and a single index buffer. There's no way to share these between mesh buffers. + * + */ +class PartialMeshBuffer +{ +public: + PartialMeshBuffer(scene::SMeshBuffer *buffer, std::vector<u16> &&vertex_indexes) : + m_buffer(buffer), m_vertex_indexes(std::move(vertex_indexes)) + {} + + scene::IMeshBuffer *getBuffer() const { return m_buffer; } + const std::vector<u16> &getVertexIndexes() const { return m_vertex_indexes; } + + void beforeDraw() const; + void afterDraw() const; +private: + scene::SMeshBuffer *m_buffer; + mutable std::vector<u16> m_vertex_indexes; +}; + /* Holds a mesh for a mapblock. @@ -132,16 +221,29 @@ public: m_animation_force_timer--; } - void updateCameraOffset(v3s16 camera_offset); + /// update transparent buffers to render towards the camera + void updateTransparentBuffers(v3f camera_pos, v3s16 block_pos); + void consolidateTransparentBuffers(); + + /// get the list of transparent buffers + const std::vector<PartialMeshBuffer> &getTransparentBuffers() const + { + return this->m_transparent_buffers; + } private: + struct AnimationInfo { + int frame; // last animation frame + int frame_offset; + TileLayer tile; + }; + scene::IMesh *m_mesh[MAX_TILE_LAYERS]; MinimapMapblock *m_minimap_mapblock; ITextureSource *m_tsrc; IShaderSource *m_shdrsrc; bool m_enable_shaders; - bool m_use_tangent_vertices; bool m_enable_vbo; // Must animate() be called before rendering? @@ -154,12 +256,10 @@ private: // Maps mesh and mesh buffer (i.e. material) indices to base texture names std::map<std::pair<u8, u32>, std::string> m_crack_materials; - // Animation info: texture animationi + // Animation info: texture animation // Maps mesh and mesh buffer indices to TileSpecs // Keys are pairs of (mesh index, buffer index in the mesh) - std::map<std::pair<u8, u32>, TileLayer> m_animation_tiles; - std::map<std::pair<u8, u32>, int> m_animation_frames; // last animation frame - std::map<std::pair<u8, u32>, int> m_animation_frame_offsets; + std::map<std::pair<u8, u32>, AnimationInfo> m_animation_info; // Animation info: day/night transitions // Last daynight_ratio value passed to animate() @@ -169,8 +269,12 @@ private: // Keys are pairs of (mesh index, buffer index in the mesh) std::map<std::pair<u8, u32>, std::map<u32, video::SColor > > m_daynight_diffs; - // Camera offset info -> do we have to translate the mesh? - v3s16 m_camera_offset; + // list of all semitransparent triangles in the mapblock + std::vector<MeshTriangle> m_transparent_triangles; + // Binary Space Partitioning tree for the block + MapBlockBspTree m_bsp_tree; + // Ordered list of references to parts of transparent buffers to draw + std::vector<PartialMeshBuffer> m_transparent_buffers; }; /*! diff --git a/src/client/mesh.cpp b/src/client/mesh.cpp index 2400a374c..4bf07effa 100644 --- a/src/client/mesh.cpp +++ b/src/client/mesh.cpp @@ -20,21 +20,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mesh.h" #include "debug.h" #include "log.h" -#include "irrMap.h" #include <cmath> #include <iostream> #include <IAnimatedMesh.h> #include <SAnimatedMesh.h> #include <IAnimatedMeshSceneNode.h> -// In Irrlicht 1.8 the signature of ITexture::lock was changed from -// (bool, u32) to (E_TEXTURE_LOCK_MODE, u32). -#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7 -#define MY_ETLM_READ_ONLY true -#else -#define MY_ETLM_READ_ONLY video::ETLM_READ_ONLY -#endif - inline static void applyShadeFactor(video::SColor& color, float factor) { color.setRed(core::clamp(core::round32(color.getRed()*factor), 0, 255)); @@ -506,592 +497,3 @@ scene::IMesh* convertNodeboxesToMesh(const std::vector<aabb3f> &boxes, } return dst_mesh; } - -struct vcache -{ - core::array<u32> tris; - float score; - s16 cachepos; - u16 NumActiveTris; -}; - -struct tcache -{ - u16 ind[3]; - float score; - bool drawn; -}; - -const u16 cachesize = 32; - -float FindVertexScore(vcache *v) -{ - const float CacheDecayPower = 1.5f; - const float LastTriScore = 0.75f; - const float ValenceBoostScale = 2.0f; - const float ValenceBoostPower = 0.5f; - const float MaxSizeVertexCache = 32.0f; - - if (v->NumActiveTris == 0) - { - // No tri needs this vertex! - return -1.0f; - } - - float Score = 0.0f; - int CachePosition = v->cachepos; - if (CachePosition < 0) - { - // Vertex is not in FIFO cache - no score. - } - else - { - if (CachePosition < 3) - { - // This vertex was used in the last triangle, - // so it has a fixed score. - Score = LastTriScore; - } - else - { - // Points for being high in the cache. - const float Scaler = 1.0f / (MaxSizeVertexCache - 3); - Score = 1.0f - (CachePosition - 3) * Scaler; - Score = powf(Score, CacheDecayPower); - } - } - - // Bonus points for having a low number of tris still to - // use the vert, so we get rid of lone verts quickly. - float ValenceBoost = powf(v->NumActiveTris, - -ValenceBoostPower); - Score += ValenceBoostScale * ValenceBoost; - - return Score; -} - -/* - A specialized LRU cache for the Forsyth algorithm. -*/ - -class f_lru -{ - -public: - f_lru(vcache *v, tcache *t): vc(v), tc(t) - { - for (int &i : cache) { - i = -1; - } - } - - // Adds this vertex index and returns the highest-scoring triangle index - u32 add(u16 vert, bool updatetris = false) - { - bool found = false; - - // Mark existing pos as empty - for (u16 i = 0; i < cachesize; i++) - { - if (cache[i] == vert) - { - // Move everything down - for (u16 j = i; j; j--) - { - cache[j] = cache[j - 1]; - } - - found = true; - break; - } - } - - if (!found) - { - if (cache[cachesize-1] != -1) - vc[cache[cachesize-1]].cachepos = -1; - - // Move everything down - for (u16 i = cachesize - 1; i; i--) - { - cache[i] = cache[i - 1]; - } - } - - cache[0] = vert; - - u32 highest = 0; - float hiscore = 0; - - if (updatetris) - { - // Update cache positions - for (u16 i = 0; i < cachesize; i++) - { - if (cache[i] == -1) - break; - - vc[cache[i]].cachepos = i; - vc[cache[i]].score = FindVertexScore(&vc[cache[i]]); - } - - // Update triangle scores - for (int i : cache) { - if (i == -1) - break; - - const u16 trisize = vc[i].tris.size(); - for (u16 t = 0; t < trisize; t++) - { - tcache *tri = &tc[vc[i].tris[t]]; - - tri->score = - vc[tri->ind[0]].score + - vc[tri->ind[1]].score + - vc[tri->ind[2]].score; - - if (tri->score > hiscore) - { - hiscore = tri->score; - highest = vc[i].tris[t]; - } - } - } - } - - return highest; - } - -private: - s32 cache[cachesize]; - vcache *vc; - tcache *tc; -}; - -/** -Vertex cache optimization according to the Forsyth paper: -http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html - -The function is thread-safe (read: you can optimize several meshes in different threads) - -\param mesh Source mesh for the operation. */ -scene::IMesh* createForsythOptimizedMesh(const scene::IMesh *mesh) -{ - if (!mesh) - return 0; - - scene::SMesh *newmesh = new scene::SMesh(); - newmesh->BoundingBox = mesh->getBoundingBox(); - - const u32 mbcount = mesh->getMeshBufferCount(); - - for (u32 b = 0; b < mbcount; ++b) - { - const scene::IMeshBuffer *mb = mesh->getMeshBuffer(b); - - if (mb->getIndexType() != video::EIT_16BIT) - { - //os::Printer::log("Cannot optimize a mesh with 32bit indices", ELL_ERROR); - newmesh->drop(); - return 0; - } - - const u32 icount = mb->getIndexCount(); - const u32 tcount = icount / 3; - const u32 vcount = mb->getVertexCount(); - const u16 *ind = mb->getIndices(); - - vcache *vc = new vcache[vcount]; - tcache *tc = new tcache[tcount]; - - f_lru lru(vc, tc); - - // init - for (u16 i = 0; i < vcount; i++) - { - vc[i].score = 0; - vc[i].cachepos = -1; - vc[i].NumActiveTris = 0; - } - - // First pass: count how many times a vert is used - for (u32 i = 0; i < icount; i += 3) - { - vc[ind[i]].NumActiveTris++; - vc[ind[i + 1]].NumActiveTris++; - vc[ind[i + 2]].NumActiveTris++; - - const u32 tri_ind = i/3; - tc[tri_ind].ind[0] = ind[i]; - tc[tri_ind].ind[1] = ind[i + 1]; - tc[tri_ind].ind[2] = ind[i + 2]; - } - - // Second pass: list of each triangle - for (u32 i = 0; i < tcount; i++) - { - vc[tc[i].ind[0]].tris.push_back(i); - vc[tc[i].ind[1]].tris.push_back(i); - vc[tc[i].ind[2]].tris.push_back(i); - - tc[i].drawn = false; - } - - // Give initial scores - for (u16 i = 0; i < vcount; i++) - { - vc[i].score = FindVertexScore(&vc[i]); - } - for (u32 i = 0; i < tcount; i++) - { - tc[i].score = - vc[tc[i].ind[0]].score + - vc[tc[i].ind[1]].score + - vc[tc[i].ind[2]].score; - } - - switch(mb->getVertexType()) - { - case video::EVT_STANDARD: - { - video::S3DVertex *v = (video::S3DVertex *) mb->getVertices(); - - scene::SMeshBuffer *buf = new scene::SMeshBuffer(); - buf->Material = mb->getMaterial(); - - buf->Vertices.reallocate(vcount); - buf->Indices.reallocate(icount); - - core::map<const video::S3DVertex, const u16> sind; // search index for fast operation - typedef core::map<const video::S3DVertex, const u16>::Node snode; - - // Main algorithm - u32 highest = 0; - u32 drawcalls = 0; - for (;;) - { - if (tc[highest].drawn) - { - bool found = false; - float hiscore = 0; - for (u32 t = 0; t < tcount; t++) - { - if (!tc[t].drawn) - { - if (tc[t].score > hiscore) - { - highest = t; - hiscore = tc[t].score; - found = true; - } - } - } - if (!found) - break; - } - - // Output the best triangle - u16 newind = buf->Vertices.size(); - - snode *s = sind.find(v[tc[highest].ind[0]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[0]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[0]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->getValue()); - } - - s = sind.find(v[tc[highest].ind[1]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[1]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[1]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->getValue()); - } - - s = sind.find(v[tc[highest].ind[2]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[2]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[2]], newind); - } - else - { - buf->Indices.push_back(s->getValue()); - } - - vc[tc[highest].ind[0]].NumActiveTris--; - vc[tc[highest].ind[1]].NumActiveTris--; - vc[tc[highest].ind[2]].NumActiveTris--; - - tc[highest].drawn = true; - - for (u16 j : tc[highest].ind) { - vcache *vert = &vc[j]; - for (u16 t = 0; t < vert->tris.size(); t++) - { - if (highest == vert->tris[t]) - { - vert->tris.erase(t); - break; - } - } - } - - lru.add(tc[highest].ind[0]); - lru.add(tc[highest].ind[1]); - highest = lru.add(tc[highest].ind[2], true); - drawcalls++; - } - - buf->setBoundingBox(mb->getBoundingBox()); - newmesh->addMeshBuffer(buf); - buf->drop(); - } - break; - case video::EVT_2TCOORDS: - { - video::S3DVertex2TCoords *v = (video::S3DVertex2TCoords *) mb->getVertices(); - - scene::SMeshBufferLightMap *buf = new scene::SMeshBufferLightMap(); - buf->Material = mb->getMaterial(); - - buf->Vertices.reallocate(vcount); - buf->Indices.reallocate(icount); - - core::map<const video::S3DVertex2TCoords, const u16> sind; // search index for fast operation - typedef core::map<const video::S3DVertex2TCoords, const u16>::Node snode; - - // Main algorithm - u32 highest = 0; - u32 drawcalls = 0; - for (;;) - { - if (tc[highest].drawn) - { - bool found = false; - float hiscore = 0; - for (u32 t = 0; t < tcount; t++) - { - if (!tc[t].drawn) - { - if (tc[t].score > hiscore) - { - highest = t; - hiscore = tc[t].score; - found = true; - } - } - } - if (!found) - break; - } - - // Output the best triangle - u16 newind = buf->Vertices.size(); - - snode *s = sind.find(v[tc[highest].ind[0]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[0]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[0]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->getValue()); - } - - s = sind.find(v[tc[highest].ind[1]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[1]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[1]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->getValue()); - } - - s = sind.find(v[tc[highest].ind[2]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[2]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[2]], newind); - } - else - { - buf->Indices.push_back(s->getValue()); - } - - vc[tc[highest].ind[0]].NumActiveTris--; - vc[tc[highest].ind[1]].NumActiveTris--; - vc[tc[highest].ind[2]].NumActiveTris--; - - tc[highest].drawn = true; - - for (u16 j : tc[highest].ind) { - vcache *vert = &vc[j]; - for (u16 t = 0; t < vert->tris.size(); t++) - { - if (highest == vert->tris[t]) - { - vert->tris.erase(t); - break; - } - } - } - - lru.add(tc[highest].ind[0]); - lru.add(tc[highest].ind[1]); - highest = lru.add(tc[highest].ind[2]); - drawcalls++; - } - - buf->setBoundingBox(mb->getBoundingBox()); - newmesh->addMeshBuffer(buf); - buf->drop(); - - } - break; - case video::EVT_TANGENTS: - { - video::S3DVertexTangents *v = (video::S3DVertexTangents *) mb->getVertices(); - - scene::SMeshBufferTangents *buf = new scene::SMeshBufferTangents(); - buf->Material = mb->getMaterial(); - - buf->Vertices.reallocate(vcount); - buf->Indices.reallocate(icount); - - core::map<const video::S3DVertexTangents, const u16> sind; // search index for fast operation - typedef core::map<const video::S3DVertexTangents, const u16>::Node snode; - - // Main algorithm - u32 highest = 0; - u32 drawcalls = 0; - for (;;) - { - if (tc[highest].drawn) - { - bool found = false; - float hiscore = 0; - for (u32 t = 0; t < tcount; t++) - { - if (!tc[t].drawn) - { - if (tc[t].score > hiscore) - { - highest = t; - hiscore = tc[t].score; - found = true; - } - } - } - if (!found) - break; - } - - // Output the best triangle - u16 newind = buf->Vertices.size(); - - snode *s = sind.find(v[tc[highest].ind[0]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[0]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[0]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->getValue()); - } - - s = sind.find(v[tc[highest].ind[1]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[1]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[1]], newind); - newind++; - } - else - { - buf->Indices.push_back(s->getValue()); - } - - s = sind.find(v[tc[highest].ind[2]]); - - if (!s) - { - buf->Vertices.push_back(v[tc[highest].ind[2]]); - buf->Indices.push_back(newind); - sind.insert(v[tc[highest].ind[2]], newind); - } - else - { - buf->Indices.push_back(s->getValue()); - } - - vc[tc[highest].ind[0]].NumActiveTris--; - vc[tc[highest].ind[1]].NumActiveTris--; - vc[tc[highest].ind[2]].NumActiveTris--; - - tc[highest].drawn = true; - - for (u16 j : tc[highest].ind) { - vcache *vert = &vc[j]; - for (u16 t = 0; t < vert->tris.size(); t++) - { - if (highest == vert->tris[t]) - { - vert->tris.erase(t); - break; - } - } - } - - lru.add(tc[highest].ind[0]); - lru.add(tc[highest].ind[1]); - highest = lru.add(tc[highest].ind[2]); - drawcalls++; - } - - buf->setBoundingBox(mb->getBoundingBox()); - newmesh->addMeshBuffer(buf); - buf->drop(); - } - break; - } - - delete [] vc; - delete [] tc; - - } // for each meshbuffer - - return newmesh; -} diff --git a/src/client/mesh.h b/src/client/mesh.h index dbc091a06..1ed753c01 100644 --- a/src/client/mesh.h +++ b/src/client/mesh.h @@ -133,10 +133,3 @@ void recalculateBoundingBox(scene::IMesh *src_mesh); We assume normal to be valid when it's 0 < length < Inf. and not NaN */ bool checkMeshNormals(scene::IMesh *mesh); - -/* - Vertex cache optimization according to the Forsyth paper: - http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html - Ported from irrlicht 1.8 -*/ -scene::IMesh* createForsythOptimizedMesh(const scene::IMesh *mesh); diff --git a/src/client/mesh_generator_thread.cpp b/src/client/mesh_generator_thread.cpp index 53b980eeb..ec567c8c1 100644 --- a/src/client/mesh_generator_thread.cpp +++ b/src/client/mesh_generator_thread.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client.h" #include "mapblock.h" #include "map.h" +#include "util/directiontables.h" /* CachedMapBlockData @@ -49,12 +50,10 @@ QueuedMeshUpdate::~QueuedMeshUpdate() */ MeshUpdateQueue::MeshUpdateQueue(Client *client): - m_client(client) + m_client(client), + m_next_cache_cleanup(0) { m_cache_enable_shaders = g_settings->getBool("enable_shaders"); - m_cache_use_tangent_vertices = m_cache_enable_shaders && ( - g_settings->getBool("enable_bumpmapping") || - g_settings->getBool("enable_parallax_occlusion")); m_cache_smooth_lighting = g_settings->getBool("smooth_lighting"); m_meshgen_block_cache_size = g_settings->getS32("meshgen_block_cache_size"); } @@ -72,7 +71,7 @@ MeshUpdateQueue::~MeshUpdateQueue() } } -void MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent) +bool MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent) { MutexAutoLock lock(m_mutex); @@ -84,20 +83,15 @@ void MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool */ std::vector<CachedMapBlockData*> cached_blocks; size_t cache_hit_counter = 0; + CachedMapBlockData *cached_block = cacheBlock(map, p, FORCE_UPDATE); + if (!cached_block->data) + return false; // nothing to update cached_blocks.reserve(3*3*3); - v3s16 dp; - for (dp.X = -1; dp.X <= 1; dp.X++) - for (dp.Y = -1; dp.Y <= 1; dp.Y++) - for (dp.Z = -1; dp.Z <= 1; dp.Z++) { - v3s16 p1 = p + dp; - CachedMapBlockData *cached_block; - if (dp == v3s16(0, 0, 0)) - cached_block = cacheBlock(map, p1, FORCE_UPDATE); - else - cached_block = cacheBlock(map, p1, SKIP_UPDATE_IF_ALREADY_CACHED, - &cache_hit_counter); - cached_blocks.push_back(cached_block); - } + cached_blocks.push_back(cached_block); + for (v3s16 dp : g_26dirs) + cached_blocks.push_back(cacheBlock(map, p + dp, + SKIP_UPDATE_IF_ALREADY_CACHED, + &cache_hit_counter)); g_profiler->avg("MeshUpdateQueue: MapBlocks from cache [%]", 100.0f * cache_hit_counter / cached_blocks.size()); @@ -119,7 +113,8 @@ void MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool q->ack_block_to_server = true; q->crack_level = m_client->getCrackLevel(); q->crack_pos = m_client->getCrackPos(); - return; + q->urgent |= urgent; + return true; } } @@ -131,12 +126,14 @@ void MeshUpdateQueue::addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool q->ack_block_to_server = ack_block_to_server; q->crack_level = m_client->getCrackLevel(); q->crack_pos = m_client->getCrackPos(); + q->urgent = urgent; m_queue.push_back(q); // This queue entry is a new reference to the cached blocks for (CachedMapBlockData *cached_block : cached_blocks) { cached_block->refcount_from_queue++; } + return true; } // Returned pointer must be deleted @@ -163,8 +160,7 @@ CachedMapBlockData* MeshUpdateQueue::cacheBlock(Map *map, v3s16 p, UpdateMode mo size_t *cache_hit_counter) { CachedMapBlockData *cached_block = nullptr; - std::map<v3s16, CachedMapBlockData*>::iterator it = - m_cache.find(p); + auto it = m_cache.find(p); if (it != m_cache.end()) { cached_block = it->second; @@ -198,7 +194,7 @@ CachedMapBlockData* MeshUpdateQueue::cacheBlock(Map *map, v3s16 p, UpdateMode mo CachedMapBlockData* MeshUpdateQueue::getCachedBlock(const v3s16 &p) { - std::map<v3s16, CachedMapBlockData*>::iterator it = m_cache.find(p); + auto it = m_cache.find(p); if (it != m_cache.end()) { return it->second; } @@ -207,8 +203,7 @@ CachedMapBlockData* MeshUpdateQueue::getCachedBlock(const v3s16 &p) void MeshUpdateQueue::fillDataFromMapBlockCache(QueuedMeshUpdate *q) { - MeshMakeData *data = new MeshMakeData(m_client, m_cache_enable_shaders, - m_cache_use_tangent_vertices); + MeshMakeData *data = new MeshMakeData(m_client, m_cache_enable_shaders); q->data = data; data->fillBlockDataBegin(q->p); @@ -216,10 +211,7 @@ void MeshUpdateQueue::fillDataFromMapBlockCache(QueuedMeshUpdate *q) std::time_t t_now = std::time(0); // Collect data for 3*3*3 blocks from cache - v3s16 dp; - for (dp.X = -1; dp.X <= 1; dp.X++) - for (dp.Y = -1; dp.Y <= 1; dp.Y++) - for (dp.Z = -1; dp.Z <= 1; dp.Z++) { + for (v3s16 dp : g_27dirs) { v3s16 p = q->p + dp; CachedMapBlockData *cached_block = getCachedBlock(p); if (cached_block) { @@ -241,6 +233,15 @@ void MeshUpdateQueue::cleanupCache() g_profiler->avg("MeshUpdateQueue MapBlock cache size kB", mapblock_kB * m_cache.size()); + // Iterating the entire cache can get pretty expensive so don't do it too often + { + constexpr int cleanup_interval = 250; + const u64 now = porting::getTimeMs(); + if (m_next_cache_cleanup > now) + return; + m_next_cache_cleanup = now + cleanup_interval; + } + // The cache size is kept roughly below cache_soft_max_size, not letting // anything get older than cache_seconds_max or deleted before 2 seconds. const int cache_seconds_max = 10; @@ -250,12 +251,11 @@ void MeshUpdateQueue::cleanupCache() int t_now = time(0); - for (std::map<v3s16, CachedMapBlockData*>::iterator it = m_cache.begin(); - it != m_cache.end(); ) { + for (auto it = m_cache.begin(); it != m_cache.end(); ) { CachedMapBlockData *cached_block = it->second; if (cached_block->refcount_from_queue == 0 && cached_block->last_used_timestamp < t_now - cache_seconds) { - m_cache.erase(it++); + it = m_cache.erase(it); delete cached_block; } else { ++it; @@ -276,10 +276,25 @@ MeshUpdateThread::MeshUpdateThread(Client *client): } void MeshUpdateThread::updateBlock(Map *map, v3s16 p, bool ack_block_to_server, - bool urgent) + bool urgent, bool update_neighbors) { - // Allow the MeshUpdateQueue to do whatever it wants - m_queue_in.addBlock(map, p, ack_block_to_server, urgent); + static thread_local const bool many_neighbors = + g_settings->getBool("smooth_lighting") + && !g_settings->getFlag("performance_tradeoffs"); + if (!m_queue_in.addBlock(map, p, ack_block_to_server, urgent)) { + warningstream << "Update requested for non-existent block at (" + << p.X << ", " << p.Y << ", " << p.Z << ")" << std::endl; + return; + } + if (update_neighbors) { + if (many_neighbors) { + for (v3s16 dp : g_26dirs) + m_queue_in.addBlock(map, p + dp, false, urgent); + } else { + for (v3s16 dp : g_6dirs) + m_queue_in.addBlock(map, p + dp, false, urgent); + } + } deferUpdate(); } @@ -297,6 +312,7 @@ void MeshUpdateThread::doUpdate() r.p = q->p; r.mesh = mesh_new; r.ack_block_to_server = q->ack_block_to_server; + r.urgent = q->urgent; m_queue_out.push_back(r); diff --git a/src/client/mesh_generator_thread.h b/src/client/mesh_generator_thread.h index 9a42852a3..09400196d 100644 --- a/src/client/mesh_generator_thread.h +++ b/src/client/mesh_generator_thread.h @@ -21,6 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <ctime> #include <mutex> +#include <unordered_map> +#include <unordered_set> #include "mapblock_mesh.h" #include "threading/mutex_auto_lock.h" #include "util/thread.h" @@ -40,10 +42,10 @@ struct QueuedMeshUpdate { v3s16 p = v3s16(-1337, -1337, -1337); bool ack_block_to_server = false; - bool urgent = false; int crack_level = -1; v3s16 crack_pos; MeshMakeData *data = nullptr; // This is generated in MeshUpdateQueue::pop() + bool urgent = false; QueuedMeshUpdate() = default; ~QueuedMeshUpdate(); @@ -67,7 +69,7 @@ public: // Caches the block at p and its neighbors (if needed) and queues a mesh // update for the block at p - void addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent); + bool addBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent); // Returned pointer must be deleted // Returns NULL if queue is empty @@ -82,13 +84,13 @@ public: private: Client *m_client; std::vector<QueuedMeshUpdate *> m_queue; - std::set<v3s16> m_urgents; - std::map<v3s16, CachedMapBlockData *> m_cache; + std::unordered_set<v3s16> m_urgents; + std::unordered_map<v3s16, CachedMapBlockData *> m_cache; + u64 m_next_cache_cleanup; // milliseconds std::mutex m_mutex; // TODO: Add callback to update these when g_settings changes bool m_cache_enable_shaders; - bool m_cache_use_tangent_vertices; bool m_cache_smooth_lighting; int m_meshgen_block_cache_size; @@ -104,6 +106,7 @@ struct MeshUpdateResult v3s16 p = v3s16(-1338, -1338, -1338); MapBlockMesh *mesh = nullptr; bool ack_block_to_server = false; + bool urgent = false; MeshUpdateResult() = default; }; @@ -115,7 +118,8 @@ public: // Caches the block at p and its neighbors (if needed) and queues a mesh // update for the block at p - void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent); + void updateBlock(Map *map, v3s16 p, bool ack_block_to_server, bool urgent, + bool update_neighbors = false); v3s16 m_camera_offset; MutexedQueue<MeshUpdateResult> m_queue_out; diff --git a/src/client/minimap.cpp b/src/client/minimap.cpp index 68770ec19..320621d91 100644 --- a/src/client/minimap.cpp +++ b/src/client/minimap.cpp @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "shader.h" #include "mapblock.h" #include "client/renderingengine.h" - +#include "gettext.h" //// //// MinimapUpdateThread @@ -108,8 +108,11 @@ void MinimapUpdateThread::doUpdate() } } - if (data->map_invalidated && data->mode != MINIMAP_MODE_OFF) { - getMap(data->pos, data->map_size, data->scan_height); + + if (data->map_invalidated && ( + data->mode.type == MINIMAP_TYPE_RADAR || + data->mode.type == MINIMAP_TYPE_SURFACE)) { + getMap(data->pos, data->mode.map_size, data->mode.scan_height); data->map_invalidated = false; } } @@ -181,19 +184,26 @@ Minimap::Minimap(Client *client) this->m_ndef = client->getNodeDefManager(); m_angle = 0.f; + m_current_mode_index = 0; // Initialize static settings m_enable_shaders = g_settings->getBool("enable_shaders"); m_surface_mode_scan_height = g_settings->getBool("minimap_double_scan_height") ? 256 : 128; + // Initialize minimap modes + addMode(MINIMAP_TYPE_OFF); + addMode(MINIMAP_TYPE_SURFACE, 256); + addMode(MINIMAP_TYPE_SURFACE, 128); + addMode(MINIMAP_TYPE_SURFACE, 64); + addMode(MINIMAP_TYPE_RADAR, 512); + addMode(MINIMAP_TYPE_RADAR, 256); + addMode(MINIMAP_TYPE_RADAR, 128); + // Initialize minimap data data = new MinimapData; - data->mode = MINIMAP_MODE_OFF; - data->is_radar = false; - data->map_invalidated = true; - data->texture = NULL; - data->heightmap_texture = NULL; + data->map_invalidated = true; + data->minimap_shape_round = g_settings->getBool("minimap_shape_round"); // Get round minimap textures @@ -215,6 +225,8 @@ Minimap::Minimap(Client *client) // Create object marker texture data->object_marker_red = m_tsrc->getTexture("object_marker_red.png"); + setModeIndex(0); + // Create mesh buffer for minimap m_meshbuffer = getMinimapMeshBuffer(); @@ -240,6 +252,10 @@ Minimap::~Minimap() driver->removeTexture(data->minimap_overlay_square); driver->removeTexture(data->object_marker_red); + for (MinimapMarker *m : m_markers) + delete m; + m_markers.clear(); + delete data; delete m_minimap_update_thread; } @@ -280,29 +296,102 @@ MinimapShape Minimap::getMinimapShape() return MINIMAP_SHAPE_SQUARE; } -void Minimap::setMinimapMode(MinimapMode mode) +void Minimap::setModeIndex(size_t index) { - static const MinimapModeDef modedefs[MINIMAP_MODE_COUNT] = { - {false, 0, 0}, - {false, m_surface_mode_scan_height, 256}, - {false, m_surface_mode_scan_height, 128}, - {false, m_surface_mode_scan_height, 64}, - {true, 32, 128}, - {true, 32, 64}, - {true, 32, 32} - }; - - if (mode >= MINIMAP_MODE_COUNT) - return; - MutexAutoLock lock(m_mutex); - data->is_radar = modedefs[mode].is_radar; - data->scan_height = modedefs[mode].scan_height; - data->map_size = modedefs[mode].map_size; - data->mode = mode; + if (index < m_modes.size()) { + data->mode = m_modes[index]; + m_current_mode_index = index; + } else { + data->mode = {MINIMAP_TYPE_OFF, gettext("Minimap hidden"), 0, 0, "", 0}; + m_current_mode_index = 0; + } - m_minimap_update_thread->deferUpdate(); + data->map_invalidated = true; + + if (m_minimap_update_thread) + m_minimap_update_thread->deferUpdate(); +} + +void Minimap::addMode(MinimapModeDef mode) +{ + // Check validity + if (mode.type == MINIMAP_TYPE_TEXTURE) { + if (mode.texture.empty()) + return; + if (mode.scale < 1) + mode.scale = 1; + } + + int zoom = -1; + + // Build a default standard label + if (mode.label == "") { + switch (mode.type) { + case MINIMAP_TYPE_OFF: + mode.label = gettext("Minimap hidden"); + break; + case MINIMAP_TYPE_SURFACE: + mode.label = gettext("Minimap in surface mode, Zoom x%d"); + if (mode.map_size > 0) + zoom = 256 / mode.map_size; + break; + case MINIMAP_TYPE_RADAR: + mode.label = gettext("Minimap in radar mode, Zoom x%d"); + if (mode.map_size > 0) + zoom = 512 / mode.map_size; + break; + case MINIMAP_TYPE_TEXTURE: + mode.label = gettext("Minimap in texture mode"); + break; + default: + break; + } + } + // else: Custom labels need mod-provided client-side translation + + if (zoom >= 0) { + char label_buf[1024]; + porting::mt_snprintf(label_buf, sizeof(label_buf), + mode.label.c_str(), zoom); + mode.label = label_buf; + } + + m_modes.push_back(mode); +} + +void Minimap::addMode(MinimapType type, u16 size, std::string label, + std::string texture, u16 scale) +{ + MinimapModeDef mode; + mode.type = type; + mode.label = label; + mode.map_size = size; + mode.texture = texture; + mode.scale = scale; + switch (type) { + case MINIMAP_TYPE_SURFACE: + mode.scan_height = m_surface_mode_scan_height; + break; + case MINIMAP_TYPE_RADAR: + mode.scan_height = 32; + break; + default: + mode.scan_height = 0; + } + addMode(mode); +} + +void Minimap::nextMode() +{ + if (m_modes.empty()) + return; + m_current_mode_index++; + if (m_current_mode_index >= m_modes.size()) + m_current_mode_index = 0; + + setModeIndex(m_current_mode_index); } void Minimap::setPos(v3s16 pos) @@ -331,16 +420,16 @@ void Minimap::setAngle(f32 angle) void Minimap::blitMinimapPixelsToImageRadar(video::IImage *map_image) { video::SColor c(240, 0, 0, 0); - for (s16 x = 0; x < data->map_size; x++) - for (s16 z = 0; z < data->map_size; z++) { - MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->map_size]; + for (s16 x = 0; x < data->mode.map_size; x++) + for (s16 z = 0; z < data->mode.map_size; z++) { + MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->mode.map_size]; if (mmpixel->air_count > 0) c.setGreen(core::clamp(core::round32(32 + mmpixel->air_count * 8), 0, 255)); else c.setGreen(0); - map_image->setPixel(x, data->map_size - z - 1, c); + map_image->setPixel(x, data->mode.map_size - z - 1, c); } } @@ -349,9 +438,9 @@ void Minimap::blitMinimapPixelsToImageSurface( { // This variable creation/destruction has a 1% cost on rendering minimap video::SColor tilecolor; - for (s16 x = 0; x < data->map_size; x++) - for (s16 z = 0; z < data->map_size; z++) { - MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->map_size]; + for (s16 x = 0; x < data->mode.map_size; x++) + for (s16 z = 0; z < data->mode.map_size; z++) { + MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->mode.map_size]; const ContentFeatures &f = m_ndef->get(mmpixel->n); const TileDef *tile = &f.tiledef[0]; @@ -367,10 +456,10 @@ void Minimap::blitMinimapPixelsToImageSurface( tilecolor.setBlue(tilecolor.getBlue() * f.minimap_color.getBlue() / 255); tilecolor.setAlpha(240); - map_image->setPixel(x, data->map_size - z - 1, tilecolor); + map_image->setPixel(x, data->mode.map_size - z - 1, tilecolor); u32 h = mmpixel->height; - heightmap_image->setPixel(x,data->map_size - z - 1, + heightmap_image->setPixel(x,data->mode.map_size - z - 1, video::SColor(255, h, h, h)); } } @@ -378,21 +467,47 @@ void Minimap::blitMinimapPixelsToImageSurface( video::ITexture *Minimap::getMinimapTexture() { // update minimap textures when new scan is ready - if (data->map_invalidated) + if (data->map_invalidated && data->mode.type != MINIMAP_TYPE_TEXTURE) return data->texture; // create minimap and heightmap images in memory - core::dimension2d<u32> dim(data->map_size, data->map_size); + core::dimension2d<u32> dim(data->mode.map_size, data->mode.map_size); video::IImage *map_image = driver->createImage(video::ECF_A8R8G8B8, dim); video::IImage *heightmap_image = driver->createImage(video::ECF_A8R8G8B8, dim); video::IImage *minimap_image = driver->createImage(video::ECF_A8R8G8B8, core::dimension2d<u32>(MINIMAP_MAX_SX, MINIMAP_MAX_SY)); // Blit MinimapPixels to images - if (data->is_radar) - blitMinimapPixelsToImageRadar(map_image); - else + switch(data->mode.type) { + case MINIMAP_TYPE_OFF: + break; + case MINIMAP_TYPE_SURFACE: blitMinimapPixelsToImageSurface(map_image, heightmap_image); + break; + case MINIMAP_TYPE_RADAR: + blitMinimapPixelsToImageRadar(map_image); + break; + case MINIMAP_TYPE_TEXTURE: + // Want to use texture source, to : 1 find texture, 2 cache it + video::ITexture* texture = m_tsrc->getTexture(data->mode.texture); + video::IImage* image = driver->createImageFromData( + texture->getColorFormat(), texture->getSize(), + texture->lock(video::ETLM_READ_ONLY), true, false); + texture->unlock(); + + auto dim = image->getDimension(); + + map_image->fill(video::SColor(255, 0, 0, 0)); + + image->copyTo(map_image, + irr::core::vector2d<int> { + ((data->mode.map_size - (static_cast<int>(dim.Width))) >> 1) + - data->pos.X / data->mode.scale, + ((data->mode.map_size - (static_cast<int>(dim.Height))) >> 1) + + data->pos.Z / data->mode.scale + }); + image->drop(); + } map_image->copyToScaling(minimap_image); map_image->drop(); @@ -461,21 +576,31 @@ scene::SMeshBuffer *Minimap::getMinimapMeshBuffer() void Minimap::drawMinimap() { + // Non hud managed minimap drawing (legacy minimap) + v2u32 screensize = RenderingEngine::getWindowSize(); + const u32 size = 0.25 * screensize.Y; + + drawMinimap(core::rect<s32>( + screensize.X - size - 10, 10, + screensize.X - 10, size + 10)); +} + +void Minimap::drawMinimap(core::rect<s32> rect) { + video::ITexture *minimap_texture = getMinimapTexture(); if (!minimap_texture) return; + if (data->mode.type == MINIMAP_TYPE_OFF) + return; + updateActiveMarkers(); - v2u32 screensize = RenderingEngine::get_instance()->getWindowSize(); - const u32 size = 0.25 * screensize.Y; core::rect<s32> oldViewPort = driver->getViewPort(); core::matrix4 oldProjMat = driver->getTransform(video::ETS_PROJECTION); core::matrix4 oldViewMat = driver->getTransform(video::ETS_VIEW); - driver->setViewPort(core::rect<s32>( - screensize.X - size - 10, 10, - screensize.X - 10, size + 10)); + driver->setViewPort(rect); driver->setTransform(video::ETS_PROJECTION, core::matrix4()); driver->setTransform(video::ETS_VIEW, core::matrix4()); @@ -488,8 +613,8 @@ void Minimap::drawMinimap() material.TextureLayer[0].Texture = minimap_texture; material.TextureLayer[1].Texture = data->heightmap_texture; - if (m_enable_shaders && !data->is_radar) { - u16 sid = m_shdrsrc->getShader("minimap_shader", 1, 1); + if (m_enable_shaders && data->mode.type == MINIMAP_TYPE_SURFACE) { + u16 sid = m_shdrsrc->getShader("minimap_shader", TILE_MATERIAL_ALPHA); material.MaterialType = m_shdrsrc->getShaderInfo(sid).material; } else { material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; @@ -529,14 +654,14 @@ void Minimap::drawMinimap() driver->setViewPort(oldViewPort); // Draw player markers - v2s32 s_pos(screensize.X - size - 10, 10); + v2s32 s_pos(rect.UpperLeftCorner.X, rect.UpperLeftCorner.Y); core::dimension2di imgsize(data->object_marker_red->getOriginalSize()); core::rect<s32> img_rect(0, 0, imgsize.Width, imgsize.Height); static const video::SColor col(255, 255, 255, 255); static const video::SColor c[4] = {col, col, col, col}; f32 sin_angle = std::sin(m_angle * core::DEGTORAD); f32 cos_angle = std::cos(m_angle * core::DEGTORAD); - s32 marker_size2 = 0.025 * (float)size; + s32 marker_size2 = 0.025 * (float)rect.getWidth();; for (std::list<v2f>::const_iterator i = m_active_markers.begin(); i != m_active_markers.end(); ++i) { @@ -547,8 +672,8 @@ void Minimap::drawMinimap() posf.X = t1; posf.Y = t2; } - posf.X = (posf.X + 0.5) * (float)size; - posf.Y = (posf.Y + 0.5) * (float)size; + posf.X = (posf.X + 0.5) * (float)rect.getWidth(); + posf.Y = (posf.Y + 0.5) * (float)rect.getHeight(); core::rect<s32> dest_rect( s_pos.X + posf.X - marker_size2, s_pos.Y + posf.Y - marker_size2, @@ -559,28 +684,41 @@ void Minimap::drawMinimap() } } +MinimapMarker* Minimap::addMarker(scene::ISceneNode *parent_node) +{ + MinimapMarker *m = new MinimapMarker(parent_node); + m_markers.push_back(m); + return m; +} + +void Minimap::removeMarker(MinimapMarker **m) +{ + m_markers.remove(*m); + delete *m; + *m = nullptr; +} + void Minimap::updateActiveMarkers() { video::IImage *minimap_mask = data->minimap_shape_round ? data->minimap_mask_round : data->minimap_mask_square; - const std::list<Nametag *> &nametags = client->getCamera()->getNametags(); - m_active_markers.clear(); + v3f cam_offset = intToFloat(client->getCamera()->getOffset(), BS); + v3s16 pos_offset = data->pos - v3s16(data->mode.map_size / 2, + data->mode.scan_height / 2, + data->mode.map_size / 2); - for (Nametag *nametag : nametags) { - v3s16 pos = floatToInt(nametag->parent_node->getAbsolutePosition() + - intToFloat(client->getCamera()->getOffset(), BS), BS); - pos -= data->pos - v3s16(data->map_size / 2, - data->scan_height / 2, - data->map_size / 2); - if (pos.X < 0 || pos.X > data->map_size || - pos.Y < 0 || pos.Y > data->scan_height || - pos.Z < 0 || pos.Z > data->map_size) { + for (MinimapMarker *marker : m_markers) { + v3s16 pos = floatToInt(marker->parent_node->getAbsolutePosition() + + cam_offset, BS) - pos_offset; + if (pos.X < 0 || pos.X > data->mode.map_size || + pos.Y < 0 || pos.Y > data->mode.scan_height || + pos.Z < 0 || pos.Z > data->mode.map_size) { continue; } - pos.X = ((float)pos.X / data->map_size) * MINIMAP_MAX_SX; - pos.Z = ((float)pos.Z / data->map_size) * MINIMAP_MAX_SY; + pos.X = ((float)pos.X / data->mode.map_size) * MINIMAP_MAX_SX; + pos.Z = ((float)pos.Z / data->mode.map_size) * MINIMAP_MAX_SY; const video::SColor &mask_col = minimap_mask->getPixel(pos.X, pos.Z); if (!mask_col.getAlpha()) { continue; diff --git a/src/client/minimap.h b/src/client/minimap.h index 258d5330d..87c9668ee 100644 --- a/src/client/minimap.h +++ b/src/client/minimap.h @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once +#include "../hud.h" #include "irrlichttypes_extrabloated.h" #include "util/thread.h" #include "voxel.h" @@ -33,28 +34,27 @@ class IShaderSource; #define MINIMAP_MAX_SX 512 #define MINIMAP_MAX_SY 512 -enum MinimapMode { - MINIMAP_MODE_OFF, - MINIMAP_MODE_SURFACEx1, - MINIMAP_MODE_SURFACEx2, - MINIMAP_MODE_SURFACEx4, - MINIMAP_MODE_RADARx1, - MINIMAP_MODE_RADARx2, - MINIMAP_MODE_RADARx4, - MINIMAP_MODE_COUNT, -}; - enum MinimapShape { MINIMAP_SHAPE_SQUARE, MINIMAP_SHAPE_ROUND, }; struct MinimapModeDef { - bool is_radar; + MinimapType type; + std::string label; u16 scan_height; u16 map_size; + std::string texture; + u16 scale; }; +struct MinimapMarker { + MinimapMarker(scene::ISceneNode *parent_node): + parent_node(parent_node) + { + } + scene::ISceneNode *parent_node; +}; struct MinimapPixel { //! The topmost node that the minimap displays. MapNode n; @@ -69,12 +69,9 @@ struct MinimapMapblock { }; struct MinimapData { - bool is_radar; - MinimapMode mode; + MinimapModeDef mode; v3s16 pos; v3s16 old_pos; - u16 scan_height; - u16 map_size; MinimapPixel minimap_scan[MINIMAP_MAX_SX * MINIMAP_MAX_SY]; bool map_invalidated; bool minimap_shape_round; @@ -127,12 +124,21 @@ public: v3s16 getPos() const { return data->pos; } void setAngle(f32 angle); f32 getAngle() const { return m_angle; } - void setMinimapMode(MinimapMode mode); - MinimapMode getMinimapMode() const { return data->mode; } void toggleMinimapShape(); void setMinimapShape(MinimapShape shape); MinimapShape getMinimapShape(); + void clearModes() { m_modes.clear(); }; + void addMode(MinimapModeDef mode); + void addMode(MinimapType type, u16 size = 0, std::string label = "", + std::string texture = "", u16 scale = 1); + + void setModeIndex(size_t index); + size_t getModeIndex() const { return m_current_mode_index; }; + size_t getMaxModeIndex() const { return m_modes.size() - 1; }; + void nextMode(); + + MinimapModeDef getModeDef() const { return data->mode; } video::ITexture *getMinimapTexture(); @@ -142,8 +148,12 @@ public: scene::SMeshBuffer *getMinimapMeshBuffer(); + MinimapMarker* addMarker(scene::ISceneNode *parent_node); + void removeMarker(MinimapMarker **marker); + void updateActiveMarkers(); void drawMinimap(); + void drawMinimap(core::rect<s32> rect); video::IVideoDriver *driver; Client* client; @@ -153,11 +163,14 @@ private: ITextureSource *m_tsrc; IShaderSource *m_shdrsrc; const NodeDefManager *m_ndef; - MinimapUpdateThread *m_minimap_update_thread; + MinimapUpdateThread *m_minimap_update_thread = nullptr; scene::SMeshBuffer *m_meshbuffer; bool m_enable_shaders; + std::vector<MinimapModeDef> m_modes; + size_t m_current_mode_index; u16 m_surface_mode_scan_height; f32 m_angle; std::mutex m_mutex; + std::list<MinimapMarker*> m_markers; std::list<v2f> m_active_markers; }; diff --git a/src/client/particles.cpp b/src/client/particles.cpp index 7acd996dc..95d3c2021 100644 --- a/src/client/particles.cpp +++ b/src/client/particles.cpp @@ -33,23 +33,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client.h" #include "settings.h" -/* - Utility -*/ - -static f32 random_f32(f32 min, f32 max) -{ - return rand() / (float)RAND_MAX * (max - min) + min; -} - -static v3f random_v3f(v3f min, v3f max) -{ - return v3f( - random_f32(min.X, max.X), - random_f32(min.Y, max.Y), - random_f32(min.Z, max.Z)); -} - /* Particle */ @@ -59,25 +42,69 @@ Particle::Particle( LocalPlayer *player, ClientEnvironment *env, const ParticleParameters &p, - video::ITexture *texture, + const ClientTexRef& texture, v2f texpos, v2f texsize, video::SColor color ): - scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(), - RenderingEngine::get_scene_manager()) + scene::ISceneNode(((Client *)gamedef)->getSceneManager()->getRootSceneNode(), + ((Client *)gamedef)->getSceneManager()), + m_texture(texture) { // Misc m_gamedef = gamedef; m_env = env; + // translate blend modes to GL blend functions + video::E_BLEND_FACTOR bfsrc, bfdst; + video::E_BLEND_OPERATION blendop; + const auto blendmode = texture.tex != nullptr + ? texture.tex -> blendmode + : ParticleParamTypes::BlendMode::alpha; + + switch (blendmode) { + case ParticleParamTypes::BlendMode::add: + bfsrc = video::EBF_SRC_ALPHA; + bfdst = video::EBF_DST_ALPHA; + blendop = video::EBO_ADD; + break; + + case ParticleParamTypes::BlendMode::sub: + bfsrc = video::EBF_SRC_ALPHA; + bfdst = video::EBF_DST_ALPHA; + blendop = video::EBO_REVSUBTRACT; + break; + + case ParticleParamTypes::BlendMode::screen: + bfsrc = video::EBF_ONE; + bfdst = video::EBF_ONE_MINUS_SRC_COLOR; + blendop = video::EBO_ADD; + break; + + default: // includes ParticleParamTypes::BlendMode::alpha + bfsrc = video::EBF_SRC_ALPHA; + bfdst = video::EBF_ONE_MINUS_SRC_ALPHA; + blendop = video::EBO_ADD; + break; + } + // Texture m_material.setFlag(video::EMF_LIGHTING, false); m_material.setFlag(video::EMF_BACK_FACE_CULLING, false); m_material.setFlag(video::EMF_BILINEAR_FILTER, false); m_material.setFlag(video::EMF_FOG_ENABLE, true); - m_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - m_material.setTexture(0, texture); + + // correctly render layered transparent particles -- see #10398 + m_material.setFlag(video::EMF_ZWRITE_ENABLE, true); + + // enable alpha blending and set blend mode + m_material.MaterialType = video::EMT_ONETEXTURE_BLEND; + m_material.MaterialTypeParam = video::pack_textureBlendFunc( + bfsrc, bfdst, + video::EMFN_MODULATE_1X, + video::EAS_TEXTURE | video::EAS_VERTEX_COLOR); + m_material.BlendOperation = blendop; + m_material.setTexture(0, m_texture.ref); m_texpos = texpos; m_texsize = texsize; m_animation = p.animation; @@ -90,6 +117,9 @@ Particle::Particle( m_pos = p.pos; m_velocity = p.vel; m_acceleration = p.acc; + m_drag = p.drag; + m_jitter = p.jitter; + m_bounce = p.bounce; m_expiration = p.expirationtime; m_player = player; m_size = p.size; @@ -98,6 +128,8 @@ Particle::Particle( m_object_collision = p.object_collision; m_vertical = p.vertical; m_glow = p.glow; + m_alpha = 0; + m_parent = nullptr; // Irrlicht stuff const float c = p.size / 2; @@ -111,6 +143,14 @@ Particle::Particle( updateVertices(); } +Particle::~Particle() +{ + /* if our textures aren't owned by a particlespawner, we need to clean + * them up ourselves when the particle dies */ + if (m_parent == nullptr) + delete m_texture.tex; +} + void Particle::OnRegisterSceneNode() { if (IsVisible) @@ -134,6 +174,12 @@ void Particle::render() void Particle::step(float dtime) { m_time += dtime; + + // apply drag (not handled by collisionMoveSimple) and brownian motion + v3f av = vecAbsolute(m_velocity); + av -= av * (m_drag * dtime); + m_velocity = av*vecSign(m_velocity) + v3f(m_jitter.pickWithin())*dtime; + if (m_collisiondetection) { aabb3f box = m_collisionbox; v3f p_pos = m_pos * BS; @@ -141,17 +187,41 @@ void Particle::step(float dtime) collisionMoveResult r = collisionMoveSimple(m_env, m_gamedef, BS * 0.5f, box, 0.0f, dtime, &p_pos, &p_velocity, m_acceleration * BS, nullptr, m_object_collision); - if (m_collision_removal && r.collides) { - // force expiration of the particle - m_expiration = -1.0; + + f32 bounciness = m_bounce.pickWithin(); + if (r.collides && (m_collision_removal || bounciness > 0)) { + if (m_collision_removal) { + // force expiration of the particle + m_expiration = -1.0f; + } else if (bounciness > 0) { + /* cheap way to get a decent bounce effect is to only invert the + * largest component of the velocity vector, so e.g. you don't + * have a rock immediately bounce back in your face when you try + * to skip it across the water (as would happen if we simply + * downscaled and negated the velocity vector). this means + * bounciness will work properly for cubic objects, but meshes + * with diagonal angles and entities will not yield the correct + * visual. this is probably unavoidable */ + if (av.Y > av.X && av.Y > av.Z) { + m_velocity.Y = -(m_velocity.Y * bounciness); + } else if (av.X > av.Y && av.X > av.Z) { + m_velocity.X = -(m_velocity.X * bounciness); + } else if (av.Z > av.Y && av.Z > av.X) { + m_velocity.Z = -(m_velocity.Z * bounciness); + } else { // well now we're in a bit of a pickle + m_velocity = -(m_velocity * bounciness); + } + } } else { - m_pos = p_pos / BS; m_velocity = p_velocity / BS; } + m_pos = p_pos / BS; } else { + // apply acceleration m_velocity += m_acceleration * dtime; m_pos += m_velocity * dtime; } + if (m_animation.type != TAT_NONE) { m_animation_time += dtime; int frame_length_i, frame_count; @@ -165,11 +235,21 @@ void Particle::step(float dtime) } } + // animate particle alpha in accordance with settings + if (m_texture.tex != nullptr) + m_alpha = m_texture.tex -> alpha.blend(m_time / (m_expiration+0.1f)); + else + m_alpha = 1.f; + // Update lighting updateLight(); // Update model updateVertices(); + + // Update position -- see #10398 + v3s16 camera_offset = m_env->getCameraOffset(); + setPosition(m_pos*BS - intToFloat(camera_offset, BS)); } void Particle::updateLight() @@ -189,7 +269,7 @@ void Particle::updateLight() light = blend_light(m_env->getDayNightRatio(), LIGHT_SUN, 0); u8 m_light = decode_light(light + m_glow); - m_color.set(255, + m_color.set(m_alpha*255, m_light * m_base_color.getRed() / 255, m_light * m_base_color.getGreen() / 255, m_light * m_base_color.getBlue() / 255); @@ -198,6 +278,12 @@ void Particle::updateLight() void Particle::updateVertices() { f32 tx0, tx1, ty0, ty1; + v2f scale; + + if (m_texture.tex != nullptr) + scale = m_texture.tex -> scale.blend(m_time / (m_expiration+0.1)); + else + scale = v2f(1.f, 1.f); if (m_animation.type != TAT_NONE) { const v2u32 texsize = m_material.getTexture(0)->getSize(); @@ -218,16 +304,24 @@ void Particle::updateVertices() ty1 = m_texpos.Y + m_texsize.Y; } - m_vertices[0] = video::S3DVertex(-m_size / 2, -m_size / 2, + auto half = m_size * .5f, + hx = half * scale.X, + hy = half * scale.Y; + m_vertices[0] = video::S3DVertex(-hx, -hy, 0, 0, 0, 0, m_color, tx0, ty1); - m_vertices[1] = video::S3DVertex(m_size / 2, -m_size / 2, + m_vertices[1] = video::S3DVertex(hx, -hy, 0, 0, 0, 0, m_color, tx1, ty1); - m_vertices[2] = video::S3DVertex(m_size / 2, m_size / 2, + m_vertices[2] = video::S3DVertex(hx, hy, 0, 0, 0, 0, m_color, tx1, ty0); - m_vertices[3] = video::S3DVertex(-m_size / 2, m_size / 2, + m_vertices[3] = video::S3DVertex(-hx, hy, 0, 0, 0, 0, m_color, tx0, ty0); - v3s16 camera_offset = m_env->getCameraOffset(); + + // see #10398 + // v3s16 camera_offset = m_env->getCameraOffset(); + // particle position is now handled by step() + m_box.reset(v3f()); + for (video::S3DVertex &vertex : m_vertices) { if (m_vertical) { v3f ppos = m_player->getPosition()/BS; @@ -238,7 +332,6 @@ void Particle::updateVertices() vertex.Pos.rotateXZBy(m_player->getYaw()); } m_box.addInternalPoint(vertex.Pos); - vertex.Pos += m_pos*BS - intToFloat(camera_offset, BS); } } @@ -251,7 +344,8 @@ ParticleSpawner::ParticleSpawner( LocalPlayer *player, const ParticleSpawnerParameters &p, u16 attached_id, - video::ITexture *texture, + std::unique_ptr<ClientTexture[]>& texpool, + size_t texcount, ParticleManager *p_manager ): m_particlemanager(p_manager), p(p) @@ -259,21 +353,66 @@ ParticleSpawner::ParticleSpawner( m_gamedef = gamedef; m_player = player; m_attached_id = attached_id; - m_texture = texture; + m_texpool = std::move(texpool); + m_texcount = texcount; m_time = 0; + m_active = 0; + m_dying = false; m_spawntimes.reserve(p.amount + 1); for (u16 i = 0; i <= p.amount; i++) { - float spawntime = rand() / (float)RAND_MAX * p.time; + float spawntime = myrand_float() * p.time; m_spawntimes.push_back(spawntime); } + + size_t max_particles = 0; // maximum number of particles likely to be visible at any given time + if (p.time != 0) { + auto maxGenerations = p.time / std::min(p.exptime.start.min, p.exptime.end.min); + max_particles = p.amount / maxGenerations; + } else { + auto longestLife = std::max(p.exptime.start.max, p.exptime.end.max); + max_particles = p.amount * longestLife; + } + + p_manager->reserveParticleSpace(max_particles * 1.2); +} + +namespace { + GenericCAO *findObjectByID(ClientEnvironment *env, u16 id) { + if (id == 0) + return nullptr; + return env->getGenericCAO(id); + } } void ParticleSpawner::spawnParticle(ClientEnvironment *env, float radius, const core::matrix4 *attached_absolute_pos_rot_matrix) { + float fac = 0; + if (p.time != 0) { // ensure safety from divide-by-zeroes + fac = m_time / (p.time+0.1f); + } + + auto r_pos = p.pos.blend(fac); + auto r_vel = p.vel.blend(fac); + auto r_acc = p.acc.blend(fac); + auto r_drag = p.drag.blend(fac); + auto r_radius = p.radius.blend(fac); + auto r_jitter = p.jitter.blend(fac); + auto r_bounce = p.bounce.blend(fac); + v3f attractor_origin = p.attractor_origin.blend(fac); + v3f attractor_direction = p.attractor_direction.blend(fac); + auto attractor_obj = findObjectByID(env, p.attractor_attachment); + auto attractor_direction_obj = findObjectByID(env, p.attractor_direction_attachment); + + auto r_exp = p.exptime.blend(fac); + auto r_size = p.size.blend(fac); + auto r_attract = p.attract.blend(fac); + auto attract = r_attract.pickWithin(); + v3f ppos = m_player->getPosition() / BS; - v3f pos = random_v3f(p.minpos, p.maxpos); + v3f pos = r_pos.pickWithin(); + v3f sphere_radius = r_radius.pickWithin(); // Need to apply this first or the following check // will be wrong for attached spawners @@ -287,15 +426,18 @@ void ParticleSpawner::spawnParticle(ClientEnvironment *env, float radius, pos.Z += camera_offset.Z; } - if (pos.getDistanceFrom(ppos) > radius) + if (pos.getDistanceFromSQ(ppos) > radius*radius) return; // Parameters for the single particle we're about to spawn ParticleParameters pp; pp.pos = pos; - pp.vel = random_v3f(p.minvel, p.maxvel); - pp.acc = random_v3f(p.minacc, p.maxacc); + pp.vel = r_vel.pickWithin(); + pp.acc = r_acc.pickWithin(); + pp.drag = r_drag.pickWithin(); + pp.jitter = r_jitter; + pp.bounce = r_bounce; if (attached_absolute_pos_rot_matrix) { // Apply attachment rotation @@ -303,30 +445,137 @@ void ParticleSpawner::spawnParticle(ClientEnvironment *env, float radius, attached_absolute_pos_rot_matrix->rotateVect(pp.acc); } - pp.expirationtime = random_f32(p.minexptime, p.maxexptime); + if (attractor_obj) + attractor_origin += attractor_obj->getPosition() / BS; + if (attractor_direction_obj) { + auto *attractor_absolute_pos_rot_matrix = attractor_direction_obj->getAbsolutePosRotMatrix(); + if (attractor_absolute_pos_rot_matrix) + attractor_absolute_pos_rot_matrix->rotateVect(attractor_direction); + } + + pp.expirationtime = r_exp.pickWithin(); + + if (sphere_radius != v3f()) { + f32 l = sphere_radius.getLength(); + v3f mag = sphere_radius; + mag.normalize(); + + v3f ofs = v3f(l,0,0); + ofs.rotateXZBy(myrand_range(0.f,360.f)); + ofs.rotateYZBy(myrand_range(0.f,360.f)); + ofs.rotateXYBy(myrand_range(0.f,360.f)); + + pp.pos += ofs * mag; + } + + if (p.attractor_kind != ParticleParamTypes::AttractorKind::none && attract != 0) { + v3f dir; + f32 dist = 0; /* =0 necessary to silence warning */ + switch (p.attractor_kind) { + case ParticleParamTypes::AttractorKind::none: + break; + + case ParticleParamTypes::AttractorKind::point: { + dist = pp.pos.getDistanceFrom(attractor_origin); + dir = pp.pos - attractor_origin; + dir.normalize(); + break; + } + + case ParticleParamTypes::AttractorKind::line: { + // https://github.com/minetest/minetest/issues/11505#issuecomment-915612700 + const auto& lorigin = attractor_origin; + v3f ldir = attractor_direction; + ldir.normalize(); + auto origin_to_point = pp.pos - lorigin; + auto scalar_projection = origin_to_point.dotProduct(ldir); + auto point_on_line = lorigin + (ldir * scalar_projection); + + dist = pp.pos.getDistanceFrom(point_on_line); + dir = (point_on_line - pp.pos); + dir.normalize(); + dir *= -1; // flip it around so strength=1 attracts, not repulses + break; + } + + case ParticleParamTypes::AttractorKind::plane: { + // https://github.com/minetest/minetest/issues/11505#issuecomment-915612700 + const v3f& porigin = attractor_origin; + v3f normal = attractor_direction; + normal.normalize(); + v3f point_to_origin = porigin - pp.pos; + f32 factor = normal.dotProduct(point_to_origin); + if (numericAbsolute(factor) == 0.0f) { + dir = normal; + } else { + factor = numericSign(factor); + dir = normal * factor; + } + dist = numericAbsolute(normal.dotProduct(pp.pos - porigin)); + dir *= -1; // flip it around so strength=1 attracts, not repulses + break; + } + } + + f32 speedTowards = numericAbsolute(attract) * dist; + v3f avel = dir * speedTowards; + if (attract > 0 && speedTowards > 0) { + avel *= -1; + if (p.attractor_kill) { + // make sure the particle dies after crossing the attractor threshold + f32 timeToCenter = dist / speedTowards; + if (timeToCenter < pp.expirationtime) + pp.expirationtime = timeToCenter; + } + } + pp.vel += avel; + } + p.copyCommon(pp); - video::ITexture *texture; + ClientTexRef texture; v2f texpos, texsize; video::SColor color(0xFFFFFFFF); if (p.node.getContent() != CONTENT_IGNORE) { const ContentFeatures &f = m_particlemanager->m_env->getGameDef()->ndef()->get(p.node); - if (!ParticleManager::getNodeParticleParams(p.node, f, pp, &texture, + if (!ParticleManager::getNodeParticleParams(p.node, f, pp, &texture.ref, texpos, texsize, &color, p.node_tile)) return; } else { - texture = m_texture; + if (m_texcount == 0) + return; + texture = decltype(texture)(m_texpool[m_texcount == 1 ? 0 : myrand_range(0,m_texcount-1)]); texpos = v2f(0.0f, 0.0f); texsize = v2f(1.0f, 1.0f); + if (texture.tex->animated) + pp.animation = texture.tex->animation; + } + + // synchronize animation length with particle life if desired + if (pp.animation.type != TAT_NONE) { + if (pp.animation.type == TAT_VERTICAL_FRAMES && + pp.animation.vertical_frames.length < 0) { + auto& a = pp.animation.vertical_frames; + // we add a tiny extra value to prevent the first frame + // from flickering back on just before the particle dies + a.length = (pp.expirationtime / -a.length) + 0.1; + } else if (pp.animation.type == TAT_SHEET_2D && + pp.animation.sheet_2d.frame_length < 0) { + auto& a = pp.animation.sheet_2d; + auto frames = a.frames_w * a.frames_h; + auto runtime = (pp.expirationtime / -a.frame_length) + 0.1; + pp.animation.sheet_2d.frame_length = frames / runtime; + } } // Allow keeping default random size - if (p.maxsize > 0.0f) - pp.size = random_f32(p.minsize, p.maxsize); + if (p.size.start.max > 0.0f || p.size.end.max > 0.0f) + pp.size = r_size.pickWithin(); - m_particlemanager->addParticle(new Particle( + ++m_active; + auto pa = new Particle( m_gamedef, m_player, env, @@ -335,7 +584,9 @@ void ParticleSpawner::spawnParticle(ClientEnvironment *env, float radius, texpos, texsize, color - )); + ); + pa->m_parent = this; + m_particlemanager->addParticle(pa); } void ParticleSpawner::step(float dtime, ClientEnvironment *env) @@ -348,7 +599,7 @@ void ParticleSpawner::step(float dtime, ClientEnvironment *env) bool unloaded = false; const core::matrix4 *attached_absolute_pos_rot_matrix = nullptr; if (m_attached_id) { - if (GenericCAO *attached = dynamic_cast<GenericCAO *>(env->getActiveObject(m_attached_id))) { + if (GenericCAO *attached = env->getGenericCAO(m_attached_id)) { attached_absolute_pos_rot_matrix = attached->getAbsolutePosRotMatrix(); } else { unloaded = true; @@ -379,7 +630,7 @@ void ParticleSpawner::step(float dtime, ClientEnvironment *env) return; for (int i = 0; i <= p.amount; i++) { - if (rand() / (float)RAND_MAX < dtime) + if (myrand_float() < dtime) spawnParticle(env, radius, attached_absolute_pos_rot_matrix); } } @@ -408,9 +659,15 @@ void ParticleManager::stepSpawners(float dtime) { MutexAutoLock lock(m_spawner_list_lock); for (auto i = m_particle_spawners.begin(); i != m_particle_spawners.end();) { - if (i->second->get_expired()) { - delete i->second; - m_particle_spawners.erase(i++); + if (i->second->getExpired()) { + // the particlespawner owns the textures, so we need to make + // sure there are no active particles before we free it + if (i->second->m_active == 0) { + delete i->second; + m_particle_spawners.erase(i++); + } else { + ++i; + } } else { i->second->step(dtime, m_env); ++i; @@ -423,6 +680,10 @@ void ParticleManager::stepParticles(float dtime) MutexAutoLock lock(m_particle_list_lock); for (auto i = m_particles.begin(); i != m_particles.end();) { if ((*i)->get_expired()) { + if ((*i)->m_parent) { + assert((*i)->m_parent->m_active != 0); + --(*i)->m_parent->m_active; + } (*i)->remove(); delete *i; i = m_particles.erase(i); @@ -464,13 +725,29 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, const ParticleSpawnerParameters &p = *event->add_particlespawner.p; - video::ITexture *texture = - client->tsrc()->getTextureForMesh(p.texture); + // texture pool + std::unique_ptr<ClientTexture[]> texpool = nullptr; + size_t txpsz = 0; + if (!p.texpool.empty()) { + txpsz = p.texpool.size(); + texpool = decltype(texpool)(new ClientTexture [txpsz]); + + for (size_t i = 0; i < txpsz; ++i) { + texpool[i] = ClientTexture(p.texpool[i], client->tsrc()); + } + } else { + // no texpool in use, use fallback texture + txpsz = 1; + texpool = decltype(texpool)(new ClientTexture[1] { + ClientTexture(p.texture, client->tsrc()) + }); + } auto toadd = new ParticleSpawner(client, player, p, event->add_particlespawner.attached_id, - texture, + texpool, + txpsz, this); addParticleSpawner(event->add_particlespawner.id, toadd); @@ -481,7 +758,7 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, case CE_SPAWN_PARTICLE: { ParticleParameters &p = *event->spawn_particle; - video::ITexture *texture; + ClientTexRef texture; v2f texpos, texsize; video::SColor color(0xFFFFFFFF); @@ -489,11 +766,15 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, if (p.node.getContent() != CONTENT_IGNORE) { const ContentFeatures &f = m_env->getGameDef()->ndef()->get(p.node); - if (!getNodeParticleParams(p.node, f, p, &texture, texpos, - texsize, &color, p.node_tile)) - texture = nullptr; + getNodeParticleParams(p.node, f, p, &texture.ref, texpos, + texsize, &color, p.node_tile); } else { - texture = client->tsrc()->getTextureForMesh(p.texture); + /* with no particlespawner to own the texture, we need + * to save it on the heap. it will be freed when the + * particle is destroyed */ + auto texstore = new ClientTexture(p.texture, client->tsrc()); + + texture = ClientTexRef(*texstore); texpos = v2f(0.0f, 0.0f); texsize = v2f(1.0f, 1.0f); } @@ -502,7 +783,7 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, Client *client, if (oldsize > 0.0f) p.size = oldsize; - if (texture) { + if (texture.ref) { Particle *toadd = new Particle(client, player, m_env, p, texture, texpos, texsize, color); @@ -529,7 +810,7 @@ bool ParticleManager::getNodeParticleParams(const MapNode &n, if (tilenum > 0 && tilenum <= 6) texid = tilenum - 1; else - texid = rand() % 6; + texid = myrand_range(0,5); const TileLayer &tile = f.tiles[texid].layers[0]; p.animation.type = TAT_NONE; @@ -539,13 +820,13 @@ bool ParticleManager::getNodeParticleParams(const MapNode &n, else *texture = tile.texture; - float size = (rand() % 8) / 64.0f; + float size = (myrand_range(0,8)) / 64.0f; p.size = BS * size; if (tile.scale) size /= tile.scale; texsize = v2f(size * 2.0f, size * 2.0f); - texpos.X = (rand() % 64) / 64.0f - texsize.X; - texpos.Y = (rand() % 64) / 64.0f - texsize.Y; + texpos.X = (myrand_range(0,64)) / 64.0f - texsize.X; + texpos.Y = (myrand_range(0,64)) / 64.0f - texsize.Y; if (tile.has_color) *color = tile.color; @@ -577,30 +858,30 @@ void ParticleManager::addNodeParticle(IGameDef *gamedef, LocalPlayer *player, v3s16 pos, const MapNode &n, const ContentFeatures &f) { ParticleParameters p; - video::ITexture *texture; + video::ITexture *ref = nullptr; v2f texpos, texsize; video::SColor color; - if (!getNodeParticleParams(n, f, p, &texture, texpos, texsize, &color)) + if (!getNodeParticleParams(n, f, p, &ref, texpos, texsize, &color)) return; - p.expirationtime = (rand() % 100) / 100.0f; + p.expirationtime = myrand_range(0, 100) / 100.0f; // Physics p.vel = v3f( - (rand() % 150) / 50.0f - 1.5f, - (rand() % 150) / 50.0f, - (rand() % 150) / 50.0f - 1.5f + myrand_range(-1.5f,1.5f), + myrand_range(0.f,3.f), + myrand_range(-1.5f,1.5f) ); p.acc = v3f( 0.0f, - -player->movement_gravity * player->physics_override_gravity / BS, + -player->movement_gravity * player->physics_override.gravity / BS, 0.0f ); p.pos = v3f( - (f32)pos.X + (rand() % 100) / 200.0f - 0.25f, - (f32)pos.Y + (rand() % 100) / 200.0f - 0.25f, - (f32)pos.Z + (rand() % 100) / 200.0f - 0.25f + (f32)pos.X + myrand_range(0.f, .5f) - .25f, + (f32)pos.Y + myrand_range(0.f, .5f) - .25f, + (f32)pos.Z + myrand_range(0.f, .5f) - .25f ); Particle *toadd = new Particle( @@ -608,7 +889,7 @@ void ParticleManager::addNodeParticle(IGameDef *gamedef, player, m_env, p, - texture, + ClientTexRef(ref), texpos, texsize, color); @@ -616,6 +897,12 @@ void ParticleManager::addNodeParticle(IGameDef *gamedef, addParticle(toadd); } +void ParticleManager::reserveParticleSpace(size_t max_estimate) +{ + MutexAutoLock lock(m_particle_list_lock); + m_particles.reserve(m_particles.size() + max_estimate); +} + void ParticleManager::addParticle(Particle *toadd) { MutexAutoLock lock(m_particle_list_lock); @@ -634,7 +921,6 @@ void ParticleManager::deleteParticleSpawner(u64 id) MutexAutoLock lock(m_spawner_list_lock); auto it = m_particle_spawners.find(id); if (it != m_particle_spawners.end()) { - delete it->second; - m_particle_spawners.erase(it); + it->second->setDying(); } } diff --git a/src/client/particles.h b/src/client/particles.h index 2011f0262..0818b796b 100644 --- a/src/client/particles.h +++ b/src/client/particles.h @@ -31,20 +31,51 @@ class ClientEnvironment; struct MapNode; struct ContentFeatures; +struct ClientTexture +{ + /* per-spawner structure used to store the ParticleTexture structs + * that spawned particles will refer to through ClientTexRef */ + ParticleTexture tex; + video::ITexture *ref = nullptr; + + ClientTexture() = default; + ClientTexture(const ServerParticleTexture& p, ITextureSource *t): + tex(p), + ref(t->getTextureForMesh(p.string)) {}; +}; + +struct ClientTexRef +{ + /* per-particle structure used to avoid massively duplicating the + * fairly large ParticleTexture struct */ + ParticleTexture* tex = nullptr; + video::ITexture* ref = nullptr; + ClientTexRef() = default; + + /* constructor used by particles spawned from a spawner */ + ClientTexRef(ClientTexture& t): + tex(&t.tex), ref(t.ref) {}; + + /* constructor used for node particles */ + ClientTexRef(decltype(ref) tp): ref(tp) {}; +}; + +class ParticleSpawner; + class Particle : public scene::ISceneNode { - public: +public: Particle( - IGameDef* gamedef, + IGameDef *gamedef, LocalPlayer *player, ClientEnvironment *env, const ParticleParameters &p, - video::ITexture *texture, + const ClientTexRef &texture, v2f texpos, v2f texsize, video::SColor color ); - ~Particle() = default; + ~Particle(); virtual const aabb3f &getBoundingBox() const { @@ -69,9 +100,12 @@ class Particle : public scene::ISceneNode bool get_expired () { return m_expiration < m_time; } + ParticleSpawner *m_parent; + private: void updateLight(); void updateVertices(); + void setVertexAlpha(float a); video::S3DVertex m_vertices[4]; float m_time = 0.0f; @@ -81,14 +115,19 @@ private: IGameDef *m_gamedef; aabb3f m_box; aabb3f m_collisionbox; + ClientTexRef m_texture; video::SMaterial m_material; v2f m_texpos; v2f m_texsize; v3f m_pos; v3f m_velocity; v3f m_acceleration; + v3f m_drag; + ParticleParamTypes::v3fRange m_jitter; + ParticleParamTypes::f32Range m_bounce; LocalPlayer *m_player; float m_size; + //! Color without lighting video::SColor m_base_color; //! Final rendered color @@ -102,24 +141,27 @@ private: float m_animation_time = 0.0f; int m_animation_frame = 0; u8 m_glow; + float m_alpha = 0.0f; }; class ParticleSpawner { public: - ParticleSpawner(IGameDef* gamedef, + ParticleSpawner(IGameDef *gamedef, LocalPlayer *player, const ParticleSpawnerParameters &p, u16 attached_id, - video::ITexture *texture, + std::unique_ptr<ClientTexture[]> &texpool, + size_t texcount, ParticleManager* p_manager); - ~ParticleSpawner() = default; - void step(float dtime, ClientEnvironment *env); - bool get_expired () - { return p.amount <= 0 && p.time != 0; } + size_t m_active; + + bool getExpired() const + { return m_dying || (p.amount <= 0 && p.time != 0); } + void setDying() { m_dying = true; } private: void spawnParticle(ClientEnvironment *env, float radius, @@ -127,10 +169,12 @@ private: ParticleManager *m_particlemanager; float m_time; + bool m_dying; IGameDef *m_gamedef; LocalPlayer *m_player; ParticleSpawnerParameters p; - video::ITexture *m_texture; + std::unique_ptr<ClientTexture[]> m_texpool; + size_t m_texcount; std::vector<float> m_spawntimes; u16 m_attached_id; }; @@ -156,6 +200,8 @@ public: void addNodeParticle(IGameDef *gamedef, LocalPlayer *player, v3s16 pos, const MapNode &n, const ContentFeatures &f); + void reserveParticleSpace(size_t max_estimate); + /** * This function is only used by client particle spawners * diff --git a/src/client/render/anaglyph.cpp b/src/client/render/anaglyph.cpp index 9ba4464a2..2571f7333 100644 --- a/src/client/render/anaglyph.cpp +++ b/src/client/render/anaglyph.cpp @@ -30,6 +30,7 @@ void RenderingCoreAnaglyph::drawAll() void RenderingCoreAnaglyph::setupMaterial(int color_mask) { video::SOverrideMaterial &mat = driver->getOverrideMaterial(); + mat.reset(); mat.Material.ColorMask = color_mask; mat.EnableFlags = video::EMF_COLOR_MASK; mat.EnablePasses = scene::ESNRP_SKY_BOX | scene::ESNRP_SOLID | @@ -40,7 +41,7 @@ void RenderingCoreAnaglyph::setupMaterial(int color_mask) void RenderingCoreAnaglyph::useEye(bool right) { RenderingCoreStereo::useEye(right); - driver->clearZBuffer(); + driver->clearBuffers(video::ECBF_DEPTH); setupMaterial(right ? video::ECP_GREEN | video::ECP_BLUE : video::ECP_RED); } diff --git a/src/client/render/core.cpp b/src/client/render/core.cpp index 92a7137ea..ca5d3c614 100644 --- a/src/client/render/core.cpp +++ b/src/client/render/core.cpp @@ -24,25 +24,42 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/clientmap.h" #include "client/hud.h" #include "client/minimap.h" +#include "client/shadows/dynamicshadowsrender.h" RenderingCore::RenderingCore(IrrlichtDevice *_device, Client *_client, Hud *_hud) : device(_device), driver(device->getVideoDriver()), smgr(device->getSceneManager()), guienv(device->getGUIEnvironment()), client(_client), camera(client->getCamera()), - mapper(client->getMinimap()), hud(_hud) + mapper(client->getMinimap()), hud(_hud), + shadow_renderer(nullptr) { screensize = driver->getScreenSize(); virtual_size = screensize; + + // disable if unsupported + if (g_settings->getBool("enable_dynamic_shadows") && ( + g_settings->get("video_driver") != "opengl" || + !g_settings->getBool("enable_shaders"))) { + g_settings->setBool("enable_dynamic_shadows", false); + } + + if (g_settings->getBool("enable_shaders") && + g_settings->getBool("enable_dynamic_shadows")) { + shadow_renderer = new ShadowRenderer(device, client); + } } RenderingCore::~RenderingCore() { clearTextures(); + delete shadow_renderer; } void RenderingCore::initialize() { // have to be called late as the VMT is not ready in the constructor: initTextures(); + if (shadow_renderer) + shadow_renderer->initialize(); } void RenderingCore::updateScreenSize() @@ -66,6 +83,12 @@ void RenderingCore::draw(video::SColor _skycolor, bool _show_hud, bool _show_min draw_wield_tool = _draw_wield_tool; draw_crosshair = _draw_crosshair; + if (shadow_renderer) { + // This is necessary to render shadows for animations correctly + smgr->getRootSceneNode()->OnAnimate(device->getTimer()->getTime()); + shadow_renderer->update(); + } + beforeDraw(); drawAll(); } @@ -73,9 +96,13 @@ void RenderingCore::draw(video::SColor _skycolor, bool _show_hud, bool _show_min void RenderingCore::draw3D() { smgr->drawAll(); + if (shadow_renderer) + shadow_renderer->drawDebug(); + driver->setTransform(video::ETS_WORLD, core::IdentityMatrix); if (!show_hud) return; + hud->drawBlockBounds(); hud->drawSelectionMesh(); if (draw_wield_tool) camera->drawWieldedTool(); @@ -86,7 +113,7 @@ void RenderingCore::drawHUD() if (show_hud) { if (draw_crosshair) hud->drawCrosshair(); - + hud->drawHotbar(client->getEnv().getLocalPlayer()->getWieldIndex()); hud->drawLuaElements(camera->getOffset()); camera->drawNametags(); diff --git a/src/client/render/core.h b/src/client/render/core.h index 52ea8f99f..cabfbbfad 100644 --- a/src/client/render/core.h +++ b/src/client/render/core.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include "irrlichttypes_extrabloated.h" +class ShadowRenderer; class Camera; class Client; class Hud; @@ -47,6 +48,8 @@ protected: Minimap *mapper; Hud *hud; + ShadowRenderer *shadow_renderer; + void updateScreenSize(); virtual void initTextures() {} virtual void clearTextures() {} @@ -72,4 +75,6 @@ public: bool _draw_wield_tool, bool _draw_crosshair); inline v2u32 getVirtualSize() const { return virtual_size; } + + ShadowRenderer *get_shadow_renderer() { return shadow_renderer; }; }; diff --git a/src/client/render/factory.cpp b/src/client/render/factory.cpp index 30f9480fc..7fcec40dd 100644 --- a/src/client/render/factory.cpp +++ b/src/client/render/factory.cpp @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "factory.h" -#include <stdexcept> +#include "log.h" #include "plain.h" #include "anaglyph.h" #include "interlaced.h" @@ -45,5 +45,8 @@ RenderingCore *createRenderingCore(const std::string &stereo_mode, IrrlichtDevic return new RenderingCoreSideBySide(device, client, hud, true); if (stereo_mode == "crossview") return new RenderingCoreSideBySide(device, client, hud, false, true); - throw std::invalid_argument("Invalid rendering mode: " + stereo_mode); + + // fallback to plain renderer + errorstream << "Invalid rendering mode: " << stereo_mode << std::endl; + return new RenderingCorePlain(device, client, hud); } diff --git a/src/client/render/interlaced.cpp b/src/client/render/interlaced.cpp index 2aadadc17..3f79a8eb5 100644 --- a/src/client/render/interlaced.cpp +++ b/src/client/render/interlaced.cpp @@ -35,8 +35,12 @@ void RenderingCoreInterlaced::initMaterial() IShaderSource *s = client->getShaderSource(); mat.UseMipMaps = false; mat.ZBuffer = false; +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + mat.ZWriteEnable = video::EZW_OFF; +#else mat.ZWriteEnable = false; - u32 shader = s->getShader("3d_interlaced_merge", TILE_MATERIAL_BASIC, 0); +#endif + u32 shader = s->getShader("3d_interlaced_merge", TILE_MATERIAL_BASIC); mat.MaterialType = s->getShaderInfo(shader).material; for (int k = 0; k < 3; ++k) { mat.TextureLayer[k].AnisotropicFilter = false; diff --git a/src/client/render/stereo.cpp b/src/client/render/stereo.cpp index 967b5a78f..0f54e166e 100644 --- a/src/client/render/stereo.cpp +++ b/src/client/render/stereo.cpp @@ -27,7 +27,7 @@ RenderingCoreStereo::RenderingCoreStereo( IrrlichtDevice *_device, Client *_client, Hud *_hud) : RenderingCore(_device, _client, _hud) { - eye_offset = BS * g_settings->getFloat("3d_paralax_strength"); + eye_offset = BS * g_settings->getFloat("3d_paralax_strength", -0.087f, 0.087f); } void RenderingCoreStereo::beforeDraw() diff --git a/src/client/renderingengine.cpp b/src/client/renderingengine.cpp index f5aca8f58..9698b63bb 100644 --- a/src/client/renderingengine.cpp +++ b/src/client/renderingengine.cpp @@ -19,7 +19,6 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include <IrrlichtDevice.h> -#include <irrlicht.h> #include "fontengine.h" #include "client.h" #include "clouds.h" @@ -87,12 +86,15 @@ RenderingEngine::RenderingEngine(IEventReceiver *receiver) // Resolution selection bool fullscreen = g_settings->getBool("fullscreen"); - u16 screen_w = g_settings->getU16("screen_w"); - u16 screen_h = g_settings->getU16("screen_h"); +#ifdef __ANDROID__ + u16 screen_w = 0, screen_h = 0; +#else + u16 screen_w = std::max<u16>(g_settings->getU16("screen_w"), 1); + u16 screen_h = std::max<u16>(g_settings->getU16("screen_h"), 1); +#endif // bpp, fsaa, vsync bool vsync = g_settings->getBool("vsync"); - u16 bits = g_settings->getU16("fullscreen_bpp"); u16 fsaa = g_settings->getU16("fsaa"); // stereo buffer required for pageflip stereo @@ -106,7 +108,7 @@ RenderingEngine::RenderingEngine(IEventReceiver *receiver) u32 i; for (i = 0; i != drivers.size(); i++) { if (!strcasecmp(driverstring.c_str(), - RenderingEngine::getVideoDriverName(drivers[i]))) { + RenderingEngine::getVideoDriverInfo(drivers[i]).name.c_str())) { driverType = drivers[i]; break; } @@ -118,17 +120,17 @@ RenderingEngine::RenderingEngine(IEventReceiver *receiver) } SIrrlichtCreationParameters params = SIrrlichtCreationParameters(); + if (tracestream) + params.LoggingLevel = irr::ELL_DEBUG; params.DriverType = driverType; params.WindowSize = core::dimension2d<u32>(screen_w, screen_h); - params.Bits = bits; params.AntiAlias = fsaa; params.Fullscreen = fullscreen; params.Stencilbuffer = false; params.Stereobuffer = stereo_buffer; params.Vsync = vsync; params.EventReceiver = receiver; - params.HighPrecisionFPU = g_settings->getBool("high_precision_fpu"); - params.ZBufferBits = 24; + params.HighPrecisionFPU = true; #ifdef __ANDROID__ params.PrivateData = porting::app_global; #endif @@ -153,11 +155,11 @@ RenderingEngine::RenderingEngine(IEventReceiver *receiver) RenderingEngine::~RenderingEngine() { core.reset(); - m_device->drop(); + m_device->closeDevice(); s_singleton = nullptr; } -v2u32 RenderingEngine::getWindowSize() const +v2u32 RenderingEngine::_getWindowSize() const { if (core) return core->getVirtualSize(); @@ -169,58 +171,18 @@ void RenderingEngine::setResizable(bool resize) m_device->setResizable(resize); } -bool RenderingEngine::print_video_modes() +void RenderingEngine::removeMesh(const scene::IMesh* mesh) { - IrrlichtDevice *nulldevice; + m_device->getSceneManager()->getMeshCache()->removeMesh(mesh); +} - bool vsync = g_settings->getBool("vsync"); - u16 fsaa = g_settings->getU16("fsaa"); - MyEventReceiver *receiver = new MyEventReceiver(); - - SIrrlichtCreationParameters params = SIrrlichtCreationParameters(); - params.DriverType = video::EDT_NULL; - params.WindowSize = core::dimension2d<u32>(640, 480); - params.Bits = 24; - params.AntiAlias = fsaa; - params.Fullscreen = false; - params.Stencilbuffer = false; - params.Vsync = vsync; - params.EventReceiver = receiver; - params.HighPrecisionFPU = g_settings->getBool("high_precision_fpu"); - - nulldevice = createDeviceEx(params); - - if (!nulldevice) { - delete receiver; - return false; +void RenderingEngine::cleanupMeshCache() +{ + auto mesh_cache = m_device->getSceneManager()->getMeshCache(); + while (mesh_cache->getMeshCount() != 0) { + if (scene::IAnimatedMesh *mesh = mesh_cache->getMeshByIndex(0)) + mesh_cache->removeMesh(mesh); } - - std::cout << _("Available video modes (WxHxD):") << std::endl; - - video::IVideoModeList *videomode_list = nulldevice->getVideoModeList(); - - if (videomode_list != NULL) { - s32 videomode_count = videomode_list->getVideoModeCount(); - core::dimension2d<u32> videomode_res; - s32 videomode_depth; - for (s32 i = 0; i < videomode_count; ++i) { - videomode_res = videomode_list->getVideoModeResolution(i); - videomode_depth = videomode_list->getVideoModeDepth(i); - std::cout << videomode_res.Width << "x" << videomode_res.Height - << "x" << videomode_depth << std::endl; - } - - std::cout << _("Active video mode (WxHxD):") << std::endl; - videomode_res = videomode_list->getDesktopResolution(); - videomode_depth = videomode_list->getDesktopDepth(); - std::cout << videomode_res.Width << "x" << videomode_res.Height << "x" - << videomode_depth << std::endl; - } - - nulldevice->drop(); - delete receiver; - - return videomode_list != NULL; } bool RenderingEngine::setupTopLevelWindow(const std::string &name) @@ -294,7 +256,7 @@ void RenderingEngine::setupTopLevelXorgWindow(const std::string &name) // force a shutdown of an application if it doesn't respond to the destroy // window message. - verbosestream << "Client: Setting Xorg _NET_WM_PID extened window manager property" + verbosestream << "Client: Setting Xorg _NET_WM_PID extended window manager property" << std::endl; Atom NET_WM_PID = XInternAtom(x11_dpl, "_NET_WM_PID", false); @@ -325,12 +287,10 @@ static bool getWindowHandle(irr::video::IVideoDriver *driver, HWND &hWnd) const video::SExposedVideoData exposedData = driver->getExposedVideoData(); switch (driver->getDriverType()) { - case video::EDT_DIRECT3D8: - hWnd = reinterpret_cast<HWND>(exposedData.D3D8.HWnd); - break; - case video::EDT_DIRECT3D9: - hWnd = reinterpret_cast<HWND>(exposedData.D3D9.HWnd); - break; +#if ENABLE_GLES + case video::EDT_OGLES1: + case video::EDT_OGLES2: +#endif case video::EDT_OPENGL: hWnd = reinterpret_cast<HWND>(exposedData.OpenGLWin32.HWnd); break; @@ -471,11 +431,11 @@ bool RenderingEngine::setXorgWindowIconFromPath(const std::string &icon_file) Text will be removed when the screen is drawn the next time. Additionally, a progressbar can be drawn when percent is set between 0 and 100. */ -void RenderingEngine::_draw_load_screen(const std::wstring &text, +void RenderingEngine::draw_load_screen(const std::wstring &text, gui::IGUIEnvironment *guienv, ITextureSource *tsrc, float dtime, int percent, bool clouds) { - v2u32 screensize = RenderingEngine::get_instance()->getWindowSize(); + v2u32 screensize = getWindowSize(); v2s32 textsize(g_fontengine->getTextWidth(text), g_fontengine->getLineHeight()); v2s32 center(screensize.X / 2, screensize.Y / 2); @@ -543,7 +503,7 @@ void RenderingEngine::_draw_load_screen(const std::wstring &text, /* Draws the menu scene including (optional) cloud background. */ -void RenderingEngine::_draw_menu_scene(gui::IGUIEnvironment *guienv, +void RenderingEngine::draw_menu_scene(gui::IGUIEnvironment *guienv, float dtime, bool clouds) { bool cloud_menu_background = clouds && g_settings->getBool("menu_clouds"); @@ -560,85 +520,53 @@ void RenderingEngine::_draw_menu_scene(gui::IGUIEnvironment *guienv, get_video_driver()->endScene(); } -std::vector<core::vector3d<u32>> RenderingEngine::getSupportedVideoModes() -{ - IrrlichtDevice *nulldevice = createDevice(video::EDT_NULL); - sanity_check(nulldevice); - - std::vector<core::vector3d<u32>> mlist; - video::IVideoModeList *modelist = nulldevice->getVideoModeList(); - - s32 num_modes = modelist->getVideoModeCount(); - for (s32 i = 0; i != num_modes; i++) { - core::dimension2d<u32> mode_res = modelist->getVideoModeResolution(i); - u32 mode_depth = (u32)modelist->getVideoModeDepth(i); - mlist.emplace_back(mode_res.Width, mode_res.Height, mode_depth); - } - - nulldevice->drop(); - return mlist; -} - std::vector<irr::video::E_DRIVER_TYPE> RenderingEngine::getSupportedVideoDrivers() { + // Only check these drivers. + // We do not support software and D3D in any capacity. + static const irr::video::E_DRIVER_TYPE glDrivers[4] = { + irr::video::EDT_NULL, + irr::video::EDT_OPENGL, + irr::video::EDT_OGLES1, + irr::video::EDT_OGLES2, + }; std::vector<irr::video::E_DRIVER_TYPE> drivers; - for (int i = 0; i != irr::video::EDT_COUNT; i++) { - if (irr::IrrlichtDevice::isDriverSupported((irr::video::E_DRIVER_TYPE)i)) - drivers.push_back((irr::video::E_DRIVER_TYPE)i); + for (int i = 0; i < 4; i++) { + if (irr::IrrlichtDevice::isDriverSupported(glDrivers[i])) + drivers.push_back(glDrivers[i]); } return drivers; } -void RenderingEngine::_initialize(Client *client, Hud *hud) +void RenderingEngine::initialize(Client *client, Hud *hud) { const std::string &draw_mode = g_settings->get("3d_mode"); core.reset(createRenderingCore(draw_mode, m_device, client, hud)); core->initialize(); } -void RenderingEngine::_finalize() +void RenderingEngine::finalize() { core.reset(); } -void RenderingEngine::_draw_scene(video::SColor skycolor, bool show_hud, +void RenderingEngine::draw_scene(video::SColor skycolor, bool show_hud, bool show_minimap, bool draw_wield_tool, bool draw_crosshair) { core->draw(skycolor, show_hud, show_minimap, draw_wield_tool, draw_crosshair); } -const char *RenderingEngine::getVideoDriverName(irr::video::E_DRIVER_TYPE type) +const VideoDriverInfo &RenderingEngine::getVideoDriverInfo(irr::video::E_DRIVER_TYPE type) { - static const char *driver_ids[] = { - "null", - "software", - "burningsvideo", - "direct3d8", - "direct3d9", - "opengl", - "ogles1", - "ogles2", + static const std::unordered_map<int, VideoDriverInfo> driver_info_map = { + {(int)video::EDT_NULL, {"null", "NULL Driver"}}, + {(int)video::EDT_OPENGL, {"opengl", "OpenGL"}}, + {(int)video::EDT_OGLES1, {"ogles1", "OpenGL ES1"}}, + {(int)video::EDT_OGLES2, {"ogles2", "OpenGL ES2"}}, }; - - return driver_ids[type]; -} - -const char *RenderingEngine::getVideoDriverFriendlyName(irr::video::E_DRIVER_TYPE type) -{ - static const char *driver_names[] = { - "NULL Driver", - "Software Renderer", - "Burning's Video", - "Direct3D 8", - "Direct3D 9", - "OpenGL", - "OpenGL ES1", - "OpenGL ES2", - }; - - return driver_names[type]; + return driver_info_map.at((int)type); } #ifndef __ANDROID__ @@ -674,7 +602,7 @@ static float calcDisplayDensity() float RenderingEngine::getDisplayDensity() { static float cached_display_density = calcDisplayDensity(); - return cached_display_density; + return std::max(cached_display_density * g_settings->getFloat("display_density_factor"), 0.5f); } #elif defined(_WIN32) @@ -702,37 +630,23 @@ float RenderingEngine::getDisplayDensity() display_density = calcDisplayDensity(get_video_driver()); cached = true; } - return display_density; + return std::max(display_density * g_settings->getFloat("display_density_factor"), 0.5f); } #else float RenderingEngine::getDisplayDensity() { - return g_settings->getFloat("screen_dpi") / 96.0; + return std::max(g_settings->getFloat("screen_dpi") / 96.0f * + g_settings->getFloat("display_density_factor"), 0.5f); } #endif -v2u32 RenderingEngine::getDisplaySize() -{ - IrrlichtDevice *nulldevice = createDevice(video::EDT_NULL); - - core::dimension2d<u32> deskres = - nulldevice->getVideoModeList()->getDesktopResolution(); - nulldevice->drop(); - - return deskres; -} - #else // __ANDROID__ float RenderingEngine::getDisplayDensity() { return porting::getDisplayDensity(); } -v2u32 RenderingEngine::getDisplaySize() -{ - return porting::getDisplaySize(); -} #endif // __ANDROID__ diff --git a/src/client/renderingengine.h b/src/client/renderingengine.h index 34cc60630..38420010f 100644 --- a/src/client/renderingengine.h +++ b/src/client/renderingengine.h @@ -25,6 +25,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <string> #include "irrlichttypes_extrabloated.h" #include "debug.h" +#include "client/render/core.h" +// include the shadow mapper classes too +#include "client/shadows/dynamicshadowsrender.h" + +struct VideoDriverInfo { + std::string name; + std::string friendly_name; +}; class ITextureSource; class Camera; @@ -41,28 +49,31 @@ public: RenderingEngine(IEventReceiver *eventReceiver); ~RenderingEngine(); - v2u32 getWindowSize() const; void setResizable(bool resize); video::IVideoDriver *getVideoDriver() { return driver; } - static const char *getVideoDriverName(irr::video::E_DRIVER_TYPE type); - static const char *getVideoDriverFriendlyName(irr::video::E_DRIVER_TYPE type); + static const VideoDriverInfo &getVideoDriverInfo(irr::video::E_DRIVER_TYPE type); static float getDisplayDensity(); - static v2u32 getDisplaySize(); bool setupTopLevelWindow(const std::string &name); void setupTopLevelXorgWindow(const std::string &name); bool setWindowIcon(); bool setXorgWindowIconFromPath(const std::string &icon_file); static bool print_video_modes(); + void cleanupMeshCache(); - static RenderingEngine *get_instance() { return s_singleton; } + void removeMesh(const scene::IMesh* mesh); - static io::IFileSystem *get_filesystem() + static v2u32 getWindowSize() { - sanity_check(s_singleton && s_singleton->m_device); - return s_singleton->m_device->getFileSystem(); + sanity_check(s_singleton); + return s_singleton->_getWindowSize(); + } + + io::IFileSystem *get_filesystem() + { + return m_device->getFileSystem(); } static video::IVideoDriver *get_video_driver() @@ -71,16 +82,9 @@ public: return s_singleton->m_device->getVideoDriver(); } - static scene::IMeshCache *get_mesh_cache() + scene::ISceneManager *get_scene_manager() { - sanity_check(s_singleton && s_singleton->m_device); - return s_singleton->m_device->getSceneManager()->getMeshCache(); - } - - static scene::ISceneManager *get_scene_manager() - { - sanity_check(s_singleton && s_singleton->m_device); - return s_singleton->m_device->getSceneManager(); + return m_device->getSceneManager(); } static irr::IrrlichtDevice *get_raw_device() @@ -89,70 +93,43 @@ public: return s_singleton->m_device; } - static u32 get_timer_time() + u32 get_timer_time() { - sanity_check(s_singleton && s_singleton->m_device && - s_singleton->m_device->getTimer()); - return s_singleton->m_device->getTimer()->getTime(); + return m_device->getTimer()->getTime(); } - static gui::IGUIEnvironment *get_gui_env() + gui::IGUIEnvironment *get_gui_env() { - sanity_check(s_singleton && s_singleton->m_device); - return s_singleton->m_device->getGUIEnvironment(); + return m_device->getGUIEnvironment(); } - inline static void draw_load_screen(const std::wstring &text, + void draw_load_screen(const std::wstring &text, gui::IGUIEnvironment *guienv, ITextureSource *tsrc, - float dtime = 0, int percent = 0, bool clouds = true) + float dtime = 0, int percent = 0, bool clouds = true); + + void draw_menu_scene(gui::IGUIEnvironment *guienv, float dtime, bool clouds); + void draw_scene(video::SColor skycolor, bool show_hud, + bool show_minimap, bool draw_wield_tool, bool draw_crosshair); + + void initialize(Client *client, Hud *hud); + void finalize(); + + bool run() { - s_singleton->_draw_load_screen( - text, guienv, tsrc, dtime, percent, clouds); + return m_device->run(); } - inline static void draw_menu_scene( - gui::IGUIEnvironment *guienv, float dtime, bool clouds) + // FIXME: this is still global when it shouldn't be + static ShadowRenderer *get_shadow_renderer() { - s_singleton->_draw_menu_scene(guienv, dtime, clouds); + if (s_singleton && s_singleton->core) + return s_singleton->core->get_shadow_renderer(); + return nullptr; } - - inline static void draw_scene(video::SColor skycolor, bool show_hud, - bool show_minimap, bool draw_wield_tool, bool draw_crosshair) - { - s_singleton->_draw_scene(skycolor, show_hud, show_minimap, - draw_wield_tool, draw_crosshair); - } - - inline static void initialize(Client *client, Hud *hud) - { - s_singleton->_initialize(client, hud); - } - - inline static void finalize() { s_singleton->_finalize(); } - - static bool run() - { - sanity_check(s_singleton && s_singleton->m_device); - return s_singleton->m_device->run(); - } - - static std::vector<core::vector3d<u32>> getSupportedVideoModes(); static std::vector<irr::video::E_DRIVER_TYPE> getSupportedVideoDrivers(); private: - void _draw_load_screen(const std::wstring &text, gui::IGUIEnvironment *guienv, - ITextureSource *tsrc, float dtime = 0, int percent = 0, - bool clouds = true); - - void _draw_menu_scene(gui::IGUIEnvironment *guienv, float dtime = 0, - bool clouds = true); - - void _draw_scene(video::SColor skycolor, bool show_hud, bool show_minimap, - bool draw_wield_tool, bool draw_crosshair); - - void _initialize(Client *client, Hud *hud); - - void _finalize(); + v2u32 _getWindowSize() const; std::unique_ptr<RenderingCore> core; irr::IrrlichtDevice *m_device = nullptr; diff --git a/src/client/shader.cpp b/src/client/shader.cpp index c5fe5dfe0..009a4b3d7 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <iterator> #include "shader.h" #include "irrlichttypes_extrabloated.h" +#include "irr_ptr.h" #include "debug.h" #include "filesys.h" #include "util/container.h" @@ -37,21 +38,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "gamedef.h" #include "client/tile.h" +#include "config.h" -#if ENABLE_GLES -#ifdef _IRR_COMPILE_WITH_OGLES1_ -#include <GLES/gl.h> -#else -#include <GLES2/gl2.h> -#endif -#else -#ifndef __APPLE__ -#include <GL/gl.h> -#else -#define GL_SILENCE_DEPRECATION -#include <OpenGL/gl.h> -#endif -#endif +#include <mt_opengl.h> /* A cache from shader name to shader path @@ -188,19 +177,14 @@ private: class ShaderCallback : public video::IShaderConstantSetCallBack { - std::vector<IShaderConstantSetter*> m_setters; + std::vector<std::unique_ptr<IShaderConstantSetter>> m_setters; public: - ShaderCallback(const std::vector<IShaderConstantSetterFactory *> &factories) + template <typename Factories> + ShaderCallback(const Factories &factories) { - for (IShaderConstantSetterFactory *factory : factories) - m_setters.push_back(factory->create()); - } - - ~ShaderCallback() - { - for (IShaderConstantSetter *setter : m_setters) - delete setter; + for (auto &&factory : factories) + m_setters.push_back(std::unique_ptr<IShaderConstantSetter>(factory->create())); } virtual void OnSetConstants(video::IMaterialRendererServices *services, s32 userData) override @@ -208,15 +192,13 @@ public: video::IVideoDriver *driver = services->getVideoDriver(); sanity_check(driver != NULL); - bool is_highlevel = userData; - - for (IShaderConstantSetter *setter : m_setters) - setter->onSetConstants(services, is_highlevel); + for (auto &&setter : m_setters) + setter->onSetConstants(services); } virtual void OnSetMaterial(const video::SMaterial& material) override { - for (IShaderConstantSetter *setter : m_setters) + for (auto &&setter : m_setters) setter->onSetMaterial(material); } }; @@ -228,39 +210,138 @@ public: class MainShaderConstantSetter : public IShaderConstantSetter { - CachedVertexShaderSetting<float, 16> m_world_view_proj; - CachedVertexShaderSetting<float, 16> m_world; + CachedVertexShaderSetting<f32, 16> m_world_view_proj; + CachedVertexShaderSetting<f32, 16> m_world; + + // Shadow-related + CachedPixelShaderSetting<f32, 16> m_shadow_view_proj; + CachedPixelShaderSetting<f32, 3> m_light_direction; + CachedPixelShaderSetting<f32> m_texture_res; + CachedPixelShaderSetting<f32> m_shadow_strength; + CachedPixelShaderSetting<f32> m_time_of_day; + CachedPixelShaderSetting<f32> m_shadowfar; + CachedPixelShaderSetting<f32, 4> m_camera_pos; + CachedPixelShaderSetting<s32> m_shadow_texture; + CachedVertexShaderSetting<f32> m_perspective_bias0_vertex; + CachedPixelShaderSetting<f32> m_perspective_bias0_pixel; + CachedVertexShaderSetting<f32> m_perspective_bias1_vertex; + CachedPixelShaderSetting<f32> m_perspective_bias1_pixel; + CachedVertexShaderSetting<f32> m_perspective_zbias_vertex; + CachedPixelShaderSetting<f32> m_perspective_zbias_pixel; + +#if ENABLE_GLES + // Modelview matrix + CachedVertexShaderSetting<float, 16> m_world_view; + // Texture matrix + CachedVertexShaderSetting<float, 16> m_texture; + // Normal matrix + CachedVertexShaderSetting<float, 9> m_normal; +#endif public: MainShaderConstantSetter() : - m_world_view_proj("mWorldViewProj"), - m_world("mWorld") + m_world_view_proj("mWorldViewProj") + , m_world("mWorld") + , m_shadow_view_proj("m_ShadowViewProj") + , m_light_direction("v_LightDirection") + , m_texture_res("f_textureresolution") + , m_shadow_strength("f_shadow_strength") + , m_time_of_day("f_timeofday") + , m_shadowfar("f_shadowfar") + , m_camera_pos("CameraPos") + , m_shadow_texture("ShadowMapSampler") + , m_perspective_bias0_vertex("xyPerspectiveBias0") + , m_perspective_bias0_pixel("xyPerspectiveBias0") + , m_perspective_bias1_vertex("xyPerspectiveBias1") + , m_perspective_bias1_pixel("xyPerspectiveBias1") + , m_perspective_zbias_vertex("zPerspectiveBias") + , m_perspective_zbias_pixel("zPerspectiveBias") +#if ENABLE_GLES + , m_world_view("mWorldView") + , m_texture("mTexture") + , m_normal("mNormal") +#endif {} ~MainShaderConstantSetter() = default; - virtual void onSetConstants(video::IMaterialRendererServices *services, - bool is_highlevel) + virtual void onSetConstants(video::IMaterialRendererServices *services) override { video::IVideoDriver *driver = services->getVideoDriver(); sanity_check(driver); - // Set clip matrix - core::matrix4 worldViewProj; - worldViewProj = driver->getTransform(video::ETS_PROJECTION); - worldViewProj *= driver->getTransform(video::ETS_VIEW); - worldViewProj *= driver->getTransform(video::ETS_WORLD); - if (is_highlevel) - m_world_view_proj.set(*reinterpret_cast<float(*)[16]>(worldViewProj.pointer()), services); - else - services->setVertexShaderConstant(worldViewProj.pointer(), 0, 4); - // Set world matrix core::matrix4 world = driver->getTransform(video::ETS_WORLD); - if (is_highlevel) - m_world.set(*reinterpret_cast<float(*)[16]>(world.pointer()), services); - else - services->setVertexShaderConstant(world.pointer(), 4, 4); + m_world.set(*reinterpret_cast<float(*)[16]>(world.pointer()), services); + // Set clip matrix + core::matrix4 worldView; + worldView = driver->getTransform(video::ETS_VIEW); + worldView *= world; + + core::matrix4 worldViewProj; + worldViewProj = driver->getTransform(video::ETS_PROJECTION); + worldViewProj *= worldView; + m_world_view_proj.set(*reinterpret_cast<float(*)[16]>(worldViewProj.pointer()), services); + +#if ENABLE_GLES + core::matrix4 texture = driver->getTransform(video::ETS_TEXTURE_0); + m_world_view.set(*reinterpret_cast<float(*)[16]>(worldView.pointer()), services); + m_texture.set(*reinterpret_cast<float(*)[16]>(texture.pointer()), services); + + core::matrix4 normal; + worldView.getTransposed(normal); + sanity_check(normal.makeInverse()); + float m[9] = { + normal[0], normal[1], normal[2], + normal[4], normal[5], normal[6], + normal[8], normal[9], normal[10], + }; + m_normal.set(m, services); +#endif + + // Set uniforms for Shadow shader + if (ShadowRenderer *shadow = RenderingEngine::get_shadow_renderer()) { + const auto &light = shadow->getDirectionalLight(); + + core::matrix4 shadowViewProj = light.getProjectionMatrix(); + shadowViewProj *= light.getViewMatrix(); + m_shadow_view_proj.set(shadowViewProj.pointer(), services); + + f32 v_LightDirection[3]; + light.getDirection().getAs3Values(v_LightDirection); + m_light_direction.set(v_LightDirection, services); + + f32 TextureResolution = light.getMapResolution(); + m_texture_res.set(&TextureResolution, services); + + f32 ShadowStrength = shadow->getShadowStrength(); + m_shadow_strength.set(&ShadowStrength, services); + + f32 timeOfDay = shadow->getTimeOfDay(); + m_time_of_day.set(&timeOfDay, services); + + f32 shadowFar = shadow->getMaxShadowFar(); + m_shadowfar.set(&shadowFar, services); + + f32 cam_pos[4]; + shadowViewProj.transformVect(cam_pos, light.getPlayerPos()); + m_camera_pos.set(cam_pos, services); + + // I dont like using this hardcoded value. maybe something like + // MAX_TEXTURE - 1 or somthing like that?? + s32 TextureLayerID = 3; + m_shadow_texture.set(&TextureLayerID, services); + + f32 bias0 = shadow->getPerspectiveBiasXY(); + m_perspective_bias0_vertex.set(&bias0, services); + m_perspective_bias0_pixel.set(&bias0, services); + f32 bias1 = 1.0f - bias0 + 1e-5f; + m_perspective_bias1_vertex.set(&bias1, services); + m_perspective_bias1_pixel.set(&bias1, services); + f32 zbias = shadow->getPerspectiveBiasZ(); + m_perspective_zbias_vertex.set(&zbias, services); + m_perspective_zbias_pixel.set(&zbias, services); + } } }; @@ -281,7 +362,6 @@ class ShaderSource : public IWritableShaderSource { public: ShaderSource(); - ~ShaderSource(); /* - If shader material specified by name is found from cache, @@ -291,7 +371,7 @@ public: The id 0 points to a null shader. Its material is EMT_SOLID. */ u32 getShaderIdDirect(const std::string &name, - const u8 material_type, const u8 drawtype); + MaterialType material_type, NodeDrawType drawtype) override; /* If shader specified by the name pointed by the id doesn't @@ -303,26 +383,26 @@ public: */ u32 getShader(const std::string &name, - const u8 material_type, const u8 drawtype); + MaterialType material_type, NodeDrawType drawtype) override; - ShaderInfo getShaderInfo(u32 id); + ShaderInfo getShaderInfo(u32 id) override; // Processes queued shader requests from other threads. // Shall be called from the main thread. - void processQueue(); + void processQueue() override; // Insert a shader program into the cache without touching the // filesystem. Shall be called from the main thread. void insertSourceShader(const std::string &name_of_shader, - const std::string &filename, const std::string &program); + const std::string &filename, const std::string &program) override; // Rebuild shaders from the current set of source shaders // Shall be called from the main thread. - void rebuildShaders(); + void rebuildShaders() override; - void addShaderConstantSetterFactory(IShaderConstantSetterFactory *setter) + void addShaderConstantSetterFactory(IShaderConstantSetterFactory *setter) override { - m_setter_factories.push_back(setter); + m_setter_factories.push_back(std::unique_ptr<IShaderConstantSetterFactory>(setter)); } private: @@ -344,10 +424,11 @@ private: RequestQueue<std::string, u32, u8, u8> m_get_shader_queue; // Global constant setter factories - std::vector<IShaderConstantSetterFactory *> m_setter_factories; + std::vector<std::unique_ptr<IShaderConstantSetterFactory>> m_setter_factories; - // Shader callbacks - std::vector<ShaderCallback *> m_callbacks; + // Generate shader given the shader name. + ShaderInfo generateShader(const std::string &name, + MaterialType material_type, NodeDrawType drawtype); }; IWritableShaderSource *createShaderSource() @@ -355,22 +436,6 @@ IWritableShaderSource *createShaderSource() return new ShaderSource(); } -/* - Generate shader given the shader name. -*/ -ShaderInfo generate_shader(const std::string &name, - u8 material_type, u8 drawtype, std::vector<ShaderCallback *> &callbacks, - const std::vector<IShaderConstantSetterFactory *> &setter_factories, - SourceShaderCache *sourcecache); - -/* - Load shader programs -*/ -void load_shaders(const std::string &name, SourceShaderCache *sourcecache, - video::E_DRIVER_TYPE drivertype, bool enable_shaders, - std::string &vertex_program, std::string &pixel_program, - std::string &geometry_program, bool &is_highlevel); - ShaderSource::ShaderSource() { m_main_thread = std::this_thread::get_id(); @@ -382,18 +447,8 @@ ShaderSource::ShaderSource() addShaderConstantSetterFactory(new MainShaderConstantSetterFactory()); } -ShaderSource::~ShaderSource() -{ - for (ShaderCallback *callback : m_callbacks) { - delete callback; - } - for (IShaderConstantSetterFactory *setter_factorie : m_setter_factories) { - delete setter_factorie; - } -} - u32 ShaderSource::getShader(const std::string &name, - const u8 material_type, const u8 drawtype) + MaterialType material_type, NodeDrawType drawtype) { /* Get shader @@ -435,7 +490,7 @@ u32 ShaderSource::getShader(const std::string &name, This method generates all the shaders */ u32 ShaderSource::getShaderIdDirect(const std::string &name, - const u8 material_type, const u8 drawtype) + MaterialType material_type, NodeDrawType drawtype) { //infostream<<"getShaderIdDirect(): name=\""<<name<<"\""<<std::endl; @@ -462,8 +517,7 @@ u32 ShaderSource::getShaderIdDirect(const std::string &name, return 0; } - ShaderInfo info = generate_shader(name, material_type, drawtype, - m_callbacks, m_setter_factories, &m_sourcecache); + ShaderInfo info = generateShader(name, material_type, drawtype); /* Add shader to caches (add dummy shaders too) @@ -527,24 +581,19 @@ void ShaderSource::rebuildShaders() for (ShaderInfo &i : m_shaderinfo_cache) { ShaderInfo *info = &i; if (!info->name.empty()) { - *info = generate_shader(info->name, info->material_type, - info->drawtype, m_callbacks, - m_setter_factories, &m_sourcecache); + *info = generateShader(info->name, info->material_type, info->drawtype); } } } -ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtype, - std::vector<ShaderCallback *> &callbacks, - const std::vector<IShaderConstantSetterFactory *> &setter_factories, - SourceShaderCache *sourcecache) +ShaderInfo ShaderSource::generateShader(const std::string &name, + MaterialType material_type, NodeDrawType drawtype) { ShaderInfo shaderinfo; shaderinfo.name = name; shaderinfo.material_type = material_type; shaderinfo.drawtype = drawtype; - shaderinfo.material = video::EMT_SOLID; switch (material_type) { case TILE_MATERIAL_OPAQUE: case TILE_MATERIAL_LIQUID_OPAQUE: @@ -565,306 +614,202 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; break; } + shaderinfo.material = shaderinfo.base_material; bool enable_shaders = g_settings->getBool("enable_shaders"); if (!enable_shaders) return shaderinfo; video::IVideoDriver *driver = RenderingEngine::get_video_driver(); - + if (!driver->queryFeature(video::EVDF_ARB_GLSL)) { + errorstream << "Shaders are enabled but GLSL is not supported by the driver\n"; + return shaderinfo; + } video::IGPUProgrammingServices *gpu = driver->getGPUProgrammingServices(); - if(!gpu){ - errorstream<<"generate_shader(): " - "failed to generate \""<<name<<"\", " - "GPU programming not supported." - <<std::endl; - return shaderinfo; - } - - // Choose shader language depending on driver type and settings - // Then load shaders - std::string vertex_program; - std::string pixel_program; - std::string geometry_program; - bool is_highlevel; - load_shaders(name, sourcecache, driver->getDriverType(), - enable_shaders, vertex_program, pixel_program, - geometry_program, is_highlevel); - // Check hardware/driver support - if (!vertex_program.empty() && - !driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1) && - !driver->queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1)){ - infostream<<"generate_shader(): vertex shaders disabled " - "because of missing driver/hardware support." - <<std::endl; - vertex_program = ""; - } - if (!pixel_program.empty() && - !driver->queryFeature(video::EVDF_PIXEL_SHADER_1_1) && - !driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1)){ - infostream<<"generate_shader(): pixel shaders disabled " - "because of missing driver/hardware support." - <<std::endl; - pixel_program = ""; - } - if (!geometry_program.empty() && - !driver->queryFeature(video::EVDF_GEOMETRY_SHADER)){ - infostream<<"generate_shader(): geometry shaders disabled " - "because of missing driver/hardware support." - <<std::endl; - geometry_program = ""; - } - - // If no shaders are used, don't make a separate material type - if (vertex_program.empty() && pixel_program.empty() && geometry_program.empty()) - return shaderinfo; // Create shaders header - std::string shaders_header = "#version 120\n"; - -#ifdef __unix__ - // For renderers that should use discard instead of GL_ALPHA_TEST - const char* gl_renderer = (const char*)glGetString(GL_RENDERER); - if (strstr(gl_renderer, "GC7000")) { - shaders_header += "#define USE_DISCARD\n"; - } + bool use_gles = false; +#if ENABLE_GLES + use_gles = driver->getDriverType() == video::EDT_OGLES2; #endif + std::stringstream shaders_header; + shaders_header + << std::noboolalpha + << std::showpoint // for GLSL ES + ; + std::string vertex_header, fragment_header, geometry_header; + if (use_gles) { + shaders_header << R"( + #version 100 + )"; + vertex_header = R"( + precision mediump float; - static const char* drawTypes[] = { - "NDT_NORMAL", - "NDT_AIRLIKE", - "NDT_LIQUID", - "NDT_FLOWINGLIQUID", - "NDT_GLASSLIKE", - "NDT_ALLFACES", - "NDT_ALLFACES_OPTIONAL", - "NDT_TORCHLIKE", - "NDT_SIGNLIKE", - "NDT_PLANTLIKE", - "NDT_FENCELIKE", - "NDT_RAILLIKE", - "NDT_NODEBOX", - "NDT_GLASSLIKE_FRAMED", - "NDT_FIRELIKE", - "NDT_GLASSLIKE_FRAMED_OPTIONAL", - "NDT_PLANTLIKE_ROOTED", - }; + uniform highp mat4 mWorldView; + uniform highp mat4 mWorldViewProj; + uniform mediump mat4 mTexture; + uniform mediump mat3 mNormal; - for (int i = 0; i < 14; i++){ - shaders_header += "#define "; - shaders_header += drawTypes[i]; - shaders_header += " "; - shaders_header += itos(i); - shaders_header += "\n"; + attribute highp vec4 inVertexPosition; + attribute lowp vec4 inVertexColor; + attribute mediump vec4 inTexCoord0; + attribute mediump vec3 inVertexNormal; + attribute mediump vec4 inVertexTangent; + attribute mediump vec4 inVertexBinormal; + )"; + fragment_header = R"( + precision mediump float; + )"; + } else { + shaders_header << R"( + #version 120 + #define lowp + #define mediump + #define highp + )"; + vertex_header = R"( + #define mWorldView gl_ModelViewMatrix + #define mWorldViewProj gl_ModelViewProjectionMatrix + #define mTexture (gl_TextureMatrix[0]) + #define mNormal gl_NormalMatrix + + #define inVertexPosition gl_Vertex + #define inVertexColor gl_Color + #define inTexCoord0 gl_MultiTexCoord0 + #define inVertexNormal gl_Normal + #define inVertexTangent gl_MultiTexCoord1 + #define inVertexBinormal gl_MultiTexCoord2 + )"; } - static const char* materialTypes[] = { - "TILE_MATERIAL_BASIC", - "TILE_MATERIAL_ALPHA", - "TILE_MATERIAL_LIQUID_TRANSPARENT", - "TILE_MATERIAL_LIQUID_OPAQUE", - "TILE_MATERIAL_WAVING_LEAVES", - "TILE_MATERIAL_WAVING_PLANTS", - "TILE_MATERIAL_OPAQUE", - "TILE_MATERIAL_WAVING_LIQUID_BASIC", - "TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT", - "TILE_MATERIAL_WAVING_LIQUID_OPAQUE", - "TILE_MATERIAL_PLAIN", - "TILE_MATERIAL_PLAIN_ALPHA", - }; - - for (int i = 0; i < 12; i++){ - shaders_header += "#define "; - shaders_header += materialTypes[i]; - shaders_header += " "; - shaders_header += itos(i); - shaders_header += "\n"; + // Since this is the first time we're using the GL bindings be extra careful. + // This should be removed before 5.6.0 or similar. + if (!GL.GetString) { + errorstream << "OpenGL procedures were not loaded correctly, " + "please open a bug report with details about your platform/OS." << std::endl; + abort(); } - shaders_header += "#define MATERIAL_TYPE "; - shaders_header += itos(material_type); - shaders_header += "\n"; - shaders_header += "#define DRAW_TYPE "; - shaders_header += itos(drawtype); - shaders_header += "\n"; - - if (g_settings->getBool("enable_bumpmapping")) - shaders_header += "#define ENABLE_BUMPMAPPING\n"; - - if (g_settings->getBool("enable_parallax_occlusion")){ - int mode = g_settings->getFloat("parallax_occlusion_mode"); - float scale = g_settings->getFloat("parallax_occlusion_scale"); - float bias = g_settings->getFloat("parallax_occlusion_bias"); - int iterations = g_settings->getFloat("parallax_occlusion_iterations"); - shaders_header += "#define ENABLE_PARALLAX_OCCLUSION\n"; - shaders_header += "#define PARALLAX_OCCLUSION_MODE "; - shaders_header += itos(mode); - shaders_header += "\n"; - shaders_header += "#define PARALLAX_OCCLUSION_SCALE "; - shaders_header += ftos(scale); - shaders_header += "\n"; - shaders_header += "#define PARALLAX_OCCLUSION_BIAS "; - shaders_header += ftos(bias); - shaders_header += "\n"; - shaders_header += "#define PARALLAX_OCCLUSION_ITERATIONS "; - shaders_header += itos(iterations); - shaders_header += "\n"; + bool use_discard = use_gles; + // For renderers that should use discard instead of GL_ALPHA_TEST + const char *renderer = reinterpret_cast<const char*>(GL.GetString(GL.RENDERER)); + if (strstr(renderer, "GC7000")) + use_discard = true; + if (use_discard) { + if (shaderinfo.base_material == video::EMT_TRANSPARENT_ALPHA_CHANNEL) + shaders_header << "#define USE_DISCARD 1\n"; + else if (shaderinfo.base_material == video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF) + shaders_header << "#define USE_DISCARD_REF 1\n"; } - shaders_header += "#define USE_NORMALMAPS "; - if (g_settings->getBool("enable_bumpmapping") || g_settings->getBool("enable_parallax_occlusion")) - shaders_header += "1\n"; - else - shaders_header += "0\n"; +#define PROVIDE(constant) shaders_header << "#define " #constant " " << (int)constant << "\n" - if (g_settings->getBool("enable_waving_water")){ - shaders_header += "#define ENABLE_WAVING_WATER 1\n"; - shaders_header += "#define WATER_WAVE_HEIGHT "; - shaders_header += ftos(g_settings->getFloat("water_wave_height")); - shaders_header += "\n"; - shaders_header += "#define WATER_WAVE_LENGTH "; - shaders_header += ftos(g_settings->getFloat("water_wave_length")); - shaders_header += "\n"; - shaders_header += "#define WATER_WAVE_SPEED "; - shaders_header += ftos(g_settings->getFloat("water_wave_speed")); - shaders_header += "\n"; - } else{ - shaders_header += "#define ENABLE_WAVING_WATER 0\n"; + PROVIDE(NDT_NORMAL); + PROVIDE(NDT_AIRLIKE); + PROVIDE(NDT_LIQUID); + PROVIDE(NDT_FLOWINGLIQUID); + PROVIDE(NDT_GLASSLIKE); + PROVIDE(NDT_ALLFACES); + PROVIDE(NDT_ALLFACES_OPTIONAL); + PROVIDE(NDT_TORCHLIKE); + PROVIDE(NDT_SIGNLIKE); + PROVIDE(NDT_PLANTLIKE); + PROVIDE(NDT_FENCELIKE); + PROVIDE(NDT_RAILLIKE); + PROVIDE(NDT_NODEBOX); + PROVIDE(NDT_GLASSLIKE_FRAMED); + PROVIDE(NDT_FIRELIKE); + PROVIDE(NDT_GLASSLIKE_FRAMED_OPTIONAL); + PROVIDE(NDT_PLANTLIKE_ROOTED); + + PROVIDE(TILE_MATERIAL_BASIC); + PROVIDE(TILE_MATERIAL_ALPHA); + PROVIDE(TILE_MATERIAL_LIQUID_TRANSPARENT); + PROVIDE(TILE_MATERIAL_LIQUID_OPAQUE); + PROVIDE(TILE_MATERIAL_WAVING_LEAVES); + PROVIDE(TILE_MATERIAL_WAVING_PLANTS); + PROVIDE(TILE_MATERIAL_OPAQUE); + PROVIDE(TILE_MATERIAL_WAVING_LIQUID_BASIC); + PROVIDE(TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT); + PROVIDE(TILE_MATERIAL_WAVING_LIQUID_OPAQUE); + PROVIDE(TILE_MATERIAL_PLAIN); + PROVIDE(TILE_MATERIAL_PLAIN_ALPHA); + +#undef PROVIDE + + shaders_header << "#define MATERIAL_TYPE " << (int)material_type << "\n"; + shaders_header << "#define DRAW_TYPE " << (int)drawtype << "\n"; + + bool enable_waving_water = g_settings->getBool("enable_waving_water"); + shaders_header << "#define ENABLE_WAVING_WATER " << enable_waving_water << "\n"; + if (enable_waving_water) { + shaders_header << "#define WATER_WAVE_HEIGHT " << g_settings->getFloat("water_wave_height") << "\n"; + shaders_header << "#define WATER_WAVE_LENGTH " << g_settings->getFloat("water_wave_length") << "\n"; + shaders_header << "#define WATER_WAVE_SPEED " << g_settings->getFloat("water_wave_speed") << "\n"; } - shaders_header += "#define ENABLE_WAVING_LEAVES "; - if (g_settings->getBool("enable_waving_leaves")) - shaders_header += "1\n"; - else - shaders_header += "0\n"; + shaders_header << "#define ENABLE_WAVING_LEAVES " << g_settings->getBool("enable_waving_leaves") << "\n"; + shaders_header << "#define ENABLE_WAVING_PLANTS " << g_settings->getBool("enable_waving_plants") << "\n"; + shaders_header << "#define ENABLE_TONE_MAPPING " << g_settings->getBool("tone_mapping") << "\n"; - shaders_header += "#define ENABLE_WAVING_PLANTS "; - if (g_settings->getBool("enable_waving_plants")) - shaders_header += "1\n"; - else - shaders_header += "0\n"; + shaders_header << "#define FOG_START " << core::clamp(g_settings->getFloat("fog_start"), 0.0f, 0.99f) << "\n"; - if (g_settings->getBool("tone_mapping")) - shaders_header += "#define ENABLE_TONE_MAPPING\n"; + if (g_settings->getBool("enable_dynamic_shadows")) { + shaders_header << "#define ENABLE_DYNAMIC_SHADOWS 1\n"; + if (g_settings->getBool("shadow_map_color")) + shaders_header << "#define COLORED_SHADOWS 1\n"; - shaders_header += "#define FOG_START "; - shaders_header += ftos(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f)); - shaders_header += "\n"; + if (g_settings->getBool("shadow_poisson_filter")) + shaders_header << "#define POISSON_FILTER 1\n"; - // Call addHighLevelShaderMaterial() or addShaderMaterial() - const c8* vertex_program_ptr = 0; - const c8* pixel_program_ptr = 0; - const c8* geometry_program_ptr = 0; - if (!vertex_program.empty()) { - vertex_program = shaders_header + vertex_program; - vertex_program_ptr = vertex_program.c_str(); + s32 shadow_filter = g_settings->getS32("shadow_filters"); + shaders_header << "#define SHADOW_FILTER " << shadow_filter << "\n"; + + float shadow_soft_radius = g_settings->getFloat("shadow_soft_radius"); + if (shadow_soft_radius < 1.0f) + shadow_soft_radius = 1.0f; + shaders_header << "#define SOFTSHADOWRADIUS " << shadow_soft_radius << "\n"; } - if (!pixel_program.empty()) { - pixel_program = shaders_header + pixel_program; - pixel_program_ptr = pixel_program.c_str(); - } - if (!geometry_program.empty()) { - geometry_program = shaders_header + geometry_program; - geometry_program_ptr = geometry_program.c_str(); - } - ShaderCallback *cb = new ShaderCallback(setter_factories); - s32 shadermat = -1; - if(is_highlevel){ - infostream<<"Compiling high level shaders for "<<name<<std::endl; - shadermat = gpu->addHighLevelShaderMaterial( - vertex_program_ptr, // Vertex shader program - "vertexMain", // Vertex shader entry point - video::EVST_VS_1_1, // Vertex shader version - pixel_program_ptr, // Pixel shader program - "pixelMain", // Pixel shader entry point - video::EPST_PS_1_2, // Pixel shader version - geometry_program_ptr, // Geometry shader program - "geometryMain", // Geometry shader entry point - video::EGST_GS_4_0, // Geometry shader version - scene::EPT_TRIANGLES, // Geometry shader input - scene::EPT_TRIANGLE_STRIP, // Geometry shader output - 0, // Support maximum number of vertices - cb, // Set-constant callback - shaderinfo.base_material, // Base material - 1 // Userdata passed to callback - ); - if(shadermat == -1){ - errorstream<<"generate_shader(): " - "failed to generate \""<<name<<"\", " - "addHighLevelShaderMaterial failed." - <<std::endl; - dumpShaderProgram(warningstream, "Vertex", vertex_program); - dumpShaderProgram(warningstream, "Pixel", pixel_program); - dumpShaderProgram(warningstream, "Geometry", geometry_program); - delete cb; - return shaderinfo; - } - } - else{ - infostream<<"Compiling assembly shaders for "<<name<<std::endl; - shadermat = gpu->addShaderMaterial( - vertex_program_ptr, // Vertex shader program - pixel_program_ptr, // Pixel shader program - cb, // Set-constant callback - shaderinfo.base_material, // Base material - 0 // Userdata passed to callback - ); - if(shadermat == -1){ - errorstream<<"generate_shader(): " - "failed to generate \""<<name<<"\", " - "addShaderMaterial failed." - <<std::endl; - dumpShaderProgram(warningstream, "Vertex", vertex_program); - dumpShaderProgram(warningstream,"Pixel", pixel_program); - delete cb; - return shaderinfo; - } - } - callbacks.push_back(cb); + shaders_header << "#line 0\n"; // reset the line counter for meaningful diagnostics - // HACK, TODO: investigate this better - // Grab the material renderer once more so minetest doesn't crash on exit - driver->getMaterialRenderer(shadermat)->grab(); + std::string common_header = shaders_header.str(); + + std::string vertex_shader = m_sourcecache.getOrLoad(name, "opengl_vertex.glsl"); + std::string fragment_shader = m_sourcecache.getOrLoad(name, "opengl_fragment.glsl"); + std::string geometry_shader = m_sourcecache.getOrLoad(name, "opengl_geometry.glsl"); + + vertex_shader = common_header + vertex_header + vertex_shader; + fragment_shader = common_header + fragment_header + fragment_shader; + const char *geometry_shader_ptr = nullptr; // optional + if (!geometry_shader.empty()) { + geometry_shader = common_header + geometry_header + geometry_shader; + geometry_shader_ptr = geometry_shader.c_str(); + } + + irr_ptr<ShaderCallback> cb{new ShaderCallback(m_setter_factories)}; + infostream<<"Compiling high level shaders for "<<name<<std::endl; + s32 shadermat = gpu->addHighLevelShaderMaterial( + vertex_shader.c_str(), nullptr, video::EVST_VS_1_1, + fragment_shader.c_str(), nullptr, video::EPST_PS_1_1, + geometry_shader_ptr, nullptr, video::EGST_GS_4_0, scene::EPT_TRIANGLES, scene::EPT_TRIANGLES, 0, + cb.get(), shaderinfo.base_material, 1); + if (shadermat == -1) { + errorstream<<"generate_shader(): " + "failed to generate \""<<name<<"\", " + "addHighLevelShaderMaterial failed." + <<std::endl; + dumpShaderProgram(warningstream, "Vertex", vertex_shader); + dumpShaderProgram(warningstream, "Fragment", fragment_shader); + dumpShaderProgram(warningstream, "Geometry", geometry_shader); + return shaderinfo; + } // Apply the newly created material type shaderinfo.material = (video::E_MATERIAL_TYPE) shadermat; return shaderinfo; } -void load_shaders(const std::string &name, SourceShaderCache *sourcecache, - video::E_DRIVER_TYPE drivertype, bool enable_shaders, - std::string &vertex_program, std::string &pixel_program, - std::string &geometry_program, bool &is_highlevel) -{ - vertex_program = ""; - pixel_program = ""; - geometry_program = ""; - is_highlevel = false; - - if(enable_shaders){ - // Look for high level shaders - if(drivertype == video::EDT_DIRECT3D9){ - // Direct3D 9: HLSL - // (All shaders in one file) - vertex_program = sourcecache->getOrLoad(name, "d3d9.hlsl"); - pixel_program = vertex_program; - geometry_program = vertex_program; - } - else if(drivertype == video::EDT_OPENGL){ - // OpenGL: GLSL - vertex_program = sourcecache->getOrLoad(name, "opengl_vertex.glsl"); - pixel_program = sourcecache->getOrLoad(name, "opengl_fragment.glsl"); - geometry_program = sourcecache->getOrLoad(name, "opengl_geometry.glsl"); - } - if (!vertex_program.empty() || !pixel_program.empty() || !geometry_program.empty()){ - is_highlevel = true; - return; - } - } - -} - void dumpShaderProgram(std::ostream &output_stream, const std::string &program_type, const std::string &program) { diff --git a/src/client/shader.h b/src/client/shader.h index 109d39336..49a563115 100644 --- a/src/client/shader.h +++ b/src/client/shader.h @@ -20,9 +20,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -#include <IMaterialRendererServices.h> #include "irrlichttypes_bloated.h" +#include <IMaterialRendererServices.h> #include <string> +#include "tile.h" +#include "nodedef.h" class IGameDef; @@ -46,8 +48,8 @@ struct ShaderInfo { std::string name = ""; video::E_MATERIAL_TYPE base_material = video::EMT_SOLID; video::E_MATERIAL_TYPE material = video::EMT_SOLID; - u8 drawtype = 0; - u8 material_type = 0; + NodeDrawType drawtype = NDT_NORMAL; + MaterialType material_type = TILE_MATERIAL_BASIC; ShaderInfo() = default; virtual ~ShaderInfo() = default; @@ -65,8 +67,7 @@ namespace irr { namespace video { class IShaderConstantSetter { public: virtual ~IShaderConstantSetter() = default; - virtual void onSetConstants(video::IMaterialRendererServices *services, - bool is_highlevel) = 0; + virtual void onSetConstants(video::IMaterialRendererServices *services) = 0; virtual void onSetMaterial(const video::SMaterial& material) { } }; @@ -95,9 +96,10 @@ public: if (has_been_set && std::equal(m_sent, m_sent + count, value)) return; if (is_pixel) - services->setPixelShaderConstant(m_name, value, count); + services->setPixelShaderConstant(services->getPixelShaderConstantID(m_name), value, count); else - services->setVertexShaderConstant(m_name, value, count); + services->setVertexShaderConstant(services->getVertexShaderConstantID(m_name), value, count); + std::copy(value, value + count, m_sent); has_been_set = true; } @@ -128,10 +130,10 @@ public: virtual ~IShaderSource() = default; virtual u32 getShaderIdDirect(const std::string &name, - const u8 material_type, const u8 drawtype){return 0;} + MaterialType material_type, NodeDrawType drawtype = NDT_NORMAL){return 0;} virtual ShaderInfo getShaderInfo(u32 id){return ShaderInfo();} virtual u32 getShader(const std::string &name, - const u8 material_type, const u8 drawtype){return 0;} + MaterialType material_type, NodeDrawType drawtype = NDT_NORMAL){return 0;} }; class IWritableShaderSource : public IShaderSource { @@ -139,16 +141,12 @@ public: IWritableShaderSource() = default; virtual ~IWritableShaderSource() = default; - virtual u32 getShaderIdDirect(const std::string &name, - const u8 material_type, const u8 drawtype){return 0;} - virtual ShaderInfo getShaderInfo(u32 id){return ShaderInfo();} - virtual u32 getShader(const std::string &name, - const u8 material_type, const u8 drawtype){return 0;} - virtual void processQueue()=0; virtual void insertSourceShader(const std::string &name_of_shader, const std::string &filename, const std::string &program)=0; virtual void rebuildShaders()=0; + + /// @note Takes ownership of @p setter. virtual void addShaderConstantSetterFactory(IShaderConstantSetterFactory *setter) = 0; }; diff --git a/src/client/shadows/dynamicshadows.cpp b/src/client/shadows/dynamicshadows.cpp new file mode 100644 index 000000000..9f26ba94a --- /dev/null +++ b/src/client/shadows/dynamicshadows.cpp @@ -0,0 +1,191 @@ +/* +Minetest +Copyright (C) 2021 Liso <anlismon@gmail.com> + +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. +*/ + +#include <cmath> + +#include "client/shadows/dynamicshadows.h" +#include "client/client.h" +#include "client/clientenvironment.h" +#include "client/clientmap.h" +#include "client/camera.h" + +using m4f = core::matrix4; + +static v3f quantizeDirection(v3f direction, float step) +{ + + float yaw = std::atan2(direction.Z, direction.X); + float pitch = std::asin(direction.Y); // assume look is normalized + + yaw = std::floor(yaw / step) * step; + pitch = std::floor(pitch / step) * step; + + return v3f(std::cos(yaw)*std::cos(pitch), std::sin(pitch), std::sin(yaw)*std::cos(pitch)); +} + +void DirectionalLight::createSplitMatrices(const Camera *cam) +{ + const float DISTANCE_STEP = BS * 2.0; // 2 meters + v3f newCenter; + v3f look = cam->getDirection(); + look = quantizeDirection(look, M_PI / 12.0); // 15 degrees + + // camera view tangents + float tanFovY = tanf(cam->getFovY() * 0.5f); + float tanFovX = tanf(cam->getFovX() * 0.5f); + + // adjusted frustum boundaries + float sfNear = future_frustum.zNear; + float sfFar = adjustDist(future_frustum.zFar, cam->getFovY()); + + // adjusted camera positions + v3f cam_pos_world = cam->getPosition(); + cam_pos_world = v3f( + floor(cam_pos_world.X / DISTANCE_STEP) * DISTANCE_STEP, + floor(cam_pos_world.Y / DISTANCE_STEP) * DISTANCE_STEP, + floor(cam_pos_world.Z / DISTANCE_STEP) * DISTANCE_STEP); + v3f cam_pos_scene = v3f(cam_pos_world.X - cam->getOffset().X * BS, + cam_pos_world.Y - cam->getOffset().Y * BS, + cam_pos_world.Z - cam->getOffset().Z * BS); + cam_pos_scene += look * sfNear; + cam_pos_world += look * sfNear; + + // center point of light frustum + v3f center_scene = cam_pos_scene + look * 0.35 * (sfFar - sfNear); + v3f center_world = cam_pos_world + look * 0.35 * (sfFar - sfNear); + + // Create a vector to the frustum far corner + const v3f &viewUp = cam->getCameraNode()->getUpVector(); + v3f viewRight = look.crossProduct(viewUp); + + v3f farCorner = (look + viewRight * tanFovX + viewUp * tanFovY).normalize(); + // Compute the frustumBoundingSphere radius + v3f boundVec = (cam_pos_scene + farCorner * sfFar) - center_scene; + float radius = boundVec.getLength(); + float length = radius * 3.0f; + v3f eye_displacement = quantizeDirection(direction, M_PI / 2880 /*15 seconds*/) * length; + + // we must compute the viewmat with the position - the camera offset + // but the future_frustum position must be the actual world position + v3f eye = center_scene - eye_displacement; + future_frustum.player = cam_pos_scene; + future_frustum.position = center_world - eye_displacement; + future_frustum.length = length; + future_frustum.radius = radius; + future_frustum.ViewMat.buildCameraLookAtMatrixLH(eye, center_scene, v3f(0.0f, 1.0f, 0.0f)); + future_frustum.ProjOrthMat.buildProjectionMatrixOrthoLH(radius, radius, + 0.0f, length, false); + future_frustum.camera_offset = cam->getOffset(); +} + +DirectionalLight::DirectionalLight(const u32 shadowMapResolution, + const v3f &position, video::SColorf lightColor, + f32 farValue) : + diffuseColor(lightColor), + farPlane(farValue), mapRes(shadowMapResolution), pos(position) +{} + +void DirectionalLight::update_frustum(const Camera *cam, Client *client, bool force) +{ + if (dirty && !force) + return; + + float zNear = cam->getCameraNode()->getNearValue(); + float zFar = getMaxFarValue(); + if (!client->getEnv().getClientMap().getControl().range_all) + zFar = MYMIN(zFar, client->getEnv().getClientMap().getControl().wanted_range * BS); + + /////////////////////////////////// + // update splits near and fars + future_frustum.zNear = zNear; + future_frustum.zFar = zFar; + + // update shadow frustum + createSplitMatrices(cam); + // get the draw list for shadows + client->getEnv().getClientMap().updateDrawListShadow( + getPosition(), getDirection(), future_frustum.radius, future_frustum.length); + should_update_map_shadow = true; + dirty = true; + + // when camera offset changes, adjust the current frustum view matrix to avoid flicker + v3s16 cam_offset = cam->getOffset(); + if (cam_offset != shadow_frustum.camera_offset) { + v3f rotated_offset; + shadow_frustum.ViewMat.rotateVect(rotated_offset, intToFloat(cam_offset - shadow_frustum.camera_offset, BS)); + shadow_frustum.ViewMat.setTranslation(shadow_frustum.ViewMat.getTranslation() + rotated_offset); + shadow_frustum.player += intToFloat(shadow_frustum.camera_offset - cam->getOffset(), BS); + shadow_frustum.camera_offset = cam_offset; + } +} + +void DirectionalLight::commitFrustum() +{ + if (!dirty) + return; + + shadow_frustum = future_frustum; + dirty = false; +} + +void DirectionalLight::setDirection(v3f dir) +{ + direction = -dir; + direction.normalize(); +} + +v3f DirectionalLight::getPosition() const +{ + return shadow_frustum.position; +} + +v3f DirectionalLight::getPlayerPos() const +{ + return shadow_frustum.player; +} + +v3f DirectionalLight::getFuturePlayerPos() const +{ + return future_frustum.player; +} + +const m4f &DirectionalLight::getViewMatrix() const +{ + return shadow_frustum.ViewMat; +} + +const m4f &DirectionalLight::getProjectionMatrix() const +{ + return shadow_frustum.ProjOrthMat; +} + +const m4f &DirectionalLight::getFutureViewMatrix() const +{ + return future_frustum.ViewMat; +} + +const m4f &DirectionalLight::getFutureProjectionMatrix() const +{ + return future_frustum.ProjOrthMat; +} + +m4f DirectionalLight::getViewProjMatrix() +{ + return shadow_frustum.ProjOrthMat * shadow_frustum.ViewMat; +} diff --git a/src/client/shadows/dynamicshadows.h b/src/client/shadows/dynamicshadows.h new file mode 100644 index 000000000..6e9d96b15 --- /dev/null +++ b/src/client/shadows/dynamicshadows.h @@ -0,0 +1,120 @@ +/* +Minetest +Copyright (C) 2021 Liso <anlismon@gmail.com> + +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. +*/ + +#pragma once + +#include "irrlichttypes_bloated.h" +#include <matrix4.h> +#include "util/basic_macros.h" +#include "constants.h" + +class Camera; +class Client; + +struct shadowFrustum +{ + f32 zNear{0.0f}; + f32 zFar{0.0f}; + f32 length{0.0f}; + f32 radius{0.0f}; + core::matrix4 ProjOrthMat; + core::matrix4 ViewMat; + v3f position; + v3f player; + v3s16 camera_offset; +}; + +class DirectionalLight +{ +public: + DirectionalLight(const u32 shadowMapResolution, + const v3f &position, + video::SColorf lightColor = video::SColor(0xffffffff), + f32 farValue = 100.0f); + ~DirectionalLight() = default; + + //DISABLE_CLASS_COPY(DirectionalLight) + + void update_frustum(const Camera *cam, Client *client, bool force = false); + + // when set direction is updated to negative normalized(direction) + void setDirection(v3f dir); + v3f getDirection() const{ + return direction; + }; + v3f getPosition() const; + v3f getPlayerPos() const; + v3f getFuturePlayerPos() const; + + /// Gets the light's matrices. + const core::matrix4 &getViewMatrix() const; + const core::matrix4 &getProjectionMatrix() const; + const core::matrix4 &getFutureViewMatrix() const; + const core::matrix4 &getFutureProjectionMatrix() const; + core::matrix4 getViewProjMatrix(); + + /// Gets the light's maximum far value, i.e. the shadow boundary + f32 getMaxFarValue() const + { + return farPlane * BS; + } + + /// Gets the current far value of the light + f32 getFarValue() const + { + return shadow_frustum.zFar; + } + + + /// Gets the light's color. + const video::SColorf &getLightColor() const + { + return diffuseColor; + } + + /// Sets the light's color. + void setLightColor(const video::SColorf &lightColor) + { + diffuseColor = lightColor; + } + + /// Gets the shadow map resolution for this light. + u32 getMapResolution() const + { + return mapRes; + } + + bool should_update_map_shadow{true}; + + void commitFrustum(); + +private: + void createSplitMatrices(const Camera *cam); + + video::SColorf diffuseColor; + + f32 farPlane; + u32 mapRes; + + v3f pos; + v3f direction{0}; + shadowFrustum shadow_frustum; + shadowFrustum future_frustum; + bool dirty{false}; +}; diff --git a/src/client/shadows/dynamicshadowsrender.cpp b/src/client/shadows/dynamicshadowsrender.cpp new file mode 100644 index 000000000..944deb801 --- /dev/null +++ b/src/client/shadows/dynamicshadowsrender.cpp @@ -0,0 +1,709 @@ +/* +Minetest +Copyright (C) 2021 Liso <anlismon@gmail.com> + +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. +*/ + +#include <cstring> +#include <cmath> +#include "client/shadows/dynamicshadowsrender.h" +#include "client/shadows/shadowsScreenQuad.h" +#include "client/shadows/shadowsshadercallbacks.h" +#include "settings.h" +#include "filesys.h" +#include "util/string.h" +#include "client/shader.h" +#include "client/client.h" +#include "client/clientmap.h" +#include "profiler.h" + +ShadowRenderer::ShadowRenderer(IrrlichtDevice *device, Client *client) : + m_smgr(device->getSceneManager()), m_driver(device->getVideoDriver()), + m_client(client), m_current_frame(0), + m_perspective_bias_xy(0.8), m_perspective_bias_z(0.5) +{ + (void) m_client; + + m_shadows_supported = true; // assume shadows supported. We will check actual support in initialize + m_shadows_enabled = true; + + m_shadow_strength_gamma = g_settings->getFloat("shadow_strength_gamma"); + if (std::isnan(m_shadow_strength_gamma)) + m_shadow_strength_gamma = 1.0f; + m_shadow_strength_gamma = core::clamp(m_shadow_strength_gamma, 0.1f, 10.0f); + + m_shadow_map_max_distance = g_settings->getFloat("shadow_map_max_distance"); + + m_shadow_map_texture_size = g_settings->getFloat("shadow_map_texture_size"); + + m_shadow_map_texture_32bit = g_settings->getBool("shadow_map_texture_32bit"); + m_shadow_map_colored = g_settings->getBool("shadow_map_color"); + m_shadow_samples = g_settings->getS32("shadow_filters"); + m_map_shadow_update_frames = g_settings->getS16("shadow_update_frames"); +} + +ShadowRenderer::~ShadowRenderer() +{ + // call to disable releases dynamically allocated resources + disable(); + + if (m_shadow_depth_cb) + delete m_shadow_depth_cb; + if (m_shadow_depth_entity_cb) + delete m_shadow_depth_entity_cb; + if (m_shadow_depth_trans_cb) + delete m_shadow_depth_trans_cb; + if (m_shadow_mix_cb) + delete m_shadow_mix_cb; + m_shadow_node_array.clear(); + m_light_list.clear(); +} + +void ShadowRenderer::disable() +{ + m_shadows_enabled = false; + if (shadowMapTextureFinal) { + m_driver->setRenderTarget(shadowMapTextureFinal, true, true, + video::SColor(255, 255, 255, 255)); + m_driver->setRenderTarget(0, false, false); + } + + if (shadowMapTextureDynamicObjects) { + m_driver->removeTexture(shadowMapTextureDynamicObjects); + shadowMapTextureDynamicObjects = nullptr; + } + + if (shadowMapTextureFinal) { + m_driver->removeTexture(shadowMapTextureFinal); + shadowMapTextureFinal = nullptr; + } + + if (shadowMapTextureColors) { + m_driver->removeTexture(shadowMapTextureColors); + shadowMapTextureColors = nullptr; + } + + if (shadowMapClientMap) { + m_driver->removeTexture(shadowMapClientMap); + shadowMapClientMap = nullptr; + } + + if (shadowMapClientMapFuture) { + m_driver->removeTexture(shadowMapClientMapFuture); + shadowMapClientMapFuture = nullptr; + } + + for (auto node : m_shadow_node_array) + if (node.shadowMode & E_SHADOW_MODE::ESM_RECEIVE) + node.node->setMaterialTexture(TEXTURE_LAYER_SHADOW, nullptr); +} + +void ShadowRenderer::initialize() +{ + auto *gpu = m_driver->getGPUProgrammingServices(); + + // we need glsl + if (m_shadows_supported && gpu && m_driver->queryFeature(video::EVDF_ARB_GLSL)) { + createShaders(); + } else { + m_shadows_supported = false; + + warningstream << "Shadows: GLSL Shader not supported on this system." + << std::endl; + return; + } + + m_texture_format = m_shadow_map_texture_32bit + ? video::ECOLOR_FORMAT::ECF_R32F + : video::ECOLOR_FORMAT::ECF_R16F; + + m_texture_format_color = m_shadow_map_texture_32bit + ? video::ECOLOR_FORMAT::ECF_G32R32F + : video::ECOLOR_FORMAT::ECF_G16R16F; + + m_shadows_enabled &= m_shadows_supported; +} + + +size_t ShadowRenderer::addDirectionalLight() +{ + m_light_list.emplace_back(m_shadow_map_texture_size, + v3f(0.f, 0.f, 0.f), + video::SColor(255, 255, 255, 255), m_shadow_map_max_distance); + return m_light_list.size() - 1; +} + +DirectionalLight &ShadowRenderer::getDirectionalLight(u32 index) +{ + return m_light_list[index]; +} + +size_t ShadowRenderer::getDirectionalLightCount() const +{ + return m_light_list.size(); +} + +f32 ShadowRenderer::getMaxShadowFar() const +{ + if (!m_light_list.empty()) { + float zMax = m_light_list[0].getFarValue(); + return zMax; + } + return 0.0f; +} + +void ShadowRenderer::setShadowIntensity(float shadow_intensity) +{ + m_shadow_strength = pow(shadow_intensity, 1.0f / m_shadow_strength_gamma); + if (m_shadow_strength > 1E-2) + enable(); + else + disable(); +} + +void ShadowRenderer::addNodeToShadowList( + scene::ISceneNode *node, E_SHADOW_MODE shadowMode) +{ + if (!node) + return; + m_shadow_node_array.emplace_back(node, shadowMode); + if (shadowMode == ESM_RECEIVE || shadowMode == ESM_BOTH) + node->setMaterialTexture(TEXTURE_LAYER_SHADOW, shadowMapTextureFinal); +} + +void ShadowRenderer::removeNodeFromShadowList(scene::ISceneNode *node) +{ + if (!node) + return; + node->setMaterialTexture(TEXTURE_LAYER_SHADOW, nullptr); + for (auto it = m_shadow_node_array.begin(); it != m_shadow_node_array.end();) { + if (it->node == node) { + it = m_shadow_node_array.erase(it); + break; + } else { + ++it; + } + } +} + +void ShadowRenderer::updateSMTextures() +{ + if (!m_shadows_enabled || m_smgr->getActiveCamera() == nullptr) { + return; + } + + if (!shadowMapTextureDynamicObjects) { + + shadowMapTextureDynamicObjects = getSMTexture( + std::string("shadow_dynamic_") + itos(m_shadow_map_texture_size), + m_texture_format, true); + assert(shadowMapTextureDynamicObjects != nullptr); + } + + if (!shadowMapClientMap) { + + shadowMapClientMap = getSMTexture( + std::string("shadow_clientmap_") + itos(m_shadow_map_texture_size), + m_shadow_map_colored ? m_texture_format_color : m_texture_format, + true); + assert(shadowMapClientMap != nullptr); + } + + if (!shadowMapClientMapFuture && m_map_shadow_update_frames > 1) { + shadowMapClientMapFuture = getSMTexture( + std::string("shadow_clientmap_bb_") + itos(m_shadow_map_texture_size), + m_shadow_map_colored ? m_texture_format_color : m_texture_format, + true); + assert(shadowMapClientMapFuture != nullptr); + } + + if (m_shadow_map_colored && !shadowMapTextureColors) { + shadowMapTextureColors = getSMTexture( + std::string("shadow_colored_") + itos(m_shadow_map_texture_size), + m_shadow_map_colored ? m_texture_format_color : m_texture_format, + true); + assert(shadowMapTextureColors != nullptr); + } + + // The merge all shadowmaps texture + if (!shadowMapTextureFinal) { + video::ECOLOR_FORMAT frt; + if (m_shadow_map_texture_32bit) { + if (m_shadow_map_colored) + frt = video::ECOLOR_FORMAT::ECF_A32B32G32R32F; + else + frt = video::ECOLOR_FORMAT::ECF_R32F; + } else { + if (m_shadow_map_colored) + frt = video::ECOLOR_FORMAT::ECF_A16B16G16R16F; + else + frt = video::ECOLOR_FORMAT::ECF_R16F; + } + shadowMapTextureFinal = getSMTexture( + std::string("shadowmap_final_") + itos(m_shadow_map_texture_size), + frt, true); + assert(shadowMapTextureFinal != nullptr); + + for (auto &node : m_shadow_node_array) + if (node.shadowMode == ESM_RECEIVE || node.shadowMode == ESM_BOTH) + node.node->setMaterialTexture(TEXTURE_LAYER_SHADOW, shadowMapTextureFinal); + } + + if (!m_shadow_node_array.empty() && !m_light_list.empty()) { + bool reset_sm_texture = false; + + // detect if SM should be regenerated + for (DirectionalLight &light : m_light_list) { + if (light.should_update_map_shadow || m_force_update_shadow_map) { + light.should_update_map_shadow = false; + m_current_frame = 0; + reset_sm_texture = true; + } + } + + video::ITexture* shadowMapTargetTexture = shadowMapClientMapFuture; + if (shadowMapTargetTexture == nullptr) + shadowMapTargetTexture = shadowMapClientMap; + + // Update SM incrementally: + for (DirectionalLight &light : m_light_list) { + // Static shader values. + for (auto cb : {m_shadow_depth_cb, m_shadow_depth_entity_cb, m_shadow_depth_trans_cb}) + if (cb) { + cb->MapRes = (f32)m_shadow_map_texture_size; + cb->MaxFar = (f32)m_shadow_map_max_distance * BS; + cb->PerspectiveBiasXY = getPerspectiveBiasXY(); + cb->PerspectiveBiasZ = getPerspectiveBiasZ(); + cb->CameraPos = light.getFuturePlayerPos(); + } + + // set the Render Target + // right now we can only render in usual RTT, not + // Depth texture is available in irrlicth maybe we + // should put some gl* fn here + + + if (m_current_frame < m_map_shadow_update_frames || m_force_update_shadow_map) { + m_driver->setRenderTarget(shadowMapTargetTexture, reset_sm_texture, true, + video::SColor(255, 255, 255, 255)); + renderShadowMap(shadowMapTargetTexture, light); + + // Render transparent part in one pass. + // This is also handled in ClientMap. + if (m_current_frame == m_map_shadow_update_frames - 1 || m_force_update_shadow_map) { + if (m_shadow_map_colored) { + m_driver->setRenderTarget(0, false, false); + m_driver->setRenderTarget(shadowMapTextureColors, + true, false, video::SColor(255, 255, 255, 255)); + } + renderShadowMap(shadowMapTextureColors, light, + scene::ESNRP_TRANSPARENT); + } + m_driver->setRenderTarget(0, false, false); + } + + reset_sm_texture = false; + } // end for lights + + // move to the next section + if (m_current_frame <= m_map_shadow_update_frames) + ++m_current_frame; + + // pass finished, swap textures and commit light changes + if (m_current_frame == m_map_shadow_update_frames || m_force_update_shadow_map) { + if (shadowMapClientMapFuture != nullptr) + std::swap(shadowMapClientMapFuture, shadowMapClientMap); + + // Let all lights know that maps are updated + for (DirectionalLight &light : m_light_list) + light.commitFrustum(); + } + m_force_update_shadow_map = false; + } +} + +void ShadowRenderer::update(video::ITexture *outputTarget) +{ + if (!m_shadows_enabled || m_smgr->getActiveCamera() == nullptr) { + return; + } + + updateSMTextures(); + + if (shadowMapTextureFinal == nullptr) { + return; + } + + + if (!m_shadow_node_array.empty() && !m_light_list.empty()) { + + for (DirectionalLight &light : m_light_list) { + // Static shader values for entities are set in updateSMTextures + // SM texture for entities is not updated incrementally and + // must by updated using current player position. + m_shadow_depth_entity_cb->CameraPos = light.getPlayerPos(); + + // render shadows for the n0n-map objects. + m_driver->setRenderTarget(shadowMapTextureDynamicObjects, true, + true, video::SColor(255, 255, 255, 255)); + renderShadowObjects(shadowMapTextureDynamicObjects, light); + // clear the Render Target + m_driver->setRenderTarget(0, false, false); + + // in order to avoid too many map shadow renders, + // we should make a second pass to mix clientmap shadows and + // entities shadows :( + m_screen_quad->getMaterial().setTexture(0, shadowMapClientMap); + // dynamic objs shadow texture. + if (m_shadow_map_colored) + m_screen_quad->getMaterial().setTexture(1, shadowMapTextureColors); + m_screen_quad->getMaterial().setTexture(2, shadowMapTextureDynamicObjects); + + m_driver->setRenderTarget(shadowMapTextureFinal, false, false, + video::SColor(255, 255, 255, 255)); + m_screen_quad->render(m_driver); + m_driver->setRenderTarget(0, false, false); + + } // end for lights + } +} + +void ShadowRenderer::drawDebug() +{ + /* this code just shows shadows textures in screen and in ONLY for debugging*/ + #if 0 + // this is debug, ignore for now. + if (shadowMapTextureFinal) + m_driver->draw2DImage(shadowMapTextureFinal, + core::rect<s32>(0, 50, 128, 128 + 50), + core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize())); + + if (shadowMapClientMap) + m_driver->draw2DImage(shadowMapClientMap, + core::rect<s32>(0, 50 + 128, 128, 128 + 50 + 128), + core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize())); + + if (shadowMapTextureDynamicObjects) + m_driver->draw2DImage(shadowMapTextureDynamicObjects, + core::rect<s32>(0, 128 + 50 + 128, 128, + 128 + 50 + 128 + 128), + core::rect<s32>({0, 0}, shadowMapTextureDynamicObjects->getSize())); + + if (m_shadow_map_colored && shadowMapTextureColors) { + + m_driver->draw2DImage(shadowMapTextureColors, + core::rect<s32>(128,128 + 50 + 128 + 128, + 128 + 128, 128 + 50 + 128 + 128 + 128), + core::rect<s32>({0, 0}, shadowMapTextureColors->getSize())); + } + #endif +} + + +video::ITexture *ShadowRenderer::getSMTexture(const std::string &shadow_map_name, + video::ECOLOR_FORMAT texture_format, bool force_creation) +{ + if (force_creation) { + return m_driver->addRenderTargetTexture( + core::dimension2du(m_shadow_map_texture_size, + m_shadow_map_texture_size), + shadow_map_name.c_str(), texture_format); + } + + return m_driver->getTexture(shadow_map_name.c_str()); +} + +void ShadowRenderer::renderShadowMap(video::ITexture *target, + DirectionalLight &light, scene::E_SCENE_NODE_RENDER_PASS pass) +{ + m_driver->setTransform(video::ETS_VIEW, light.getFutureViewMatrix()); + m_driver->setTransform(video::ETS_PROJECTION, light.getFutureProjectionMatrix()); + + // Operate on the client map + for (const auto &shadow_node : m_shadow_node_array) { + if (strcmp(shadow_node.node->getName(), "ClientMap") != 0) + continue; + + ClientMap *map_node = static_cast<ClientMap *>(shadow_node.node); + + video::SMaterial material; + if (map_node->getMaterialCount() > 0) { + // we only want the first material, which is the one with the albedo info + material = map_node->getMaterial(0); + } + + material.BackfaceCulling = false; + material.FrontfaceCulling = true; + + if (m_shadow_map_colored && pass != scene::ESNRP_SOLID) { + material.MaterialType = (video::E_MATERIAL_TYPE) depth_shader_trans; + } + else { + material.MaterialType = (video::E_MATERIAL_TYPE) depth_shader; + material.BlendOperation = video::EBO_MIN; + } + + m_driver->setTransform(video::ETS_WORLD, + map_node->getAbsoluteTransformation()); + + int frame = m_force_update_shadow_map ? 0 : m_current_frame; + int total_frames = m_force_update_shadow_map ? 1 : m_map_shadow_update_frames; + + map_node->renderMapShadows(m_driver, material, pass, frame, total_frames); + break; + } +} + +void ShadowRenderer::renderShadowObjects( + video::ITexture *target, DirectionalLight &light) +{ + m_driver->setTransform(video::ETS_VIEW, light.getViewMatrix()); + m_driver->setTransform(video::ETS_PROJECTION, light.getProjectionMatrix()); + + for (const auto &shadow_node : m_shadow_node_array) { + // we only take care of the shadow casters + if (shadow_node.shadowMode == ESM_RECEIVE || + strcmp(shadow_node.node->getName(), "ClientMap") == 0) + continue; + + // render other objects + u32 n_node_materials = shadow_node.node->getMaterialCount(); + std::vector<s32> BufferMaterialList; + std::vector<std::pair<bool, bool>> BufferMaterialCullingList; + std::vector<video::E_BLEND_OPERATION> BufferBlendOperationList; + BufferMaterialList.reserve(n_node_materials); + BufferMaterialCullingList.reserve(n_node_materials); + BufferBlendOperationList.reserve(n_node_materials); + + // backup materialtype for each material + // (aka shader) + // and replace it by our "depth" shader + for (u32 m = 0; m < n_node_materials; m++) { + auto ¤t_mat = shadow_node.node->getMaterial(m); + + BufferMaterialList.push_back(current_mat.MaterialType); + current_mat.MaterialType = + (video::E_MATERIAL_TYPE)depth_shader_entities; + + BufferMaterialCullingList.emplace_back( + (bool)current_mat.BackfaceCulling, (bool)current_mat.FrontfaceCulling); + BufferBlendOperationList.push_back(current_mat.BlendOperation); + + current_mat.BackfaceCulling = true; + current_mat.FrontfaceCulling = false; + } + + m_driver->setTransform(video::ETS_WORLD, + shadow_node.node->getAbsoluteTransformation()); + shadow_node.node->render(); + + // restore the material. + + for (u32 m = 0; m < n_node_materials; m++) { + auto ¤t_mat = shadow_node.node->getMaterial(m); + + current_mat.MaterialType = (video::E_MATERIAL_TYPE) BufferMaterialList[m]; + + current_mat.BackfaceCulling = BufferMaterialCullingList[m].first; + current_mat.FrontfaceCulling = BufferMaterialCullingList[m].second; + current_mat.BlendOperation = BufferBlendOperationList[m]; + } + + } // end for caster shadow nodes +} + +void ShadowRenderer::mixShadowsQuad() +{ +} + +/* + * @Liso's disclaimer ;) This function loads the Shadow Mapping Shaders. + * I used a custom loader because I couldn't figure out how to use the base + * Shaders system with custom IShaderConstantSetCallBack without messing up the + * code too much. If anyone knows how to integrate this with the standard MT + * shaders, please feel free to change it. + */ + +void ShadowRenderer::createShaders() +{ + video::IGPUProgrammingServices *gpu = m_driver->getGPUProgrammingServices(); + + if (depth_shader == -1) { + std::string depth_shader_vs = getShaderPath("shadow_shaders", "pass1_vertex.glsl"); + if (depth_shader_vs.empty()) { + m_shadows_supported = false; + errorstream << "Error shadow mapping vs shader not found." << std::endl; + return; + } + std::string depth_shader_fs = getShaderPath("shadow_shaders", "pass1_fragment.glsl"); + if (depth_shader_fs.empty()) { + m_shadows_supported = false; + errorstream << "Error shadow mapping fs shader not found." << std::endl; + return; + } + m_shadow_depth_cb = new ShadowDepthShaderCB(); + + depth_shader = gpu->addHighLevelShaderMaterial( + readShaderFile(depth_shader_vs).c_str(), "vertexMain", + video::EVST_VS_1_1, + readShaderFile(depth_shader_fs).c_str(), "pixelMain", + video::EPST_PS_1_2, m_shadow_depth_cb, video::EMT_ONETEXTURE_BLEND); + + if (depth_shader == -1) { + // upsi, something went wrong loading shader. + delete m_shadow_depth_cb; + m_shadow_depth_cb = nullptr; + m_shadows_enabled = false; + m_shadows_supported = false; + errorstream << "Error compiling shadow mapping shader." << std::endl; + return; + } + + // HACK, TODO: investigate this better + // Grab the material renderer once more so minetest doesn't crash + // on exit + m_driver->getMaterialRenderer(depth_shader)->grab(); + } + + // This creates a clone of depth_shader with base material set to EMT_SOLID, + // because entities won't render shadows with base material EMP_ONETEXTURE_BLEND + if (depth_shader_entities == -1) { + std::string depth_shader_vs = getShaderPath("shadow_shaders", "pass1_vertex.glsl"); + if (depth_shader_vs.empty()) { + m_shadows_supported = false; + errorstream << "Error shadow mapping vs shader not found." << std::endl; + return; + } + std::string depth_shader_fs = getShaderPath("shadow_shaders", "pass1_fragment.glsl"); + if (depth_shader_fs.empty()) { + m_shadows_supported = false; + errorstream << "Error shadow mapping fs shader not found." << std::endl; + return; + } + m_shadow_depth_entity_cb = new ShadowDepthShaderCB(); + + depth_shader_entities = gpu->addHighLevelShaderMaterial( + readShaderFile(depth_shader_vs).c_str(), "vertexMain", + video::EVST_VS_1_1, + readShaderFile(depth_shader_fs).c_str(), "pixelMain", + video::EPST_PS_1_2, m_shadow_depth_entity_cb); + + if (depth_shader_entities == -1) { + // upsi, something went wrong loading shader. + delete m_shadow_depth_entity_cb; + m_shadow_depth_entity_cb = nullptr; + m_shadows_enabled = false; + m_shadows_supported = false; + errorstream << "Error compiling shadow mapping shader (dynamic)." << std::endl; + return; + } + + // HACK, TODO: investigate this better + // Grab the material renderer once more so minetest doesn't crash + // on exit + m_driver->getMaterialRenderer(depth_shader_entities)->grab(); + } + + if (mixcsm_shader == -1) { + std::string depth_shader_vs = getShaderPath("shadow_shaders", "pass2_vertex.glsl"); + if (depth_shader_vs.empty()) { + m_shadows_supported = false; + errorstream << "Error cascade shadow mapping fs shader not found." << std::endl; + return; + } + + std::string depth_shader_fs = getShaderPath("shadow_shaders", "pass2_fragment.glsl"); + if (depth_shader_fs.empty()) { + m_shadows_supported = false; + errorstream << "Error cascade shadow mapping fs shader not found." << std::endl; + return; + } + m_shadow_mix_cb = new shadowScreenQuadCB(); + m_screen_quad = new shadowScreenQuad(); + mixcsm_shader = gpu->addHighLevelShaderMaterial( + readShaderFile(depth_shader_vs).c_str(), "vertexMain", + video::EVST_VS_1_1, + readShaderFile(depth_shader_fs).c_str(), "pixelMain", + video::EPST_PS_1_2, m_shadow_mix_cb); + + m_screen_quad->getMaterial().MaterialType = + (video::E_MATERIAL_TYPE)mixcsm_shader; + + if (mixcsm_shader == -1) { + // upsi, something went wrong loading shader. + delete m_shadow_mix_cb; + delete m_screen_quad; + m_shadows_supported = false; + errorstream << "Error compiling cascade shadow mapping shader." << std::endl; + return; + } + + // HACK, TODO: investigate this better + // Grab the material renderer once more so minetest doesn't crash + // on exit + m_driver->getMaterialRenderer(mixcsm_shader)->grab(); + } + + if (m_shadow_map_colored && depth_shader_trans == -1) { + std::string depth_shader_vs = getShaderPath("shadow_shaders", "pass1_trans_vertex.glsl"); + if (depth_shader_vs.empty()) { + m_shadows_supported = false; + errorstream << "Error shadow mapping vs shader not found." << std::endl; + return; + } + std::string depth_shader_fs = getShaderPath("shadow_shaders", "pass1_trans_fragment.glsl"); + if (depth_shader_fs.empty()) { + m_shadows_supported = false; + errorstream << "Error shadow mapping fs shader not found." << std::endl; + return; + } + m_shadow_depth_trans_cb = new ShadowDepthShaderCB(); + + depth_shader_trans = gpu->addHighLevelShaderMaterial( + readShaderFile(depth_shader_vs).c_str(), "vertexMain", + video::EVST_VS_1_1, + readShaderFile(depth_shader_fs).c_str(), "pixelMain", + video::EPST_PS_1_2, m_shadow_depth_trans_cb); + + if (depth_shader_trans == -1) { + // upsi, something went wrong loading shader. + delete m_shadow_depth_trans_cb; + m_shadow_depth_trans_cb = nullptr; + m_shadow_map_colored = false; + m_shadows_supported = false; + errorstream << "Error compiling colored shadow mapping shader." << std::endl; + return; + } + + // HACK, TODO: investigate this better + // Grab the material renderer once more so minetest doesn't crash + // on exit + m_driver->getMaterialRenderer(depth_shader_trans)->grab(); + } +} + +std::string ShadowRenderer::readShaderFile(const std::string &path) +{ + std::string prefix; + if (m_shadow_map_colored) + prefix.append("#define COLORED_SHADOWS 1\n"); + prefix.append("#line 0\n"); + + std::string content; + fs::ReadFile(path, content); + + return prefix + content; +} diff --git a/src/client/shadows/dynamicshadowsrender.h b/src/client/shadows/dynamicshadowsrender.h new file mode 100644 index 000000000..bd27f6f20 --- /dev/null +++ b/src/client/shadows/dynamicshadowsrender.h @@ -0,0 +1,162 @@ +/* +Minetest +Copyright (C) 2021 Liso <anlismon@gmail.com> + +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. +*/ + +#pragma once + +#include <string> +#include <vector> +#include "irrlichttypes_extrabloated.h" +#include "client/shadows/dynamicshadows.h" + +class ShadowDepthShaderCB; +class shadowScreenQuad; +class shadowScreenQuadCB; + +enum E_SHADOW_MODE : u8 +{ + ESM_RECEIVE = 0, + ESM_BOTH, +}; + +struct NodeToApply +{ + NodeToApply(scene::ISceneNode *n, + E_SHADOW_MODE m = E_SHADOW_MODE::ESM_BOTH) : + node(n), + shadowMode(m){}; + bool operator<(const NodeToApply &other) const { return node < other.node; }; + + scene::ISceneNode *node; + + E_SHADOW_MODE shadowMode{E_SHADOW_MODE::ESM_BOTH}; + bool dirty{false}; +}; + +class ShadowRenderer +{ +public: + static const int TEXTURE_LAYER_SHADOW = 3; + + ShadowRenderer(IrrlichtDevice *device, Client *client); + + ~ShadowRenderer(); + + void initialize(); + + /// Adds a directional light shadow map (Usually just one (the sun) except in + /// Tattoine ). + size_t addDirectionalLight(); + DirectionalLight &getDirectionalLight(u32 index = 0); + size_t getDirectionalLightCount() const; + f32 getMaxShadowFar() const; + + /// Adds a shadow to the scene node. + /// The shadow mode can be ESM_BOTH, or ESM_RECEIVE. + /// ESM_BOTH casts and receives shadows + /// ESM_RECEIVE only receives but does not cast shadows. + /// + void addNodeToShadowList(scene::ISceneNode *node, + E_SHADOW_MODE shadowMode = ESM_BOTH); + void removeNodeFromShadowList(scene::ISceneNode *node); + + void update(video::ITexture *outputTarget = nullptr); + void setForceUpdateShadowMap() { m_force_update_shadow_map = true; } + void drawDebug(); + + video::ITexture *get_texture() + { + return shadowMapTextureFinal; + } + + + bool is_active() const { return m_shadows_enabled && shadowMapTextureFinal != nullptr; } + void setTimeOfDay(float isDay) { m_time_day = isDay; }; + void setShadowIntensity(float shadow_intensity); + + s32 getShadowSamples() const { return m_shadow_samples; } + float getShadowStrength() const { return m_shadows_enabled ? m_shadow_strength : 0.0f; } + float getTimeOfDay() const { return m_time_day; } + + f32 getPerspectiveBiasXY() { return m_perspective_bias_xy; } + f32 getPerspectiveBiasZ() { return m_perspective_bias_z; } + +private: + video::ITexture *getSMTexture(const std::string &shadow_map_name, + video::ECOLOR_FORMAT texture_format, + bool force_creation = false); + + void renderShadowMap(video::ITexture *target, DirectionalLight &light, + scene::E_SCENE_NODE_RENDER_PASS pass = + scene::ESNRP_SOLID); + void renderShadowObjects(video::ITexture *target, DirectionalLight &light); + void mixShadowsQuad(); + void updateSMTextures(); + + void disable(); + void enable() { m_shadows_enabled = m_shadows_supported; } + + // a bunch of variables + scene::ISceneManager *m_smgr{nullptr}; + video::IVideoDriver *m_driver{nullptr}; + Client *m_client{nullptr}; + video::ITexture *shadowMapClientMap{nullptr}; + video::ITexture *shadowMapClientMapFuture{nullptr}; + video::ITexture *shadowMapTextureFinal{nullptr}; + video::ITexture *shadowMapTextureDynamicObjects{nullptr}; + video::ITexture *shadowMapTextureColors{nullptr}; + + std::vector<DirectionalLight> m_light_list; + std::vector<NodeToApply> m_shadow_node_array; + + float m_shadow_strength; + float m_shadow_strength_gamma; + float m_shadow_map_max_distance; + float m_shadow_map_texture_size; + float m_time_day{0.0f}; + int m_shadow_samples; + bool m_shadow_map_texture_32bit; + bool m_shadows_enabled; + bool m_shadows_supported; + bool m_shadow_map_colored; + bool m_force_update_shadow_map; + u8 m_map_shadow_update_frames; /* Use this number of frames to update map shaodw */ + u8 m_current_frame{0}; /* Current frame */ + f32 m_perspective_bias_xy; + f32 m_perspective_bias_z; + + video::ECOLOR_FORMAT m_texture_format{video::ECOLOR_FORMAT::ECF_R16F}; + video::ECOLOR_FORMAT m_texture_format_color{video::ECOLOR_FORMAT::ECF_R16G16}; + + // Shadow Shader stuff + + void createShaders(); + std::string readShaderFile(const std::string &path); + + s32 depth_shader{-1}; + s32 depth_shader_entities{-1}; + s32 depth_shader_trans{-1}; + s32 mixcsm_shader{-1}; + + ShadowDepthShaderCB *m_shadow_depth_cb{nullptr}; + ShadowDepthShaderCB *m_shadow_depth_entity_cb{nullptr}; + ShadowDepthShaderCB *m_shadow_depth_trans_cb{nullptr}; + + shadowScreenQuad *m_screen_quad{nullptr}; + shadowScreenQuadCB *m_shadow_mix_cb{nullptr}; +}; diff --git a/src/client/shadows/shadowsScreenQuad.cpp b/src/client/shadows/shadowsScreenQuad.cpp new file mode 100644 index 000000000..5f6d38157 --- /dev/null +++ b/src/client/shadows/shadowsScreenQuad.cpp @@ -0,0 +1,61 @@ +/* +Minetest +Copyright (C) 2021 Liso <anlismon@gmail.com> + +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. +*/ + +#include "shadowsScreenQuad.h" + +shadowScreenQuad::shadowScreenQuad() +{ + Material.Wireframe = false; + Material.Lighting = false; + + video::SColor color(0x0); + Vertices[0] = video::S3DVertex( + -1.0f, -1.0f, 0.0f, 0, 0, 1, color, 0.0f, 1.0f); + Vertices[1] = video::S3DVertex( + -1.0f, 1.0f, 0.0f, 0, 0, 1, color, 0.0f, 0.0f); + Vertices[2] = video::S3DVertex( + 1.0f, 1.0f, 0.0f, 0, 0, 1, color, 1.0f, 0.0f); + Vertices[3] = video::S3DVertex( + 1.0f, -1.0f, 0.0f, 0, 0, 1, color, 1.0f, 1.0f); + Vertices[4] = video::S3DVertex( + -1.0f, -1.0f, 0.0f, 0, 0, 1, color, 0.0f, 1.0f); + Vertices[5] = video::S3DVertex( + 1.0f, 1.0f, 0.0f, 0, 0, 1, color, 1.0f, 0.0f); +} + +void shadowScreenQuad::render(video::IVideoDriver *driver) +{ + u16 indices[6] = {0, 1, 2, 3, 4, 5}; + driver->setMaterial(Material); + driver->setTransform(video::ETS_WORLD, core::matrix4()); + driver->drawIndexedTriangleList(&Vertices[0], 6, &indices[0], 2); +} + +void shadowScreenQuadCB::OnSetConstants( + video::IMaterialRendererServices *services, s32 userData) +{ + s32 TextureId = 0; + m_sm_client_map_setting.set(&TextureId, services); + + TextureId = 1; + m_sm_client_map_trans_setting.set(&TextureId, services); + + TextureId = 2; + m_sm_dynamic_sampler_setting.set(&TextureId, services); +} diff --git a/src/client/shadows/shadowsScreenQuad.h b/src/client/shadows/shadowsScreenQuad.h new file mode 100644 index 000000000..c18be9a2b --- /dev/null +++ b/src/client/shadows/shadowsScreenQuad.h @@ -0,0 +1,54 @@ +/* +Minetest +Copyright (C) 2021 Liso <anlismon@gmail.com> + +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. +*/ + +#pragma once +#include "irrlichttypes_extrabloated.h" +#include <IMaterialRendererServices.h> +#include <IShaderConstantSetCallBack.h> +#include "client/shader.h" + +class shadowScreenQuad +{ +public: + shadowScreenQuad(); + + void render(video::IVideoDriver *driver); + video::SMaterial &getMaterial() { return Material; } + +private: + video::S3DVertex Vertices[6]; + video::SMaterial Material; +}; + +class shadowScreenQuadCB : public video::IShaderConstantSetCallBack +{ +public: + shadowScreenQuadCB() : + m_sm_client_map_setting("ShadowMapClientMap"), + m_sm_client_map_trans_setting("ShadowMapClientMapTraslucent"), + m_sm_dynamic_sampler_setting("ShadowMapSamplerdynamic") + {} + + virtual void OnSetConstants(video::IMaterialRendererServices *services, + s32 userData); +private: + CachedPixelShaderSetting<s32> m_sm_client_map_setting; + CachedPixelShaderSetting<s32> m_sm_client_map_trans_setting; + CachedPixelShaderSetting<s32> m_sm_dynamic_sampler_setting; +}; diff --git a/src/client/shadows/shadowsshadercallbacks.cpp b/src/client/shadows/shadowsshadercallbacks.cpp new file mode 100644 index 000000000..b571ea939 --- /dev/null +++ b/src/client/shadows/shadowsshadercallbacks.cpp @@ -0,0 +1,48 @@ +/* +Minetest +Copyright (C) 2021 Liso <anlismon@gmail.com> + +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. +*/ + +#include "client/shadows/shadowsshadercallbacks.h" + +void ShadowDepthShaderCB::OnSetConstants( + video::IMaterialRendererServices *services, s32 userData) +{ + video::IVideoDriver *driver = services->getVideoDriver(); + + core::matrix4 lightMVP = driver->getTransform(video::ETS_PROJECTION); + lightMVP *= driver->getTransform(video::ETS_VIEW); + + f32 cam_pos[4]; + lightMVP.transformVect(cam_pos, CameraPos); + + lightMVP *= driver->getTransform(video::ETS_WORLD); + + m_light_mvp_setting.set(lightMVP.pointer(), services); + m_map_resolution_setting.set(&MapRes, services); + m_max_far_setting.set(&MaxFar, services); + s32 TextureId = 0; + m_color_map_sampler_setting.set(&TextureId, services); + f32 bias0 = PerspectiveBiasXY; + m_perspective_bias0.set(&bias0, services); + f32 bias1 = 1.0f - bias0 + 1e-5f; + m_perspective_bias1.set(&bias1, services); + f32 zbias = PerspectiveBiasZ; + m_perspective_zbias.set(&zbias, services); + + m_cam_pos_setting.set(cam_pos, services); +} diff --git a/src/client/shadows/shadowsshadercallbacks.h b/src/client/shadows/shadowsshadercallbacks.h new file mode 100644 index 000000000..87833c0ec --- /dev/null +++ b/src/client/shadows/shadowsshadercallbacks.h @@ -0,0 +1,58 @@ +/* +Minetest +Copyright (C) 2021 Liso <anlismon@gmail.com> + +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. +*/ + +#pragma once +#include "irrlichttypes_extrabloated.h" +#include <IMaterialRendererServices.h> +#include <IShaderConstantSetCallBack.h> +#include "client/shader.h" + +class ShadowDepthShaderCB : public video::IShaderConstantSetCallBack +{ +public: + ShadowDepthShaderCB() : + m_light_mvp_setting("LightMVP"), + m_map_resolution_setting("MapResolution"), + m_max_far_setting("MaxFar"), + m_color_map_sampler_setting("ColorMapSampler"), + m_perspective_bias0("xyPerspectiveBias0"), + m_perspective_bias1("xyPerspectiveBias1"), + m_perspective_zbias("zPerspectiveBias"), + m_cam_pos_setting("CameraPos") + {} + + void OnSetMaterial(const video::SMaterial &material) override {} + + void OnSetConstants(video::IMaterialRendererServices *services, + s32 userData) override; + + f32 MaxFar{2048.0f}, MapRes{1024.0f}; + f32 PerspectiveBiasXY {0.9f}, PerspectiveBiasZ {0.5f}; + v3f CameraPos; + +private: + CachedVertexShaderSetting<f32, 16> m_light_mvp_setting; + CachedVertexShaderSetting<f32> m_map_resolution_setting; + CachedVertexShaderSetting<f32> m_max_far_setting; + CachedPixelShaderSetting<s32> m_color_map_sampler_setting; + CachedVertexShaderSetting<f32> m_perspective_bias0; + CachedVertexShaderSetting<f32> m_perspective_bias1; + CachedVertexShaderSetting<f32> m_perspective_zbias; + CachedVertexShaderSetting<f32, 4> m_cam_pos_setting; +}; diff --git a/src/client/sky.cpp b/src/client/sky.cpp index 2e0cbca86..5541b16aa 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -1,6 +1,7 @@ /* Minetest Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2020 numzero, Lobachevskiy Vitaliy <numzer0@yandex.ru> 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 @@ -17,100 +18,97 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include <cmath> #include "sky.h" -#include "ITexture.h" -#include "IVideoDriver.h" -#include "ISceneManager.h" -#include "ICameraSceneNode.h" -#include "S3DVertex.h" +#include <ITexture.h> +#include <IVideoDriver.h> +#include <ISceneManager.h> +#include <ICameraSceneNode.h> +#include <S3DVertex.h> #include "client/tile.h" #include "noise.h" // easeCurve #include "profiler.h" #include "util/numeric.h" -#include <cmath> #include "client/renderingengine.h" #include "settings.h" #include "camera.h" // CameraModes -#include "config.h" + using namespace irr::core; -Sky::Sky(s32 id, ITextureSource *tsrc) : - scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(), - RenderingEngine::get_scene_manager(), id) +static video::SMaterial baseMaterial() { - setAutomaticCulling(scene::EAC_OFF); - m_box.MaxEdge.set(0, 0, 0); - m_box.MinEdge.set(0, 0, 0); - - // Create material - video::SMaterial mat; mat.Lighting = false; -#if ENABLE_GLES +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 mat.ZBuffer = video::ECFN_DISABLED; + mat.ZWriteEnable = video::EZW_OFF; #else + mat.ZWriteEnable = false; mat.ZBuffer = video::ECFN_NEVER; #endif - mat.ZWriteEnable = false; mat.AntiAliasing = 0; mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE; mat.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE; mat.BackfaceCulling = false; + return mat; +} - m_materials[0] = mat; +static inline void disableTextureFiltering(video::SMaterial &mat) +{ + mat.setFlag(video::E_MATERIAL_FLAG::EMF_BILINEAR_FILTER, false); + mat.setFlag(video::E_MATERIAL_FLAG::EMF_TRILINEAR_FILTER, false); + mat.setFlag(video::E_MATERIAL_FLAG::EMF_ANISOTROPIC_FILTER, false); +} - m_materials[1] = mat; - //m_materials[1].MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA; +Sky::Sky(s32 id, RenderingEngine *rendering_engine, ITextureSource *tsrc, IShaderSource *ssrc) : + scene::ISceneNode(rendering_engine->get_scene_manager()->getRootSceneNode(), + rendering_engine->get_scene_manager(), id) +{ + m_seed = (u64)myrand() << 32 | myrand(); + + setAutomaticCulling(scene::EAC_OFF); + m_box.MaxEdge.set(0, 0, 0); + m_box.MinEdge.set(0, 0, 0); + + m_enable_shaders = g_settings->getBool("enable_shaders"); + + m_sky_params = SkyboxDefaults::getSkyDefaults(); + m_sun_params = SkyboxDefaults::getSunDefaults(); + m_moon_params = SkyboxDefaults::getMoonDefaults(); + m_star_params = SkyboxDefaults::getStarDefaults(); + + // Create materials + + m_materials[0] = baseMaterial(); + m_materials[0].MaterialType = ssrc->getShaderInfo(ssrc->getShader("stars_shader", TILE_MATERIAL_ALPHA)).material; + m_materials[0].Lighting = true; + m_materials[0].ColorMaterial = video::ECM_NONE; + + m_materials[1] = baseMaterial(); m_materials[1].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - m_materials[2] = mat; + m_materials[2] = baseMaterial(); m_materials[2].setTexture(0, tsrc->getTextureForMesh("sunrisebg.png")); m_materials[2].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - //m_materials[2].MaterialType = video::EMT_TRANSPARENT_ADD_COLOR; - // Ensures that sun and moon textures and tonemaps are correct. - setSkyDefaults(); - m_sun_texture = tsrc->isKnownSourceImage(m_sun_params.texture) ? - tsrc->getTextureForMesh(m_sun_params.texture) : NULL; - m_moon_texture = tsrc->isKnownSourceImage(m_moon_params.texture) ? - tsrc->getTextureForMesh(m_moon_params.texture) : NULL; - m_sun_tonemap = tsrc->isKnownSourceImage(m_sun_params.tonemap) ? - tsrc->getTexture(m_sun_params.tonemap) : NULL; - m_moon_tonemap = tsrc->isKnownSourceImage(m_moon_params.tonemap) ? - tsrc->getTexture(m_moon_params.tonemap) : NULL; + setSunTexture(m_sun_params.texture, m_sun_params.tonemap, tsrc); - if (m_sun_texture) { - m_materials[3] = mat; - m_materials[3].setTexture(0, m_sun_texture); - m_materials[3].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - // Disables texture filtering - m_materials[3].setFlag(video::E_MATERIAL_FLAG::EMF_BILINEAR_FILTER, false); - m_materials[3].setFlag(video::E_MATERIAL_FLAG::EMF_TRILINEAR_FILTER, false); - m_materials[3].setFlag(video::E_MATERIAL_FLAG::EMF_ANISOTROPIC_FILTER, false); - // Use tonemaps if available - if (m_sun_tonemap) - m_materials[3].Lighting = true; - } - if (m_moon_texture) { - m_materials[4] = mat; - m_materials[4].setTexture(0, m_moon_texture); - m_materials[4].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - // Disables texture filtering - m_materials[4].setFlag(video::E_MATERIAL_FLAG::EMF_BILINEAR_FILTER, false); - m_materials[4].setFlag(video::E_MATERIAL_FLAG::EMF_TRILINEAR_FILTER, false); - m_materials[4].setFlag(video::E_MATERIAL_FLAG::EMF_ANISOTROPIC_FILTER, false); - // Use tonemaps if available - if (m_moon_tonemap) - m_materials[4].Lighting = true; - } + setMoonTexture(m_moon_params.texture, m_moon_params.tonemap, tsrc); for (int i = 5; i < 11; i++) { - m_materials[i] = mat; + m_materials[i] = baseMaterial(); m_materials[i].Lighting = true; m_materials[i].MaterialType = video::EMT_SOLID; } + m_directional_colored_fog = g_settings->getBool("directional_colored_fog"); - setStarCount(1000, true); + + if (g_settings->getBool("enable_dynamic_shadows")) { + float val = g_settings->getFloat("shadow_sky_body_orbit_tilt"); + m_sky_body_orbit_tilt = rangelim(val, 0.0f, 60.0f); + } + + setStarCount(1000); } void Sky::OnRegisterSceneNode() @@ -162,17 +160,7 @@ void Sky::render() video::SColorf mooncolor_f(0.50, 0.57, 0.65, 1); video::SColorf mooncolor2_f(0.85, 0.875, 0.9, 1); - float nightlength = 0.415; - float wn = nightlength / 2; - float wicked_time_of_day = 0; - if (m_time_of_day > wn && m_time_of_day < 1.0 - wn) - wicked_time_of_day = (m_time_of_day - wn) / (1.0 - wn * 2) * 0.5 + 0.25; - else if (m_time_of_day < 0.5) - wicked_time_of_day = m_time_of_day / wn * 0.25; - else - wicked_time_of_day = 1.0 - ((1.0 - m_time_of_day) / wn * 0.25); - /*std::cerr<<"time_of_day="<<m_time_of_day<<" -> " - <<"wicked_time_of_day="<<wicked_time_of_day<<std::endl;*/ + float wicked_time_of_day = getWickedTimeOfDay(m_time_of_day); video::SColor suncolor = suncolor_f.toSColor(); video::SColor suncolor2 = suncolor2_f.toSColor(); @@ -202,7 +190,7 @@ void Sky::render() const f32 t = 1.0f; const f32 o = 0.0f; - static const u16 indices[4] = {0, 1, 2, 3}; + static const u16 indices[6] = {0, 1, 2, 0, 2, 3}; video::S3DVertex vertices[4]; driver->setMaterial(m_materials[1]); @@ -244,7 +232,7 @@ void Sky::render() vertex.Pos.rotateXZBy(180); } } - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } @@ -270,7 +258,7 @@ void Sky::render() // Switch from -Z (south) to +Z (north) vertex.Pos.rotateXZBy(-180); } - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } @@ -301,7 +289,7 @@ void Sky::render() // Switch from -Z (south) to -X (west) vertex.Pos.rotateXZBy(-90); } - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } // Draw sun @@ -337,7 +325,7 @@ void Sky::render() // Switch from -Z (south) to +Z (north) vertex.Pos.rotateXZBy(-180); } - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } // Draw bottom far cloudy fog thing in front of sun, moon and stars @@ -346,7 +334,7 @@ void Sky::render() vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 1, 0, c, o, t); vertices[2] = video::S3DVertex( 1, -1.0, 1, 0, 1, 0, c, o, o); vertices[3] = video::S3DVertex(-1, -1.0, 1, 0, 1, 0, c, t, o); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } } @@ -376,20 +364,6 @@ void Sky::update(float time_of_day, float time_brightness, bool is_dawn = (time_brightness >= 0.20 && time_brightness < 0.35); - /* - Development colours - - video::SColorf bgcolor_bright_normal_f(170. / 255, 200. / 255, 230. / 255, 1.0); - video::SColorf bgcolor_bright_dawn_f(0.666, 200. / 255 * 0.7, 230. / 255 * 0.5, 1.0); - video::SColorf bgcolor_bright_dawn_f(0.666, 0.549, 0.220, 1.0); - video::SColorf bgcolor_bright_dawn_f(0.666 * 1.2, 0.549 * 1.0, 0.220 * 1.0, 1.0); - video::SColorf bgcolor_bright_dawn_f(0.666 * 1.2, 0.549 * 1.0, 0.220 * 1.2, 1.0); - - video::SColorf cloudcolor_bright_dawn_f(1.0, 0.591, 0.4); - video::SColorf cloudcolor_bright_dawn_f(1.0, 0.65, 0.44); - video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5); - */ - video::SColorf bgcolor_bright_normal_f = m_sky_params.sky_color.day_horizon; video::SColorf bgcolor_bright_indoor_f = m_sky_params.sky_color.indoors; video::SColorf bgcolor_bright_dawn_f = m_sky_params.sky_color.dawn_horizon; @@ -580,6 +554,25 @@ void Sky::update(float time_of_day, float time_brightness, } } +static v3f getSkyBodyPosition(float horizon_position, float day_position, float orbit_tilt) +{ + v3f result = v3f(0, 0, -1); + result.rotateXZBy(horizon_position); + result.rotateXYBy(day_position); + result.rotateYZBy(orbit_tilt); + return result; +} + +v3f Sky::getSunDirection() +{ + return getSkyBodyPosition(90, getWickedTimeOfDay(m_time_of_day) * 360 - 90, m_sky_body_orbit_tilt); +} + +v3f Sky::getMoonDirection() +{ + return getSkyBodyPosition(270, getWickedTimeOfDay(m_time_of_day) * 360 - 90, m_sky_body_orbit_tilt); +} + void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SColor &suncolor, const video::SColor &suncolor2, float wicked_time_of_day) /* Draw sun in the sky. @@ -590,7 +583,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol * wicked_time_of_day: current time of day, to know where should be the sun in the sky */ { - static const u16 indices[4] = {0, 1, 2, 3}; + static const u16 indices[] = {0, 1, 2, 0, 2, 3}; std::array<video::S3DVertex, 4> vertices; if (!m_sun_texture) { driver->setMaterial(m_materials[1]); @@ -608,7 +601,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol for (int i = 0; i < 4; i++) { draw_sky_body(vertices, -sunsizes[i], sunsizes[i], colors[i]); place_sky_body(vertices, 90, wicked_time_of_day * 360 - 90); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } else { driver->setMaterial(m_materials[3]); @@ -620,7 +613,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol c = video::SColor(255, 255, 255, 255); draw_sky_body(vertices, -d, d, c); place_sky_body(vertices, 90, wicked_time_of_day * 360 - 90); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } @@ -637,7 +630,7 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC * the sky */ { - static const u16 indices[4] = {0, 1, 2, 3}; + static const u16 indices[] = {0, 1, 2, 0, 2, 3}; std::array<video::S3DVertex, 4> vertices; if (!m_moon_texture) { driver->setMaterial(m_materials[1]); @@ -661,7 +654,7 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC for (int i = 0; i < 4; i++) { draw_sky_body(vertices, moonsizes_1[i], moonsizes_2[i], colors[i]); place_sky_body(vertices, -90, wicked_time_of_day * 360 - 90); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } else { driver->setMaterial(m_materials[4]); @@ -673,13 +666,12 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC c = video::SColor(255, 255, 255, 255); draw_sky_body(vertices, -d, d, c); place_sky_body(vertices, -90, wicked_time_of_day * 360 - 90); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day) { - driver->setMaterial(m_materials[1]); // Tune values so that stars first appear just after the sun // disappears over the horizon, and disappear just before the sun // appears over the horizon. @@ -687,87 +679,21 @@ void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day) // to time 4000. float tod = wicked_time_of_day < 0.5f ? wicked_time_of_day : (1.0f - wicked_time_of_day); - float starbrightness = clamp((0.25f - fabsf(tod)) * 20.0f, 0.0f, 1.0f); + float day_opacity = clamp(m_star_params.day_opacity, 0.0f, 1.0f); + float starbrightness = (0.25f - fabs(tod)) * 20.0f; + float alpha = clamp(starbrightness, day_opacity, 1.0f); - float f = starbrightness; - float d = (0.006 / 2) * m_star_params.scale; - - video::SColor starcolor = m_star_params.starcolor; - starcolor.setAlpha(f * m_star_params.starcolor.getAlpha()); - - // Stars are only drawn when not fully transparent - if (m_star_params.starcolor.getAlpha() < 1) + m_star_color = m_star_params.starcolor; + m_star_color.a *= alpha; + if (m_star_color.a <= 0.0f) // Stars are only drawn when not fully transparent return; -#if ENABLE_GLES - u16 *indices = new u16[m_star_params.count * 3]; - video::S3DVertex *vertices = - new video::S3DVertex[m_star_params.count * 3]; - for (u32 i = 0; i < m_star_params.count; i++) { - indices[i * 3 + 0] = i * 3 + 0; - indices[i * 3 + 1] = i * 3 + 1; - indices[i * 3 + 2] = i * 3 + 2; - v3f r = m_stars[i]; - core::CMatrix4<f32> a; - a.buildRotateFromTo(v3f(0, 1, 0), r); - v3f p = v3f(-d, 1, -d); - v3f p1 = v3f(d, 1, 0); - v3f p2 = v3f(-d, 1, d); - a.rotateVect(p); - a.rotateVect(p1); - a.rotateVect(p2); - p.rotateXYBy(wicked_time_of_day * 360 - 90); - p1.rotateXYBy(wicked_time_of_day * 360 - 90); - p2.rotateXYBy(wicked_time_of_day * 360 - 90); - vertices[i * 3 + 0].Pos = p; - vertices[i * 3 + 0].Color = starcolor; - vertices[i * 3 + 1].Pos = p1; - vertices[i * 3 + 1].Color = starcolor; - vertices[i * 3 + 2].Pos = p2; - vertices[i * 3 + 2].Color = starcolor; - } - driver->drawIndexedTriangleList(vertices, m_star_params.count * 3, - indices, m_star_params.count); - delete[] indices; - delete[] vertices; -#else - u16 *indices = new u16[m_star_params.count * 4]; - video::S3DVertex *vertices = - new video::S3DVertex[m_star_params.count * 4]; - for (u32 i = 0; i < m_star_params.count; i++) { - indices[i * 4 + 0] = i * 4 + 0; - indices[i * 4 + 1] = i * 4 + 1; - indices[i * 4 + 2] = i * 4 + 2; - indices[i * 4 + 3] = i * 4 + 3; - v3f r = m_stars[i]; - core::CMatrix4<f32> a; - a.buildRotateFromTo(v3f(0, 1, 0), r); - v3f p = v3f(-d, 1, -d); - v3f p1 = v3f(d, 1, -d); - v3f p2 = v3f(d, 1, d); - v3f p3 = v3f(-d, 1, d); - a.rotateVect(p); - a.rotateVect(p1); - a.rotateVect(p2); - a.rotateVect(p3); - p.rotateXYBy(wicked_time_of_day * 360 - 90); - p1.rotateXYBy(wicked_time_of_day * 360 - 90); - p2.rotateXYBy(wicked_time_of_day * 360 - 90); - p3.rotateXYBy(wicked_time_of_day * 360 - 90); - vertices[i * 4 + 0].Pos = p; - vertices[i * 4 + 0].Color = starcolor; - vertices[i * 4 + 1].Pos = p1; - vertices[i * 4 + 1].Color = starcolor; - vertices[i * 4 + 2].Pos = p2; - vertices[i * 4 + 2].Color = starcolor; - vertices[i * 4 + 3].Pos = p3; - vertices[i * 4 + 3].Color = starcolor; - } - driver->drawVertexPrimitiveList(vertices, m_star_params.count * 4, - indices, m_star_params.count, video::EVT_STANDARD, - scene::EPT_QUADS, video::EIT_16BIT); - delete[] indices; - delete[] vertices; -#endif + m_materials[0].DiffuseColor = m_materials[0].EmissiveColor = m_star_color.toSColor(); + auto sky_rotation = core::matrix4().setRotationAxisRadians(2.0f * M_PI * (wicked_time_of_day - 0.25f), v3f(0.0f, 0.0f, 1.0f)); + auto world_matrix = driver->getTransform(video::ETS_WORLD); + driver->setTransform(video::ETS_WORLD, world_matrix * sky_rotation); + driver->setMaterial(m_materials[0]); + driver->drawMeshBuffer(m_stars.get()); + driver->setTransform(video::ETS_WORLD, world_matrix); } void Sky::draw_sky_body(std::array<video::S3DVertex, 4> &vertices, float pos_1, float pos_2, const video::SColor &c) @@ -796,50 +722,49 @@ void Sky::place_sky_body( * day_position: turn the body around the Z axis, to place it depending of the time of the day */ { + v3f centrum = getSkyBodyPosition(horizon_position, day_position, m_sky_body_orbit_tilt); + v3f untilted_centrum = getSkyBodyPosition(horizon_position, day_position, 0.f); for (video::S3DVertex &vertex : vertices) { // Body is directed to -Z (south) by default vertex.Pos.rotateXZBy(horizon_position); vertex.Pos.rotateXYBy(day_position); + vertex.Pos += centrum - untilted_centrum; } } -void Sky::setSunTexture(std::string sun_texture, - std::string sun_tonemap, ITextureSource *tsrc) +void Sky::setSunTexture(const std::string &sun_texture, + const std::string &sun_tonemap, ITextureSource *tsrc) { // Ignore matching textures (with modifiers) entirely, // but lets at least update the tonemap before hand. m_sun_params.tonemap = sun_tonemap; - m_sun_tonemap = tsrc->isKnownSourceImage(m_sun_params.tonemap) ? - tsrc->getTexture(m_sun_params.tonemap) : NULL; + m_sun_tonemap = tsrc->isKnownSourceImage(sun_tonemap) ? + tsrc->getTexture(sun_tonemap) : nullptr; m_materials[3].Lighting = !!m_sun_tonemap; - if (m_sun_params.texture == sun_texture) + if (m_sun_params.texture == sun_texture && !m_first_update) return; m_sun_params.texture = sun_texture; - if (sun_texture != "") { - // We want to ensure the texture exists first. - m_sun_texture = tsrc->getTextureForMesh(m_sun_params.texture); + m_sun_texture = nullptr; + if (sun_texture == "sun.png") { + // Dumb compatibility fix: sun.png transparently falls back to no texture + m_sun_texture = tsrc->isKnownSourceImage(sun_texture) ? + tsrc->getTexture(sun_texture) : nullptr; + } else if (!sun_texture.empty()) { + m_sun_texture = tsrc->getTextureForMesh(sun_texture); + } - if (m_sun_texture) { - m_materials[3] = m_materials[0]; - m_materials[3].setTexture(0, m_sun_texture); - m_materials[3].MaterialType = video:: - EMT_TRANSPARENT_ALPHA_CHANNEL; - // Disables texture filtering - m_materials[3].setFlag( - video::E_MATERIAL_FLAG::EMF_BILINEAR_FILTER, false); - m_materials[3].setFlag( - video::E_MATERIAL_FLAG::EMF_TRILINEAR_FILTER, false); - m_materials[3].setFlag( - video::E_MATERIAL_FLAG::EMF_ANISOTROPIC_FILTER, false); - } - } else { - m_sun_texture = nullptr; + if (m_sun_texture) { + m_materials[3] = baseMaterial(); + m_materials[3].setTexture(0, m_sun_texture); + m_materials[3].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + disableTextureFiltering(m_materials[3]); + m_materials[3].Lighting = !!m_sun_tonemap; } } -void Sky::setSunriseTexture(std::string sunglow_texture, +void Sky::setSunriseTexture(const std::string &sunglow_texture, ITextureSource* tsrc) { // Ignore matching textures (with modifiers) entirely. @@ -851,69 +776,103 @@ void Sky::setSunriseTexture(std::string sunglow_texture, ); } -void Sky::setMoonTexture(std::string moon_texture, - std::string moon_tonemap, ITextureSource *tsrc) +void Sky::setMoonTexture(const std::string &moon_texture, + const std::string &moon_tonemap, ITextureSource *tsrc) { // Ignore matching textures (with modifiers) entirely, // but lets at least update the tonemap before hand. m_moon_params.tonemap = moon_tonemap; - m_moon_tonemap = tsrc->isKnownSourceImage(m_moon_params.tonemap) ? - tsrc->getTexture(m_moon_params.tonemap) : NULL; + m_moon_tonemap = tsrc->isKnownSourceImage(moon_tonemap) ? + tsrc->getTexture(moon_tonemap) : nullptr; m_materials[4].Lighting = !!m_moon_tonemap; - if (m_moon_params.texture == moon_texture) + if (m_moon_params.texture == moon_texture && !m_first_update) return; m_moon_params.texture = moon_texture; - if (moon_texture != "") { - // We want to ensure the texture exists first. - m_moon_texture = tsrc->getTextureForMesh(m_moon_params.texture); + m_moon_texture = nullptr; + if (moon_texture == "moon.png") { + // Dumb compatibility fix: moon.png transparently falls back to no texture + m_moon_texture = tsrc->isKnownSourceImage(moon_texture) ? + tsrc->getTexture(moon_texture) : nullptr; + } else if (!moon_texture.empty()) { + m_moon_texture = tsrc->getTextureForMesh(moon_texture); + } - if (m_moon_texture) { - m_materials[4] = m_materials[0]; - m_materials[4].setTexture(0, m_moon_texture); - m_materials[4].MaterialType = video:: - EMT_TRANSPARENT_ALPHA_CHANNEL; - // Disables texture filtering - m_materials[4].setFlag( - video::E_MATERIAL_FLAG::EMF_BILINEAR_FILTER, false); - m_materials[4].setFlag( - video::E_MATERIAL_FLAG::EMF_TRILINEAR_FILTER, false); - m_materials[4].setFlag( - video::E_MATERIAL_FLAG::EMF_ANISOTROPIC_FILTER, false); - } - } else { - m_moon_texture = nullptr; + if (m_moon_texture) { + m_materials[4] = baseMaterial(); + m_materials[4].setTexture(0, m_moon_texture); + m_materials[4].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + disableTextureFiltering(m_materials[4]); + m_materials[4].Lighting = !!m_moon_tonemap; } } -void Sky::setStarCount(u16 star_count, bool force_update) +void Sky::setStarCount(u16 star_count) { // Allow force updating star count at game init. - if (m_star_params.count != star_count || force_update) { + if (m_star_params.count != star_count || m_first_update) { m_star_params.count = star_count; - m_stars.clear(); - // Rebuild the stars surrounding the camera - for (u16 i = 0; i < star_count; i++) { - v3f star = v3f( - myrand_range(-10000, 10000), - myrand_range(-10000, 10000), - myrand_range(-10000, 10000) - ); - - star.normalize(); - m_stars.emplace_back(star); - } + updateStars(); } } +void Sky::updateStars() +{ + m_stars.reset(new scene::SMeshBuffer()); + // Stupid IrrLicht doesn’t allow non-indexed rendering, and indexed quad + // rendering is slow due to lack of hardware support. So as indices are + // 16-bit and there are 4 vertices per star... the limit is 2^16/4 = 0x4000. + // That should be well enough actually. + if (m_star_params.count > 0x4000) { + warningstream << "Requested " << m_star_params.count << " stars but " << 0x4000 << " is the max\n"; + m_star_params.count = 0x4000; + } + m_stars->Vertices.reallocate(4 * m_star_params.count); + m_stars->Indices.reallocate(6 * m_star_params.count); + + video::SColor fallback_color = m_star_params.starcolor; // used on GLES 2 “without shaders” + PcgRandom rgen(m_seed); + float d = (0.006 / 2) * m_star_params.scale; + for (u16 i = 0; i < m_star_params.count; i++) { + v3f r = v3f( + rgen.range(-10000, 10000), + rgen.range(-10000, 10000), + rgen.range(-10000, 10000) + ); + core::CMatrix4<f32> a; + a.buildRotateFromTo(v3f(0, 1, 0), r); + v3f p = v3f(-d, 1, -d); + v3f p1 = v3f(d, 1, -d); + v3f p2 = v3f(d, 1, d); + v3f p3 = v3f(-d, 1, d); + a.rotateVect(p); + a.rotateVect(p1); + a.rotateVect(p2); + a.rotateVect(p3); + m_stars->Vertices.push_back(video::S3DVertex(p, {}, fallback_color, {})); + m_stars->Vertices.push_back(video::S3DVertex(p1, {}, fallback_color, {})); + m_stars->Vertices.push_back(video::S3DVertex(p2, {}, fallback_color, {})); + m_stars->Vertices.push_back(video::S3DVertex(p3, {}, fallback_color, {})); + } + for (u16 i = 0; i < m_star_params.count; i++) { + m_stars->Indices.push_back(i * 4 + 0); + m_stars->Indices.push_back(i * 4 + 1); + m_stars->Indices.push_back(i * 4 + 2); + m_stars->Indices.push_back(i * 4 + 2); + m_stars->Indices.push_back(i * 4 + 3); + m_stars->Indices.push_back(i * 4 + 0); + } + m_stars->setHardwareMappingHint(scene::EHM_STATIC); +} + void Sky::setSkyColors(const SkyColor &sky_color) { m_sky_params.sky_color = sky_color; } void Sky::setHorizonTint(video::SColor sun_tint, video::SColor moon_tint, - std::string use_sun_tint) + const std::string &use_sun_tint) { // Change sun and moon tinting: m_sky_params.fog_sun_tint = sun_tint; @@ -927,7 +886,7 @@ void Sky::setHorizonTint(video::SColor sun_tint, video::SColor moon_tint, m_default_tint = true; } -void Sky::addTextureToSkybox(std::string texture, int material_id, +void Sky::addTextureToSkybox(const std::string &texture, int material_id, ITextureSource *tsrc) { // Sanity check for more than six textures. @@ -936,17 +895,21 @@ void Sky::addTextureToSkybox(std::string texture, int material_id, // Keep a list of texture names handy. m_sky_params.textures.emplace_back(texture); video::ITexture *result = tsrc->getTextureForMesh(texture); - m_materials[material_id+5] = m_materials[0]; + m_materials[material_id+5] = baseMaterial(); m_materials[material_id+5].setTexture(0, result); m_materials[material_id+5].MaterialType = video::EMT_SOLID; } -// To be called once at game init to setup default values. -void Sky::setSkyDefaults() +float getWickedTimeOfDay(float time_of_day) { - SkyboxDefaults sky_defaults; - m_sky_params.sky_color = sky_defaults.getSkyColorDefaults(); - m_sun_params = sky_defaults.getSunDefaults(); - m_moon_params = sky_defaults.getMoonDefaults(); - m_star_params = sky_defaults.getStarDefaults(); + float nightlength = 0.415f; + float wn = nightlength / 2; + float wicked_time_of_day = 0; + if (time_of_day > wn && time_of_day < 1.0f - wn) + wicked_time_of_day = (time_of_day - wn) / (1.0f - wn * 2) * 0.5f + 0.25f; + else if (time_of_day < 0.5f) + wicked_time_of_day = time_of_day / wn * 0.25f; + else + wicked_time_of_day = 1.0f - ((1.0f - time_of_day) / wn * 0.25f); + return wicked_time_of_day; } diff --git a/src/client/sky.h b/src/client/sky.h index 3227e8f59..381abd0b9 100644 --- a/src/client/sky.h +++ b/src/client/sky.h @@ -17,14 +17,16 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#pragma once + +#include "irrlichttypes_extrabloated.h" #include <ISceneNode.h> #include <array> #include "camera.h" -#include "irrlichttypes_extrabloated.h" +#include "irr_ptr.h" +#include "shader.h" #include "skyparams.h" -#pragma once - #define SKY_MATERIAL_COUNT 12 class ITextureSource; @@ -34,7 +36,7 @@ class Sky : public scene::ISceneNode { public: //! constructor - Sky(s32 id, ITextureSource *tsrc); + Sky(s32 id, RenderingEngine *rendering_engine, ITextureSource *tsrc, IShaderSource *ssrc); virtual void OnRegisterSceneNode(); @@ -63,21 +65,26 @@ public: } void setSunVisible(bool sun_visible) { m_sun_params.visible = sun_visible; } - void setSunTexture(std::string sun_texture, - std::string sun_tonemap, ITextureSource *tsrc); + bool getSunVisible() const { return m_sun_params.visible; } + void setSunTexture(const std::string &sun_texture, + const std::string &sun_tonemap, ITextureSource *tsrc); void setSunScale(f32 sun_scale) { m_sun_params.scale = sun_scale; } void setSunriseVisible(bool glow_visible) { m_sun_params.sunrise_visible = glow_visible; } - void setSunriseTexture(std::string sunglow_texture, ITextureSource* tsrc); + void setSunriseTexture(const std::string &sunglow_texture, ITextureSource* tsrc); + v3f getSunDirection(); void setMoonVisible(bool moon_visible) { m_moon_params.visible = moon_visible; } - void setMoonTexture(std::string moon_texture, - std::string moon_tonemap, ITextureSource *tsrc); + bool getMoonVisible() const { return m_moon_params.visible; } + void setMoonTexture(const std::string &moon_texture, + const std::string &moon_tonemap, ITextureSource *tsrc); void setMoonScale(f32 moon_scale) { m_moon_params.scale = moon_scale; } + v3f getMoonDirection(); void setStarsVisible(bool stars_visible) { m_star_params.visible = stars_visible; } - void setStarCount(u16 star_count, bool force_update); + void setStarCount(u16 star_count); void setStarColor(video::SColor star_color) { m_star_params.starcolor = star_color; } - void setStarScale(f32 star_scale) { m_star_params.scale = star_scale; } + void setStarScale(f32 star_scale) { m_star_params.scale = star_scale; updateStars(); } + void setStarDayOpacity(f32 day_opacity) { m_star_params.day_opacity = day_opacity; } bool getCloudsVisible() const { return m_clouds_visible && m_clouds_enabled; } const video::SColorf &getCloudColor() const { return m_cloudcolor_f; } @@ -85,22 +92,24 @@ public: void setVisible(bool visible) { m_visible = visible; } // Set only from set_sky API void setCloudsEnabled(bool clouds_enabled) { m_clouds_enabled = clouds_enabled; } - void setFallbackBgColor(const video::SColor &fallback_bg_color) + void setFallbackBgColor(video::SColor fallback_bg_color) { m_fallback_bg_color = fallback_bg_color; } - void overrideColors(const video::SColor &bgcolor, const video::SColor &skycolor) + void overrideColors(video::SColor bgcolor, video::SColor skycolor) { m_bgcolor = bgcolor; m_skycolor = skycolor; } void setSkyColors(const SkyColor &sky_color); void setHorizonTint(video::SColor sun_tint, video::SColor moon_tint, - std::string use_sun_tint); + const std::string &use_sun_tint); void setInClouds(bool clouds) { m_in_clouds = clouds; } void clearSkyboxTextures() { m_sky_params.textures.clear(); } - void addTextureToSkybox(std::string texture, int material_id, + void addTextureToSkybox(const std::string &texture, int material_id, ITextureSource *tsrc); + const video::SColorf &getCurrentStarColor() const { return m_star_color; } + private: aabb3f m_box; video::SMaterial m_materials[SKY_MATERIAL_COUNT]; @@ -122,7 +131,7 @@ private: } // Mix two colors by a given amount - video::SColor m_mix_scolor(video::SColor col1, video::SColor col2, f32 factor) + static video::SColor m_mix_scolor(video::SColor col1, video::SColor col2, f32 factor) { video::SColor result = video::SColor( col1.getAlpha() * (1 - factor) + col2.getAlpha() * factor, @@ -131,7 +140,7 @@ private: col1.getBlue() * (1 - factor) + col2.getBlue() * factor); return result; } - video::SColorf m_mix_scolorf(video::SColorf col1, video::SColorf col2, f32 factor) + static video::SColorf m_mix_scolorf(video::SColorf col1, video::SColorf col2, f32 factor) { video::SColorf result = video::SColorf(col1.r * (1 - factor) + col2.r * factor, @@ -144,7 +153,7 @@ private: bool m_visible = true; // Used when m_visible=false video::SColor m_fallback_bg_color = video::SColor(255, 255, 255, 255); - bool m_first_update = true; + bool m_first_update = true; // Set before the sky is updated for the first time float m_time_of_day; float m_time_brightness; bool m_sunlight_seen; @@ -154,6 +163,8 @@ private: bool m_clouds_enabled = true; // Initialised to true, reset only by set_sky API bool m_directional_colored_fog; bool m_in_clouds = true; // Prevent duplicating bools to remember old values + bool m_enable_shaders = false; + float m_sky_body_orbit_tilt = 0.0f; video::SColorf m_bgcolor_bright_f = video::SColorf(1.0f, 1.0f, 1.0f, 1.0f); video::SColorf m_skycolor_bright_f = video::SColorf(1.0f, 1.0f, 1.0f, 1.0f); @@ -178,13 +189,17 @@ private: bool m_default_tint = true; - std::vector<v3f> m_stars; + u64 m_seed = 0; + irr_ptr<scene::SMeshBuffer> m_stars; + video::SColorf m_star_color; video::ITexture *m_sun_texture; video::ITexture *m_moon_texture; video::ITexture *m_sun_tonemap; video::ITexture *m_moon_tonemap; + void updateStars(); + void draw_sun(video::IVideoDriver *driver, float sunsize, const video::SColor &suncolor, const video::SColor &suncolor2, float wicked_time_of_day); void draw_moon(video::IVideoDriver *driver, float moonsize, const video::SColor &mooncolor, @@ -194,5 +209,8 @@ private: void draw_stars(video::IVideoDriver *driver, float wicked_time_of_day); void place_sky_body(std::array<video::S3DVertex, 4> &vertices, float horizon_position, float day_position); - void setSkyDefaults(); }; + +// calculates value for sky body positions for the given observed time of day +// this is used to draw both Sun/Moon and shadows +float getWickedTimeOfDay(float time_of_day); diff --git a/src/client/sound.h b/src/client/sound.h index c1d3c0cfa..213d20831 100644 --- a/src/client/sound.h +++ b/src/client/sound.h @@ -51,10 +51,8 @@ public: // playSound functions return -1 on failure, otherwise a handle to the // sound. If name=="", call should be ignored without error. - virtual int playSound(const std::string &name, bool loop, float volume, - float fade = 0.0f, float pitch = 1.0f) = 0; - virtual int playSoundAt(const std::string &name, bool loop, float volume, v3f pos, - float pitch = 1.0f) = 0; + virtual int playSound(const SimpleSoundSpec &spec) = 0; + virtual int playSoundAt(const SimpleSoundSpec &spec, const v3f &pos) = 0; virtual void stopSound(int sound) = 0; virtual bool soundExists(int sound) = 0; virtual void updateSoundPosition(int sound, v3f pos) = 0; @@ -62,15 +60,6 @@ public: virtual float getSoundGain(int id) = 0; virtual void step(float dtime) = 0; virtual void fadeSound(int sound, float step, float gain) = 0; - - int playSound(const SimpleSoundSpec &spec, bool loop) - { - return playSound(spec.name, loop, spec.gain, spec.fade, spec.pitch); - } - int playSoundAt(const SimpleSoundSpec &spec, bool loop, const v3f &pos) - { - return playSoundAt(spec.name, loop, spec.gain, pos, spec.pitch); - } }; class DummySoundManager : public ISoundManager @@ -88,16 +77,9 @@ public: { } void setListenerGain(float gain) {} - int playSound(const std::string &name, bool loop, float volume, float fade, - float pitch) - { - return 0; - } - int playSoundAt(const std::string &name, bool loop, float volume, v3f pos, - float pitch) - { - return 0; - } + + int playSound(const SimpleSoundSpec &spec) { return -1; } + int playSoundAt(const SimpleSoundSpec &spec, const v3f &pos) { return -1; } void stopSound(int sound) {} bool soundExists(int sound) { return false; } void updateSoundPosition(int sound, v3f pos) {} diff --git a/src/client/sound_openal.cpp b/src/client/sound_openal.cpp index f4e61f93e..b015aba25 100644 --- a/src/client/sound_openal.cpp +++ b/src/client/sound_openal.cpp @@ -322,7 +322,7 @@ private: OnDemandSoundFetcher *m_fetcher; ALCdevice *m_device; ALCcontext *m_context; - int m_next_id; + u16 m_last_used_id = 0; // only access within getFreeId() ! std::unordered_map<std::string, std::vector<SoundBuffer*>> m_buffers; std::unordered_map<int, PlayingSound*> m_sounds_playing; struct FadeState { @@ -342,8 +342,7 @@ public: OpenALSoundManager(SoundManagerSingleton *smg, OnDemandSoundFetcher *fetcher): m_fetcher(fetcher), m_device(smg->m_device.get()), - m_context(smg->m_context.get()), - m_next_id(1) + m_context(smg->m_context.get()) { infostream << "Audio: Initialized: OpenAL " << std::endl; } @@ -362,6 +361,14 @@ public: for (auto &buffer : m_buffers) { for (SoundBuffer *sb : buffer.second) { + alDeleteBuffers(1, &sb->buffer_id); + + ALenum error = alGetError(); + if (error != AL_NO_ERROR) { + warningstream << "Audio: Failed to free stream for " + << buffer.first << ": " << alErrorString(error) << std::endl; + } + delete sb; } buffer.second.clear(); @@ -371,6 +378,22 @@ public: infostream << "Audio: Deinitialized." << std::endl; } + u16 getFreeId() + { + u16 startid = m_last_used_id; + while (!isFreeId(++m_last_used_id)) { + if (m_last_used_id == startid) + return 0; + } + + return m_last_used_id; + } + + inline bool isFreeId(int id) const + { + return id > 0 && m_sounds_playing.find(id) == m_sounds_playing.end(); + } + void step(float dtime) { doFades(dtime); @@ -429,7 +452,7 @@ public: << std::endl; assert(buf); PlayingSound *sound = new PlayingSound; - assert(sound); + warn_if_error(alGetError(), "before createPlayingSoundAt"); alGenSources(1, &sound->source_id); alSourcei(sound->source_id, AL_BUFFER, buf->buffer_id); @@ -455,28 +478,17 @@ public: { assert(buf); PlayingSound *sound = createPlayingSound(buf, loop, volume, pitch); - if(!sound) + if (!sound) return -1; - int id = m_next_id++; - m_sounds_playing[id] = sound; - return id; - } - int playSoundRawAt(SoundBuffer *buf, bool loop, float volume, const v3f &pos, - float pitch) - { - assert(buf); - PlayingSound *sound = createPlayingSoundAt(buf, loop, volume, pos, pitch); - if(!sound) - return -1; - int id = m_next_id++; - m_sounds_playing[id] = sound; - return id; + int handle = getFreeId(); + m_sounds_playing[handle] = sound; + return handle; } void deleteSound(int id) { - std::unordered_map<int, PlayingSound*>::iterator i = m_sounds_playing.find(id); + auto i = m_sounds_playing.find(id); if(i == m_sounds_playing.end()) return; PlayingSound *sound = i->second; @@ -572,39 +584,46 @@ public: alListenerf(AL_GAIN, gain); } - int playSound(const std::string &name, bool loop, float volume, float fade, float pitch) + int playSound(const SimpleSoundSpec &spec) { maintain(); - if (name.empty()) + if (spec.name.empty()) return 0; - SoundBuffer *buf = getFetchBuffer(name); + SoundBuffer *buf = getFetchBuffer(spec.name); if(!buf){ - infostream << "OpenALSoundManager: \"" << name << "\" not found." + infostream << "OpenALSoundManager: \"" << spec.name << "\" not found." << std::endl; return -1; } + int handle = -1; - if (fade > 0) { - handle = playSoundRaw(buf, loop, 0.0f, pitch); - fadeSound(handle, fade, volume); + if (spec.fade > 0) { + handle = playSoundRaw(buf, spec.loop, 0.0f, spec.pitch); + fadeSound(handle, spec.fade, spec.gain); } else { - handle = playSoundRaw(buf, loop, volume, pitch); + handle = playSoundRaw(buf, spec.loop, spec.gain, spec.pitch); } return handle; } - int playSoundAt(const std::string &name, bool loop, float volume, v3f pos, float pitch) + int playSoundAt(const SimpleSoundSpec &spec, const v3f &pos) { maintain(); - if (name.empty()) + if (spec.name.empty()) return 0; - SoundBuffer *buf = getFetchBuffer(name); - if(!buf){ - infostream << "OpenALSoundManager: \"" << name << "\" not found." + SoundBuffer *buf = getFetchBuffer(spec.name); + if (!buf) { + infostream << "OpenALSoundManager: \"" << spec.name << "\" not found." << std::endl; return -1; } - return playSoundRawAt(buf, loop, volume, pos, pitch); + + PlayingSound *sound = createPlayingSoundAt(buf, spec.loop, spec.gain, pos, spec.pitch); + if (!sound) + return -1; + int handle = getFreeId(); + m_sounds_playing[handle] = sound; + return handle; } void stopSound(int sound) @@ -616,8 +635,9 @@ public: void fadeSound(int soundid, float step, float gain) { // Ignore the command if step isn't valid. - if (step == 0) + if (step == 0 || soundid < 0) return; + float current_gain = getSoundGain(soundid); step = gain - current_gain > 0 ? abs(step) : -abs(step); if (m_sounds_fading.find(soundid) != m_sounds_fading.end()) { @@ -671,8 +691,8 @@ public: alSourcei(sound->source_id, AL_SOURCE_RELATIVE, false); alSource3f(sound->source_id, AL_POSITION, pos.X, pos.Y, pos.Z); - alSource3f(sound->source_id, AL_VELOCITY, 0, 0, 0); - alSourcef(sound->source_id, AL_REFERENCE_DISTANCE, 30.0); + alSource3f(sound->source_id, AL_VELOCITY, 0.0f, 0.0f, 0.0f); + alSourcef(sound->source_id, AL_REFERENCE_DISTANCE, 10.0f); } bool updateSoundGain(int id, float gain) diff --git a/src/client/tile.cpp b/src/client/tile.cpp index d03588b2b..87d2818b4 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -33,15 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "imagefilters.h" #include "guiscalingfilter.h" #include "renderingengine.h" - - -#if ENABLE_GLES -#ifdef _IRR_COMPILE_WITH_OGLES1_ -#include <GLES/gl.h> -#else -#include <GLES2/gl2.h> -#endif -#endif +#include "util/base64.h" /* A cache from texture name to texture path @@ -90,12 +82,8 @@ static bool replace_ext(std::string &path, const char *ext) std::string getImagePath(std::string path) { // A NULL-ended list of possible image extensions - const char *extensions[] = { - "png", "jpg", "bmp", "tga", - "pcx", "ppm", "psd", "wal", "rgb", - NULL - }; - // If there is no extension, add one + const char *extensions[] = { "png", "jpg", "bmp", "tga", NULL }; + // If there is no extension, assume PNG if (removeStringEnd(path, extensions).empty()) path = path + ".png"; // Check paths until something is found to exist @@ -427,9 +415,9 @@ private: std::unordered_map<std::string, Palette> m_palettes; // Cached settings needed for making textures from meshes + bool m_setting_mipmap; bool m_setting_trilinear_filter; bool m_setting_bilinear_filter; - bool m_setting_anisotropic_filter; }; IWritableTextureSource *createTextureSource() @@ -448,9 +436,9 @@ TextureSource::TextureSource() // Cache some settings // Note: Since this is only done once, the game must be restarted // for these settings to take effect + m_setting_mipmap = g_settings->getBool("mip_map"); m_setting_trilinear_filter = g_settings->getBool("trilinear_filter"); m_setting_bilinear_filter = g_settings->getBool("bilinear_filter"); - m_setting_anisotropic_filter = g_settings->getBool("anisotropic_filter"); } TextureSource::~TextureSource() @@ -669,7 +657,7 @@ video::ITexture* TextureSource::getTexture(const std::string &name, u32 *id) video::ITexture* TextureSource::getTextureForMesh(const std::string &name, u32 *id) { static thread_local bool filter_needed = - g_settings->getBool("texture_clean_transparent") || + g_settings->getBool("texture_clean_transparent") || m_setting_mipmap || ((m_setting_trilinear_filter || m_setting_bilinear_filter) && g_settings->getS32("texture_min_size") > 1); // Avoid duplicating texture if it won't actually change @@ -775,6 +763,9 @@ void TextureSource::rebuildImagesAndTextures() // Recreate textures for (TextureInfo &ti : m_textureinfo_cache) { + if (ti.name.empty()) + continue; // Skip dummy entry + video::IImage *img = generateImage(ti.name); #if ENABLE_GLES img = Align2Npot2(img, driver); @@ -839,17 +830,16 @@ static video::IImage *createInventoryCubeImage( image = scaled; } sanity_check(image->getPitch() == 4 * size); - return reinterpret_cast<u32 *>(image->lock()); + return reinterpret_cast<u32 *>(image->getData()); }; auto free_image = [] (video::IImage *image) -> void { - image->unlock(); image->drop(); }; video::IImage *result = driver->createImage(video::ECF_A8R8G8B8, {cube_size, cube_size}); sanity_check(result->getPitch() == 4 * cube_size); result->fill(video::SColor(0x00000000u)); - u32 *target = reinterpret_cast<u32 *>(result->lock()); + u32 *target = reinterpret_cast<u32 *>(result->getData()); // Draws single cube face // `shade_factor` is face brightness, in range [0.0, 1.0] @@ -908,7 +898,6 @@ static video::IImage *createInventoryCubeImage( {0, 5}, {1, 5}, }); - result->unlock(); return result; } @@ -1015,42 +1004,19 @@ video::IImage* TextureSource::generateImage(const std::string &name) #if ENABLE_GLES - -static inline u16 get_GL_major_version() -{ - const GLubyte *gl_version = glGetString(GL_VERSION); - return (u16) (gl_version[0] - '0'); -} - -/** - * Check if hardware requires npot2 aligned textures - * @return true if alignment NOT(!) requires, false otherwise - */ - -bool hasNPotSupport() -{ - // Only GLES2 is trusted to correctly report npot support - // Note: we cache the boolean result, the GL context will never change. - static const bool supported = get_GL_major_version() > 1 && - glGetString(GL_EXTENSIONS) && - strstr((char *)glGetString(GL_EXTENSIONS), "GL_OES_texture_npot"); - return supported; -} - /** * Check and align image to npot2 if required by hardware * @param image image to check for npot2 alignment * @param driver driver to use for image operations * @return image or copy of image aligned to npot2 */ - -video::IImage * Align2Npot2(video::IImage * image, - video::IVideoDriver* driver) +video::IImage *Align2Npot2(video::IImage *image, + video::IVideoDriver *driver) { if (image == NULL) return image; - if (hasNPotSupport()) + if (driver->queryFeature(video::EVDF_TEXTURE_NPOT)) return image; core::dimension2d<u32> dim = image->getDimension(); @@ -1094,6 +1060,45 @@ static std::string unescape_string(const std::string &str, const char esc = '\\' return out; } +void blitBaseImage(video::IImage* &src, video::IImage* &dst) +{ + //infostream<<"Blitting "<<part_of_name<<" on base"<<std::endl; + // Size of the copied area + core::dimension2d<u32> dim = src->getDimension(); + //core::dimension2d<u32> dim(16,16); + // Position to copy the blitted to in the base image + core::position2d<s32> pos_to(0,0); + // Position to copy the blitted from in the blitted image + core::position2d<s32> pos_from(0,0); + // Blit + /*image->copyToWithAlpha(baseimg, pos_to, + core::rect<s32>(pos_from, dim), + video::SColor(255,255,255,255), + NULL);*/ + + core::dimension2d<u32> dim_dst = dst->getDimension(); + if (dim == dim_dst) { + blit_with_alpha(src, dst, pos_from, pos_to, dim); + } else if (dim.Width * dim.Height < dim_dst.Width * dim_dst.Height) { + // Upscale overlying image + video::IImage *scaled_image = RenderingEngine::get_video_driver()-> + createImage(video::ECF_A8R8G8B8, dim_dst); + src->copyToScaling(scaled_image); + + blit_with_alpha(scaled_image, dst, pos_from, pos_to, dim_dst); + scaled_image->drop(); + } else { + // Upscale base image + video::IImage *scaled_base = RenderingEngine::get_video_driver()-> + createImage(video::ECF_A8R8G8B8, dim); + dst->copyToScaling(scaled_base); + dst->drop(); + dst = scaled_base; + + blit_with_alpha(src, dst, pos_from, pos_to, dim); + } +} + bool TextureSource::generateImagePart(std::string part_of_name, video::IImage *& baseimg) { @@ -1104,9 +1109,6 @@ bool TextureSource::generateImagePart(std::string part_of_name, // Stuff starting with [ are special commands if (part_of_name.empty() || part_of_name[0] != '[') { video::IImage *image = m_sourcecache.getOrLoad(part_of_name); -#if ENABLE_GLES - image = Align2Npot2(image, driver); -#endif if (image == NULL) { if (!part_of_name.empty()) { @@ -1157,41 +1159,7 @@ bool TextureSource::generateImagePart(std::string part_of_name, // Else blit on base. else { - //infostream<<"Blitting "<<part_of_name<<" on base"<<std::endl; - // Size of the copied area - core::dimension2d<u32> dim = image->getDimension(); - //core::dimension2d<u32> dim(16,16); - // Position to copy the blitted to in the base image - core::position2d<s32> pos_to(0,0); - // Position to copy the blitted from in the blitted image - core::position2d<s32> pos_from(0,0); - // Blit - /*image->copyToWithAlpha(baseimg, pos_to, - core::rect<s32>(pos_from, dim), - video::SColor(255,255,255,255), - NULL);*/ - - core::dimension2d<u32> dim_dst = baseimg->getDimension(); - if (dim == dim_dst) { - blit_with_alpha(image, baseimg, pos_from, pos_to, dim); - } else if (dim.Width * dim.Height < dim_dst.Width * dim_dst.Height) { - // Upscale overlying image - video::IImage *scaled_image = RenderingEngine::get_video_driver()-> - createImage(video::ECF_A8R8G8B8, dim_dst); - image->copyToScaling(scaled_image); - - blit_with_alpha(scaled_image, baseimg, pos_from, pos_to, dim_dst); - scaled_image->drop(); - } else { - // Upscale base image - video::IImage *scaled_base = RenderingEngine::get_video_driver()-> - createImage(video::ECF_A8R8G8B8, dim); - baseimg->copyToScaling(scaled_base); - baseimg->drop(); - baseimg = scaled_base; - - blit_with_alpha(image, baseimg, pos_from, pos_to, dim); - } + blitBaseImage(image, baseimg); } //cleanup image->drop(); @@ -1633,8 +1601,15 @@ bool TextureSource::generateImagePart(std::string part_of_name, /* IMPORTANT: When changing this, getTextureForMesh() needs to be * updated too. */ - // Apply the "clean transparent" filter, if configured. - if (g_settings->getBool("texture_clean_transparent")) + if (!baseimg) { + errorstream << "generateImagePart(): baseimg == NULL " + << "for part_of_name=\"" << part_of_name + << "\", cancelling." << std::endl; + return false; + } + + // Apply the "clean transparent" filter, if needed + if (m_setting_mipmap || g_settings->getBool("texture_clean_transparent")) imageCleanTransparent(baseimg, 127); /* Upscale textures to user's requested minimum size. This is a trick to make @@ -1644,7 +1619,7 @@ bool TextureSource::generateImagePart(std::string part_of_name, * textures that don't have the resources to offer high-res alternatives. */ const bool filter = m_setting_trilinear_filter || m_setting_bilinear_filter; - const s32 scaleto = filter ? g_settings->getS32("texture_min_size") : 1; + const s32 scaleto = filter ? g_settings->getU16("texture_min_size") : 1; if (scaleto > 1) { const core::dimension2d<u32> dim = baseimg->getDimension(); @@ -1812,6 +1787,43 @@ bool TextureSource::generateImagePart(std::string part_of_name, baseimg->drop(); baseimg = img; } + /* + [png:base64 + Decodes a PNG image in base64 form. + Use minetest.encode_png and minetest.encode_base64 + to produce a valid string. + */ + else if (str_starts_with(part_of_name, "[png:")) { + Strfnd sf(part_of_name); + sf.next(":"); + std::string png; + { + std::string blob = sf.next(""); + if (!base64_is_valid(blob)) { + errorstream << "generateImagePart(): " + << "malformed base64 in '[png'" + << std::endl; + return false; + } + png = base64_decode(blob); + } + + auto *device = RenderingEngine::get_raw_device(); + auto *fs = device->getFileSystem(); + auto *vd = device->getVideoDriver(); + auto *memfile = fs->createMemoryReadFile(png.data(), png.size(), "__temp_png"); + video::IImage* pngimg = vd->createImageFromFile(memfile); + memfile->drop(); + + if (baseimg) { + blitBaseImage(pngimg, baseimg); + } else { + core::dimension2d<u32> dim = pngimg->getDimension(); + baseimg = driver->createImage(video::ECF_A8R8G8B8, dim); + pngimg->copyTo(baseimg); + } + pngimg->drop(); + } else { errorstream << "generateImagePart(): Invalid " @@ -2214,18 +2226,63 @@ video::ITexture* TextureSource::getNormalTexture(const std::string &name) return NULL; } +namespace { + // For more colourspace transformations, see for example + // https://github.com/tobspr/GLSL-Color-Spaces/blob/master/ColorSpaces.inc.glsl + + inline float linear_to_srgb_component(float v) + { + if (v > 0.0031308f) + return 1.055f * powf(v, 1.0f / 2.4f) - 0.055f; + return 12.92f * v; + } + inline float srgb_to_linear_component(float v) + { + if (v > 0.04045f) + return powf((v + 0.055f) / 1.055f, 2.4f); + return v / 12.92f; + } + + v3f srgb_to_linear(const video::SColor &col_srgb) + { + v3f col(col_srgb.getRed(), col_srgb.getGreen(), col_srgb.getBlue()); + col /= 255.0f; + col.X = srgb_to_linear_component(col.X); + col.Y = srgb_to_linear_component(col.Y); + col.Z = srgb_to_linear_component(col.Z); + return col; + } + + video::SColor linear_to_srgb(const v3f &col_linear) + { + v3f col; + col.X = linear_to_srgb_component(col_linear.X); + col.Y = linear_to_srgb_component(col_linear.Y); + col.Z = linear_to_srgb_component(col_linear.Z); + col *= 255.0f; + col.X = core::clamp<float>(col.X, 0.0f, 255.0f); + col.Y = core::clamp<float>(col.Y, 0.0f, 255.0f); + col.Z = core::clamp<float>(col.Z, 0.0f, 255.0f); + return video::SColor(0xff, myround(col.X), myround(col.Y), + myround(col.Z)); + } +} + video::SColor TextureSource::getTextureAverageColor(const std::string &name) { video::IVideoDriver *driver = RenderingEngine::get_video_driver(); video::SColor c(0, 0, 0, 0); video::ITexture *texture = getTexture(name); + if (!texture) + return c; video::IImage *image = driver->createImage(texture, core::position2d<s32>(0, 0), texture->getOriginalSize()); + if (!image) + return c; + u32 total = 0; - u32 tR = 0; - u32 tG = 0; - u32 tB = 0; + v3f col_acc(0, 0, 0); core::dimension2d<u32> dim = image->getDimension(); u16 step = 1; if (dim.Width > 16) @@ -2235,17 +2292,14 @@ video::SColor TextureSource::getTextureAverageColor(const std::string &name) c = image->getPixel(x,y); if (c.getAlpha() > 0) { total++; - tR += c.getRed(); - tG += c.getGreen(); - tB += c.getBlue(); + col_acc += srgb_to_linear(c); } } } image->drop(); if (total > 0) { - c.setRed(tR / total); - c.setGreen(tG / total); - c.setBlue(tB / total); + col_acc /= total; + c = linear_to_srgb(col_acc); } c.setAlpha(255); return c; diff --git a/src/client/tile.h b/src/client/tile.h index 49c46f749..e55a26e56 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -134,8 +134,7 @@ public: IWritableTextureSource *createTextureSource(); #if ENABLE_GLES -bool hasNPotSupport(); -video::IImage * Align2Npot2(video::IImage * image, irr::video::IVideoDriver* driver); +video::IImage *Align2Npot2(video::IImage *image, video::IVideoDriver *driver); #endif enum MaterialType{ @@ -196,6 +195,7 @@ struct TileLayer texture_id == other.texture_id && material_type == other.material_type && material_flags == other.material_flags && + has_color == other.has_color && color == other.color && scale == other.scale; } @@ -260,6 +260,17 @@ struct TileLayer && (material_flags & MATERIAL_FLAG_TILEABLE_VERTICAL); } + bool isTransparent() const + { + switch (material_type) { + case TILE_MATERIAL_ALPHA: + case TILE_MATERIAL_LIQUID_TRANSPARENT: + case TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT: + return true; + } + return false; + } + // Ordered for size, please do not reorder video::ITexture *texture = nullptr; @@ -289,9 +300,9 @@ struct TileLayer * The color of the tile, or if the tile does not own * a color then the color of the node owning this tile. */ - video::SColor color; + video::SColor color = video::SColor(0, 0, 0, 0); - u8 scale; + u8 scale = 1; }; /*! @@ -308,7 +319,8 @@ struct TileSpec for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { if (layers[layer] != other.layers[layer]) return false; - if (!layers[layer].isTileable()) + // Only non-transparent tiles can be merged into fast faces + if (layers[layer].isTransparent() || !layers[layer].isTileable()) return false; } return rotation == 0 diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index 285cc38e5..0a89e2aa2 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" #include <map> #include <IMeshManipulator.h> +#include "client/renderingengine.h" #define WIELD_SCALE_FACTOR 30.0 #define WIELD_SCALE_FACTOR_EXTRUDED 40.0 @@ -220,11 +221,18 @@ WieldMeshSceneNode::WieldMeshSceneNode(scene::ISceneManager *mgr, s32 id, bool l m_meshnode->setReadOnlyMaterials(false); m_meshnode->setVisible(false); dummymesh->drop(); // m_meshnode grabbed it + + m_shadow = RenderingEngine::get_shadow_renderer(); } WieldMeshSceneNode::~WieldMeshSceneNode() { sanity_check(g_extrusion_mesh_cache); + + // Remove node from shadow casters. m_shadow might be an invalid pointer! + if (auto shadow = RenderingEngine::get_shadow_renderer()) + shadow->removeNodeFromShadowList(m_meshnode); + if (g_extrusion_mesh_cache->drop()) g_extrusion_mesh_cache = nullptr; } @@ -294,32 +302,36 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, } material.setFlag(video::EMF_ANISOTROPIC_FILTER, m_anisotropic_filter); // mipmaps cause "thin black line" artifacts -#if (IRRLICHT_VERSION_MAJOR >= 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR >= 2 material.setFlag(video::EMF_USE_MIP_MAPS, false); -#endif if (m_enable_shaders) { material.setTexture(2, tsrc->getShaderFlagsTexture(false)); } } } -scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vector<ItemPartColor> *colors, const ContentFeatures &f) +static scene::SMesh *createSpecialNodeMesh(Client *client, MapNode n, + std::vector<ItemPartColor> *colors, const ContentFeatures &f) { - MeshMakeData mesh_make_data(client, false, false); + MeshMakeData mesh_make_data(client, false); MeshCollector collector; mesh_make_data.setSmoothLighting(false); - MapblockMeshGenerator gen(&mesh_make_data, &collector); - u8 param2 = 0; - if (f.param_type_2 == CPT2_WALLMOUNTED || + MapblockMeshGenerator gen(&mesh_make_data, &collector, + client->getSceneManager()->getMeshManipulator()); + + if (n.getParam2()) { + // keep it + } else if (f.param_type_2 == CPT2_WALLMOUNTED || f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { - if (f.drawtype == NDT_TORCHLIKE) - param2 = 1; - else if (f.drawtype == NDT_SIGNLIKE || + if (f.drawtype == NDT_TORCHLIKE || + f.drawtype == NDT_SIGNLIKE || f.drawtype == NDT_NODEBOX || - f.drawtype == NDT_MESH) - param2 = 4; + f.drawtype == NDT_MESH) { + n.setParam2(4); + } + } else if (f.drawtype == NDT_SIGNLIKE || f.drawtype == NDT_TORCHLIKE) { + n.setParam2(1); } - gen.renderSingle(id, param2); + gen.renderSingle(n.getContent(), n.getParam2()); colors->clear(); scene::SMesh *mesh = new scene::SMesh(); @@ -374,6 +386,9 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che m_colors.emplace_back(); // overlay is white, if present m_colors.emplace_back(true, video::SColor(0xFFFFFFFF)); + // initialize the color + if (!m_lighting) + setColor(video::SColor(0xFFFFFFFF)); return; } @@ -392,7 +407,6 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che case NDT_TORCHLIKE: case NDT_RAILLIKE: case NDT_PLANTLIKE: - case NDT_PLANTLIKE_ROOTED: case NDT_FLOWINGLIQUID: { v3f wscale = def.wield_scale; if (f.drawtype == NDT_FLOWINGLIQUID) @@ -408,14 +422,26 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che m_colors.emplace_back(l1.has_color, l1.color); break; } + case NDT_PLANTLIKE_ROOTED: { + setExtruded(tsrc->getTextureName(f.special_tiles[0].layers[0].texture_id), + "", def.wield_scale, tsrc, + f.special_tiles[0].layers[0].animation_frame_count); + // Add color + const TileLayer &l0 = f.special_tiles[0].layers[0]; + m_colors.emplace_back(l0.has_color, l0.color); + break; + } case NDT_NORMAL: case NDT_ALLFACES: case NDT_LIQUID: setCube(f, def.wield_scale); break; - default: + default: { // Render non-trivial drawtypes like the actual node - mesh = createSpecialNodeMesh(client, id, &m_colors, f); + MapNode n(id); + n.setParam2(def.place_param2); + + mesh = createSpecialNodeMesh(client, n, &m_colors, f); changeToMesh(mesh); mesh->drop(); m_meshnode->setScale( @@ -423,6 +449,7 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che / (BS * f.visual_scale)); break; } + } u32 material_count = m_meshnode->getMaterialCount(); for (u32 i = 0; i < material_count; ++i) { @@ -433,13 +460,26 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che material.setFlag(video::EMF_BILINEAR_FILTER, m_bilinear_filter); material.setFlag(video::EMF_TRILINEAR_FILTER, m_trilinear_filter); } + + // initialize the color + if (!m_lighting) + setColor(video::SColor(0xFFFFFFFF)); return; - } else if (!def.inventory_image.empty()) { - setExtruded(def.inventory_image, def.inventory_overlay, def.wield_scale, - tsrc, 1); + } else { + if (!def.inventory_image.empty()) { + setExtruded(def.inventory_image, def.inventory_overlay, def.wield_scale, + tsrc, 1); + } else { + setExtruded("no_texture.png", "", def.wield_scale, tsrc, 1); + } + m_colors.emplace_back(); // overlay is white, if present m_colors.emplace_back(true, video::SColor(0xFFFFFFFF)); + + // initialize the color + if (!m_lighting) + setColor(video::SColor(0xFFFFFFFF)); return; } @@ -486,8 +526,9 @@ void WieldMeshSceneNode::setNodeLightColor(video::SColor color) material.EmissiveColor = color; } } - - setColor(color); + else { + setColor(color); + } } void WieldMeshSceneNode::render() @@ -511,6 +552,11 @@ void WieldMeshSceneNode::changeToMesh(scene::IMesh *mesh) // need to normalize normals when lighting is enabled (because of setScale()) m_meshnode->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, m_lighting); m_meshnode->setVisible(true); + + if (m_shadow) { + // Add mesh to shadow caster + m_shadow->addNodeToShadowList(m_meshnode); + } } void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) @@ -523,7 +569,7 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) content_t id = ndef->getId(def.name); FATAL_ERROR_IF(!g_extrusion_mesh_cache, "Extrusion mesh cache is not yet initialized"); - + scene::SMesh *mesh = nullptr; // Shading is on by default @@ -585,12 +631,16 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) result->buffer_colors.emplace_back(l0.has_color, l0.color); break; } - default: + default: { // Render non-trivial drawtypes like the actual node - mesh = createSpecialNodeMesh(client, id, &result->buffer_colors, f); + MapNode n(id); + n.setParam2(def.place_param2); + + mesh = createSpecialNodeMesh(client, n, &result->buffer_colors, f); scaleMesh(mesh, v3f(0.12, 0.12, 0.12)); break; } + } u32 mc = mesh->getMeshBufferCount(); for (u32 i = 0; i < mc; ++i) { diff --git a/src/client/wieldmesh.h b/src/client/wieldmesh.h index 933097230..d1eeb64f5 100644 --- a/src/client/wieldmesh.h +++ b/src/client/wieldmesh.h @@ -27,6 +27,7 @@ struct ItemStack; class Client; class ITextureSource; struct ContentFeatures; +class ShadowRenderer; /*! * Holds color information of an item mesh's buffer. @@ -124,6 +125,8 @@ private: // so this variable is just required so we can implement // getBoundingBox() and is set to an empty box. aabb3f m_bounding_box; + + ShadowRenderer *m_shadow; }; void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result); diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 602a44c90..5733b05de 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -80,10 +80,11 @@ LuaEntitySAO *getAttachedObject(PlayerSAO *sao, ServerEnvironment *env) int id; std::string bone; v3f dummy; - sao->getAttachment(&id, &bone, &dummy, &dummy); + bool force_visible; + sao->getAttachment(&id, &bone, &dummy, &dummy, &force_visible); ServerActiveObject *ao = env->getActiveObject(id); while (id && ao) { - ao->getAttachment(&id, &bone, &dummy, &dummy); + ao->getAttachment(&id, &bone, &dummy, &dummy, &force_visible); if (id) ao = env->getActiveObject(id); } @@ -98,7 +99,6 @@ void RemoteClient::GetNextBlocks ( { // Increment timers m_nothing_to_send_pause_timer -= dtime; - m_nearest_unsent_reset_timer += dtime; if (m_nothing_to_send_pause_timer >= 0) return; @@ -138,34 +138,6 @@ void RemoteClient::GetNextBlocks ( camera_dir.rotateYZBy(sao->getLookPitch()); camera_dir.rotateXZBy(sao->getRotation().Y); - /*infostream<<"camera_dir=("<<camera_dir.X<<","<<camera_dir.Y<<"," - <<camera_dir.Z<<")"<<std::endl;*/ - - /* - Get the starting value of the block finder radius. - */ - - if (m_last_center != center) { - m_nearest_unsent_d = 0; - m_last_center = center; - } - - /*infostream<<"m_nearest_unsent_reset_timer=" - <<m_nearest_unsent_reset_timer<<std::endl;*/ - - // Reset periodically to workaround for some bugs or stuff - if (m_nearest_unsent_reset_timer > 20.0f) { - m_nearest_unsent_reset_timer = 0.0f; - m_nearest_unsent_d = 0; - //infostream<<"Resetting m_nearest_unsent_d for " - // <<server->getPlayerName(peer_id)<<std::endl; - } - - //s16 last_nearest_unsent_d = m_nearest_unsent_d; - s16 d_start = m_nearest_unsent_d; - - //infostream<<"d_start="<<d_start<<std::endl; - u16 max_simul_sends_usually = m_max_simul_sends; /* @@ -197,6 +169,29 @@ void RemoteClient::GetNextBlocks ( s16 wanted_range = sao->getWantedRange() + 1; float camera_fov = sao->getFov(); + /* + Get the starting value of the block finder radius. + */ + if (m_last_center != center) { + m_nearest_unsent_d = 0; + m_last_center = center; + } + // reset the unsent distance if the view angle has changed more that 10% of the fov + // (this matches isBlockInSight which allows for an extra 10%) + if (camera_dir.dotProduct(m_last_camera_dir) < std::cos(camera_fov * 0.1f)) { + m_nearest_unsent_d = 0; + m_last_camera_dir = camera_dir; + } + if (m_nearest_unsent_d > 0) { + // make sure any blocks modified since the last time we sent blocks are resent + for (const v3s16 &p : m_blocks_modified) { + m_nearest_unsent_d = std::min(m_nearest_unsent_d, center.getDistanceFrom(p)); + } + } + m_blocks_modified.clear(); + + s16 d_start = m_nearest_unsent_d; + // Distrust client-sent FOV and get server-set player object property // zoom FOV (degrees) as a check to avoid hacked clients using FOV to load // distant world. @@ -211,13 +206,13 @@ void RemoteClient::GetNextBlocks ( wanted_range); const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE; - s16 d_max = full_d_max; s16 d_max_gen = std::min(adjustDist(m_max_gen_distance, prop_zoom_fov), wanted_range); - // Don't loop very much at a time, adjust with distance, - // do more work per RTT with greater distances. - s16 max_d_increment_at_time = full_d_max / 9 + 1; + s16 d_max = full_d_max; + + // Don't loop very much at a time + s16 max_d_increment_at_time = 2; if (d_max > d_start + max_d_increment_at_time) d_max = d_start + max_d_increment_at_time; @@ -310,20 +305,14 @@ void RemoteClient::GetNextBlocks ( */ MapBlock *block = env->getMap().getBlockNoCreateNoEx(p); - bool surely_not_found_on_disk = false; - bool block_is_invalid = false; + bool block_not_found = false; if (block) { // Reset usage timer, this block will be of use in the future. block->resetUsageTimer(); - // Block is dummy if data doesn't exist. - // It means it has been not found from disk and not generated - if (block->isDummy()) { - surely_not_found_on_disk = true; - } - - if (!block->isGenerated()) - block_is_invalid = true; + // Check whether the block exists (with data) + if (block->isDummy() || !block->isGenerated()) + block_not_found = true; /* If block is not close, don't send it unless it is near @@ -337,7 +326,7 @@ void RemoteClient::GetNextBlocks ( continue; } - if (m_occ_cull && !block_is_invalid && + if (m_occ_cull && !block_not_found && env->getMap().isBlockOccluded(block, cam_pos_nodes)) { continue; } @@ -347,7 +336,7 @@ void RemoteClient::GetNextBlocks ( If block has been marked to not exist on disk (dummy) or is not generated and generating new ones is not wanted, skip block. */ - if (!generate && (surely_not_found_on_disk || block_is_invalid)) { + if (!generate && block_not_found) { // get next one. continue; } @@ -355,7 +344,7 @@ void RemoteClient::GetNextBlocks ( /* Add inexistent block to emerge queue. */ - if (block == NULL || surely_not_found_on_disk || block_is_invalid) { + if (block == NULL || block_not_found) { if (emerge->enqueueBlockEmerge(peer_id, p, generate)) { if (nearest_emerged_d == -1) nearest_emerged_d = d; @@ -408,21 +397,18 @@ queue_full_break: void RemoteClient::GotBlock(v3s16 p) { - if (m_blocks_modified.find(p) == m_blocks_modified.end()) { - if (m_blocks_sending.find(p) != m_blocks_sending.end()) - m_blocks_sending.erase(p); - else - m_excess_gotblocks++; - + if (m_blocks_sending.find(p) != m_blocks_sending.end()) { + m_blocks_sending.erase(p); + // only add to sent blocks if it actually was sending + // (it might have been modified since) m_blocks_sent.insert(p); + } else { + m_excess_gotblocks++; } } void RemoteClient::SentBlock(v3s16 p) { - if (m_blocks_modified.find(p) != m_blocks_modified.end()) - m_blocks_modified.erase(p); - if (m_blocks_sending.find(p) == m_blocks_sending.end()) m_blocks_sending[p] = 0.0f; else @@ -432,29 +418,24 @@ void RemoteClient::SentBlock(v3s16 p) void RemoteClient::SetBlockNotSent(v3s16 p) { - m_nearest_unsent_d = 0; m_nothing_to_send_pause_timer = 0; - if (m_blocks_sending.find(p) != m_blocks_sending.end()) - m_blocks_sending.erase(p); - if (m_blocks_sent.find(p) != m_blocks_sent.end()) - m_blocks_sent.erase(p); - m_blocks_modified.insert(p); + // remove the block from sending and sent sets, + // and mark as modified if found + if (m_blocks_sending.erase(p) + m_blocks_sent.erase(p) > 0) + m_blocks_modified.insert(p); } void RemoteClient::SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks) { - m_nearest_unsent_d = 0; m_nothing_to_send_pause_timer = 0; for (auto &block : blocks) { v3s16 p = block.first; - m_blocks_modified.insert(p); - - if (m_blocks_sending.find(p) != m_blocks_sending.end()) - m_blocks_sending.erase(p); - if (m_blocks_sent.find(p) != m_blocks_sent.end()) - m_blocks_sent.erase(p); + // remove the block from sending and sent sets, + // and mark as modified if found + if (m_blocks_sending.erase(p) + m_blocks_sent.erase(p) > 0) + m_blocks_modified.insert(p); } } @@ -471,9 +452,6 @@ void RemoteClient::notifyEvent(ClientStateEvent event) case CSE_Hello: m_state = CS_HelloSent; break; - case CSE_InitLegacy: - m_state = CS_AwaitingInit2; - break; case CSE_Disconnect: m_state = CS_Disconnecting; break; @@ -494,20 +472,14 @@ void RemoteClient::notifyEvent(ClientStateEvent event) { case CSE_AuthAccept: m_state = CS_AwaitingInit2; - if (chosen_mech == AUTH_MECHANISM_SRP || - chosen_mech == AUTH_MECHANISM_LEGACY_PASSWORD) - srp_verifier_delete((SRPVerifier *) auth_data); - chosen_mech = AUTH_MECHANISM_NONE; + resetChosenMech(); break; case CSE_Disconnect: m_state = CS_Disconnecting; break; case CSE_SetDenied: m_state = CS_Denied; - if (chosen_mech == AUTH_MECHANISM_SRP || - chosen_mech == AUTH_MECHANISM_LEGACY_PASSWORD) - srp_verifier_delete((SRPVerifier *) auth_data); - chosen_mech = AUTH_MECHANISM_NONE; + resetChosenMech(); break; default: myerror << "HelloSent: Invalid client state transition! " << event; @@ -583,9 +555,7 @@ void RemoteClient::notifyEvent(ClientStateEvent event) break; case CSE_SudoSuccess: m_state = CS_SudoMode; - if (chosen_mech == AUTH_MECHANISM_SRP) - srp_verifier_delete((SRPVerifier *) auth_data); - chosen_mech = AUTH_MECHANISM_NONE; + resetChosenMech(); break; /* Init GotInit2 SetDefinitionsSent SetMediaSent SetDenied */ default: @@ -618,6 +588,15 @@ void RemoteClient::notifyEvent(ClientStateEvent event) } } +void RemoteClient::resetChosenMech() +{ + if (auth_data) { + srp_verifier_delete((SRPVerifier *) auth_data); + auth_data = nullptr; + } + chosen_mech = AUTH_MECHANISM_NONE; +} + u64 RemoteClient::uptime() const { return porting::getTimeS() - m_connection_time; @@ -693,7 +672,6 @@ void ClientInterface::UpdatePlayerList() std::vector<session_t> clients = getClientIDs(); m_clients_names.clear(); - if (!clients.empty()) infostream<<"Players:"<<std::endl; @@ -737,31 +715,6 @@ void ClientInterface::sendToAll(NetworkPacket *pkt) } } -void ClientInterface::sendToAllCompat(NetworkPacket *pkt, NetworkPacket *legacypkt, - u16 min_proto_ver) -{ - RecursiveMutexAutoLock clientslock(m_clients_mutex); - for (auto &client_it : m_clients) { - RemoteClient *client = client_it.second; - NetworkPacket *pkt_to_send = nullptr; - - if (client->net_proto_version >= min_proto_ver) { - pkt_to_send = pkt; - } else if (client->net_proto_version != 0) { - pkt_to_send = legacypkt; - } else { - warningstream << "Client with unhandled version to handle: '" - << client->net_proto_version << "'"; - continue; - } - - m_con->Send(client->peer_id, - clientCommandFactoryTable[pkt_to_send->getCommand()].channel, - pkt_to_send, - clientCommandFactoryTable[pkt_to_send->getCommand()].reliable); - } -} - RemoteClient* ClientInterface::getClientNoEx(session_t peer_id, ClientState state_min) { RecursiveMutexAutoLock clientslock(m_clients_mutex); diff --git a/src/clientiface.h b/src/clientiface.h index 83fa6fe99..3e7ba4793 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -25,11 +25,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "serialization.h" // for SER_FMT_VER_INVALID #include "network/networkpacket.h" #include "network/networkprotocol.h" +#include "network/address.h" #include "porting.h" +#include "threading/mutex_auto_lock.h" #include <list> #include <vector> #include <set> +#include <memory> #include <mutex> class MapBlock; @@ -188,7 +191,6 @@ enum ClientStateEvent { CSE_Hello, CSE_AuthAccept, - CSE_InitLegacy, CSE_GotInit2, CSE_SetDenied, CSE_SetDefinitionsSent, @@ -241,6 +243,8 @@ public: u32 allowed_auth_mechs = 0; u32 allowed_sudo_mechs = 0; + void resetChosenMech(); + bool isSudoMechAllowed(AuthMechanism mech) { return allowed_sudo_mechs & mech; } bool isMechAllowed(AuthMechanism mech) @@ -338,17 +342,24 @@ public: u8 getMajor() const { return m_version_major; } u8 getMinor() const { return m_version_minor; } u8 getPatch() const { return m_version_patch; } - const std::string &getFull() const { return m_full_version; } - + const std::string &getFullVer() const { return m_full_version; } + void setLangCode(const std::string &code) { m_lang_code = code; } const std::string &getLangCode() const { return m_lang_code; } + + void setCachedAddress(const Address &addr) { m_addr = addr; } + const Address &getAddress() const { return m_addr; } + private: // Version is stored in here after INIT before INIT2 u8 m_pending_serialization_version = SER_FMT_VER_INVALID; /* current state of client */ ClientState m_state = CS_Created; - + + // Cached here so retrieval doesn't have to go to connection API + Address m_addr; + // Client sent language code std::string m_lang_code; @@ -364,7 +375,7 @@ private: std::set<v3s16> m_blocks_sent; s16 m_nearest_unsent_d = 0; v3s16 m_last_center; - float m_nearest_unsent_reset_timer = 0.0f; + v3f m_last_camera_dir; const u16 m_max_simul_sends; const float m_min_time_from_building; @@ -384,10 +395,10 @@ private: std::map<v3s16, float> m_blocks_sending; /* - Blocks that have been modified since last sending them. - These blocks will not be marked as sent, even if the - client reports it has received them to account for blocks - that are being modified while on the line. + Blocks that have been modified since blocks were + sent to the client last (getNextBlocks()). + This is used to reset the unsent distance, so that + modified blocks are resent to the client. List of block positions. */ @@ -412,7 +423,7 @@ private: /* client information - */ + */ u8 m_version_major = 0; u8 m_version_minor = 0; u8 m_version_patch = 0; @@ -457,7 +468,6 @@ public: /* send to all clients */ void sendToAll(NetworkPacket *pkt); - void sendToAllCompat(NetworkPacket *pkt, NetworkPacket *legacypkt, u16 min_proto_ver); /* delete a client */ void DeleteClient(session_t peer_id); @@ -496,9 +506,13 @@ public: static std::string state2Name(ClientState state); protected: - //TODO find way to avoid this functions - void lock() { m_clients_mutex.lock(); } - void unlock() { m_clients_mutex.unlock(); } + class AutoLock { + public: + AutoLock(ClientInterface &iface): m_lock(iface.m_clients_mutex) {} + + private: + RecursiveMutexAutoLock m_lock; + }; RemoteClientMap& getClientList() { return m_clients; } diff --git a/src/cmake_config.h.in b/src/cmake_config.h.in index cfcee4b58..17b70e268 100644 --- a/src/cmake_config.h.in +++ b/src/cmake_config.h.in @@ -15,10 +15,11 @@ #define BUILD_TYPE "@CMAKE_BUILD_TYPE@" #define ICON_DIR "@ICONDIR@" #cmakedefine01 RUN_IN_PLACE +#cmakedefine01 DEVELOPMENT_BUILD +#cmakedefine01 ENABLE_UPDATE_CHECKER #cmakedefine01 USE_GETTEXT #cmakedefine01 USE_CURL #cmakedefine01 USE_SOUND -#cmakedefine01 USE_FREETYPE #cmakedefine01 USE_CURSES #cmakedefine01 USE_LEVELDB #cmakedefine01 USE_LUAJIT @@ -36,3 +37,4 @@ #cmakedefine01 CURSES_HAVE_NCURSESW_NCURSES_H #cmakedefine01 CURSES_HAVE_NCURSESW_CURSES_H #cmakedefine01 BUILD_UNITTESTS +#cmakedefine01 BUILD_BENCHMARKS diff --git a/src/collision.cpp b/src/collision.cpp index d85a56884..be135a225 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -153,7 +153,7 @@ CollisionAxis axisAlignedCollision( (std::max(movingbox.MaxEdge.Z + speed.Z * time, staticbox.MaxEdge.Z) - std::min(movingbox.MinEdge.Z + speed.Z * time, staticbox.MinEdge.Z) - relbox.MinEdge.Z < 0) - ) + ) return COLLISION_AXIS_X; } } else { @@ -180,7 +180,7 @@ CollisionAxis axisAlignedCollision( (std::max(movingbox.MaxEdge.Y + speed.Y * time, staticbox.MaxEdge.Y) - std::min(movingbox.MinEdge.Y + speed.Y * time, staticbox.MinEdge.Y) - relbox.MinEdge.Y < 0) - ) + ) return COLLISION_AXIS_Z; } } @@ -303,7 +303,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, if (!f.walkable) continue; - int n_bouncy_value = itemgroup_get(f.groups, "bouncy"); + // Negative bouncy may have a meaning, but we need +value here. + int n_bouncy_value = abs(itemgroup_get(f.groups, "bouncy")); int neighbors = 0; if (f.drawtype == NDT_NODEBOX && diff --git a/src/config.h b/src/config.h index 5e1164642..a4c6c9f10 100644 --- a/src/config.h +++ b/src/config.h @@ -11,17 +11,14 @@ #if defined USE_CMAKE_CONFIG_H #include "cmake_config.h" -#elif defined (__ANDROID__) - #define PROJECT_NAME "minetest" - #define PROJECT_NAME_C "Minetest" - #define STATIC_SHAREDIR "" - #define VERSION_STRING STR(VERSION_MAJOR) "." STR(VERSION_MINOR) "." STR(VERSION_PATCH) STR(VERSION_EXTRA) -#ifdef NDEBUG - #define BUILD_TYPE "Release" - #else - #define BUILD_TYPE "Debug" - #endif #else + #if defined (__ANDROID__) + #define PROJECT_NAME "minetest" + #define PROJECT_NAME_C "Minetest" + #define STATIC_SHAREDIR "" + #define ENABLE_UPDATE_CHECKER 0 + #define VERSION_STRING STR(VERSION_MAJOR) "." STR(VERSION_MINOR) "." STR(VERSION_PATCH) STR(VERSION_EXTRA) + #endif #ifdef NDEBUG #define BUILD_TYPE "Release" #else diff --git a/src/constants.h b/src/constants.h index c17f3b6af..b9d4f8d70 100644 --- a/src/constants.h +++ b/src/constants.h @@ -64,7 +64,7 @@ with this program; if not, write to the Free Software Foundation, Inc., // I really don't want to make every algorithm to check if it's going near // the limit or not, so this is lower. // This is the maximum value the setting map_generation_limit can be -#define MAX_MAP_GENERATION_LIMIT (31000) +#define MAX_MAP_GENERATION_LIMIT (31007) // Size of node in floating-point units // The original idea behind this is to disallow plain casts between @@ -89,7 +89,7 @@ with this program; if not, write to the Free Software Foundation, Inc., // Size of player's main inventory #define PLAYER_INVENTORY_SIZE (8 * 4) -// Default maximum hit points of a player +// Default maximum health points of a player #define PLAYER_MAX_HP_DEFAULT 20 // Default maximal breath of a player @@ -111,4 +111,3 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #define TTF_DEFAULT_FONT_SIZE (16) -#define DEFAULT_FONT_SIZE (10) diff --git a/src/content/CMakeLists.txt b/src/content/CMakeLists.txt index 5adcf6b1e..2aefd40a4 100644 --- a/src/content/CMakeLists.txt +++ b/src/content/CMakeLists.txt @@ -1,6 +1,6 @@ set(content_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/content.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/packages.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/mod_configuration.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mods.cpp ${CMAKE_CURRENT_SOURCE_DIR}/subgames.cpp PARENT_SCOPE diff --git a/src/content/content.cpp b/src/content/content.cpp index 66ef83d42..e576943ff 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -96,7 +96,12 @@ void parseContentInfo(ContentSpec &spec) Settings conf; if (!conf_path.empty() && conf.readConfigFile(conf_path.c_str())) { - if (conf.exists("name")) + if (conf.exists("title")) + spec.title = conf.get("title"); + else if (spec.type == "game" && conf.exists("name")) + spec.title = conf.get("name"); + + if (spec.type != "game" && conf.exists("name")) spec.name = conf.get("name"); if (conf.exists("description")) diff --git a/src/content/content.h b/src/content/content.h index e246ed411..ce09a2eb9 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -27,7 +27,14 @@ struct ContentSpec std::string type; std::string author; u32 release = 0; + + /// Technical name / Id std::string name; + + /// Human-readable title + std::string title; + + /// Short description std::string desc; std::string path; }; diff --git a/src/content/mod_configuration.cpp b/src/content/mod_configuration.cpp new file mode 100644 index 000000000..a2ac959a1 --- /dev/null +++ b/src/content/mod_configuration.cpp @@ -0,0 +1,266 @@ +/* +Minetest +Copyright (C) 2013-22 celeron55, Perttu Ahola <celeron55@gmail.com> + +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. +*/ + +#include "mod_configuration.h" +#include "log.h" +#include "settings.h" +#include "filesys.h" +#include "gettext.h" + + +std::string ModConfiguration::getUnsatisfiedModsError() const +{ + std::ostringstream error; + error << gettext("Some mods have unsatisfied dependencies:") << std::endl; + + for (const ModSpec &mod : m_unsatisfied_mods) { + //~ Error when a mod is missing dependencies. Ex: "Mod Title is missing: mod1, mod2, mod3" + error << " - " << fmtgettext("%s is missing:", mod.name.c_str()); + for (const std::string &unsatisfied_depend : mod.unsatisfied_depends) + error << " " << unsatisfied_depend; + error << "\n"; + } + + error << "\n" + << gettext("Install and enable the required mods, or disable the mods causing errors.") << "\n" + << gettext("Note: this may be caused by a dependency cycle, in which case try updating the mods."); + + return error.str(); +} + +void ModConfiguration::addModsInPath(const std::string &path, const std::string &virtual_path) +{ + addMods(flattenMods(getModsInPath(path, virtual_path))); +} + +void ModConfiguration::addMods(const std::vector<ModSpec> &new_mods) +{ + // Maintain a map of all existing m_unsatisfied_mods. + // Keys are mod names and values are indices into m_unsatisfied_mods. + std::map<std::string, u32> existing_mods; + for (u32 i = 0; i < m_unsatisfied_mods.size(); ++i) { + existing_mods[m_unsatisfied_mods[i].name] = i; + } + + // Add new mods + for (int want_from_modpack = 1; want_from_modpack >= 0; --want_from_modpack) { + // First iteration: + // Add all the mods that come from modpacks + // Second iteration: + // Add all the mods that didn't come from modpacks + + std::set<std::string> seen_this_iteration; + + for (const ModSpec &mod : new_mods) { + if (mod.part_of_modpack != (bool)want_from_modpack) + continue; + + if (existing_mods.count(mod.name) == 0) { + // GOOD CASE: completely new mod. + m_unsatisfied_mods.push_back(mod); + existing_mods[mod.name] = m_unsatisfied_mods.size() - 1; + } else if (seen_this_iteration.count(mod.name) == 0) { + // BAD CASE: name conflict in different levels. + u32 oldindex = existing_mods[mod.name]; + const ModSpec &oldmod = m_unsatisfied_mods[oldindex]; + warningstream << "Mod name conflict detected: \"" + << mod.name << "\"" << std::endl + << "Will not load: " << oldmod.path + << std::endl + << "Overridden by: " << mod.path + << std::endl; + m_unsatisfied_mods[oldindex] = mod; + + // If there was a "VERY BAD CASE" name conflict + // in an earlier level, ignore it. + m_name_conflicts.erase(mod.name); + } else { + // VERY BAD CASE: name conflict in the same level. + u32 oldindex = existing_mods[mod.name]; + const ModSpec &oldmod = m_unsatisfied_mods[oldindex]; + warningstream << "Mod name conflict detected: \"" + << mod.name << "\"" << std::endl + << "Will not load: " << oldmod.path + << std::endl + << "Will not load: " << mod.path + << std::endl; + m_unsatisfied_mods[oldindex] = mod; + m_name_conflicts.insert(mod.name); + } + + seen_this_iteration.insert(mod.name); + } + } +} + +void ModConfiguration::addGameMods(const SubgameSpec &gamespec) +{ + std::string game_virtual_path; + game_virtual_path.append("games/").append(gamespec.id).append("/mods"); + addModsInPath(gamespec.gamemods_path, game_virtual_path); +} + +void ModConfiguration::addModsFromConfig( + const std::string &settings_path, + const std::unordered_map<std::string, std::string> &modPaths) +{ + Settings conf; + std::unordered_map<std::string, std::string> load_mod_names; + + conf.readConfigFile(settings_path.c_str()); + std::vector<std::string> names = conf.getNames(); + for (const std::string &name : names) { + const auto &value = conf.get(name); + if (name.compare(0, 9, "load_mod_") == 0 && value != "false" && + value != "nil") + load_mod_names[name.substr(9)] = value; + } + + // List of enabled non-game non-world mods + std::vector<ModSpec> addon_mods; + + // Map of modname to a list candidate mod paths. Used to list + // alternatives if a particular mod cannot be found. + std::unordered_map<std::string, std::vector<std::string>> candidates; + + /* + * Iterate through all installed mods except game mods and world mods + * + * If the mod is enabled, add it to `addon_mods`. * + * + * Alternative candidates for a modname are stored in `candidates`, + * and used in an error message later. + * + * If not enabled, add `load_mod_modname = false` to world.mt + */ + for (const auto &modPath : modPaths) { + std::vector<ModSpec> addon_mods_in_path = flattenMods(getModsInPath(modPath.second, modPath.first)); + for (const auto &mod : addon_mods_in_path) { + const auto &pair = load_mod_names.find(mod.name); + if (pair != load_mod_names.end()) { + if (is_yes(pair->second) || pair->second == mod.virtual_path) { + addon_mods.push_back(mod); + } else { + candidates[pair->first].emplace_back(mod.virtual_path); + } + } else { + conf.setBool("load_mod_" + mod.name, false); + } + } + } + conf.updateConfigFile(settings_path.c_str()); + + addMods(addon_mods); + + // Remove all loaded mods from `load_mod_names` + // NB: as deps have not yet been resolved, `m_unsatisfied_mods` will contain all mods. + for (const ModSpec &mod : m_unsatisfied_mods) + load_mod_names.erase(mod.name); + + // Complain about mods declared to be loaded, but not found + if (!load_mod_names.empty()) { + errorstream << "The following mods could not be found:"; + for (const auto &pair : load_mod_names) + errorstream << " \"" << pair.first << "\""; + errorstream << std::endl; + + for (const auto &pair : load_mod_names) { + const auto &candidate = candidates.find(pair.first); + if (candidate != candidates.end()) { + errorstream << "Unable to load " << pair.first << " as the specified path " + << pair.second << " could not be found. " + << "However, it is available in the following locations:" + << std::endl; + for (const auto &path : candidate->second) { + errorstream << " - " << path << std::endl; + } + } + } + } +} + +void ModConfiguration::checkConflictsAndDeps() +{ + // report on name conflicts + if (!m_name_conflicts.empty()) { + std::string s = "Unresolved name conflicts for mods "; + + bool add_comma = false; + for (const auto& it : m_name_conflicts) { + if (add_comma) + s.append(", "); + s.append("\"").append(it).append("\""); + add_comma = true; + } + s.append("."); + + throw ModError(s); + } + + // get the mods in order + resolveDependencies(); +} + +void ModConfiguration::resolveDependencies() +{ + // Step 1: Compile a list of the mod names we're working with + std::set<std::string> modnames; + for (const ModSpec &mod : m_unsatisfied_mods) { + modnames.insert(mod.name); + } + + // Step 2: get dependencies (including optional dependencies) + // of each mod, split mods into satisfied and unsatisfied + std::list<ModSpec> satisfied; + std::list<ModSpec> unsatisfied; + for (ModSpec mod : m_unsatisfied_mods) { + mod.unsatisfied_depends = mod.depends; + // check which optional dependencies actually exist + for (const std::string &optdep : mod.optdepends) { + if (modnames.count(optdep) != 0) + mod.unsatisfied_depends.insert(optdep); + } + // if a mod has no depends it is initially satisfied + if (mod.unsatisfied_depends.empty()) + satisfied.push_back(mod); + else + unsatisfied.push_back(mod); + } + + // Step 3: mods without unmet dependencies can be appended to + // the sorted list. + while (!satisfied.empty()) { + ModSpec mod = satisfied.back(); + m_sorted_mods.push_back(mod); + satisfied.pop_back(); + for (auto it = unsatisfied.begin(); it != unsatisfied.end();) { + ModSpec &mod2 = *it; + mod2.unsatisfied_depends.erase(mod.name); + if (mod2.unsatisfied_depends.empty()) { + satisfied.push_back(mod2); + it = unsatisfied.erase(it); + } else { + ++it; + } + } + } + + // Step 4: write back list of unsatisfied mods + m_unsatisfied_mods.assign(unsatisfied.begin(), unsatisfied.end()); +} diff --git a/src/content/mod_configuration.h b/src/content/mod_configuration.h new file mode 100644 index 000000000..443530485 --- /dev/null +++ b/src/content/mod_configuration.h @@ -0,0 +1,111 @@ +/* +Minetest +Copyright (C) 2013-22 celeron55, Perttu Ahola <celeron55@gmail.com> + +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. +*/ + +#pragma once + +#include "mods.h" + + +/** + * ModConfiguration is a subset of installed mods. This class + * is used to resolve dependencies and return a sorted list of mods. + * + * This class should not be extended from, but instead used as a + * component in other classes. + */ +class ModConfiguration +{ +public: + /** + * @returns true if all dependencies are fullfilled. + */ + inline bool isConsistent() const { return m_unsatisfied_mods.empty(); } + + inline const std::vector<ModSpec> &getUnsatisfiedMods() const + { + return m_unsatisfied_mods; + } + + /** + * List of mods sorted such that they can be loaded in the + * given order with all dependencies being fulfilled. + * + * I.e: every mod in this list has only dependencies on mods which + * appear earlier in the vector. + */ + const std::vector<ModSpec> &getMods() const { return m_sorted_mods; } + + std::string getUnsatisfiedModsError() const; + + /** + * Adds all mods in the given path. used for games, modpacks + * and world-specific mods (worldmods-folders) + * + * @param path To search, should be absolute + * @param virtual_path Virtual path for this directory, see comment in ModSpec + */ + void addModsInPath(const std::string &path, const std::string &virtual_path); + + /** + * Adds all mods in `new_mods` + */ + void addMods(const std::vector<ModSpec> &new_mods); + + /** + * Adds game mods + */ + void addGameMods(const SubgameSpec &gamespec); + + /** + * Adds mods specifed by a world.mt config + * + * @param settings_path Path to world.mt + * @param modPaths Map from virtual name to mod path + */ + void addModsFromConfig(const std::string &settings_path, + const std::unordered_map<std::string, std::string> &modPaths); + + /** + * Call this function once all mods have been added + */ + void checkConflictsAndDeps(); + +private: + std::vector<ModSpec> m_sorted_mods; + + /** + * move mods from m_unsatisfied_mods to m_sorted_mods + * in an order that satisfies dependencies + */ + void resolveDependencies(); + + // mods with unmet dependencies. Before dependencies are resolved, + // this is where all mods are stored. Afterwards this contains + // only the ones with really unsatisfied dependencies. + std::vector<ModSpec> m_unsatisfied_mods; + + // set of mod names for which an unresolved name conflict + // exists. A name conflict happens when two or more mods + // at the same level have the same name but different paths. + // Levels (mods in higher levels override mods in lower levels): + // 1. game mod in modpack; 2. game mod; + // 3. world mod in modpack; 4. world mod; + // 5. addon mod in modpack; 6. addon mod. + std::unordered_set<std::string> m_name_conflicts; +}; diff --git a/src/content/mods.cpp b/src/content/mods.cpp index 95ab0290a..cec6fc2cd 100644 --- a/src/content/mods.cpp +++ b/src/content/mods.cpp @@ -22,12 +22,37 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <json/json.h> #include <algorithm> #include "content/mods.h" +#include "database/database.h" #include "filesys.h" #include "log.h" #include "content/subgames.h" #include "settings.h" #include "porting.h" #include "convert_json.h" +#include "script/common/c_internal.h" + +void ModSpec::checkAndLog() const +{ + if (!string_allowed(name, MODNAME_ALLOWED_CHARS)) { + throw ModError("Error loading mod \"" + name + + "\": Mod name does not follow naming conventions: " + "Only characters [a-z0-9_] are allowed."); + } + + // Log deprecation messages + auto handling_mode = get_deprecated_handling_mode(); + if (!deprecation_msgs.empty() && handling_mode != DeprecatedHandlingMode::Ignore) { + std::ostringstream os; + os << "Mod " << name << " at " << path << ":" << std::endl; + for (auto msg : deprecation_msgs) + os << "\t" << msg << std::endl; + + if (handling_mode == DeprecatedHandlingMode::Error) + throw ModError(os.str()); + else + warningstream << os.str(); + } +} bool parseDependsString(std::string &dep, std::unordered_set<char> &symbols) { @@ -44,20 +69,9 @@ bool parseDependsString(std::string &dep, std::unordered_set<char> &symbols) return !dep.empty(); } -void parseModContents(ModSpec &spec) +bool parseModContents(ModSpec &spec) { // NOTE: this function works in mutual recursion with getModsInPath - Settings info; - info.readConfigFile((spec.path + DIR_DELIM + "mod.conf").c_str()); - - if (info.exists("name")) - spec.name = info.get("name"); - - if (info.exists("author")) - spec.author = info.get("author"); - - if (info.exists("release")) - spec.release = info.getS32("release"); spec.depends.clear(); spec.optdepends.clear(); @@ -65,87 +79,100 @@ void parseModContents(ModSpec &spec) spec.modpack_content.clear(); // Handle modpacks (defined by containing modpack.txt) - std::ifstream modpack_is((spec.path + DIR_DELIM + "modpack.txt").c_str()); - std::ifstream modpack2_is((spec.path + DIR_DELIM + "modpack.conf").c_str()); - if (modpack_is.good() || modpack2_is.good()) { - if (modpack_is.good()) - modpack_is.close(); - - if (modpack2_is.good()) - modpack2_is.close(); - + if (fs::IsFile(spec.path + DIR_DELIM + "modpack.txt") || + fs::IsFile(spec.path + DIR_DELIM + "modpack.conf")) { spec.is_modpack = true; - spec.modpack_content = getModsInPath(spec.path, true); + spec.modpack_content = getModsInPath(spec.path, spec.virtual_path, true); + return true; + } else if (!fs::IsFile(spec.path + DIR_DELIM + "init.lua")) { + return false; + } - } else { - // Attempt to load dependencies from mod.conf - bool mod_conf_has_depends = false; - if (info.exists("depends")) { - mod_conf_has_depends = true; - std::string dep = info.get("depends"); - // clang-format off - dep.erase(std::remove_if(dep.begin(), dep.end(), - static_cast<int (*)(int)>(&std::isspace)), dep.end()); - // clang-format on - for (const auto &dependency : str_split(dep, ',')) { - spec.depends.insert(dependency); - } + + Settings info; + info.readConfigFile((spec.path + DIR_DELIM + "mod.conf").c_str()); + + if (info.exists("name")) + spec.name = info.get("name"); + else + spec.deprecation_msgs.push_back("Mods not having a mod.conf file with the name is deprecated."); + + if (info.exists("author")) + spec.author = info.get("author"); + + if (info.exists("release")) + spec.release = info.getS32("release"); + + // Attempt to load dependencies from mod.conf + bool mod_conf_has_depends = false; + if (info.exists("depends")) { + mod_conf_has_depends = true; + std::string dep = info.get("depends"); + // clang-format off + dep.erase(std::remove_if(dep.begin(), dep.end(), + static_cast<int (*)(int)>(&std::isspace)), dep.end()); + // clang-format on + for (const auto &dependency : str_split(dep, ',')) { + spec.depends.insert(dependency); + } + } + + if (info.exists("optional_depends")) { + mod_conf_has_depends = true; + std::string dep = info.get("optional_depends"); + // clang-format off + dep.erase(std::remove_if(dep.begin(), dep.end(), + static_cast<int (*)(int)>(&std::isspace)), dep.end()); + // clang-format on + for (const auto &dependency : str_split(dep, ',')) { + spec.optdepends.insert(dependency); + } + } + + // Fallback to depends.txt + if (!mod_conf_has_depends) { + std::vector<std::string> dependencies; + + std::ifstream is((spec.path + DIR_DELIM + "depends.txt").c_str()); + + if (is.good()) + spec.deprecation_msgs.push_back("depends.txt is deprecated, please use mod.conf instead."); + + while (is.good()) { + std::string dep; + std::getline(is, dep); + dependencies.push_back(dep); } - if (info.exists("optional_depends")) { - mod_conf_has_depends = true; - std::string dep = info.get("optional_depends"); - // clang-format off - dep.erase(std::remove_if(dep.begin(), dep.end(), - static_cast<int (*)(int)>(&std::isspace)), dep.end()); - // clang-format on - for (const auto &dependency : str_split(dep, ',')) { - spec.optdepends.insert(dependency); - } - } - - // Fallback to depends.txt - if (!mod_conf_has_depends) { - std::vector<std::string> dependencies; - - std::ifstream is((spec.path + DIR_DELIM + "depends.txt").c_str()); - while (is.good()) { - std::string dep; - std::getline(is, dep); - dependencies.push_back(dep); - } - - for (auto &dependency : dependencies) { - std::unordered_set<char> symbols; - if (parseDependsString(dependency, symbols)) { - if (symbols.count('?') != 0) { - spec.optdepends.insert(dependency); - } else { - spec.depends.insert(dependency); - } + for (auto &dependency : dependencies) { + std::unordered_set<char> symbols; + if (parseDependsString(dependency, symbols)) { + if (symbols.count('?') != 0) { + spec.optdepends.insert(dependency); + } else { + spec.depends.insert(dependency); } } } - - if (info.exists("description")) { - spec.desc = info.get("description"); - } else { - std::ifstream is((spec.path + DIR_DELIM + "description.txt") - .c_str()); - spec.desc = std::string((std::istreambuf_iterator<char>(is)), - std::istreambuf_iterator<char>()); - } } + + if (info.exists("description")) + spec.desc = info.get("description"); + else if (fs::ReadFile(spec.path + DIR_DELIM + "description.txt", spec.desc)) + spec.deprecation_msgs.push_back("description.txt is deprecated, please use mod.conf instead."); + + return true; } std::map<std::string, ModSpec> getModsInPath( - const std::string &path, bool part_of_modpack) + const std::string &path, const std::string &virtual_path, bool part_of_modpack) { // NOTE: this function works in mutual recursion with parseModContents std::map<std::string, ModSpec> result; std::vector<fs::DirListNode> dirlist = fs::GetDirListing(path); - std::string modpath; + std::string mod_path; + std::string mod_virtual_path; for (const fs::DirListNode &dln : dirlist) { if (!dln.dir) @@ -157,10 +184,14 @@ std::map<std::string, ModSpec> getModsInPath( if (modname[0] == '.') continue; - modpath.clear(); - modpath.append(path).append(DIR_DELIM).append(modname); + mod_path.clear(); + mod_path.append(path).append(DIR_DELIM).append(modname); - ModSpec spec(modname, modpath, part_of_modpack); + mod_virtual_path.clear(); + // Intentionally uses / to keep paths same on different platforms + mod_virtual_path.append(virtual_path).append("/").append(modname); + + ModSpec spec(modname, mod_path, part_of_modpack, mod_virtual_path); parseModContents(spec); result.insert(std::make_pair(modname, spec)); } @@ -185,293 +216,30 @@ std::vector<ModSpec> flattenMods(const std::map<std::string, ModSpec> &mods) return result; } -ModConfiguration::ModConfiguration(const std::string &worldpath) -{ -} - -void ModConfiguration::printUnsatisfiedModsError() const -{ - for (const ModSpec &mod : m_unsatisfied_mods) { - errorstream << "mod \"" << mod.name - << "\" has unsatisfied dependencies: "; - for (const std::string &unsatisfied_depend : mod.unsatisfied_depends) - errorstream << " \"" << unsatisfied_depend << "\""; - errorstream << std::endl; - } -} - -void ModConfiguration::addModsInPath(const std::string &path) -{ - addMods(flattenMods(getModsInPath(path))); -} - -void ModConfiguration::addMods(const std::vector<ModSpec> &new_mods) -{ - // Maintain a map of all existing m_unsatisfied_mods. - // Keys are mod names and values are indices into m_unsatisfied_mods. - std::map<std::string, u32> existing_mods; - for (u32 i = 0; i < m_unsatisfied_mods.size(); ++i) { - existing_mods[m_unsatisfied_mods[i].name] = i; - } - - // Add new mods - for (int want_from_modpack = 1; want_from_modpack >= 0; --want_from_modpack) { - // First iteration: - // Add all the mods that come from modpacks - // Second iteration: - // Add all the mods that didn't come from modpacks - - std::set<std::string> seen_this_iteration; - - for (const ModSpec &mod : new_mods) { - if (mod.part_of_modpack != (bool)want_from_modpack) - continue; - - if (existing_mods.count(mod.name) == 0) { - // GOOD CASE: completely new mod. - m_unsatisfied_mods.push_back(mod); - existing_mods[mod.name] = m_unsatisfied_mods.size() - 1; - } else if (seen_this_iteration.count(mod.name) == 0) { - // BAD CASE: name conflict in different levels. - u32 oldindex = existing_mods[mod.name]; - const ModSpec &oldmod = m_unsatisfied_mods[oldindex]; - warningstream << "Mod name conflict detected: \"" - << mod.name << "\"" << std::endl - << "Will not load: " << oldmod.path - << std::endl - << "Overridden by: " << mod.path - << std::endl; - m_unsatisfied_mods[oldindex] = mod; - - // If there was a "VERY BAD CASE" name conflict - // in an earlier level, ignore it. - m_name_conflicts.erase(mod.name); - } else { - // VERY BAD CASE: name conflict in the same level. - u32 oldindex = existing_mods[mod.name]; - const ModSpec &oldmod = m_unsatisfied_mods[oldindex]; - warningstream << "Mod name conflict detected: \"" - << mod.name << "\"" << std::endl - << "Will not load: " << oldmod.path - << std::endl - << "Will not load: " << mod.path - << std::endl; - m_unsatisfied_mods[oldindex] = mod; - m_name_conflicts.insert(mod.name); - } - - seen_this_iteration.insert(mod.name); - } - } -} - -void ModConfiguration::addModsFromConfig( - const std::string &settings_path, const std::set<std::string> &mods) -{ - Settings conf; - std::set<std::string> load_mod_names; - - conf.readConfigFile(settings_path.c_str()); - std::vector<std::string> names = conf.getNames(); - for (const std::string &name : names) { - if (name.compare(0, 9, "load_mod_") == 0 && conf.get(name) != "false" && - conf.get(name) != "nil") - load_mod_names.insert(name.substr(9)); - } - - std::vector<ModSpec> addon_mods; - for (const std::string &i : mods) { - std::vector<ModSpec> addon_mods_in_path = flattenMods(getModsInPath(i)); - for (std::vector<ModSpec>::const_iterator it = addon_mods_in_path.begin(); - it != addon_mods_in_path.end(); ++it) { - const ModSpec &mod = *it; - if (load_mod_names.count(mod.name) != 0) - addon_mods.push_back(mod); - else - conf.setBool("load_mod_" + mod.name, false); - } - } - conf.updateConfigFile(settings_path.c_str()); - - addMods(addon_mods); - checkConflictsAndDeps(); - - // complain about mods declared to be loaded, but not found - for (const ModSpec &addon_mod : addon_mods) - load_mod_names.erase(addon_mod.name); - - std::vector<ModSpec> unsatisfiedMods = getUnsatisfiedMods(); - - for (const ModSpec &unsatisfiedMod : unsatisfiedMods) - load_mod_names.erase(unsatisfiedMod.name); - - if (!load_mod_names.empty()) { - errorstream << "The following mods could not be found:"; - for (const std::string &mod : load_mod_names) - errorstream << " \"" << mod << "\""; - errorstream << std::endl; - } -} - -void ModConfiguration::checkConflictsAndDeps() -{ - // report on name conflicts - if (!m_name_conflicts.empty()) { - std::string s = "Unresolved name conflicts for mods "; - for (std::unordered_set<std::string>::const_iterator it = - m_name_conflicts.begin(); - it != m_name_conflicts.end(); ++it) { - if (it != m_name_conflicts.begin()) - s += ", "; - s += std::string("\"") + (*it) + "\""; - } - s += "."; - throw ModError(s); - } - - // get the mods in order - resolveDependencies(); -} - -void ModConfiguration::resolveDependencies() -{ - // Step 1: Compile a list of the mod names we're working with - std::set<std::string> modnames; - for (const ModSpec &mod : m_unsatisfied_mods) { - modnames.insert(mod.name); - } - - // Step 2: get dependencies (including optional dependencies) - // of each mod, split mods into satisfied and unsatisfied - std::list<ModSpec> satisfied; - std::list<ModSpec> unsatisfied; - for (ModSpec mod : m_unsatisfied_mods) { - mod.unsatisfied_depends = mod.depends; - // check which optional dependencies actually exist - for (const std::string &optdep : mod.optdepends) { - if (modnames.count(optdep) != 0) - mod.unsatisfied_depends.insert(optdep); - } - // if a mod has no depends it is initially satisfied - if (mod.unsatisfied_depends.empty()) - satisfied.push_back(mod); - else - unsatisfied.push_back(mod); - } - - // Step 3: mods without unmet dependencies can be appended to - // the sorted list. - while (!satisfied.empty()) { - ModSpec mod = satisfied.back(); - m_sorted_mods.push_back(mod); - satisfied.pop_back(); - for (auto it = unsatisfied.begin(); it != unsatisfied.end();) { - ModSpec &mod2 = *it; - mod2.unsatisfied_depends.erase(mod.name); - if (mod2.unsatisfied_depends.empty()) { - satisfied.push_back(mod2); - it = unsatisfied.erase(it); - } else { - ++it; - } - } - } - - // Step 4: write back list of unsatisfied mods - m_unsatisfied_mods.assign(unsatisfied.begin(), unsatisfied.end()); -} - -#ifndef SERVER -ClientModConfiguration::ClientModConfiguration(const std::string &path) : - ModConfiguration(path) -{ - std::set<std::string> paths; - std::string path_user = porting::path_user + DIR_DELIM + "clientmods"; - paths.insert(path); - paths.insert(path_user); - - std::string settings_path = path_user + DIR_DELIM + "mods.conf"; - addModsFromConfig(settings_path, paths); -} -#endif - -ModMetadata::ModMetadata(const std::string &mod_name) : m_mod_name(mod_name) + +ModMetadata::ModMetadata(const std::string &mod_name, ModMetadataDatabase *database): + m_mod_name(mod_name), m_database(database) { + m_database->getModEntries(m_mod_name, &m_stringvars); } void ModMetadata::clear() { + for (const auto &pair : m_stringvars) { + m_database->removeModEntry(m_mod_name, pair.first); + } Metadata::clear(); - m_modified = true; -} - -bool ModMetadata::save(const std::string &root_path) -{ - Json::Value json; - for (StringMap::const_iterator it = m_stringvars.begin(); - it != m_stringvars.end(); ++it) { - json[it->first] = it->second; - } - - if (!fs::PathExists(root_path)) { - if (!fs::CreateAllDirs(root_path)) { - errorstream << "ModMetadata[" << m_mod_name - << "]: Unable to save. '" << root_path - << "' tree cannot be created." << std::endl; - return false; - } - } else if (!fs::IsDir(root_path)) { - errorstream << "ModMetadata[" << m_mod_name << "]: Unable to save. '" - << root_path << "' is not a directory." << std::endl; - return false; - } - - bool w_ok = fs::safeWriteToFile( - root_path + DIR_DELIM + m_mod_name, fastWriteJson(json)); - - if (w_ok) { - m_modified = false; - } else { - errorstream << "ModMetadata[" << m_mod_name << "]: failed write file." - << std::endl; - } - return w_ok; -} - -bool ModMetadata::load(const std::string &root_path) -{ - m_stringvars.clear(); - - std::ifstream is((root_path + DIR_DELIM + m_mod_name).c_str(), - std::ios_base::binary); - if (!is.good()) { - return false; - } - - Json::Value root; - Json::CharReaderBuilder builder; - builder.settings_["collectComments"] = false; - std::string errs; - - if (!Json::parseFromStream(builder, is, &root, &errs)) { - errorstream << "ModMetadata[" << m_mod_name - << "]: failed read data " - "(Json decoding failure). Message: " - << errs << std::endl; - return false; - } - - const Json::Value::Members attr_list = root.getMemberNames(); - for (const auto &it : attr_list) { - Json::Value attr_value = root[it]; - m_stringvars[it] = attr_value.asString(); - } - - return true; } bool ModMetadata::setString(const std::string &name, const std::string &var) { - m_modified = Metadata::setString(name, var); - return m_modified; + if (Metadata::setString(name, var)) { + if (var.empty()) { + m_database->removeModEntry(m_mod_name, name); + } else { + m_database->setModEntry(m_mod_name, name, var); + } + return true; + } + return false; } diff --git a/src/content/mods.h b/src/content/mods.h index b3500fbc8..5ed5b8171 100644 --- a/src/content/mods.h +++ b/src/content/mods.h @@ -30,6 +30,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/basic_macros.h" #include "config.h" #include "metadata.h" +#include "subgames.h" + +class ModMetadataDatabase; #define MODNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_" @@ -49,115 +52,78 @@ struct ModSpec bool part_of_modpack = false; bool is_modpack = false; + /** + * A constructed canonical path to represent this mod's location. + * This intended to be used as an identifier for a modpath that tolerates file movement, + * and cannot be used to read the mod files. + * + * Note that `mymod` is the directory name, not the mod name specified in mod.conf. + * + * Ex: + * + * - mods/mymod + * - mods/mymod (1) + * (^ this would have name=mymod in mod.conf) + * - mods/modpack1/mymod + * - games/mygame/mods/mymod + * - worldmods/mymod + */ + std::string virtual_path; + + // For logging purposes + std::vector<const char *> deprecation_msgs; + // if modpack: std::map<std::string, ModSpec> modpack_content; - ModSpec(const std::string &name = "", const std::string &path = "") : - name(name), path(path) + + ModSpec() { } - ModSpec(const std::string &name, const std::string &path, bool part_of_modpack) : - name(name), path(path), part_of_modpack(part_of_modpack) + + ModSpec(const std::string &name, const std::string &path, bool part_of_modpack, const std::string &virtual_path) : + name(name), path(path), part_of_modpack(part_of_modpack), virtual_path(virtual_path) { } + + void checkAndLog() const; }; -// Retrieves depends, optdepends, is_modpack and modpack_content -void parseModContents(ModSpec &mod); +/** + * Retrieves depends, optdepends, is_modpack and modpack_content + * + * @returns false if not a mod + */ +bool parseModContents(ModSpec &mod); -std::map<std::string, ModSpec> getModsInPath( - const std::string &path, bool part_of_modpack = false); +/** + * Gets a list of all mods and modpacks in path + * + * @param Path to search, should be absolute + * @param part_of_modpack Is this searching within a modpack? + * @param virtual_path Virtual path for this directory, see comment in ModSpec + * @returns map of mods + */ +std::map<std::string, ModSpec> getModsInPath(const std::string &path, + const std::string &virtual_path, bool part_of_modpack = false); // replaces modpack Modspecs with their content std::vector<ModSpec> flattenMods(const std::map<std::string, ModSpec> &mods); -// a ModConfiguration is a subset of installed mods, expected to have -// all dependencies fullfilled, so it can be used as a list of mods to -// load when the game starts. -class ModConfiguration -{ -public: - // checks if all dependencies are fullfilled. - bool isConsistent() const { return m_unsatisfied_mods.empty(); } - - const std::vector<ModSpec> &getMods() const { return m_sorted_mods; } - - const std::vector<ModSpec> &getUnsatisfiedMods() const - { - return m_unsatisfied_mods; - } - - void printUnsatisfiedModsError() const; - -protected: - ModConfiguration(const std::string &worldpath); - // adds all mods in the given path. used for games, modpacks - // and world-specific mods (worldmods-folders) - void addModsInPath(const std::string &path); - - // adds all mods in the set. - void addMods(const std::vector<ModSpec> &new_mods); - - void addModsFromConfig(const std::string &settings_path, - const std::set<std::string> &mods); - - void checkConflictsAndDeps(); - -protected: - // list of mods sorted such that they can be loaded in the - // given order with all dependencies being fullfilled. I.e., - // every mod in this list has only dependencies on mods which - // appear earlier in the vector. - std::vector<ModSpec> m_sorted_mods; - -private: - // move mods from m_unsatisfied_mods to m_sorted_mods - // in an order that satisfies dependencies - void resolveDependencies(); - - // mods with unmet dependencies. Before dependencies are resolved, - // this is where all mods are stored. Afterwards this contains - // only the ones with really unsatisfied dependencies. - std::vector<ModSpec> m_unsatisfied_mods; - - // set of mod names for which an unresolved name conflict - // exists. A name conflict happens when two or more mods - // at the same level have the same name but different paths. - // Levels (mods in higher levels override mods in lower levels): - // 1. game mod in modpack; 2. game mod; - // 3. world mod in modpack; 4. world mod; - // 5. addon mod in modpack; 6. addon mod. - std::unordered_set<std::string> m_name_conflicts; - - // Deleted default constructor - ModConfiguration() = default; -}; - -#ifndef SERVER -class ClientModConfiguration : public ModConfiguration -{ -public: - ClientModConfiguration(const std::string &path); -}; -#endif class ModMetadata : public Metadata { public: ModMetadata() = delete; - ModMetadata(const std::string &mod_name); + ModMetadata(const std::string &mod_name, ModMetadataDatabase *database); ~ModMetadata() = default; virtual void clear(); - bool save(const std::string &root_path); - bool load(const std::string &root_path); - - bool isModified() const { return m_modified; } const std::string &getModName() const { return m_mod_name; } virtual bool setString(const std::string &name, const std::string &var); private: std::string m_mod_name; - bool m_modified = false; + ModMetadataDatabase *m_database; }; diff --git a/src/content/packages.cpp b/src/content/packages.cpp deleted file mode 100644 index 2d488eb76..000000000 --- a/src/content/packages.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* -Minetest -Copyright (C) 2018 rubenwardy <rw@rubenwardy.com> - -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. -*/ - -#include "content/packages.h" -#include "log.h" -#include "filesys.h" -#include "porting.h" -#include "settings.h" -#include "content/mods.h" -#include "content/subgames.h" - -std::string Package::getDownloadURL(const std::string &baseURL) const -{ - return baseURL + "/packages/" + author + "/" + name + "/releases/" + - std::to_string(release) + "/download/"; -} - -#if USE_CURL -std::vector<Package> getPackagesFromURL(const std::string &url) -{ - std::vector<std::string> extra_headers; - extra_headers.emplace_back("Accept: application/json"); - - Json::Value json = fetchJsonValue(url, &extra_headers); - if (!json.isArray()) { - errorstream << "Invalid JSON download " << std::endl; - return std::vector<Package>(); - } - - std::vector<Package> packages; - - // Note: `unsigned int` is required to index JSON - for (unsigned int i = 0; i < json.size(); ++i) { - Package package; - - package.author = json[i]["author"].asString(); - package.name = json[i]["name"].asString(); - package.title = json[i]["title"].asString(); - package.type = json[i]["type"].asString(); - package.shortDesc = json[i]["shortDesc"].asString(); - package.release = json[i]["release"].asInt(); - if (json[i].isMember("thumbnail")) - package.thumbnail = json[i]["thumbnail"].asString(); - - if (package.valid()) - packages.push_back(package); - else - errorstream << "Invalid package at " << i << std::endl; - } - - return packages; -} -#endif diff --git a/src/content/subgames.cpp b/src/content/subgames.cpp index 695ba431f..d0de926ef 100644 --- a/src/content/subgames.cpp +++ b/src/content/subgames.cpp @@ -17,6 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include <common/c_internal.h> #include "content/subgames.h" #include "porting.h" #include "filesys.h" @@ -24,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "util/strfnd.h" #include "defaultsettings.h" // for set_default_settings -#include "mapgen/mapgen.h" // for MapgenParams +#include "map_settings_manager.h" #include "util/string.h" #ifndef SERVER @@ -34,12 +35,36 @@ with this program; if not, write to the Free Software Foundation, Inc., // The maximum number of identical world names allowed #define MAX_WORLD_NAMES 100 +namespace +{ + bool getGameMinetestConfig(const std::string &game_path, Settings &conf) { std::string conf_path = game_path + DIR_DELIM + "minetest.conf"; return conf.readConfigFile(conf_path.c_str()); } +} + + +void SubgameSpec::checkAndLog() const +{ + // Log deprecation messages + auto handling_mode = get_deprecated_handling_mode(); + if (!deprecation_msgs.empty() && handling_mode != DeprecatedHandlingMode::Ignore) { + std::ostringstream os; + os << "Game " << title << " at " << path << ":" << std::endl; + for (auto msg : deprecation_msgs) + os << "\t" << msg << std::endl; + + if (handling_mode == DeprecatedHandlingMode::Error) + throw ModError(os.str()); + else + warningstream << os.str(); + } +} + + struct GameFindPath { std::string path; @@ -102,22 +127,27 @@ SubgameSpec findSubgame(const std::string &id) std::string gamemod_path = game_path + DIR_DELIM + "mods"; // Find mod directories - std::set<std::string> mods_paths; - if (!user_game) - mods_paths.insert(share + DIR_DELIM + "mods"); - if (user != share || user_game) - mods_paths.insert(user + DIR_DELIM + "mods"); + std::unordered_map<std::string, std::string> mods_paths; + mods_paths["mods"] = user + DIR_DELIM + "mods"; + if (!user_game && user != share) + mods_paths["share"] = share + DIR_DELIM + "mods"; + + for (const std::string &mod_path : getEnvModPaths()) { + mods_paths[fs::AbsolutePath(mod_path)] = mod_path; + } // Get meta std::string conf_path = game_path + DIR_DELIM + "game.conf"; Settings conf; conf.readConfigFile(conf_path.c_str()); - std::string game_name; - if (conf.exists("name")) - game_name = conf.get("name"); + std::string game_title; + if (conf.exists("title")) + game_title = conf.get("title"); + else if (conf.exists("name")) + game_title = conf.get("name"); else - game_name = id; + game_title = id; std::string game_author; if (conf.exists("author")) @@ -132,8 +162,14 @@ SubgameSpec findSubgame(const std::string &id) menuicon_path = getImagePath( game_path + DIR_DELIM + "menu" + DIR_DELIM + "icon.png"); #endif - return SubgameSpec(id, game_path, gamemod_path, mods_paths, game_name, + + SubgameSpec spec(id, game_path, gamemod_path, mods_paths, game_title, menuicon_path, game_author, game_release); + + if (conf.exists("name") && !conf.exists("title")) + spec.deprecation_msgs.push_back("\"name\" setting in game.conf is deprecated, please use \"title\" instead"); + + return spec; } SubgameSpec findWorldSubgame(const std::string &world_path) @@ -151,10 +187,12 @@ SubgameSpec findWorldSubgame(const std::string &world_path) std::string conf_path = world_gamepath + DIR_DELIM + "game.conf"; conf.readConfigFile(conf_path.c_str()); - if (conf.exists("name")) - gamespec.name = conf.get("name"); + if (conf.exists("title")) + gamespec.title = conf.get("title"); + else if (conf.exists("name")) + gamespec.title = conf.get("name"); else - gamespec.name = world_gameid; + gamespec.title = world_gameid; return gamespec; } @@ -324,15 +362,16 @@ void loadGameConfAndInitWorld(const std::string &path, const std::string &name, } } - // Override defaults with those provided by the game. - // We clear and reload the defaults because the defaults - // might have been overridden by other subgame config - // files that were loaded before. - g_settings->clearDefaults(); - set_default_settings(g_settings); - Settings game_defaults; - getGameMinetestConfig(gamespec.path, game_defaults); - g_settings->overrideDefaults(&game_defaults); + Settings *game_settings = Settings::getLayer(SL_GAME); + const bool new_game_settings = (game_settings == nullptr); + if (new_game_settings) { + // Called by main-menu without a Server instance running + // -> create and free manually + game_settings = Settings::createLayer(SL_GAME); + } + + getGameMinetestConfig(gamespec.path, *game_settings); + game_settings->removeSecureSettings(); infostream << "Initializing world at " << final_path << std::endl; @@ -348,6 +387,7 @@ void loadGameConfAndInitWorld(const std::string &path, const std::string &name, conf.set("backend", "sqlite3"); conf.set("player_backend", "sqlite3"); conf.set("auth_backend", "sqlite3"); + conf.set("mod_storage_backend", "sqlite3"); conf.setBool("creative_mode", g_settings->getBool("creative_mode")); conf.setBool("enable_damage", g_settings->getBool("enable_damage")); @@ -359,18 +399,25 @@ void loadGameConfAndInitWorld(const std::string &path, const std::string &name, // Create map_meta.txt if does not already exist std::string map_meta_path = final_path + DIR_DELIM + "map_meta.txt"; if (!fs::PathExists(map_meta_path)) { - verbosestream << "Creating map_meta.txt (" << map_meta_path << ")" - << std::endl; - std::ostringstream oss(std::ios_base::binary); + MapSettingsManager mgr(map_meta_path); - Settings conf; - MapgenParams params; + mgr.setMapSetting("seed", g_settings->get("fixed_map_seed")); - params.readParams(g_settings); - params.writeParams(&conf); - conf.writeLines(oss); - oss << "[end_of_params]\n"; - - fs::safeWriteToFile(map_meta_path, oss.str()); + mgr.makeMapgenParams(); + mgr.saveMapMeta(); } + + // The Settings object is no longer needed for created worlds + if (new_game_settings) + delete game_settings; +} + +std::vector<std::string> getEnvModPaths() +{ + const char *c_mod_path = getenv("MINETEST_MOD_PATH"); + std::vector<std::string> paths; + Strfnd search_paths(c_mod_path ? c_mod_path : ""); + while (!search_paths.at_end()) + paths.push_back(search_paths.next(PATH_DELIM)); + return paths; } diff --git a/src/content/subgames.h b/src/content/subgames.h index 35b619aaf..d5d168243 100644 --- a/src/content/subgames.h +++ b/src/content/subgames.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <string> #include <set> +#include <unordered_map> #include <vector> class Settings; @@ -28,39 +29,45 @@ class Settings; struct SubgameSpec { std::string id; - std::string name; + std::string title; std::string author; int release; std::string path; std::string gamemods_path; - std::set<std::string> addon_mods_paths; + + /** + * Map from virtual path to mods path + */ + std::unordered_map<std::string, std::string> addon_mods_paths; std::string menuicon_path; + // For logging purposes + std::vector<const char *> deprecation_msgs; + SubgameSpec(const std::string &id = "", const std::string &path = "", const std::string &gamemods_path = "", - const std::set<std::string> &addon_mods_paths = - std::set<std::string>(), - const std::string &name = "", + const std::unordered_map<std::string, std::string> &addon_mods_paths = {}, + const std::string &title = "", const std::string &menuicon_path = "", const std::string &author = "", int release = 0) : id(id), - name(name), author(author), release(release), path(path), + title(title), author(author), release(release), path(path), gamemods_path(gamemods_path), addon_mods_paths(addon_mods_paths), menuicon_path(menuicon_path) { } bool isValid() const { return (!id.empty() && !path.empty()); } + void checkAndLog() const; }; -// minetest.conf -bool getGameMinetestConfig(const std::string &game_path, Settings &conf); - SubgameSpec findSubgame(const std::string &id); SubgameSpec findWorldSubgame(const std::string &world_path); std::set<std::string> getAvailableGameIds(); std::vector<SubgameSpec> getAvailableGames(); +// Get the list of paths to mods in the environment variable $MINETEST_MOD_PATH +std::vector<std::string> getEnvModPaths(); bool getWorldExists(const std::string &world_path); //! Try to get the displayed name of a world diff --git a/src/content_nodemeta.cpp b/src/content_nodemeta.cpp index fc2859d27..39743c11f 100644 --- a/src/content_nodemeta.cpp +++ b/src/content_nodemeta.cpp @@ -43,26 +43,26 @@ static bool content_nodemeta_deserialize_legacy_body( if(id == NODEMETA_GENERIC) // GenericNodeMetadata (0.4-dev) { meta->getInventory()->deSerialize(is); - deSerializeLongString(is); // m_text - deSerializeString(is); // m_owner + deSerializeString32(is); // m_text + deSerializeString16(is); // m_owner - meta->setString("infotext",deSerializeString(is)); - meta->setString("formspec",deSerializeString(is)); + meta->setString("infotext",deSerializeString16(is)); + meta->setString("formspec",deSerializeString16(is)); readU8(is); // m_allow_text_input readU8(is); // m_allow_removal readU8(is); // m_enforce_owner int num_vars = readU32(is); for(int i=0; i<num_vars; i++){ - std::string name = deSerializeString(is); - std::string var = deSerializeLongString(is); + std::string name = deSerializeString16(is); + std::string var = deSerializeString32(is); meta->setString(name, var); } return false; } else if(id == NODEMETA_SIGN) // SignNodeMetadata { - meta->setString("text", deSerializeString(is)); + meta->setString("text", deSerializeString16(is)); //meta->setString("infotext","\"${text}\""); meta->setString("infotext", std::string("\"") + meta->getString("text") + "\""); @@ -87,7 +87,7 @@ static bool content_nodemeta_deserialize_legacy_body( } else if(id == NODEMETA_LOCKABLE_CHEST) // LockingChestNodeMetadata { - meta->setString("owner", deSerializeString(is)); + meta->setString("owner", deSerializeString16(is)); meta->getInventory()->deSerialize(is); // Rename inventory list "0" to "main" @@ -138,7 +138,7 @@ static bool content_nodemeta_deserialize_legacy_meta( s16 id = readS16(is); // Read data - std::string data = deSerializeString(is); + std::string data = deSerializeString16(is); std::istringstream tmp_is(data, std::ios::binary); return content_nodemeta_deserialize_legacy_body(tmp_is, id, meta); } diff --git a/src/convert_json.cpp b/src/convert_json.cpp index c774aa002..686113fa8 100644 --- a/src/convert_json.cpp +++ b/src/convert_json.cpp @@ -17,63 +17,23 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include <vector> #include <iostream> #include <sstream> +#include <memory> #include "convert_json.h" -#include "content/mods.h" -#include "config.h" -#include "log.h" -#include "settings.h" -#include "httpfetch.h" -#include "porting.h" -Json::Value fetchJsonValue(const std::string &url, - std::vector<std::string> *extra_headers) +void fastWriteJson(const Json::Value &value, std::ostream &to) { - HTTPFetchRequest fetch_request; - HTTPFetchResult fetch_result; - fetch_request.url = url; - fetch_request.caller = HTTPFETCH_SYNC; - - if (extra_headers != NULL) - fetch_request.extra_headers = *extra_headers; - - httpfetch_sync(fetch_request, fetch_result); - - if (!fetch_result.succeeded) { - return Json::Value(); - } - Json::Value root; - std::istringstream stream(fetch_result.data); - - Json::CharReaderBuilder builder; - builder.settings_["collectComments"] = false; - std::string errs; - - if (!Json::parseFromStream(builder, stream, &root, &errs)) { - errorstream << "URL: " << url << std::endl; - errorstream << "Failed to parse json data " << errs << std::endl; - if (fetch_result.data.size() > 100) { - errorstream << "Data (" << fetch_result.data.size() - << " bytes) printed to warningstream." << std::endl; - warningstream << "data: \"" << fetch_result.data << "\"" << std::endl; - } else { - errorstream << "data: \"" << fetch_result.data << "\"" << std::endl; - } - return Json::Value(); - } - - return root; + Json::StreamWriterBuilder builder; + builder["indentation"] = ""; + std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter()); + writer->write(value, &to); } std::string fastWriteJson(const Json::Value &value) { std::ostringstream oss; - Json::StreamWriterBuilder builder; - builder["indentation"] = ""; - std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter()); - writer->write(value, &oss); + fastWriteJson(value, oss); return oss.str(); } diff --git a/src/convert_json.h b/src/convert_json.h index d8825acdc..d1d487e77 100644 --- a/src/convert_json.h +++ b/src/convert_json.h @@ -20,8 +20,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include <json/json.h> +#include <ostream> -Json::Value fetchJsonValue(const std::string &url, - std::vector<std::string> *extra_headers); +void fastWriteJson(const Json::Value &value, std::ostream &to); std::string fastWriteJson(const Json::Value &value); diff --git a/src/craftdef.cpp b/src/craftdef.cpp index 210605198..c05a0cfb7 100644 --- a/src/craftdef.cpp +++ b/src/craftdef.cpp @@ -734,7 +734,8 @@ bool CraftDefinitionCooking::check(const CraftInput &input, IGameDef *gamedef) c } // Check the single input item - return inputItemMatchesRecipe(input_filtered[0], recipe, gamedef->idef()); + std::string rec_name = craftGetItemName(recipe, gamedef); + return inputItemMatchesRecipe(input_filtered[0], rec_name, gamedef->idef()); } CraftOutput CraftDefinitionCooking::getOutput(const CraftInput &input, IGameDef *gamedef) const @@ -836,7 +837,8 @@ bool CraftDefinitionFuel::check(const CraftInput &input, IGameDef *gamedef) cons } // Check the single input item - return inputItemMatchesRecipe(input_filtered[0], recipe, gamedef->idef()); + std::string rec_name = craftGetItemName(recipe, gamedef); + return inputItemMatchesRecipe(input_filtered[0], rec_name, gamedef->idef()); } CraftOutput CraftDefinitionFuel::getOutput(const CraftInput &input, IGameDef *gamedef) const diff --git a/src/database/database-dummy.cpp b/src/database/database-dummy.cpp index b56f341c5..629b2fb04 100644 --- a/src/database/database-dummy.cpp +++ b/src/database/database-dummy.cpp @@ -80,3 +80,41 @@ void Database_Dummy::listPlayers(std::vector<std::string> &res) res.emplace_back(player); } } + +bool Database_Dummy::getModEntries(const std::string &modname, StringMap *storage) +{ + const auto mod_pair = m_mod_meta_database.find(modname); + if (mod_pair != m_mod_meta_database.cend()) { + for (const auto &pair : mod_pair->second) { + (*storage)[pair.first] = pair.second; + } + } + return true; +} + +bool Database_Dummy::setModEntry(const std::string &modname, + const std::string &key, const std::string &value) +{ + auto mod_pair = m_mod_meta_database.find(modname); + if (mod_pair == m_mod_meta_database.end()) { + m_mod_meta_database[modname] = StringMap({{key, value}}); + } else { + mod_pair->second[key] = value; + } + return true; +} + +bool Database_Dummy::removeModEntry(const std::string &modname, const std::string &key) +{ + auto mod_pair = m_mod_meta_database.find(modname); + if (mod_pair != m_mod_meta_database.end()) + return mod_pair->second.erase(key) > 0; + return false; +} + +void Database_Dummy::listMods(std::vector<std::string> *res) +{ + for (const auto &pair : m_mod_meta_database) { + res->push_back(pair.first); + } +} diff --git a/src/database/database-dummy.h b/src/database/database-dummy.h index b69919f84..44b9e8d68 100644 --- a/src/database/database-dummy.h +++ b/src/database/database-dummy.h @@ -24,7 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "database.h" #include "irrlichttypes.h" -class Database_Dummy : public MapDatabase, public PlayerDatabase +class Database_Dummy : public MapDatabase, public PlayerDatabase, public ModMetadataDatabase { public: bool saveBlock(const v3s16 &pos, const std::string &data); @@ -37,10 +37,17 @@ public: bool removePlayer(const std::string &name); void listPlayers(std::vector<std::string> &res); + bool getModEntries(const std::string &modname, StringMap *storage); + bool setModEntry(const std::string &modname, + const std::string &key, const std::string &value); + bool removeModEntry(const std::string &modname, const std::string &key); + void listMods(std::vector<std::string> *res); + void beginSave() {} void endSave() {} private: std::map<s64, std::string> m_database; std::set<std::string> m_player_database; + std::unordered_map<std::string, StringMap> m_mod_meta_database; }; diff --git a/src/database/database-files.cpp b/src/database/database-files.cpp index d2b0b1543..7c0dbac28 100644 --- a/src/database/database-files.cpp +++ b/src/database/database-files.cpp @@ -18,7 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include <cassert> -#include <json/json.h> +#include "convert_json.h" #include "database-files.h" #include "remoteplayer.h" #include "settings.h" @@ -36,29 +36,116 @@ PlayerDatabaseFiles::PlayerDatabaseFiles(const std::string &savedir) : m_savedir fs::CreateDir(m_savedir); } -void PlayerDatabaseFiles::serialize(std::ostringstream &os, RemotePlayer *player) +void PlayerDatabaseFiles::deSerialize(RemotePlayer *p, std::istream &is, + const std::string &playername, PlayerSAO *sao) +{ + Settings args("PlayerArgsEnd"); + + if (!args.parseConfigLines(is)) { + throw SerializationError("PlayerArgsEnd of player " + playername + " not found!"); + } + + p->m_dirty = true; + //args.getS32("version"); // Version field value not used + const std::string &name = args.get("name"); + strlcpy(p->m_name, name.c_str(), PLAYERNAME_SIZE); + + if (sao) { + try { + sao->setHPRaw(args.getU16("hp")); + } catch(SettingNotFoundException &e) { + sao->setHPRaw(PLAYER_MAX_HP_DEFAULT); + } + + try { + sao->setBasePosition(args.getV3F("position")); + } catch (SettingNotFoundException &e) {} + + try { + sao->setLookPitch(args.getFloat("pitch")); + } catch (SettingNotFoundException &e) {} + try { + sao->setPlayerYaw(args.getFloat("yaw")); + } catch (SettingNotFoundException &e) {} + + try { + sao->setBreath(args.getU16("breath"), false); + } catch (SettingNotFoundException &e) {} + + try { + const std::string &extended_attributes = args.get("extended_attributes"); + std::istringstream iss(extended_attributes); + Json::CharReaderBuilder builder; + builder.settings_["collectComments"] = false; + std::string errs; + + Json::Value attr_root; + Json::parseFromStream(builder, iss, &attr_root, &errs); + + const Json::Value::Members attr_list = attr_root.getMemberNames(); + for (const auto &it : attr_list) { + Json::Value attr_value = attr_root[it]; + sao->getMeta().setString(it, attr_value.asString()); + } + sao->getMeta().setModified(false); + } catch (SettingNotFoundException &e) {} + } + + try { + p->inventory.deSerialize(is); + } catch (SerializationError &e) { + errorstream << "Failed to deserialize player inventory. player_name=" + << name << " " << e.what() << std::endl; + } + + if (!p->inventory.getList("craftpreview") && p->inventory.getList("craftresult")) { + // Convert players without craftpreview + p->inventory.addList("craftpreview", 1); + + bool craftresult_is_preview = true; + if(args.exists("craftresult_is_preview")) + craftresult_is_preview = args.getBool("craftresult_is_preview"); + if(craftresult_is_preview) + { + // Clear craftresult + p->inventory.getList("craftresult")->changeItem(0, ItemStack()); + } + } +} + +void PlayerDatabaseFiles::serialize(RemotePlayer *p, std::ostream &os) { // Utilize a Settings object for storing values - Settings args; + Settings args("PlayerArgsEnd"); args.setS32("version", 1); - args.set("name", player->getName()); + args.set("name", p->m_name); - sanity_check(player->getPlayerSAO()); - args.setU16("hp", player->getPlayerSAO()->getHP()); - args.setV3F("position", player->getPlayerSAO()->getBasePosition()); - args.setFloat("pitch", player->getPlayerSAO()->getLookPitch()); - args.setFloat("yaw", player->getPlayerSAO()->getRotation().Y); - args.setU16("breath", player->getPlayerSAO()->getBreath()); + PlayerSAO *sao = p->getPlayerSAO(); + // This should not happen + sanity_check(sao); + args.setU16("hp", sao->getHP()); + args.setV3F("position", sao->getBasePosition()); + args.setFloat("pitch", sao->getLookPitch()); + args.setFloat("yaw", sao->getRotation().Y); + args.setU16("breath", sao->getBreath()); std::string extended_attrs; - player->serializeExtraAttributes(extended_attrs); + { + // serializeExtraAttributes + Json::Value json_root; + + const StringMap &attrs = sao->getMeta().getStrings(); + for (const auto &attr : attrs) { + json_root[attr.first] = attr.second; + } + + extended_attrs = fastWriteJson(json_root); + } args.set("extended_attributes", extended_attrs); args.writeLines(os); - os << "PlayerArgsEnd\n"; - - player->inventory.serialize(os); + p->inventory.serialize(os); } void PlayerDatabaseFiles::savePlayer(RemotePlayer *player) @@ -83,7 +170,7 @@ void PlayerDatabaseFiles::savePlayer(RemotePlayer *player) return; } - testplayer.deSerialize(is, path, NULL); + deSerialize(&testplayer, is, path, NULL); is.close(); if (strcmp(testplayer.getName(), player->getName()) == 0) { path_found = true; @@ -101,7 +188,7 @@ void PlayerDatabaseFiles::savePlayer(RemotePlayer *player) // Open and serialize file std::ostringstream ss(std::ios_base::binary); - serialize(ss, player); + serialize(player, ss); if (!fs::safeWriteToFile(path, ss.str())) { infostream << "Failed to write " << path << std::endl; } @@ -121,7 +208,7 @@ bool PlayerDatabaseFiles::removePlayer(const std::string &name) if (!is.good()) continue; - temp_player.deSerialize(is, path, NULL); + deSerialize(&temp_player, is, path, NULL); is.close(); if (temp_player.getName() == name) { @@ -147,7 +234,7 @@ bool PlayerDatabaseFiles::loadPlayer(RemotePlayer *player, PlayerSAO *sao) if (!is.good()) continue; - player->deSerialize(is, path, sao); + deSerialize(player, is, path, sao); is.close(); if (player->getName() == player_to_load) @@ -180,7 +267,7 @@ void PlayerDatabaseFiles::listPlayers(std::vector<std::string> &res) // Null env & dummy peer_id PlayerSAO playerSAO(NULL, &player, 15789, false); - player.deSerialize(is, "", &playerSAO); + deSerialize(&player, is, "", &playerSAO); is.close(); res.emplace_back(player.getName()); @@ -288,3 +375,127 @@ bool AuthDatabaseFiles::writeAuthFile() } return true; } + +ModMetadataDatabaseFiles::ModMetadataDatabaseFiles(const std::string &savedir): + m_storage_dir(savedir + DIR_DELIM + "mod_storage") +{ +} + +bool ModMetadataDatabaseFiles::getModEntries(const std::string &modname, StringMap *storage) +{ + Json::Value *meta = getOrCreateJson(modname); + if (!meta) + return false; + + const Json::Value::Members attr_list = meta->getMemberNames(); + for (const auto &it : attr_list) { + Json::Value attr_value = (*meta)[it]; + (*storage)[it] = attr_value.asString(); + } + + return true; +} + +bool ModMetadataDatabaseFiles::setModEntry(const std::string &modname, + const std::string &key, const std::string &value) +{ + Json::Value *meta = getOrCreateJson(modname); + if (!meta) + return false; + + (*meta)[key] = Json::Value(value); + m_modified.insert(modname); + + return true; +} + +bool ModMetadataDatabaseFiles::removeModEntry(const std::string &modname, + const std::string &key) +{ + Json::Value *meta = getOrCreateJson(modname); + if (!meta) + return false; + + Json::Value removed; + if (meta->removeMember(key, &removed)) { + m_modified.insert(modname); + return true; + } + return false; +} + +void ModMetadataDatabaseFiles::beginSave() +{ +} + +void ModMetadataDatabaseFiles::endSave() +{ + if (m_modified.empty()) + return; + + if (!fs::CreateAllDirs(m_storage_dir)) { + errorstream << "ModMetadataDatabaseFiles: Unable to save. '" + << m_storage_dir << "' cannot be created." << std::endl; + return; + } + if (!fs::IsDir(m_storage_dir)) { + errorstream << "ModMetadataDatabaseFiles: Unable to save. '" + << m_storage_dir << "' is not a directory." << std::endl; + return; + } + + for (auto it = m_modified.begin(); it != m_modified.end();) { + const std::string &modname = *it; + + const Json::Value &json = m_mod_meta[modname]; + + if (!fs::safeWriteToFile(m_storage_dir + DIR_DELIM + modname, fastWriteJson(json))) { + errorstream << "ModMetadataDatabaseFiles[" << modname + << "]: failed to write file." << std::endl; + ++it; + continue; + } + + it = m_modified.erase(it); + } +} + +void ModMetadataDatabaseFiles::listMods(std::vector<std::string> *res) +{ + // List in-memory metadata first. + for (const auto &pair : m_mod_meta) { + res->push_back(pair.first); + } + + // List other metadata present in the filesystem. + for (const auto &entry : fs::GetDirListing(m_storage_dir)) { + if (!entry.dir && m_mod_meta.count(entry.name) == 0) + res->push_back(entry.name); + } +} + +Json::Value *ModMetadataDatabaseFiles::getOrCreateJson(const std::string &modname) +{ + auto found = m_mod_meta.find(modname); + if (found != m_mod_meta.end()) + return &found->second; + + Json::Value meta(Json::objectValue); + + std::string path = m_storage_dir + DIR_DELIM + modname; + if (fs::PathExists(path)) { + std::ifstream is(path.c_str(), std::ios_base::binary); + + Json::CharReaderBuilder builder; + builder.settings_["collectComments"] = false; + std::string errs; + + if (!Json::parseFromStream(builder, is, &meta, &errs)) { + errorstream << "ModMetadataDatabaseFiles[" << modname + << "]: failed to decode data: " << errs << std::endl; + return nullptr; + } + } + + return &(m_mod_meta[modname] = meta); +} diff --git a/src/database/database-files.h b/src/database/database-files.h index cb830a3ed..962e4d7bb 100644 --- a/src/database/database-files.h +++ b/src/database/database-files.h @@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "database.h" #include <unordered_map> +#include <unordered_set> +#include <json/json.h> class PlayerDatabaseFiles : public PlayerDatabase { @@ -38,7 +40,14 @@ public: void listPlayers(std::vector<std::string> &res); private: - void serialize(std::ostringstream &os, RemotePlayer *player); + void deSerialize(RemotePlayer *p, std::istream &is, const std::string &playername, + PlayerSAO *sao); + /* + serialize() writes a bunch of text that can contain + any characters except a '\0', and such an ending that + deSerialize stops reading exactly at the right point. + */ + void serialize(RemotePlayer *p, std::ostream &os); std::string m_savedir; }; @@ -62,3 +71,27 @@ private: bool readAuthFile(); bool writeAuthFile(); }; + +class ModMetadataDatabaseFiles : public ModMetadataDatabase +{ +public: + ModMetadataDatabaseFiles(const std::string &savedir); + virtual ~ModMetadataDatabaseFiles() = default; + + virtual bool getModEntries(const std::string &modname, StringMap *storage); + virtual bool setModEntry(const std::string &modname, + const std::string &key, const std::string &value); + virtual bool removeModEntry(const std::string &modname, const std::string &key); + virtual void listMods(std::vector<std::string> *res); + + virtual void beginSave(); + virtual void endSave(); + +private: + Json::Value *getOrCreateJson(const std::string &modname); + bool writeJson(const std::string &modname, const Json::Value &json); + + std::string m_storage_dir; + std::unordered_map<std::string, Json::Value> m_mod_meta; + std::unordered_set<std::string> m_modified; +}; diff --git a/src/database/database-leveldb.cpp b/src/database/database-leveldb.cpp index 1976ae13d..6e59daab3 100644 --- a/src/database/database-leveldb.cpp +++ b/src/database/database-leveldb.cpp @@ -70,11 +70,11 @@ bool Database_LevelDB::saveBlock(const v3s16 &pos, const std::string &data) void Database_LevelDB::loadBlock(const v3s16 &pos, std::string *block) { - std::string datastr; leveldb::Status status = m_database->Get(leveldb::ReadOptions(), - i64tos(getBlockAsInteger(pos)), &datastr); + i64tos(getBlockAsInteger(pos)), block); - *block = (status.ok()) ? datastr : ""; + if (!status.ok()) + block->clear(); } bool Database_LevelDB::deleteBlock(const v3s16 &pos) @@ -131,7 +131,7 @@ void PlayerDatabaseLevelDB::savePlayer(RemotePlayer *player) std::string (long) serialized_inventory */ - std::ostringstream os; + std::ostringstream os(std::ios_base::binary); writeU8(os, 1); PlayerSAO *sao = player->getPlayerSAO(); @@ -142,11 +142,11 @@ void PlayerDatabaseLevelDB::savePlayer(RemotePlayer *player) writeF32(os, sao->getRotation().Y); writeU16(os, sao->getBreath()); - StringMap stringvars = sao->getMeta().getStrings(); + const auto &stringvars = sao->getMeta().getStrings(); writeU32(os, stringvars.size()); for (const auto &it : stringvars) { - os << serializeString(it.first); - os << serializeLongString(it.second); + os << serializeString16(it.first); + os << serializeString32(it.second); } player->inventory.serialize(os); @@ -170,7 +170,7 @@ bool PlayerDatabaseLevelDB::loadPlayer(RemotePlayer *player, PlayerSAO *sao) player->getName(), &raw); if (!s.ok()) return false; - std::istringstream is(raw); + std::istringstream is(raw, std::ios_base::binary); if (readU8(is) > 1) return false; @@ -183,8 +183,8 @@ bool PlayerDatabaseLevelDB::loadPlayer(RemotePlayer *player, PlayerSAO *sao) u32 attribute_count = readU32(is); for (u32 i = 0; i < attribute_count; i++) { - std::string name = deSerializeString(is); - std::string value = deSerializeLongString(is); + std::string name = deSerializeString16(is); + std::string value = deSerializeString32(is); sao->getMeta().setString(name, value); } sao->getMeta().setModified(false); @@ -230,7 +230,7 @@ bool AuthDatabaseLevelDB::getAuth(const std::string &name, AuthEntry &res) leveldb::Status s = m_database->Get(leveldb::ReadOptions(), name, &raw); if (!s.ok()) return false; - std::istringstream is(raw); + std::istringstream is(raw, std::ios_base::binary); /* u8 version = 1 @@ -247,13 +247,13 @@ bool AuthDatabaseLevelDB::getAuth(const std::string &name, AuthEntry &res) res.id = 1; res.name = name; - res.password = deSerializeString(is); + res.password = deSerializeString16(is); u16 privilege_count = readU16(is); res.privileges.clear(); res.privileges.reserve(privilege_count); for (u16 i = 0; i < privilege_count; i++) { - res.privileges.push_back(deSerializeString(is)); + res.privileges.push_back(deSerializeString16(is)); } res.last_login = readS64(is); @@ -262,16 +262,16 @@ bool AuthDatabaseLevelDB::getAuth(const std::string &name, AuthEntry &res) bool AuthDatabaseLevelDB::saveAuth(const AuthEntry &authEntry) { - std::ostringstream os; + std::ostringstream os(std::ios_base::binary); writeU8(os, 1); - os << serializeString(authEntry.password); + os << serializeString16(authEntry.password); size_t privilege_count = authEntry.privileges.size(); FATAL_ERROR_IF(privilege_count > U16_MAX, "Unsupported number of privileges"); writeU16(os, privilege_count); for (const std::string &privilege : authEntry.privileges) { - os << serializeString(privilege); + os << serializeString16(privilege); } writeS64(os, authEntry.last_login); diff --git a/src/database/database-postgresql.cpp b/src/database/database-postgresql.cpp index e1bb39928..9d6501e68 100644 --- a/src/database/database-postgresql.cpp +++ b/src/database/database-postgresql.cpp @@ -39,20 +39,24 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "remoteplayer.h" #include "server/player_sao.h" -Database_PostgreSQL::Database_PostgreSQL(const std::string &connect_string) : +Database_PostgreSQL::Database_PostgreSQL(const std::string &connect_string, + const char *type) : m_connect_string(connect_string) { if (m_connect_string.empty()) { - throw SettingNotFoundException( - "Set pgsql_connection string in world.mt to " + // Use given type to reference the exact setting in the error message + std::string s = type; + std::string msg = + "Set pgsql" + s + "_connection string in world.mt to " "use the postgresql backend\n" "Notes:\n" - "pgsql_connection has the following form: \n" - "\tpgsql_connection = host=127.0.0.1 port=5432 user=mt_user " - "password=mt_password dbname=minetest_world\n" + "pgsql" + s + "_connection has the following form: \n" + "\tpgsql" + s + "_connection = host=127.0.0.1 port=5432 " + "user=mt_user password=mt_password dbname=minetest" + s + "\n" "mt_user should have CREATE TABLE, INSERT, SELECT, UPDATE and " - "DELETE rights on the database.\n" - "Don't create mt_user as a SUPERUSER!"); + "DELETE rights on the database. " + "Don't create mt_user as a SUPERUSER!"; + throw SettingNotFoundException(msg); } } @@ -166,7 +170,7 @@ void Database_PostgreSQL::rollback() } MapDatabasePostgreSQL::MapDatabasePostgreSQL(const std::string &connect_string): - Database_PostgreSQL(connect_string), + Database_PostgreSQL(connect_string, ""), MapDatabase() { connectToDatabase(); @@ -270,10 +274,10 @@ void MapDatabasePostgreSQL::loadBlock(const v3s16 &pos, std::string *block) PGresult *results = execPrepared("read_block", ARRLEN(args), args, argLen, argFmt, false); - *block = ""; - if (PQntuples(results)) - *block = std::string(PQgetvalue(results, 0, 0), PQgetlength(results, 0, 0)); + block->assign(PQgetvalue(results, 0, 0), PQgetlength(results, 0, 0)); + else + block->clear(); PQclear(results); } @@ -315,7 +319,7 @@ void MapDatabasePostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst) * Player Database */ PlayerDatabasePostgreSQL::PlayerDatabasePostgreSQL(const std::string &connect_string): - Database_PostgreSQL(connect_string), + Database_PostgreSQL(connect_string, "_player"), PlayerDatabase() { connectToDatabase(); @@ -491,7 +495,8 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player) execPrepared("remove_player_inventories", 1, rmvalues); execPrepared("remove_player_inventory_items", 1, rmvalues); - std::vector<const InventoryList*> inventory_lists = sao->getInventory()->getLists(); + const auto &inventory_lists = sao->getInventory()->getLists(); + std::ostringstream oss; for (u16 i = 0; i < inventory_lists.size(); i++) { const InventoryList* list = inventory_lists[i]; const std::string &name = list->getName(); @@ -508,9 +513,10 @@ void PlayerDatabasePostgreSQL::savePlayer(RemotePlayer *player) execPrepared("add_player_inventory", 5, inv_values); for (u32 j = 0; j < list->getSize(); j++) { - std::ostringstream os; - list->getItem(j).serialize(os); - std::string itemStr = os.str(), slotId = itos(j); + oss.str(""); + oss.clear(); + list->getItem(j).serialize(oss); + std::string itemStr = oss.str(), slotId = itos(j); const char* invitem_values[] = { player->getName(), @@ -637,7 +643,8 @@ void PlayerDatabasePostgreSQL::listPlayers(std::vector<std::string> &res) } AuthDatabasePostgreSQL::AuthDatabasePostgreSQL(const std::string &connect_string) : - Database_PostgreSQL(connect_string), AuthDatabase() + Database_PostgreSQL(connect_string, "_auth"), + AuthDatabase() { connectToDatabase(); } diff --git a/src/database/database-postgresql.h b/src/database/database-postgresql.h index f47deda33..0a9ead01e 100644 --- a/src/database/database-postgresql.h +++ b/src/database/database-postgresql.h @@ -29,7 +29,7 @@ class Settings; class Database_PostgreSQL: public Database { public: - Database_PostgreSQL(const std::string &connect_string); + Database_PostgreSQL(const std::string &connect_string, const char *type); ~Database_PostgreSQL(); void beginSave(); @@ -94,7 +94,8 @@ protected: checkResults(PQprepare(m_conn, name.c_str(), sql.c_str(), 0, NULL)); } - const int getPGVersion() const { return m_pgversion; } + int getPGVersion() const { return m_pgversion; } + private: // Database connectivity checks void ping(); diff --git a/src/database/database-redis.cpp b/src/database/database-redis.cpp index 096ea504d..5ffff67b7 100644 --- a/src/database/database-redis.cpp +++ b/src/database/database-redis.cpp @@ -127,8 +127,7 @@ void Database_Redis::loadBlock(const v3s16 &pos, std::string *block) switch (reply->type) { case REDIS_REPLY_STRING: { - *block = std::string(reply->str, reply->len); - // std::string copies the memory so this won't cause any problems + block->assign(reply->str, reply->len); freeReplyObject(reply); return; } @@ -141,8 +140,7 @@ void Database_Redis::loadBlock(const v3s16 &pos, std::string *block) "Redis command 'HGET %s %s' errored: ") + errstr); } case REDIS_REPLY_NIL: { - *block = ""; - // block not found in database + block->clear(); freeReplyObject(reply); return; } diff --git a/src/database/database-sqlite3.cpp b/src/database/database-sqlite3.cpp index 4560743b9..9521085e9 100644 --- a/src/database/database-sqlite3.cpp +++ b/src/database/database-sqlite3.cpp @@ -228,11 +228,7 @@ void MapDatabaseSQLite3::createDatabase() void MapDatabaseSQLite3::initStatements() { PREPARE_STATEMENT(read, "SELECT `data` FROM `blocks` WHERE `pos` = ? LIMIT 1"); -#ifdef __ANDROID__ - PREPARE_STATEMENT(write, "INSERT INTO `blocks` (`pos`, `data`) VALUES (?, ?)"); -#else PREPARE_STATEMENT(write, "REPLACE INTO `blocks` (`pos`, `data`) VALUES (?, ?)"); -#endif PREPARE_STATEMENT(delete, "DELETE FROM `blocks` WHERE `pos` = ?"); PREPARE_STATEMENT(list, "SELECT `pos` FROM `blocks`"); @@ -265,19 +261,6 @@ bool MapDatabaseSQLite3::saveBlock(const v3s16 &pos, const std::string &data) { verifyDatabase(); -#ifdef __ANDROID__ - /** - * Note: For some unknown reason SQLite3 fails to REPLACE blocks on Android, - * deleting them and then inserting works. - */ - bindPos(m_stmt_read, pos); - - if (sqlite3_step(m_stmt_read) == SQLITE_ROW) { - deleteBlock(pos); - } - sqlite3_reset(m_stmt_read); -#endif - bindPos(m_stmt_write, pos); SQLOK(sqlite3_bind_blob(m_stmt_write, 2, data.data(), data.size(), NULL), "Internal error: failed to bind query at " __FILE__ ":" TOSTRING(__LINE__)); @@ -302,7 +285,10 @@ void MapDatabaseSQLite3::loadBlock(const v3s16 &pos, std::string *block) const char *data = (const char *) sqlite3_column_blob(m_stmt_read, 0); size_t len = sqlite3_column_bytes(m_stmt_read, 0); - *block = (data) ? std::string(data, len) : ""; + if (data) + block->assign(data, len); + else + block->clear(); sqlite3_step(m_stmt_read); // We should never get more than 1 row, so ok to reset @@ -490,9 +476,10 @@ void PlayerDatabaseSQLite3::savePlayer(RemotePlayer *player) sqlite3_vrfy(sqlite3_step(m_stmt_player_remove_inventory_items), SQLITE_DONE); sqlite3_reset(m_stmt_player_remove_inventory_items); - std::vector<const InventoryList*> inventory_lists = sao->getInventory()->getLists(); + const auto &inventory_lists = sao->getInventory()->getLists(); + std::ostringstream oss; for (u16 i = 0; i < inventory_lists.size(); i++) { - const InventoryList* list = inventory_lists[i]; + const InventoryList *list = inventory_lists[i]; str_to_sqlite(m_stmt_player_add_inventory, 1, player->getName()); int_to_sqlite(m_stmt_player_add_inventory, 2, i); @@ -503,9 +490,10 @@ void PlayerDatabaseSQLite3::savePlayer(RemotePlayer *player) sqlite3_reset(m_stmt_player_add_inventory); for (u32 j = 0; j < list->getSize(); j++) { - std::ostringstream os; - list->getItem(j).serialize(os); - std::string itemStr = os.str(); + oss.str(""); + oss.clear(); + list->getItem(j).serialize(oss); + std::string itemStr = oss.str(); str_to_sqlite(m_stmt_player_add_inventory_items, 1, player->getName()); int_to_sqlite(m_stmt_player_add_inventory_items, 2, i); @@ -774,3 +762,108 @@ void AuthDatabaseSQLite3::writePrivileges(const AuthEntry &authEntry) sqlite3_reset(m_stmt_write_privs); } } + +ModMetadataDatabaseSQLite3::ModMetadataDatabaseSQLite3(const std::string &savedir): + Database_SQLite3(savedir, "mod_storage"), ModMetadataDatabase() +{ +} + +ModMetadataDatabaseSQLite3::~ModMetadataDatabaseSQLite3() +{ + FINALIZE_STATEMENT(m_stmt_remove) + FINALIZE_STATEMENT(m_stmt_set) + FINALIZE_STATEMENT(m_stmt_get) +} + +void ModMetadataDatabaseSQLite3::createDatabase() +{ + assert(m_database); // Pre-condition + + SQLOK(sqlite3_exec(m_database, + "CREATE TABLE IF NOT EXISTS `entries` (\n" + " `modname` TEXT NOT NULL,\n" + " `key` BLOB NOT NULL,\n" + " `value` BLOB NOT NULL,\n" + " PRIMARY KEY (`modname`, `key`)\n" + ");\n", + NULL, NULL, NULL), + "Failed to create database table"); +} + +void ModMetadataDatabaseSQLite3::initStatements() +{ + PREPARE_STATEMENT(get, "SELECT `key`, `value` FROM `entries` WHERE `modname` = ?"); + PREPARE_STATEMENT(set, + "REPLACE INTO `entries` (`modname`, `key`, `value`) VALUES (?, ?, ?)"); + PREPARE_STATEMENT(remove, "DELETE FROM `entries` WHERE `modname` = ? AND `key` = ?"); +} + +bool ModMetadataDatabaseSQLite3::getModEntries(const std::string &modname, StringMap *storage) +{ + verifyDatabase(); + + str_to_sqlite(m_stmt_get, 1, modname); + while (sqlite3_step(m_stmt_get) == SQLITE_ROW) { + const char *key_data = (const char *) sqlite3_column_blob(m_stmt_get, 0); + size_t key_len = sqlite3_column_bytes(m_stmt_get, 0); + const char *value_data = (const char *) sqlite3_column_blob(m_stmt_get, 1); + size_t value_len = sqlite3_column_bytes(m_stmt_get, 1); + (*storage)[std::string(key_data, key_len)] = std::string(value_data, value_len); + } + sqlite3_vrfy(sqlite3_errcode(m_database), SQLITE_DONE); + + sqlite3_reset(m_stmt_get); + + return true; +} + +bool ModMetadataDatabaseSQLite3::setModEntry(const std::string &modname, + const std::string &key, const std::string &value) +{ + verifyDatabase(); + + str_to_sqlite(m_stmt_set, 1, modname); + SQLOK(sqlite3_bind_blob(m_stmt_set, 2, key.data(), key.size(), NULL), + "Internal error: failed to bind query at " __FILE__ ":" TOSTRING(__LINE__)); + SQLOK(sqlite3_bind_blob(m_stmt_set, 3, value.data(), value.size(), NULL), + "Internal error: failed to bind query at " __FILE__ ":" TOSTRING(__LINE__)); + SQLRES(sqlite3_step(m_stmt_set), SQLITE_DONE, "Failed to set mod entry") + + sqlite3_reset(m_stmt_set); + + return true; +} + +bool ModMetadataDatabaseSQLite3::removeModEntry(const std::string &modname, + const std::string &key) +{ + verifyDatabase(); + + str_to_sqlite(m_stmt_remove, 1, modname); + SQLOK(sqlite3_bind_blob(m_stmt_remove, 2, key.data(), key.size(), NULL), + "Internal error: failed to bind query at " __FILE__ ":" TOSTRING(__LINE__)); + sqlite3_vrfy(sqlite3_step(m_stmt_remove), SQLITE_DONE); + int changes = sqlite3_changes(m_database); + + sqlite3_reset(m_stmt_remove); + + return changes > 0; +} + +void ModMetadataDatabaseSQLite3::listMods(std::vector<std::string> *res) +{ + verifyDatabase(); + + char *errmsg; + int status = sqlite3_exec(m_database, + "SELECT `modname` FROM `entries` GROUP BY `modname`;", + [](void *res_vp, int n_col, char **cols, char **col_names) -> int { + ((decltype(res)) res_vp)->emplace_back(cols[0]); + return 0; + }, (void *) res, &errmsg); + if (status != SQLITE_OK) { + DatabaseException e(std::string("Error trying to list mods with metadata: ") + errmsg); + sqlite3_free(errmsg); + throw e; + } +} diff --git a/src/database/database-sqlite3.h b/src/database/database-sqlite3.h index d7202a918..5e3d7c96c 100644 --- a/src/database/database-sqlite3.h +++ b/src/database/database-sqlite3.h @@ -232,3 +232,28 @@ private: sqlite3_stmt *m_stmt_delete_privs = nullptr; sqlite3_stmt *m_stmt_last_insert_rowid = nullptr; }; + +class ModMetadataDatabaseSQLite3 : private Database_SQLite3, public ModMetadataDatabase +{ +public: + ModMetadataDatabaseSQLite3(const std::string &savedir); + virtual ~ModMetadataDatabaseSQLite3(); + + virtual bool getModEntries(const std::string &modname, StringMap *storage); + virtual bool setModEntry(const std::string &modname, + const std::string &key, const std::string &value); + virtual bool removeModEntry(const std::string &modname, const std::string &key); + virtual void listMods(std::vector<std::string> *res); + + virtual void beginSave() { Database_SQLite3::beginSave(); } + virtual void endSave() { Database_SQLite3::endSave(); } + +protected: + virtual void createDatabase(); + virtual void initStatements(); + +private: + sqlite3_stmt *m_stmt_get = nullptr; + sqlite3_stmt *m_stmt_set = nullptr; + sqlite3_stmt *m_stmt_remove = nullptr; +}; diff --git a/src/database/database.h b/src/database/database.h index b7d551935..fbb5befea 100644 --- a/src/database/database.h +++ b/src/database/database.h @@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irr_v3d.h" #include "irrlichttypes.h" #include "util/basic_macros.h" +#include "util/string.h" class Database { @@ -84,3 +85,15 @@ public: virtual void listNames(std::vector<std::string> &res) = 0; virtual void reload() = 0; }; + +class ModMetadataDatabase : public Database +{ +public: + virtual ~ModMetadataDatabase() = default; + + virtual bool getModEntries(const std::string &modname, StringMap *storage) = 0; + virtual bool setModEntry(const std::string &modname, + const std::string &key, const std::string &value) = 0; + virtual bool removeModEntry(const std::string &modname, const std::string &key) = 0; + virtual void listMods(std::vector<std::string> *res) = 0; +}; diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 3a0b88dc2..f96149070 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -27,8 +27,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen/mapgen.h" // Mapgen::setDefaultSettings #include "util/string.h" -void set_default_settings(Settings *settings) +void set_default_settings() { + Settings *settings = Settings::createLayer(SL_DEFAULTS); + // Client and server settings->setDefault("language", ""); settings->setDefault("name", ""); @@ -52,9 +54,9 @@ void set_default_settings(Settings *settings) settings->setDefault("screenshot_format", "png"); settings->setDefault("screenshot_quality", "0"); settings->setDefault("client_unload_unused_data_timeout", "600"); - settings->setDefault("client_mapblock_limit", "5000"); + settings->setDefault("client_mapblock_limit", "7500"); settings->setDefault("enable_build_where_you_stand", "false"); - settings->setDefault("curl_timeout", "5000"); + settings->setDefault("curl_timeout", "20000"); settings->setDefault("curl_parallel_limit", "8"); settings->setDefault("curl_file_download_timeout", "300000"); settings->setDefault("curl_verify_cert", "true"); @@ -62,7 +64,8 @@ void set_default_settings(Settings *settings) settings->setDefault("enable_client_modding", "false"); settings->setDefault("max_out_chat_queue_size", "20"); settings->setDefault("pause_on_lost_focus", "false"); - settings->setDefault("enable_register_confirmation", "true"); + settings->setDefault("enable_split_login_register", "true"); + settings->setDefault("chat_weblink_color", "#8888FF"); // Keymap settings->setDefault("remote_port", "30000"); @@ -78,13 +81,13 @@ void set_default_settings(Settings *settings) settings->setDefault("keymap_drop", "KEY_KEY_Q"); settings->setDefault("keymap_zoom", "KEY_KEY_Z"); settings->setDefault("keymap_inventory", "KEY_KEY_I"); - settings->setDefault("keymap_special1", "KEY_KEY_E"); + settings->setDefault("keymap_aux1", "KEY_KEY_E"); settings->setDefault("keymap_chat", "KEY_KEY_T"); settings->setDefault("keymap_cmd", "/"); settings->setDefault("keymap_cmd_local", "."); settings->setDefault("keymap_minimap", "KEY_KEY_V"); settings->setDefault("keymap_console", "KEY_F10"); - settings->setDefault("keymap_rangeselect", "KEY_KEY_R"); + settings->setDefault("keymap_rangeselect", ""); settings->setDefault("keymap_freemove", "KEY_KEY_K"); settings->setDefault("keymap_pitchmove", "KEY_KEY_P"); settings->setDefault("keymap_fastmove", "KEY_KEY_J"); @@ -95,6 +98,7 @@ void set_default_settings(Settings *settings) settings->setDefault("keymap_increase_volume", ""); settings->setDefault("keymap_decrease_volume", ""); settings->setDefault("keymap_cinematic", ""); + settings->setDefault("keymap_toggle_block_bounds", ""); settings->setDefault("keymap_toggle_hud", "KEY_F1"); settings->setDefault("keymap_toggle_chat", "KEY_F2"); settings->setDefault("keymap_toggle_fog", "KEY_F3"); @@ -165,8 +169,8 @@ void set_default_settings(Settings *settings) settings->setDefault("tooltip_show_delay", "400"); settings->setDefault("tooltip_append_itemname", "false"); settings->setDefault("fps_max", "60"); - settings->setDefault("pause_fps_max", "20"); - settings->setDefault("viewing_range", "100"); + settings->setDefault("fps_max_unfocused", "20"); + settings->setDefault("viewing_range", "190"); #if ENABLE_GLES settings->setDefault("near_plane", "0.1"); #endif @@ -174,12 +178,12 @@ void set_default_settings(Settings *settings) settings->setDefault("screen_h", "600"); settings->setDefault("autosave_screensize", "true"); settings->setDefault("fullscreen", "false"); - settings->setDefault("fullscreen_bpp", "24"); settings->setDefault("vsync", "false"); settings->setDefault("fov", "72"); settings->setDefault("leaves_style", "fancy"); settings->setDefault("connected_glass", "false"); settings->setDefault("smooth_lighting", "true"); + settings->setDefault("performance_tradeoffs", "false"); settings->setDefault("lighting_alpha", "0.0"); settings->setDefault("lighting_beta", "1.5"); settings->setDefault("display_gamma", "1.0"); @@ -238,6 +242,8 @@ void set_default_settings(Settings *settings) #endif settings->setDefault("enable_particles", "true"); settings->setDefault("arm_inertia", "true"); + settings->setDefault("show_nametag_backgrounds", "true"); + settings->setDefault("transparency_sorting_distance", "16"); settings->setDefault("enable_minimap", "true"); settings->setDefault("minimap_shape_round", "true"); @@ -251,12 +257,6 @@ void set_default_settings(Settings *settings) settings->setDefault("bilinear_filter", "false"); settings->setDefault("trilinear_filter", "false"); settings->setDefault("tone_mapping", "false"); - settings->setDefault("enable_bumpmapping", "false"); - settings->setDefault("enable_parallax_occlusion", "false"); - settings->setDefault("parallax_occlusion_mode", "1"); - settings->setDefault("parallax_occlusion_iterations", "4"); - settings->setDefault("parallax_occlusion_scale", "0.08"); - settings->setDefault("parallax_occlusion_bias", "0.04"); settings->setDefault("enable_waving_water", "false"); settings->setDefault("water_wave_height", "1.0"); settings->setDefault("water_wave_length", "20.0"); @@ -264,6 +264,18 @@ void set_default_settings(Settings *settings) settings->setDefault("enable_waving_leaves", "false"); settings->setDefault("enable_waving_plants", "false"); + // Effects Shadows + settings->setDefault("enable_dynamic_shadows", "false"); + settings->setDefault("shadow_strength_gamma", "1.0"); + settings->setDefault("shadow_map_max_distance", "200.0"); + settings->setDefault("shadow_map_texture_size", "2048"); + settings->setDefault("shadow_map_texture_32bit", "true"); + settings->setDefault("shadow_map_color", "false"); + settings->setDefault("shadow_filters", "1"); + settings->setDefault("shadow_poisson_filter", "true"); + settings->setDefault("shadow_update_frames", "8"); + settings->setDefault("shadow_soft_radius", "5.0"); + settings->setDefault("shadow_sky_body_orbit_tilt", "0.0"); // Input settings->setDefault("invert_mouse", "false"); @@ -274,7 +286,7 @@ void set_default_settings(Settings *settings) settings->setDefault("aux1_descends", "false"); settings->setDefault("doubletap_jump", "false"); settings->setDefault("always_fly_fast", "true"); -#ifdef __ANDROID__ +#ifdef HAVE_TOUCHSCREENGUI settings->setDefault("autojump", "true"); #else settings->setDefault("autojump", "false"); @@ -285,13 +297,13 @@ void set_default_settings(Settings *settings) settings->setDefault("joystick_type", ""); settings->setDefault("repeat_joystick_button_time", "0.17"); settings->setDefault("joystick_frustum_sensitivity", "170"); + settings->setDefault("joystick_deadzone", "2048"); // Main menu settings->setDefault("main_menu_path", ""); - settings->setDefault("serverlist_file", "favoriteservers.txt"); + settings->setDefault("serverlist_file", "favoriteservers.json"); -#if USE_FREETYPE - settings->setDefault("freetype", "true"); + // General font settings settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "Arimo-Regular.ttf")); settings->setDefault("font_path_italic", porting::getDataPath("fonts" DIR_DELIM "Arimo-Italic.ttf")); settings->setDefault("font_path_bold", porting::getDataPath("fonts" DIR_DELIM "Arimo-Bold.ttf")); @@ -300,26 +312,15 @@ void set_default_settings(Settings *settings) settings->setDefault("font_italic", "false"); settings->setDefault("font_shadow", "1"); settings->setDefault("font_shadow_alpha", "127"); + settings->setDefault("font_size_divisible_by", "1"); settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "Cousine-Regular.ttf")); settings->setDefault("mono_font_path_italic", porting::getDataPath("fonts" DIR_DELIM "Cousine-Italic.ttf")); settings->setDefault("mono_font_path_bold", porting::getDataPath("fonts" DIR_DELIM "Cousine-Bold.ttf")); settings->setDefault("mono_font_path_bold_italic", porting::getDataPath("fonts" DIR_DELIM "Cousine-BoldItalic.ttf")); + settings->setDefault("mono_font_size_divisible_by", "1"); settings->setDefault("fallback_font_path", porting::getDataPath("fonts" DIR_DELIM "DroidSansFallbackFull.ttf")); - settings->setDefault("fallback_font_shadow", "1"); - settings->setDefault("fallback_font_shadow_alpha", "128"); - std::string font_size_str = std::to_string(TTF_DEFAULT_FONT_SIZE); - - settings->setDefault("fallback_font_size", font_size_str); -#else - settings->setDefault("freetype", "false"); - settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "mono_dejavu_sans")); - settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "mono_dejavu_sans")); - - std::string font_size_str = std::to_string(DEFAULT_FONT_SIZE); -#endif - // General font settings settings->setDefault("font_size", font_size_str); settings->setDefault("mono_font_size", font_size_str); settings->setDefault("chat_font_size", "0"); // Default "font_size" @@ -334,6 +335,12 @@ void set_default_settings(Settings *settings) settings->setDefault("contentdb_flag_blacklist", "nonfree, desktop_default"); #endif + settings->setDefault("update_information_url", "https://www.minetest.net/release_info.json"); +#if ENABLE_UPDATE_CHECKER + settings->setDefault("update_last_checked", ""); +#else + settings->setDefault("update_last_checked", "disabled"); +#endif // Server settings->setDefault("disable_escape_sequences", "false"); @@ -364,11 +371,7 @@ void set_default_settings(Settings *settings) settings->setDefault("disallow_empty_password", "false"); settings->setDefault("disable_anticheat", "false"); settings->setDefault("enable_rollback_recording", "false"); -#ifdef NDEBUG - settings->setDefault("deprecated_lua_api_handling", "legacy"); -#else settings->setDefault("deprecated_lua_api_handling", "log"); -#endif settings->setDefault("kick_msg_shutdown", "Server shutting down."); settings->setDefault("kick_msg_crash", "This server has experienced an internal error. You will now be disconnected."); @@ -376,11 +379,11 @@ void set_default_settings(Settings *settings) settings->setDefault("chat_message_format", "<@name> @message"); settings->setDefault("profiler_print_interval", "0"); - settings->setDefault("active_object_send_range_blocks", "4"); - settings->setDefault("active_block_range", "3"); + settings->setDefault("active_object_send_range_blocks", "8"); + settings->setDefault("active_block_range", "4"); //settings->setDefault("max_simultaneous_block_sends_per_client", "1"); // This causes frametime jitter on client side, or does it? - settings->setDefault("max_block_send_distance", "10"); + settings->setDefault("max_block_send_distance", "12"); settings->setDefault("block_send_optimize_distance", "4"); settings->setDefault("server_side_occlusion_culling", "true"); settings->setDefault("csm_restriction_flags", "62"); @@ -389,12 +392,14 @@ void set_default_settings(Settings *settings) settings->setDefault("time_speed", "72"); settings->setDefault("world_start_time", "6125"); settings->setDefault("server_unload_unused_data_timeout", "29"); - settings->setDefault("max_objects_per_block", "64"); + settings->setDefault("max_objects_per_block", "256"); settings->setDefault("server_map_save_interval", "5.3"); settings->setDefault("chat_message_max_size", "500"); settings->setDefault("chat_message_limit_per_10sec", "8.0"); settings->setDefault("chat_message_limit_trigger_kick", "50"); settings->setDefault("sqlite_synchronous", "2"); + settings->setDefault("map_compression_level_disk", "-1"); + settings->setDefault("map_compression_level_net", "-1"); settings->setDefault("full_block_send_enable_min_time_from_building", "2.0"); settings->setDefault("dedicated_server_step", "0.09"); settings->setDefault("active_block_mgmt_interval", "2.0"); @@ -406,9 +411,9 @@ void set_default_settings(Settings *settings) settings->setDefault("debug_log_level", "action"); settings->setDefault("debug_log_size_max", "50"); settings->setDefault("chat_log_level", "error"); - settings->setDefault("emergequeue_limit_total", "512"); - settings->setDefault("emergequeue_limit_diskonly", "64"); - settings->setDefault("emergequeue_limit_generate", "64"); + settings->setDefault("emergequeue_limit_total", "1024"); + settings->setDefault("emergequeue_limit_diskonly", "128"); + settings->setDefault("emergequeue_limit_generate", "128"); settings->setDefault("num_emerge_threads", "1"); settings->setDefault("secure.enable_security", "true"); settings->setDefault("secure.trusted_mods", ""); @@ -436,10 +441,10 @@ void set_default_settings(Settings *settings) // Mapgen settings->setDefault("mg_name", "v7"); settings->setDefault("water_level", "1"); - settings->setDefault("mapgen_limit", "31000"); + settings->setDefault("mapgen_limit", "31007"); settings->setDefault("chunksize", "5"); settings->setDefault("fixed_map_seed", ""); - settings->setDefault("max_block_generate_distance", "8"); + settings->setDefault("max_block_generate_distance", "10"); settings->setDefault("enable_mapgen_debug_info", "false"); Mapgen::setDefaultSettings(settings); @@ -450,36 +455,40 @@ void set_default_settings(Settings *settings) settings->setDefault("server_name", ""); settings->setDefault("server_description", ""); - settings->setDefault("high_precision_fpu", "true"); settings->setDefault("enable_console", "false"); settings->setDefault("screen_dpi", "72"); + settings->setDefault("display_density_factor", "1"); // Altered settings for macOS #if defined(__MACH__) && defined(__APPLE__) settings->setDefault("keymap_sneak", "KEY_SHIFT"); - settings->setDefault("fps_max", "0"); #endif +#ifdef HAVE_TOUCHSCREENGUI + settings->setDefault("touchtarget", "true"); + settings->setDefault("touchscreen_threshold","20"); + settings->setDefault("fixed_virtual_joystick", "false"); + settings->setDefault("virtual_joystick_triggers_aux1", "false"); + settings->setDefault("clickable_chat_weblinks", "false"); +#else + settings->setDefault("clickable_chat_weblinks", "true"); +#endif // Altered settings for Android #ifdef __ANDROID__ settings->setDefault("screen_w", "0"); settings->setDefault("screen_h", "0"); settings->setDefault("fullscreen", "true"); - settings->setDefault("touchtarget", "true"); - settings->setDefault("TMPFolder", porting::path_cache); - settings->setDefault("touchscreen_threshold","20"); - settings->setDefault("fixed_virtual_joystick", "false"); - settings->setDefault("virtual_joystick_triggers_aux", "false"); settings->setDefault("smooth_lighting", "false"); + settings->setDefault("performance_tradeoffs", "true"); settings->setDefault("max_simultaneous_block_sends_per_client", "10"); settings->setDefault("emergequeue_limit_diskonly", "16"); settings->setDefault("emergequeue_limit_generate", "16"); settings->setDefault("max_block_generate_distance", "5"); settings->setDefault("enable_3d_clouds", "false"); - settings->setDefault("fps_max", "30"); - settings->setDefault("pause_fps_max", "10"); - settings->setDefault("max_objects_per_block", "20"); + settings->setDefault("fps_max_unfocused", "10"); settings->setDefault("sqlite_synchronous", "1"); + settings->setDefault("map_compression_level_disk", "-1"); + settings->setDefault("map_compression_level_net", "-1"); settings->setDefault("server_map_save_interval", "15"); settings->setDefault("client_mapblock_limit", "1000"); settings->setDefault("active_block_range", "2"); diff --git a/src/defaultsettings.h b/src/defaultsettings.h index c81e88502..c239b3c12 100644 --- a/src/defaultsettings.h +++ b/src/defaultsettings.h @@ -25,11 +25,4 @@ class Settings; * initialize basic default settings * @param settings pointer to settings */ -void set_default_settings(Settings *settings); - -/** - * override a default settings by settings from another settings element - * @param settings target settings pointer - * @param from source settings pointer - */ -void override_default_settings(Settings *settings, Settings *from); +void set_default_settings(); diff --git a/src/emerge.cpp b/src/emerge.cpp index 0ac26a682..3e42742f6 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -61,7 +61,9 @@ public: void cancelPendingItems(); - static void runCompletionCallbacks( +protected: + + void runCompletionCallbacks( const v3s16 &pos, EmergeAction action, const EmergeCallbackList &callbacks); @@ -113,13 +115,15 @@ EmergeParams::~EmergeParams() { infostream << "EmergeParams: destroying " << this << std::endl; // Delete everything that was cloned on creation of EmergeParams + delete biomegen; delete biomemgr; delete oremgr; delete decomgr; delete schemmgr; } -EmergeParams::EmergeParams(EmergeManager *parent, const BiomeManager *biomemgr, +EmergeParams::EmergeParams(EmergeManager *parent, const BiomeGen *biomegen, + const BiomeManager *biomemgr, const OreManager *oremgr, const DecorationManager *decomgr, const SchematicManager *schemmgr) : ndef(parent->ndef), @@ -129,13 +133,14 @@ EmergeParams::EmergeParams(EmergeManager *parent, const BiomeManager *biomemgr, biomemgr(biomemgr->clone()), oremgr(oremgr->clone()), decomgr(decomgr->clone()), schemmgr(schemmgr->clone()) { + this->biomegen = biomegen->clone(this->biomemgr); } //// //// EmergeManager //// -EmergeManager::EmergeManager(Server *server) +EmergeManager::EmergeManager(Server *server, MetricsBackend *mb) { this->ndef = server->getNodeDefManager(); this->biomemgr = new BiomeManager(server); @@ -143,35 +148,47 @@ EmergeManager::EmergeManager(Server *server) this->decomgr = new DecorationManager(server); this->schemmgr = new SchematicManager(server); + // initialized later + this->mgparams = nullptr; + this->biomegen = nullptr; + // Note that accesses to this variable are not synchronized. // This is because the *only* thread ever starting or stopping // EmergeThreads should be the ServerThread. enable_mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info"); + STATIC_ASSERT(ARRLEN(emergeActionStrs) == ARRLEN(m_completed_emerge_counter), + enum_size_mismatches); + for (u32 i = 0; i < ARRLEN(m_completed_emerge_counter); i++) { + std::string help_str("Number of completed emerges with status "); + help_str.append(emergeActionStrs[i]); + m_completed_emerge_counter[i] = mb->addCounter( + "minetest_emerge_completed", help_str, + {{"status", emergeActionStrs[i]}} + ); + } + s16 nthreads = 1; g_settings->getS16NoEx("num_emerge_threads", nthreads); // If automatic, leave a proc for the main thread and one for // some other misc thread - if (nthreads == 0) + if (nthreads <= 0) nthreads = Thread::getNumberOfProcessors() - 2; if (nthreads < 1) nthreads = 1; - m_qlimit_total = g_settings->getU16("emergequeue_limit_total"); + m_qlimit_total = g_settings->getU32("emergequeue_limit_total"); // FIXME: these fallback values are probably not good - if (!g_settings->getU16NoEx("emergequeue_limit_diskonly", m_qlimit_diskonly)) + if (!g_settings->getU32NoEx("emergequeue_limit_diskonly", m_qlimit_diskonly)) m_qlimit_diskonly = nthreads * 5 + 1; - if (!g_settings->getU16NoEx("emergequeue_limit_generate", m_qlimit_generate)) + if (!g_settings->getU32NoEx("emergequeue_limit_generate", m_qlimit_generate)) m_qlimit_generate = nthreads + 1; // don't trust user input for something very important like this - if (m_qlimit_total < 1) - m_qlimit_total = 1; - if (m_qlimit_diskonly < 1) - m_qlimit_diskonly = 1; - if (m_qlimit_generate < 1) - m_qlimit_generate = 1; + m_qlimit_total = rangelim(m_qlimit_total, 1, 1000000); + m_qlimit_diskonly = rangelim(m_qlimit_diskonly, 1, 1000000); + m_qlimit_generate = rangelim(m_qlimit_generate, 1, 1000000); for (s16 i = 0; i < nthreads; i++) m_threads.push_back(new EmergeThread(server, i)); @@ -198,6 +215,7 @@ EmergeManager::~EmergeManager() delete m_mapgens[i]; } + delete biomegen; delete biomemgr; delete oremgr; delete decomgr; @@ -240,9 +258,12 @@ void EmergeManager::initMapgens(MapgenParams *params) mgparams = params; + v3s16 csize = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE); + biomegen = biomemgr->createBiomeGen(BIOMEGEN_ORIGINAL, params->bparams, csize); + for (u32 i = 0; i != m_threads.size(); i++) { - EmergeParams *p = new EmergeParams( - this, biomemgr, oremgr, decomgr, schemmgr); + EmergeParams *p = new EmergeParams(this, biomegen, + biomemgr, oremgr, decomgr, schemmgr); infostream << "EmergeManager: Created params " << p << " for thread " << i << std::endl; m_mapgens.push_back(Mapgen::createMapgen(params->mgtype, params, p)); @@ -348,17 +369,18 @@ bool EmergeManager::enqueueBlockEmergeEx( } +bool EmergeManager::isBlockInQueue(v3s16 pos) +{ + MutexAutoLock queuelock(m_queue_mutex); + return m_blocks_enqueued.find(pos) != m_blocks_enqueued.end(); +} + + // // Mapgen-related helper functions // -// TODO(hmmmm): Move this to ServerMap -v3s16 EmergeManager::getContainingChunk(v3s16 blockpos) -{ - return getContainingChunk(blockpos, mgparams->chunksize); -} - // TODO(hmmmm): Move this to ServerMap v3s16 EmergeManager::getContainingChunk(v3s16 blockpos, s16 chunksize) { @@ -382,28 +404,10 @@ int EmergeManager::getSpawnLevelAtPoint(v2s16 p) } -int EmergeManager::getGroundLevelAtPoint(v2s16 p) -{ - if (m_mapgens.empty() || !m_mapgens[0]) { - errorstream << "EmergeManager: getGroundLevelAtPoint() called" - " before mapgen init" << std::endl; - return 0; - } - - return m_mapgens[0]->getGroundLevelAtPoint(p); -} - // TODO(hmmmm): Move this to ServerMap bool EmergeManager::isBlockUnderground(v3s16 blockpos) { -#if 0 - v2s16 p = v2s16((blockpos.X * MAP_BLOCKSIZE) + MAP_BLOCKSIZE / 2, - (blockpos.Y * MAP_BLOCKSIZE) + MAP_BLOCKSIZE / 2); - int ground_level = getGroundLevelAtPoint(p); - return blockpos.Y * (MAP_BLOCKSIZE + 1) <= min(water_level, ground_level); -#endif - - // Use a simple heuristic; the above method is wildly inaccurate anyway. + // Use a simple heuristic return blockpos.Y * (MAP_BLOCKSIZE + 1) <= mgparams->water_level; } @@ -415,17 +419,21 @@ bool EmergeManager::pushBlockEmergeData( void *callback_param, bool *entry_already_exists) { - u16 &count_peer = m_peer_queue_count[peer_requested]; + u32 &count_peer = m_peer_queue_count[peer_requested]; if ((flags & BLOCK_EMERGE_FORCE_QUEUE) == 0) { if (m_blocks_enqueued.size() >= m_qlimit_total) return false; if (peer_requested != PEER_ID_INEXISTENT) { - u16 qlimit_peer = (flags & BLOCK_EMERGE_ALLOW_GEN) ? + u32 qlimit_peer = (flags & BLOCK_EMERGE_ALLOW_GEN) ? m_qlimit_generate : m_qlimit_diskonly; if (count_peer >= qlimit_peer) return false; + } else { + // limit block enqueue requests for active blocks to 1/2 of total + if (count_peer * 2 >= m_qlimit_total) + return false; } } @@ -453,20 +461,18 @@ bool EmergeManager::pushBlockEmergeData( bool EmergeManager::popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata) { - std::map<v3s16, BlockEmergeData>::iterator it; - std::unordered_map<u16, u16>::iterator it2; - - it = m_blocks_enqueued.find(pos); + auto it = m_blocks_enqueued.find(pos); if (it == m_blocks_enqueued.end()) return false; *bedata = it->second; - it2 = m_peer_queue_count.find(bedata->peer_requested); + auto it2 = m_peer_queue_count.find(bedata->peer_requested); if (it2 == m_peer_queue_count.end()) return false; - u16 &count_peer = it2->second; + u32 &count_peer = it2->second; + assert(count_peer != 0); count_peer--; @@ -496,6 +502,12 @@ EmergeThread *EmergeManager::getOptimalThread() return m_threads[index]; } +void EmergeManager::reportCompletedEmerge(EmergeAction action) +{ + assert((size_t)action < ARRLEN(m_completed_emerge_counter)); + m_completed_emerge_counter[(int)action]->increment(); +} + //// //// EmergeThread @@ -547,6 +559,8 @@ void EmergeThread::cancelPendingItems() void EmergeThread::runCompletionCallbacks(const v3s16 &pos, EmergeAction action, const EmergeCallbackList &callbacks) { + m_emerge->reportCompletedEmerge(action); + for (size_t i = 0; i != callbacks.size(); i++) { EmergeCompletionCallback callback; void *param; @@ -638,16 +652,18 @@ MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata, m_server->getScriptIface()->environment_OnGenerated( minp, maxp, m_mapgen->blockseed); } catch (LuaError &e) { - m_server->setAsyncFatalError("Lua: finishGen" + std::string(e.what())); + m_server->setAsyncFatalError(e); } - /* - Clear generate notifier events - */ - m_mapgen->gennotify.clearEvents(); - EMERGE_DBG_OUT("ended up with: " << analyze_block(block)); + /* + Clear mapgen state + */ + assert(!m_mapgen->generating); + m_mapgen->gennotify.clearEvents(); + m_mapgen->vm = nullptr; + /* Activate the block */ @@ -662,19 +678,19 @@ void *EmergeThread::run() BEGIN_DEBUG_EXCEPTION_HANDLER v3s16 pos; + std::map<v3s16, MapBlock *> modified_blocks; - m_map = (ServerMap *)&(m_server->m_env->getMap()); + m_map = &m_server->m_env->getServerMap(); m_emerge = m_server->m_emerge; m_mapgen = m_emerge->m_mapgens[id]; enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info; try { while (!stopRequested()) { - std::map<v3s16, MapBlock *> modified_blocks; BlockEmergeData bedata; BlockMakeData bmdata; EmergeAction action; - MapBlock *block; + MapBlock *block = nullptr; if (!popBlockEmerge(&pos, &bedata)) { m_queue_event.wait(); @@ -697,6 +713,8 @@ void *EmergeThread::run() } block = finishGen(pos, &bmdata, &modified_blocks); + if (!block) + action = EMERGE_ERRORED; } runCompletionCallbacks(pos, action, bedata.callbacks); @@ -706,6 +724,7 @@ void *EmergeThread::run() if (!modified_blocks.empty()) m_server->SetBlocksNotSent(modified_blocks); + modified_blocks.clear(); } } catch (VersionMismatchException &e) { std::ostringstream err; @@ -727,6 +746,8 @@ void *EmergeThread::run() m_server->setAsyncFatalError(err.str()); } + cancelPendingItems(); + END_DEBUG_EXCEPTION_HANDLER return NULL; } diff --git a/src/emerge.h b/src/emerge.h index 6f204666d..1bac4b708 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "network/networkprotocol.h" #include "irr_v3d.h" #include "util/container.h" +#include "util/metricsbackend.h" #include "mapgen/mapgen.h" // for MapgenParams #include "map.h" @@ -52,7 +53,6 @@ struct BlockMakeData { u64 seed = 0; v3s16 blockpos_min; v3s16 blockpos_max; - v3s16 blockpos_requested; UniqueQueue<v3s16> transforming_liquid; const NodeDefManager *nodedef = nullptr; @@ -70,6 +70,14 @@ enum EmergeAction { EMERGE_GENERATED, }; +const static std::string emergeActionStrs[] = { + "cancelled", + "errored", + "from_memory", + "from_disk", + "generated", +}; + // Callback typedef void (*EmergeCompletionCallback)( v3s16 blockpos, EmergeAction action, void *param); @@ -100,13 +108,15 @@ public: u32 gen_notify_on; const std::set<u32> *gen_notify_on_deco_ids; // shared + BiomeGen *biomegen; BiomeManager *biomemgr; OreManager *oremgr; DecorationManager *decomgr; SchematicManager *schemmgr; private: - EmergeParams(EmergeManager *parent, const BiomeManager *biomemgr, + EmergeParams(EmergeManager *parent, const BiomeGen *biomegen, + const BiomeManager *biomemgr, const OreManager *oremgr, const DecorationManager *decomgr, const SchematicManager *schemmgr); }; @@ -137,10 +147,12 @@ public: MapSettingsManager *map_settings_mgr; // Methods - EmergeManager(Server *server); + EmergeManager(Server *server, MetricsBackend *mb); ~EmergeManager(); DISABLE_CLASS_COPY(EmergeManager); + const BiomeGen *getBiomeGen() const { return biomegen; } + // no usage restrictions const BiomeManager *getBiomeManager() const { return biomemgr; } const OreManager *getOreManager() const { return oremgr; } @@ -171,13 +183,12 @@ public: EmergeCompletionCallback callback, void *callback_param); - v3s16 getContainingChunk(v3s16 blockpos); + bool isBlockInQueue(v3s16 pos); Mapgen *getCurrentMapgen(); // Mapgen helpers methods int getSpawnLevelAtPoint(v2s16 p); - int getGroundLevelAtPoint(v2s16 p); bool isBlockUnderground(v3s16 blockpos); static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize); @@ -189,14 +200,18 @@ private: std::mutex m_queue_mutex; std::map<v3s16, BlockEmergeData> m_blocks_enqueued; - std::unordered_map<u16, u16> m_peer_queue_count; + std::unordered_map<u16, u32> m_peer_queue_count; - u16 m_qlimit_total; - u16 m_qlimit_diskonly; - u16 m_qlimit_generate; + u32 m_qlimit_total; + u32 m_qlimit_diskonly; + u32 m_qlimit_generate; + + // Emerge metrics + MetricCounterPtr m_completed_emerge_counter[5]; // Managers of various map generation-related components // Note that each Mapgen gets a copy(!) of these to work with + BiomeGen *biomegen; BiomeManager *biomemgr; OreManager *oremgr; DecorationManager *decomgr; @@ -215,5 +230,7 @@ private: bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata); + void reportCompletedEmerge(EmergeAction action); + friend class EmergeThread; }; diff --git a/src/environment.cpp b/src/environment.cpp index 06f2b8bf9..b04f77557 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -169,6 +169,12 @@ void Environment::continueRaycast(RaycastState *state, PointedThing *result) new_nodes.MaxEdge.Z = new_nodes.MinEdge.Z; } + if (new_nodes.MaxEdge.X == S16_MAX || + new_nodes.MaxEdge.Y == S16_MAX || + new_nodes.MaxEdge.Z == S16_MAX) { + break; // About to go out of bounds + } + // For each untested node for (s16 x = new_nodes.MinEdge.X; x <= new_nodes.MaxEdge.X; x++) for (s16 y = new_nodes.MinEdge.Y; y <= new_nodes.MaxEdge.Y; y++) diff --git a/src/exceptions.h b/src/exceptions.h index c54307653..a558adc5d 100644 --- a/src/exceptions.h +++ b/src/exceptions.h @@ -72,11 +72,6 @@ public: SettingNotFoundException(const std::string &s): BaseException(s) {} }; -class InvalidFilenameException : public BaseException { -public: - InvalidFilenameException(const std::string &s): BaseException(s) {} -}; - class ItemNotFoundException : public BaseException { public: ItemNotFoundException(const std::string &s): BaseException(s) {} diff --git a/src/filesys.cpp b/src/filesys.cpp index 2470b1b64..28df32054 100644 --- a/src/filesys.cpp +++ b/src/filesys.cpp @@ -21,24 +21,33 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include <iostream> #include <cstdio> +#include <cstdlib> #include <cstring> #include <cerrno> #include <fstream> #include "log.h" #include "config.h" #include "porting.h" -#ifdef __ANDROID__ -#include "settings.h" // For g_settings +#ifndef SERVER +#include "irr_ptr.h" #endif namespace fs { -#ifdef _WIN32 // WINDOWS +#ifdef _WIN32 +/*********** + * Windows * + ***********/ + +#ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 +#endif #include <windows.h> #include <shlwapi.h> +#include <io.h> +#include <direct.h> std::vector<DirListNode> GetDirListing(const std::string &pathstring) { @@ -179,16 +188,34 @@ std::string TempPath() errorstream<<"GetTempPath failed, error = "<<GetLastError()<<std::endl; return ""; } - std::vector<char> buf(bufsize); + std::string buf; + buf.resize(bufsize); DWORD len = GetTempPath(bufsize, &buf[0]); if(len == 0 || len > bufsize){ errorstream<<"GetTempPath failed, error = "<<GetLastError()<<std::endl; return ""; } - return std::string(buf.begin(), buf.begin() + len); + buf.resize(len); + return buf; } -#else // POSIX +std::string CreateTempFile() +{ + std::string path = TempPath() + DIR_DELIM "MT_XXXXXX"; + _mktemp_s(&path[0], path.size() + 1); // modifies path + HANDLE file = CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + if (file == INVALID_HANDLE_VALUE) + return ""; + CloseHandle(file); + return path; +} + +#else + +/********* + * POSIX * + *********/ #include <sys/types.h> #include <dirent.h> @@ -295,31 +322,26 @@ bool RecursiveDelete(const std::string &path) infostream<<"Removing \""<<path<<"\""<<std::endl; - //return false; - pid_t child_pid = fork(); if(child_pid == 0) { // Child - char argv_data[3][10000]; + const char *argv[4] = { #ifdef __ANDROID__ - strcpy(argv_data[0], "/system/bin/rm"); + "/system/bin/rm", #else - strcpy(argv_data[0], "/bin/rm"); + "/bin/rm", #endif - strcpy(argv_data[1], "-rf"); - strncpy(argv_data[2], path.c_str(), sizeof(argv_data[2]) - 1); - char *argv[4]; - argv[0] = argv_data[0]; - argv[1] = argv_data[1]; - argv[2] = argv_data[2]; - argv[3] = NULL; + "-rf", + path.c_str(), + NULL + }; verbosestream<<"Executing '"<<argv[0]<<"' '"<<argv[1]<<"' '" <<argv[2]<<"'"<<std::endl; - execv(argv[0], argv); + execv(argv[0], const_cast<char**>(argv)); // Execv shouldn't return. Failed. _exit(1); @@ -331,7 +353,6 @@ bool RecursiveDelete(const std::string &path) pid_t tpid; do{ tpid = wait(&child_status); - //if(tpid != child_pid) process_terminated(tpid); }while(tpid != child_pid); return (child_status == 0); } @@ -365,15 +386,30 @@ std::string TempPath() compatible with lua's os.tmpname which under the default configuration hardcodes mkstemp("/tmp/lua_XXXXXX"). */ + #ifdef __ANDROID__ - return g_settings->get("TMPFolder"); + return porting::path_cache; #else return DIR_DELIM "tmp"; #endif } +std::string CreateTempFile() +{ + std::string path = TempPath() + DIR_DELIM "MT_XXXXXX"; + int fd = mkstemp(&path[0]); // modifies path + if (fd == -1) + return ""; + close(fd); + return path; +} + #endif +/**************************** + * portable implementations * + ****************************/ + void GetRecursiveDirs(std::vector<std::string> &dirs, const std::string &dir) { static const std::set<char> chars_to_ignore = { '_', '.' }; @@ -407,21 +443,6 @@ void GetRecursiveSubPaths(const std::string &path, } } -bool DeletePaths(const std::vector<std::string> &paths) -{ - bool success = true; - // Go backwards to succesfully delete the output of GetRecursiveSubPaths - for(int i=paths.size()-1; i>=0; i--){ - const std::string &path = paths[i]; - bool did = DeleteSingleFileOrEmptyDirectory(path); - if(!did){ - errorstream<<"Failed to delete "<<path<<std::endl; - success = false; - } - } - return success; -} - bool RecursiveDeleteContent(const std::string &path) { infostream<<"Removing content of \""<<path<<"\""<<std::endl; @@ -540,6 +561,30 @@ bool CopyDir(const std::string &source, const std::string &target) return false; } +bool MoveDir(const std::string &source, const std::string &target) +{ + infostream << "Moving \"" << source << "\" to \"" << target << "\"" << std::endl; + + // If target exists as empty folder delete, otherwise error + if (fs::PathExists(target)) { + if (rmdir(target.c_str()) != 0) { + errorstream << "MoveDir: target \"" << target + << "\" exists as file or non-empty folder" << std::endl; + return false; + } + } + + // Try renaming first which is instant + if (fs::Rename(source, target)) + return true; + + infostream << "MoveDir: rename not possible, will copy instead" << std::endl; + bool retval = fs::CopyDir(source, target); + if (retval) + retval &= fs::RecursiveDelete(source); + return retval; +} + bool PathStartsWith(const std::string &path, const std::string &prefix) { size_t pathsize = path.size(); @@ -750,6 +795,67 @@ bool safeWriteToFile(const std::string &path, const std::string &content) return true; } +#ifndef SERVER +bool extractZipFile(io::IFileSystem *fs, const char *filename, const std::string &destination) +{ + // Be careful here not to touch the global file hierarchy in Irrlicht + // since this function needs to be thread-safe! + + io::IArchiveLoader *zip_loader = nullptr; + for (u32 i = 0; i < fs->getArchiveLoaderCount(); i++) { + if (fs->getArchiveLoader(i)->isALoadableFileFormat(io::EFAT_ZIP)) { + zip_loader = fs->getArchiveLoader(i); + break; + } + } + if (!zip_loader) { + warningstream << "fs::extractZipFile(): Irrlicht said it doesn't support ZIPs." << std::endl; + return false; + } + + irr_ptr<io::IFileArchive> opened_zip(zip_loader->createArchive(filename, false, false)); + const io::IFileList* files_in_zip = opened_zip->getFileList(); + + for (u32 i = 0; i < files_in_zip->getFileCount(); i++) { + std::string fullpath = destination + DIR_DELIM; + fullpath += files_in_zip->getFullFileName(i).c_str(); + std::string fullpath_dir = fs::RemoveLastPathComponent(fullpath); + + if (files_in_zip->isDirectory(i)) + continue; // ignore, we create dirs as necessary + + if (!fs::PathExists(fullpath_dir) && !fs::CreateAllDirs(fullpath_dir)) + return false; + + irr_ptr<io::IReadFile> toread(opened_zip->createAndOpenFile(i)); + + std::ofstream os(fullpath.c_str(), std::ios::binary); + if (!os.good()) + return false; + + char buffer[4096]; + long total_read = 0; + + while (total_read < toread->getSize()) { + long bytes_read = toread->read(buffer, sizeof(buffer)); + bool error = true; + if (bytes_read != 0) { + os.write(buffer, bytes_read); + error = os.fail(); + } + if (error) { + os.close(); + remove(fullpath.c_str()); + return false; + } + total_read += bytes_read; + } + } + + return true; +} +#endif + bool ReadFile(const std::string &path, std::string &out) { std::ifstream is(path, std::ios::binary | std::ios::ate); @@ -762,7 +868,7 @@ bool ReadFile(const std::string &path, std::string &out) is.seekg(0); is.read(&out[0], size); - return true; + return !is.fail(); } bool Rename(const std::string &from, const std::string &to) @@ -771,4 +877,3 @@ bool Rename(const std::string &from, const std::string &to) } } // namespace fs - diff --git a/src/filesys.h b/src/filesys.h index b2c800c55..a26fe28d6 100644 --- a/src/filesys.h +++ b/src/filesys.h @@ -24,18 +24,22 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <vector> #include "exceptions.h" -#ifdef _WIN32 // WINDOWS +#ifdef _WIN32 #define DIR_DELIM "\\" #define DIR_DELIM_CHAR '\\' #define FILESYS_CASE_INSENSITIVE true #define PATH_DELIM ";" -#else // POSIX +#else #define DIR_DELIM "/" #define DIR_DELIM_CHAR '/' #define FILESYS_CASE_INSENSITIVE false #define PATH_DELIM ":" #endif +namespace irr { namespace io { +class IFileSystem; +}} + namespace fs { @@ -56,6 +60,11 @@ bool IsPathAbsolute(const std::string &path); bool IsDir(const std::string &path); +inline bool IsFile(const std::string &path) +{ + return PathExists(path) && !IsDir(path); +} + bool IsDirDelimiter(char c); // Only pass full paths to this one. True on success. @@ -67,6 +76,10 @@ bool DeleteSingleFileOrEmptyDirectory(const std::string &path); // Returns path to temp directory, can return "" on error std::string TempPath(); +// Returns path to securely-created temporary file (will already exist when this function returns) +// can return "" on error +std::string CreateTempFile(); + /* Returns a list of subdirectories, including the path itself, but excluding hidden directories (whose names start with . or _) */ @@ -85,9 +98,6 @@ void GetRecursiveSubPaths(const std::string &path, bool list_files, const std::set<char> &ignore = {}); -// Tries to delete all, returns false if any failed -bool DeletePaths(const std::vector<std::string> &paths); - // Only pass full paths to this one. True on success. bool RecursiveDeleteContent(const std::string &path); @@ -101,6 +111,10 @@ bool CopyFileContents(const std::string &source, const std::string &target); // Omits files and subdirectories that start with a period bool CopyDir(const std::string &source, const std::string &target); +// Move directory and all subdirectories +// Behavior with files/subdirs that start with a period is undefined +bool MoveDir(const std::string &source, const std::string &target); + // Check if one path is prefix of another // For example, "/tmp" is a prefix of "/tmp" and "/tmp/file" but not "/tmp2" // Ignores case differences and '/' vs. '\\' on Windows @@ -128,6 +142,10 @@ const char *GetFilenameFromPath(const char *path); bool safeWriteToFile(const std::string &path, const std::string &content); +#ifndef SERVER +bool extractZipFile(irr::io::IFileSystem *fs, const char *filename, const std::string &destination); +#endif + bool ReadFile(const std::string &path, std::string &out); bool Rename(const std::string &from, const std::string &to); diff --git a/src/gamedef.h b/src/gamedef.h index bc0ee14c3..45b9c4750 100644 --- a/src/gamedef.h +++ b/src/gamedef.h @@ -33,6 +33,7 @@ class EmergeManager; class Camera; class ModChannel; class ModMetadata; +class ModMetadataDatabase; namespace irr { namespace scene { class IAnimatedMesh; @@ -62,6 +63,8 @@ public: virtual IRollbackManager* getRollbackManager() { return NULL; } // Shorthands + // TODO: these should be made const-safe so that a const IGameDef* is + // actually usable IItemDefManager *idef() { return getItemDefManager(); } const NodeDefManager *ndef() { return getNodeDefManager(); } ICraftDefManager *cdef() { return getCraftDefManager(); } @@ -70,9 +73,9 @@ public: virtual const std::vector<ModSpec> &getMods() const = 0; virtual const ModSpec* getModSpec(const std::string &modname) const = 0; virtual std::string getWorldPath() const { return ""; } - virtual std::string getModStoragePath() const = 0; virtual bool registerModStorage(ModMetadata *storage) = 0; virtual void unregisterModStorage(const std::string &name) = 0; + virtual ModMetadataDatabase *getModStorageDatabase() = 0; virtual bool joinModChannel(const std::string &channel) = 0; virtual bool leaveModChannel(const std::string &channel) = 0; diff --git a/src/gameparams.h b/src/gameparams.h index 70b0ffcde..b138f8771 100644 --- a/src/gameparams.h +++ b/src/gameparams.h @@ -20,8 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include "irrlichttypes.h" - -struct SubgameSpec; +#include "content/subgames.h" // Information provided from "main" struct GameParams @@ -34,6 +33,12 @@ struct GameParams bool is_dedicated_server; }; +enum class ELoginRegister { + Any = 0, + Login, + Register +}; + // Information processed by main menu struct GameStartData : GameParams { @@ -46,6 +51,8 @@ struct GameStartData : GameParams std::string address; bool local_server; + ELoginRegister allow_login_or_register = ELoginRegister::Any; + // "world_path" must be kept in sync! WorldSpec world_spec; }; diff --git a/src/gettext.cpp b/src/gettext.cpp index 6818004df..de042cf35 100644 --- a/src/gettext.cpp +++ b/src/gettext.cpp @@ -127,6 +127,10 @@ void init_gettext(const char *path, const std::string &configured_language, // Add user specified locale to environment setenv("LANGUAGE", configured_language.c_str(), 1); +#ifdef __ANDROID__ + setenv("LANG", configured_language.c_str(), 1); +#endif + // Reload locale with changed environment setlocale(LC_ALL, ""); #elif defined(_MSC_VER) diff --git a/src/gettext.h b/src/gettext.h index 42b375d86..6225fef93 100644 --- a/src/gettext.h +++ b/src/gettext.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "config.h" // for USE_GETTEXT #include <string> +#include "porting.h" #if USE_GETTEXT #include <libintl.h> @@ -47,8 +48,7 @@ void init_gettext(const char *path, const std::string &configured_language, extern wchar_t *utf8_to_wide_c(const char *str); -// You must free the returned string! -// The returned string is allocated using new +// The returned string must be freed using delete[] inline const wchar_t *wgettext(const char *str) { // We must check here that is not an empty string to avoid trying to translate it @@ -59,3 +59,49 @@ inline std::string strgettext(const std::string &text) { return text.empty() ? "" : gettext(text.c_str()); } + +/** + * Returns translated string with format args applied + * + * @tparam Args Template parameter for format args + * @param src Translation source string + * @param args Variable format args + * @return translated string + */ +template <typename ...Args> +inline std::wstring fwgettext(const char *src, Args&&... args) +{ + wchar_t buf[255]; + const wchar_t* str = wgettext(src); + swprintf(buf, sizeof(buf) / sizeof(wchar_t), str, std::forward<Args>(args)...); + delete[] str; + return std::wstring(buf); +} + +/** + * Returns translated string with format args applied + * + * @tparam Args Template parameter for format args + * @param format Translation source string + * @param args Variable format args + * @return translated string. + */ +template <typename ...Args> +inline std::string fmtgettext(const char *format, Args&&... args) +{ + std::string buf; + std::size_t buf_size = 256; + buf.resize(buf_size); + + format = gettext(format); + + int len = porting::mt_snprintf(&buf[0], buf_size, format, std::forward<Args>(args)...); + if (len <= 0) throw std::runtime_error("gettext format error: " + std::string(format)); + if ((size_t)len >= buf.size()) { + buf.resize(len+1); // extra null byte + porting::mt_snprintf(&buf[0], buf.size(), format, std::forward<Args>(args)...); + } + buf.resize(len); // remove null bytes + + return buf; +} diff --git a/src/gettime.h b/src/gettime.h index 66efef1d7..772ff9b50 100644 --- a/src/gettime.h +++ b/src/gettime.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <ctime> #include <string> +#include <mutex> enum TimePrecision { @@ -30,13 +31,34 @@ enum TimePrecision PRECISION_NANO }; +inline struct tm mt_localtime() +{ + // initialize the time zone on first invocation + static std::once_flag tz_init; + std::call_once(tz_init, [] { +#ifdef _WIN32 + _tzset(); +#else + tzset(); +#endif + }); + + struct tm ret; + time_t t = time(NULL); + // TODO we should check if the function returns NULL, which would mean error +#ifdef _WIN32 + localtime_s(&ret, &t); +#else + localtime_r(&t, &ret); +#endif + return ret; +} + + inline std::string getTimestamp() { - time_t t = time(NULL); - // This is not really thread-safe but it won't break anything - // except its own output, so just go with it. - struct tm *tm = localtime(&t); + const struct tm tm = mt_localtime(); char cs[20]; // YYYY-MM-DD HH:MM:SS + '\0' - strftime(cs, 20, "%Y-%m-%d %H:%M:%S", tm); + strftime(cs, 20, "%Y-%m-%d %H:%M:%S", &tm); return cs; } diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 147f445f4..4434b14a0 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -1,3 +1,8 @@ +set(extra_gui_SRCS "") +if(ENABLE_TOUCH) + set(extra_gui_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/touchscreengui.cpp) +endif() + set(gui_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/guiAnimatedImage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiBackgroundImage.cpp @@ -6,7 +11,7 @@ set(gui_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/guiButtonImage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiButtonItemImage.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiChatConsole.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/guiConfirmRegistration.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/guiEditBox.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiEditBoxWithScrollbar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiEngine.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiFormSpecMenu.cpp @@ -15,14 +20,15 @@ set(gui_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/guiKeyChangeMenu.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiPasswordChange.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiPathSelectMenu.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/guiScene.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiScrollBar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiScrollContainer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiSkin.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiTable.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiHyperText.cpp ${CMAKE_CURRENT_SOURCE_DIR}/guiVolumeChange.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/intlGUIEditBox.cpp ${CMAKE_CURRENT_SOURCE_DIR}/modalMenu.cpp ${CMAKE_CURRENT_SOURCE_DIR}/profilergraph.cpp + ${extra_gui_SRCS} PARENT_SCOPE ) diff --git a/src/gui/StyleSpec.h b/src/gui/StyleSpec.h index 36ad51a89..7a45e07d1 100644 --- a/src/gui/StyleSpec.h +++ b/src/gui/StyleSpec.h @@ -45,6 +45,7 @@ public: BGIMG_PRESSED, // Note: Deprecated property FGIMG, FGIMG_HOVERED, // Note: Deprecated property + FGIMG_MIDDLE, FGIMG_PRESSED, // Note: Deprecated property ALPHA, CONTENT_OFFSET, @@ -54,6 +55,9 @@ public: COLORS, BORDERCOLORS, BORDERWIDTHS, + SOUND, + SPACING, + SIZE, NUM_PROPERTIES, NONE }; @@ -98,6 +102,8 @@ public: return FGIMG; } else if (name == "fgimg_hovered") { return FGIMG_HOVERED; + } else if (name == "fgimg_middle") { + return FGIMG_MIDDLE; } else if (name == "fgimg_pressed") { return FGIMG_PRESSED; } else if (name == "alpha") { @@ -116,6 +122,12 @@ public: return BORDERCOLORS; } else if (name == "borderwidths") { return BORDERWIDTHS; + } else if (name == "sound") { + return SOUND; + } else if (name == "spacing") { + return SPACING; + } else if (name == "size") { + return SIZE; } else { return NONE; } @@ -256,27 +268,40 @@ public: return rect; } - irr::core::vector2d<s32> getVector2i(Property prop, irr::core::vector2d<s32> def) const + v2f32 getVector2f(Property prop, v2f32 def) const { const auto &val = properties[prop]; if (val.empty()) return def; - irr::core::vector2d<s32> vec; - if (!parseVector2i(val, &vec)) + v2f32 vec; + if (!parseVector2f(val, &vec)) return def; return vec; } - irr::core::vector2d<s32> getVector2i(Property prop) const + v2s32 getVector2i(Property prop, v2s32 def) const + { + const auto &val = properties[prop]; + if (val.empty()) + return def; + + v2f32 vec; + if (!parseVector2f(val, &vec)) + return def; + + return v2s32(vec.X, vec.Y); + } + + v2s32 getVector2i(Property prop) const { const auto &val = properties[prop]; FATAL_ERROR_IF(val.empty(), "Unexpected missing property"); - irr::core::vector2d<s32> vec; - parseVector2i(val, &vec); - return vec; + v2f32 vec; + parseVector2f(val, &vec); + return v2s32(vec.X, vec.Y); } gui::IGUIFont *getFont() const @@ -429,22 +454,20 @@ private: return true; } - bool parseVector2i(const std::string &value, irr::core::vector2d<s32> *parsed_vec) const + bool parseVector2f(const std::string &value, v2f32 *parsed_vec) const { - irr::core::vector2d<s32> vec; + v2f32 vec; std::vector<std::string> v_vector = split(value, ','); if (v_vector.size() == 1) { - s32 x = stoi(v_vector[0]); + f32 x = stof(v_vector[0]); vec.X = x; vec.Y = x; } else if (v_vector.size() == 2) { - s32 x = stoi(v_vector[0]); - s32 y = stoi(v_vector[1]); - vec.X = x; - vec.Y = y; + vec.X = stof(v_vector[0]); + vec.Y = stof(v_vector[1]); } else { - warningstream << "Invalid vector2d string format: \"" << value + warningstream << "Invalid 2d vector string format: \"" << value << "\"" << std::endl; return false; } diff --git a/src/gui/guiAnimatedImage.cpp b/src/gui/guiAnimatedImage.cpp index b1447c45f..890763e71 100644 --- a/src/gui/guiAnimatedImage.cpp +++ b/src/gui/guiAnimatedImage.cpp @@ -9,40 +9,37 @@ #include <vector> GUIAnimatedImage::GUIAnimatedImage(gui::IGUIEnvironment *env, gui::IGUIElement *parent, - s32 id, const core::rect<s32> &rectangle, const std::string &texture_name, - s32 frame_count, s32 frame_duration, ISimpleTextureSource *tsrc) : - gui::IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rectangle), m_tsrc(tsrc) + s32 id, const core::rect<s32> &rectangle) : + gui::IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rectangle) { - m_texture = m_tsrc->getTexture(texture_name); - - m_frame_count = std::max(frame_count, 1); - m_frame_duration = std::max(frame_duration, 0); - - if (m_texture != nullptr) { - core::dimension2d<u32> size = m_texture->getOriginalSize(); - if (size.Height < (u64)m_frame_count) - m_frame_count = size.Height; - } else { - // No need to step an animation if we have nothing to draw - m_frame_count = 1; - } } void GUIAnimatedImage::draw() { - // Render the current frame - if (m_texture != nullptr) { - video::IVideoDriver *driver = Environment->getVideoDriver(); + if (m_texture == nullptr) + return; + video::IVideoDriver *driver = Environment->getVideoDriver(); + + core::dimension2d<u32> size = m_texture->getOriginalSize(); + + if ((u32)m_frame_count > size.Height) + m_frame_count = size.Height; + if (m_frame_idx >= m_frame_count) + m_frame_idx = m_frame_count - 1; + + size.Height /= m_frame_count; + + core::rect<s32> rect(core::position2d<s32>(0, size.Height * m_frame_idx), size); + core::rect<s32> *cliprect = NoClip ? nullptr : &AbsoluteClippingRect; + + if (m_middle.getArea() == 0) { const video::SColor color(255, 255, 255, 255); const video::SColor colors[] = {color, color, color, color}; - - core::dimension2d<u32> size = m_texture->getOriginalSize(); - size.Height /= m_frame_count; - - draw2DImageFilterScaled(driver, m_texture, AbsoluteRect, - core::rect<s32>(core::position2d<s32>(0, size.Height * m_frame_idx), size), - NoClip ? nullptr : &AbsoluteClippingRect, colors, true); + draw2DImageFilterScaled(driver, m_texture, AbsoluteRect, rect, cliprect, + colors, true); + } else { + draw2DImage9Slice(driver, m_texture, AbsoluteRect, rect, m_middle, cliprect); } // Step the animation @@ -55,7 +52,7 @@ void GUIAnimatedImage::draw() m_global_time = new_global_time; // Advance by the number of elapsed frames, looping if necessary - m_frame_idx += u32(m_frame_time / m_frame_duration); + m_frame_idx += (u32)(m_frame_time / m_frame_duration); m_frame_idx %= m_frame_count; // If 1 or more frames have elapsed, reset the frame time counter with @@ -63,11 +60,3 @@ void GUIAnimatedImage::draw() m_frame_time %= m_frame_duration; } } - - -void GUIAnimatedImage::setFrameIndex(s32 frame) -{ - s32 idx = std::max(frame, 0); - if (idx > 0 && idx < m_frame_count) - m_frame_idx = idx; -} diff --git a/src/gui/guiAnimatedImage.h b/src/gui/guiAnimatedImage.h index f8e6a506e..885aedece 100644 --- a/src/gui/guiAnimatedImage.h +++ b/src/gui/guiAnimatedImage.h @@ -1,6 +1,7 @@ #pragma once #include "irrlichttypes_extrabloated.h" +#include <algorithm> #include <string> class ISimpleTextureSource; @@ -8,21 +9,33 @@ class ISimpleTextureSource; class GUIAnimatedImage : public gui::IGUIElement { public: GUIAnimatedImage(gui::IGUIEnvironment *env, gui::IGUIElement *parent, - s32 id, const core::rect<s32> &rectangle, const std::string &texture_name, - s32 frame_count, s32 frame_duration, ISimpleTextureSource *tsrc); + s32 id, const core::rect<s32> &rectangle); virtual void draw() override; - void setFrameIndex(s32 frame); + void setTexture(video::ITexture *texture) { m_texture = texture; }; + video::ITexture *getTexture() const { return m_texture; }; + + void setMiddleRect(const core::rect<s32> &middle) { m_middle = middle; }; + core::rect<s32> getMiddleRect() const { return m_middle; }; + + void setFrameDuration(u64 duration) { m_frame_duration = duration; }; + u64 getFrameDuration() const { return m_frame_duration; }; + + void setFrameCount(s32 count) { m_frame_count = std::max(count, 1); }; + s32 getFrameCount() const { return m_frame_count; }; + + void setFrameIndex(s32 frame) { m_frame_idx = std::max(frame, 0); }; s32 getFrameIndex() const { return m_frame_idx; }; private: - ISimpleTextureSource *m_tsrc; - video::ITexture *m_texture = nullptr; + u64 m_global_time = 0; s32 m_frame_idx = 0; s32 m_frame_count = 1; - u64 m_frame_duration = 1; + u64 m_frame_duration = 0; u64 m_frame_time = 0; + + core::rect<s32> m_middle; }; diff --git a/src/gui/guiBackgroundImage.cpp b/src/gui/guiBackgroundImage.cpp index 21c1e88cf..8d0d1c010 100644 --- a/src/gui/guiBackgroundImage.cpp +++ b/src/gui/guiBackgroundImage.cpp @@ -44,25 +44,19 @@ void GUIBackgroundImage::draw() core::rect<s32> rect = AbsoluteRect; if (m_autoclip) - rect.LowerRightCorner += Parent->getAbsolutePosition().getSize(); + rect.LowerRightCorner += Parent->getAbsoluteClippingRect().getSize(); video::IVideoDriver *driver = Environment->getVideoDriver(); + core::rect<s32> srcrect(core::position2d<s32>(0, 0), + core::dimension2di(texture->getOriginalSize())); + if (m_middle.getArea() == 0) { const video::SColor color(255, 255, 255, 255); const video::SColor colors[] = {color, color, color, color}; - draw2DImageFilterScaled(driver, texture, rect, - core::rect<s32>(core::position2d<s32>(0, 0), - core::dimension2di(texture->getOriginalSize())), - nullptr, colors, true); + draw2DImageFilterScaled(driver, texture, rect, srcrect, nullptr, colors, true); } else { - core::rect<s32> middle = m_middle; - // `-x` is interpreted as `w - x` - if (middle.LowerRightCorner.X < 0) - middle.LowerRightCorner.X += texture->getOriginalSize().Width; - if (middle.LowerRightCorner.Y < 0) - middle.LowerRightCorner.Y += texture->getOriginalSize().Height; - draw2DImage9Slice(driver, texture, rect, middle); + draw2DImage9Slice(driver, texture, rect, srcrect, m_middle); } IGUIElement::draw(); diff --git a/src/gui/guiBox.cpp b/src/gui/guiBox.cpp index 99a115daf..443f1064f 100644 --- a/src/gui/guiBox.cpp +++ b/src/gui/guiBox.cpp @@ -107,10 +107,11 @@ void GUIBox::draw() video::IVideoDriver *driver = Environment->getVideoDriver(); driver->draw2DRectangle(main_rect, m_colors[0], m_colors[1], m_colors[3], - m_colors[2], nullptr); + m_colors[2], &AbsoluteClippingRect); for (size_t i = 0; i <= 3; i++) - driver->draw2DRectangle(m_bordercolors[i], border_rects[i], nullptr); + driver->draw2DRectangle(m_bordercolors[i], border_rects[i], + &AbsoluteClippingRect); IGUIElement::draw(); } diff --git a/src/gui/guiButton.cpp b/src/gui/guiButton.cpp index b98e5de82..c38d901c4 100644 --- a/src/gui/guiButton.cpp +++ b/src/gui/guiButton.cpp @@ -320,15 +320,9 @@ void GUIButton::draw() sourceRect, &AbsoluteClippingRect, image_colors, UseAlphaChannel); } else { - core::rect<s32> middle = BgMiddle; - // `-x` is interpreted as `w - x` - if (middle.LowerRightCorner.X < 0) - middle.LowerRightCorner.X += texture->getOriginalSize().Width; - if (middle.LowerRightCorner.Y < 0) - middle.LowerRightCorner.Y += texture->getOriginalSize().Height; draw2DImage9Slice(driver, texture, ScaleImage ? AbsoluteRect : core::rect<s32>(pos, sourceRect.getSize()), - middle, &AbsoluteClippingRect, image_colors); + sourceRect, BgMiddle, &AbsoluteClippingRect, image_colors); } // END PATCH } @@ -506,6 +500,13 @@ video::SColor GUIButton::getOverrideColor() const return OverrideColor; } +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 +video::SColor GUIButton::getActiveColor() const +{ + return video::SColor(0,0,0,0); // unused? +} +#endif + void GUIButton::enableOverrideColor(bool enable) { OverrideColorEnabled = enable; @@ -625,85 +626,6 @@ bool GUIButton::isDrawingBorder() const } -//! Writes attributes of the element. -void GUIButton::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const -{ - IGUIButton::serializeAttributes(out,options); - - out->addBool ("PushButton", IsPushButton ); - if (IsPushButton) - out->addBool("Pressed", Pressed); - - for ( u32 i=0; i<(u32)EGBIS_COUNT; ++i ) - { - if ( ButtonImages[i].Texture ) - { - core::stringc name( GUIButtonImageStateNames[i] ); - out->addTexture(name.c_str(), ButtonImages[i].Texture); - name += "Rect"; - out->addRect(name.c_str(), ButtonImages[i].SourceRect); - } - } - - out->addBool ("UseAlphaChannel", UseAlphaChannel); - out->addBool ("Border", DrawBorder); - out->addBool ("ScaleImage", ScaleImage); - - for ( u32 i=0; i<(u32)EGBS_COUNT; ++i ) - { - if ( ButtonSprites[i].Index >= 0 ) - { - core::stringc nameIndex( GUIButtonStateNames[i] ); - nameIndex += "Index"; - out->addInt(nameIndex.c_str(), ButtonSprites[i].Index ); - - core::stringc nameColor( GUIButtonStateNames[i] ); - nameColor += "Color"; - out->addColor(nameColor.c_str(), ButtonSprites[i].Color ); - - core::stringc nameLoop( GUIButtonStateNames[i] ); - nameLoop += "Loop"; - out->addBool(nameLoop.c_str(), ButtonSprites[i].Loop ); - - core::stringc nameScale( GUIButtonStateNames[i] ); - nameScale += "Scale"; - out->addBool(nameScale.c_str(), ButtonSprites[i].Scale ); - } - } - - // out->addString ("OverrideFont", OverrideFont); -} - - -//! Reads attributes of the element -void GUIButton::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) -{ - IGUIButton::deserializeAttributes(in,options); - - IsPushButton = in->getAttributeAsBool("PushButton"); - Pressed = IsPushButton ? in->getAttributeAsBool("Pressed") : false; - - core::rect<s32> rec = in->getAttributeAsRect("ImageRect"); - if (rec.isValid()) - setImage( in->getAttributeAsTexture("Image"), rec); - else - setImage( in->getAttributeAsTexture("Image") ); - - rec = in->getAttributeAsRect("PressedImageRect"); - if (rec.isValid()) - setPressedImage( in->getAttributeAsTexture("PressedImage"), rec); - else - setPressedImage( in->getAttributeAsTexture("PressedImage") ); - - setDrawBorder(in->getAttributeAsBool("Border")); - setUseAlphaChannel(in->getAttributeAsBool("UseAlphaChannel")); - setScaleImage(in->getAttributeAsBool("ScaleImage")); - - // setOverrideFont(in->getAttributeAsString("OverrideFont")); - - updateAbsolutePosition(); -} - // PATCH GUIButton* GUIButton::addButton(IGUIEnvironment *environment, const core::rect<s32>& rectangle, ISimpleTextureSource *tsrc, diff --git a/src/gui/guiButton.h b/src/gui/guiButton.h index 4e1b04aac..ee9bb6f21 100644 --- a/src/gui/guiButton.h +++ b/src/gui/guiButton.h @@ -69,6 +69,12 @@ using namespace irr; class ISimpleTextureSource; +#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 8) +#define OVERRIDE_19 +#else +#define OVERRIDE_19 override +#endif + class GUIButton : public gui::IGUIButton { public: @@ -97,22 +103,27 @@ public: virtual gui::IGUIFont* getActiveFont() const override; //! Sets another color for the button text. - virtual void setOverrideColor(video::SColor color); + virtual void setOverrideColor(video::SColor color) OVERRIDE_19; //! Gets the override color - virtual video::SColor getOverrideColor(void) const; + virtual video::SColor getOverrideColor(void) const OVERRIDE_19; + + #if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + //! Gets the currently used text color + virtual video::SColor getActiveColor() const override; + #endif //! Sets if the button text should use the override color or the color in the gui skin. - virtual void enableOverrideColor(bool enable); + virtual void enableOverrideColor(bool enable) OVERRIDE_19; //! Checks if an override color is enabled - virtual bool isOverrideColorEnabled(void) const; + virtual bool isOverrideColorEnabled(void) const OVERRIDE_19; // PATCH //! Sets an image which should be displayed on the button when it is in the given state. virtual void setImage(gui::EGUI_BUTTON_IMAGE_STATE state, video::ITexture* image=nullptr, - const core::rect<s32>& sourceRect=core::rect<s32>(0,0,0,0)); + const core::rect<s32>& sourceRect=core::rect<s32>(0,0,0,0)) OVERRIDE_19; //! Sets an image which should be displayed on the button when it is in normal state. virtual void setImage(video::ITexture* image=nullptr) override; @@ -141,7 +152,7 @@ public: */ virtual void setSprite(gui::EGUI_BUTTON_STATE state, s32 index, video::SColor color=video::SColor(255,255,255,255), - bool loop=false, bool scale=false); + bool loop=false, bool scale=false) OVERRIDE_19; #if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 8) void setSprite(gui::EGUI_BUTTON_STATE state, s32 index, video::SColor color, bool loop) override { @@ -150,16 +161,16 @@ public: #endif //! Get the sprite-index for the given state or -1 when no sprite is set - virtual s32 getSpriteIndex(gui::EGUI_BUTTON_STATE state) const; + virtual s32 getSpriteIndex(gui::EGUI_BUTTON_STATE state) const OVERRIDE_19; //! Get the sprite color for the given state. Color is only used when a sprite is set. - virtual video::SColor getSpriteColor(gui::EGUI_BUTTON_STATE state) const; + virtual video::SColor getSpriteColor(gui::EGUI_BUTTON_STATE state) const OVERRIDE_19; //! Returns if the sprite in the given state does loop - virtual bool getSpriteLoop(gui::EGUI_BUTTON_STATE state) const; + virtual bool getSpriteLoop(gui::EGUI_BUTTON_STATE state) const OVERRIDE_19; //! Returns if the sprite in the given state is scaled - virtual bool getSpriteScale(gui::EGUI_BUTTON_STATE state) const; + virtual bool getSpriteScale(gui::EGUI_BUTTON_STATE state) const OVERRIDE_19; //! Sets if the button should behave like a push button. Which means it //! can be in two states: Normal or Pressed. With a click on the button, @@ -199,25 +210,17 @@ public: virtual bool isScalingImage() const override; //! Get if the shift key was pressed in last EGET_BUTTON_CLICKED event - virtual bool getClickShiftState() const + virtual bool getClickShiftState() const OVERRIDE_19 { return ClickShiftState; } //! Get if the control key was pressed in last EGET_BUTTON_CLICKED event - virtual bool getClickControlState() const + virtual bool getClickControlState() const OVERRIDE_19 { return ClickControlState; } - //! Writes attributes of the element. - virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const override; - - //! Reads attributes of the element - virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options) override; - - - void setColor(video::SColor color); // PATCH //! Set element properties from a StyleSpec corresponding to the button state diff --git a/src/gui/guiButtonImage.cpp b/src/gui/guiButtonImage.cpp index b507ffece..4ab770a99 100644 --- a/src/gui/guiButtonImage.cpp +++ b/src/gui/guiButtonImage.cpp @@ -32,15 +32,15 @@ using namespace gui; GUIButtonImage::GUIButtonImage(gui::IGUIEnvironment *environment, gui::IGUIElement *parent, s32 id, core::rect<s32> rectangle, ISimpleTextureSource *tsrc, bool noclip) - : GUIButton (environment, parent, id, rectangle, tsrc, noclip) + : GUIButton(environment, parent, id, rectangle, tsrc, noclip) { - m_image = Environment->addImage( - core::rect<s32>(0,0,rectangle.getWidth(),rectangle.getHeight()), this); - m_image->setScaleImage(isScalingImage()); + GUIButton::setScaleImage(true); + m_image = new GUIAnimatedImage(environment, this, id, rectangle); sendToBack(m_image); } -void GUIButtonImage::setForegroundImage(video::ITexture *image) +void GUIButtonImage::setForegroundImage(video::ITexture *image, + const core::rect<s32> &middle) { if (image == m_foreground_image) return; @@ -52,11 +52,12 @@ void GUIButtonImage::setForegroundImage(video::ITexture *image) m_foreground_image->drop(); m_foreground_image = image; - m_image->setImage(image); + m_image->setTexture(image); + m_image->setMiddleRect(middle); } //! Set element properties from a StyleSpec -void GUIButtonImage::setFromStyle(const StyleSpec& style) +void GUIButtonImage::setFromStyle(const StyleSpec &style) { GUIButton::setFromStyle(style); @@ -67,19 +68,13 @@ void GUIButtonImage::setFromStyle(const StyleSpec& style) getTextureSource()); setForegroundImage(guiScalingImageButton(driver, texture, - AbsoluteRect.getWidth(), AbsoluteRect.getHeight())); - setScaleImage(true); + AbsoluteRect.getWidth(), AbsoluteRect.getHeight()), + style.getRect(StyleSpec::FGIMG_MIDDLE, m_image->getMiddleRect())); } else { - setForegroundImage(nullptr); + setForegroundImage(); } } -void GUIButtonImage::setScaleImage(bool scaleImage) -{ - GUIButton::setScaleImage(scaleImage); - m_image->setScaleImage(scaleImage); -} - GUIButtonImage *GUIButtonImage::addButton(IGUIEnvironment *environment, const core::rect<s32> &rectangle, ISimpleTextureSource *tsrc, IGUIElement *parent, s32 id, const wchar_t *text, diff --git a/src/gui/guiButtonImage.h b/src/gui/guiButtonImage.h index 59a25b4f0..554934518 100644 --- a/src/gui/guiButtonImage.h +++ b/src/gui/guiButtonImage.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "guiButton.h" #include "IGUIButton.h" +#include "guiAnimatedImage.h" using namespace irr; @@ -32,12 +33,11 @@ public: s32 id, core::rect<s32> rectangle, ISimpleTextureSource *tsrc, bool noclip = false); - void setForegroundImage(video::ITexture *image = nullptr); + void setForegroundImage(video::ITexture *image = nullptr, + const core::rect<s32> &middle = core::rect<s32>()); //! Set element properties from a StyleSpec - virtual void setFromStyle(const StyleSpec& style) override; - - virtual void setScaleImage(bool scaleImage=true) override; + virtual void setFromStyle(const StyleSpec &style) override; //! Do not drop returned handle static GUIButtonImage *addButton(gui::IGUIEnvironment *environment, @@ -47,5 +47,5 @@ public: private: video::ITexture *m_foreground_image = nullptr; - gui::IGUIImage *m_image; + GUIAnimatedImage *m_image; }; diff --git a/src/gui/guiButtonItemImage.cpp b/src/gui/guiButtonItemImage.cpp index d8b9042ac..d9ab4b935 100644 --- a/src/gui/guiButtonItemImage.cpp +++ b/src/gui/guiButtonItemImage.cpp @@ -30,7 +30,7 @@ using namespace gui; GUIButtonItemImage::GUIButtonItemImage(gui::IGUIEnvironment *environment, gui::IGUIElement *parent, s32 id, core::rect<s32> rectangle, - ISimpleTextureSource *tsrc, std::string item, Client *client, + ISimpleTextureSource *tsrc, const std::string &item, Client *client, bool noclip) : GUIButton (environment, parent, id, rectangle, tsrc, noclip) { @@ -39,13 +39,12 @@ GUIButtonItemImage::GUIButtonItemImage(gui::IGUIEnvironment *environment, item, getActiveFont(), client); sendToBack(m_image); - m_item_name = item; m_client = client; } GUIButtonItemImage *GUIButtonItemImage::addButton(IGUIEnvironment *environment, const core::rect<s32> &rectangle, ISimpleTextureSource *tsrc, - IGUIElement *parent, s32 id, const wchar_t *text, std::string item, + IGUIElement *parent, s32 id, const wchar_t *text, const std::string &item, Client *client) { GUIButtonItemImage *button = new GUIButtonItemImage(environment, diff --git a/src/gui/guiButtonItemImage.h b/src/gui/guiButtonItemImage.h index aad923bda..205e957a7 100644 --- a/src/gui/guiButtonItemImage.h +++ b/src/gui/guiButtonItemImage.h @@ -33,16 +33,15 @@ public: //! constructor GUIButtonItemImage(gui::IGUIEnvironment *environment, gui::IGUIElement *parent, s32 id, core::rect<s32> rectangle, ISimpleTextureSource *tsrc, - std::string item, Client *client, bool noclip = false); + const std::string &item, Client *client, bool noclip = false); //! Do not drop returned handle static GUIButtonItemImage *addButton(gui::IGUIEnvironment *environment, const core::rect<s32> &rectangle, ISimpleTextureSource *tsrc, - IGUIElement *parent, s32 id, const wchar_t *text, std::string item, - Client *client); + IGUIElement *parent, s32 id, const wchar_t *text, + const std::string &item, Client *client); private: - std::string m_item_name; Client *m_client; GUIItemImage *m_image; }; diff --git a/src/gui/guiChatConsole.cpp b/src/gui/guiChatConsole.cpp index ad85c9026..6c35ad9ed 100644 --- a/src/gui/guiChatConsole.cpp +++ b/src/gui/guiChatConsole.cpp @@ -17,6 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "IrrCompileConfig.h" #include "guiChatConsole.h" #include "chat.h" #include "client/client.h" @@ -29,17 +30,18 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/fontengine.h" #include "log.h" #include "gettext.h" +#include "irrlicht_changes/CGUITTFont.h" #include <string> -#if USE_FREETYPE - #include "irrlicht_changes/CGUITTFont.h" -#endif - inline u32 clamp_u8(s32 value) { return (u32) MYMIN(MYMAX(value, 0), 255); } +inline bool isInCtrlKeys(const irr::EKEY_CODE& kc) +{ + return kc == KEY_LCONTROL || kc == KEY_RCONTROL || kc == KEY_CONTROL; +} GUIChatConsole::GUIChatConsole( gui::IGUIEnvironment* env, @@ -74,9 +76,9 @@ GUIChatConsole::GUIChatConsole( m_background_color.setBlue(clamp_u8(myround(console_color.Z))); } - u16 chat_font_size = g_settings->getU16("chat_font_size"); + const u16 chat_font_size = g_settings->getU16("chat_font_size"); m_font = g_fontengine->getFont(chat_font_size != 0 ? - chat_font_size : FONT_SIZE_UNSPECIFIED, FM_Mono); + rangelim(chat_font_size, 5, 72) : FONT_SIZE_UNSPECIFIED, FM_Mono); if (!m_font) { errorstream << "GUIChatConsole: Unable to load mono font" << std::endl; @@ -90,6 +92,10 @@ GUIChatConsole::GUIChatConsole( // set default cursor options setCursor(true, true, 2.0, 0.1); + + // track ctrl keys for mouse event + m_is_ctrl_down = false; + m_cache_clickable_chat_weblinks = g_settings->getBool("clickable_chat_weblinks"); } GUIChatConsole::~GUIChatConsole() @@ -136,11 +142,6 @@ void GUIChatConsole::closeConsoleAtOnce() recalculateConsolePosition(); } -f32 GUIChatConsole::getDesiredHeight() const -{ - return m_desired_height_fraction; -} - void GUIChatConsole::replaceAndAddToHistory(const std::wstring &line) { ChatPrompt& prompt = m_chat_backend->getPrompt(); @@ -324,20 +325,16 @@ void GUIChatConsole::drawText() core::rect<s32> destrect( x, y, x + m_fontsize.X * fragment.text.size(), y + m_fontsize.Y); -#if USE_FREETYPE if (m_font->getType() == irr::gui::EGFT_CUSTOM) { - // Draw colored text if FreeType is enabled - irr::gui::CGUITTFont *tmp = dynamic_cast<irr::gui::CGUITTFont *>(m_font); + // Draw colored text if possible + gui::CGUITTFont *tmp = static_cast<gui::CGUITTFont*>(m_font); tmp->draw( fragment.text, destrect, - video::SColor(255, 255, 255, 255), false, false, &AbsoluteClippingRect); - } else -#endif - { + } else { // Otherwise use standard text m_font->draw( fragment.text.c_str(), @@ -410,8 +407,21 @@ bool GUIChatConsole::OnEvent(const SEvent& event) ChatPrompt &prompt = m_chat_backend->getPrompt(); - if(event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown) + if (event.EventType == EET_KEY_INPUT_EVENT && !event.KeyInput.PressedDown) { + // CTRL up + if (isInCtrlKeys(event.KeyInput.Key)) + { + m_is_ctrl_down = false; + } + } + else if(event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown) + { + // CTRL down + if (isInCtrlKeys(event.KeyInput.Key)) { + m_is_ctrl_down = true; + } + // Key input if (KeyPress(event.KeyInput) == getKeySetting("keymap_console")) { closeConsole(); @@ -564,8 +574,7 @@ bool GUIChatConsole::OnEvent(const SEvent& event) const c8 *text = os_operator->getTextFromClipboard(); if (!text) return true; - std::basic_string<unsigned char> str((const unsigned char*)text); - prompt.input(std::wstring(str.begin(), str.end())); + prompt.input(utf8_to_wide(text)); return true; } else if(event.KeyInput.Key == KEY_KEY_X && event.KeyInput.Control) @@ -612,24 +621,38 @@ bool GUIChatConsole::OnEvent(const SEvent& event) prompt.nickCompletion(names, backwards); return true; } else if (!iswcntrl(event.KeyInput.Char) && !event.KeyInput.Control) { - #if defined(__linux__) && (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9) - wchar_t wc = L'_'; - mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) ); - prompt.input(wc); - #else - prompt.input(event.KeyInput.Char); - #endif + prompt.input(event.KeyInput.Char); return true; } } else if(event.EventType == EET_MOUSE_INPUT_EVENT) { - if(event.MouseInput.Event == EMIE_MOUSE_WHEEL) + if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) { s32 rows = myround(-3.0 * event.MouseInput.Wheel); m_chat_backend->scroll(rows); } + // Middle click or ctrl-click opens weblink, if enabled in config + else if(m_cache_clickable_chat_weblinks && ( + event.MouseInput.Event == EMIE_MMOUSE_PRESSED_DOWN || + (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN && m_is_ctrl_down) + )) + { + // If clicked within console output region + if (event.MouseInput.Y / m_fontsize.Y < (m_height / m_fontsize.Y) - 1 ) + { + // Translate pixel position to font position + middleClick(event.MouseInput.X / m_fontsize.X, event.MouseInput.Y / m_fontsize.Y); + } + } } +#if (IRRLICHT_VERSION_MT_REVISION >= 2) + else if(event.EventType == EET_STRING_INPUT_EVENT) + { + prompt.input(std::wstring(event.StringInput.Str->c_str())); + return true; + } +#endif return Parent ? Parent->OnEvent(event) : false; } @@ -644,3 +667,62 @@ void GUIChatConsole::setVisible(bool visible) } } +void GUIChatConsole::middleClick(s32 col, s32 row) +{ + // Prevent accidental rapid clicking + static u64 s_oldtime = 0; + u64 newtime = porting::getTimeMs(); + + // 0.6 seconds should suffice + if (newtime - s_oldtime < 600) + return; + s_oldtime = newtime; + + const std::vector<ChatFormattedFragment> & + frags = m_chat_backend->getConsoleBuffer().getFormattedLine(row).fragments; + std::string weblink = ""; // from frag meta + + // Identify targetted fragment, if exists + int indx = frags.size() - 1; + if (indx < 0) { + // Invalid row, frags is empty + return; + } + // Scan from right to left, offset by 1 font space because left margin + while (indx > -1 && (u32)col < frags[indx].column + 1) { + --indx; + } + if (indx > -1) { + weblink = frags[indx].weblink; + // Note if(indx < 0) then a frag somehow had a corrupt column field + } + + /* + // Debug help. Please keep this in case adjustments are made later. + std::string ws; + ws = "Middleclick: (" + std::to_string(col) + ',' + std::to_string(row) + ')' + " frags:"; + // show all frags <position>(<length>) for the clicked row + for (u32 i=0;i<frags.size();++i) { + if (indx == int(i)) + // tag the actual clicked frag + ws += '*'; + ws += std::to_string(frags.at(i).column) + '(' + + std::to_string(frags.at(i).text.size()) + "),"; + } + actionstream << ws << std::endl; + */ + + // User notification + if (weblink.size() != 0) { + std::ostringstream msg; + msg << " * "; + if (porting::open_url(weblink)) { + msg << gettext("Opening webpage"); + } + else { + msg << gettext("Failed to open webpage"); + } + msg << " '" << weblink << "'"; + m_chat_backend->addUnparsedMessage(utf8_to_wide(msg.str())); + } +} diff --git a/src/gui/guiChatConsole.h b/src/gui/guiChatConsole.h index 7be40e27c..32628f0d8 100644 --- a/src/gui/guiChatConsole.h +++ b/src/gui/guiChatConsole.h @@ -55,10 +55,6 @@ public: // Set whether to close the console after the user presses enter. void setCloseOnEnter(bool close) { m_close_on_enter = close; } - // Return the desired height (fraction of screen size) - // Zero if the console is closed or getting closed - f32 getDesiredHeight() const; - // Replace actual line when adding the actual to the history (if there is any) void replaceAndAddToHistory(const std::wstring &line); @@ -72,12 +68,12 @@ public: // Irrlicht draw method virtual void draw(); - bool canTakeFocus(gui::IGUIElement* element) { return false; } - virtual bool OnEvent(const SEvent& event); virtual void setVisible(bool visible); + virtual bool acceptsIME() { return true; } + private: void reformatConsole(); void recalculateConsolePosition(); @@ -88,6 +84,9 @@ private: void drawText(); void drawPrompt(); + // If clicked fragment has a web url, send it to the system default web browser + void middleClick(s32 col, s32 row); + private: ChatBackend* m_chat_backend; Client* m_client; @@ -130,4 +129,9 @@ private: // font gui::IGUIFont *m_font = nullptr; v2u32 m_fontsize; + + // Enable clickable chat weblinks + bool m_cache_clickable_chat_weblinks; + // Track if a ctrl key is currently held down + bool m_is_ctrl_down; }; diff --git a/src/gui/guiConfirmRegistration.cpp b/src/gui/guiConfirmRegistration.cpp deleted file mode 100644 index 020a2796a..000000000 --- a/src/gui/guiConfirmRegistration.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/* -Minetest -Copyright (C) 2018 srifqi, Muhammad Rifqi Priyo Susanto - <muhammadrifqipriyosusanto@gmail.com> - -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. -*/ - -#include "guiConfirmRegistration.h" -#include "client/client.h" -#include "guiButton.h" -#include <IGUICheckBox.h> -#include <IGUIButton.h> -#include <IGUIStaticText.h> -#include <IGUIFont.h> -#include "intlGUIEditBox.h" -#include "porting.h" - -#include "gettext.h" - -// Continuing from guiPasswordChange.cpp -const int ID_confirmPassword = 262; -const int ID_confirm = 263; -const int ID_intotext = 264; -const int ID_cancel = 265; -const int ID_message = 266; - -GUIConfirmRegistration::GUIConfirmRegistration(gui::IGUIEnvironment *env, - gui::IGUIElement *parent, s32 id, IMenuManager *menumgr, Client *client, - const std::string &playername, const std::string &password, - bool *aborted, ISimpleTextureSource *tsrc) : - GUIModalMenu(env, parent, id, menumgr), - m_client(client), m_playername(playername), m_password(password), - m_aborted(aborted), m_tsrc(tsrc) -{ -#ifdef __ANDROID__ - m_touchscreen_visible = false; -#endif -} - -GUIConfirmRegistration::~GUIConfirmRegistration() -{ - removeChildren(); -} - -void GUIConfirmRegistration::removeChildren() -{ - const core::list<gui::IGUIElement *> &children = getChildren(); - core::list<gui::IGUIElement *> children_copy; - for (gui::IGUIElement *i : children) - children_copy.push_back(i); - for (gui::IGUIElement *i : children_copy) - i->remove(); -} - -void GUIConfirmRegistration::regenerateGui(v2u32 screensize) -{ - acceptInput(); - removeChildren(); - - /* - Calculate new sizes and positions - */ -#ifdef __ANDROID__ - const float s = m_gui_scale * porting::getDisplayDensity() / 2; -#else - const float s = m_gui_scale; -#endif - DesiredRect = core::rect<s32>( - screensize.X / 2 - 600 * s / 2, - screensize.Y / 2 - 360 * s / 2, - screensize.X / 2 + 600 * s / 2, - screensize.Y / 2 + 360 * s / 2 - ); - recalculateAbsolutePosition(false); - - v2s32 size = DesiredRect.getSize(); - v2s32 topleft_client(0, 0); - - const wchar_t *text; - - /* - Add stuff - */ - s32 ypos = 30 * s; - { - core::rect<s32> rect2(0, 0, 540 * s, 180 * s); - rect2 += topleft_client + v2s32(30 * s, ypos); - static const std::string info_text_template = strgettext( - "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."); - char info_text_buf[1024]; - porting::mt_snprintf(info_text_buf, sizeof(info_text_buf), - info_text_template.c_str(), m_playername.c_str()); - - wchar_t *info_text_buf_wide = utf8_to_wide_c(info_text_buf); - gui::IGUIEditBox *e = new gui::intlGUIEditBox(info_text_buf_wide, true, - Environment, this, ID_intotext, rect2, false, true); - delete[] info_text_buf_wide; - e->drop(); - e->setMultiLine(true); - e->setWordWrap(true); - e->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_CENTER); - } - - ypos += 200 * s; - { - core::rect<s32> rect2(0, 0, 540 * s, 30 * s); - rect2 += topleft_client + v2s32(30 * s, ypos); - gui::IGUIEditBox *e = Environment->addEditBox(m_pass_confirm.c_str(), - rect2, true, this, ID_confirmPassword); - e->setPasswordBox(true); - Environment->setFocus(e); - } - - ypos += 50 * s; - { - core::rect<s32> rect2(0, 0, 230 * s, 35 * s); - rect2 = rect2 + v2s32(size.X / 2 - 220 * s, ypos); - text = wgettext("Register and Join"); - GUIButton::addButton(Environment, rect2, m_tsrc, this, ID_confirm, text); - delete[] text; - } - { - core::rect<s32> rect2(0, 0, 120 * s, 35 * s); - rect2 = rect2 + v2s32(size.X / 2 + 70 * s, ypos); - text = wgettext("Cancel"); - GUIButton::addButton(Environment, rect2, m_tsrc, this, ID_cancel, text); - delete[] text; - } - { - core::rect<s32> rect2(0, 0, 500 * s, 40 * s); - rect2 += topleft_client + v2s32(30 * s, ypos + 40 * s); - text = wgettext("Passwords do not match!"); - IGUIElement *e = Environment->addStaticText( - text, rect2, false, true, this, ID_message); - e->setVisible(false); - delete[] text; - } -} - -void GUIConfirmRegistration::drawMenu() -{ - gui::IGUISkin *skin = Environment->getSkin(); - if (!skin) - return; - video::IVideoDriver *driver = Environment->getVideoDriver(); - - video::SColor bgcolor(140, 0, 0, 0); - driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect); - - gui::IGUIElement::draw(); -#ifdef __ANDROID__ - getAndroidUIInput(); -#endif -} - -void GUIConfirmRegistration::closeMenu(bool goNext) -{ - if (goNext) { - m_client->confirmRegistration(); - } else { - *m_aborted = true; - infostream << "Connect aborted [Escape]" << std::endl; - } - quitMenu(); -} - -void GUIConfirmRegistration::acceptInput() -{ - gui::IGUIElement *e; - e = getElementFromId(ID_confirmPassword); - if (e) - m_pass_confirm = e->getText(); -} - -bool GUIConfirmRegistration::processInput() -{ - std::wstring m_password_ws = narrow_to_wide(m_password); - if (m_password_ws != m_pass_confirm) { - gui::IGUIElement *e = getElementFromId(ID_message); - if (e) - e->setVisible(true); - return false; - } - return true; -} - -bool GUIConfirmRegistration::OnEvent(const SEvent &event) -{ - if (event.EventType == EET_KEY_INPUT_EVENT) { - // clang-format off - if ((event.KeyInput.Key == KEY_ESCAPE || - event.KeyInput.Key == KEY_CANCEL) && - event.KeyInput.PressedDown) { - closeMenu(false); - return true; - } - // clang-format on - if (event.KeyInput.Key == KEY_RETURN && event.KeyInput.PressedDown) { - acceptInput(); - if (processInput()) - closeMenu(true); - return true; - } - } - - if (event.EventType != EET_GUI_EVENT) - return Parent ? Parent->OnEvent(event) : false; - - if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST && isVisible()) { - if (!canTakeFocus(event.GUIEvent.Element)) { - infostream << "GUIConfirmRegistration: Not allowing focus change." - << std::endl; - // Returning true disables focus change - return true; - } - } else if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) { - switch (event.GUIEvent.Caller->getID()) { - case ID_confirm: - acceptInput(); - if (processInput()) - closeMenu(true); - return true; - case ID_cancel: - closeMenu(false); - return true; - } - } else if (event.GUIEvent.EventType == gui::EGET_EDITBOX_ENTER) { - switch (event.GUIEvent.Caller->getID()) { - case ID_confirmPassword: - acceptInput(); - if (processInput()) - closeMenu(true); - return true; - } - } - - return false; -} - -#ifdef __ANDROID__ -bool GUIConfirmRegistration::getAndroidUIInput() -{ - if (!hasAndroidUIInput() || m_jni_field_name != "password") - return false; - - // still waiting - if (porting::getInputDialogState() == -1) - return true; - - m_jni_field_name.clear(); - - gui::IGUIElement *e = getElementFromId(ID_confirmPassword); - - if (!e || e->getType() != irr::gui::EGUIET_EDIT_BOX) - return false; - - std::string text = porting::getInputDialogValue(); - e->setText(utf8_to_wide(text).c_str()); - return false; -} -#endif diff --git a/src/gui/guiConfirmRegistration.h b/src/gui/guiConfirmRegistration.h deleted file mode 100644 index d8387201d..000000000 --- a/src/gui/guiConfirmRegistration.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -Minetest -Copyright (C) 2018 srifqi, Muhammad Rifqi Priyo Susanto - <muhammadrifqipriyosusanto@gmail.com> - -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. -*/ - -#pragma once - -#include "irrlichttypes_extrabloated.h" -#include "modalMenu.h" -#include <string> - -class Client; -class ISimpleTextureSource; - -class GUIConfirmRegistration : public GUIModalMenu -{ -public: - GUIConfirmRegistration(gui::IGUIEnvironment *env, gui::IGUIElement *parent, - s32 id, IMenuManager *menumgr, Client *client, - const std::string &playername, const std::string &password, - bool *aborted, ISimpleTextureSource *tsrc); - ~GUIConfirmRegistration(); - - void removeChildren(); - /* - Remove and re-add (or reposition) stuff - */ - void regenerateGui(v2u32 screensize); - - void drawMenu(); - - void closeMenu(bool goNext); - - void acceptInput(); - - bool processInput(); - - bool OnEvent(const SEvent &event); -#ifdef __ANDROID__ - bool getAndroidUIInput(); -#endif - -private: - std::wstring getLabelByID(s32 id) { return L""; } - std::string getNameByID(s32 id) { return "password"; } - - Client *m_client = nullptr; - const std::string &m_playername; - const std::string &m_password; - bool *m_aborted = nullptr; - std::wstring m_pass_confirm = L""; - ISimpleTextureSource *m_tsrc; -}; diff --git a/src/gui/guiEditBox.cpp b/src/gui/guiEditBox.cpp new file mode 100644 index 000000000..4a0f5013d --- /dev/null +++ b/src/gui/guiEditBox.cpp @@ -0,0 +1,848 @@ +/* +Minetest +Copyright (C) 2021 Minetest + +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. +*/ + +#include "guiEditBox.h" + +#include "IrrCompileConfig.h" +#include "IGUISkin.h" +#include "IGUIEnvironment.h" +#include "IGUIFont.h" + +#include "porting.h" +#include "util/string.h" + +GUIEditBox::~GUIEditBox() +{ + if (m_override_font) + m_override_font->drop(); + + if (m_operator) + m_operator->drop(); + + if (m_vscrollbar) + m_vscrollbar->drop(); +} + +void GUIEditBox::setOverrideFont(IGUIFont *font) +{ + if (m_override_font == font) + return; + + if (m_override_font) + m_override_font->drop(); + + m_override_font = font; + + if (m_override_font) + m_override_font->grab(); + + breakText(); +} + +//! Get the font which is used right now for drawing +IGUIFont *GUIEditBox::getActiveFont() const +{ + if (m_override_font) + return m_override_font; + IGUISkin *skin = Environment->getSkin(); + if (skin) + return skin->getFont(); + return 0; +} + +//! Sets another color for the text. +void GUIEditBox::setOverrideColor(video::SColor color) +{ + m_override_color = color; + m_override_color_enabled = true; +} + +video::SColor GUIEditBox::getOverrideColor() const +{ + return m_override_color; +} + +//! Sets if the text should use the overide color or the color in the gui skin. +void GUIEditBox::enableOverrideColor(bool enable) +{ + m_override_color_enabled = enable; +} + +//! Enables or disables word wrap +void GUIEditBox::setWordWrap(bool enable) +{ + m_word_wrap = enable; + breakText(); +} + +//! Enables or disables newlines. +void GUIEditBox::setMultiLine(bool enable) +{ + m_multiline = enable; +} + +//! Enables or disables automatic scrolling with cursor position +//! \param enable: If set to true, the text will move around with the cursor position +void GUIEditBox::setAutoScroll(bool enable) +{ + m_autoscroll = enable; +} + +void GUIEditBox::setPasswordBox(bool password_box, wchar_t password_char) +{ + m_passwordbox = password_box; + if (m_passwordbox) { + m_passwordchar = password_char; + setMultiLine(false); + setWordWrap(false); + m_broken_text.clear(); + } +} + +//! Sets text justification +void GUIEditBox::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) +{ + m_halign = horizontal; + m_valign = vertical; +} + +//! Sets the new caption of this element. +void GUIEditBox::setText(const wchar_t *text) +{ + Text = text; + if (u32(m_cursor_pos) > Text.size()) + m_cursor_pos = Text.size(); + m_hscroll_pos = 0; + breakText(); +} + +//! Sets the maximum amount of characters which may be entered in the box. +//! \param max: Maximum amount of characters. If 0, the character amount is +//! infinity. +void GUIEditBox::setMax(u32 max) +{ + m_max = max; + + if (Text.size() > m_max && m_max != 0) + Text = Text.subString(0, m_max); +} + +//! Gets the area of the text in the edit box +//! \return Returns the size in pixels of the text +core::dimension2du GUIEditBox::getTextDimension() +{ + core::rect<s32> ret; + + setTextRect(0); + ret = m_current_text_rect; + + for (u32 i = 1; i < m_broken_text.size(); ++i) { + setTextRect(i); + ret.addInternalPoint(m_current_text_rect.UpperLeftCorner); + ret.addInternalPoint(m_current_text_rect.LowerRightCorner); + } + + return core::dimension2du(ret.getSize()); +} + +//! Turns the border on or off +void GUIEditBox::setDrawBorder(bool border) +{ + m_border = border; +} + +void GUIEditBox::setWritable(bool can_write_text) +{ + m_writable = can_write_text; +} + +//! set text markers +void GUIEditBox::setTextMarkers(s32 begin, s32 end) +{ + if (begin != m_mark_begin || end != m_mark_end) { + m_mark_begin = begin; + m_mark_end = end; + sendGuiEvent(EGET_EDITBOX_MARKING_CHANGED); + } +} + +//! send some gui event to parent +void GUIEditBox::sendGuiEvent(EGUI_EVENT_TYPE type) +{ + if (Parent) { + SEvent e; + e.EventType = EET_GUI_EVENT; + e.GUIEvent.Caller = this; + e.GUIEvent.Element = 0; + e.GUIEvent.EventType = type; + + Parent->OnEvent(e); + } +} + +//! called if an event happened. +bool GUIEditBox::OnEvent(const SEvent &event) +{ + if (isEnabled()) { + + switch (event.EventType) { + case EET_GUI_EVENT: + if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST) { + if (event.GUIEvent.Caller == this) { + m_mouse_marking = false; + setTextMarkers(0, 0); + } + } + break; + case EET_KEY_INPUT_EVENT: + if (processKey(event)) + return true; + break; + case EET_MOUSE_INPUT_EVENT: + if (processMouse(event)) + return true; + break; +#if (IRRLICHT_VERSION_MT_REVISION >= 2) + case EET_STRING_INPUT_EVENT: + inputString(*event.StringInput.Str); + return true; +#endif + default: + break; + } + } + + return IGUIElement::OnEvent(event); +} + +bool GUIEditBox::processKey(const SEvent &event) +{ + if (!event.KeyInput.PressedDown) + return false; + + bool text_changed = false; + s32 new_mark_begin = m_mark_begin; + s32 new_mark_end = m_mark_end; + + // control shortcut handling + if (event.KeyInput.Control) { + + // german backlash '\' entered with control + '?' + if (event.KeyInput.Char == '\\') { + inputChar(event.KeyInput.Char); + return true; + } + + switch (event.KeyInput.Key) { + case KEY_KEY_A: + // select all + new_mark_begin = 0; + new_mark_end = Text.size(); + break; + case KEY_KEY_C: + onKeyControlC(event); + break; + case KEY_KEY_X: + text_changed = onKeyControlX(event, new_mark_begin, new_mark_end); + break; + case KEY_KEY_V: + text_changed = onKeyControlV(event, new_mark_begin, new_mark_end); + break; + case KEY_HOME: + // move/highlight to start of text + if (event.KeyInput.Shift) { + new_mark_end = m_cursor_pos; + new_mark_begin = 0; + m_cursor_pos = 0; + } else { + m_cursor_pos = 0; + new_mark_begin = 0; + new_mark_end = 0; + } + break; + case KEY_END: + // move/highlight to end of text + if (event.KeyInput.Shift) { + new_mark_begin = m_cursor_pos; + new_mark_end = Text.size(); + m_cursor_pos = 0; + } else { + m_cursor_pos = Text.size(); + new_mark_begin = 0; + new_mark_end = 0; + } + break; + default: + return false; + } + } else { + switch (event.KeyInput.Key) { + case KEY_END: { + s32 p = Text.size(); + if (m_word_wrap || m_multiline) { + p = getLineFromPos(m_cursor_pos); + p = m_broken_text_positions[p] + + (s32)m_broken_text[p].size(); + if (p > 0 && (Text[p - 1] == L'\r' || + Text[p - 1] == L'\n')) + p -= 1; + } + + if (event.KeyInput.Shift) { + if (m_mark_begin == m_mark_end) + new_mark_begin = m_cursor_pos; + + new_mark_end = p; + } else { + new_mark_begin = 0; + new_mark_end = 0; + } + m_cursor_pos = p; + m_blink_start_time = porting::getTimeMs(); + } break; + case KEY_HOME: { + + s32 p = 0; + if (m_word_wrap || m_multiline) { + p = getLineFromPos(m_cursor_pos); + p = m_broken_text_positions[p]; + } + + if (event.KeyInput.Shift) { + if (m_mark_begin == m_mark_end) + new_mark_begin = m_cursor_pos; + new_mark_end = p; + } else { + new_mark_begin = 0; + new_mark_end = 0; + } + m_cursor_pos = p; + m_blink_start_time = porting::getTimeMs(); + } break; + case KEY_RETURN: + if (m_multiline) { + inputChar(L'\n'); + } else { + calculateScrollPos(); + sendGuiEvent(EGET_EDITBOX_ENTER); + } + return true; + case KEY_LEFT: + if (event.KeyInput.Shift) { + if (m_cursor_pos > 0) { + if (m_mark_begin == m_mark_end) + new_mark_begin = m_cursor_pos; + + new_mark_end = m_cursor_pos - 1; + } + } else { + new_mark_begin = 0; + new_mark_end = 0; + } + + if (m_cursor_pos > 0) + m_cursor_pos--; + m_blink_start_time = porting::getTimeMs(); + break; + case KEY_RIGHT: + if (event.KeyInput.Shift) { + if (Text.size() > (u32)m_cursor_pos) { + if (m_mark_begin == m_mark_end) + new_mark_begin = m_cursor_pos; + + new_mark_end = m_cursor_pos + 1; + } + } else { + new_mark_begin = 0; + new_mark_end = 0; + } + + if (Text.size() > (u32)m_cursor_pos) + m_cursor_pos++; + m_blink_start_time = porting::getTimeMs(); + break; + case KEY_UP: + if (!onKeyUp(event, new_mark_begin, new_mark_end)) { + return false; + } + break; + case KEY_DOWN: + if (!onKeyDown(event, new_mark_begin, new_mark_end)) { + return false; + } + break; + case KEY_BACK: + text_changed = onKeyBack(event, new_mark_begin, new_mark_end); + break; + + case KEY_DELETE: + text_changed = onKeyDelete(event, new_mark_begin, new_mark_end); + break; + + case KEY_ESCAPE: + case KEY_TAB: + case KEY_SHIFT: + case KEY_F1: + case KEY_F2: + case KEY_F3: + case KEY_F4: + case KEY_F5: + case KEY_F6: + case KEY_F7: + case KEY_F8: + case KEY_F9: + case KEY_F10: + case KEY_F11: + case KEY_F12: + case KEY_F13: + case KEY_F14: + case KEY_F15: + case KEY_F16: + case KEY_F17: + case KEY_F18: + case KEY_F19: + case KEY_F20: + case KEY_F21: + case KEY_F22: + case KEY_F23: + case KEY_F24: + // ignore these keys + return false; + + default: + inputChar(event.KeyInput.Char); + return true; + } + } + + // Set new text markers + setTextMarkers(new_mark_begin, new_mark_end); + + // break the text if it has changed + if (text_changed) { + breakText(); + sendGuiEvent(EGET_EDITBOX_CHANGED); + } + + calculateScrollPos(); + + return true; +} + +bool GUIEditBox::onKeyUp(const SEvent &event, s32 &mark_begin, s32 &mark_end) +{ + // clang-format off + if (m_multiline || (m_word_wrap && m_broken_text.size() > 1)) { + s32 lineNo = getLineFromPos(m_cursor_pos); + s32 mb = (m_mark_begin == m_mark_end) ? m_cursor_pos : + (m_mark_begin > m_mark_end ? m_mark_begin : m_mark_end); + if (lineNo > 0) { + s32 cp = m_cursor_pos - m_broken_text_positions[lineNo]; + if ((s32)m_broken_text[lineNo - 1].size() < cp) { + m_cursor_pos = m_broken_text_positions[lineNo - 1] + + core::max_((u32)1, m_broken_text[lineNo - 1].size()) - 1; + } + else + m_cursor_pos = m_broken_text_positions[lineNo - 1] + cp; + } + + if (event.KeyInput.Shift) { + mark_begin = mb; + mark_end = m_cursor_pos; + } else { + mark_begin = 0; + mark_end = 0; + } + + return true; + } + + // clang-format on + return false; +} + +bool GUIEditBox::onKeyDown(const SEvent &event, s32 &mark_begin, s32 &mark_end) +{ + // clang-format off + if (m_multiline || (m_word_wrap && m_broken_text.size() > 1)) { + s32 lineNo = getLineFromPos(m_cursor_pos); + s32 mb = (m_mark_begin == m_mark_end) ? m_cursor_pos : + (m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end); + if (lineNo < (s32)m_broken_text.size() - 1) { + s32 cp = m_cursor_pos - m_broken_text_positions[lineNo]; + if ((s32)m_broken_text[lineNo + 1].size() < cp) { + m_cursor_pos = m_broken_text_positions[lineNo + 1] + + core::max_((u32)1, m_broken_text[lineNo + 1].size()) - 1; + } + else + m_cursor_pos = m_broken_text_positions[lineNo + 1] + cp; + } + + if (event.KeyInput.Shift) { + mark_begin = mb; + mark_end = m_cursor_pos; + } else { + mark_begin = 0; + mark_end = 0; + } + + return true; + } + + // clang-format on + return false; +} + +void GUIEditBox::onKeyControlC(const SEvent &event) +{ + // copy to clipboard + if (m_passwordbox || !m_operator || m_mark_begin == m_mark_end) + return; + + const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; + const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; + + std::string s = stringw_to_utf8(Text.subString(realmbgn, realmend - realmbgn)); + m_operator->copyToClipboard(s.c_str()); +} + +bool GUIEditBox::onKeyControlX(const SEvent &event, s32 &mark_begin, s32 &mark_end) +{ + // First copy to clipboard + onKeyControlC(event); + + if (!m_writable) + return false; + + if (m_passwordbox || !m_operator || m_mark_begin == m_mark_end) + return false; + + const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; + const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; + + // Now remove from box if enabled + if (isEnabled()) { + // delete + core::stringw s; + s = Text.subString(0, realmbgn); + s.append(Text.subString(realmend, Text.size() - realmend)); + Text = s; + + m_cursor_pos = realmbgn; + mark_begin = 0; + mark_end = 0; + return true; + } + + return false; +} + +bool GUIEditBox::onKeyControlV(const SEvent &event, s32 &mark_begin, s32 &mark_end) +{ + if (!isEnabled() || !m_writable) + return false; + + // paste from the clipboard + if (!m_operator) + return false; + + const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; + const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; + + // add new character + if (const c8 *p = m_operator->getTextFromClipboard()) { + core::stringw inserted_text = utf8_to_stringw(p); + if (m_mark_begin == m_mark_end) { + // insert text + core::stringw s = Text.subString(0, m_cursor_pos); + s.append(inserted_text); + s.append(Text.subString( + m_cursor_pos, Text.size() - m_cursor_pos)); + + if (!m_max || s.size() <= m_max) { + Text = s; + m_cursor_pos += inserted_text.size(); + } + } else { + // replace text + + core::stringw s = Text.subString(0, realmbgn); + s.append(inserted_text); + s.append(Text.subString(realmend, Text.size() - realmend)); + + if (!m_max || s.size() <= m_max) { + Text = s; + m_cursor_pos = realmbgn + inserted_text.size(); + } + } + } + + mark_begin = 0; + mark_end = 0; + return true; +} + +bool GUIEditBox::onKeyBack(const SEvent &event, s32 &mark_begin, s32 &mark_end) +{ + if (!isEnabled() || Text.empty() || !m_writable) + return false; + + core::stringw s; + + if (m_mark_begin != m_mark_end) { + // delete marked text + const s32 realmbgn = + m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; + const s32 realmend = + m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; + + s = Text.subString(0, realmbgn); + s.append(Text.subString(realmend, Text.size() - realmend)); + Text = s; + + m_cursor_pos = realmbgn; + } else { + // delete text behind cursor + if (m_cursor_pos > 0) + s = Text.subString(0, m_cursor_pos - 1); + else + s = L""; + s.append(Text.subString(m_cursor_pos, Text.size() - m_cursor_pos)); + Text = s; + --m_cursor_pos; + } + + if (m_cursor_pos < 0) + m_cursor_pos = 0; + m_blink_start_time = porting::getTimeMs(); // os::Timer::getTime(); + mark_begin = 0; + mark_end = 0; + return true; +} + +bool GUIEditBox::onKeyDelete(const SEvent &event, s32 &mark_begin, s32 &mark_end) +{ + if (!isEnabled() || Text.empty() || !m_writable) + return false; + + core::stringw s; + + if (m_mark_begin != m_mark_end) { + // delete marked text + const s32 realmbgn = + m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; + const s32 realmend = + m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; + + s = Text.subString(0, realmbgn); + s.append(Text.subString(realmend, Text.size() - realmend)); + Text = s; + + m_cursor_pos = realmbgn; + } else { + // delete text before cursor + s = Text.subString(0, m_cursor_pos); + s.append(Text.subString( + m_cursor_pos + 1, Text.size() - m_cursor_pos - 1)); + Text = s; + } + + if (m_cursor_pos > (s32)Text.size()) + m_cursor_pos = (s32)Text.size(); + + m_blink_start_time = porting::getTimeMs(); // os::Timer::getTime(); + mark_begin = 0; + mark_end = 0; + return true; +} + +void GUIEditBox::inputChar(wchar_t c) +{ + if (c == 0) + return; + core::stringw s(&c, 1); + inputString(s); +} + +void GUIEditBox::inputString(const core::stringw &str) +{ + if (!isEnabled() || !m_writable) + return; + + u32 len = str.size(); + if (Text.size()+len <= m_max || m_max == 0) { + core::stringw s; + if (m_mark_begin != m_mark_end) { + // replace marked text + s32 real_begin = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; + s32 real_end = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; + + s = Text.subString(0, real_begin); + s.append(str); + s.append(Text.subString(real_end, Text.size() - real_end)); + Text = s; + m_cursor_pos = real_begin + len; + } else { + // append string + s = Text.subString(0, m_cursor_pos); + s.append(str); + s.append(Text.subString(m_cursor_pos, + Text.size() - m_cursor_pos)); + Text = s; + m_cursor_pos += len; + } + + m_blink_start_time = porting::getTimeMs(); + setTextMarkers(0, 0); + } + + breakText(); + sendGuiEvent(EGET_EDITBOX_CHANGED); + calculateScrollPos(); +} + +bool GUIEditBox::processMouse(const SEvent &event) +{ + switch (event.MouseInput.Event) { + case irr::EMIE_LMOUSE_LEFT_UP: + if (Environment->hasFocus(this)) { + m_cursor_pos = getCursorPos( + event.MouseInput.X, event.MouseInput.Y); + if (m_mouse_marking) { + setTextMarkers(m_mark_begin, m_cursor_pos); + } + m_mouse_marking = false; + calculateScrollPos(); + return true; + } + break; + case irr::EMIE_MOUSE_MOVED: { + if (m_mouse_marking) { + m_cursor_pos = getCursorPos( + event.MouseInput.X, event.MouseInput.Y); + setTextMarkers(m_mark_begin, m_cursor_pos); + calculateScrollPos(); + return true; + } + } break; + case EMIE_LMOUSE_PRESSED_DOWN: + + if (!Environment->hasFocus(this)) { + m_blink_start_time = porting::getTimeMs(); + m_mouse_marking = true; + m_cursor_pos = getCursorPos( + event.MouseInput.X, event.MouseInput.Y); + setTextMarkers(m_cursor_pos, m_cursor_pos); + calculateScrollPos(); + return true; + } else { + if (!AbsoluteClippingRect.isPointInside(core::position2d<s32>( + event.MouseInput.X, event.MouseInput.Y))) { + return false; + } else { + // move cursor + m_cursor_pos = getCursorPos( + event.MouseInput.X, event.MouseInput.Y); + + s32 newMarkBegin = m_mark_begin; + if (!m_mouse_marking) + newMarkBegin = m_cursor_pos; + + m_mouse_marking = true; + setTextMarkers(newMarkBegin, m_cursor_pos); + calculateScrollPos(); + return true; + } + } + case EMIE_MOUSE_WHEEL: + if (m_vscrollbar && m_vscrollbar->isVisible()) { + s32 pos = m_vscrollbar->getPos(); + s32 step = m_vscrollbar->getSmallStep(); + m_vscrollbar->setPos(pos - event.MouseInput.Wheel * step); + return true; + } + break; + default: + break; + } + + return false; +} + +s32 GUIEditBox::getLineFromPos(s32 pos) +{ + if (!m_word_wrap && !m_multiline) + return 0; + + s32 i = 0; + while (i < (s32)m_broken_text_positions.size()) { + if (m_broken_text_positions[i] > pos) + return i - 1; + ++i; + } + return (s32)m_broken_text_positions.size() - 1; +} + +void GUIEditBox::updateVScrollBar() +{ + if (!m_vscrollbar) { + return; + } + + // OnScrollBarChanged(...) + if (m_vscrollbar->getPos() != m_vscroll_pos) { + s32 deltaScrollY = m_vscrollbar->getPos() - m_vscroll_pos; + m_current_text_rect.UpperLeftCorner.Y -= deltaScrollY; + m_current_text_rect.LowerRightCorner.Y -= deltaScrollY; + + s32 scrollymax = getTextDimension().Height - m_frame_rect.getHeight(); + if (scrollymax != m_vscrollbar->getMax()) { + // manage a newline or a deleted line + m_vscrollbar->setMax(scrollymax); + m_vscrollbar->setPageSize(s32(getTextDimension().Height)); + calculateScrollPos(); + } else { + // manage a newline or a deleted line + m_vscroll_pos = m_vscrollbar->getPos(); + } + } + + // check if a vertical scrollbar is needed ? + if (getTextDimension().Height > (u32)m_frame_rect.getHeight()) { + m_frame_rect.LowerRightCorner.X -= m_scrollbar_width; + + s32 scrollymax = getTextDimension().Height - m_frame_rect.getHeight(); + if (scrollymax != m_vscrollbar->getMax()) { + m_vscrollbar->setMax(scrollymax); + m_vscrollbar->setPageSize(s32(getTextDimension().Height)); + } + + if (!m_vscrollbar->isVisible()) { + m_vscrollbar->setVisible(true); + } + } else { + if (m_vscrollbar->isVisible()) { + m_vscrollbar->setVisible(false); + m_vscroll_pos = 0; + m_vscrollbar->setPos(0); + m_vscrollbar->setMax(1); + m_vscrollbar->setPageSize(s32(getTextDimension().Height)); + } + } +} diff --git a/src/gui/guiEditBox.h b/src/gui/guiEditBox.h new file mode 100644 index 000000000..4c7413f54 --- /dev/null +++ b/src/gui/guiEditBox.h @@ -0,0 +1,215 @@ +/* +Minetest +Copyright (C) 2021 Minetest + +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. +*/ + +#pragma once + +#include "irrlichttypes.h" +#include "IGUIEditBox.h" +#include "IOSOperator.h" +#include "guiScrollBar.h" +#include <vector> + +using namespace irr; +using namespace irr::gui; + +class GUIEditBox : public IGUIEditBox +{ +public: + GUIEditBox(IGUIEnvironment *environment, IGUIElement *parent, s32 id, + core::rect<s32> rectangle, bool border, bool writable) : + IGUIEditBox(environment, parent, id, rectangle), + m_border(border), m_writable(writable), m_frame_rect(rectangle) + { + } + + virtual ~GUIEditBox(); + + //! Sets another skin independent font. + virtual void setOverrideFont(IGUIFont *font = 0); + + virtual IGUIFont *getOverrideFont() const { return m_override_font; } + + //! Get the font which is used right now for drawing + /** Currently this is the override font when one is set and the + font of the active skin otherwise */ + virtual IGUIFont *getActiveFont() const; + + //! Sets another color for the text. + virtual void setOverrideColor(video::SColor color); + + //! Gets the override color + virtual video::SColor getOverrideColor() const; + + //! Sets if the text should use the overide color or the + //! color in the gui skin. + virtual void enableOverrideColor(bool enable); + + //! Checks if an override color is enabled + /** \return true if the override color is enabled, false otherwise */ + virtual bool isOverrideColorEnabled(void) const + { + return m_override_color_enabled; + } + + //! Enables or disables word wrap for using the edit box as multiline text editor. + virtual void setWordWrap(bool enable); + + //! Checks if word wrap is enabled + //! \return true if word wrap is enabled, false otherwise + virtual bool isWordWrapEnabled() const { return m_word_wrap; } + + //! Turns the border on or off + virtual void setDrawBorder(bool border); + + virtual bool isDrawBorderEnabled() const { return m_border; } + + //! Enables or disables newlines. + /** \param enable: If set to true, the EGET_EDITBOX_ENTER event will not be fired, + instead a newline character will be inserted. */ + virtual void setMultiLine(bool enable); + + //! Checks if multi line editing is enabled + //! \return true if mult-line is enabled, false otherwise + virtual bool isMultiLineEnabled() const { return m_multiline; } + + //! Enables or disables automatic scrolling with cursor position + //! \param enable: If set to true, the text will move around with the cursor + //! position + virtual void setAutoScroll(bool enable); + + //! Checks to see if automatic scrolling is enabled + //! \return true if automatic scrolling is enabled, false if not + virtual bool isAutoScrollEnabled() const { return m_autoscroll; } + + //! Sets whether the edit box is a password box. Setting this to true will + /** disable MultiLine, WordWrap and the ability to copy with ctrl+c or ctrl+x + \param passwordBox: true to enable password, false to disable + \param passwordChar: the character that is displayed instead of letters */ + virtual void setPasswordBox(bool passwordBox, wchar_t passwordChar = L'*'); + + //! Returns true if the edit box is currently a password box. + virtual bool isPasswordBox() const { return m_passwordbox; } + + //! Sets text justification + virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical); + + //! Sets the new caption of this element. + virtual void setText(const wchar_t *text); + + //! Sets the maximum amount of characters which may be entered in the box. + //! \param max: Maximum amount of characters. If 0, the character amount is + //! infinity. + virtual void setMax(u32 max); + + //! Returns maximum amount of characters, previously set by setMax(); + virtual u32 getMax() const { return m_max; } + + //! Gets the size area of the text in the edit box + //! \return Returns the size in pixels of the text + virtual core::dimension2du getTextDimension(); + + //! set true if this EditBox is writable + virtual void setWritable(bool can_write_text); + + //! called if an event happened. + virtual bool OnEvent(const SEvent &event); + + virtual bool acceptsIME() { return isEnabled() && m_writable; }; + +protected: + virtual void breakText() = 0; + + //! sets the area of the given line + virtual void setTextRect(s32 line) = 0; + + //! set text markers + void setTextMarkers(s32 begin, s32 end); + + //! send some gui event to parent + void sendGuiEvent(EGUI_EVENT_TYPE type); + + //! calculates the current scroll position + virtual void calculateScrollPos() = 0; + + virtual s32 getCursorPos(s32 x, s32 y) = 0; + + bool processKey(const SEvent &event); + virtual void inputString(const core::stringw &str); + virtual void inputChar(wchar_t c); + + //! returns the line number that the cursor is on + s32 getLineFromPos(s32 pos); + + //! update the vertical scrollBar (visibilty & position) + void updateVScrollBar(); + + gui::IGUIFont *m_override_font = nullptr; + + bool m_override_color_enabled = false; + bool m_word_wrap = false; + bool m_multiline = false; + bool m_autoscroll = true; + + bool m_border; + + bool m_passwordbox = false; + wchar_t m_passwordchar = L'*'; + + std::vector<core::stringw> m_broken_text; + std::vector<s32> m_broken_text_positions; + + EGUI_ALIGNMENT m_halign = EGUIA_UPPERLEFT; + EGUI_ALIGNMENT m_valign = EGUIA_CENTER; + + u32 m_blink_start_time = 0; + s32 m_cursor_pos = 0; + s32 m_hscroll_pos = 0; + s32 m_vscroll_pos = 0; // scroll position in characters + u32 m_max = 0; + + video::SColor m_override_color = video::SColor(101, 255, 255, 255); + + core::rect<s32> m_current_text_rect = core::rect<s32>(0, 0, 1, 1); + + bool m_writable; + + bool m_mouse_marking = false; + + s32 m_mark_begin = 0; + s32 m_mark_end = 0; + + gui::IGUIFont *m_last_break_font = nullptr; + IOSOperator *m_operator = nullptr; + + core::rect<s32> m_frame_rect; // temporary values + + u32 m_scrollbar_width = 0; + GUIScrollBar *m_vscrollbar = nullptr; + +private: + bool processMouse(const SEvent &event); + + bool onKeyUp(const SEvent &event, s32 &mark_begin, s32 &mark_end); + bool onKeyDown(const SEvent &event, s32 &mark_begin, s32 &mark_end); + void onKeyControlC(const SEvent &event); + bool onKeyControlX(const SEvent &event, s32 &mark_begin, s32 &mark_end); + bool onKeyControlV(const SEvent &event, s32 &mark_begin, s32 &mark_end); + bool onKeyBack(const SEvent &event, s32 &mark_begin, s32 &mark_end); + bool onKeyDelete(const SEvent &event, s32 &mark_begin, s32 &mark_end); +}; diff --git a/src/gui/guiEditBoxWithScrollbar.cpp b/src/gui/guiEditBoxWithScrollbar.cpp index 442406688..1b7f7832a 100644 --- a/src/gui/guiEditBoxWithScrollbar.cpp +++ b/src/gui/guiEditBoxWithScrollbar.cpp @@ -22,20 +22,12 @@ optional? dragging selected text numerical */ - //! constructor GUIEditBoxWithScrollBar::GUIEditBoxWithScrollBar(const wchar_t* text, bool border, IGUIEnvironment* environment, IGUIElement* parent, s32 id, const core::rect<s32>& rectangle, bool writable, bool has_vscrollbar) - : IGUIEditBox(environment, parent, id, rectangle), m_mouse_marking(false), - m_border(border), m_background(true), m_override_color_enabled(false), m_mark_begin(0), m_mark_end(0), - m_override_color(video::SColor(101, 255, 255, 255)), m_override_font(0), m_last_break_font(0), - m_operator(0), m_blink_start_time(0), m_cursor_pos(0), m_hscroll_pos(0), m_vscroll_pos(0), m_max(0), - m_word_wrap(false), m_multiline(false), m_autoscroll(true), m_passwordbox(false), - m_passwordchar(L'*'), m_halign(EGUIA_UPPERLEFT), m_valign(EGUIA_CENTER), - m_current_text_rect(0, 0, 1, 1), m_frame_rect(rectangle), - m_scrollbar_width(0), m_vscrollbar(NULL), m_writable(writable), - m_bg_color_used(false) + : GUIEditBox(environment, parent, id, rectangle, border, writable), + m_background(true), m_bg_color_used(false) { #ifdef _DEBUG setDebugName("GUIEditBoxWithScrollBar"); @@ -65,99 +57,12 @@ GUIEditBoxWithScrollBar::GUIEditBoxWithScrollBar(const wchar_t* text, bool borde setWritable(writable); } - -//! destructor -GUIEditBoxWithScrollBar::~GUIEditBoxWithScrollBar() -{ - if (m_override_font) - m_override_font->drop(); - - if (m_operator) - m_operator->drop(); - - if (m_vscrollbar) - m_vscrollbar->drop(); -} - - -//! Sets another skin independent font. -void GUIEditBoxWithScrollBar::setOverrideFont(IGUIFont* font) -{ - if (m_override_font == font) - return; - - if (m_override_font) - m_override_font->drop(); - - m_override_font = font; - - if (m_override_font) - m_override_font->grab(); - - breakText(); -} - -//! Gets the override font (if any) -IGUIFont * GUIEditBoxWithScrollBar::getOverrideFont() const -{ - return m_override_font; -} - -//! Get the font which is used right now for drawing -IGUIFont* GUIEditBoxWithScrollBar::getActiveFont() const -{ - if (m_override_font) - return m_override_font; - IGUISkin* skin = Environment->getSkin(); - if (skin) - return skin->getFont(); - return 0; -} - -//! Sets another color for the text. -void GUIEditBoxWithScrollBar::setOverrideColor(video::SColor color) -{ - m_override_color = color; - m_override_color_enabled = true; -} - - -video::SColor GUIEditBoxWithScrollBar::getOverrideColor() const -{ - return m_override_color; -} - - -//! Turns the border on or off -void GUIEditBoxWithScrollBar::setDrawBorder(bool border) -{ - m_border = border; -} - //! Sets whether to draw the background void GUIEditBoxWithScrollBar::setDrawBackground(bool draw) { m_background = draw; } -//! Sets if the text should use the overide color or the color in the gui skin. -void GUIEditBoxWithScrollBar::enableOverrideColor(bool enable) -{ - m_override_color_enabled = enable; -} - -bool GUIEditBoxWithScrollBar::isOverrideColorEnabled() const -{ - return m_override_color_enabled; -} - -//! Enables or disables word wrap -void GUIEditBoxWithScrollBar::setWordWrap(bool enable) -{ - m_word_wrap = enable; - breakText(); -} - void GUIEditBoxWithScrollBar::updateAbsolutePosition() { @@ -170,486 +75,6 @@ void GUIEditBoxWithScrollBar::updateAbsolutePosition() } } -//! Checks if word wrap is enabled -bool GUIEditBoxWithScrollBar::isWordWrapEnabled() const -{ - return m_word_wrap; -} - - -//! Enables or disables newlines. -void GUIEditBoxWithScrollBar::setMultiLine(bool enable) -{ - m_multiline = enable; -} - - -//! Checks if multi line editing is enabled -bool GUIEditBoxWithScrollBar::isMultiLineEnabled() const -{ - return m_multiline; -} - - -void GUIEditBoxWithScrollBar::setPasswordBox(bool password_box, wchar_t password_char) -{ - m_passwordbox = password_box; - if (m_passwordbox) { - m_passwordchar = password_char; - setMultiLine(false); - setWordWrap(false); - m_broken_text.clear(); - } -} - - -bool GUIEditBoxWithScrollBar::isPasswordBox() const -{ - return m_passwordbox; -} - - -//! Sets text justification -void GUIEditBoxWithScrollBar::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) -{ - m_halign = horizontal; - m_valign = vertical; -} - - -//! called if an event happened. -bool GUIEditBoxWithScrollBar::OnEvent(const SEvent& event) -{ - if (isEnabled()) { - switch (event.EventType) - { - case EET_GUI_EVENT: - if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST) { - if (event.GUIEvent.Caller == this) { - m_mouse_marking = false; - setTextMarkers(0, 0); - } - } - break; - case EET_KEY_INPUT_EVENT: - if (processKey(event)) - return true; - break; - case EET_MOUSE_INPUT_EVENT: - if (processMouse(event)) - return true; - break; - default: - break; - } - } - - return IGUIElement::OnEvent(event); -} - - -bool GUIEditBoxWithScrollBar::processKey(const SEvent& event) -{ - if (!m_writable) { - return false; - } - - if (!event.KeyInput.PressedDown) - return false; - - bool text_changed = false; - s32 new_mark_begin = m_mark_begin; - s32 new_mark_end = m_mark_end; - - // control shortcut handling - - if (event.KeyInput.Control) { - - // german backlash '\' entered with control + '?' - if (event.KeyInput.Char == '\\') { - inputChar(event.KeyInput.Char); - return true; - } - - switch (event.KeyInput.Key) { - case KEY_KEY_A: - // select all - new_mark_begin = 0; - new_mark_end = Text.size(); - break; - case KEY_KEY_C: - // copy to clipboard - if (!m_passwordbox && m_operator && m_mark_begin != m_mark_end) - { - const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; - const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; - - core::stringc s; - s = Text.subString(realmbgn, realmend - realmbgn).c_str(); - m_operator->copyToClipboard(s.c_str()); - } - break; - case KEY_KEY_X: - // cut to the clipboard - if (!m_passwordbox && m_operator && m_mark_begin != m_mark_end) { - const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; - const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; - - // copy - core::stringc sc; - sc = Text.subString(realmbgn, realmend - realmbgn).c_str(); - m_operator->copyToClipboard(sc.c_str()); - - if (isEnabled()) - { - // delete - core::stringw s; - s = Text.subString(0, realmbgn); - s.append(Text.subString(realmend, Text.size() - realmend)); - Text = s; - - m_cursor_pos = realmbgn; - new_mark_begin = 0; - new_mark_end = 0; - text_changed = true; - } - } - break; - case KEY_KEY_V: - if (!isEnabled()) - break; - - // paste from the clipboard - if (m_operator) { - const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; - const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; - - // add new character - const c8* p = m_operator->getTextFromClipboard(); - if (p) { - if (m_mark_begin == m_mark_end) { - // insert text - core::stringw s = Text.subString(0, m_cursor_pos); - s.append(p); - s.append(Text.subString(m_cursor_pos, Text.size() - m_cursor_pos)); - - if (!m_max || s.size() <= m_max) // thx to Fish FH for fix - { - Text = s; - s = p; - m_cursor_pos += s.size(); - } - } else { - // replace text - - core::stringw s = Text.subString(0, realmbgn); - s.append(p); - s.append(Text.subString(realmend, Text.size() - realmend)); - - if (!m_max || s.size() <= m_max) // thx to Fish FH for fix - { - Text = s; - s = p; - m_cursor_pos = realmbgn + s.size(); - } - } - } - - new_mark_begin = 0; - new_mark_end = 0; - text_changed = true; - } - break; - case KEY_HOME: - // move/highlight to start of text - if (event.KeyInput.Shift) { - new_mark_end = m_cursor_pos; - new_mark_begin = 0; - m_cursor_pos = 0; - } else { - m_cursor_pos = 0; - new_mark_begin = 0; - new_mark_end = 0; - } - break; - case KEY_END: - // move/highlight to end of text - if (event.KeyInput.Shift) { - new_mark_begin = m_cursor_pos; - new_mark_end = Text.size(); - m_cursor_pos = 0; - } else { - m_cursor_pos = Text.size(); - new_mark_begin = 0; - new_mark_end = 0; - } - break; - default: - return false; - } - } - // default keyboard handling - else - switch (event.KeyInput.Key) { - case KEY_END: - { - s32 p = Text.size(); - if (m_word_wrap || m_multiline) { - p = getLineFromPos(m_cursor_pos); - p = m_broken_text_positions[p] + (s32)m_broken_text[p].size(); - if (p > 0 && (Text[p - 1] == L'\r' || Text[p - 1] == L'\n')) - p -= 1; - } - - if (event.KeyInput.Shift) { - if (m_mark_begin == m_mark_end) - new_mark_begin = m_cursor_pos; - - new_mark_end = p; - } else { - new_mark_begin = 0; - new_mark_end = 0; - } - m_cursor_pos = p; - m_blink_start_time = porting::getTimeMs(); - } - break; - case KEY_HOME: - { - - s32 p = 0; - if (m_word_wrap || m_multiline) { - p = getLineFromPos(m_cursor_pos); - p = m_broken_text_positions[p]; - } - - if (event.KeyInput.Shift) { - if (m_mark_begin == m_mark_end) - new_mark_begin = m_cursor_pos; - new_mark_end = p; - } else { - new_mark_begin = 0; - new_mark_end = 0; - } - m_cursor_pos = p; - m_blink_start_time = porting::getTimeMs(); - } - break; - case KEY_RETURN: - if (m_multiline) { - inputChar(L'\n'); - } else { - calculateScrollPos(); - sendGuiEvent(EGET_EDITBOX_ENTER); - } - return true; - case KEY_LEFT: - - if (event.KeyInput.Shift) { - if (m_cursor_pos > 0) { - if (m_mark_begin == m_mark_end) - new_mark_begin = m_cursor_pos; - - new_mark_end = m_cursor_pos - 1; - } - } else { - new_mark_begin = 0; - new_mark_end = 0; - } - - if (m_cursor_pos > 0) - m_cursor_pos--; - m_blink_start_time = porting::getTimeMs(); - break; - - case KEY_RIGHT: - if (event.KeyInput.Shift) { - if (Text.size() > (u32)m_cursor_pos) { - if (m_mark_begin == m_mark_end) - new_mark_begin = m_cursor_pos; - - new_mark_end = m_cursor_pos + 1; - } - } else { - new_mark_begin = 0; - new_mark_end = 0; - } - - if (Text.size() > (u32)m_cursor_pos) - m_cursor_pos++; - m_blink_start_time = porting::getTimeMs(); - break; - case KEY_UP: - if (m_multiline || (m_word_wrap && m_broken_text.size() > 1)) { - s32 lineNo = getLineFromPos(m_cursor_pos); - s32 mb = (m_mark_begin == m_mark_end) ? m_cursor_pos : (m_mark_begin > m_mark_end ? m_mark_begin : m_mark_end); - if (lineNo > 0) { - s32 cp = m_cursor_pos - m_broken_text_positions[lineNo]; - if ((s32)m_broken_text[lineNo - 1].size() < cp) - m_cursor_pos = m_broken_text_positions[lineNo - 1] + core::max_((u32)1, m_broken_text[lineNo - 1].size()) - 1; - else - m_cursor_pos = m_broken_text_positions[lineNo - 1] + cp; - } - - if (event.KeyInput.Shift) { - new_mark_begin = mb; - new_mark_end = m_cursor_pos; - } else { - new_mark_begin = 0; - new_mark_end = 0; - } - } else { - return false; - } - break; - case KEY_DOWN: - if (m_multiline || (m_word_wrap && m_broken_text.size() > 1)) { - s32 lineNo = getLineFromPos(m_cursor_pos); - s32 mb = (m_mark_begin == m_mark_end) ? m_cursor_pos : (m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end); - if (lineNo < (s32)m_broken_text.size() - 1) - { - s32 cp = m_cursor_pos - m_broken_text_positions[lineNo]; - if ((s32)m_broken_text[lineNo + 1].size() < cp) - m_cursor_pos = m_broken_text_positions[lineNo + 1] + core::max_((u32)1, m_broken_text[lineNo + 1].size()) - 1; - else - m_cursor_pos = m_broken_text_positions[lineNo + 1] + cp; - } - - if (event.KeyInput.Shift) { - new_mark_begin = mb; - new_mark_end = m_cursor_pos; - } else { - new_mark_begin = 0; - new_mark_end = 0; - } - - } else { - return false; - } - break; - - case KEY_BACK: - if (!isEnabled()) - break; - - if (Text.size()) { - core::stringw s; - - if (m_mark_begin != m_mark_end) { - // delete marked text - const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; - const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; - - s = Text.subString(0, realmbgn); - s.append(Text.subString(realmend, Text.size() - realmend)); - Text = s; - - m_cursor_pos = realmbgn; - } else { - // delete text behind cursor - if (m_cursor_pos > 0) - s = Text.subString(0, m_cursor_pos - 1); - else - s = L""; - s.append(Text.subString(m_cursor_pos, Text.size() - m_cursor_pos)); - Text = s; - --m_cursor_pos; - } - - if (m_cursor_pos < 0) - m_cursor_pos = 0; - m_blink_start_time = porting::getTimeMs(); // os::Timer::getTime(); - new_mark_begin = 0; - new_mark_end = 0; - text_changed = true; - } - break; - case KEY_DELETE: - if (!isEnabled()) - break; - - if (Text.size() != 0) { - core::stringw s; - - if (m_mark_begin != m_mark_end) { - // delete marked text - const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; - const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; - - s = Text.subString(0, realmbgn); - s.append(Text.subString(realmend, Text.size() - realmend)); - Text = s; - - m_cursor_pos = realmbgn; - } else { - // delete text before cursor - s = Text.subString(0, m_cursor_pos); - s.append(Text.subString(m_cursor_pos + 1, Text.size() - m_cursor_pos - 1)); - Text = s; - } - - if (m_cursor_pos > (s32)Text.size()) - m_cursor_pos = (s32)Text.size(); - - m_blink_start_time = porting::getTimeMs(); // os::Timer::getTime(); - new_mark_begin = 0; - new_mark_end = 0; - text_changed = true; - } - break; - - case KEY_ESCAPE: - case KEY_TAB: - case KEY_SHIFT: - case KEY_F1: - case KEY_F2: - case KEY_F3: - case KEY_F4: - case KEY_F5: - case KEY_F6: - case KEY_F7: - case KEY_F8: - case KEY_F9: - case KEY_F10: - case KEY_F11: - case KEY_F12: - case KEY_F13: - case KEY_F14: - case KEY_F15: - case KEY_F16: - case KEY_F17: - case KEY_F18: - case KEY_F19: - case KEY_F20: - case KEY_F21: - case KEY_F22: - case KEY_F23: - case KEY_F24: - // ignore these keys - return false; - - default: - inputChar(event.KeyInput.Char); - return true; - } - - // Set new text markers - setTextMarkers(new_mark_begin, new_mark_end); - - // break the text if it has changed - if (text_changed) { - breakText(); - calculateScrollPos(); - sendGuiEvent(EGET_EDITBOX_CHANGED); - } - else - { - calculateScrollPos(); - } - - return true; -} - //! draws the element and its children void GUIEditBoxWithScrollBar::draw() @@ -839,131 +264,6 @@ void GUIEditBoxWithScrollBar::draw() } -//! Sets the new caption of this element. -void GUIEditBoxWithScrollBar::setText(const wchar_t* text) -{ - Text = text; - if (u32(m_cursor_pos) > Text.size()) - m_cursor_pos = Text.size(); - m_hscroll_pos = 0; - breakText(); -} - - -//! Enables or disables automatic scrolling with cursor position -//! \param enable: If set to true, the text will move around with the cursor position -void GUIEditBoxWithScrollBar::setAutoScroll(bool enable) -{ - m_autoscroll = enable; -} - - -//! Checks to see if automatic scrolling is enabled -//! \return true if automatic scrolling is enabled, false if not -bool GUIEditBoxWithScrollBar::isAutoScrollEnabled() const -{ - return m_autoscroll; -} - - -//! Gets the area of the text in the edit box -//! \return Returns the size in pixels of the text -core::dimension2du GUIEditBoxWithScrollBar::getTextDimension() -{ - core::rect<s32> ret; - - setTextRect(0); - ret = m_current_text_rect; - - for (u32 i = 1; i < m_broken_text.size(); ++i) { - setTextRect(i); - ret.addInternalPoint(m_current_text_rect.UpperLeftCorner); - ret.addInternalPoint(m_current_text_rect.LowerRightCorner); - } - - return core::dimension2du(ret.getSize()); -} - - -//! Sets the maximum amount of characters which may be entered in the box. -//! \param max: Maximum amount of characters. If 0, the character amount is -//! infinity. -void GUIEditBoxWithScrollBar::setMax(u32 max) -{ - m_max = max; - - if (Text.size() > m_max && m_max != 0) - Text = Text.subString(0, m_max); -} - - -//! Returns maximum amount of characters, previously set by setMax(); -u32 GUIEditBoxWithScrollBar::getMax() const -{ - return m_max; -} - - -bool GUIEditBoxWithScrollBar::processMouse(const SEvent& event) -{ - switch (event.MouseInput.Event) - { - case irr::EMIE_LMOUSE_LEFT_UP: - if (Environment->hasFocus(this)) { - m_cursor_pos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); - if (m_mouse_marking) { - setTextMarkers(m_mark_begin, m_cursor_pos); - } - m_mouse_marking = false; - calculateScrollPos(); - return true; - } - break; - case irr::EMIE_MOUSE_MOVED: - { - if (m_mouse_marking) { - m_cursor_pos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); - setTextMarkers(m_mark_begin, m_cursor_pos); - calculateScrollPos(); - return true; - } - } - break; - case EMIE_LMOUSE_PRESSED_DOWN: - - if (!Environment->hasFocus(this)) { - m_blink_start_time = porting::getTimeMs(); - m_mouse_marking = true; - m_cursor_pos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); - setTextMarkers(m_cursor_pos, m_cursor_pos); - calculateScrollPos(); - return true; - } else { - if (!AbsoluteClippingRect.isPointInside( - core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y))) { - return false; - } else { - // move cursor - m_cursor_pos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); - - s32 newMarkBegin = m_mark_begin; - if (!m_mouse_marking) - newMarkBegin = m_cursor_pos; - - m_mouse_marking = true; - setTextMarkers(newMarkBegin, m_cursor_pos); - calculateScrollPos(); - return true; - } - } - default: - break; - } - - return false; -} - - s32 GUIEditBoxWithScrollBar::getCursorPos(s32 x, s32 y) { IGUIFont* font = getActiveFont(); @@ -1028,7 +328,7 @@ void GUIEditBoxWithScrollBar::breakText() s32 last_line_start = 0; s32 size = Text.size(); s32 length = 0; - s32 el_width = RelativeRect.getWidth() - 6; + s32 el_width = RelativeRect.getWidth() - m_scrollbar_width - 10; wchar_t c; for (s32 i = 0; i < size; ++i) { @@ -1181,59 +481,6 @@ void GUIEditBoxWithScrollBar::setTextRect(s32 line) m_current_text_rect += m_frame_rect.UpperLeftCorner; } - -s32 GUIEditBoxWithScrollBar::getLineFromPos(s32 pos) -{ - if (!m_word_wrap && !m_multiline) - return 0; - - s32 i = 0; - while (i < (s32)m_broken_text_positions.size()) { - if (m_broken_text_positions[i] > pos) - return i - 1; - ++i; - } - return (s32)m_broken_text_positions.size() - 1; -} - - -void GUIEditBoxWithScrollBar::inputChar(wchar_t c) -{ - if (!isEnabled()) - return; - - if (c != 0) { - if (Text.size() < m_max || m_max == 0) { - core::stringw s; - - if (m_mark_begin != m_mark_end) { - // replace marked text - const s32 realmbgn = m_mark_begin < m_mark_end ? m_mark_begin : m_mark_end; - const s32 realmend = m_mark_begin < m_mark_end ? m_mark_end : m_mark_begin; - - s = Text.subString(0, realmbgn); - s.append(c); - s.append(Text.subString(realmend, Text.size() - realmend)); - Text = s; - m_cursor_pos = realmbgn + 1; - } else { - // add new character - s = Text.subString(0, m_cursor_pos); - s.append(c); - s.append(Text.subString(m_cursor_pos, Text.size() - m_cursor_pos)); - Text = s; - ++m_cursor_pos; - } - - m_blink_start_time = porting::getTimeMs(); - setTextMarkers(0, 0); - } - } - breakText(); - calculateScrollPos(); - sendGuiEvent(EGET_EDITBOX_CHANGED); -} - // calculate autoscroll void GUIEditBoxWithScrollBar::calculateScrollPos() { @@ -1366,30 +613,6 @@ void GUIEditBoxWithScrollBar::calculateFrameRect() updateVScrollBar(); } -//! set text markers -void GUIEditBoxWithScrollBar::setTextMarkers(s32 begin, s32 end) -{ - if (begin != m_mark_begin || end != m_mark_end) { - m_mark_begin = begin; - m_mark_end = end; - sendGuiEvent(EGET_EDITBOX_MARKING_CHANGED); - } -} - -//! send some gui event to parent -void GUIEditBoxWithScrollBar::sendGuiEvent(EGUI_EVENT_TYPE type) -{ - if (Parent) { - SEvent e; - e.EventType = EET_GUI_EVENT; - e.GUIEvent.Caller = this; - e.GUIEvent.Element = 0; - e.GUIEvent.EventType = type; - - Parent->OnEvent(e); - } -} - //! create a vertical scroll bar void GUIEditBoxWithScrollBar::createVScrollBar() { @@ -1397,9 +620,18 @@ void GUIEditBoxWithScrollBar::createVScrollBar() if (Environment) skin = Environment->getSkin(); - m_scrollbar_width = skin ? skin->getSize(gui::EGDS_SCROLLBAR_SIZE) : 16; + s32 fontHeight = 1; - RelativeRect.LowerRightCorner.X -= m_scrollbar_width + 4; + if (m_override_font) { + fontHeight = m_override_font->getDimension(L"Ay").Height; + } else { + IGUIFont *font; + if (skin && (font = skin->getFont())) { + fontHeight = font->getDimension(L"Ay").Height; + } + } + + m_scrollbar_width = skin ? skin->getSize(gui::EGDS_SCROLLBAR_SIZE) : 16; irr::core::rect<s32> scrollbarrect = m_frame_rect; scrollbarrect.UpperLeftCorner.X += m_frame_rect.getWidth() - m_scrollbar_width; @@ -1407,65 +639,11 @@ void GUIEditBoxWithScrollBar::createVScrollBar() scrollbarrect, false, true); m_vscrollbar->setVisible(false); - m_vscrollbar->setSmallStep(1); - m_vscrollbar->setLargeStep(1); + m_vscrollbar->setSmallStep(3 * fontHeight); + m_vscrollbar->setLargeStep(10 * fontHeight); } -void GUIEditBoxWithScrollBar::updateVScrollBar() -{ - if (!m_vscrollbar) { - return; - } - // OnScrollBarChanged(...) - if (m_vscrollbar->getPos() != m_vscroll_pos) { - s32 deltaScrollY = m_vscrollbar->getPos() - m_vscroll_pos; - m_current_text_rect.UpperLeftCorner.Y -= deltaScrollY; - m_current_text_rect.LowerRightCorner.Y -= deltaScrollY; - - s32 scrollymax = getTextDimension().Height - m_frame_rect.getHeight(); - if (scrollymax != m_vscrollbar->getMax()) { - // manage a newline or a deleted line - m_vscrollbar->setMax(scrollymax); - m_vscrollbar->setPageSize(s32(getTextDimension().Height)); - calculateScrollPos(); - } else { - // manage a newline or a deleted line - m_vscroll_pos = m_vscrollbar->getPos(); - } - } - - // check if a vertical scrollbar is needed ? - if (getTextDimension().Height > (u32) m_frame_rect.getHeight()) { - m_frame_rect.LowerRightCorner.X -= m_scrollbar_width; - - s32 scrollymax = getTextDimension().Height - m_frame_rect.getHeight(); - if (scrollymax != m_vscrollbar->getMax()) { - m_vscrollbar->setMax(scrollymax); - m_vscrollbar->setPageSize(s32(getTextDimension().Height)); - } - - if (!m_vscrollbar->isVisible()) { - m_vscrollbar->setVisible(true); - } - } else { - if (m_vscrollbar->isVisible()) - { - m_vscrollbar->setVisible(false); - m_vscroll_pos = 0; - m_vscrollbar->setPos(0); - m_vscrollbar->setMax(1); - m_vscrollbar->setPageSize(s32(getTextDimension().Height)); - } - } - -} - -//! set true if this editbox is writable -void GUIEditBoxWithScrollBar::setWritable(bool writable) -{ - m_writable = writable; -} //! Change the background color void GUIEditBoxWithScrollBar::setBackgroundColor(const video::SColor &bg_color) @@ -1474,59 +652,6 @@ void GUIEditBoxWithScrollBar::setBackgroundColor(const video::SColor &bg_color) m_bg_color_used = true; } -//! Writes attributes of the element. -void GUIEditBoxWithScrollBar::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options = 0) const -{ - // IGUIEditBox::serializeAttributes(out,options); - - out->addBool("Border", m_border); - out->addBool("Background", m_background); - out->addBool("OverrideColorEnabled", m_override_color_enabled); - out->addColor("OverrideColor", m_override_color); - // out->addFont("OverrideFont", OverrideFont); - out->addInt("MaxChars", m_max); - out->addBool("WordWrap", m_word_wrap); - out->addBool("MultiLine", m_multiline); - out->addBool("AutoScroll", m_autoscroll); - out->addBool("PasswordBox", m_passwordbox); - core::stringw ch = L" "; - ch[0] = m_passwordchar; - out->addString("PasswordChar", ch.c_str()); - out->addEnum("HTextAlign", m_halign, GUIAlignmentNames); - out->addEnum("VTextAlign", m_valign, GUIAlignmentNames); - out->addBool("Writable", m_writable); - - IGUIEditBox::serializeAttributes(out, options); -} - - -//! Reads attributes of the element -void GUIEditBoxWithScrollBar::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options = 0) -{ - IGUIEditBox::deserializeAttributes(in, options); - - setDrawBorder(in->getAttributeAsBool("Border")); - setDrawBackground(in->getAttributeAsBool("Background")); - setOverrideColor(in->getAttributeAsColor("OverrideColor")); - enableOverrideColor(in->getAttributeAsBool("OverrideColorEnabled")); - setMax(in->getAttributeAsInt("MaxChars")); - setWordWrap(in->getAttributeAsBool("WordWrap")); - setMultiLine(in->getAttributeAsBool("MultiLine")); - setAutoScroll(in->getAttributeAsBool("AutoScroll")); - core::stringw ch = in->getAttributeAsStringW("PasswordChar"); - - if (!ch.size()) - setPasswordBox(in->getAttributeAsBool("PasswordBox")); - else - setPasswordBox(in->getAttributeAsBool("PasswordBox"), ch[0]); - - setTextAlignment((EGUI_ALIGNMENT)in->getAttributeAsEnumeration("HTextAlign", GUIAlignmentNames), - (EGUI_ALIGNMENT)in->getAttributeAsEnumeration("VTextAlign", GUIAlignmentNames)); - - // setOverrideFont(in->getAttributeAsFont("OverrideFont")); - setWritable(in->getAttributeAsBool("Writable")); -} - bool GUIEditBoxWithScrollBar::isDrawBackgroundEnabled() const { return false; } bool GUIEditBoxWithScrollBar::isDrawBorderEnabled() const { return false; } void GUIEditBoxWithScrollBar::setCursorChar(const wchar_t cursorChar) { } diff --git a/src/gui/guiEditBoxWithScrollbar.h b/src/gui/guiEditBoxWithScrollbar.h index 77538e2f7..cea482fc2 100644 --- a/src/gui/guiEditBoxWithScrollbar.h +++ b/src/gui/guiEditBoxWithScrollbar.h @@ -5,15 +5,9 @@ #ifndef GUIEDITBOXWITHSCROLLBAR_HEADER #define GUIEDITBOXWITHSCROLLBAR_HEADER -#include "IGUIEditBox.h" -#include "IOSOperator.h" -#include "guiScrollBar.h" -#include <vector> +#include "guiEditBox.h" -using namespace irr; -using namespace irr::gui; - -class GUIEditBoxWithScrollBar : public IGUIEditBox +class GUIEditBoxWithScrollBar : public GUIEditBox { public: @@ -23,111 +17,20 @@ public: bool writable = true, bool has_vscrollbar = true); //! destructor - virtual ~GUIEditBoxWithScrollBar(); - - //! Sets another skin independent font. - virtual void setOverrideFont(IGUIFont* font = 0); - - //! Gets the override font (if any) - /** \return The override font (may be 0) */ - virtual IGUIFont* getOverrideFont() const; - - //! Get the font which is used right now for drawing - /** Currently this is the override font when one is set and the - font of the active skin otherwise */ - virtual IGUIFont* getActiveFont() const; - - //! Sets another color for the text. - virtual void setOverrideColor(video::SColor color); - - //! Gets the override color - virtual video::SColor getOverrideColor() const; - - //! Sets if the text should use the overide color or the - //! color in the gui skin. - virtual void enableOverrideColor(bool enable); - - //! Checks if an override color is enabled - /** \return true if the override color is enabled, false otherwise */ - virtual bool isOverrideColorEnabled(void) const; + virtual ~GUIEditBoxWithScrollBar() {} //! Sets whether to draw the background virtual void setDrawBackground(bool draw); - //! Turns the border on or off - virtual void setDrawBorder(bool border); - - //! Enables or disables word wrap for using the edit box as multiline text editor. - virtual void setWordWrap(bool enable); - - //! Checks if word wrap is enabled - //! \return true if word wrap is enabled, false otherwise - virtual bool isWordWrapEnabled() const; - - //! Enables or disables newlines. - /** \param enable: If set to true, the EGET_EDITBOX_ENTER event will not be fired, - instead a newline character will be inserted. */ - virtual void setMultiLine(bool enable); - - //! Checks if multi line editing is enabled - //! \return true if mult-line is enabled, false otherwise - virtual bool isMultiLineEnabled() const; - - //! Enables or disables automatic scrolling with cursor position - //! \param enable: If set to true, the text will move around with the cursor position - virtual void setAutoScroll(bool enable); - - //! Checks to see if automatic scrolling is enabled - //! \return true if automatic scrolling is enabled, false if not - virtual bool isAutoScrollEnabled() const; - - //! Gets the size area of the text in the edit box - //! \return Returns the size in pixels of the text - virtual core::dimension2du getTextDimension(); - - //! Sets text justification - virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical); - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event); - //! draws the element and its children virtual void draw(); - //! Sets the new caption of this element. - virtual void setText(const wchar_t* text); - - //! Sets the maximum amount of characters which may be entered in the box. - //! \param max: Maximum amount of characters. If 0, the character amount is - //! infinity. - virtual void setMax(u32 max); - - //! Returns maximum amount of characters, previously set by setMax(); - virtual u32 getMax() const; - - //! Sets whether the edit box is a password box. Setting this to true will - /** disable MultiLine, WordWrap and the ability to copy with ctrl+c or ctrl+x - \param passwordBox: true to enable password, false to disable - \param passwordChar: the character that is displayed instead of letters */ - virtual void setPasswordBox(bool passwordBox, wchar_t passwordChar = L'*'); - - //! Returns true if the edit box is currently a password box. - virtual bool isPasswordBox() const; - //! Updates the absolute position, splits text if required virtual void updateAbsolutePosition(); - virtual void setWritable(bool writable); - //! Change the background color virtual void setBackgroundColor(const video::SColor &bg_color); - //! Writes attributes of the element. - virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const; - - //! Reads attributes of the element - virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options); - virtual bool isDrawBackgroundEnabled() const; virtual bool isDrawBorderEnabled() const; virtual void setCursorChar(const wchar_t cursorChar); @@ -137,58 +40,19 @@ public: protected: //! Breaks the single text line. - void breakText(); + virtual void breakText(); //! sets the area of the given line - void setTextRect(s32 line); - //! returns the line number that the cursor is on - s32 getLineFromPos(s32 pos); - //! adds a letter to the edit box - void inputChar(wchar_t c); + virtual void setTextRect(s32 line); //! calculates the current scroll position void calculateScrollPos(); //! calculated the FrameRect void calculateFrameRect(); - //! send some gui event to parent - void sendGuiEvent(EGUI_EVENT_TYPE type); - //! set text markers - void setTextMarkers(s32 begin, s32 end); //! create a Vertical ScrollBar void createVScrollBar(); - //! update the vertical scrollBar (visibilty & position) - void updateVScrollBar(); - bool processKey(const SEvent& event); - bool processMouse(const SEvent& event); s32 getCursorPos(s32 x, s32 y); - bool m_mouse_marking; - bool m_border; bool m_background; - bool m_override_color_enabled; - s32 m_mark_begin; - s32 m_mark_end; - - video::SColor m_override_color; - gui::IGUIFont *m_override_font, *m_last_break_font; - IOSOperator* m_operator; - - u32 m_blink_start_time; - s32 m_cursor_pos; - s32 m_hscroll_pos, m_vscroll_pos; // scroll position in characters - u32 m_max; - - bool m_word_wrap, m_multiline, m_autoscroll, m_passwordbox; - wchar_t m_passwordchar; - EGUI_ALIGNMENT m_halign, m_valign; - - std::vector<core::stringw> m_broken_text; - std::vector<s32> m_broken_text_positions; - - core::rect<s32> m_current_text_rect, m_frame_rect; // temporary values - - u32 m_scrollbar_width; - GUIScrollBar *m_vscrollbar; - bool m_writable; bool m_bg_color_used; video::SColor m_bg_color; diff --git a/src/gui/guiEngine.cpp b/src/gui/guiEngine.cpp index b40707d01..01f3f8fd5 100644 --- a/src/gui/guiEngine.cpp +++ b/src/gui/guiEngine.cpp @@ -75,8 +75,6 @@ video::ITexture *MenuTextureSource::getTexture(const std::string &name, u32 *id) if (name.empty()) return NULL; - m_to_delete.insert(name); - #if ENABLE_GLES video::ITexture *retval = m_driver->findTexture(name.c_str()); if (retval) @@ -88,6 +86,7 @@ video::ITexture *MenuTextureSource::getTexture(const std::string &name, u32 *id) image = Align2Npot2(image, m_driver); retval = m_driver->addTexture(name.c_str(), image); + m_to_delete.insert(name); image->drop(); return retval; #else @@ -105,16 +104,22 @@ void MenuMusicFetcher::fetchSounds(const std::string &name, if(m_fetched.count(name)) return; m_fetched.insert(name); - std::string base; - base = porting::path_share + DIR_DELIM + "sounds"; - dst_paths.insert(base + DIR_DELIM + name + ".ogg"); - int i; - for(i=0; i<10; i++) - dst_paths.insert(base + DIR_DELIM + name + "."+itos(i)+".ogg"); - base = porting::path_user + DIR_DELIM + "sounds"; - dst_paths.insert(base + DIR_DELIM + name + ".ogg"); - for(i=0; i<10; i++) - dst_paths.insert(base + DIR_DELIM + name + "."+itos(i)+".ogg"); + std::vector<fs::DirListNode> list; + // Reusable local function + auto add_paths = [&dst_paths](const std::string name, const std::string base = "") { + dst_paths.insert(base + name + ".ogg"); + for (int i = 0; i < 10; i++) + dst_paths.insert(base + name + "." + itos(i) + ".ogg"); + }; + // Allow full paths + if (name.find(DIR_DELIM_CHAR) != std::string::npos) { + add_paths(name); + } else { + std::string share_prefix = porting::path_share + DIR_DELIM; + add_paths(name, share_prefix + "sounds" + DIR_DELIM); + std::string user_prefix = porting::path_user + DIR_DELIM; + add_paths(name, user_prefix + "sounds" + DIR_DELIM); + } } /******************************************************************************/ @@ -122,12 +127,14 @@ void MenuMusicFetcher::fetchSounds(const std::string &name, /******************************************************************************/ GUIEngine::GUIEngine(JoystickController *joystick, gui::IGUIElement *parent, + RenderingEngine *rendering_engine, IMenuManager *menumgr, MainMenuData *data, bool &kill) : + m_rendering_engine(rendering_engine), m_parent(parent), m_menumanager(menumgr), - m_smgr(RenderingEngine::get_scene_manager()), + m_smgr(rendering_engine->get_scene_manager()), m_data(data), m_kill(kill) { @@ -139,7 +146,7 @@ GUIEngine::GUIEngine(JoystickController *joystick, m_buttonhandler = new TextDestGuiEngine(this); //create texture source - m_texture_source = new MenuTextureSource(RenderingEngine::get_video_driver()); + m_texture_source = new MenuTextureSource(rendering_engine->get_video_driver()); //create soundmanager MenuMusicFetcher soundfetcher; @@ -157,7 +164,7 @@ GUIEngine::GUIEngine(JoystickController *joystick, g_fontengine->getTextHeight()); rect += v2s32(4, 0); - m_irr_toplefttext = gui::StaticText::add(RenderingEngine::get_gui_env(), + m_irr_toplefttext = gui::StaticText::add(rendering_engine->get_gui_env(), m_toplefttext, rect, false, true, 0, -1); //create formspecsource @@ -169,7 +176,9 @@ GUIEngine::GUIEngine(JoystickController *joystick, -1, m_menumanager, NULL /* &client */, + m_rendering_engine->get_gui_env(), m_texture_source, + m_sound_manager, m_formspecgui, m_buttonhandler, "", @@ -232,7 +241,7 @@ void GUIEngine::run() { // Always create clouds because they may or may not be // needed based on the game selected - video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + video::IVideoDriver *driver = m_rendering_engine->get_video_driver(); cloudInit(); @@ -259,10 +268,10 @@ void GUIEngine::run() fog_pixelfog, fog_rangefog); } - while (RenderingEngine::run() && (!m_startgame) && (!m_kill)) { + while (m_rendering_engine->run() && (!m_startgame) && (!m_kill)) { const irr::core::dimension2d<u32> ¤t_screen_size = - RenderingEngine::get_video_driver()->getScreenSize(); + m_rendering_engine->get_video_driver()->getScreenSize(); // Verify if window size has changed and save it if it's the case // Ensure evaluating settings->getBool after verifying screensize // First condition is cheaper @@ -293,14 +302,18 @@ void GUIEngine::run() drawHeader(driver); drawFooter(driver); - RenderingEngine::get_gui_env()->drawAll(); + m_rendering_engine->get_gui_env()->drawAll(); driver->endScene(); + IrrlichtDevice *device = m_rendering_engine->get_raw_device(); + u32 frametime_min = 1000 / (device->isWindowFocused() + ? g_settings->getFloat("fps_max") + : g_settings->getFloat("fps_max_unfocused")); if (m_clouds_enabled) - cloudPostProcess(); + cloudPostProcess(frametime_min, device); else - sleep_ms(25); + sleep_ms(frametime_min); m_script->step(); @@ -326,7 +339,7 @@ GUIEngine::~GUIEngine() //clean up texture pointers for (image_definition &texture : m_textures) { if (texture.texture) - RenderingEngine::get_video_driver()->removeTexture(texture.texture); + m_rendering_engine->get_video_driver()->removeTexture(texture.texture); } delete m_texture_source; @@ -346,13 +359,13 @@ void GUIEngine::cloudInit() v3f(0,0,0), v3f(0, 60, 100)); m_cloud.camera->setFarValue(10000); - m_cloud.lasttime = RenderingEngine::get_timer_time(); + m_cloud.lasttime = m_rendering_engine->get_timer_time(); } /******************************************************************************/ void GUIEngine::cloudPreProcess() { - u32 time = RenderingEngine::get_timer_time(); + u32 time = m_rendering_engine->get_timer_time(); if(time > m_cloud.lasttime) m_cloud.dtime = (time - m_cloud.lasttime) / 1000.0; @@ -367,25 +380,22 @@ void GUIEngine::cloudPreProcess() } /******************************************************************************/ -void GUIEngine::cloudPostProcess() +void GUIEngine::cloudPostProcess(u32 frametime_min, IrrlichtDevice *device) { - float fps_max = g_settings->getFloat("pause_fps_max"); // Time of frame without fps limit u32 busytime_u32; // not using getRealTime is necessary for wine - u32 time = RenderingEngine::get_timer_time(); + u32 time = m_rendering_engine->get_timer_time(); if(time > m_cloud.lasttime) busytime_u32 = time - m_cloud.lasttime; else busytime_u32 = 0; - // FPS limiter - u32 frametime_min = 1000./fps_max; - + // FPS limit if (busytime_u32 < frametime_min) { u32 sleeptime = frametime_min - busytime_u32; - RenderingEngine::get_raw_device()->sleep(sleeptime); + device->sleep(sleeptime); } } @@ -433,9 +443,22 @@ void GUIEngine::drawBackground(video::IVideoDriver *driver) return; } + // Chop background image to the smaller screen dimension + v2u32 bg_size = screensize; + v2f32 scale( + (f32) bg_size.X / sourcesize.X, + (f32) bg_size.Y / sourcesize.Y); + if (scale.X < scale.Y) + bg_size.X = (int) (scale.Y * sourcesize.X); + else + bg_size.Y = (int) (scale.X * sourcesize.Y); + v2s32 offset = v2s32( + (s32) screensize.X - (s32) bg_size.X, + (s32) screensize.Y - (s32) bg_size.Y + ) / 2; /* Draw background texture */ draw2DImageFilterScaled(driver, texture, - core::rect<s32>(0, 0, screensize.X, screensize.Y), + core::rect<s32>(offset.X, offset.Y, bg_size.X + offset.X, bg_size.Y + offset.Y), core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y), NULL, NULL, true); } @@ -484,8 +507,6 @@ void GUIEngine::drawHeader(video::IVideoDriver *driver) splashrect += v2s32((screensize.Width/2)-(splashsize.X/2), ((free_space/2)-splashsize.Y/2)+10); - video::SColor bgcolor(255,50,50,50); - draw2DImageFilterScaled(driver, texture, splashrect, core::rect<s32>(core::position2d<s32>(0,0), core::dimension2di(texture->getOriginalSize())), @@ -529,7 +550,7 @@ void GUIEngine::drawFooter(video::IVideoDriver *driver) bool GUIEngine::setTexture(texture_layer layer, const std::string &texturepath, bool tile_image, unsigned int minsize) { - video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + video::IVideoDriver *driver = m_rendering_engine->get_video_driver(); if (m_textures[layer].texture) { driver->removeTexture(m_textures[layer].texture); @@ -596,14 +617,14 @@ void GUIEngine::updateTopLeftTextSize() rect += v2s32(4, 0); m_irr_toplefttext->remove(); - m_irr_toplefttext = gui::StaticText::add(RenderingEngine::get_gui_env(), + m_irr_toplefttext = gui::StaticText::add(m_rendering_engine->get_gui_env(), m_toplefttext, rect, false, true, 0, -1); } /******************************************************************************/ -s32 GUIEngine::playSound(const SimpleSoundSpec &spec, bool looped) +s32 GUIEngine::playSound(const SimpleSoundSpec &spec) { - s32 handle = m_sound_manager->playSound(spec, looped); + s32 handle = m_sound_manager->playSound(spec); return handle; } @@ -612,10 +633,3 @@ void GUIEngine::stopSound(s32 handle) { m_sound_manager->stopSound(handle); } - -/******************************************************************************/ -unsigned int GUIEngine::queueAsync(const std::string &serialized_func, - const std::string &serialized_params) -{ - return m_script->queueAsync(serialized_func, serialized_params); -} diff --git a/src/gui/guiEngine.h b/src/gui/guiEngine.h index f9ad0fb0a..2f182ca81 100644 --- a/src/gui/guiEngine.h +++ b/src/gui/guiEngine.h @@ -29,27 +29,28 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/enriched_string.h" /******************************************************************************/ -/* Typedefs and macros */ +/* Structs and macros */ /******************************************************************************/ /** texture layer ids */ -typedef enum { +enum texture_layer { TEX_LAYER_BACKGROUND = 0, TEX_LAYER_OVERLAY, TEX_LAYER_HEADER, TEX_LAYER_FOOTER, TEX_LAYER_MAX -} texture_layer; +}; -typedef struct { +struct image_definition { video::ITexture *texture = nullptr; bool tile; unsigned int minsize; -} image_definition; +}; /******************************************************************************/ /* forward declarations */ /******************************************************************************/ class GUIEngine; +class RenderingEngine; class MainMenuScripting; class Clouds; struct MainMenuData; @@ -150,6 +151,7 @@ public: */ GUIEngine(JoystickController *joystick, gui::IGUIElement *parent, + RenderingEngine *rendering_engine, IMenuManager *menumgr, MainMenuData *data, bool &kill); @@ -173,10 +175,6 @@ public: return m_scriptdir; } - /** pass async callback to scriptengine **/ - unsigned int queueAsync(const std::string &serialized_fct, - const std::string &serialized_params); - private: /** find and run the main menu script */ @@ -188,6 +186,7 @@ private: /** update size of topleftext element */ void updateTopLeftTextSize(); + RenderingEngine *m_rendering_engine = nullptr; /** parent gui element */ gui::IGUIElement *m_parent = nullptr; /** manager to add menus to */ @@ -277,7 +276,7 @@ private: /** do preprocessing for cloud subsystem */ void cloudPreProcess(); /** do postprocessing for cloud subsystem */ - void cloudPostProcess(); + void cloudPostProcess(u32 frametime_min, IrrlichtDevice *device); /** internam data required for drawing clouds */ struct clouddata { @@ -297,7 +296,7 @@ private: clouddata m_cloud; /** start playing a sound and return handle */ - s32 playSound(const SimpleSoundSpec &spec, bool looped); + s32 playSound(const SimpleSoundSpec &spec); /** stop playing a sound started with playSound() */ void stopSound(s32 handle); diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 7e3ad3b15..1f9914e72 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <cstdlib> +#include <cmath> #include <algorithm> #include <iterator> #include <limits> @@ -48,6 +49,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "client/client.h" #include "client/fontengine.h" +#include "client/sound.h" #include "util/hex.h" #include "util/numeric.h" #include "util/string.h" // for parseColorString() @@ -63,12 +65,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "guiInventoryList.h" #include "guiItemImage.h" #include "guiScrollContainer.h" -#include "intlGUIEditBox.h" #include "guiHyperText.h" +#include "guiScene.h" #define MY_CHECKPOS(a,b) \ if (v_pos.size() != 2) { \ - errorstream<< "Invalid pos for element " << a << "specified: \"" \ + errorstream<< "Invalid pos for element " << a << " specified: \"" \ << parts[b] << "\"" << std::endl; \ return; \ } @@ -76,9 +78,16 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MY_CHECKGEOM(a,b) \ if (v_geom.size() != 2) { \ errorstream<< "Invalid geometry for element " << a << \ - "specified: \"" << parts[b] << "\"" << std::endl; \ + " specified: \"" << parts[b] << "\"" << std::endl; \ return; \ } + +#define MY_CHECKCLIENT(a) \ + if (!m_client) { \ + errorstream << "Attempted to use element " << a << " with m_client == nullptr." << std::endl; \ + return; \ + } + /* GUIFormSpecMenu */ @@ -94,11 +103,13 @@ inline u32 clamp_u8(s32 value) GUIFormSpecMenu::GUIFormSpecMenu(JoystickController *joystick, gui::IGUIElement *parent, s32 id, IMenuManager *menumgr, - Client *client, ISimpleTextureSource *tsrc, IFormSource *fsrc, TextDest *tdst, + Client *client, gui::IGUIEnvironment *guienv, ISimpleTextureSource *tsrc, + ISoundManager *sound_manager, IFormSource *fsrc, TextDest *tdst, const std::string &formspecPrepend, bool remap_dbl_click): - GUIModalMenu(RenderingEngine::get_gui_env(), parent, id, menumgr, remap_dbl_click), + GUIModalMenu(guienv, parent, id, menumgr, remap_dbl_click), m_invmgr(client), m_tsrc(tsrc), + m_sound_manager(sound_manager), m_client(client), m_formspec_prepend(formspecPrepend), m_form_src(fsrc), @@ -116,7 +127,8 @@ GUIFormSpecMenu::GUIFormSpecMenu(JoystickController *joystick, GUIFormSpecMenu::~GUIFormSpecMenu() { - removeChildren(); + removeAllChildren(); + removeTooltip(); for (auto &table_it : m_tables) table_it.second->drop(); @@ -126,8 +138,6 @@ GUIFormSpecMenu::~GUIFormSpecMenu() checkbox_it.second->drop(); for (auto &scrollbar_it : m_scrollbars) scrollbar_it.second->drop(); - for (auto &background_it : m_backgrounds) - background_it->drop(); for (auto &tooltip_rect_it : m_tooltip_rects) tooltip_rect_it.first->drop(); for (auto &clickthrough_it : m_clickthrough_elements) @@ -141,12 +151,13 @@ GUIFormSpecMenu::~GUIFormSpecMenu() } void GUIFormSpecMenu::create(GUIFormSpecMenu *&cur_formspec, Client *client, - JoystickController *joystick, IFormSource *fs_src, TextDest *txt_dest, - const std::string &formspecPrepend) + gui::IGUIEnvironment *guienv, JoystickController *joystick, IFormSource *fs_src, + TextDest *txt_dest, const std::string &formspecPrepend, ISoundManager *sound_manager) { if (cur_formspec == nullptr) { cur_formspec = new GUIFormSpecMenu(joystick, guiroot, -1, &g_menumgr, - client, client->getTextureSource(), fs_src, txt_dest, formspecPrepend); + client, guienv, client->getTextureSource(), sound_manager, fs_src, + txt_dest, formspecPrepend); cur_formspec->doPause = false; /* @@ -164,14 +175,8 @@ void GUIFormSpecMenu::create(GUIFormSpecMenu *&cur_formspec, Client *client, } } -void GUIFormSpecMenu::removeChildren() +void GUIFormSpecMenu::removeTooltip() { - const core::list<gui::IGUIElement*> &children = getChildren(); - - while (!children.empty()) { - (*children.getLast())->remove(); - } - if (m_tooltip_element) { m_tooltip_element->remove(); m_tooltip_element->drop(); @@ -189,16 +194,7 @@ void GUIFormSpecMenu::setInitialFocus() // 5. first focusable (not statictext, not tabheader) // 6. first child element - core::list<gui::IGUIElement*> children = getChildren(); - - // in case "children" contains any NULL elements, remove them - for (core::list<gui::IGUIElement*>::Iterator it = children.begin(); - it != children.end();) { - if (*it) - ++it; - else - it = children.erase(it); - } + const auto& children = getChildren(); // 1. first empty editbox for (gui::IGUIElement *it : children) { @@ -226,8 +222,7 @@ void GUIFormSpecMenu::setInitialFocus() } // 4. last button - for (core::list<gui::IGUIElement*>::Iterator it = children.getLast(); - it != children.end(); --it) { + for (auto it = children.rbegin(); it != children.rend(); ++it) { if ((*it)->getType() == gui::EGUIET_BUTTON) { Environment->setFocus(*it); return; @@ -247,7 +242,7 @@ void GUIFormSpecMenu::setInitialFocus() if (children.empty()) Environment->setFocus(this); else - Environment->setFocus(*(children.begin())); + Environment->setFocus(children.front()); } GUITable* GUIFormSpecMenu::getTable(const std::string &tablename) @@ -289,8 +284,20 @@ v2s32 GUIFormSpecMenu::getRealCoordinateGeometry(const std::vector<std::string> return v2s32(stof(v_geom[0]) * imgsize.X, stof(v_geom[1]) * imgsize.Y); } +bool GUIFormSpecMenu::precheckElement(const std::string &name, const std::string &element, + size_t args_min, size_t args_max, std::vector<std::string> &parts) +{ + parts = split(element, ';'); + if (parts.size() >= args_min && (parts.size() <= args_max || m_formspec_version > FORMSPEC_API_VERSION)) + return true; + + errorstream << "Invalid " << name << " element(" << parts.size() << "): '" << element << "'" << std::endl; + return false; +} + void GUIFormSpecMenu::parseSize(parserData* data, const std::string &element) { + // Note: do not use precheckElement due to "," separator. std::vector<std::string> parts = split(element,','); if (((parts.size() == 2) || parts.size() == 3) || @@ -303,7 +310,7 @@ void GUIFormSpecMenu::parseSize(parserData* data, const std::string &element) data->invsize.Y = MYMAX(0, stof(parts[1])); lockSize(false); -#ifndef __ANDROID__ +#ifndef HAVE_TOUCHSCREENGUI if (parts.size() == 3) { if (parts[2] == "true") { lockSize(true,v2u32(800,600)); @@ -344,14 +351,9 @@ void GUIFormSpecMenu::parseContainerEnd(parserData* data) void GUIFormSpecMenu::parseScrollContainer(parserData *data, const std::string &element) { - std::vector<std::string> parts = split(element, ';'); - - if (parts.size() < 4 || - (parts.size() > 5 && m_formspec_version <= FORMSPEC_API_VERSION)) { - errorstream << "Invalid scroll_container start element (" << parts.size() - << "): '" << element << "'" << std::endl; + std::vector<std::string> parts; + if (!precheckElement("scroll_container start", element, 4, 5, parts)) return; - } std::vector<std::string> v_pos = split(parts[0], ','); std::vector<std::string> v_geom = split(parts[1], ','); @@ -440,85 +442,95 @@ void GUIFormSpecMenu::parseScrollContainerEnd(parserData *data) void GUIFormSpecMenu::parseList(parserData *data, const std::string &element) { - if (m_client == 0) { - warningstream<<"invalid use of 'list' with m_client==0"<<std::endl; + MY_CHECKCLIENT("list"); + + std::vector<std::string> parts; + if (!precheckElement("list", element, 4, 5, parts)) + return; + + std::string location = parts[0]; + std::string listname = parts[1]; + std::vector<std::string> v_pos = split(parts[2],','); + std::vector<std::string> v_geom = split(parts[3],','); + std::string startindex; + if (parts.size() == 5) + startindex = parts[4]; + + MY_CHECKPOS("list",2); + MY_CHECKGEOM("list",3); + + InventoryLocation loc; + + if (location == "context" || location == "current_name") + loc = m_current_inventory_location; + else + loc.deSerialize(location); + + v2s32 geom; + geom.X = stoi(v_geom[0]); + geom.Y = stoi(v_geom[1]); + + s32 start_i = 0; + if (!startindex.empty()) + start_i = stoi(startindex); + + if (geom.X < 0 || geom.Y < 0 || start_i < 0) { + errorstream << "Invalid list element: '" << element << "'" << std::endl; return; } - std::vector<std::string> parts = split(element,';'); + if (!data->explicit_size) + warningstream << "invalid use of list without a size[] element" << std::endl; - if (((parts.size() == 4) || (parts.size() == 5)) || - ((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::string location = parts[0]; - std::string listname = parts[1]; - std::vector<std::string> v_pos = split(parts[2],','); - std::vector<std::string> v_geom = split(parts[3],','); - std::string startindex; - if (parts.size() == 5) - startindex = parts[4]; + FieldSpec spec( + "", + L"", + L"", + 258 + m_fields.size(), + 3 + ); - MY_CHECKPOS("list",2); - MY_CHECKGEOM("list",3); + auto style = getDefaultStyleForElement("list", spec.fname); - InventoryLocation loc; + v2f32 slot_scale = style.getVector2f(StyleSpec::SIZE, v2f32(0, 0)); + v2f32 slot_size( + slot_scale.X <= 0 ? imgsize.X : std::max<f32>(slot_scale.X * imgsize.X, 1), + slot_scale.Y <= 0 ? imgsize.Y : std::max<f32>(slot_scale.Y * imgsize.Y, 1) + ); - if (location == "context" || location == "current_name") - loc = m_current_inventory_location; - else - loc.deSerialize(location); + v2f32 slot_spacing = style.getVector2f(StyleSpec::SPACING, v2f32(-1, -1)); + v2f32 default_spacing = data->real_coordinates ? + v2f32(imgsize.X * 0.25f, imgsize.Y * 0.25f) : + v2f32(spacing.X - imgsize.X, spacing.Y - imgsize.Y); - v2s32 geom; - geom.X = stoi(v_geom[0]); - geom.Y = stoi(v_geom[1]); + slot_spacing.X = slot_spacing.X < 0 ? default_spacing.X : + imgsize.X * slot_spacing.X; + slot_spacing.Y = slot_spacing.Y < 0 ? default_spacing.Y : + imgsize.Y * slot_spacing.Y; - s32 start_i = 0; - if (!startindex.empty()) - start_i = stoi(startindex); + slot_spacing += slot_size; - if (geom.X < 0 || geom.Y < 0 || start_i < 0) { - errorstream << "Invalid list element: '" << element << "'" << std::endl; - return; - } + v2s32 pos = data->real_coordinates ? getRealCoordinateBasePos(v_pos) : + getElementBasePos(&v_pos); - if (!data->explicit_size) - warningstream << "invalid use of list without a size[] element" << std::endl; + core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, + pos.X + (geom.X - 1) * slot_spacing.X + slot_size.X, + pos.Y + (geom.Y - 1) * slot_spacing.Y + slot_size.Y); - FieldSpec spec( - "", - L"", - L"", - 258 + m_fields.size(), - 3 - ); + GUIInventoryList *e = new GUIInventoryList(Environment, data->current_parent, + spec.fid, rect, m_invmgr, loc, listname, geom, start_i, + v2s32(slot_size.X, slot_size.Y), slot_spacing, this, + data->inventorylist_options, m_font); - v2f32 slot_spacing = data->real_coordinates ? - v2f32(imgsize.X * 1.25f, imgsize.Y * 1.25f) : spacing; + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - v2s32 pos = data->real_coordinates ? getRealCoordinateBasePos(v_pos) - : getElementBasePos(&v_pos); - - core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, - pos.X + (geom.X - 1) * slot_spacing.X + imgsize.X, - pos.Y + (geom.Y - 1) * slot_spacing.Y + imgsize.Y); - - GUIInventoryList *e = new GUIInventoryList(Environment, data->current_parent, - spec.fid, rect, m_invmgr, loc, listname, geom, start_i, imgsize, - slot_spacing, this, data->inventorylist_options, m_font); - - m_inventorylists.push_back(e); - m_fields.push_back(spec); - return; - } - errorstream<< "Invalid list element(" << parts.size() << "): '" << element << "'" << std::endl; + m_inventorylists.push_back(e); + m_fields.push_back(spec); } void GUIFormSpecMenu::parseListRing(parserData *data, const std::string &element) { - if (m_client == 0) { - errorstream << "WARNING: invalid use of 'listring' with m_client==0" << std::endl; - return; - } + MY_CHECKCLIENT("listring"); std::vector<std::string> parts = split(element, ';'); @@ -553,154 +565,150 @@ void GUIFormSpecMenu::parseListRing(parserData *data, const std::string &element void GUIFormSpecMenu::parseCheckbox(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - - if (((parts.size() >= 3) && (parts.size() <= 4)) || - ((parts.size() > 4) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::string name = parts[1]; - std::string label = parts[2]; - std::string selected; - - if (parts.size() >= 4) - selected = parts[3]; - - MY_CHECKPOS("checkbox",0); - - bool fselected = false; - - if (selected == "true") - fselected = true; - - std::wstring wlabel = translate_string(utf8_to_wide(unescape_string(label))); - const core::dimension2d<u32> label_size = m_font->getDimension(wlabel.c_str()); - s32 cb_size = Environment->getSkin()->getSize(gui::EGDS_CHECK_BOX_WIDTH); - s32 y_center = (std::max(label_size.Height, (u32)cb_size) + 1) / 2; - - v2s32 pos; - core::rect<s32> rect; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - - rect = core::rect<s32>( - pos.X, - pos.Y - y_center, - pos.X + label_size.Width + cb_size + 7, - pos.Y + y_center - ); - } else { - pos = getElementBasePos(&v_pos); - rect = core::rect<s32>( - pos.X, - pos.Y + imgsize.Y / 2 - y_center, - pos.X + label_size.Width + cb_size + 7, - pos.Y + imgsize.Y / 2 + y_center - ); - } - - FieldSpec spec( - name, - wlabel, //Needed for displaying text on MSVC - wlabel, - 258+m_fields.size() - ); - - spec.ftype = f_CheckBox; - - gui::IGUICheckBox *e = Environment->addCheckBox(fselected, rect, - data->current_parent, spec.fid, spec.flabel.c_str()); - - auto style = getDefaultStyleForElement("checkbox", name); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - - if (spec.fname == m_focused_element) { - Environment->setFocus(e); - } - - e->grab(); - m_checkboxes.emplace_back(spec, e); - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("checkbox", element, 3, 4, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::string name = parts[1]; + std::string label = parts[2]; + std::string selected; + + if (parts.size() >= 4) + selected = parts[3]; + + MY_CHECKPOS("checkbox",0); + + bool fselected = false; + + if (selected == "true") + fselected = true; + + std::wstring wlabel = translate_string(utf8_to_wide(unescape_string(label))); + const core::dimension2d<u32> label_size = m_font->getDimension(wlabel.c_str()); + s32 cb_size = Environment->getSkin()->getSize(gui::EGDS_CHECK_BOX_WIDTH); + s32 y_center = (std::max(label_size.Height, (u32)cb_size) + 1) / 2; + + v2s32 pos; + core::rect<s32> rect; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + + rect = core::rect<s32>( + pos.X, + pos.Y - y_center, + pos.X + label_size.Width + cb_size + 7, + pos.Y + y_center + ); + } else { + pos = getElementBasePos(&v_pos); + rect = core::rect<s32>( + pos.X, + pos.Y + imgsize.Y / 2 - y_center, + pos.X + label_size.Width + cb_size + 7, + pos.Y + imgsize.Y / 2 + y_center + ); } - errorstream<< "Invalid checkbox element(" << parts.size() << "): '" << element << "'" << std::endl; + + FieldSpec spec( + name, + wlabel, //Needed for displaying text on MSVC + wlabel, + 258+m_fields.size() + ); + + spec.ftype = f_CheckBox; + + gui::IGUICheckBox *e = Environment->addCheckBox(fselected, rect, + data->current_parent, spec.fid, spec.flabel.c_str()); + + auto style = getDefaultStyleForElement("checkbox", name); + + spec.sound = style.get(StyleSpec::Property::SOUND, ""); + + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + + if (spec.fname == m_focused_element) { + Environment->setFocus(e); + } + + e->grab(); + m_checkboxes.emplace_back(spec, e); + m_fields.push_back(spec); } void GUIFormSpecMenu::parseScrollBar(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - - if (parts.size() >= 5) { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string name = parts[3]; - std::string value = parts[4]; - - MY_CHECKPOS("scrollbar",0); - MY_CHECKGEOM("scrollbar",1); - - v2s32 pos; - v2s32 dim; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - dim = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - dim.X = stof(v_geom[0]) * spacing.X; - dim.Y = stof(v_geom[1]) * spacing.Y; - } - - core::rect<s32> rect = - core::rect<s32>(pos.X, pos.Y, pos.X + dim.X, pos.Y + dim.Y); - - FieldSpec spec( - name, - L"", - L"", - 258+m_fields.size() - ); - - bool is_horizontal = true; - - if (parts[2] == "vertical") - is_horizontal = false; - - spec.ftype = f_ScrollBar; - spec.send = true; - GUIScrollBar *e = new GUIScrollBar(Environment, data->current_parent, - spec.fid, rect, is_horizontal, true); - - auto style = getDefaultStyleForElement("scrollbar", name); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - e->setArrowsVisible(data->scrollbar_options.arrow_visiblity); - - s32 max = data->scrollbar_options.max; - s32 min = data->scrollbar_options.min; - - e->setMax(max); - e->setMin(min); - - e->setPos(stoi(parts[4])); - - e->setSmallStep(data->scrollbar_options.small_step); - e->setLargeStep(data->scrollbar_options.large_step); - - s32 scrollbar_size = is_horizontal ? dim.X : dim.Y; - - e->setPageSize(scrollbar_size * (max - min + 1) / data->scrollbar_options.thumb_size); - - if (spec.fname == m_focused_element) { - Environment->setFocus(e); - } - - m_scrollbars.emplace_back(spec,e); - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("scrollbar", element, 5, 5, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string name = parts[3]; + std::string value = parts[4]; + + MY_CHECKPOS("scrollbar",0); + MY_CHECKGEOM("scrollbar",1); + + v2s32 pos; + v2s32 dim; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + dim = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + dim.X = stof(v_geom[0]) * spacing.X; + dim.Y = stof(v_geom[1]) * spacing.Y; } - errorstream << "Invalid scrollbar element(" << parts.size() << "): '" << element - << "'" << std::endl; + + core::rect<s32> rect = + core::rect<s32>(pos.X, pos.Y, pos.X + dim.X, pos.Y + dim.Y); + + FieldSpec spec( + name, + L"", + L"", + 258+m_fields.size() + ); + + bool is_horizontal = true; + + if (parts[2] == "vertical") + is_horizontal = false; + + spec.ftype = f_ScrollBar; + spec.send = true; + GUIScrollBar *e = new GUIScrollBar(Environment, data->current_parent, + spec.fid, rect, is_horizontal, true); + + auto style = getDefaultStyleForElement("scrollbar", name); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + e->setArrowsVisible(data->scrollbar_options.arrow_visiblity); + + s32 max = data->scrollbar_options.max; + s32 min = data->scrollbar_options.min; + + e->setMax(max); + e->setMin(min); + + e->setPos(stoi(parts[4])); + + e->setSmallStep(data->scrollbar_options.small_step); + e->setLargeStep(data->scrollbar_options.large_step); + + s32 scrollbar_size = is_horizontal ? dim.X : dim.Y; + + e->setPageSize(scrollbar_size * (max - min + 1) / data->scrollbar_options.thumb_size); + + if (spec.fname == m_focused_element) { + Environment->setFocus(e); + } + + m_scrollbars.emplace_back(spec,e); + m_fields.push_back(spec); } void GUIFormSpecMenu::parseScrollBarOptions(parserData* data, const std::string &element) @@ -758,110 +766,101 @@ void GUIFormSpecMenu::parseScrollBarOptions(parserData* data, const std::string void GUIFormSpecMenu::parseImage(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); + std::vector<std::string> parts; + if (!precheckElement("image", element, 2, 4, parts)) + return; - if ((parts.size() == 3) || - ((parts.size() > 3) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string name = unescape_string(parts[2]); + size_t offset = parts.size() >= 3; - MY_CHECKPOS("image", 0); + std::vector<std::string> v_pos = split(parts[0],','); + MY_CHECKPOS("image", 0); + + std::vector<std::string> v_geom; + if (parts.size() >= 3) { + v_geom = split(parts[1],','); MY_CHECKGEOM("image", 1); + } - v2s32 pos; - v2s32 geom; + std::string name = unescape_string(parts[1 + offset]); + video::ITexture *texture = m_tsrc->getTexture(name); - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); + v2s32 pos; + v2s32 geom; + + if (parts.size() < 3) { + if (texture != nullptr) { + core::dimension2du dim = texture->getOriginalSize(); + geom.X = dim.Width; + geom.Y = dim.Height; } else { - pos = getElementBasePos(&v_pos); + geom = v2s32(0); + } + } + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + if (parts.size() >= 3) + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + if (parts.size() >= 3) { geom.X = stof(v_geom[0]) * (float)imgsize.X; geom.Y = stof(v_geom[1]) * (float)imgsize.Y; } - - if (!data->explicit_size) - warningstream<<"invalid use of image without a size[] element"<<std::endl; - - video::ITexture *texture = m_tsrc->getTexture(name); - if (!texture) { - errorstream << "GUIFormSpecMenu::parseImage() Unable to load texture:" - << std::endl << "\t" << name << std::endl; - return; - } - - FieldSpec spec( - name, - L"", - L"", - 258 + m_fields.size(), - 1 - ); - core::rect<s32> rect(pos, pos + geom); - gui::IGUIImage *e = Environment->addImage(rect, data->current_parent, - spec.fid, 0, true); - e->setImage(texture); - e->setScaleImage(true); - auto style = getDefaultStyleForElement("image", spec.fname); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, m_formspec_version < 3)); - m_fields.push_back(spec); - - // images should let events through - e->grab(); - m_clickthrough_elements.push_back(e); - return; } - if (parts.size() == 2) { - std::vector<std::string> v_pos = split(parts[0],','); - std::string name = unescape_string(parts[1]); + if (!data->explicit_size) + warningstream << "Invalid use of image without a size[] element" << std::endl; - MY_CHECKPOS("image", 0); + FieldSpec spec( + name, + L"", + L"", + 258 + m_fields.size(), + 1 + ); - v2s32 pos = getElementBasePos(&v_pos); + core::rect<s32> rect = core::rect<s32>(pos, pos + geom); - if (!data->explicit_size) - warningstream<<"invalid use of image without a size[] element"<<std::endl; + core::rect<s32> middle; + if (parts.size() >= 4) + parseMiddleRect(parts[3], &middle); + + // Temporary fix for issue #12581 in 5.6.0. + // Use legacy image when not rendering 9-slice image because GUIAnimatedImage + // uses NNAA filter which causes visual artifacts when image uses alpha blending. - video::ITexture *texture = m_tsrc->getTexture(name); - if (!texture) { - errorstream << "GUIFormSpecMenu::parseImage() Unable to load texture:" - << std::endl << "\t" << name << std::endl; - return; - } + gui::IGUIElement *e; + if (middle.getArea() > 0) { + GUIAnimatedImage *image = new GUIAnimatedImage(Environment, data->current_parent, + spec.fid, rect); - FieldSpec spec( - name, - L"", - L"", - 258 + m_fields.size() - ); - gui::IGUIImage *e = Environment->addImage(texture, pos, true, - data->current_parent, spec.fid, 0); - auto style = getDefaultStyleForElement("image", spec.fname); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, m_formspec_version < 3)); - m_fields.push_back(spec); - - // images should let events through - e->grab(); - m_clickthrough_elements.push_back(e); - return; + image->setTexture(texture); + image->setMiddleRect(middle); + e = image; } - errorstream<< "Invalid image element(" << parts.size() << "): '" << element << "'" << std::endl; + else { + gui::IGUIImage *image = Environment->addImage(rect, data->current_parent, spec.fid, nullptr, true); + image->setImage(texture); + image->setScaleImage(true); + image->grab(); // compensate for drop in addImage + e = image; + } + + auto style = getDefaultStyleForElement("image", spec.fname); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, m_formspec_version < 3)); + + // Animated images should let events through + m_clickthrough_elements.push_back(e); + + m_fields.push_back(spec); } void GUIFormSpecMenu::parseAnimatedImage(parserData *data, const std::string &element) { - std::vector<std::string> parts = split(element, ';'); - - if (parts.size() != 6 && parts.size() != 7 && - !(parts.size() > 7 && m_formspec_version > FORMSPEC_API_VERSION)) { - errorstream << "Invalid animated_image element(" << parts.size() - << "): '" << element << "'" << std::endl; + std::vector<std::string> parts; + if (!precheckElement("animated_image", element, 6, 8, parts)) return; - } std::vector<std::string> v_pos = split(parts[0], ','); std::vector<std::string> v_geom = split(parts[1], ','); @@ -886,7 +885,8 @@ void GUIFormSpecMenu::parseAnimatedImage(parserData *data, const std::string &el } if (!data->explicit_size) - warningstream << "Invalid use of animated_image without a size[] element" << std::endl; + warningstream << "Invalid use of animated_image without a size[] element" + << std::endl; FieldSpec spec( name, @@ -899,9 +899,17 @@ void GUIFormSpecMenu::parseAnimatedImage(parserData *data, const std::string &el core::rect<s32> rect = core::rect<s32>(pos, pos + geom); - GUIAnimatedImage *e = new GUIAnimatedImage(Environment, this, spec.fid, - rect, texture_name, frame_count, frame_duration, m_tsrc); + core::rect<s32> middle; + if (parts.size() >= 8) + parseMiddleRect(parts[7], &middle); + GUIAnimatedImage *e = new GUIAnimatedImage(Environment, data->current_parent, + spec.fid, rect); + + e->setTexture(m_tsrc->getTexture(texture_name)); + e->setMiddleRect(middle); + e->setFrameDuration(frame_duration); + e->setFrameCount(frame_count); if (parts.size() >= 7) e->setFrameIndex(stoi(parts[6]) - 1); @@ -916,215 +924,217 @@ void GUIFormSpecMenu::parseAnimatedImage(parserData *data, const std::string &el void GUIFormSpecMenu::parseItemImage(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - - if ((parts.size() == 3) || - ((parts.size() > 3) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string name = parts[2]; - - MY_CHECKPOS("itemimage",0); - MY_CHECKGEOM("itemimage",1); - - v2s32 pos; - v2s32 geom; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - geom.X = stof(v_geom[0]) * (float)imgsize.X; - geom.Y = stof(v_geom[1]) * (float)imgsize.Y; - } - - if(!data->explicit_size) - warningstream<<"invalid use of item_image without a size[] element"<<std::endl; - - FieldSpec spec( - "", - L"", - L"", - 258 + m_fields.size(), - 2 - ); - spec.ftype = f_ItemImage; - - GUIItemImage *e = new GUIItemImage(Environment, data->current_parent, spec.fid, - core::rect<s32>(pos, pos + geom), name, m_font, m_client); - auto style = getDefaultStyleForElement("item_image", spec.fname); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - - // item images should let events through - m_clickthrough_elements.push_back(e); - - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("item_image", element, 3, 3, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string name = parts[2]; + + MY_CHECKPOS("item_image",0); + MY_CHECKGEOM("item_image",1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + geom.X = stof(v_geom[0]) * (float)imgsize.X; + geom.Y = stof(v_geom[1]) * (float)imgsize.Y; } - errorstream<< "Invalid ItemImage element(" << parts.size() << "): '" << element << "'" << std::endl; + + if(!data->explicit_size) + warningstream<<"invalid use of item_image without a size[] element"<<std::endl; + + FieldSpec spec( + "", + L"", + L"", + 258 + m_fields.size(), + 2 + ); + spec.ftype = f_ItemImage; + + GUIItemImage *e = new GUIItemImage(Environment, data->current_parent, spec.fid, + core::rect<s32>(pos, pos + geom), name, m_font, m_client); + auto style = getDefaultStyleForElement("item_image", spec.fname); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + + // item images should let events through + m_clickthrough_elements.push_back(e); + + m_fields.push_back(spec); } void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element, const std::string &type) { - std::vector<std::string> parts = split(element,';'); - - if ((parts.size() == 4) || - ((parts.size() > 4) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string name = parts[2]; - std::string label = parts[3]; - - MY_CHECKPOS("button",0); - MY_CHECKGEOM("button",1); - - v2s32 pos; - v2s32 geom; - core::rect<s32> rect; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, - pos.Y+geom.Y); - } else { - pos = getElementBasePos(&v_pos); - geom.X = (stof(v_geom[0]) * spacing.X) - (spacing.X - imgsize.X); - pos.Y += (stof(v_geom[1]) * (float)imgsize.Y)/2; - - rect = core::rect<s32>(pos.X, pos.Y - m_btn_height, - pos.X + geom.X, pos.Y + m_btn_height); - } - - if(!data->explicit_size) - warningstream<<"invalid use of button without a size[] element"<<std::endl; - - std::wstring wlabel = translate_string(utf8_to_wide(unescape_string(label))); - - FieldSpec spec( - name, - wlabel, - L"", - 258 + m_fields.size() - ); - spec.ftype = f_Button; - if(type == "button_exit") - spec.is_exit = true; - - GUIButton *e = GUIButton::addButton(Environment, rect, m_tsrc, - data->current_parent, spec.fid, spec.flabel.c_str()); - - auto style = getStyleForElement(type, name, (type != "button") ? "button" : ""); - e->setStyles(style); - - if (spec.fname == m_focused_element) { - Environment->setFocus(e); - } - - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("button", element, 4, 4, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string name = parts[2]; + std::string label = parts[3]; + + MY_CHECKPOS("button",0); + MY_CHECKGEOM("button",1); + + v2s32 pos; + v2s32 geom; + core::rect<s32> rect; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, + pos.Y+geom.Y); + } else { + pos = getElementBasePos(&v_pos); + geom.X = (stof(v_geom[0]) * spacing.X) - (spacing.X - imgsize.X); + pos.Y += (stof(v_geom[1]) * (float)imgsize.Y)/2; + + rect = core::rect<s32>(pos.X, pos.Y - m_btn_height, + pos.X + geom.X, pos.Y + m_btn_height); } - errorstream<< "Invalid button element(" << parts.size() << "): '" << element << "'" << std::endl; + + if(!data->explicit_size) + warningstream<<"invalid use of button without a size[] element"<<std::endl; + + std::wstring wlabel = translate_string(utf8_to_wide(unescape_string(label))); + + FieldSpec spec( + name, + wlabel, + L"", + 258 + m_fields.size() + ); + spec.ftype = f_Button; + if(type == "button_exit") + spec.is_exit = true; + + GUIButton *e = GUIButton::addButton(Environment, rect, m_tsrc, + data->current_parent, spec.fid, spec.flabel.c_str()); + + auto style = getStyleForElement(type, name, (type != "button") ? "button" : ""); + + spec.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, ""); + + e->setStyles(style); + + if (spec.fname == m_focused_element) { + Environment->setFocus(e); + } + + m_fields.push_back(spec); +} + +bool GUIFormSpecMenu::parseMiddleRect(const std::string &value, core::rect<s32> *parsed_rect) +{ + core::rect<s32> rect; + std::vector<std::string> v_rect = split(value, ','); + + if (v_rect.size() == 1) { + s32 x = stoi(v_rect[0]); + rect.UpperLeftCorner = core::vector2di(x, x); + rect.LowerRightCorner = core::vector2di(-x, -x); + } else if (v_rect.size() == 2) { + s32 x = stoi(v_rect[0]); + s32 y = stoi(v_rect[1]); + rect.UpperLeftCorner = core::vector2di(x, y); + rect.LowerRightCorner = core::vector2di(-x, -y); + // `-x` is interpreted as `w - x` + } else if (v_rect.size() == 4) { + rect.UpperLeftCorner = core::vector2di(stoi(v_rect[0]), stoi(v_rect[1])); + rect.LowerRightCorner = core::vector2di(stoi(v_rect[2]), stoi(v_rect[3])); + } else { + warningstream << "Invalid rectangle string format: \"" << value + << "\"" << std::endl; + return false; + } + + *parsed_rect = rect; + + return true; } void GUIFormSpecMenu::parseBackground(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - - if ((parts.size() >= 3 && parts.size() <= 5) || - (parts.size() > 5 && m_formspec_version > FORMSPEC_API_VERSION)) { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string name = unescape_string(parts[2]); - - MY_CHECKPOS("background",0); - MY_CHECKGEOM("background",1); - - v2s32 pos; - v2s32 geom; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - pos.X -= (spacing.X - (float)imgsize.X) / 2; - pos.Y -= (spacing.Y - (float)imgsize.Y) / 2; - - geom.X = stof(v_geom[0]) * spacing.X; - geom.Y = stof(v_geom[1]) * spacing.Y; - } - - bool clip = false; - if (parts.size() >= 4 && is_yes(parts[3])) { - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos) * -1; - geom = v2s32(0, 0); - } else { - pos.X = stoi(v_pos[0]); //acts as offset - pos.Y = stoi(v_pos[1]); - } - clip = true; - } - - core::rect<s32> middle; - if (parts.size() >= 5) { - std::vector<std::string> v_middle = split(parts[4], ','); - if (v_middle.size() == 1) { - s32 x = stoi(v_middle[0]); - middle.UpperLeftCorner = core::vector2di(x, x); - middle.LowerRightCorner = core::vector2di(-x, -x); - } else if (v_middle.size() == 2) { - s32 x = stoi(v_middle[0]); - s32 y = stoi(v_middle[1]); - middle.UpperLeftCorner = core::vector2di(x, y); - middle.LowerRightCorner = core::vector2di(-x, -y); - // `-x` is interpreted as `w - x` - } else if (v_middle.size() == 4) { - middle.UpperLeftCorner = core::vector2di(stoi(v_middle[0]), stoi(v_middle[1])); - middle.LowerRightCorner = core::vector2di(stoi(v_middle[2]), stoi(v_middle[3])); - } else { - warningstream << "Invalid rectangle given to middle param of background[] element" << std::endl; - } - } - - if (!data->explicit_size && !clip) - warningstream << "invalid use of unclipped background without a size[] element" << std::endl; - - FieldSpec spec( - name, - L"", - L"", - 258 + m_fields.size() - ); - - core::rect<s32> rect; - if (!clip) { - // no auto_clip => position like normal image - rect = core::rect<s32>(pos, pos + geom); - } else { - // it will be auto-clipped when drawing - rect = core::rect<s32>(-pos, pos); - } - - GUIBackgroundImage *e = new GUIBackgroundImage(Environment, this, spec.fid, - rect, name, middle, m_tsrc, clip); - - FATAL_ERROR_IF(!e, "Failed to create background formspec element"); - - e->setNotClipped(true); - - e->setVisible(false); // the element is drawn manually before all others - - m_backgrounds.push_back(e); - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("background", element, 3, 5, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string name = unescape_string(parts[2]); + + MY_CHECKPOS("background",0); + MY_CHECKGEOM("background",1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + pos.X -= (spacing.X - (float)imgsize.X) / 2; + pos.Y -= (spacing.Y - (float)imgsize.Y) / 2; + + geom.X = stof(v_geom[0]) * spacing.X; + geom.Y = stof(v_geom[1]) * spacing.Y; } - errorstream<< "Invalid background element(" << parts.size() << "): '" << element << "'" << std::endl; + + bool clip = false; + if (parts.size() >= 4 && is_yes(parts[3])) { + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos) * -1; + geom = v2s32(0, 0); + } else { + pos.X = stoi(v_pos[0]); //acts as offset + pos.Y = stoi(v_pos[1]); + } + clip = true; + } + + core::rect<s32> middle; + if (parts.size() >= 5) + parseMiddleRect(parts[4], &middle); + + if (!data->explicit_size && !clip) + warningstream << "invalid use of unclipped background without a size[] element" << std::endl; + + FieldSpec spec( + name, + L"", + L"", + 258 + m_fields.size() + ); + + core::rect<s32> rect; + if (!clip) { + // no auto_clip => position like normal image + rect = core::rect<s32>(pos, pos + geom); + } else { + // it will be auto-clipped when drawing + rect = core::rect<s32>(-pos, pos); + } + + GUIBackgroundImage *e = new GUIBackgroundImage(Environment, data->background_parent.get(), + spec.fid, rect, name, middle, m_tsrc, clip); + + FATAL_ERROR_IF(!e, "Failed to create background formspec element"); + + e->setNotClipped(true); + + m_fields.push_back(spec); + e->drop(); } void GUIFormSpecMenu::parseTableOptions(parserData* data, const std::string &element) @@ -1161,335 +1171,320 @@ void GUIFormSpecMenu::parseTableColumns(parserData* data, const std::string &ele void GUIFormSpecMenu::parseTable(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - - if (((parts.size() == 4) || (parts.size() == 5)) || - ((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string name = parts[2]; - std::vector<std::string> items = split(parts[3],','); - std::string str_initial_selection; - std::string str_transparent = "false"; - - if (parts.size() >= 5) - str_initial_selection = parts[4]; - - MY_CHECKPOS("table",0); - MY_CHECKGEOM("table",1); - - v2s32 pos; - v2s32 geom; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - geom.X = stof(v_geom[0]) * spacing.X; - geom.Y = stof(v_geom[1]) * spacing.Y; - } - - core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); - - FieldSpec spec( - name, - L"", - L"", - 258 + m_fields.size() - ); - - spec.ftype = f_Table; - - for (std::string &item : items) { - item = wide_to_utf8(unescape_translate(utf8_to_wide(unescape_string(item)))); - } - - //now really show table - GUITable *e = new GUITable(Environment, data->current_parent, spec.fid, - rect, m_tsrc); - - if (spec.fname == m_focused_element) { - Environment->setFocus(e); - } - - e->setTable(data->table_options, data->table_columns, items); - - if (data->table_dyndata.find(name) != data->table_dyndata.end()) { - e->setDynamicData(data->table_dyndata[name]); - } - - if (!str_initial_selection.empty() && str_initial_selection != "0") - e->setSelected(stoi(str_initial_selection)); - - auto style = getDefaultStyleForElement("table", name); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - e->setOverrideFont(style.getFont()); - - m_tables.emplace_back(spec, e); - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("table", element, 4, 5, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string name = parts[2]; + std::vector<std::string> items = split(parts[3],','); + std::string str_initial_selection; + std::string str_transparent = "false"; + + if (parts.size() >= 5) + str_initial_selection = parts[4]; + + MY_CHECKPOS("table",0); + MY_CHECKGEOM("table",1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + geom.X = stof(v_geom[0]) * spacing.X; + geom.Y = stof(v_geom[1]) * spacing.Y; } - errorstream<< "Invalid table element(" << parts.size() << "): '" << element << "'" << std::endl; + + core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); + + FieldSpec spec( + name, + L"", + L"", + 258 + m_fields.size() + ); + + spec.ftype = f_Table; + + for (std::string &item : items) { + item = wide_to_utf8(unescape_translate(utf8_to_wide(unescape_string(item)))); + } + + //now really show table + GUITable *e = new GUITable(Environment, data->current_parent, spec.fid, + rect, m_tsrc); + + if (spec.fname == m_focused_element) { + Environment->setFocus(e); + } + + e->setTable(data->table_options, data->table_columns, items); + + if (data->table_dyndata.find(name) != data->table_dyndata.end()) { + e->setDynamicData(data->table_dyndata[name]); + } + + if (!str_initial_selection.empty() && str_initial_selection != "0") + e->setSelected(stoi(str_initial_selection)); + + auto style = getDefaultStyleForElement("table", name); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + e->setOverrideFont(style.getFont()); + + m_tables.emplace_back(spec, e); + m_fields.push_back(spec); } void GUIFormSpecMenu::parseTextList(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - - if (((parts.size() == 4) || (parts.size() == 5) || (parts.size() == 6)) || - ((parts.size() > 6) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string name = parts[2]; - std::vector<std::string> items = split(parts[3],','); - std::string str_initial_selection; - std::string str_transparent = "false"; - - if (parts.size() >= 5) - str_initial_selection = parts[4]; - - if (parts.size() >= 6) - str_transparent = parts[5]; - - MY_CHECKPOS("textlist",0); - MY_CHECKGEOM("textlist",1); - - v2s32 pos; - v2s32 geom; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - geom.X = stof(v_geom[0]) * spacing.X; - geom.Y = stof(v_geom[1]) * spacing.Y; - } - - core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); - - FieldSpec spec( - name, - L"", - L"", - 258 + m_fields.size() - ); - - spec.ftype = f_Table; - - for (std::string &item : items) { - item = wide_to_utf8(unescape_translate(utf8_to_wide(unescape_string(item)))); - } - - //now really show list - GUITable *e = new GUITable(Environment, data->current_parent, spec.fid, - rect, m_tsrc); - - if (spec.fname == m_focused_element) { - Environment->setFocus(e); - } - - e->setTextList(items, is_yes(str_transparent)); - - if (data->table_dyndata.find(name) != data->table_dyndata.end()) { - e->setDynamicData(data->table_dyndata[name]); - } - - if (!str_initial_selection.empty() && str_initial_selection != "0") - e->setSelected(stoi(str_initial_selection)); - - auto style = getDefaultStyleForElement("textlist", name); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - e->setOverrideFont(style.getFont()); - - m_tables.emplace_back(spec, e); - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("textlist", element, 4, 6, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string name = parts[2]; + std::vector<std::string> items = split(parts[3],','); + std::string str_initial_selection; + std::string str_transparent = "false"; + + if (parts.size() >= 5) + str_initial_selection = parts[4]; + + if (parts.size() >= 6) + str_transparent = parts[5]; + + MY_CHECKPOS("textlist",0); + MY_CHECKGEOM("textlist",1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + geom.X = stof(v_geom[0]) * spacing.X; + geom.Y = stof(v_geom[1]) * spacing.Y; } - errorstream<< "Invalid textlist element(" << parts.size() << "): '" << element << "'" << std::endl; + + core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); + + FieldSpec spec( + name, + L"", + L"", + 258 + m_fields.size() + ); + + spec.ftype = f_Table; + + for (std::string &item : items) { + item = wide_to_utf8(unescape_translate(utf8_to_wide(unescape_string(item)))); + } + + //now really show list + GUITable *e = new GUITable(Environment, data->current_parent, spec.fid, + rect, m_tsrc); + + if (spec.fname == m_focused_element) { + Environment->setFocus(e); + } + + e->setTextList(items, is_yes(str_transparent)); + + if (data->table_dyndata.find(name) != data->table_dyndata.end()) { + e->setDynamicData(data->table_dyndata[name]); + } + + if (!str_initial_selection.empty() && str_initial_selection != "0") + e->setSelected(stoi(str_initial_selection)); + + auto style = getDefaultStyleForElement("textlist", name); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + e->setOverrideFont(style.getFont()); + + m_tables.emplace_back(spec, e); + m_fields.push_back(spec); } void GUIFormSpecMenu::parseDropDown(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element, ';'); - - if (parts.size() == 5 || parts.size() == 6 || - (parts.size() > 6 && m_formspec_version > FORMSPEC_API_VERSION)) - { - std::vector<std::string> v_pos = split(parts[0], ','); - std::string name = parts[2]; - std::vector<std::string> items = split(parts[3], ','); - std::string str_initial_selection = parts[4]; - - if (parts.size() >= 6 && is_yes(parts[5])) - m_dropdown_index_event[name] = true; - - MY_CHECKPOS("dropdown",0); - - v2s32 pos; - v2s32 geom; - core::rect<s32> rect; - - if (data->real_coordinates) { - std::vector<std::string> v_geom = split(parts[1],','); - - if (v_geom.size() == 1) - v_geom.emplace_back("1"); - - MY_CHECKGEOM("dropdown",1); - - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); - } else { - pos = getElementBasePos(&v_pos); - - s32 width = stof(parts[1]) * spacing.Y; - - rect = core::rect<s32>(pos.X, pos.Y, - pos.X + width, pos.Y + (m_btn_height * 2)); - } - - FieldSpec spec( - name, - L"", - L"", - 258 + m_fields.size() - ); - - spec.ftype = f_DropDown; - spec.send = true; - - //now really show list - gui::IGUIComboBox *e = Environment->addComboBox(rect, data->current_parent, - spec.fid); - - if (spec.fname == m_focused_element) { - Environment->setFocus(e); - } - - for (const std::string &item : items) { - e->addItem(unescape_translate(unescape_string( - utf8_to_wide(item))).c_str()); - } - - if (!str_initial_selection.empty()) - e->setSelected(stoi(str_initial_selection)-1); - - auto style = getDefaultStyleForElement("dropdown", name); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - - m_fields.push_back(spec); - - m_dropdowns.emplace_back(spec, std::vector<std::string>()); - std::vector<std::string> &values = m_dropdowns.back().second; - for (const std::string &item : items) { - values.push_back(unescape_string(item)); - } - + std::vector<std::string> parts; + if (!precheckElement("dropdown", element, 5, 6, parts)) return; + + std::vector<std::string> v_pos = split(parts[0], ','); + std::string name = parts[2]; + std::vector<std::string> items = split(parts[3], ','); + std::string str_initial_selection = parts[4]; + + if (parts.size() >= 6 && is_yes(parts[5])) + m_dropdown_index_event[name] = true; + + MY_CHECKPOS("dropdown",0); + + v2s32 pos; + v2s32 geom; + core::rect<s32> rect; + + if (data->real_coordinates) { + std::vector<std::string> v_geom = split(parts[1],','); + + if (v_geom.size() == 1) + v_geom.emplace_back("1"); + + MY_CHECKGEOM("dropdown",1); + + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); + } else { + pos = getElementBasePos(&v_pos); + + s32 width = stof(parts[1]) * spacing.Y; + + rect = core::rect<s32>(pos.X, pos.Y, + pos.X + width, pos.Y + (m_btn_height * 2)); + } + + FieldSpec spec( + name, + L"", + L"", + 258 + m_fields.size() + ); + + spec.ftype = f_DropDown; + spec.send = true; + + //now really show list + gui::IGUIComboBox *e = Environment->addComboBox(rect, data->current_parent, + spec.fid); + + if (spec.fname == m_focused_element) { + Environment->setFocus(e); + } + + for (const std::string &item : items) { + e->addItem(unescape_translate(unescape_string( + utf8_to_wide(item))).c_str()); + } + + if (!str_initial_selection.empty()) + e->setSelected(stoi(str_initial_selection)-1); + + auto style = getDefaultStyleForElement("dropdown", name); + + spec.sound = style.get(StyleSpec::Property::SOUND, ""); + + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + + m_fields.push_back(spec); + + m_dropdowns.emplace_back(spec, std::vector<std::string>()); + std::vector<std::string> &values = m_dropdowns.back().second; + for (const std::string &item : items) { + values.push_back(unescape_string(item)); } - errorstream << "Invalid dropdown element(" << parts.size() << "): '" << element - << "'" << std::endl; } void GUIFormSpecMenu::parseFieldCloseOnEnter(parserData *data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - if (parts.size() == 2 || - (parts.size() > 2 && m_formspec_version > FORMSPEC_API_VERSION)) { - field_close_on_enter[parts[0]] = is_yes(parts[1]); - } + std::vector<std::string> parts; + if (!precheckElement("field_close_on_enter", element, 2, 2, parts)) + return; + + field_close_on_enter[parts[0]] = is_yes(parts[1]); } void GUIFormSpecMenu::parsePwdField(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - - if (parts.size() == 4 || - (parts.size() > 4 && m_formspec_version > FORMSPEC_API_VERSION)) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string name = parts[2]; - std::string label = parts[3]; - - MY_CHECKPOS("pwdfield",0); - MY_CHECKGEOM("pwdfield",1); - - v2s32 pos; - v2s32 geom; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - pos -= padding; - - geom.X = (stof(v_geom[0]) * spacing.X) - (spacing.X - imgsize.X); - - pos.Y += (stof(v_geom[1]) * (float)imgsize.Y)/2; - pos.Y -= m_btn_height; - geom.Y = m_btn_height*2; - } - - core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); - - std::wstring wlabel = translate_string(utf8_to_wide(unescape_string(label))); - - FieldSpec spec( - name, - wlabel, - L"", - 258 + m_fields.size(), - 0, - ECI_IBEAM - ); - - spec.send = true; - gui::IGUIEditBox *e = Environment->addEditBox(0, rect, true, - data->current_parent, spec.fid); - - if (spec.fname == m_focused_element) { - Environment->setFocus(e); - } - - if (label.length() >= 1) { - int font_height = g_fontengine->getTextHeight(); - rect.UpperLeftCorner.Y -= font_height; - rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height; - gui::StaticText::add(Environment, spec.flabel.c_str(), rect, false, true, - data->current_parent, 0); - } - - e->setPasswordBox(true,L'*'); - - auto style = getDefaultStyleForElement("pwdfield", name, "field"); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - e->setDrawBorder(style.getBool(StyleSpec::BORDER, true)); - e->setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR, video::SColor(0xFFFFFFFF))); - e->setOverrideFont(style.getFont()); - - irr::SEvent evt; - evt.EventType = EET_KEY_INPUT_EVENT; - evt.KeyInput.Key = KEY_END; - evt.KeyInput.Char = 0; - evt.KeyInput.Control = false; - evt.KeyInput.Shift = false; - evt.KeyInput.PressedDown = true; - e->OnEvent(evt); - - // Note: Before 5.2.0 "parts.size() >= 5" resulted in a - // warning referring to field_close_on_enter[]! - - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("pwdfield", element, 4, 4, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string name = parts[2]; + std::string label = parts[3]; + + MY_CHECKPOS("pwdfield",0); + MY_CHECKGEOM("pwdfield",1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + pos -= padding; + + geom.X = (stof(v_geom[0]) * spacing.X) - (spacing.X - imgsize.X); + + pos.Y += (stof(v_geom[1]) * (float)imgsize.Y)/2; + pos.Y -= m_btn_height; + geom.Y = m_btn_height*2; } - errorstream<< "Invalid pwdfield element(" << parts.size() << "): '" << element << "'" << std::endl; + + core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); + + std::wstring wlabel = translate_string(utf8_to_wide(unescape_string(label))); + + FieldSpec spec( + name, + wlabel, + L"", + 258 + m_fields.size(), + 0, + ECI_IBEAM + ); + + spec.send = true; + gui::IGUIEditBox *e = Environment->addEditBox(0, rect, true, + data->current_parent, spec.fid); + + if (spec.fname == m_focused_element) { + Environment->setFocus(e); + } + + if (label.length() >= 1) { + int font_height = g_fontengine->getTextHeight(); + rect.UpperLeftCorner.Y -= font_height; + rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height; + gui::StaticText::add(Environment, spec.flabel.c_str(), rect, false, true, + data->current_parent, 0); + } + + e->setPasswordBox(true,L'*'); + + auto style = getDefaultStyleForElement("pwdfield", name, "field"); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + e->setDrawBorder(style.getBool(StyleSpec::BORDER, true)); + e->setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR, video::SColor(0xFFFFFFFF))); + e->setOverrideFont(style.getFont()); + + irr::SEvent evt; + evt.EventType = EET_KEY_INPUT_EVENT; + evt.KeyInput.Key = KEY_END; + evt.KeyInput.Char = 0; + evt.KeyInput.Control = false; + evt.KeyInput.Shift = false; + evt.KeyInput.PressedDown = true; + e->OnEvent(evt); + + // Note: Before 5.2.0 "parts.size() >= 5" resulted in a + // warning referring to field_close_on_enter[]! + + m_fields.push_back(spec); } void GUIFormSpecMenu::createTextField(parserData *data, FieldSpec &spec, @@ -1512,21 +1507,13 @@ void GUIFormSpecMenu::createTextField(parserData *data, FieldSpec &spec, } gui::IGUIEditBox *e = nullptr; - static constexpr bool use_intl_edit_box = USE_FREETYPE && - IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9; - - if (use_intl_edit_box && g_settings->getBool("freetype")) { - e = new gui::intlGUIEditBox(spec.fdefault.c_str(), true, Environment, - data->current_parent, spec.fid, rect, is_editable, is_multiline); - } else { - if (is_multiline) { - e = new GUIEditBoxWithScrollBar(spec.fdefault.c_str(), true, Environment, - data->current_parent, spec.fid, rect, is_editable, true); - } else if (is_editable) { - e = Environment->addEditBox(spec.fdefault.c_str(), rect, true, - data->current_parent, spec.fid); - e->grab(); - } + if (is_multiline) { + e = new GUIEditBoxWithScrollBar(spec.fdefault.c_str(), true, Environment, + data->current_parent, spec.fid, rect, is_editable, true); + } else if (is_editable) { + e = Environment->addEditBox(spec.fdefault.c_str(), rect, true, + data->current_parent, spec.fid); + e->grab(); } auto style = getDefaultStyleForElement(is_multiline ? "textarea" : "field", spec.fname); @@ -1551,11 +1538,10 @@ void GUIFormSpecMenu::createTextField(parserData *data, FieldSpec &spec, } e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - e->setDrawBorder(style.getBool(StyleSpec::BORDER, true)); e->setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR, video::SColor(0xFFFFFFFF))); - if (style.get(StyleSpec::BGCOLOR, "") == "transparent") { - e->setDrawBackground(false); - } + bool border = style.getBool(StyleSpec::BORDER, true); + e->setDrawBorder(border); + e->setDrawBackground(border); e->setOverrideFont(style.getFont()); e->drop(); @@ -1685,30 +1671,26 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, std::vector<std::string>& void GUIFormSpecMenu::parseField(parserData* data, const std::string &element, const std::string &type) { - std::vector<std::string> parts = split(element,';'); + std::vector<std::string> parts; + if (!precheckElement(type, element, 3, 5, parts)) + return; if (parts.size() == 3 || parts.size() == 4) { - parseSimpleField(data,parts); + parseSimpleField(data, parts); return; } - if ((parts.size() == 5) || - ((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - parseTextArea(data,parts,type); - return; - } - errorstream<< "Invalid field element(" << parts.size() << "): '" << element << "'" << std::endl; + // Else: >= 5 arguments in "parts" + parseTextArea(data, parts, type); } void GUIFormSpecMenu::parseHyperText(parserData *data, const std::string &element) { - std::vector<std::string> parts = split(element, ';'); + MY_CHECKCLIENT("hypertext"); - if (parts.size() != 4 && m_formspec_version < FORMSPEC_API_VERSION) { - errorstream << "Invalid text element(" << parts.size() << "): '" << element << "'" << std::endl; + std::vector<std::string> parts; + if (!precheckElement("hypertext", element, 4, 4, parts)) return; - } std::vector<std::string> v_pos = split(parts[0], ','); std::vector<std::string> v_geom = split(parts[1], ','); @@ -1746,6 +1728,10 @@ void GUIFormSpecMenu::parseHyperText(parserData *data, const std::string &elemen ); spec.ftype = f_HyperText; + + auto style = getDefaultStyleForElement("hypertext", spec.fname); + spec.sound = style.get(StyleSpec::Property::SOUND, ""); + GUIHyperText *e = new GUIHyperText(spec.flabel.c_str(), Environment, data->current_parent, spec.fid, rect, m_client, m_tsrc); e->drop(); @@ -1755,169 +1741,85 @@ void GUIFormSpecMenu::parseHyperText(parserData *data, const std::string &elemen void GUIFormSpecMenu::parseLabel(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - - if ((parts.size() == 2) || - ((parts.size() > 2) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::string text = parts[1]; - - MY_CHECKPOS("label",0); - - if(!data->explicit_size) - warningstream<<"invalid use of label without a size[] element"<<std::endl; - - std::vector<std::string> lines = split(text, '\n'); - - auto style = getDefaultStyleForElement("label", ""); - gui::IGUIFont *font = style.getFont(); - if (!font) - font = m_font; - - for (unsigned int i = 0; i != lines.size(); i++) { - std::wstring wlabel_colors = translate_string( - utf8_to_wide(unescape_string(lines[i]))); - // Without color escapes to get the font dimensions - std::wstring wlabel_plain = unescape_enriched(wlabel_colors); - - core::rect<s32> rect; - - if (data->real_coordinates) { - // Lines are spaced at the distance of 1/2 imgsize. - // This alows lines that line up with the new elements - // easily without sacrificing good line distance. If - // it was one whole imgsize, it would have too much - // spacing. - v2s32 pos = getRealCoordinateBasePos(v_pos); - - // Labels are positioned by their center, not their top. - pos.Y += (((float) imgsize.Y) / -2) + (((float) imgsize.Y) * i / 2); - - rect = core::rect<s32>( - pos.X, pos.Y, - pos.X + font->getDimension(wlabel_plain.c_str()).Width, - pos.Y + imgsize.Y); - - } else { - // Lines are spaced at the nominal distance of - // 2/5 inventory slot, even if the font doesn't - // quite match that. This provides consistent - // form layout, at the expense of sometimes - // having sub-optimal spacing for the font. - // We multiply by 2 and then divide by 5, rather - // than multiply by 0.4, to get exact results - // in the integer cases: 0.4 is not exactly - // representable in binary floating point. - - v2s32 pos = getElementBasePos(nullptr); - pos.X += stof(v_pos[0]) * spacing.X; - pos.Y += (stof(v_pos[1]) + 7.0f / 30.0f) * spacing.Y; - - pos.Y += ((float) i) * spacing.Y * 2.0 / 5.0; - - rect = core::rect<s32>( - pos.X, pos.Y - m_btn_height, - pos.X + font->getDimension(wlabel_plain.c_str()).Width, - pos.Y + m_btn_height); - } - - FieldSpec spec( - "", - wlabel_colors, - L"", - 258 + m_fields.size(), - 4 - ); - gui::IGUIStaticText *e = gui::StaticText::add(Environment, - spec.flabel.c_str(), rect, false, false, data->current_parent, - spec.fid); - e->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_CENTER); - - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); - e->setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR, video::SColor(0xFFFFFFFF))); - e->setOverrideFont(font); - - m_fields.push_back(spec); - - // labels should let events through - e->grab(); - m_clickthrough_elements.push_back(e); - } - + std::vector<std::string> parts; + if (!precheckElement("label", element, 2, 2, parts)) return; - } - errorstream << "Invalid label element(" << parts.size() << "): '" << element - << "'" << std::endl; -} -void GUIFormSpecMenu::parseVertLabel(parserData* data, const std::string &element) -{ - std::vector<std::string> parts = split(element,';'); + std::vector<std::string> v_pos = split(parts[0],','); - if ((parts.size() == 2) || - ((parts.size() > 2) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::wstring text = unescape_translate( - unescape_string(utf8_to_wide(parts[1]))); + MY_CHECKPOS("label",0); - MY_CHECKPOS("vertlabel",1); + if(!data->explicit_size) + warningstream<<"invalid use of label without a size[] element"<<std::endl; - auto style = getDefaultStyleForElement("vertlabel", "", "label"); - gui::IGUIFont *font = style.getFont(); - if (!font) - font = m_font; + auto style = getDefaultStyleForElement("label", ""); + gui::IGUIFont *font = style.getFont(); + if (!font) + font = m_font; + + EnrichedString str(unescape_string(utf8_to_wide(parts[1]))); + size_t str_pos = 0; + + for (size_t i = 0; str_pos < str.size(); ++i) { + // Split per line + size_t str_nl = str.getString().find(L'\n', str_pos); + if (str_nl == std::wstring::npos) + str_nl = str.getString().size(); + EnrichedString line = str.substr(str_pos, str_nl - str_pos); + str_pos += line.size() + 1; - v2s32 pos; core::rect<s32> rect; if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); + // Lines are spaced at the distance of 1/2 imgsize. + // This alows lines that line up with the new elements + // easily without sacrificing good line distance. If + // it was one whole imgsize, it would have too much + // spacing. + v2s32 pos = getRealCoordinateBasePos(v_pos); - // Vertlabels are positioned by center, not left. - pos.X -= imgsize.X / 2; + // Labels are positioned by their center, not their top. + pos.Y += (((float) imgsize.Y) / -2) + (((float) imgsize.Y) * i / 2); - // We use text.length + 1 because without it, the rect - // isn't quite tall enough and cuts off the text. - rect = core::rect<s32>(pos.X, pos.Y, - pos.X + imgsize.X, - pos.Y + font_line_height(font) * - (text.length() + 1)); + rect = core::rect<s32>( + pos.X, pos.Y, + pos.X + font->getDimension(line.c_str()).Width, + pos.Y + imgsize.Y); } else { - pos = getElementBasePos(&v_pos); + // Lines are spaced at the nominal distance of + // 2/5 inventory slot, even if the font doesn't + // quite match that. This provides consistent + // form layout, at the expense of sometimes + // having sub-optimal spacing for the font. + // We multiply by 2 and then divide by 5, rather + // than multiply by 0.4, to get exact results + // in the integer cases: 0.4 is not exactly + // representable in binary floating point. + + v2s32 pos = getElementBasePos(nullptr); + pos.X += stof(v_pos[0]) * spacing.X; + pos.Y += (stof(v_pos[1]) + 7.0f / 30.0f) * spacing.Y; + + pos.Y += ((float) i) * spacing.Y * 2.0 / 5.0; - // As above, the length must be one longer. The width of - // the rect (15 pixels) seems rather arbitrary, but - // changing it might break something. rect = core::rect<s32>( - pos.X, pos.Y+((imgsize.Y/2) - m_btn_height), - pos.X+15, pos.Y + - font_line_height(font) * - (text.length() + 1) + - ((imgsize.Y/2) - m_btn_height)); - } - - if(!data->explicit_size) - warningstream<<"invalid use of label without a size[] element"<<std::endl; - - std::wstring label; - - for (wchar_t i : text) { - label += i; - label += L"\n"; + pos.X, pos.Y - m_btn_height, + pos.X + font->getDimension(line.c_str()).Width, + pos.Y + m_btn_height); } FieldSpec spec( "", - label, L"", - 258 + m_fields.size() + L"", + 258 + m_fields.size(), + 4 ); - gui::IGUIStaticText *e = gui::StaticText::add(Environment, spec.flabel.c_str(), - rect, false, false, data->current_parent, spec.fid); - e->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_CENTER); + gui::IGUIStaticText *e = gui::StaticText::add(Environment, + line, rect, false, false, data->current_parent, + spec.fid); + e->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_CENTER); e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); e->setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR, video::SColor(0xFFFFFFFF))); @@ -1925,361 +1827,437 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data, const std::string &elemen m_fields.push_back(spec); - // vertlabels should let events through + // labels should let events through e->grab(); m_clickthrough_elements.push_back(e); - return; } - errorstream<< "Invalid vertlabel element(" << parts.size() << "): '" << element << "'" << std::endl; +} + +void GUIFormSpecMenu::parseVertLabel(parserData* data, const std::string &element) +{ + std::vector<std::string> parts; + if (!precheckElement("vertlabel", element, 2, 2, parts)) + return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::wstring text = unescape_translate( + unescape_string(utf8_to_wide(parts[1]))); + + MY_CHECKPOS("vertlabel",1); + + auto style = getDefaultStyleForElement("vertlabel", "", "label"); + gui::IGUIFont *font = style.getFont(); + if (!font) + font = m_font; + + v2s32 pos; + core::rect<s32> rect; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + + // Vertlabels are positioned by center, not left. + pos.X -= imgsize.X / 2; + + // We use text.length + 1 because without it, the rect + // isn't quite tall enough and cuts off the text. + rect = core::rect<s32>(pos.X, pos.Y, + pos.X + imgsize.X, + pos.Y + font_line_height(font) * + (text.length() + 1)); + + } else { + pos = getElementBasePos(&v_pos); + + // As above, the length must be one longer. The width of + // the rect (15 pixels) seems rather arbitrary, but + // changing it might break something. + rect = core::rect<s32>( + pos.X, pos.Y+((imgsize.Y/2) - m_btn_height), + pos.X+15, pos.Y + + font_line_height(font) * + (text.length() + 1) + + ((imgsize.Y/2) - m_btn_height)); + } + + if(!data->explicit_size) + warningstream<<"invalid use of label without a size[] element"<<std::endl; + + std::wstring label; + + for (wchar_t i : text) { + label += i; + label += L"\n"; + } + + FieldSpec spec( + "", + label, + L"", + 258 + m_fields.size() + ); + gui::IGUIStaticText *e = gui::StaticText::add(Environment, spec.flabel.c_str(), + rect, false, false, data->current_parent, spec.fid); + e->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_CENTER); + + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + e->setOverrideColor(style.getColor(StyleSpec::TEXTCOLOR, video::SColor(0xFFFFFFFF))); + e->setOverrideFont(font); + + m_fields.push_back(spec); + + // vertlabels should let events through + e->grab(); + m_clickthrough_elements.push_back(e); } void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &element, const std::string &type) { - std::vector<std::string> parts = split(element,';'); + std::vector<std::string> parts; + if (!precheckElement("image_button", element, 5, 8, parts)) + return; - if ((((parts.size() >= 5) && (parts.size() <= 8)) && (parts.size() != 6)) || - ((parts.size() > 8) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string image_name = parts[2]; - std::string name = parts[3]; - std::string label = parts[4]; - - MY_CHECKPOS("imagebutton",0); - MY_CHECKGEOM("imagebutton",1); - - std::string pressed_image_name; - - if (parts.size() >= 8) { - pressed_image_name = parts[7]; - } - - v2s32 pos; - v2s32 geom; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - geom.X = (stof(v_geom[0]) * spacing.X) - (spacing.X - imgsize.X); - geom.Y = (stof(v_geom[1]) * spacing.Y) - (spacing.Y - imgsize.Y); - } - - core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, - pos.Y+geom.Y); - - if (!data->explicit_size) - warningstream<<"invalid use of image_button without a size[] element"<<std::endl; - - image_name = unescape_string(image_name); - pressed_image_name = unescape_string(pressed_image_name); - - std::wstring wlabel = utf8_to_wide(unescape_string(label)); - - FieldSpec spec( - name, - wlabel, - utf8_to_wide(image_name), - 258 + m_fields.size() - ); - spec.ftype = f_Button; - if (type == "image_button_exit") - spec.is_exit = true; - - GUIButtonImage *e = GUIButtonImage::addButton(Environment, rect, m_tsrc, - data->current_parent, spec.fid, spec.flabel.c_str()); - - if (spec.fname == m_focused_element) { - Environment->setFocus(e); - } - - auto style = getStyleForElement("image_button", spec.fname); - - // Override style properties with values specified directly in the element - if (!image_name.empty()) - style[StyleSpec::STATE_DEFAULT].set(StyleSpec::FGIMG, image_name); - - if (!pressed_image_name.empty()) - style[StyleSpec::STATE_PRESSED].set(StyleSpec::FGIMG, pressed_image_name); - - if (parts.size() >= 7) { - style[StyleSpec::STATE_DEFAULT].set(StyleSpec::NOCLIP, parts[5]); - style[StyleSpec::STATE_DEFAULT].set(StyleSpec::BORDER, parts[6]); - } - - e->setStyles(style); - e->setScaleImage(true); - - m_fields.push_back(spec); + if (parts.size() == 6) { + // Invalid argument count. + errorstream << "Invalid image_button element(" << parts.size() << "): '" << element << "'" << std::endl; return; } - errorstream<< "Invalid imagebutton element(" << parts.size() << "): '" << element << "'" << std::endl; + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string image_name = parts[2]; + std::string name = parts[3]; + std::string label = parts[4]; + + MY_CHECKPOS("image_button",0); + MY_CHECKGEOM("image_button",1); + + std::string pressed_image_name; + + if (parts.size() >= 8) { + pressed_image_name = parts[7]; + } + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + geom.X = (stof(v_geom[0]) * spacing.X) - (spacing.X - imgsize.X); + geom.Y = (stof(v_geom[1]) * spacing.Y) - (spacing.Y - imgsize.Y); + } + + core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, + pos.Y+geom.Y); + + if (!data->explicit_size) + warningstream<<"invalid use of image_button without a size[] element"<<std::endl; + + image_name = unescape_string(image_name); + pressed_image_name = unescape_string(pressed_image_name); + + std::wstring wlabel = utf8_to_wide(unescape_string(label)); + + FieldSpec spec( + name, + wlabel, + utf8_to_wide(image_name), + 258 + m_fields.size() + ); + spec.ftype = f_Button; + if (type == "image_button_exit") + spec.is_exit = true; + + GUIButtonImage *e = GUIButtonImage::addButton(Environment, rect, m_tsrc, + data->current_parent, spec.fid, spec.flabel.c_str()); + + if (spec.fname == m_focused_element) { + Environment->setFocus(e); + } + + auto style = getStyleForElement("image_button", spec.fname); + + spec.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, ""); + + // Override style properties with values specified directly in the element + if (!image_name.empty()) + style[StyleSpec::STATE_DEFAULT].set(StyleSpec::FGIMG, image_name); + + if (!pressed_image_name.empty()) + style[StyleSpec::STATE_PRESSED].set(StyleSpec::FGIMG, pressed_image_name); + + if (parts.size() >= 7) { + style[StyleSpec::STATE_DEFAULT].set(StyleSpec::NOCLIP, parts[5]); + style[StyleSpec::STATE_DEFAULT].set(StyleSpec::BORDER, parts[6]); + } + + e->setStyles(style); + e->setScaleImage(true); + + m_fields.push_back(spec); } void GUIFormSpecMenu::parseTabHeader(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element, ';'); + std::vector<std::string> parts; + if (!precheckElement("tabheader", element, 4, 7, parts)) + return; - if (((parts.size() == 4) || (parts.size() == 6)) || (parts.size() == 7 && - data->real_coordinates) || ((parts.size() > 6) && - (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - - // If we're using real coordinates, add an extra field for height. - // Width is not here because tabs are the width of the text, and - // there's no reason to change that. - unsigned int i = 0; - std::vector<std::string> v_geom = {"1", "1"}; // Dummy width and height - bool auto_width = true; - if (parts.size() == 7) { - i++; - - v_geom = split(parts[1], ','); - if (v_geom.size() == 1) - v_geom.insert(v_geom.begin(), "1"); // Dummy value - else - auto_width = false; - } - - std::string name = parts[i+1]; - std::vector<std::string> buttons = split(parts[i+2], ','); - std::string str_index = parts[i+3]; - bool show_background = true; - bool show_border = true; - int tab_index = stoi(str_index) - 1; - - MY_CHECKPOS("tabheader", 0); - - if (parts.size() == 6 + i) { - if (parts[4+i] == "true") - show_background = false; - if (parts[5+i] == "false") - show_border = false; - } - - FieldSpec spec( - name, - L"", - L"", - 258 + m_fields.size() - ); - - spec.ftype = f_TabHeader; - - v2s32 pos; - v2s32 geom; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - - geom = getRealCoordinateGeometry(v_geom); - // Set default height - if (parts.size() <= 6) - geom.Y = m_btn_height * 2; - pos.Y -= geom.Y; // TabHeader base pos is the bottom, not the top. - if (auto_width) - geom.X = DesiredRect.getWidth(); // Set automatic width - - MY_CHECKGEOM("tabheader", 1); - } else { - v2f32 pos_f = pos_offset * spacing; - pos_f.X += stof(v_pos[0]) * spacing.X; - pos_f.Y += stof(v_pos[1]) * spacing.Y - m_btn_height * 2; - pos = v2s32(pos_f.X, pos_f.Y); - - geom.Y = m_btn_height * 2; - geom.X = DesiredRect.getWidth(); - } - - core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, - pos.Y+geom.Y); - - gui::IGUITabControl *e = Environment->addTabControl(rect, - data->current_parent, show_background, show_border, spec.fid); - e->setAlignment(irr::gui::EGUIA_UPPERLEFT, irr::gui::EGUIA_UPPERLEFT, - irr::gui::EGUIA_UPPERLEFT, irr::gui::EGUIA_LOWERRIGHT); - e->setTabHeight(geom.Y); - - auto style = getDefaultStyleForElement("tabheader", name); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, true)); - - for (const std::string &button : buttons) { - auto tab = e->addTab(unescape_translate(unescape_string( - utf8_to_wide(button))).c_str(), -1); - if (style.isNotDefault(StyleSpec::BGCOLOR)) - tab->setBackgroundColor(style.getColor(StyleSpec::BGCOLOR)); - - tab->setTextColor(style.getColor(StyleSpec::TEXTCOLOR, video::SColor(0xFFFFFFFF))); - } - - if ((tab_index >= 0) && - (buttons.size() < INT_MAX) && - (tab_index < (int) buttons.size())) - e->setActiveTab(tab_index); - - m_fields.push_back(spec); + // Length 7: Additional "height" parameter after "pos". Only valid with real_coordinates. + // Note: New arguments for the "height" syntax cannot be added without breaking older clients. + if (parts.size() == 5 || (parts.size() == 7 && !data->real_coordinates)) { + errorstream << "Invalid tabheader element(" << parts.size() << "): '" + << element << "'" << std::endl; return; } - errorstream << "Invalid TabHeader element(" << parts.size() << "): '" - << element << "'" << std::endl; + + std::vector<std::string> v_pos = split(parts[0],','); + + // If we're using real coordinates, add an extra field for height. + // Width is not here because tabs are the width of the text, and + // there's no reason to change that. + unsigned int i = 0; + std::vector<std::string> v_geom = {"1", "1"}; // Dummy width and height + bool auto_width = true; + if (parts.size() == 7) { + i++; + + v_geom = split(parts[1], ','); + if (v_geom.size() == 1) + v_geom.insert(v_geom.begin(), "1"); // Dummy value + else + auto_width = false; + } + + std::string name = parts[i+1]; + std::vector<std::string> buttons = split(parts[i+2], ','); + std::string str_index = parts[i+3]; + bool show_background = true; + bool show_border = true; + int tab_index = stoi(str_index) - 1; + + MY_CHECKPOS("tabheader", 0); + + if (parts.size() == 6 + i) { + if (parts[4+i] == "true") + show_background = false; + if (parts[5+i] == "false") + show_border = false; + } + + FieldSpec spec( + name, + L"", + L"", + 258 + m_fields.size() + ); + + spec.ftype = f_TabHeader; + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + + geom = getRealCoordinateGeometry(v_geom); + // Set default height + if (parts.size() <= 6) + geom.Y = m_btn_height * 2; + pos.Y -= geom.Y; // TabHeader base pos is the bottom, not the top. + if (auto_width) + geom.X = DesiredRect.getWidth(); // Set automatic width + + MY_CHECKGEOM("tabheader", 1); + } else { + v2f32 pos_f = pos_offset * spacing; + pos_f.X += stof(v_pos[0]) * spacing.X; + pos_f.Y += stof(v_pos[1]) * spacing.Y - m_btn_height * 2; + pos = v2s32(pos_f.X, pos_f.Y); + + geom.Y = m_btn_height * 2; + geom.X = DesiredRect.getWidth(); + } + + core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, + pos.Y+geom.Y); + + gui::IGUITabControl *e = Environment->addTabControl(rect, + data->current_parent, show_background, show_border, spec.fid); + e->setAlignment(irr::gui::EGUIA_UPPERLEFT, irr::gui::EGUIA_UPPERLEFT, + irr::gui::EGUIA_UPPERLEFT, irr::gui::EGUIA_LOWERRIGHT); + e->setTabHeight(geom.Y); + + auto style = getDefaultStyleForElement("tabheader", name); + + spec.sound = style.get(StyleSpec::Property::SOUND, ""); + + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, true)); + + for (const std::string &button : buttons) { + auto tab = e->addTab(unescape_translate(unescape_string( + utf8_to_wide(button))).c_str(), -1); + if (style.isNotDefault(StyleSpec::BGCOLOR)) + tab->setBackgroundColor(style.getColor(StyleSpec::BGCOLOR)); + + tab->setTextColor(style.getColor(StyleSpec::TEXTCOLOR, video::SColor(0xFFFFFFFF))); + } + + if ((tab_index >= 0) && + (buttons.size() < INT_MAX) && + (tab_index < (int) buttons.size())) + e->setActiveTab(tab_index); + + m_fields.push_back(spec); } void GUIFormSpecMenu::parseItemImageButton(parserData* data, const std::string &element) { - if (m_client == 0) { - warningstream << "invalid use of item_image_button with m_client==0" - << std::endl; + MY_CHECKCLIENT("item_image_button"); + + std::vector<std::string> parts; + if (!precheckElement("item_image_button", element, 5, 5, parts)) return; + + std::vector<std::string> v_pos = split(parts[0],','); + std::vector<std::string> v_geom = split(parts[1],','); + std::string item_name = parts[2]; + std::string name = parts[3]; + std::string label = parts[4]; + + label = unescape_string(label); + item_name = unescape_string(item_name); + + MY_CHECKPOS("item_image_button",0); + MY_CHECKGEOM("item_image_button",1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + geom.X = (stof(v_geom[0]) * spacing.X) - (spacing.X - imgsize.X); + geom.Y = (stof(v_geom[1]) * spacing.Y) - (spacing.Y - imgsize.Y); } - std::vector<std::string> parts = split(element,';'); + core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); - if ((parts.size() == 5) || - ((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0],','); - std::vector<std::string> v_geom = split(parts[1],','); - std::string item_name = parts[2]; - std::string name = parts[3]; - std::string label = parts[4]; + if(!data->explicit_size) + warningstream<<"invalid use of item_image_button without a size[] element"<<std::endl; - label = unescape_string(label); - item_name = unescape_string(item_name); + IItemDefManager *idef = m_client->idef(); + ItemStack item; + item.deSerialize(item_name, idef); - MY_CHECKPOS("itemimagebutton",0); - MY_CHECKGEOM("itemimagebutton",1); + m_tooltips[name] = + TooltipSpec(utf8_to_wide(item.getDefinition(idef).description), + m_default_tooltip_bgcolor, + m_default_tooltip_color); - v2s32 pos; - v2s32 geom; + // the spec for the button + FieldSpec spec_btn( + name, + utf8_to_wide(label), + utf8_to_wide(item_name), + 258 + m_fields.size(), + 2 + ); - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - geom.X = (stof(v_geom[0]) * spacing.X) - (spacing.X - imgsize.X); - geom.Y = (stof(v_geom[1]) * spacing.Y) - (spacing.Y - imgsize.Y); - } + GUIButtonItemImage *e_btn = GUIButtonItemImage::addButton(Environment, + rect, m_tsrc, data->current_parent, spec_btn.fid, spec_btn.flabel.c_str(), + item_name, m_client); - core::rect<s32> rect = core::rect<s32>(pos.X, pos.Y, pos.X+geom.X, pos.Y+geom.Y); + auto style = getStyleForElement("item_image_button", spec_btn.fname, "image_button"); - if(!data->explicit_size) - warningstream<<"invalid use of item_image_button without a size[] element"<<std::endl; + spec_btn.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, ""); - IItemDefManager *idef = m_client->idef(); - ItemStack item; - item.deSerialize(item_name, idef); + e_btn->setStyles(style); - m_tooltips[name] = - TooltipSpec(utf8_to_wide(item.getDefinition(idef).description), - m_default_tooltip_bgcolor, - m_default_tooltip_color); - - // the spec for the button - FieldSpec spec_btn( - name, - utf8_to_wide(label), - utf8_to_wide(item_name), - 258 + m_fields.size(), - 2 - ); - - GUIButtonItemImage *e_btn = GUIButtonItemImage::addButton(Environment, - rect, m_tsrc, data->current_parent, spec_btn.fid, spec_btn.flabel.c_str(), - item_name, m_client); - - auto style = getStyleForElement("item_image_button", spec_btn.fname, "image_button"); - e_btn->setStyles(style); - - if (spec_btn.fname == m_focused_element) { - Environment->setFocus(e_btn); - } - - spec_btn.ftype = f_Button; - rect += data->basepos-padding; - spec_btn.rect = rect; - m_fields.push_back(spec_btn); - return; + if (spec_btn.fname == m_focused_element) { + Environment->setFocus(e_btn); } - errorstream<< "Invalid ItemImagebutton element(" << parts.size() << "): '" << element << "'" << std::endl; + + spec_btn.ftype = f_Button; + rect += data->basepos-padding; + spec_btn.rect = rect; + m_fields.push_back(spec_btn); } void GUIFormSpecMenu::parseBox(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element, ';'); - - if ((parts.size() == 3) || - ((parts.size() > 3) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - std::vector<std::string> v_pos = split(parts[0], ','); - std::vector<std::string> v_geom = split(parts[1], ','); - - MY_CHECKPOS("box", 0); - MY_CHECKGEOM("box", 1); - - v2s32 pos; - v2s32 geom; - - if (data->real_coordinates) { - pos = getRealCoordinateBasePos(v_pos); - geom = getRealCoordinateGeometry(v_geom); - } else { - pos = getElementBasePos(&v_pos); - geom.X = stof(v_geom[0]) * spacing.X; - geom.Y = stof(v_geom[1]) * spacing.Y; - } - - FieldSpec spec( - "", - L"", - L"", - 258 + m_fields.size(), - -2 - ); - spec.ftype = f_Box; - - auto style = getDefaultStyleForElement("box", spec.fname); - - video::SColor tmp_color; - std::array<video::SColor, 4> colors; - std::array<video::SColor, 4> bordercolors = {0x0, 0x0, 0x0, 0x0}; - std::array<s32, 4> borderwidths = {0, 0, 0, 0}; - - if (parseColorString(parts[2], tmp_color, true, 0x8C)) { - colors = {tmp_color, tmp_color, tmp_color, tmp_color}; - } else { - colors = style.getColorArray(StyleSpec::COLORS, {0x0, 0x0, 0x0, 0x0}); - bordercolors = style.getColorArray(StyleSpec::BORDERCOLORS, - {0x0, 0x0, 0x0, 0x0}); - borderwidths = style.getIntArray(StyleSpec::BORDERWIDTHS, {0, 0, 0, 0}); - } - - core::rect<s32> rect(pos, pos + geom); - - GUIBox *e = new GUIBox(Environment, data->current_parent, spec.fid, rect, - colors, bordercolors, borderwidths); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, m_formspec_version < 3)); - e->drop(); - - m_fields.push_back(spec); + std::vector<std::string> parts; + if (!precheckElement("box", element, 3, 3, parts)) return; + + std::vector<std::string> v_pos = split(parts[0], ','); + std::vector<std::string> v_geom = split(parts[1], ','); + + MY_CHECKPOS("box", 0); + MY_CHECKGEOM("box", 1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + geom.X = stof(v_geom[0]) * spacing.X; + geom.Y = stof(v_geom[1]) * spacing.Y; } - errorstream << "Invalid Box element(" << parts.size() << "): '" << element - << "'" << std::endl; + + FieldSpec spec( + "", + L"", + L"", + 258 + m_fields.size(), + -2 + ); + spec.ftype = f_Box; + + auto style = getDefaultStyleForElement("box", spec.fname); + + video::SColor tmp_color; + std::array<video::SColor, 4> colors; + std::array<video::SColor, 4> bordercolors = {0x0, 0x0, 0x0, 0x0}; + std::array<s32, 4> borderwidths = {0, 0, 0, 0}; + + if (parseColorString(parts[2], tmp_color, true, 0x8C)) { + colors = {tmp_color, tmp_color, tmp_color, tmp_color}; + } else { + colors = style.getColorArray(StyleSpec::COLORS, {0x0, 0x0, 0x0, 0x0}); + bordercolors = style.getColorArray(StyleSpec::BORDERCOLORS, + {0x0, 0x0, 0x0, 0x0}); + borderwidths = style.getIntArray(StyleSpec::BORDERWIDTHS, {0, 0, 0, 0}); + } + + core::rect<s32> rect(pos, pos + geom); + + GUIBox *e = new GUIBox(Environment, data->current_parent, spec.fid, rect, + colors, bordercolors, borderwidths); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, m_formspec_version < 3)); + e->drop(); + + m_fields.push_back(spec); } void GUIFormSpecMenu::parseBackgroundColor(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); + std::vector<std::string> parts; + if (!precheckElement("bgcolor", element, 1, 3, parts)) + return; + const u32 parameter_count = parts.size(); - if ((parameter_count > 2 && m_formspec_version < 3) || - (parameter_count > 3 && m_formspec_version <= FORMSPEC_API_VERSION)) { + if (parameter_count > 2 && m_formspec_version < 3) { errorstream << "Invalid bgcolor element(" << parameter_count << "): '" << element << "'" << std::endl; return; @@ -2310,49 +2288,51 @@ void GUIFormSpecMenu::parseBackgroundColor(parserData* data, const std::string & void GUIFormSpecMenu::parseListColors(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); + std::vector<std::string> parts; + // Legacy Note: If clients older than 5.5.0-dev are supplied with additional arguments, + // the tooltip colors will be ignored. + if (!precheckElement("listcolors", element, 2, 5, parts)) + return; - if (((parts.size() == 2) || (parts.size() == 3) || (parts.size() == 5)) || - ((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION))) - { - parseColorString(parts[0], data->inventorylist_options.slotbg_n, false); - parseColorString(parts[1], data->inventorylist_options.slotbg_h, false); - - if (parts.size() >= 3) { - if (parseColorString(parts[2], data->inventorylist_options.slotbordercolor, - false)) { - data->inventorylist_options.slotborder = true; - } - } - if (parts.size() == 5) { - video::SColor tmp_color; - - if (parseColorString(parts[3], tmp_color, false)) - m_default_tooltip_bgcolor = tmp_color; - if (parseColorString(parts[4], tmp_color, false)) - m_default_tooltip_color = tmp_color; - } - - // update all already parsed inventorylists - for (GUIInventoryList *e : m_inventorylists) { - e->setSlotBGColors(data->inventorylist_options.slotbg_n, - data->inventorylist_options.slotbg_h); - e->setSlotBorders(data->inventorylist_options.slotborder, - data->inventorylist_options.slotbordercolor); - } + if (parts.size() == 4) { + // Invalid argument combination + errorstream << "Invalid listcolors element(" << parts.size() << "): '" + << element << "'" << std::endl; return; } - errorstream<< "Invalid listcolors element(" << parts.size() << "): '" << element << "'" << std::endl; + + parseColorString(parts[0], data->inventorylist_options.slotbg_n, false); + parseColorString(parts[1], data->inventorylist_options.slotbg_h, false); + + if (parts.size() >= 3) { + if (parseColorString(parts[2], data->inventorylist_options.slotbordercolor, + false)) { + data->inventorylist_options.slotborder = true; + } + } + if (parts.size() >= 5) { + video::SColor tmp_color; + + if (parseColorString(parts[3], tmp_color, false)) + m_default_tooltip_bgcolor = tmp_color; + if (parseColorString(parts[4], tmp_color, false)) + m_default_tooltip_color = tmp_color; + } + + // update all already parsed inventorylists + for (GUIInventoryList *e : m_inventorylists) { + e->setSlotBGColors(data->inventorylist_options.slotbg_n, + data->inventorylist_options.slotbg_h); + e->setSlotBorders(data->inventorylist_options.slotborder, + data->inventorylist_options.slotbordercolor); + } } void GUIFormSpecMenu::parseTooltip(parserData* data, const std::string &element) { - std::vector<std::string> parts = split(element,';'); - if (parts.size() < 2) { - errorstream << "Invalid tooltip element(" << parts.size() << "): '" - << element << "'" << std::endl; + std::vector<std::string> parts; + if (!precheckElement("tooltip", element, 2, 5, parts)) return; - } // Get mode and check size bool rect_mode = parts[0].find(',') != std::string::npos; @@ -2492,11 +2472,16 @@ bool GUIFormSpecMenu::parsePositionDirect(parserData *data, const std::string &e void GUIFormSpecMenu::parsePosition(parserData *data, const std::string &element) { - std::vector<std::string> parts = split(element, ','); + std::vector<std::string> parts = split(element, ';'); - if (parts.size() == 2) { - data->offset.X = stof(parts[0]); - data->offset.Y = stof(parts[1]); + if (parts.size() == 1 || + (parts.size() > 1 && m_formspec_version > FORMSPEC_API_VERSION)) { + std::vector<std::string> v_geom = split(parts[0], ','); + + MY_CHECKGEOM("position", 0); + + data->offset.X = stof(v_geom[0]); + data->offset.Y = stof(v_geom[1]); return; } @@ -2526,11 +2511,16 @@ bool GUIFormSpecMenu::parseAnchorDirect(parserData *data, const std::string &ele void GUIFormSpecMenu::parseAnchor(parserData *data, const std::string &element) { - std::vector<std::string> parts = split(element, ','); + std::vector<std::string> parts = split(element, ';'); - if (parts.size() == 2) { - data->anchor.X = stof(parts[0]); - data->anchor.Y = stof(parts[1]); + if (parts.size() == 1 || + (parts.size() > 1 && m_formspec_version > FORMSPEC_API_VERSION)) { + std::vector<std::string> v_geom = split(parts[0], ','); + + MY_CHECKGEOM("anchor", 0); + + data->anchor.X = stof(v_geom[0]); + data->anchor.Y = stof(v_geom[1]); return; } @@ -2538,6 +2528,46 @@ void GUIFormSpecMenu::parseAnchor(parserData *data, const std::string &element) << "'" << std::endl; } +bool GUIFormSpecMenu::parsePaddingDirect(parserData *data, const std::string &element) +{ + if (element.empty()) + return false; + + std::vector<std::string> parts = split(element, '['); + + if (parts.size() != 2) + return false; + + std::string type = trim(parts[0]); + std::string description = trim(parts[1]); + + if (type != "padding") + return false; + + parsePadding(data, description); + + return true; +} + +void GUIFormSpecMenu::parsePadding(parserData *data, const std::string &element) +{ + std::vector<std::string> parts = split(element, ';'); + + if (parts.size() == 1 || + (parts.size() > 1 && m_formspec_version > FORMSPEC_API_VERSION)) { + std::vector<std::string> v_geom = split(parts[0], ','); + + MY_CHECKGEOM("padding", 0); + + data->padding.X = stof(v_geom[0]); + data->padding.Y = stof(v_geom[1]); + return; + } + + errorstream << "Invalid padding element (" << parts.size() << "): '" << element + << "'" << std::endl; +} + bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, bool style_type) { std::vector<std::string> parts = split(element, ';'); @@ -2676,23 +2706,106 @@ bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, b void GUIFormSpecMenu::parseSetFocus(const std::string &element) { - std::vector<std::string> parts = split(element, ';'); + std::vector<std::string> parts; + if (!precheckElement("set_focus", element, 1, 2, parts)) + return; - if (parts.size() <= 2 || - (parts.size() > 2 && m_formspec_version > FORMSPEC_API_VERSION)) - { - if (m_is_form_regenerated) - return; // Never focus on resizing + if (m_is_form_regenerated) + return; // Never focus on resizing - bool force_focus = parts.size() >= 2 && is_yes(parts[1]); - if (force_focus || m_text_dst->m_formname != m_last_formname) - setFocus(parts[0]); + bool force_focus = parts.size() >= 2 && is_yes(parts[1]); + if (force_focus || m_text_dst->m_formname != m_last_formname) + setFocus(parts[0]); +} +void GUIFormSpecMenu::parseModel(parserData *data, const std::string &element) +{ + MY_CHECKCLIENT("model"); + + std::vector<std::string> parts; + if (!precheckElement("model", element, 5, 10, parts)) + return; + + // Avoid length checks by resizing + if (parts.size() < 10) + parts.resize(10); + + std::vector<std::string> v_pos = split(parts[0], ','); + std::vector<std::string> v_geom = split(parts[1], ','); + std::string name = unescape_string(parts[2]); + std::string meshstr = unescape_string(parts[3]); + std::vector<std::string> textures = split(parts[4], ','); + std::vector<std::string> vec_rot = split(parts[5], ','); + bool inf_rotation = is_yes(parts[6]); + bool mousectrl = is_yes(parts[7]) || parts[7].empty(); // default true + std::vector<std::string> frame_loop = split(parts[8], ','); + std::string speed = unescape_string(parts[9]); + + MY_CHECKPOS("model", 0); + MY_CHECKGEOM("model", 1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + geom.X = stof(v_geom[0]) * (float)imgsize.X; + geom.Y = stof(v_geom[1]) * (float)imgsize.Y; + } + + if (!data->explicit_size) + warningstream << "invalid use of model without a size[] element" << std::endl; + + scene::IAnimatedMesh *mesh = m_client->getMesh(meshstr); + + if (!mesh) { + errorstream << "Invalid model element: Unable to load mesh:" + << std::endl << "\t" << meshstr << std::endl; return; } - errorstream << "Invalid set_focus element (" << parts.size() << "): '" << element - << "'" << std::endl; + FieldSpec spec( + name, + L"", + L"", + 258 + m_fields.size() + ); + + core::rect<s32> rect(pos, pos + geom); + + GUIScene *e = new GUIScene(Environment, m_client->getSceneManager(), + data->current_parent, rect, spec.fid); + + auto meshnode = e->setMesh(mesh); + + for (u32 i = 0; i < textures.size() && i < meshnode->getMaterialCount(); ++i) + e->setTexture(i, m_tsrc->getTexture(unescape_string(textures[i]))); + + if (vec_rot.size() >= 2) + e->setRotation(v2f(stof(vec_rot[0]), stof(vec_rot[1]))); + + e->enableContinuousRotation(inf_rotation); + e->enableMouseControl(mousectrl); + + s32 frame_loop_begin = 0; + s32 frame_loop_end = 0x7FFFFFFF; + + if (frame_loop.size() == 2) { + frame_loop_begin = stoi(frame_loop[0]); + frame_loop_end = stoi(frame_loop[1]); + } + + e->setFrameLoop(frame_loop_begin, frame_loop_end); + e->setAnimationSpeed(stof(speed)); + + auto style = getStyleForElement("model", spec.fname); + e->setStyles(style); + e->drop(); + + m_fields.push_back(spec); } void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element) @@ -2891,6 +3004,11 @@ void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element) return; } + if (type == "model") { + parseModel(data, description); + return; + } + // Ignore others infostream << "Unknown DrawSpec: type=" << type << ", data=\"" << description << "\"" << std::endl; @@ -2933,7 +3051,8 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) } // Remove children - removeChildren(); + removeAllChildren(); + removeTooltip(); for (auto &table_it : m_tables) table_it.second->drop(); @@ -2943,8 +3062,6 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) checkbox_it.second->drop(); for (auto &scrollbar_it : m_scrollbars) scrollbar_it.second->drop(); - for (auto &background_it : m_backgrounds) - background_it->drop(); for (auto &tooltip_rect_it : m_tooltip_rects) tooltip_rect_it.first->drop(); for (auto &clickthrough_it : m_clickthrough_elements) @@ -2956,6 +3073,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) mydata.screensize = screensize; mydata.offset = v2f32(0.5f, 0.5f); mydata.anchor = v2f32(0.5f, 0.5f); + mydata.padding = v2f32(0.05f, 0.05f); mydata.simple_field_count = 0; // Base position of contents of form @@ -2965,7 +3083,6 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) mydata.current_parent = this; m_inventorylists.clear(); - m_backgrounds.clear(); m_tables.clear(); m_checkboxes.clear(); m_scrollbars.clear(); @@ -3058,7 +3175,14 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) } } - /* "no_prepend" element is always after "position" (or "size" element) if it used */ + /* "padding" element is always after "anchor" and previous if it is used */ + for (; i < elements.size(); i++) { + if (!parsePaddingDirect(&mydata, elements[i])) { + break; + } + } + + /* "no_prepend" element is always after "padding" and previous if it used */ bool enable_prepends = true; for (; i < elements.size(); i++) { if (elements[i].empty()) @@ -3105,8 +3229,8 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) offset = v2s32(0,0); } - double gui_scaling = g_settings->getFloat("gui_scaling"); - double screen_dpi = RenderingEngine::getDisplayDensity() * 96; + const double gui_scaling = g_settings->getFloat("gui_scaling", 0.5f, 42.0f); + const double screen_dpi = RenderingEngine::getDisplayDensity() * 96; double use_imgsize; if (m_lock) { @@ -3123,11 +3247,9 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) double fitx_imgsize; double fity_imgsize; - // Pad the screensize with 5% of the screensize on all sides to ensure - // that even the largest formspecs don't touch the screen borders. v2f padded_screensize( - mydata.screensize.X * 0.9f, - mydata.screensize.Y * 0.9f + mydata.screensize.X * (1.0f - mydata.padding.X * 2.0f), + mydata.screensize.Y * (1.0f - mydata.padding.Y * 2.0f) ); if (mydata.real_coordinates) { @@ -3143,13 +3265,15 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) ((15.0 / 13.0) * (0.85 + mydata.invsize.Y)); } -#ifdef __ANDROID__ + s32 min_screen_dim = std::min(padded_screensize.X, padded_screensize.Y); + +#ifdef HAVE_TOUCHSCREENGUI // In Android, the preferred imgsize should be larger to accommodate the // smaller screensize. - double prefer_imgsize = padded_screensize.Y / 10 * gui_scaling; + double prefer_imgsize = min_screen_dim / 10 * gui_scaling; #else // Desktop computers have more space, so try to fit 15 coordinates. - double prefer_imgsize = padded_screensize.Y / 15 * gui_scaling; + double prefer_imgsize = min_screen_dim / 15 * gui_scaling; #endif // Try to use the preferred imgsize, but if that's bigger than the maximum // size, use the maximum size. @@ -3212,10 +3336,19 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) gui::IGUIFont *old_font = skin->getFont(); skin->setFont(m_font); + // Add a new element that will hold all the background elements as its children. + // Because it is the first added element, all backgrounds will be behind all + // the other elements. + // (We use an arbitrarily big rect. The actual size is determined later by + // clipping to `this`.) + core::rect<s32> background_parent_rect(0, 0, 100000, 100000); + mydata.background_parent.reset(new gui::IGUIElement(EGUIET_ELEMENT, Environment, + this, -1, background_parent_rect)); + pos_offset = v2f32(); // used for formspec versions < 3 - core::list<IGUIElement *>::Iterator legacy_sort_start = Children.getLast(); + std::list<IGUIElement *>::iterator legacy_sort_start = std::prev(Children.end()); // last element if (enable_prepends) { // Backup the coordinates so that prepends can use the coordinates of choice. @@ -3230,7 +3363,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) // legacy sorting for formspec versions < 3 if (m_formspec_version >= 3) // prepends do not need to be reordered - legacy_sort_start = Children.getLast(); + legacy_sort_start = std::prev(Children.end()); // last element else if (version_backup >= 3) // only prepends elements have to be reordered legacySortElements(legacy_sort_start); @@ -3311,7 +3444,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) } } -void GUIFormSpecMenu::legacySortElements(core::list<IGUIElement *>::Iterator from) +void GUIFormSpecMenu::legacySortElements(std::list<IGUIElement *>::iterator from) { /* Draw order for formspec_version <= 2: @@ -3328,17 +3461,16 @@ void GUIFormSpecMenu::legacySortElements(core::list<IGUIElement *>::Iterator fro if (from == Children.end()) from = Children.begin(); else - from++; + ++from; - core::list<IGUIElement *>::Iterator to = Children.end(); + std::list<IGUIElement *>::iterator to = Children.end(); // 1: Copy into a sortable container - std::vector<IGUIElement *> elements; - for (auto it = from; it != to; ++it) - elements.emplace_back(*it); + std::vector<IGUIElement *> elements(from, to); // 2: Sort the container std::stable_sort(elements.begin(), elements.end(), [this] (const IGUIElement *a, const IGUIElement *b) -> bool { + // TODO: getSpecByID is a linear search. It should made O(1), or cached here. const FieldSpec *spec_a = getSpecByID(a->getID()); const FieldSpec *spec_b = getSpecByID(b->getID()); return spec_a && spec_b && @@ -3346,10 +3478,7 @@ void GUIFormSpecMenu::legacySortElements(core::list<IGUIElement *>::Iterator fro }); // 3: Re-assign the pointers - for (auto e : elements) { - *from = e; - from++; - } + reorderChildren(from, to, elements); } #ifdef __ANDROID__ @@ -3383,8 +3512,6 @@ bool GUIFormSpecMenu::getAndroidUIInput() GUIInventoryList::ItemSpec GUIFormSpecMenu::getItemAtPos(v2s32 p) const { - core::rect<s32> imgrect(0, 0, imgsize.X, imgsize.Y); - for (const GUIInventoryList *e : m_inventorylists) { s32 item_index = e->getItemIndexAtPos(p); if (item_index != -1) @@ -3469,15 +3596,6 @@ void GUIFormSpecMenu::drawMenu() } } - /* - Draw backgrounds - */ - for (gui::IGUIElement *e : m_backgrounds) { - e->setVisible(true); - e->draw(); - e->setVisible(false); - } - // Some elements are only visible while being drawn for (gui::IGUIElement *e : m_clickthrough_elements) e->setVisible(true); @@ -3485,12 +3603,11 @@ void GUIFormSpecMenu::drawMenu() /* This is where all the drawing happens. */ - core::list<IGUIElement*>::Iterator it = Children.begin(); - for (; it != Children.end(); ++it) - if ((*it)->isNotClipped() || + for (auto child : Children) + if (child->isNotClipped() || AbsoluteClippingRect.isRectCollided( - (*it)->getAbsolutePosition())) - (*it)->draw(); + child->getAbsolutePosition())) + child->draw(); for (gui::IGUIElement *e : m_clickthrough_elements) e->setVisible(false); @@ -3596,7 +3713,8 @@ void GUIFormSpecMenu::showTooltip(const std::wstring &text, { EnrichedString ntext(text); ntext.setDefaultColor(color); - ntext.setBackground(bgcolor); + if (!ntext.hasBackground()) + ntext.setBackground(bgcolor); setStaticText(m_tooltip_element, ntext); @@ -3607,7 +3725,7 @@ void GUIFormSpecMenu::showTooltip(const std::wstring &text, v2u32 screenSize = Environment->getVideoDriver()->getScreenSize(); int tooltip_offset_x = m_btn_height; int tooltip_offset_y = m_btn_height; -#ifdef __ANDROID__ +#ifdef HAVE_TOUCHSCREENGUI tooltip_offset_x *= 3; tooltip_offset_y = 0; if (m_pointer.X > (s32)screenSize.X / 2) @@ -3714,7 +3832,7 @@ ItemStack GUIFormSpecMenu::verifySelectedItem() return ItemStack(); } -void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode=quit_mode_no) +void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode) { if(m_text_dst) { @@ -3799,9 +3917,7 @@ void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode=quit_mode_no) } if (e != 0) { - std::stringstream ss; - ss << (e->getActiveTab() +1); - fields[name] = ss.str(); + fields[name] = itos(e->getActiveTab() + 1); } } else if (s.ftype == f_CheckBox) { // No dynamic cast possible due to some distributions shipped @@ -3827,12 +3943,10 @@ void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode=quit_mode_no) e = static_cast<GUIScrollBar *>(element); if (e) { - std::stringstream os; - os << e->getPos(); if (s.fdefault == L"Changed") - fields[name] = "CHG:" + os.str(); + fields[name] = "CHG:" + itos(e->getPos()); else - fields[name] = "VAL:" + os.str(); + fields[name] = "VAL:" + itos(e->getPos()); } } else if (s.ftype == f_AnimatedImage) { // No dynamic cast possible due to some distributions shipped @@ -4400,6 +4514,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) for (GUIFormSpecMenu::FieldSpec &s : m_fields) { if ((s.ftype == f_TabHeader) && (s.fid == event.GUIEvent.Caller->getID())) { + if (!s.sound.empty() && m_sound_manager) + m_sound_manager->playSound(SimpleSoundSpec(s.sound, 1.0f)); s.send = true; acceptInput(); s.send = false; @@ -4443,6 +4559,9 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) continue; if (s.ftype == f_Button || s.ftype == f_CheckBox) { + if (!s.sound.empty() && m_sound_manager) + m_sound_manager->playSound(SimpleSoundSpec(s.sound, 1.0f)); + s.send = true; if (s.is_exit) { if (m_allowclose) { @@ -4465,6 +4584,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) s2.send = false; } } + if (!s.sound.empty() && m_sound_manager) + m_sound_manager->playSound(SimpleSoundSpec(s.sound, 1.0f)); s.send = true; acceptInput(quit_mode_no); @@ -4481,6 +4602,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) acceptInput(quit_mode_no); s.fdefault = L""; } else if (s.ftype == f_Unknown || s.ftype == f_HyperText) { + if (!s.sound.empty() && m_sound_manager) + m_sound_manager->playSound(SimpleSoundSpec(s.sound, 1.0f)); s.send = true; acceptInput(); s.send = false; diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h index 613acaa04..c01ff817b 100644 --- a/src/gui/guiFormSpecMenu.h +++ b/src/gui/guiFormSpecMenu.h @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <unordered_set> #include "irrlichttypes_extrabloated.h" +#include "irr_ptr.h" #include "inventorymanager.h" #include "modalMenu.h" #include "guiInventoryList.h" @@ -38,10 +39,10 @@ with this program; if not, write to the Free Software Foundation, Inc., class InventoryManager; class ISimpleTextureSource; class Client; -class TexturePool; class GUIScrollContainer; +class ISoundManager; -typedef enum { +enum FormspecFieldType { f_Button, f_Table, f_TabHeader, @@ -53,13 +54,13 @@ typedef enum { f_HyperText, f_AnimatedImage, f_Unknown -} FormspecFieldType; +}; -typedef enum { +enum FormspecQuitMode { quit_mode_no, quit_mode_accept, quit_mode_cancel -} FormspecQuitMode; +}; struct TextDest { @@ -128,6 +129,7 @@ class GUIFormSpecMenu : public GUIModalMenu int priority; core::rect<s32> rect; gui::ECURSOR_ICON fcursor_icon; + std::string sound; }; struct TooltipSpec @@ -151,7 +153,9 @@ public: gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, Client *client, + gui::IGUIEnvironment *guienv, ISimpleTextureSource *tsrc, + ISoundManager *sound_manager, IFormSource* fs_src, TextDest* txt_dst, const std::string &formspecPrepend, @@ -160,8 +164,9 @@ public: ~GUIFormSpecMenu(); static void create(GUIFormSpecMenu *&cur_formspec, Client *client, - JoystickController *joystick, IFormSource *fs_src, TextDest *txt_dest, - const std::string &formspecPrepend); + gui::IGUIEnvironment *guienv, JoystickController *joystick, IFormSource *fs_src, + TextDest *txt_dest, const std::string &formspecPrepend, + ISoundManager *sound_manager); void setFormSpec(const std::string &formspec_string, const InventoryLocation ¤t_inventory_location) @@ -207,7 +212,7 @@ public: m_lockscreensize = basescreensize; } - void removeChildren(); + void removeTooltip(); void setInitialFocus(); void setFocus(const std::string &elementname) @@ -225,7 +230,7 @@ public: return m_selected_item; } - const u16 getSelectedAmount() const + u16 getSelectedAmount() const { return m_selected_amount; } @@ -251,7 +256,7 @@ public: void updateSelectedItem(); ItemStack verifySelectedItem(); - void acceptInput(FormspecQuitMode quitmode); + void acceptInput(FormspecQuitMode quitmode=quit_mode_no); bool preprocessEvent(const SEvent& event); bool OnEvent(const SEvent& event); bool doPause; @@ -275,6 +280,8 @@ protected: v2s32 getElementBasePos(const std::vector<std::string> *v_pos); v2s32 getRealCoordinateBasePos(const std::vector<std::string> &v_pos); v2s32 getRealCoordinateGeometry(const std::vector<std::string> &v_geom); + bool precheckElement(const std::string &name, const std::string &element, + size_t args_min, size_t args_max, std::vector<std::string> &parts); std::unordered_map<std::string, std::vector<StyleSpec>> theme_by_type; std::unordered_map<std::string, std::vector<StyleSpec>> theme_by_name; @@ -294,6 +301,7 @@ protected: InventoryManager *m_invmgr; ISimpleTextureSource *m_tsrc; + ISoundManager *m_sound_manager; Client *m_client; std::string m_formspec_string; @@ -306,7 +314,6 @@ protected: std::vector<GUIInventoryList *> m_inventorylists; std::vector<ListRingSpec> m_inventory_rings; - std::vector<gui::IGUIElement *> m_backgrounds; std::unordered_map<std::string, bool> field_close_on_enter; std::unordered_map<std::string, bool> m_dropdown_index_event; std::vector<FieldSpec> m_fields; @@ -353,7 +360,7 @@ private: JoystickController *m_joystick; bool m_show_debug = false; - typedef struct { + struct parserData { bool explicit_size; bool real_coordinates; u8 simple_field_count; @@ -361,12 +368,14 @@ private: v2s32 size; v2f32 offset; v2f32 anchor; + v2f32 padding; core::rect<s32> rect; v2s32 basepos; v2u32 screensize; GUITable::TableOptions table_options; GUITable::TableColumns table_columns; gui::IGUIElement *current_parent = nullptr; + irr_ptr<gui::IGUIElement> background_parent; GUIInventoryList::Options inventorylist_options; @@ -381,16 +390,16 @@ private: // used to restore table selection/scroll/treeview state std::unordered_map<std::string, GUITable::DynamicData> table_dyndata; - } parserData; + }; - typedef struct { + struct fs_key_pending { bool key_up; bool key_down; bool key_enter; bool key_escape; - } fs_key_pendig; + }; - fs_key_pendig current_keys_pending; + fs_key_pending current_keys_pending; std::string current_field_enter_pending = ""; std::vector<std::string> m_hovered_item_tooltips; @@ -442,8 +451,13 @@ private: void parsePosition(parserData *data, const std::string &element); bool parseAnchorDirect(parserData *data, const std::string &element); void parseAnchor(parserData *data, const std::string &element); + bool parsePaddingDirect(parserData *data, const std::string &element); + void parsePadding(parserData *data, const std::string &element); bool parseStyle(parserData *data, const std::string &element, bool style_type); void parseSetFocus(const std::string &element); + void parseModel(parserData *data, const std::string &element); + + bool parseMiddleRect(const std::string &value, core::rect<s32> *parsed_rect); void tryClose(); @@ -455,7 +469,7 @@ private: * types were drawn before others. * This function sorts the elements in the old order for backwards compatibility. */ - void legacySortElements(core::list<IGUIElement *>::Iterator from); + void legacySortElements(std::list<IGUIElement *>::iterator from); int m_btn_height; gui::IGUIFont *m_font = nullptr; diff --git a/src/gui/guiHyperText.cpp b/src/gui/guiHyperText.cpp index 88931cdf9..40450ce5f 100644 --- a/src/gui/guiHyperText.cpp +++ b/src/gui/guiHyperText.cpp @@ -17,31 +17,26 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "IGUIEnvironment.h" -#include "IGUIElement.h" +#include "guiHyperText.h" #include "guiScrollBar.h" -#include "IGUIFont.h" -#include <vector> -#include <list> -#include <unordered_map> -using namespace irr::gui; #include "client/fontengine.h" -#include <SColor.h> #include "client/tile.h" #include "IVideoDriver.h" #include "client/client.h" #include "client/renderingengine.h" #include "hud.h" -#include "guiHyperText.h" #include "util/string.h" +#include "irrlicht_changes/CGUITTFont.h" -bool check_color(const std::string &str) +using namespace irr::gui; + +static bool check_color(const std::string &str) { irr::video::SColor color; return parseColorString(str, color, false); } -bool check_integer(const std::string &str) +static bool check_integer(const std::string &str) { if (str.empty()) return false; @@ -616,12 +611,10 @@ TextDrawer::TextDrawer(const wchar_t *text, Client *client, if (e.font) { e.dim.Width = e.font->getDimension(e.text.c_str()).Width; e.dim.Height = e.font->getDimension(L"Yy").Height; -#if USE_FREETYPE if (e.font->getType() == irr::gui::EGFT_CUSTOM) { - e.baseline = e.dim.Height - 1 - - ((irr::gui::CGUITTFont *)e.font)->getAscender() / 64; + CGUITTFont *tmp = static_cast<CGUITTFont*>(e.font); + e.baseline = e.dim.Height - 1 - tmp->getAscender() / 64; } -#endif } else { e.dim = {0, 0}; } @@ -1088,7 +1081,7 @@ bool GUIHyperText::OnEvent(const SEvent &event) if (event.MouseInput.Event == EMIE_MOUSE_MOVED) checkHover(event.MouseInput.X, event.MouseInput.Y); - if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) { + if (event.MouseInput.Event == EMIE_MOUSE_WHEEL && m_vscrollbar->isVisible()) { m_vscrollbar->setPos(m_vscrollbar->getPos() - event.MouseInput.Wheel * m_vscrollbar->getSmallStep()); m_text_scrollpos.Y = -m_vscrollbar->getPos(); diff --git a/src/gui/guiHyperText.h b/src/gui/guiHyperText.h index 5b936262e..04c664df5 100644 --- a/src/gui/guiHyperText.h +++ b/src/gui/guiHyperText.h @@ -19,16 +19,17 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -#include "config.h" // for USE_FREETYPE +#include <vector> +#include <list> +#include <unordered_map> +#include <string> +#include "irrlichttypes_extrabloated.h" using namespace irr; class ISimpleTextureSource; class Client; - -#if USE_FREETYPE -#include "irrlicht_changes/CGUITTFont.h" -#endif +class GUIScrollBar; class ParsedText { diff --git a/src/gui/guiInventoryList.cpp b/src/gui/guiInventoryList.cpp index dfdb60448..183d72165 100644 --- a/src/gui/guiInventoryList.cpp +++ b/src/gui/guiInventoryList.cpp @@ -104,8 +104,6 @@ void GUIInventoryList::draw() && m_invmgr->getInventory(selected_item->inventoryloc) == inv && selected_item->listname == m_listname && selected_item->i == item_i; - core::rect<s32> clipped_rect(rect); - clipped_rect.clipAgainst(AbsoluteClippingRect); bool hovering = m_hovered_i == item_i; ItemRotationKind rotation_kind = selected ? IT_ROT_SELECTED : (hovering ? IT_ROT_HOVERED : IT_ROT_NONE); diff --git a/src/gui/guiKeyChangeMenu.cpp b/src/gui/guiKeyChangeMenu.cpp index eb641d952..021f5f0a9 100644 --- a/src/gui/guiKeyChangeMenu.cpp +++ b/src/gui/guiKeyChangeMenu.cpp @@ -46,7 +46,7 @@ enum GUI_ID_KEY_BACKWARD_BUTTON, GUI_ID_KEY_LEFT_BUTTON, GUI_ID_KEY_RIGHT_BUTTON, - GUI_ID_KEY_USE_BUTTON, + GUI_ID_KEY_AUX1_BUTTON, GUI_ID_KEY_FLY_BUTTON, GUI_ID_KEY_FAST_BUTTON, GUI_ID_KEY_JUMP_BUTTON, @@ -70,6 +70,7 @@ enum GUI_ID_KEY_MINIMAP_BUTTON, GUI_ID_KEY_SCREENSHOT_BUTTON, GUI_ID_KEY_CHATLOG_BUTTON, + GUI_ID_KEY_BLOCK_BOUNDS_BUTTON, GUI_ID_KEY_HUD_BUTTON, GUI_ID_KEY_FOG_BUTTON, GUI_ID_KEY_DEC_RANGE_BUTTON, @@ -92,7 +93,8 @@ GUIKeyChangeMenu::GUIKeyChangeMenu(gui::IGUIEnvironment* env, GUIKeyChangeMenu::~GUIKeyChangeMenu() { - removeChildren(); + removeAllChildren(); + key_used_text = nullptr; for (key_setting *ks : key_settings) { delete[] ks->button_name; @@ -101,23 +103,10 @@ GUIKeyChangeMenu::~GUIKeyChangeMenu() key_settings.clear(); } -void GUIKeyChangeMenu::removeChildren() -{ - const core::list<gui::IGUIElement*> &children = getChildren(); - core::list<gui::IGUIElement*> children_copy; - for (gui::IGUIElement*i : children) { - children_copy.push_back(i); - } - - for (gui::IGUIElement *i : children_copy) { - i->remove(); - } - key_used_text = nullptr; -} - void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) { - removeChildren(); + removeAllChildren(); + key_used_text = nullptr; const float s = m_gui_scale; DesiredRect = core::rect<s32>( @@ -135,7 +124,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) core::rect<s32> rect(0, 0, 600 * s, 40 * s); rect += topleft + v2s32(25 * s, 3 * s); //gui::IGUIStaticText *t = - const wchar_t *text = wgettext("Keybindings. (If this menu screws up, remove stuff from minetest.conf)"); + const wchar_t *text = wgettext("Keybindings."); Environment->addStaticText(text, rect, false, true, this, -1); delete[] text; @@ -177,7 +166,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize) { core::rect<s32> rect(0, 0, option_w, 30 * s); rect += topleft + v2s32(option_x, option_y); - const wchar_t *text = wgettext("\"Special\" = climb down"); + const wchar_t *text = wgettext("\"Aux1\" = climb down"); Environment->addCheckBox(g_settings->getBool("aux1_descends"), rect, this, GUI_ID_CB_AUX1_DESCENDS, text); delete[] text; @@ -248,7 +237,7 @@ bool GUIKeyChangeMenu::acceptInput() { for (key_setting *k : key_settings) { std::string default_key; - g_settings->getDefaultNoEx(k->setting_name, default_key); + Settings::getLayer(SL_DEFAULTS)->getNoEx(k->setting_name, default_key); if (k->key.sym() != default_key) g_settings->set(k->setting_name, k->key.sym()); @@ -412,37 +401,38 @@ void GUIKeyChangeMenu::add_key(int id, const wchar_t *button_name, const std::st void GUIKeyChangeMenu::init_keys() { - this->add_key(GUI_ID_KEY_FORWARD_BUTTON, wgettext("Forward"), "keymap_forward"); - this->add_key(GUI_ID_KEY_BACKWARD_BUTTON, wgettext("Backward"), "keymap_backward"); - this->add_key(GUI_ID_KEY_LEFT_BUTTON, wgettext("Left"), "keymap_left"); - this->add_key(GUI_ID_KEY_RIGHT_BUTTON, wgettext("Right"), "keymap_right"); - this->add_key(GUI_ID_KEY_USE_BUTTON, wgettext("Special"), "keymap_special1"); - this->add_key(GUI_ID_KEY_JUMP_BUTTON, wgettext("Jump"), "keymap_jump"); - this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wgettext("Sneak"), "keymap_sneak"); - this->add_key(GUI_ID_KEY_DROP_BUTTON, wgettext("Drop"), "keymap_drop"); - this->add_key(GUI_ID_KEY_INVENTORY_BUTTON, wgettext("Inventory"), "keymap_inventory"); - this->add_key(GUI_ID_KEY_HOTBAR_PREV_BUTTON,wgettext("Prev. item"), "keymap_hotbar_previous"); - this->add_key(GUI_ID_KEY_HOTBAR_NEXT_BUTTON,wgettext("Next item"), "keymap_hotbar_next"); - this->add_key(GUI_ID_KEY_ZOOM_BUTTON, wgettext("Zoom"), "keymap_zoom"); - this->add_key(GUI_ID_KEY_CAMERA_BUTTON, wgettext("Change camera"), "keymap_camera_mode"); - this->add_key(GUI_ID_KEY_MINIMAP_BUTTON, wgettext("Toggle minimap"), "keymap_minimap"); - this->add_key(GUI_ID_KEY_FLY_BUTTON, wgettext("Toggle fly"), "keymap_freemove"); - this->add_key(GUI_ID_KEY_PITCH_MOVE, wgettext("Toggle pitchmove"), "keymap_pitchmove"); - this->add_key(GUI_ID_KEY_FAST_BUTTON, wgettext("Toggle fast"), "keymap_fastmove"); - this->add_key(GUI_ID_KEY_NOCLIP_BUTTON, wgettext("Toggle noclip"), "keymap_noclip"); - this->add_key(GUI_ID_KEY_MUTE_BUTTON, wgettext("Mute"), "keymap_mute"); - this->add_key(GUI_ID_KEY_DEC_VOLUME_BUTTON,wgettext("Dec. volume"), "keymap_decrease_volume"); - this->add_key(GUI_ID_KEY_INC_VOLUME_BUTTON,wgettext("Inc. volume"), "keymap_increase_volume"); - this->add_key(GUI_ID_KEY_AUTOFWD_BUTTON, wgettext("Autoforward"), "keymap_autoforward"); - this->add_key(GUI_ID_KEY_CHAT_BUTTON, wgettext("Chat"), "keymap_chat"); - this->add_key(GUI_ID_KEY_SCREENSHOT_BUTTON,wgettext("Screenshot"), "keymap_screenshot"); - this->add_key(GUI_ID_KEY_RANGE_BUTTON, wgettext("Range select"), "keymap_rangeselect"); - this->add_key(GUI_ID_KEY_DEC_RANGE_BUTTON, wgettext("Dec. range"), "keymap_decrease_viewing_range_min"); - this->add_key(GUI_ID_KEY_INC_RANGE_BUTTON, wgettext("Inc. range"), "keymap_increase_viewing_range_min"); - this->add_key(GUI_ID_KEY_CONSOLE_BUTTON, wgettext("Console"), "keymap_console"); - this->add_key(GUI_ID_KEY_CMD_BUTTON, wgettext("Command"), "keymap_cmd"); - this->add_key(GUI_ID_KEY_CMD_LOCAL_BUTTON, wgettext("Local command"), "keymap_cmd_local"); - this->add_key(GUI_ID_KEY_HUD_BUTTON, wgettext("Toggle HUD"), "keymap_toggle_hud"); - this->add_key(GUI_ID_KEY_CHATLOG_BUTTON, wgettext("Toggle chat log"), "keymap_toggle_chat"); - this->add_key(GUI_ID_KEY_FOG_BUTTON, wgettext("Toggle fog"), "keymap_toggle_fog"); + this->add_key(GUI_ID_KEY_FORWARD_BUTTON, wgettext("Forward"), "keymap_forward"); + this->add_key(GUI_ID_KEY_BACKWARD_BUTTON, wgettext("Backward"), "keymap_backward"); + this->add_key(GUI_ID_KEY_LEFT_BUTTON, wgettext("Left"), "keymap_left"); + this->add_key(GUI_ID_KEY_RIGHT_BUTTON, wgettext("Right"), "keymap_right"); + this->add_key(GUI_ID_KEY_AUX1_BUTTON, wgettext("Aux1"), "keymap_aux1"); + this->add_key(GUI_ID_KEY_JUMP_BUTTON, wgettext("Jump"), "keymap_jump"); + this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wgettext("Sneak"), "keymap_sneak"); + this->add_key(GUI_ID_KEY_DROP_BUTTON, wgettext("Drop"), "keymap_drop"); + this->add_key(GUI_ID_KEY_INVENTORY_BUTTON, wgettext("Inventory"), "keymap_inventory"); + this->add_key(GUI_ID_KEY_HOTBAR_PREV_BUTTON, wgettext("Prev. item"), "keymap_hotbar_previous"); + this->add_key(GUI_ID_KEY_HOTBAR_NEXT_BUTTON, wgettext("Next item"), "keymap_hotbar_next"); + this->add_key(GUI_ID_KEY_ZOOM_BUTTON, wgettext("Zoom"), "keymap_zoom"); + this->add_key(GUI_ID_KEY_CAMERA_BUTTON, wgettext("Change camera"), "keymap_camera_mode"); + this->add_key(GUI_ID_KEY_MINIMAP_BUTTON, wgettext("Toggle minimap"), "keymap_minimap"); + this->add_key(GUI_ID_KEY_FLY_BUTTON, wgettext("Toggle fly"), "keymap_freemove"); + this->add_key(GUI_ID_KEY_PITCH_MOVE, wgettext("Toggle pitchmove"), "keymap_pitchmove"); + this->add_key(GUI_ID_KEY_FAST_BUTTON, wgettext("Toggle fast"), "keymap_fastmove"); + this->add_key(GUI_ID_KEY_NOCLIP_BUTTON, wgettext("Toggle noclip"), "keymap_noclip"); + this->add_key(GUI_ID_KEY_MUTE_BUTTON, wgettext("Mute"), "keymap_mute"); + this->add_key(GUI_ID_KEY_DEC_VOLUME_BUTTON, wgettext("Dec. volume"), "keymap_decrease_volume"); + this->add_key(GUI_ID_KEY_INC_VOLUME_BUTTON, wgettext("Inc. volume"), "keymap_increase_volume"); + this->add_key(GUI_ID_KEY_AUTOFWD_BUTTON, wgettext("Autoforward"), "keymap_autoforward"); + this->add_key(GUI_ID_KEY_CHAT_BUTTON, wgettext("Chat"), "keymap_chat"); + this->add_key(GUI_ID_KEY_SCREENSHOT_BUTTON, wgettext("Screenshot"), "keymap_screenshot"); + this->add_key(GUI_ID_KEY_RANGE_BUTTON, wgettext("Range select"), "keymap_rangeselect"); + this->add_key(GUI_ID_KEY_DEC_RANGE_BUTTON, wgettext("Dec. range"), "keymap_decrease_viewing_range_min"); + this->add_key(GUI_ID_KEY_INC_RANGE_BUTTON, wgettext("Inc. range"), "keymap_increase_viewing_range_min"); + this->add_key(GUI_ID_KEY_CONSOLE_BUTTON, wgettext("Console"), "keymap_console"); + this->add_key(GUI_ID_KEY_CMD_BUTTON, wgettext("Command"), "keymap_cmd"); + this->add_key(GUI_ID_KEY_CMD_LOCAL_BUTTON, wgettext("Local command"), "keymap_cmd_local"); + this->add_key(GUI_ID_KEY_BLOCK_BOUNDS_BUTTON, wgettext("Block bounds"), "keymap_toggle_block_bounds"); + this->add_key(GUI_ID_KEY_HUD_BUTTON, wgettext("Toggle HUD"), "keymap_toggle_hud"); + this->add_key(GUI_ID_KEY_CHATLOG_BUTTON, wgettext("Toggle chat log"), "keymap_toggle_chat"); + this->add_key(GUI_ID_KEY_FOG_BUTTON, wgettext("Toggle fog"), "keymap_toggle_fog"); } diff --git a/src/gui/guiKeyChangeMenu.h b/src/gui/guiKeyChangeMenu.h index 1c0f40247..84a898774 100644 --- a/src/gui/guiKeyChangeMenu.h +++ b/src/gui/guiKeyChangeMenu.h @@ -46,7 +46,6 @@ public: IMenuManager *menumgr, ISimpleTextureSource *tsrc); ~GUIKeyChangeMenu(); - void removeChildren(); /* Remove and re-add (or reposition) stuff */ diff --git a/src/gui/guiMainMenu.h b/src/gui/guiMainMenu.h index 1dca8bf2d..9b8ff383c 100644 --- a/src/gui/guiMainMenu.h +++ b/src/gui/guiMainMenu.h @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include "irrlichttypes_extrabloated.h" +#include "gameparams.h" #include <string> #include <list> @@ -50,5 +51,7 @@ struct MainMenuData { // Data to be passed to the script MainMenuDataForScript script_data; + ELoginRegister allow_login_or_register = ELoginRegister::Any; + MainMenuData() = default; }; diff --git a/src/gui/guiPasswordChange.cpp b/src/gui/guiPasswordChange.cpp index 74cd62f5b..c39df176b 100644 --- a/src/gui/guiPasswordChange.cpp +++ b/src/gui/guiPasswordChange.cpp @@ -25,6 +25,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include <IGUIStaticText.h> #include <IGUIFont.h> +#ifdef HAVE_TOUCHSCREENGUI + #include "client/renderingengine.h" +#endif + #include "porting.h" #include "gettext.h" @@ -47,23 +51,6 @@ GUIPasswordChange::GUIPasswordChange(gui::IGUIEnvironment* env, { } -GUIPasswordChange::~GUIPasswordChange() -{ - removeChildren(); -} - -void GUIPasswordChange::removeChildren() -{ - const core::list<gui::IGUIElement *> &children = getChildren(); - core::list<gui::IGUIElement *> children_copy; - for (gui::IGUIElement *i : children) { - children_copy.push_back(i); - } - - for (gui::IGUIElement *i : children_copy) { - i->remove(); - } -} void GUIPasswordChange::regenerateGui(v2u32 screensize) { /* @@ -74,13 +61,13 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) /* Remove stuff */ - removeChildren(); + removeAllChildren(); /* Calculate new sizes and positions */ -#ifdef __ANDROID__ - const float s = m_gui_scale * porting::getDisplayDensity() / 2; +#ifdef HAVE_TOUCHSCREENGUI + const float s = m_gui_scale * RenderingEngine::getDisplayDensity() / 2; #else const float s = m_gui_scale; #endif diff --git a/src/gui/guiPasswordChange.h b/src/gui/guiPasswordChange.h index 7141100c0..452702add 100644 --- a/src/gui/guiPasswordChange.h +++ b/src/gui/guiPasswordChange.h @@ -31,9 +31,7 @@ public: GUIPasswordChange(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id, IMenuManager *menumgr, Client *client, ISimpleTextureSource *tsrc); - ~GUIPasswordChange(); - void removeChildren(); /* Remove and re-add (or reposition) stuff */ diff --git a/src/gui/guiPathSelectMenu.cpp b/src/gui/guiPathSelectMenu.cpp index 489927a11..9c63e06b5 100644 --- a/src/gui/guiPathSelectMenu.cpp +++ b/src/gui/guiPathSelectMenu.cpp @@ -32,13 +32,12 @@ GUIFileSelectMenu::GUIFileSelectMenu(gui::IGUIEnvironment* env, GUIFileSelectMenu::~GUIFileSelectMenu() { - removeChildren(); setlocale(LC_NUMERIC, "C"); } void GUIFileSelectMenu::regenerateGui(v2u32 screensize) { - removeChildren(); + removeAllChildren(); m_fileOpenDialog = 0; core::dimension2du size(600 * m_gui_scale, 400 * m_gui_scale); diff --git a/src/gui/guiScene.cpp b/src/gui/guiScene.cpp new file mode 100644 index 000000000..ee2556b03 --- /dev/null +++ b/src/gui/guiScene.cpp @@ -0,0 +1,274 @@ +/* +Minetest +Copyright (C) 2020 Jean-Patrick Guerrero <jeanpatrick.guerrero@gmail.com> + +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. +*/ + +#include "guiScene.h" + +#include <SViewFrustum.h> +#include <IAnimatedMeshSceneNode.h> +#include "porting.h" + +GUIScene::GUIScene(gui::IGUIEnvironment *env, scene::ISceneManager *smgr, + gui::IGUIElement *parent, core::recti rect, s32 id) + : IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rect) +{ + m_driver = env->getVideoDriver(); + m_smgr = smgr->createNewSceneManager(false); + + m_cam = m_smgr->addCameraSceneNode(0, v3f(0.f, 0.f, -100.f), v3f(0.f)); + m_cam->setFOV(30.f * core::DEGTORAD); + + m_smgr->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); +} + +GUIScene::~GUIScene() +{ + setMesh(nullptr); + + m_smgr->drop(); +} + +scene::IAnimatedMeshSceneNode *GUIScene::setMesh(scene::IAnimatedMesh *mesh) +{ + if (m_mesh) { + m_mesh->remove(); + m_mesh = nullptr; + } + + if (!mesh) + return nullptr; + + m_mesh = m_smgr->addAnimatedMeshSceneNode(mesh); + m_mesh->setPosition(-m_mesh->getBoundingBox().getCenter()); + m_mesh->animateJoints(); + + return m_mesh; +} + +void GUIScene::setTexture(u32 idx, video::ITexture *texture) +{ + video::SMaterial &material = m_mesh->getMaterial(idx); + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + material.MaterialTypeParam = 0.5f; + material.TextureLayer[0].Texture = texture; + material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_FOG_ENABLE, true); + material.setFlag(video::EMF_BILINEAR_FILTER, false); + material.setFlag(video::EMF_BACK_FACE_CULLING, false); + material.setFlag(video::EMF_ZWRITE_ENABLE, true); +} + +void GUIScene::draw() +{ + m_driver->clearBuffers(video::ECBF_DEPTH); + + // Control rotation speed based on time + u64 new_time = porting::getTimeMs(); + u64 dtime_ms = 0; + if (m_last_time != 0) + dtime_ms = porting::getDeltaMs(m_last_time, new_time); + m_last_time = new_time; + + core::rect<s32> oldViewPort = m_driver->getViewPort(); + m_driver->setViewPort(getAbsoluteClippingRect()); + core::recti borderRect = Environment->getRootGUIElement()->getAbsoluteClippingRect(); + + if (m_bgcolor != 0) { + Environment->getSkin()->draw3DSunkenPane( + this, m_bgcolor, false, true, borderRect, 0); + } + + core::dimension2d<s32> size = getAbsoluteClippingRect().getSize(); + m_smgr->getActiveCamera()->setAspectRatio((f32)size.Width / (f32)size.Height); + + if (!m_target) { + updateCamera(m_smgr->addEmptySceneNode()); + rotateCamera(v3f(0.f)); + m_cam->bindTargetAndRotation(true); + } + + cameraLoop(); + + // Continuous rotation + if (m_inf_rot) + rotateCamera(v3f(0.f, -0.03f * (float)dtime_ms, 0.f)); + + m_smgr->drawAll(); + + if (m_initial_rotation && m_mesh) { + rotateCamera(v3f(m_custom_rot.X, m_custom_rot.Y, 0.f)); + calcOptimalDistance(); + + m_initial_rotation = false; + } + + m_driver->setViewPort(oldViewPort); +} + +bool GUIScene::OnEvent(const SEvent &event) +{ + if (m_mouse_ctrl && event.EventType == EET_MOUSE_INPUT_EVENT) { + if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) { + m_last_pos = v2f((f32)event.MouseInput.X, (f32)event.MouseInput.Y); + return true; + } else if (event.MouseInput.Event == EMIE_MOUSE_MOVED) { + if (event.MouseInput.isLeftPressed()) { + m_curr_pos = v2f((f32)event.MouseInput.X, (f32)event.MouseInput.Y); + + rotateCamera(v3f( + m_last_pos.Y - m_curr_pos.Y, + m_curr_pos.X - m_last_pos.X, 0.f)); + + m_last_pos = m_curr_pos; + return true; + } + } + } + + return gui::IGUIElement::OnEvent(event); +} + +void GUIScene::setStyles(const std::array<StyleSpec, StyleSpec::NUM_STATES> &styles) +{ + StyleSpec::State state = StyleSpec::STATE_DEFAULT; + StyleSpec style = StyleSpec::getStyleFromStatePropagation(styles, state); + + setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + setBackgroundColor(style.getColor(StyleSpec::BGCOLOR, m_bgcolor)); +} + +/** + * Sets the frame loop range for the mesh + */ +void GUIScene::setFrameLoop(s32 begin, s32 end) +{ + if (m_mesh->getStartFrame() != begin || m_mesh->getEndFrame() != end) + m_mesh->setFrameLoop(begin, end); +} + +/** + * Sets the animation speed (FPS) for the mesh + */ +void GUIScene::setAnimationSpeed(f32 speed) +{ + m_mesh->setAnimationSpeed(speed); +} + +/* Camera control functions */ + +inline void GUIScene::calcOptimalDistance() +{ + core::aabbox3df box = m_mesh->getBoundingBox(); + f32 width = box.MaxEdge.X - box.MinEdge.X; + f32 height = box.MaxEdge.Y - box.MinEdge.Y; + f32 depth = box.MaxEdge.Z - box.MinEdge.Z; + f32 max_width = width > depth ? width : depth; + + const scene::SViewFrustum *f = m_cam->getViewFrustum(); + f32 cam_far = m_cam->getFarValue(); + f32 far_width = core::line3df(f->getFarLeftUp(), f->getFarRightUp()).getLength(); + f32 far_height = core::line3df(f->getFarLeftUp(), f->getFarLeftDown()).getLength(); + + core::recti rect = getAbsolutePosition(); + f32 zoomX = rect.getWidth() / max_width; + f32 zoomY = rect.getHeight() / height; + f32 dist; + + if (zoomX < zoomY) + dist = (max_width / (far_width / cam_far)) + (0.5f * max_width); + else + dist = (height / (far_height / cam_far)) + (0.5f * max_width); + + m_cam_distance = dist; + m_update_cam = true; +} + +void GUIScene::updateCamera(scene::ISceneNode *target) +{ + m_target = target; + updateTargetPos(); + + m_last_target_pos = m_target_pos; + updateCameraPos(); + + m_update_cam = true; +} + +void GUIScene::updateTargetPos() +{ + m_last_target_pos = m_target_pos; + m_target->updateAbsolutePosition(); + m_target_pos = m_target->getAbsolutePosition(); +} + +void GUIScene::setCameraRotation(v3f rot) +{ + correctBounds(rot); + + core::matrix4 mat; + mat.setRotationDegrees(rot); + + m_cam_pos = v3f(0.f, 0.f, m_cam_distance); + mat.rotateVect(m_cam_pos); + + m_cam_pos += m_target_pos; + m_cam->setPosition(m_cam_pos); + m_update_cam = false; +} + +bool GUIScene::correctBounds(v3f &rot) +{ + const float ROTATION_MAX_1 = 60.0f; + const float ROTATION_MAX_2 = 300.0f; + + // Limit and correct the rotation when needed + if (rot.X < 90.f) { + if (rot.X > ROTATION_MAX_1) { + rot.X = ROTATION_MAX_1; + return true; + } + } else if (rot.X < ROTATION_MAX_2) { + rot.X = ROTATION_MAX_2; + return true; + } + + // Not modified + return false; +} + +void GUIScene::cameraLoop() +{ + updateCameraPos(); + updateTargetPos(); + + if (m_target_pos != m_last_target_pos) + m_update_cam = true; + + if (m_update_cam) { + m_cam_pos = m_target_pos + (m_cam_pos - m_target_pos).normalize() * m_cam_distance; + + v3f rot = getCameraRotation(); + if (correctBounds(rot)) + setCameraRotation(rot); + + m_cam->setPosition(m_cam_pos); + m_cam->setTarget(m_target_pos); + + m_update_cam = false; + } +} diff --git a/src/gui/guiScene.h b/src/gui/guiScene.h new file mode 100644 index 000000000..0f5f3a891 --- /dev/null +++ b/src/gui/guiScene.h @@ -0,0 +1,87 @@ +/* +Minetest +Copyright (C) 2020 Jean-Patrick Guerrero <jeanpatrick.guerrero@gmail.com> + +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. +*/ + +#pragma once + +#include "irrlichttypes_extrabloated.h" +#include "ICameraSceneNode.h" +#include "StyleSpec.h" + +using namespace irr; + +class GUIScene : public gui::IGUIElement +{ +public: + GUIScene(gui::IGUIEnvironment *env, scene::ISceneManager *smgr, + gui::IGUIElement *parent, core::recti rect, s32 id = -1); + + ~GUIScene(); + + scene::IAnimatedMeshSceneNode *setMesh(scene::IAnimatedMesh *mesh = nullptr); + void setTexture(u32 idx, video::ITexture *texture); + void setBackgroundColor(const video::SColor &color) noexcept { m_bgcolor = color; }; + void setFrameLoop(s32 begin, s32 end); + void setAnimationSpeed(f32 speed); + void enableMouseControl(bool enable) noexcept { m_mouse_ctrl = enable; }; + void setRotation(v2f rot) noexcept { m_custom_rot = rot; }; + void enableContinuousRotation(bool enable) noexcept { m_inf_rot = enable; }; + void setStyles(const std::array<StyleSpec, StyleSpec::NUM_STATES> &styles); + + virtual void draw(); + virtual bool OnEvent(const SEvent &event); + +private: + void calcOptimalDistance(); + void updateTargetPos(); + void updateCamera(scene::ISceneNode *target); + void setCameraRotation(v3f rot); + /// @return true indicates that the rotation was corrected + bool correctBounds(v3f &rot); + void cameraLoop(); + + void updateCameraPos() { m_cam_pos = m_cam->getPosition(); }; + v3f getCameraRotation() const { return (m_cam_pos - m_target_pos).getHorizontalAngle(); }; + void rotateCamera(const v3f &delta) { setCameraRotation(getCameraRotation() + delta); }; + + scene::ISceneManager *m_smgr; + video::IVideoDriver *m_driver; + scene::ICameraSceneNode *m_cam; + scene::ISceneNode *m_target = nullptr; + scene::IAnimatedMeshSceneNode *m_mesh = nullptr; + + f32 m_cam_distance = 50.f; + + u64 m_last_time = 0; + + v3f m_cam_pos; + v3f m_target_pos; + v3f m_last_target_pos; + // Cursor positions + v2f m_curr_pos; + v2f m_last_pos; + // Initial rotation + v2f m_custom_rot; + + bool m_mouse_ctrl = true; + bool m_update_cam = false; + bool m_inf_rot = false; + bool m_initial_rotation = true; + + video::SColor m_bgcolor = 0; +}; diff --git a/src/gui/guiScrollBar.cpp b/src/gui/guiScrollBar.cpp index b04ccb9d5..c6a03f3e4 100644 --- a/src/gui/guiScrollBar.cpp +++ b/src/gui/guiScrollBar.cpp @@ -21,7 +21,7 @@ GUIScrollBar::GUIScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s3 is_horizontal(horizontal), is_auto_scaling(auto_scale), dragged_by_slider(false), tray_clicked(false), scroll_pos(0), draw_center(0), thumb_size(0), min_pos(0), max_pos(100), small_step(10), - large_step(50), last_change(0), drag_offset(0), page_size(100), border_size(0) + large_step(50), drag_offset(0), page_size(100), border_size(0) { refreshControls(); setNotClipped(false); diff --git a/src/gui/guiScrollBar.h b/src/gui/guiScrollBar.h index 29493bb99..d18f8e875 100644 --- a/src/gui/guiScrollBar.h +++ b/src/gui/guiScrollBar.h @@ -68,7 +68,6 @@ private: s32 max_pos; s32 small_step; s32 large_step; - u32 last_change; s32 drag_offset; s32 page_size; s32 border_size; diff --git a/src/gui/guiScrollContainer.cpp b/src/gui/guiScrollContainer.cpp index 0fe4c41bd..2d71f3453 100644 --- a/src/gui/guiScrollContainer.cpp +++ b/src/gui/guiScrollContainer.cpp @@ -59,12 +59,11 @@ bool GUIScrollContainer::OnEvent(const SEvent &event) void GUIScrollContainer::draw() { if (isVisible()) { - core::list<IGUIElement *>::Iterator it = Children.begin(); - for (; it != Children.end(); ++it) - if ((*it)->isNotClipped() || + for (auto child : Children) + if (child->isNotClipped() || AbsoluteClippingRect.isRectCollided( - (*it)->getAbsolutePosition())) - (*it)->draw(); + child->getAbsolutePosition())) + child->draw(); } } diff --git a/src/gui/guiSkin.cpp b/src/gui/guiSkin.cpp index e09209bd9..ca692f6cb 100644 --- a/src/gui/guiSkin.cpp +++ b/src/gui/guiSkin.cpp @@ -1024,48 +1024,6 @@ void GUISkin::draw2DRectangle(IGUIElement* element, } -//! Writes attributes of the object. -//! Implement this to expose the attributes of your scene node animator for -//! scripting languages, editors, debuggers or xml serialization purposes. -void GUISkin::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const -{ - u32 i; - for (i=0; i<EGDC_COUNT; ++i) - out->addColor(GUISkinColorNames[i], Colors[i]); - - for (i=0; i<EGDS_COUNT; ++i) - out->addInt(GUISkinSizeNames[i], Sizes[i]); - - for (i=0; i<EGDT_COUNT; ++i) - out->addString(GUISkinTextNames[i], Texts[i].c_str()); - - for (i=0; i<EGDI_COUNT; ++i) - out->addInt(GUISkinIconNames[i], Icons[i]); -} - - -//! Reads attributes of the object. -//! Implement this to set the attributes of your scene node animator for -//! scripting languages, editors, debuggers or xml deserialization purposes. -void GUISkin::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options) -{ - // TODO: This is not nice code for downward compatibility, whenever new values are added and users - // load an old skin the corresponding values will be set to 0. - u32 i; - for (i=0; i<EGDC_COUNT; ++i) - Colors[i] = in->getAttributeAsColor(GUISkinColorNames[i]); - - for (i=0; i<EGDS_COUNT; ++i) - Sizes[i] = in->getAttributeAsInt(GUISkinSizeNames[i]); - - for (i=0; i<EGDT_COUNT; ++i) - Texts[i] = in->getAttributeAsStringW(GUISkinTextNames[i]); - - for (i=0; i<EGDI_COUNT; ++i) - Icons[i] = in->getAttributeAsInt(GUISkinIconNames[i]); -} - - //! gets the colors // PATCH void GUISkin::getColors(video::SColor* colors) diff --git a/src/gui/guiSkin.h b/src/gui/guiSkin.h index bbb900f9f..fa9b27bdd 100644 --- a/src/gui/guiSkin.h +++ b/src/gui/guiSkin.h @@ -290,16 +290,6 @@ namespace gui //! get the type of this skin virtual EGUI_SKIN_TYPE getType() const; - //! Writes attributes of the object. - //! Implement this to expose the attributes of your scene node animator for - //! scripting languages, editors, debuggers or xml serialization purposes. - virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const; - - //! Reads attributes of the object. - //! Implement this to set the attributes of your scene node animator for - //! scripting languages, editors, debuggers or xml deserialization purposes. - virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0); - //! gets the colors virtual void getColors(video::SColor* colors); // ::PATCH: diff --git a/src/gui/guiTable.cpp b/src/gui/guiTable.cpp index cab2e19fd..3929d678b 100644 --- a/src/gui/guiTable.cpp +++ b/src/gui/guiTable.cpp @@ -77,13 +77,14 @@ GUITable::GUITable(gui::IGUIEnvironment *env, setTabStop(true); setTabOrder(-1); updateAbsolutePosition(); +#ifdef HAVE_TOUCHSCREENGUI + float density = 1; // dp scaling is applied by the skin +#else float density = RenderingEngine::getDisplayDensity(); -#ifdef __ANDROID__ - density = 1; // dp scaling is applied by the skin #endif core::rect<s32> relative_rect = m_scrollbar->getRelativePosition(); s32 width = (relative_rect.getWidth() / (2.0 / 3.0)) * density * - g_settings->getFloat("gui_scaling"); + g_settings->getFloat("gui_scaling", 0.5f, 20.0f); m_scrollbar->setRelativePosition(core::rect<s32>( relative_rect.LowerRightCorner.X-width,relative_rect.UpperLeftCorner.Y, relative_rect.LowerRightCorner.X,relative_rect.LowerRightCorner.Y diff --git a/src/gui/guiVolumeChange.cpp b/src/gui/guiVolumeChange.cpp index f17cfa986..0f6f43fe9 100644 --- a/src/gui/guiVolumeChange.cpp +++ b/src/gui/guiVolumeChange.cpp @@ -45,32 +45,12 @@ GUIVolumeChange::GUIVolumeChange(gui::IGUIEnvironment* env, { } -GUIVolumeChange::~GUIVolumeChange() -{ - removeChildren(); -} - -void GUIVolumeChange::removeChildren() -{ - if (gui::IGUIElement *e = getElementFromId(ID_soundText)) - e->remove(); - - if (gui::IGUIElement *e = getElementFromId(ID_soundExitButton)) - e->remove(); - - if (gui::IGUIElement *e = getElementFromId(ID_soundSlider)) - e->remove(); - - if (gui::IGUIElement *e = getElementFromId(ID_soundMuteButton)) - e->remove(); -} - void GUIVolumeChange::regenerateGui(v2u32 screensize) { /* Remove stuff */ - removeChildren(); + removeAllChildren(); /* Calculate new sizes and positions */ @@ -93,11 +73,12 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize) core::rect<s32> rect(0, 0, 160 * s, 20 * s); rect = rect + v2s32(size.X / 2 - 80 * s, size.Y / 2 - 70 * s); - const wchar_t *text = wgettext("Sound Volume: "); + wchar_t text[100]; + const wchar_t *str = wgettext("Sound Volume: %d%%"); + swprintf(text, sizeof(text) / sizeof(wchar_t), str, volume); + delete[] str; core::stringw volume_text = text; - delete [] text; - volume_text += core::stringw(volume) + core::stringw("%"); Environment->addStaticText(volume_text.c_str(), rect, false, true, this, ID_soundText); } @@ -183,11 +164,13 @@ bool GUIVolumeChange::OnEvent(const SEvent& event) g_settings->setFloat("sound_volume", (float) pos / 100); gui::IGUIElement *e = getElementFromId(ID_soundText); - const wchar_t *text = wgettext("Sound Volume: "); - core::stringw volume_text = text; - delete [] text; + wchar_t text[100]; + const wchar_t *str = wgettext("Sound Volume: %d%%"); + swprintf(text, sizeof(text) / sizeof(wchar_t), str, pos); + delete[] str; + + core::stringw volume_text = text; - volume_text += core::stringw(pos) + core::stringw("%"); e->setText(volume_text.c_str()); return true; } diff --git a/src/gui/guiVolumeChange.h b/src/gui/guiVolumeChange.h index 466e17f9d..ccdaca00b 100644 --- a/src/gui/guiVolumeChange.h +++ b/src/gui/guiVolumeChange.h @@ -31,9 +31,6 @@ public: GUIVolumeChange(gui::IGUIEnvironment* env, gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, ISimpleTextureSource *tsrc); - ~GUIVolumeChange(); - - void removeChildren(); /* Remove and re-add (or reposition) stuff */ diff --git a/src/gui/intlGUIEditBox.cpp b/src/gui/intlGUIEditBox.cpp deleted file mode 100644 index 10395423c..000000000 --- a/src/gui/intlGUIEditBox.cpp +++ /dev/null @@ -1,1599 +0,0 @@ -// 11.11.2011 11:11 ValkaTR -// -// This is a copy of intlGUIEditBox from the irrlicht, but with a -// fix in the OnEvent function, which doesn't allowed input of -// other keyboard layouts than latin-1 -// -// Characters like: ä ö ü õ ы й ю я ъ № € ° ... -// -// This fix is only needed for linux, because of a bug -// in the CIrrDeviceLinux.cpp:1014-1015 of the irrlicht -// -// Also locale in the programm should not be changed to -// a "C", "POSIX" or whatever, it should be set to "", -// or XLookupString will return nothing for the international -// characters. -// -// From the "man setlocale": -// -// On startup of the main program, the portable "C" locale -// is selected as default. A program may be made -// portable to all locales by calling: -// -// setlocale(LC_ALL, ""); -// -// after program initialization.... -// - -// Copyright (C) 2002-2013 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#include <util/numeric.h> -#include "intlGUIEditBox.h" - -#include "IGUISkin.h" -#include "IGUIEnvironment.h" -#include "IGUIFont.h" -#include "IVideoDriver.h" -//#include "irrlicht/os.cpp" -#include "porting.h" -//#include "Keycodes.h" -#include "log.h" - -/* - todo: - optional scrollbars - ctrl+left/right to select word - double click/ctrl click: word select + drag to select whole words, triple click to select line - optional? dragging selected text - numerical -*/ - -namespace irr -{ -namespace gui -{ - -//! constructor -intlGUIEditBox::intlGUIEditBox(const wchar_t* text, bool border, - IGUIEnvironment* environment, IGUIElement* parent, s32 id, - const core::rect<s32>& rectangle, bool writable, bool has_vscrollbar) - : IGUIEditBox(environment, parent, id, rectangle), - Border(border), FrameRect(rectangle), - m_scrollbar_width(0), m_vscrollbar(NULL), m_writable(writable) -{ - #ifdef _DEBUG - setDebugName("intlintlGUIEditBox"); - #endif - - Text = text; - - if (Environment) - Operator = Environment->getOSOperator(); - - if (Operator) - Operator->grab(); - - // this element can be tabbed to - setTabStop(true); - setTabOrder(-1); - - IGUISkin *skin = 0; - if (Environment) - skin = Environment->getSkin(); - if (Border && skin) - { - FrameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1; - FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1; - FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1; - FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1; - } - - if (skin && has_vscrollbar) { - m_scrollbar_width = skin->getSize(gui::EGDS_SCROLLBAR_SIZE); - - if (m_scrollbar_width > 0) { - createVScrollBar(); - } - } - - breakText(); - - calculateScrollPos(); - setWritable(writable); -} - - -//! destructor -intlGUIEditBox::~intlGUIEditBox() -{ - if (OverrideFont) - OverrideFont->drop(); - - if (Operator) - Operator->drop(); - - if (m_vscrollbar) - m_vscrollbar->drop(); -} - - -//! Sets another skin independent font. -void intlGUIEditBox::setOverrideFont(IGUIFont* font) -{ - if (OverrideFont == font) - return; - - if (OverrideFont) - OverrideFont->drop(); - - OverrideFont = font; - - if (OverrideFont) - OverrideFont->grab(); - - breakText(); -} - -IGUIFont * intlGUIEditBox::getOverrideFont() const -{ - return OverrideFont; -} - -//! Get the font which is used right now for drawing -IGUIFont* intlGUIEditBox::getActiveFont() const -{ - if ( OverrideFont ) - return OverrideFont; - IGUISkin* skin = Environment->getSkin(); - if (skin) - return skin->getFont(); - return 0; -} - -//! Sets another color for the text. -void intlGUIEditBox::setOverrideColor(video::SColor color) -{ - OverrideColor = color; - OverrideColorEnabled = true; -} - -video::SColor intlGUIEditBox::getOverrideColor() const -{ - return OverrideColor; -} - -//! Turns the border on or off -void intlGUIEditBox::setDrawBorder(bool border) -{ - Border = border; -} - -//! Sets whether to draw the background -void intlGUIEditBox::setDrawBackground(bool draw) -{ -} - -//! Sets if the text should use the overide color or the color in the gui skin. -void intlGUIEditBox::enableOverrideColor(bool enable) -{ - OverrideColorEnabled = enable; -} - -bool intlGUIEditBox::isOverrideColorEnabled() const -{ - return OverrideColorEnabled; -} - -//! Enables or disables word wrap -void intlGUIEditBox::setWordWrap(bool enable) -{ - WordWrap = enable; - breakText(); -} - - -void intlGUIEditBox::updateAbsolutePosition() -{ - core::rect<s32> oldAbsoluteRect(AbsoluteRect); - IGUIElement::updateAbsolutePosition(); - if ( oldAbsoluteRect != AbsoluteRect ) - { - breakText(); - } -} - - -//! Checks if word wrap is enabled -bool intlGUIEditBox::isWordWrapEnabled() const -{ - return WordWrap; -} - - -//! Enables or disables newlines. -void intlGUIEditBox::setMultiLine(bool enable) -{ - MultiLine = enable; -} - - -//! Checks if multi line editing is enabled -bool intlGUIEditBox::isMultiLineEnabled() const -{ - return MultiLine; -} - - -void intlGUIEditBox::setPasswordBox(bool passwordBox, wchar_t passwordChar) -{ - PasswordBox = passwordBox; - if (PasswordBox) - { - PasswordChar = passwordChar; - setMultiLine(false); - setWordWrap(false); - BrokenText.clear(); - } -} - - -bool intlGUIEditBox::isPasswordBox() const -{ - return PasswordBox; -} - - -//! Sets text justification -void intlGUIEditBox::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical) -{ - HAlign = horizontal; - VAlign = vertical; -} - - -//! called if an event happened. -bool intlGUIEditBox::OnEvent(const SEvent& event) -{ - if (IsEnabled) - { - - switch(event.EventType) - { - case EET_GUI_EVENT: - if (event.GUIEvent.EventType == EGET_ELEMENT_FOCUS_LOST) - { - if (event.GUIEvent.Caller == this) - { - MouseMarking = false; - setTextMarkers(0,0); - } - } - break; - case EET_KEY_INPUT_EVENT: - { -#if (defined(__linux__) || defined(__FreeBSD__)) || defined(__DragonFly__) - // ################################################################ - // ValkaTR: - // This part is the difference from the original intlGUIEditBox - // It converts UTF-8 character into a UCS-2 (wchar_t) - wchar_t wc = L'_'; - mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) ); - - //printf( "char: %lc (%u) \r\n", wc, wc ); - - SEvent irrevent(event); - irrevent.KeyInput.Char = wc; - // ################################################################ - - if (processKey(irrevent)) - return true; -#else - if (processKey(event)) - return true; -#endif // defined(linux) - - break; - } - case EET_MOUSE_INPUT_EVENT: - if (processMouse(event)) - return true; - break; - default: - break; - } - } - - return IGUIElement::OnEvent(event); -} - - -bool intlGUIEditBox::processKey(const SEvent& event) -{ - if (!event.KeyInput.PressedDown) - return false; - - bool textChanged = false; - s32 newMarkBegin = MarkBegin; - s32 newMarkEnd = MarkEnd; - - // control shortcut handling - - if (event.KeyInput.Control) - { - // german backlash '\' entered with control + '?' - if ( event.KeyInput.Char == '\\' ) - { - inputChar(event.KeyInput.Char); - return true; - } - - switch(event.KeyInput.Key) - { - case KEY_KEY_A: - // select all - newMarkBegin = 0; - newMarkEnd = Text.size(); - break; - case KEY_KEY_C: - // copy to clipboard - if (!PasswordBox && Operator && MarkBegin != MarkEnd) - { - const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd; - const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin; - - core::stringc s; - s = Text.subString(realmbgn, realmend - realmbgn).c_str(); - Operator->copyToClipboard(s.c_str()); - } - break; - case KEY_KEY_X: - // cut to the clipboard - if (!PasswordBox && Operator && MarkBegin != MarkEnd) { - const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd; - const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin; - - // copy - core::stringc sc; - sc = Text.subString(realmbgn, realmend - realmbgn).c_str(); - Operator->copyToClipboard(sc.c_str()); - - if (IsEnabled && m_writable) { - // delete - core::stringw s; - s = Text.subString(0, realmbgn); - s.append( Text.subString(realmend, Text.size()-realmend) ); - Text = s; - - CursorPos = realmbgn; - newMarkBegin = 0; - newMarkEnd = 0; - textChanged = true; - } - } - break; - case KEY_KEY_V: - if (!IsEnabled || !m_writable) - break; - - // paste from the clipboard - if (Operator) - { - const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd; - const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin; - - // add new character - const c8* p = Operator->getTextFromClipboard(); - if (p) - { - if (MarkBegin == MarkEnd) - { - // insert text - core::stringw s = Text.subString(0, CursorPos); - s.append(p); - s.append( Text.subString(CursorPos, Text.size()-CursorPos) ); - - if (!Max || s.size()<=Max) // thx to Fish FH for fix - { - Text = s; - s = p; - CursorPos += s.size(); - } - } - else - { - // replace text - - core::stringw s = Text.subString(0, realmbgn); - s.append(p); - s.append( Text.subString(realmend, Text.size()-realmend) ); - - if (!Max || s.size()<=Max) // thx to Fish FH for fix - { - Text = s; - s = p; - CursorPos = realmbgn + s.size(); - } - } - } - - newMarkBegin = 0; - newMarkEnd = 0; - textChanged = true; - } - break; - case KEY_HOME: - // move/highlight to start of text - if (event.KeyInput.Shift) - { - newMarkEnd = CursorPos; - newMarkBegin = 0; - CursorPos = 0; - } - else - { - CursorPos = 0; - newMarkBegin = 0; - newMarkEnd = 0; - } - break; - case KEY_END: - // move/highlight to end of text - if (event.KeyInput.Shift) - { - newMarkBegin = CursorPos; - newMarkEnd = Text.size(); - CursorPos = 0; - } - else - { - CursorPos = Text.size(); - newMarkBegin = 0; - newMarkEnd = 0; - } - break; - default: - return false; - } - } - // default keyboard handling - else - switch(event.KeyInput.Key) - { - case KEY_END: - { - s32 p = Text.size(); - if (WordWrap || MultiLine) - { - p = getLineFromPos(CursorPos); - p = BrokenTextPositions[p] + (s32)BrokenText[p].size(); - if (p > 0 && (Text[p-1] == L'\r' || Text[p-1] == L'\n' )) - p-=1; - } - - if (event.KeyInput.Shift) - { - if (MarkBegin == MarkEnd) - newMarkBegin = CursorPos; - - newMarkEnd = p; - } - else - { - newMarkBegin = 0; - newMarkEnd = 0; - } - CursorPos = p; - BlinkStartTime = porting::getTimeMs(); - } - break; - case KEY_HOME: - { - - s32 p = 0; - if (WordWrap || MultiLine) - { - p = getLineFromPos(CursorPos); - p = BrokenTextPositions[p]; - } - - if (event.KeyInput.Shift) - { - if (MarkBegin == MarkEnd) - newMarkBegin = CursorPos; - newMarkEnd = p; - } - else - { - newMarkBegin = 0; - newMarkEnd = 0; - } - CursorPos = p; - BlinkStartTime = porting::getTimeMs(); - } - break; - case KEY_RETURN: - if (MultiLine) - { - inputChar(L'\n'); - return true; - } - else - { - sendGuiEvent( EGET_EDITBOX_ENTER ); - } - break; - case KEY_LEFT: - - if (event.KeyInput.Shift) - { - if (CursorPos > 0) - { - if (MarkBegin == MarkEnd) - newMarkBegin = CursorPos; - - newMarkEnd = CursorPos-1; - } - } - else - { - newMarkBegin = 0; - newMarkEnd = 0; - } - - if (CursorPos > 0) CursorPos--; - BlinkStartTime = porting::getTimeMs(); - break; - - case KEY_RIGHT: - if (event.KeyInput.Shift) - { - if (Text.size() > (u32)CursorPos) - { - if (MarkBegin == MarkEnd) - newMarkBegin = CursorPos; - - newMarkEnd = CursorPos+1; - } - } - else - { - newMarkBegin = 0; - newMarkEnd = 0; - } - - if (Text.size() > (u32)CursorPos) CursorPos++; - BlinkStartTime = porting::getTimeMs(); - break; - case KEY_UP: - if (MultiLine || (WordWrap && BrokenText.size() > 1) ) - { - s32 lineNo = getLineFromPos(CursorPos); - s32 mb = (MarkBegin == MarkEnd) ? CursorPos : (MarkBegin > MarkEnd ? MarkBegin : MarkEnd); - if (lineNo > 0) - { - s32 cp = CursorPos - BrokenTextPositions[lineNo]; - if ((s32)BrokenText[lineNo-1].size() < cp) - CursorPos = BrokenTextPositions[lineNo-1] + (s32)BrokenText[lineNo-1].size()-1; - else - CursorPos = BrokenTextPositions[lineNo-1] + cp; - } - - if (event.KeyInput.Shift) - { - newMarkBegin = mb; - newMarkEnd = CursorPos; - } - else - { - newMarkBegin = 0; - newMarkEnd = 0; - } - - } - else - { - return false; - } - break; - case KEY_DOWN: - if (MultiLine || (WordWrap && BrokenText.size() > 1) ) - { - s32 lineNo = getLineFromPos(CursorPos); - s32 mb = (MarkBegin == MarkEnd) ? CursorPos : (MarkBegin < MarkEnd ? MarkBegin : MarkEnd); - if (lineNo < (s32)BrokenText.size()-1) - { - s32 cp = CursorPos - BrokenTextPositions[lineNo]; - if ((s32)BrokenText[lineNo+1].size() < cp) - CursorPos = BrokenTextPositions[lineNo+1] + BrokenText[lineNo+1].size()-1; - else - CursorPos = BrokenTextPositions[lineNo+1] + cp; - } - - if (event.KeyInput.Shift) - { - newMarkBegin = mb; - newMarkEnd = CursorPos; - } - else - { - newMarkBegin = 0; - newMarkEnd = 0; - } - - } - else - { - return false; - } - break; - - case KEY_BACK: - if (!this->IsEnabled || !m_writable) - break; - - if (!Text.empty()) { - core::stringw s; - - if (MarkBegin != MarkEnd) - { - // delete marked text - const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd; - const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin; - - s = Text.subString(0, realmbgn); - s.append( Text.subString(realmend, Text.size()-realmend) ); - Text = s; - - CursorPos = realmbgn; - } - else - { - // delete text behind cursor - if (CursorPos>0) - s = Text.subString(0, CursorPos-1); - else - s = L""; - s.append( Text.subString(CursorPos, Text.size()-CursorPos) ); - Text = s; - --CursorPos; - } - - if (CursorPos < 0) - CursorPos = 0; - BlinkStartTime = porting::getTimeMs(); - newMarkBegin = 0; - newMarkEnd = 0; - textChanged = true; - } - break; - case KEY_DELETE: - if (!this->IsEnabled || !m_writable) - break; - - if (!Text.empty()) { - core::stringw s; - - if (MarkBegin != MarkEnd) - { - // delete marked text - const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd; - const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin; - - s = Text.subString(0, realmbgn); - s.append( Text.subString(realmend, Text.size()-realmend) ); - Text = s; - - CursorPos = realmbgn; - } - else - { - // delete text before cursor - s = Text.subString(0, CursorPos); - s.append( Text.subString(CursorPos+1, Text.size()-CursorPos-1) ); - Text = s; - } - - if (CursorPos > (s32)Text.size()) - CursorPos = (s32)Text.size(); - - BlinkStartTime = porting::getTimeMs(); - newMarkBegin = 0; - newMarkEnd = 0; - textChanged = true; - } - break; - - case KEY_ESCAPE: - case KEY_TAB: - case KEY_SHIFT: - case KEY_F1: - case KEY_F2: - case KEY_F3: - case KEY_F4: - case KEY_F5: - case KEY_F6: - case KEY_F7: - case KEY_F8: - case KEY_F9: - case KEY_F10: - case KEY_F11: - case KEY_F12: - case KEY_F13: - case KEY_F14: - case KEY_F15: - case KEY_F16: - case KEY_F17: - case KEY_F18: - case KEY_F19: - case KEY_F20: - case KEY_F21: - case KEY_F22: - case KEY_F23: - case KEY_F24: - // ignore these keys - return false; - - default: - inputChar(event.KeyInput.Char); - return true; - } - - // Set new text markers - setTextMarkers( newMarkBegin, newMarkEnd ); - - // break the text if it has changed - if (textChanged) - { - breakText(); - sendGuiEvent(EGET_EDITBOX_CHANGED); - } - - calculateScrollPos(); - - return true; -} - - -//! draws the element and its children -void intlGUIEditBox::draw() -{ - if (!IsVisible) - return; - - const bool focus = Environment->hasFocus(this); - - IGUISkin* skin = Environment->getSkin(); - if (!skin) - return; - - FrameRect = AbsoluteRect; - - // draw the border - - if (Border) - { - if (m_writable) { - skin->draw3DSunkenPane(this, skin->getColor(EGDC_WINDOW), - false, true, FrameRect, &AbsoluteClippingRect); - } - - FrameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X)+1; - FrameRect.UpperLeftCorner.Y += skin->getSize(EGDS_TEXT_DISTANCE_Y)+1; - FrameRect.LowerRightCorner.X -= skin->getSize(EGDS_TEXT_DISTANCE_X)+1; - FrameRect.LowerRightCorner.Y -= skin->getSize(EGDS_TEXT_DISTANCE_Y)+1; - } - - updateVScrollBar(); - core::rect<s32> localClipRect = FrameRect; - localClipRect.clipAgainst(AbsoluteClippingRect); - - // draw the text - - IGUIFont* font = OverrideFont; - if (!OverrideFont) - font = skin->getFont(); - - s32 cursorLine = 0; - s32 charcursorpos = 0; - - if (font) - { - if (LastBreakFont != font) - { - breakText(); - } - - // calculate cursor pos - - core::stringw *txtLine = &Text; - s32 startPos = 0; - - core::stringw s, s2; - - // get mark position - const bool ml = (!PasswordBox && (WordWrap || MultiLine)); - const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd; - const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin; - const s32 hlineStart = ml ? getLineFromPos(realmbgn) : 0; - const s32 hlineCount = ml ? getLineFromPos(realmend) - hlineStart + 1 : 1; - const s32 lineCount = ml ? BrokenText.size() : 1; - - // Save the override color information. - // Then, alter it if the edit box is disabled. - const bool prevOver = OverrideColorEnabled; - const video::SColor prevColor = OverrideColor; - - if (!Text.empty()) { - if (!IsEnabled && !OverrideColorEnabled) - { - OverrideColorEnabled = true; - OverrideColor = skin->getColor(EGDC_GRAY_TEXT); - } - - for (s32 i=0; i < lineCount; ++i) - { - setTextRect(i); - - // clipping test - don't draw anything outside the visible area - core::rect<s32> c = localClipRect; - c.clipAgainst(CurrentTextRect); - if (!c.isValid()) - continue; - - // get current line - if (PasswordBox) - { - if (BrokenText.size() != 1) - { - BrokenText.clear(); - BrokenText.push_back(core::stringw()); - } - if (BrokenText[0].size() != Text.size()) - { - BrokenText[0] = Text; - for (u32 q = 0; q < Text.size(); ++q) - { - BrokenText[0] [q] = PasswordChar; - } - } - txtLine = &BrokenText[0]; - startPos = 0; - } - else - { - txtLine = ml ? &BrokenText[i] : &Text; - startPos = ml ? BrokenTextPositions[i] : 0; - } - - - // draw normal text - font->draw(txtLine->c_str(), CurrentTextRect, - OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_BUTTON_TEXT), - false, true, &localClipRect); - - // draw mark and marked text - if (focus && MarkBegin != MarkEnd && i >= hlineStart && i < hlineStart + hlineCount) - { - - s32 mbegin = 0, mend = 0; - s32 lineStartPos = 0, lineEndPos = txtLine->size(); - - if (i == hlineStart) - { - // highlight start is on this line - s = txtLine->subString(0, realmbgn - startPos); - mbegin = font->getDimension(s.c_str()).Width; - - // deal with kerning - mbegin += font->getKerningWidth( - &((*txtLine)[realmbgn - startPos]), - realmbgn - startPos > 0 ? &((*txtLine)[realmbgn - startPos - 1]) : 0); - - lineStartPos = realmbgn - startPos; - } - if (i == hlineStart + hlineCount - 1) - { - // highlight end is on this line - s2 = txtLine->subString(0, realmend - startPos); - mend = font->getDimension(s2.c_str()).Width; - lineEndPos = (s32)s2.size(); - } - else - mend = font->getDimension(txtLine->c_str()).Width; - - CurrentTextRect.UpperLeftCorner.X += mbegin; - CurrentTextRect.LowerRightCorner.X = CurrentTextRect.UpperLeftCorner.X + mend - mbegin; - - // draw mark - skin->draw2DRectangle(this, skin->getColor(EGDC_HIGH_LIGHT), CurrentTextRect, &localClipRect); - - // draw marked text - s = txtLine->subString(lineStartPos, lineEndPos - lineStartPos); - - if (!s.empty()) - font->draw(s.c_str(), CurrentTextRect, - OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_HIGH_LIGHT_TEXT), - false, true, &localClipRect); - - } - } - - // Return the override color information to its previous settings. - OverrideColorEnabled = prevOver; - OverrideColor = prevColor; - } - - // draw cursor - - if (WordWrap || MultiLine) - { - cursorLine = getLineFromPos(CursorPos); - txtLine = &BrokenText[cursorLine]; - startPos = BrokenTextPositions[cursorLine]; - } - s = txtLine->subString(0,CursorPos-startPos); - charcursorpos = font->getDimension(s.c_str()).Width + - font->getKerningWidth(L"_", CursorPos-startPos > 0 ? &((*txtLine)[CursorPos-startPos-1]) : 0); - - if (m_writable) { - if (focus && (porting::getTimeMs() - BlinkStartTime) % 700 < 350) { - setTextRect(cursorLine); - CurrentTextRect.UpperLeftCorner.X += charcursorpos; - - font->draw(L"_", CurrentTextRect, - OverrideColorEnabled ? OverrideColor : skin->getColor(EGDC_BUTTON_TEXT), - false, true, &localClipRect); - } - } - } - - // draw children - IGUIElement::draw(); -} - - -//! Sets the new caption of this element. -void intlGUIEditBox::setText(const wchar_t* text) -{ - Text = text; - if (u32(CursorPos) > Text.size()) - CursorPos = Text.size(); - HScrollPos = 0; - breakText(); -} - - -//! Enables or disables automatic scrolling with cursor position -//! \param enable: If set to true, the text will move around with the cursor position -void intlGUIEditBox::setAutoScroll(bool enable) -{ - AutoScroll = enable; -} - - -//! Checks to see if automatic scrolling is enabled -//! \return true if automatic scrolling is enabled, false if not -bool intlGUIEditBox::isAutoScrollEnabled() const -{ - return AutoScroll; -} - - -//! Gets the area of the text in the edit box -//! \return Returns the size in pixels of the text -core::dimension2du intlGUIEditBox::getTextDimension() -{ - core::rect<s32> ret; - - setTextRect(0); - ret = CurrentTextRect; - - for (u32 i=1; i < BrokenText.size(); ++i) - { - setTextRect(i); - ret.addInternalPoint(CurrentTextRect.UpperLeftCorner); - ret.addInternalPoint(CurrentTextRect.LowerRightCorner); - } - - return core::dimension2du(ret.getSize()); -} - - -//! Sets the maximum amount of characters which may be entered in the box. -//! \param max: Maximum amount of characters. If 0, the character amount is -//! infinity. -void intlGUIEditBox::setMax(u32 max) -{ - Max = max; - - if (Text.size() > Max && Max != 0) - Text = Text.subString(0, Max); -} - - -//! Returns maximum amount of characters, previously set by setMax(); -u32 intlGUIEditBox::getMax() const -{ - return Max; -} - - -bool intlGUIEditBox::processMouse(const SEvent& event) -{ - switch(event.MouseInput.Event) - { - case irr::EMIE_LMOUSE_LEFT_UP: - if (Environment->hasFocus(this)) - { - CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); - if (MouseMarking) - { - setTextMarkers( MarkBegin, CursorPos ); - } - MouseMarking = false; - calculateScrollPos(); - return true; - } - break; - case irr::EMIE_MOUSE_MOVED: - { - if (MouseMarking) - { - CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); - setTextMarkers( MarkBegin, CursorPos ); - calculateScrollPos(); - return true; - } - } - break; - case EMIE_LMOUSE_PRESSED_DOWN: - if (!Environment->hasFocus(this)) - { - BlinkStartTime = porting::getTimeMs(); - MouseMarking = true; - CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); - setTextMarkers(CursorPos, CursorPos ); - calculateScrollPos(); - return true; - } - else - { - if (!AbsoluteClippingRect.isPointInside( - core::position2d<s32>(event.MouseInput.X, event.MouseInput.Y))) { - return false; - } - - - // move cursor - CursorPos = getCursorPos(event.MouseInput.X, event.MouseInput.Y); - - s32 newMarkBegin = MarkBegin; - if (!MouseMarking) - newMarkBegin = CursorPos; - - MouseMarking = true; - setTextMarkers( newMarkBegin, CursorPos); - calculateScrollPos(); - return true; - } - break; - case EMIE_MOUSE_WHEEL: - if (m_vscrollbar && m_vscrollbar->isVisible()) { - s32 pos = m_vscrollbar->getPos(); - s32 step = m_vscrollbar->getSmallStep(); - m_vscrollbar->setPos(pos - event.MouseInput.Wheel * step); - } - break; - default: - break; - } - - return false; -} - - -s32 intlGUIEditBox::getCursorPos(s32 x, s32 y) -{ - IGUIFont* font = OverrideFont; - IGUISkin* skin = Environment->getSkin(); - if (!OverrideFont) - font = skin->getFont(); - - const u32 lineCount = (WordWrap || MultiLine) ? BrokenText.size() : 1; - - core::stringw *txtLine = NULL; - s32 startPos = 0; - u32 curr_line_idx = 0; - x += 3; - - for (; curr_line_idx < lineCount; ++curr_line_idx) { - setTextRect(curr_line_idx); - if (curr_line_idx == 0 && y < CurrentTextRect.UpperLeftCorner.Y) - y = CurrentTextRect.UpperLeftCorner.Y; - if (curr_line_idx == lineCount - 1 && y > CurrentTextRect.LowerRightCorner.Y) - y = CurrentTextRect.LowerRightCorner.Y; - - // is it inside this region? - if (y >= CurrentTextRect.UpperLeftCorner.Y && y <= CurrentTextRect.LowerRightCorner.Y) { - // we've found the clicked line - txtLine = (WordWrap || MultiLine) ? &BrokenText[curr_line_idx] : &Text; - startPos = (WordWrap || MultiLine) ? BrokenTextPositions[curr_line_idx] : 0; - break; - } - } - - if (x < CurrentTextRect.UpperLeftCorner.X) - x = CurrentTextRect.UpperLeftCorner.X; - else if (x > CurrentTextRect.LowerRightCorner.X) - x = CurrentTextRect.LowerRightCorner.X; - - s32 idx = font->getCharacterFromPos(txtLine->c_str(), x - CurrentTextRect.UpperLeftCorner.X); - // Special handling for last line, if we are on limits, add 1 extra shift because idx - // will be the last char, not null char of the wstring - if (curr_line_idx == lineCount - 1 && x == CurrentTextRect.LowerRightCorner.X) - idx++; - - return rangelim(idx + startPos, 0, S32_MAX); -} - - -//! Breaks the single text line. -void intlGUIEditBox::breakText() -{ - IGUISkin* skin = Environment->getSkin(); - - if ((!WordWrap && !MultiLine) || !skin) - return; - - BrokenText.clear(); // need to reallocate :/ - BrokenTextPositions.set_used(0); - - IGUIFont* font = OverrideFont; - if (!OverrideFont) - font = skin->getFont(); - - if (!font) - return; - - LastBreakFont = font; - - core::stringw line; - core::stringw word; - core::stringw whitespace; - s32 lastLineStart = 0; - s32 size = Text.size(); - s32 length = 0; - s32 elWidth = RelativeRect.getWidth() - 6; - wchar_t c; - - for (s32 i=0; i<size; ++i) - { - c = Text[i]; - bool lineBreak = false; - - if (c == L'\r') // Mac or Windows breaks - { - lineBreak = true; - c = ' '; - if (Text[i+1] == L'\n') // Windows breaks - { - Text.erase(i+1); - --size; - } - } - else if (c == L'\n') // Unix breaks - { - lineBreak = true; - c = ' '; - } - - // don't break if we're not a multi-line edit box - if (!MultiLine) - lineBreak = false; - - if (c == L' ' || c == 0 || i == (size-1)) - { - if (!word.empty()) { - // here comes the next whitespace, look if - // we can break the last word to the next line. - s32 whitelgth = font->getDimension(whitespace.c_str()).Width; - s32 worldlgth = font->getDimension(word.c_str()).Width; - - if (WordWrap && length + worldlgth + whitelgth > elWidth) - { - // break to next line - length = worldlgth; - BrokenText.push_back(line); - BrokenTextPositions.push_back(lastLineStart); - lastLineStart = i - (s32)word.size(); - line = word; - } - else - { - // add word to line - line += whitespace; - line += word; - length += whitelgth + worldlgth; - } - - word = L""; - whitespace = L""; - } - - whitespace += c; - - // compute line break - if (lineBreak) - { - line += whitespace; - line += word; - BrokenText.push_back(line); - BrokenTextPositions.push_back(lastLineStart); - lastLineStart = i+1; - line = L""; - word = L""; - whitespace = L""; - length = 0; - } - } - else - { - // yippee this is a word.. - word += c; - } - } - - line += whitespace; - line += word; - BrokenText.push_back(line); - BrokenTextPositions.push_back(lastLineStart); -} - - -void intlGUIEditBox::setTextRect(s32 line) -{ - core::dimension2du d; - - IGUISkin* skin = Environment->getSkin(); - if (!skin) - return; - - IGUIFont* font = OverrideFont ? OverrideFont : skin->getFont(); - - if (!font) - return; - - // get text dimension - const u32 lineCount = (WordWrap || MultiLine) ? BrokenText.size() : 1; - if (WordWrap || MultiLine) - { - d = font->getDimension(BrokenText[line].c_str()); - } - else - { - d = font->getDimension(Text.c_str()); - d.Height = AbsoluteRect.getHeight(); - } - d.Height += font->getKerningHeight(); - - // justification - switch (HAlign) - { - case EGUIA_CENTER: - // align to h centre - CurrentTextRect.UpperLeftCorner.X = (FrameRect.getWidth()/2) - (d.Width/2); - CurrentTextRect.LowerRightCorner.X = (FrameRect.getWidth()/2) + (d.Width/2); - break; - case EGUIA_LOWERRIGHT: - // align to right edge - CurrentTextRect.UpperLeftCorner.X = FrameRect.getWidth() - d.Width; - CurrentTextRect.LowerRightCorner.X = FrameRect.getWidth(); - break; - default: - // align to left edge - CurrentTextRect.UpperLeftCorner.X = 0; - CurrentTextRect.LowerRightCorner.X = d.Width; - - } - - switch (VAlign) - { - case EGUIA_CENTER: - // align to v centre - CurrentTextRect.UpperLeftCorner.Y = - (FrameRect.getHeight()/2) - (lineCount*d.Height)/2 + d.Height*line; - break; - case EGUIA_LOWERRIGHT: - // align to bottom edge - CurrentTextRect.UpperLeftCorner.Y = - FrameRect.getHeight() - lineCount*d.Height + d.Height*line; - break; - default: - // align to top edge - CurrentTextRect.UpperLeftCorner.Y = d.Height*line; - break; - } - - CurrentTextRect.UpperLeftCorner.X -= HScrollPos; - CurrentTextRect.LowerRightCorner.X -= HScrollPos; - CurrentTextRect.UpperLeftCorner.Y -= VScrollPos; - CurrentTextRect.LowerRightCorner.Y = CurrentTextRect.UpperLeftCorner.Y + d.Height; - - CurrentTextRect += FrameRect.UpperLeftCorner; - -} - - -s32 intlGUIEditBox::getLineFromPos(s32 pos) -{ - if (!WordWrap && !MultiLine) - return 0; - - s32 i=0; - while (i < (s32)BrokenTextPositions.size()) - { - if (BrokenTextPositions[i] > pos) - return i-1; - ++i; - } - return (s32)BrokenTextPositions.size() - 1; -} - - -void intlGUIEditBox::inputChar(wchar_t c) -{ - if (!IsEnabled || !m_writable) - return; - - if (c != 0) - { - if (Text.size() < Max || Max == 0) - { - core::stringw s; - - if (MarkBegin != MarkEnd) - { - // replace marked text - const s32 realmbgn = MarkBegin < MarkEnd ? MarkBegin : MarkEnd; - const s32 realmend = MarkBegin < MarkEnd ? MarkEnd : MarkBegin; - - s = Text.subString(0, realmbgn); - s.append(c); - s.append( Text.subString(realmend, Text.size()-realmend) ); - Text = s; - CursorPos = realmbgn+1; - } - else - { - // add new character - s = Text.subString(0, CursorPos); - s.append(c); - s.append( Text.subString(CursorPos, Text.size()-CursorPos) ); - Text = s; - ++CursorPos; - } - - BlinkStartTime = porting::getTimeMs(); - setTextMarkers(0, 0); - } - } - breakText(); - sendGuiEvent(EGET_EDITBOX_CHANGED); - calculateScrollPos(); -} - - -void intlGUIEditBox::calculateScrollPos() -{ - if (!AutoScroll) - return; - - // calculate horizontal scroll position - s32 cursLine = getLineFromPos(CursorPos); - setTextRect(cursLine); - - // don't do horizontal scrolling when wordwrap is enabled. - if (!WordWrap) - { - // get cursor position - IGUISkin* skin = Environment->getSkin(); - if (!skin) - return; - IGUIFont* font = OverrideFont ? OverrideFont : skin->getFont(); - if (!font) - return; - - core::stringw *txtLine = MultiLine ? &BrokenText[cursLine] : &Text; - s32 cPos = MultiLine ? CursorPos - BrokenTextPositions[cursLine] : CursorPos; - - s32 cStart = CurrentTextRect.UpperLeftCorner.X + HScrollPos + - font->getDimension(txtLine->subString(0, cPos).c_str()).Width; - - s32 cEnd = cStart + font->getDimension(L"_ ").Width; - - if (FrameRect.LowerRightCorner.X < cEnd) - HScrollPos = cEnd - FrameRect.LowerRightCorner.X; - else if (FrameRect.UpperLeftCorner.X > cStart) - HScrollPos = cStart - FrameRect.UpperLeftCorner.X; - else - HScrollPos = 0; - - // todo: adjust scrollbar - } - - if (!WordWrap && !MultiLine) - return; - - // vertical scroll position - if (FrameRect.LowerRightCorner.Y < CurrentTextRect.LowerRightCorner.Y) - VScrollPos += CurrentTextRect.LowerRightCorner.Y - FrameRect.LowerRightCorner.Y; // scrolling downwards - else if (FrameRect.UpperLeftCorner.Y > CurrentTextRect.UpperLeftCorner.Y) - VScrollPos += CurrentTextRect.UpperLeftCorner.Y - FrameRect.UpperLeftCorner.Y; // scrolling upwards - - // todo: adjust scrollbar - if (m_vscrollbar) - m_vscrollbar->setPos(VScrollPos); -} - -//! set text markers -void intlGUIEditBox::setTextMarkers(s32 begin, s32 end) -{ - if ( begin != MarkBegin || end != MarkEnd ) - { - MarkBegin = begin; - MarkEnd = end; - sendGuiEvent(EGET_EDITBOX_MARKING_CHANGED); - } -} - -//! send some gui event to parent -void intlGUIEditBox::sendGuiEvent(EGUI_EVENT_TYPE type) -{ - if ( Parent ) - { - SEvent e; - e.EventType = EET_GUI_EVENT; - e.GUIEvent.Caller = this; - e.GUIEvent.Element = 0; - e.GUIEvent.EventType = type; - - Parent->OnEvent(e); - } -} - -//! Create a vertical scrollbar -void intlGUIEditBox::createVScrollBar() -{ - s32 fontHeight = 1; - - if (OverrideFont) { - fontHeight = OverrideFont->getDimension(L"").Height; - } else { - if (IGUISkin* skin = Environment->getSkin()) { - if (IGUIFont* font = skin->getFont()) { - fontHeight = font->getDimension(L"").Height; - } - } - } - - RelativeRect.LowerRightCorner.X -= m_scrollbar_width + 4; - - irr::core::rect<s32> scrollbarrect = FrameRect; - scrollbarrect.UpperLeftCorner.X += FrameRect.getWidth() - m_scrollbar_width; - m_vscrollbar = new GUIScrollBar(Environment, getParent(), -1, - scrollbarrect, false, true); - - m_vscrollbar->setVisible(false); - m_vscrollbar->setSmallStep(3 * fontHeight); - m_vscrollbar->setLargeStep(10 * fontHeight); -} - -//! Update the vertical scrollbar (visibilty & scroll position) -void intlGUIEditBox::updateVScrollBar() -{ - if (!m_vscrollbar) - return; - - // OnScrollBarChanged(...) - if (m_vscrollbar->getPos() != VScrollPos) { - s32 deltaScrollY = m_vscrollbar->getPos() - VScrollPos; - CurrentTextRect.UpperLeftCorner.Y -= deltaScrollY; - CurrentTextRect.LowerRightCorner.Y -= deltaScrollY; - - s32 scrollymax = getTextDimension().Height - FrameRect.getHeight(); - if (scrollymax != m_vscrollbar->getMax()) { - // manage a newline or a deleted line - m_vscrollbar->setMax(scrollymax); - m_vscrollbar->setPageSize(s32(getTextDimension().Height)); - calculateScrollPos(); - } else { - // manage a newline or a deleted line - VScrollPos = m_vscrollbar->getPos(); - } - } - - // check if a vertical scrollbar is needed ? - if (getTextDimension().Height > (u32) FrameRect.getHeight()) { - s32 scrollymax = getTextDimension().Height - FrameRect.getHeight(); - if (scrollymax != m_vscrollbar->getMax()) { - m_vscrollbar->setMax(scrollymax); - m_vscrollbar->setPageSize(s32(getTextDimension().Height)); - } - - if (!m_vscrollbar->isVisible() && MultiLine) { - AbsoluteRect.LowerRightCorner.X -= m_scrollbar_width; - - m_vscrollbar->setVisible(true); - } - } else { - if (m_vscrollbar->isVisible()) { - AbsoluteRect.LowerRightCorner.X += m_scrollbar_width; - - VScrollPos = 0; - m_vscrollbar->setPos(0); - m_vscrollbar->setMax(1); - m_vscrollbar->setPageSize(s32(getTextDimension().Height)); - m_vscrollbar->setVisible(false); - } - } -} - -void intlGUIEditBox::setWritable(bool can_write_text) -{ - m_writable = can_write_text; -} - -//! Writes attributes of the element. -void intlGUIEditBox::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const -{ - // IGUIEditBox::serializeAttributes(out,options); - - out->addBool ("OverrideColorEnabled",OverrideColorEnabled ); - out->addColor ("OverrideColor", OverrideColor); - // out->addFont("OverrideFont",OverrideFont); - out->addInt ("MaxChars", Max); - out->addBool ("WordWrap", WordWrap); - out->addBool ("MultiLine", MultiLine); - out->addBool ("AutoScroll", AutoScroll); - out->addBool ("PasswordBox", PasswordBox); - core::stringw ch = L" "; - ch[0] = PasswordChar; - out->addString("PasswordChar", ch.c_str()); - out->addEnum ("HTextAlign", HAlign, GUIAlignmentNames); - out->addEnum ("VTextAlign", VAlign, GUIAlignmentNames); - out->addBool ("Writable", m_writable); - - IGUIEditBox::serializeAttributes(out,options); -} - - -//! Reads attributes of the element -void intlGUIEditBox::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) -{ - IGUIEditBox::deserializeAttributes(in,options); - - setOverrideColor(in->getAttributeAsColor("OverrideColor")); - enableOverrideColor(in->getAttributeAsBool("OverrideColorEnabled")); - setMax(in->getAttributeAsInt("MaxChars")); - setWordWrap(in->getAttributeAsBool("WordWrap")); - setMultiLine(in->getAttributeAsBool("MultiLine")); - setAutoScroll(in->getAttributeAsBool("AutoScroll")); - core::stringw ch = in->getAttributeAsStringW("PasswordChar"); - - if (ch.empty()) - setPasswordBox(in->getAttributeAsBool("PasswordBox")); - else - setPasswordBox(in->getAttributeAsBool("PasswordBox"), ch[0]); - - setTextAlignment( (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("HTextAlign", GUIAlignmentNames), - (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("VTextAlign", GUIAlignmentNames)); - - setWritable(in->getAttributeAsBool("Writable")); - // setOverrideFont(in->getAttributeAsFont("OverrideFont")); -} - - -} // end namespace gui -} // end namespace irr diff --git a/src/gui/intlGUIEditBox.h b/src/gui/intlGUIEditBox.h deleted file mode 100644 index 9d643495e..000000000 --- a/src/gui/intlGUIEditBox.h +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (C) 2002-2013 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#pragma once - -#include "IrrCompileConfig.h" -//#ifdef _IRR_COMPILE_WITH_GUI_ - -#include <IGUIEditBox.h> -#include "irrArray.h" -#include "IOSOperator.h" -#include "guiScrollBar.h" - -namespace irr -{ -namespace gui -{ - class intlGUIEditBox : public IGUIEditBox - { - public: - - //! constructor - intlGUIEditBox(const wchar_t* text, bool border, IGUIEnvironment* environment, - IGUIElement* parent, s32 id, const core::rect<s32>& rectangle, - bool writable = true, bool has_vscrollbar = false); - - //! destructor - virtual ~intlGUIEditBox(); - - //! Sets another skin independent font. - virtual void setOverrideFont(IGUIFont* font=0); - - //! Gets the override font (if any) - /** \return The override font (may be 0) */ - virtual IGUIFont* getOverrideFont() const; - - //! Get the font which is used right now for drawing - /** Currently this is the override font when one is set and the - font of the active skin otherwise */ - virtual IGUIFont* getActiveFont() const; - - //! Sets another color for the text. - virtual void setOverrideColor(video::SColor color); - - //! Gets the override color - virtual video::SColor getOverrideColor() const; - - //! Sets if the text should use the overide color or the - //! color in the gui skin. - virtual void enableOverrideColor(bool enable); - - //! Checks if an override color is enabled - /** \return true if the override color is enabled, false otherwise */ - virtual bool isOverrideColorEnabled(void) const; - - //! Sets whether to draw the background - virtual void setDrawBackground(bool draw); - - virtual bool isDrawBackgroundEnabled() const { return true; } - - //! Turns the border on or off - virtual void setDrawBorder(bool border); - - virtual bool isDrawBorderEnabled() const { return Border; } - - //! Enables or disables word wrap for using the edit box as multiline text editor. - virtual void setWordWrap(bool enable); - - //! Checks if word wrap is enabled - //! \return true if word wrap is enabled, false otherwise - virtual bool isWordWrapEnabled() const; - - //! Enables or disables newlines. - /** \param enable: If set to true, the EGET_EDITBOX_ENTER event will not be fired, - instead a newline character will be inserted. */ - virtual void setMultiLine(bool enable); - - //! Checks if multi line editing is enabled - //! \return true if mult-line is enabled, false otherwise - virtual bool isMultiLineEnabled() const; - - //! Enables or disables automatic scrolling with cursor position - //! \param enable: If set to true, the text will move around with the cursor position - virtual void setAutoScroll(bool enable); - - //! Checks to see if automatic scrolling is enabled - //! \return true if automatic scrolling is enabled, false if not - virtual bool isAutoScrollEnabled() const; - - //! Gets the size area of the text in the edit box - //! \return Returns the size in pixels of the text - virtual core::dimension2du getTextDimension(); - - //! Sets text justification - virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical); - - //! called if an event happened. - virtual bool OnEvent(const SEvent& event); - - //! draws the element and its children - virtual void draw(); - - //! Sets the new caption of this element. - virtual void setText(const wchar_t* text); - - //! Sets the maximum amount of characters which may be entered in the box. - //! \param max: Maximum amount of characters. If 0, the character amount is - //! infinity. - virtual void setMax(u32 max); - - //! Returns maximum amount of characters, previously set by setMax(); - virtual u32 getMax() const; - - //! Sets whether the edit box is a password box. Setting this to true will - /** disable MultiLine, WordWrap and the ability to copy with ctrl+c or ctrl+x - \param passwordBox: true to enable password, false to disable - \param passwordChar: the character that is displayed instead of letters */ - virtual void setPasswordBox(bool passwordBox, wchar_t passwordChar = L'*'); - - //! Returns true if the edit box is currently a password box. - virtual bool isPasswordBox() const; - - //! Updates the absolute position, splits text if required - virtual void updateAbsolutePosition(); - - //! set true if this EditBox is writable - virtual void setWritable(bool can_write_text); - - //! Writes attributes of the element. - virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const; - - //! Reads attributes of the element - virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options); - - virtual void setCursorChar(const wchar_t cursorChar) {} - - virtual wchar_t getCursorChar() const { return L'|'; } - - virtual void setCursorBlinkTime(u32 timeMs) {} - - virtual u32 getCursorBlinkTime() const { return 500; } - - protected: - //! Breaks the single text line. - void breakText(); - //! sets the area of the given line - void setTextRect(s32 line); - //! returns the line number that the cursor is on - s32 getLineFromPos(s32 pos); - //! adds a letter to the edit box - void inputChar(wchar_t c); - //! calculates the current scroll position - void calculateScrollPos(); - //! send some gui event to parent - void sendGuiEvent(EGUI_EVENT_TYPE type); - //! set text markers - void setTextMarkers(s32 begin, s32 end); - - bool processKey(const SEvent& event); - bool processMouse(const SEvent& event); - s32 getCursorPos(s32 x, s32 y); - - //! Create a vertical scrollbar - void createVScrollBar(); - - //! Update the vertical scrollbar (visibilty & scroll position) - void updateVScrollBar(); - - bool MouseMarking = false; - bool Border; - bool OverrideColorEnabled = false; - s32 MarkBegin = 0; - s32 MarkEnd = 0; - - video::SColor OverrideColor = video::SColor(101,255,255,255); - gui::IGUIFont *OverrideFont = nullptr; - gui::IGUIFont *LastBreakFont = nullptr; - IOSOperator *Operator = nullptr; - - u64 BlinkStartTime = 0; - s32 CursorPos = 0; - s32 HScrollPos = 0; - s32 VScrollPos = 0; // scroll position in characters - u32 Max = 0; - - bool WordWrap = false; - bool MultiLine = false; - bool AutoScroll = true; - bool PasswordBox = false; - wchar_t PasswordChar = L'*'; - EGUI_ALIGNMENT HAlign = EGUIA_UPPERLEFT; - EGUI_ALIGNMENT VAlign = EGUIA_CENTER; - - core::array<core::stringw> BrokenText; - core::array<s32> BrokenTextPositions; - - core::rect<s32> CurrentTextRect = core::rect<s32>(0,0,1,1); - core::rect<s32> FrameRect; // temporary values - u32 m_scrollbar_width; - GUIScrollBar *m_vscrollbar; - bool m_writable; - - }; - - -} // end namespace gui -} // end namespace irr - -//#endif // _IRR_COMPILE_WITH_GUI_ diff --git a/src/gui/mainmenumanager.h b/src/gui/mainmenumanager.h index 102492255..76d357340 100644 --- a/src/gui/mainmenumanager.h +++ b/src/gui/mainmenumanager.h @@ -64,10 +64,6 @@ public: // Remove all entries if there are duplicates m_stack.remove(menu); - /*core::list<GUIModalMenu*>::Iterator i = m_stack.getLast(); - assert(*i == menu); - m_stack.erase(i);*/ - if(!m_stack.empty()) m_stack.back()->setVisible(true); } diff --git a/src/gui/modalMenu.cpp b/src/gui/modalMenu.cpp index 9b1e6dd9c..9f5258cdf 100644 --- a/src/gui/modalMenu.cpp +++ b/src/gui/modalMenu.cpp @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include <cstdlib> +#include "client/renderingengine.h" #include "modalMenu.h" #include "gettext.h" #include "porting.h" @@ -39,11 +40,14 @@ GUIModalMenu::GUIModalMenu(gui::IGUIEnvironment* env, gui::IGUIElement* parent, m_menumgr(menumgr), m_remap_dbl_click(remap_dbl_click) { - m_gui_scale = g_settings->getFloat("gui_scaling"); -#ifdef __ANDROID__ - float d = porting::getDisplayDensity(); - m_gui_scale *= 1.1 - 0.3 * d + 0.2 * d * d; + m_gui_scale = std::max(g_settings->getFloat("gui_scaling"), 0.5f); + const float screen_dpi_scale = RenderingEngine::getDisplayDensity(); +#ifdef HAVE_TOUCHSCREENGUI + m_gui_scale *= 1.1f - 0.3f * screen_dpi_scale + 0.2f * screen_dpi_scale * screen_dpi_scale; +#else + m_gui_scale *= screen_dpi_scale; #endif + setVisible(true); Environment->setFocus(this); m_menumgr->createdMenu(this); @@ -107,19 +111,6 @@ void GUIModalMenu::quitMenu() #endif } -void GUIModalMenu::removeChildren() -{ - const core::list<gui::IGUIElement *> &children = getChildren(); - core::list<gui::IGUIElement *> children_copy; - for (gui::IGUIElement *i : children) { - children_copy.push_back(i); - } - - for (gui::IGUIElement *i : children_copy) { - i->remove(); - } -} - // clang-format off bool GUIModalMenu::DoubleClickDetection(const SEvent &event) { @@ -183,6 +174,66 @@ static bool isChild(gui::IGUIElement *tocheck, gui::IGUIElement *parent) return false; } +#ifdef HAVE_TOUCHSCREENGUI + +bool GUIModalMenu::simulateMouseEvent( + gui::IGUIElement *target, ETOUCH_INPUT_EVENT touch_event) +{ + SEvent mouse_event{}; // value-initialized, not unitialized + mouse_event.EventType = EET_MOUSE_INPUT_EVENT; + mouse_event.MouseInput.X = m_pointer.X; + mouse_event.MouseInput.Y = m_pointer.Y; + switch (touch_event) { + case ETIE_PRESSED_DOWN: + mouse_event.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN; + mouse_event.MouseInput.ButtonStates = EMBSM_LEFT; + break; + case ETIE_MOVED: + mouse_event.MouseInput.Event = EMIE_MOUSE_MOVED; + mouse_event.MouseInput.ButtonStates = EMBSM_LEFT; + break; + case ETIE_LEFT_UP: + mouse_event.MouseInput.Event = EMIE_LMOUSE_LEFT_UP; + mouse_event.MouseInput.ButtonStates = 0; + break; + default: + return false; + } + if (preprocessEvent(mouse_event)) + return true; + if (!target) + return false; + return target->OnEvent(mouse_event); +} + +void GUIModalMenu::enter(gui::IGUIElement *hovered) +{ + if (!hovered) + return; + sanity_check(!m_hovered); + m_hovered.grab(hovered); + SEvent gui_event{}; + gui_event.EventType = EET_GUI_EVENT; + gui_event.GUIEvent.Caller = m_hovered.get(); + gui_event.GUIEvent.EventType = EGET_ELEMENT_HOVERED; + gui_event.GUIEvent.Element = gui_event.GUIEvent.Caller; + m_hovered->OnEvent(gui_event); +} + +void GUIModalMenu::leave() +{ + if (!m_hovered) + return; + SEvent gui_event{}; + gui_event.EventType = EET_GUI_EVENT; + gui_event.GUIEvent.Caller = m_hovered.get(); + gui_event.GUIEvent.EventType = EGET_ELEMENT_LEFT; + m_hovered->OnEvent(gui_event); + m_hovered.reset(); +} + +#endif + bool GUIModalMenu::preprocessEvent(const SEvent &event) { #ifdef __ANDROID__ @@ -204,13 +255,6 @@ bool GUIModalMenu::preprocessEvent(const SEvent &event) return retval; m_jni_field_name = field_name; - /*~ Imperative, as in "Enter/type in text". - Don't forget the space. */ - std::string message = gettext("Enter "); - std::string label = wide_to_utf8(getLabelByID(hovered->getID())); - if (label.empty()) - label = "text"; - message += gettext(label) + ":"; // single line text input int type = 2; @@ -228,91 +272,54 @@ bool GUIModalMenu::preprocessEvent(const SEvent &event) return retval; } } +#endif +#ifdef HAVE_TOUCHSCREENGUI if (event.EventType == EET_TOUCH_INPUT_EVENT) { - SEvent translated; - memset(&translated, 0, sizeof(SEvent)); - translated.EventType = EET_MOUSE_INPUT_EVENT; - gui::IGUIElement *root = Environment->getRootGUIElement(); + irr_ptr<GUIModalMenu> holder; + holder.grab(this); // keep this alive until return (it might be dropped downstream [?]) - if (!root) { - errorstream << "GUIModalMenu::preprocessEvent" - << " unable to get root element" << std::endl; - return false; - } - gui::IGUIElement *hovered = - root->getElementFromPoint(core::position2d<s32>( - event.TouchInput.X, event.TouchInput.Y)); - - translated.MouseInput.X = event.TouchInput.X; - translated.MouseInput.Y = event.TouchInput.Y; - translated.MouseInput.Control = false; - - if (event.TouchInput.touchedCount == 1) { - switch (event.TouchInput.Event) { - case ETIE_PRESSED_DOWN: + switch ((int)event.TouchInput.touchedCount) { + case 1: { + if (event.TouchInput.Event == ETIE_PRESSED_DOWN || event.TouchInput.Event == ETIE_MOVED) m_pointer = v2s32(event.TouchInput.X, event.TouchInput.Y); - translated.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN; - translated.MouseInput.ButtonStates = EMBSM_LEFT; + if (event.TouchInput.Event == ETIE_PRESSED_DOWN) m_down_pos = m_pointer; - break; - case ETIE_MOVED: - m_pointer = v2s32(event.TouchInput.X, event.TouchInput.Y); - translated.MouseInput.Event = EMIE_MOUSE_MOVED; - translated.MouseInput.ButtonStates = EMBSM_LEFT; - break; - case ETIE_LEFT_UP: - translated.MouseInput.Event = EMIE_LMOUSE_LEFT_UP; - translated.MouseInput.ButtonStates = 0; - hovered = root->getElementFromPoint(m_down_pos); - // we don't have a valid pointer element use last - // known pointer pos - translated.MouseInput.X = m_pointer.X; - translated.MouseInput.Y = m_pointer.Y; - - // reset down pos - m_down_pos = v2s32(0, 0); - break; - default: - break; + gui::IGUIElement *hovered = Environment->getRootGUIElement()->getElementFromPoint(core::position2d<s32>(m_pointer)); + if (event.TouchInput.Event == ETIE_PRESSED_DOWN) + Environment->setFocus(hovered); + if (m_hovered != hovered) { + leave(); + enter(hovered); } - } else if ((event.TouchInput.touchedCount == 2) && - (event.TouchInput.Event == ETIE_PRESSED_DOWN)) { - hovered = root->getElementFromPoint(m_down_pos); - - translated.MouseInput.Event = EMIE_RMOUSE_PRESSED_DOWN; - translated.MouseInput.ButtonStates = EMBSM_LEFT | EMBSM_RIGHT; - translated.MouseInput.X = m_pointer.X; - translated.MouseInput.Y = m_pointer.Y; - if (hovered) - hovered->OnEvent(translated); - - translated.MouseInput.Event = EMIE_RMOUSE_LEFT_UP; - translated.MouseInput.ButtonStates = EMBSM_LEFT; - - if (hovered) - hovered->OnEvent(translated); - - return true; - } else { - // ignore unhandled 2 touch events (accidental moving for example) + gui::IGUIElement *focused = Environment->getFocus(); + bool ret = simulateMouseEvent(focused, event.TouchInput.Event); + if (!ret && m_hovered != focused) + ret = simulateMouseEvent(m_hovered.get(), event.TouchInput.Event); + if (event.TouchInput.Event == ETIE_LEFT_UP) + leave(); + return ret; + } + case 2: { + if (event.TouchInput.Event != ETIE_PRESSED_DOWN) + return true; // ignore + auto focused = Environment->getFocus(); + if (!focused) + return true; + SEvent rclick_event{}; + rclick_event.EventType = EET_MOUSE_INPUT_EVENT; + rclick_event.MouseInput.Event = EMIE_RMOUSE_PRESSED_DOWN; + rclick_event.MouseInput.ButtonStates = EMBSM_LEFT | EMBSM_RIGHT; + rclick_event.MouseInput.X = m_pointer.X; + rclick_event.MouseInput.Y = m_pointer.Y; + focused->OnEvent(rclick_event); + rclick_event.MouseInput.Event = EMIE_RMOUSE_LEFT_UP; + rclick_event.MouseInput.ButtonStates = EMBSM_LEFT; + focused->OnEvent(rclick_event); return true; } - - // check if translated event needs to be preprocessed again - if (preprocessEvent(translated)) + default: // ignored return true; - - if (hovered) { - grab(); - bool retval = hovered->OnEvent(translated); - - if (event.TouchInput.Event == ETIE_LEFT_UP) - // reset pointer - m_pointer = v2s32(0, 0); - - drop(); - return retval; } } #endif diff --git a/src/gui/modalMenu.h b/src/gui/modalMenu.h index 1cb687f82..e37c41533 100644 --- a/src/gui/modalMenu.h +++ b/src/gui/modalMenu.h @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include "irrlichttypes_extrabloated.h" +#include "irr_ptr.h" #include "util/string.h" class GUIModalMenu; @@ -46,7 +47,6 @@ public: bool canTakeFocus(gui::IGUIElement *e); void draw(); void quitMenu(); - void removeChildren(); virtual void regenerateGui(v2u32 screensize) = 0; virtual void drawMenu() = 0; @@ -74,10 +74,10 @@ protected: v2u32 m_screensize_old; float m_gui_scale; #ifdef __ANDROID__ - v2s32 m_down_pos; std::string m_jni_field_name; #endif #ifdef HAVE_TOUCHSCREENGUI + v2s32 m_down_pos; bool m_touchscreen_visible = true; #endif @@ -100,4 +100,12 @@ private: // This might be necessary to expose to the implementation if it // wants to launch other menus bool m_allow_focus_removal = false; + +#ifdef HAVE_TOUCHSCREENGUI + irr_ptr<gui::IGUIElement> m_hovered; + + bool simulateMouseEvent(gui::IGUIElement *target, ETOUCH_INPUT_EVENT touch_event); + void enter(gui::IGUIElement *element); + void leave(); +#endif }; diff --git a/src/gui/profilergraph.cpp b/src/gui/profilergraph.cpp index b29285e2f..f71ef3799 100644 --- a/src/gui/profilergraph.cpp +++ b/src/gui/profilergraph.cpp @@ -94,20 +94,29 @@ void ProfilerGraph::draw(s32 x_left, s32 y_bottom, video::IVideoDriver *driver, show_min = 0; } - s32 texth = 15; + const s32 texth = 15; char buf[10]; - porting::mt_snprintf(buf, sizeof(buf), "%.3g", show_max); + if (floorf(show_max) == show_max) + porting::mt_snprintf(buf, sizeof(buf), "%.5g", show_max); + else + porting::mt_snprintf(buf, sizeof(buf), "%.3g", show_max); font->draw(utf8_to_wide(buf).c_str(), core::rect<s32>(textx, y - graphh, textx2, y - graphh + texth), meta.color); - porting::mt_snprintf(buf, sizeof(buf), "%.3g", show_min); + + if (floorf(show_min) == show_min) + porting::mt_snprintf(buf, sizeof(buf), "%.5g", show_min); + else + porting::mt_snprintf(buf, sizeof(buf), "%.3g", show_min); font->draw(utf8_to_wide(buf).c_str(), core::rect<s32>(textx, y - texth, textx2, y), meta.color); + font->draw(utf8_to_wide(id).c_str(), core::rect<s32>(textx, y - graphh / 2 - texth / 2, textx2, y - graphh / 2 + texth / 2), meta.color); + s32 graph1y = y; s32 graph1h = graphh; bool relativegraph = (show_min != 0 && show_min != show_max); diff --git a/src/gui/touchscreengui.cpp b/src/gui/touchscreengui.cpp index 0d64aa618..d483c136e 100644 --- a/src/gui/touchscreengui.cpp +++ b/src/gui/touchscreengui.cpp @@ -28,19 +28,18 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" #include "porting.h" #include "client/guiscalingfilter.h" +#include "client/renderingengine.h" #include <iostream> #include <algorithm> -#include <ISceneCollisionManager.h> - using namespace irr::core; const char **button_imagenames = (const char *[]) { "jump_btn.png", "down.png", "zoom.png", - "aux_btn.png" + "aux1_btn.png" }; const char **joystick_imagenames = (const char *[]) { @@ -80,8 +79,8 @@ static irr::EKEY_CODE id2keycode(touch_gui_button_id id) case zoom_id: key = "zoom"; break; - case special1_id: - key = "special1"; + case aux1_id: + key = "aux1"; break; case fly_id: key = "freemove"; @@ -425,10 +424,10 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver *receiver) m_touchscreen_threshold = g_settings->getU16("touchscreen_threshold"); m_fixed_joystick = g_settings->getBool("fixed_virtual_joystick"); - m_joystick_triggers_special1 = g_settings->getBool("virtual_joystick_triggers_aux"); + m_joystick_triggers_aux1 = g_settings->getBool("virtual_joystick_triggers_aux1"); m_screensize = m_device->getVideoDriver()->getScreenSize(); button_size = MYMIN(m_screensize.Y / 4.5f, - porting::getDisplayDensity() * + RenderingEngine::getDisplayDensity() * g_settings->getFloat("hud_scaling") * 65.0f); } @@ -521,9 +520,9 @@ void TouchScreenGUI::init(ISimpleTextureSource *tsrc) m_screensize.Y - (3 * button_size)), L"z", false); - // init special1/aux button - if (!m_joystick_triggers_special1) - initButton(special1_id, + // init aux1 button + if (!m_joystick_triggers_aux1) + initButton(aux1_id, rect<s32>(m_screensize.X - (1.25 * button_size), m_screensize.Y - (2.5 * button_size), m_screensize.X - (0.25 * button_size), @@ -670,9 +669,9 @@ void TouchScreenGUI::handleReleaseEvent(size_t evt_id) if (button != after_last_element_id) { // handle button events handleButtonEvent(button, evt_id, false); - } else if (evt_id == m_move_id) { + } else if (m_has_move_id && evt_id == m_move_id) { // handle the point used for moving view - m_move_id = -1; + m_has_move_id = false; // if this pointer issued a mouse event issue symmetric release here if (m_move_sent_as_mouse_event) { @@ -694,8 +693,8 @@ void TouchScreenGUI::handleReleaseEvent(size_t evt_id) } // handle joystick - else if (evt_id == m_joystick_id) { - m_joystick_id = -1; + else if (m_has_joystick_id && evt_id == m_joystick_id) { + m_has_joystick_id = false; // reset joystick for (unsigned int i = 0; i < 4; i++) @@ -778,7 +777,8 @@ void TouchScreenGUI::translateEvent(const SEvent &event) if ((m_fixed_joystick && dxj * dxj + dyj * dyj <= button_size * button_size * 1.5 * 1.5) || (!m_fixed_joystick && event.TouchInput.X < m_screensize.X / 3.0f)) { // If we don't already have a starting point for joystick make this the one. - if (m_joystick_id == -1) { + if (!m_has_joystick_id) { + m_has_joystick_id = true; m_joystick_id = event.TouchInput.ID; m_joystick_has_really_moved = false; @@ -798,7 +798,8 @@ void TouchScreenGUI::translateEvent(const SEvent &event) } } else { // If we don't already have a moving point make this the moving one. - if (m_move_id == -1) { + if (!m_has_move_id) { + m_has_move_id = true; m_move_id = event.TouchInput.ID; m_move_has_really_moved = false; m_move_downtime = porting::getTimeMs(); @@ -821,7 +822,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) v2s32(event.TouchInput.X, event.TouchInput.Y)) return; - if (m_move_id != -1) { + if (m_has_move_id) { if ((event.TouchInput.ID == m_move_id) && (!m_move_sent_as_mouse_event)) { @@ -842,7 +843,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) s32 dy = Y - m_pointerpos[event.TouchInput.ID].Y; // adapt to similar behaviour as pc screen - double d = g_settings->getFloat("mouse_sensitivity") * 3.0f; + const double d = g_settings->getFloat("mouse_sensitivity", 0.001f, 10.0f) * 3.0f; m_camera_yaw_change -= dx * d; m_camera_pitch = MYMIN(MYMAX(m_camera_pitch + (dy * d), -180), 180); @@ -864,7 +865,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) } } - if (m_joystick_id != -1 && event.TouchInput.ID == m_joystick_id) { + if (m_has_joystick_id && event.TouchInput.ID == m_joystick_id) { s32 X = event.TouchInput.X; s32 Y = event.TouchInput.Y; @@ -881,8 +882,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) s32 dyj = event.TouchInput.Y - m_screensize.Y + button_size * 5.0f / 2.0f; bool inside_joystick = (dxj * dxj + dyj * dyj <= button_size * button_size * 1.5 * 1.5); - if (m_joystick_has_really_moved || - (!m_joystick_has_really_moved && inside_joystick) || + if (m_joystick_has_really_moved || inside_joystick || (!m_fixed_joystick && distance_sq > m_touchscreen_threshold * m_touchscreen_threshold)) { m_joystick_has_really_moved = true; @@ -924,7 +924,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) } if (distance > button_size) { - m_joystick_status[j_special1] = true; + m_joystick_status[j_aux1] = true; // move joystick "button" s32 ndx = button_size * dx / distance - button_size / 2.0f; s32 ndy = button_size * dy / distance - button_size / 2.0f; @@ -944,7 +944,7 @@ void TouchScreenGUI::translateEvent(const SEvent &event) } } - if (m_move_id == -1 && m_joystick_id == -1) + if (!m_has_move_id && !m_has_joystick_id) handleChangedButton(event); } } @@ -1040,7 +1040,7 @@ bool TouchScreenGUI::doubleTapDetection() void TouchScreenGUI::applyJoystickStatus() { for (unsigned int i = 0; i < 5; i++) { - if (i == 4 && !m_joystick_triggers_special1) + if (i == 4 && !m_joystick_triggers_aux1) continue; SEvent translated{}; @@ -1089,7 +1089,7 @@ void TouchScreenGUI::step(float dtime) button.repeatcounter += dtime; // in case we're moving around digging does not happen - if (m_move_id != -1) + if (m_has_move_id) m_move_has_really_moved = true; if (button.repeatcounter < button.repeatdelay) @@ -1117,7 +1117,7 @@ void TouchScreenGUI::step(float dtime) } // if a new placed pointer isn't moved for some time start digging - if ((m_move_id != -1) && + if (m_has_move_id && (!m_move_has_really_moved) && (!m_move_sent_as_mouse_event)) { diff --git a/src/gui/touchscreengui.h b/src/gui/touchscreengui.h index 761d33207..6b36c0d59 100644 --- a/src/gui/touchscreengui.h +++ b/src/gui/touchscreengui.h @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once +#include "irrlichttypes.h" #include <IEventReceiver.h> #include <IGUIButton.h> #include <IGUIEnvironment.h> @@ -38,7 +39,7 @@ typedef enum jump_id = 0, crunch_id, zoom_id, - special1_id, + aux1_id, after_last_element_id, settings_starter_id, rare_controls_starter_id, @@ -68,7 +69,7 @@ typedef enum j_backward, j_left, j_right, - j_special1 + j_aux1 } touch_gui_joystick_move_id; typedef enum @@ -216,7 +217,7 @@ private: // forward, backward, left, right touch_gui_button_id m_joystick_names[5] = { - forward_id, backward_id, left_id, right_id, special1_id}; + forward_id, backward_id, left_id, right_id, aux1_id}; bool m_joystick_status[5] = {false, false, false, false, false}; /* @@ -227,16 +228,18 @@ private: */ line3d<f32> m_shootline; - int m_move_id = -1; + bool m_has_move_id = false; + size_t m_move_id; bool m_move_has_really_moved = false; u64 m_move_downtime = 0; bool m_move_sent_as_mouse_event = false; v2s32 m_move_downlocation = v2s32(-10000, -10000); - int m_joystick_id = -1; + bool m_has_joystick_id = false; + size_t m_joystick_id; bool m_joystick_has_really_moved = false; bool m_fixed_joystick = false; - bool m_joystick_triggers_special1 = false; + bool m_joystick_triggers_aux1 = false; button_info *m_joystick_btn_off = nullptr; button_info *m_joystick_btn_bg = nullptr; button_info *m_joystick_btn_center = nullptr; diff --git a/src/httpfetch.cpp b/src/httpfetch.cpp index 65202ce3e..16f0791c9 100644 --- a/src/httpfetch.cpp +++ b/src/httpfetch.cpp @@ -22,7 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <iostream> #include <sstream> #include <list> -#include <map> +#include <unordered_map> #include <cerrno> #include <mutex> #include "network/socket.h" // for select() @@ -37,13 +37,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "noise.h" -std::mutex g_httpfetch_mutex; -std::map<unsigned long, std::queue<HTTPFetchResult> > g_httpfetch_results; -PcgRandom g_callerid_randomness; +static std::mutex g_httpfetch_mutex; +static std::unordered_map<u64, std::queue<HTTPFetchResult>> + g_httpfetch_results; +static PcgRandom g_callerid_randomness; HTTPFetchRequest::HTTPFetchRequest() : timeout(g_settings->getS32("curl_timeout")), - connect_timeout(timeout), + connect_timeout(10 * 1000), useragent(std::string(PROJECT_NAME_C "/") + g_version_hash + " (" + porting::get_sysinfo() + ")") { } @@ -51,24 +52,22 @@ HTTPFetchRequest::HTTPFetchRequest() : static void httpfetch_deliver_result(const HTTPFetchResult &fetch_result) { - unsigned long caller = fetch_result.caller; + u64 caller = fetch_result.caller; if (caller != HTTPFETCH_DISCARD) { MutexAutoLock lock(g_httpfetch_mutex); - g_httpfetch_results[caller].push(fetch_result); + g_httpfetch_results[caller].emplace(fetch_result); } } -static void httpfetch_request_clear(unsigned long caller); +static void httpfetch_request_clear(u64 caller); -unsigned long httpfetch_caller_alloc() +u64 httpfetch_caller_alloc() { MutexAutoLock lock(g_httpfetch_mutex); - // Check each caller ID except HTTPFETCH_DISCARD - const unsigned long discard = HTTPFETCH_DISCARD; - for (unsigned long caller = discard + 1; caller != discard; ++caller) { - std::map<unsigned long, std::queue<HTTPFetchResult> >::iterator - it = g_httpfetch_results.find(caller); + // Check each caller ID except reserved ones + for (u64 caller = HTTPFETCH_CID_START; caller != 0; ++caller) { + auto it = g_httpfetch_results.find(caller); if (it == g_httpfetch_results.end()) { verbosestream << "httpfetch_caller_alloc: allocating " << caller << std::endl; @@ -79,18 +78,17 @@ unsigned long httpfetch_caller_alloc() } FATAL_ERROR("httpfetch_caller_alloc: ran out of caller IDs"); - return discard; } -unsigned long httpfetch_caller_alloc_secure() +u64 httpfetch_caller_alloc_secure() { MutexAutoLock lock(g_httpfetch_mutex); // Generate random caller IDs and make sure they're not - // already used or equal to HTTPFETCH_DISCARD + // already used or reserved. // Give up after 100 tries to prevent infinite loop - u8 tries = 100; - unsigned long caller; + size_t tries = 100; + u64 caller; do { caller = (((u64) g_callerid_randomness.next()) << 32) | @@ -100,7 +98,8 @@ unsigned long httpfetch_caller_alloc_secure() FATAL_ERROR("httpfetch_caller_alloc_secure: ran out of caller IDs"); return HTTPFETCH_DISCARD; } - } while (g_httpfetch_results.find(caller) != g_httpfetch_results.end()); + } while (caller >= HTTPFETCH_CID_START && + g_httpfetch_results.find(caller) != g_httpfetch_results.end()); verbosestream << "httpfetch_caller_alloc_secure: allocating " << caller << std::endl; @@ -110,7 +109,7 @@ unsigned long httpfetch_caller_alloc_secure() return caller; } -void httpfetch_caller_free(unsigned long caller) +void httpfetch_caller_free(u64 caller) { verbosestream<<"httpfetch_caller_free: freeing " <<caller<<std::endl; @@ -122,13 +121,12 @@ void httpfetch_caller_free(unsigned long caller) } } -bool httpfetch_async_get(unsigned long caller, HTTPFetchResult &fetch_result) +bool httpfetch_async_get(u64 caller, HTTPFetchResult &fetch_result) { MutexAutoLock lock(g_httpfetch_mutex); // Check that caller exists - std::map<unsigned long, std::queue<HTTPFetchResult> >::iterator - it = g_httpfetch_results.find(caller); + auto it = g_httpfetch_results.find(caller); if (it == g_httpfetch_results.end()) return false; @@ -138,7 +136,7 @@ bool httpfetch_async_get(unsigned long caller, HTTPFetchResult &fetch_result) return false; // Pop first result - fetch_result = caller_results.front(); + fetch_result = std::move(caller_results.front()); caller_results.pop(); return true; } @@ -243,7 +241,6 @@ HTTPFetchOngoing::HTTPFetchOngoing(const HTTPFetchRequest &request_, // Set static cURL options curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 3); curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip"); @@ -394,10 +391,17 @@ const HTTPFetchResult * HTTPFetchOngoing::complete(CURLcode res) } if (res != CURLE_OK) { - errorstream << request.url << " not found (" - << curl_easy_strerror(res) << ")" - << " (response code " << result.response_code << ")" + errorstream << "HTTPFetch for " << request.url << " failed (" + << curl_easy_strerror(res) << ")" << std::endl; + } else if (result.response_code >= 400) { + errorstream << "HTTPFetch for " << request.url + << " returned response code " << result.response_code << std::endl; + if (result.caller == HTTPFETCH_PRINT_ERR && !result.data.empty()) { + errorstream << "Response body:" << std::endl; + safe_print_string(errorstream, result.data); + errorstream << std::endl; + } } return &result; @@ -475,7 +479,7 @@ public: m_requests.push_back(req); } - void requestClear(unsigned long caller, Event *event) + void requestClear(u64 caller, Event *event) { Request req; req.type = RT_CLEAR; @@ -506,7 +510,7 @@ protected: } else if (req.type == RT_CLEAR) { - unsigned long caller = req.fetch_request.caller; + u64 caller = req.fetch_request.caller; // Abort all ongoing fetches for the caller for (std::vector<HTTPFetchOngoing*>::iterator @@ -762,10 +766,12 @@ void httpfetch_cleanup() { verbosestream<<"httpfetch_cleanup: cleaning up"<<std::endl; - g_httpfetch_thread->stop(); - g_httpfetch_thread->requestWakeUp(); - g_httpfetch_thread->wait(); - delete g_httpfetch_thread; + if (g_httpfetch_thread) { + g_httpfetch_thread->stop(); + g_httpfetch_thread->requestWakeUp(); + g_httpfetch_thread->wait(); + delete g_httpfetch_thread; + } curl_global_cleanup(); } @@ -777,7 +783,7 @@ void httpfetch_async(const HTTPFetchRequest &fetch_request) g_httpfetch_thread->start(); } -static void httpfetch_request_clear(unsigned long caller) +static void httpfetch_request_clear(u64 caller) { if (g_httpfetch_thread->isRunning()) { Event event; @@ -826,7 +832,7 @@ void httpfetch_async(const HTTPFetchRequest &fetch_request) httpfetch_deliver_result(fetch_result); } -static void httpfetch_request_clear(unsigned long caller) +static void httpfetch_request_clear(u64 caller) { } diff --git a/src/httpfetch.h b/src/httpfetch.h index 3b9f17f0a..a4901e63b 100644 --- a/src/httpfetch.h +++ b/src/httpfetch.h @@ -23,10 +23,17 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "config.h" -// Can be used in place of "caller" in asynchronous transfers to discard result -// (used as default value of "caller") +// These can be used in place of "caller" in to specify special handling. +// Discard result (used as default value of "caller"). #define HTTPFETCH_DISCARD 0 +// Indicates that the result should not be discarded when performing a +// synchronous request (since a real caller ID is not needed for synchronous +// requests because the result does not have to be retrieved later). #define HTTPFETCH_SYNC 1 +// Print response body to console if the server returns an error code. +#define HTTPFETCH_PRINT_ERR 2 +// Start of regular allocated caller IDs. +#define HTTPFETCH_CID_START 3 // Methods enum HttpMethod : u8 @@ -43,11 +50,11 @@ struct HTTPFetchRequest // Identifies the caller (for asynchronous requests) // Ignored by httpfetch_sync - unsigned long caller = HTTPFETCH_DISCARD; + u64 caller = HTTPFETCH_DISCARD; // Some number that identifies the request // (when the same caller issues multiple httpfetch_async calls) - unsigned long request_id = 0; + u64 request_id = 0; // Timeout for the whole transfer, in milliseconds long timeout; @@ -85,8 +92,8 @@ struct HTTPFetchResult long response_code = 0; std::string data = ""; // The caller and request_id from the corresponding HTTPFetchRequest. - unsigned long caller = HTTPFETCH_DISCARD; - unsigned long request_id = 0; + u64 caller = HTTPFETCH_DISCARD; + u64 request_id = 0; HTTPFetchResult() = default; @@ -107,19 +114,19 @@ void httpfetch_async(const HTTPFetchRequest &fetch_request); // If any fetch for the given caller ID is complete, removes it from the // result queue, sets the fetch result and returns true. Otherwise returns false. -bool httpfetch_async_get(unsigned long caller, HTTPFetchResult &fetch_result); +bool httpfetch_async_get(u64 caller, HTTPFetchResult &fetch_result); // Allocates a caller ID for httpfetch_async // Not required if you want to set caller = HTTPFETCH_DISCARD -unsigned long httpfetch_caller_alloc(); +u64 httpfetch_caller_alloc(); // Allocates a non-predictable caller ID for httpfetch_async -unsigned long httpfetch_caller_alloc_secure(); +u64 httpfetch_caller_alloc_secure(); // Frees a caller ID allocated with httpfetch_caller_alloc // Note: This can be expensive, because the httpfetch thread is told // to stop any ongoing fetches for the given caller. -void httpfetch_caller_free(unsigned long caller); +void httpfetch_caller_free(u64 caller); // Performs a synchronous HTTP request. This blocks and therefore should // only be used from background threads. diff --git a/src/hud.cpp b/src/hud.cpp index 175701342..841c90758 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -29,6 +29,7 @@ const struct EnumString es_HudElementType[] = {HUD_ELEM_WAYPOINT, "waypoint"}, {HUD_ELEM_IMAGE_WAYPOINT, "image_waypoint"}, {HUD_ELEM_COMPASS, "compass"}, + {HUD_ELEM_MINIMAP, "minimap"}, {0, NULL}, }; @@ -49,6 +50,7 @@ const struct EnumString es_HudElementStat[] = {HUD_STAT_SIZE, "size"}, {HUD_STAT_Z_INDEX, "z_index"}, {HUD_STAT_TEXT2, "text2"}, + {HUD_STAT_STYLE, "style"}, {0, NULL}, }; @@ -61,5 +63,6 @@ const struct EnumString es_HudBuiltinElement[] = {HUD_FLAG_BREATHBAR_VISIBLE, "breathbar"}, {HUD_FLAG_MINIMAP_VISIBLE, "minimap"}, {HUD_FLAG_MINIMAP_RADAR_VISIBLE, "minimap_radar"}, + {HUD_FLAG_BASIC_DEBUG, "basic_debug"}, {0, NULL}, }; diff --git a/src/hud.h b/src/hud.h index 0a6993c1b..173633fcc 100644 --- a/src/hud.h +++ b/src/hud.h @@ -33,6 +33,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #define HUD_CORNER_LOWER 1 #define HUD_CORNER_CENTER 2 +#define HUD_STYLE_BOLD 1 +#define HUD_STYLE_ITALIC 2 +#define HUD_STYLE_MONO 4 + // Note that these visibility flags do not determine if the hud items are // actually drawn, but rather, whether to draw the item should the rest // of the game state permit it. @@ -43,6 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define HUD_FLAG_BREATHBAR_VISIBLE (1 << 4) #define HUD_FLAG_MINIMAP_VISIBLE (1 << 5) #define HUD_FLAG_MINIMAP_RADAR_VISIBLE (1 << 6) +#define HUD_FLAG_BASIC_DEBUG (1 << 7) #define HUD_PARAM_HOTBAR_ITEMCOUNT 1 #define HUD_PARAM_HOTBAR_IMAGE 2 @@ -51,7 +56,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #define HUD_HOTBAR_ITEMCOUNT_DEFAULT 8 #define HUD_HOTBAR_ITEMCOUNT_MAX 32 - #define HOTBAR_IMAGE_SIZE 48 enum HudElementType { @@ -61,7 +65,8 @@ enum HudElementType { HUD_ELEM_INVENTORY = 3, HUD_ELEM_WAYPOINT = 4, HUD_ELEM_IMAGE_WAYPOINT = 5, - HUD_ELEM_COMPASS = 6 + HUD_ELEM_COMPASS = 6, + HUD_ELEM_MINIMAP = 7 }; enum HudElementStat { @@ -78,6 +83,7 @@ enum HudElementStat { HUD_STAT_SIZE, HUD_STAT_Z_INDEX, HUD_STAT_TEXT2, + HUD_STAT_STYLE, }; enum HudCompassDir { @@ -102,9 +108,19 @@ struct HudElement { v2s32 size; s16 z_index = 0; std::string text2; + u32 style; }; extern const EnumString es_HudElementType[]; extern const EnumString es_HudElementStat[]; extern const EnumString es_HudBuiltinElement[]; +// Minimap stuff + +enum MinimapType { + MINIMAP_TYPE_OFF, + MINIMAP_TYPE_SURFACE, + MINIMAP_TYPE_RADAR, + MINIMAP_TYPE_TEXTURE, +}; + diff --git a/src/inventory.cpp b/src/inventory.cpp index cf72cb005..6d2b7fba3 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -258,6 +258,20 @@ std::string ItemStack::getDescription(IItemDefManager *itemdef) const return desc.empty() ? name : desc; } +std::string ItemStack::getShortDescription(IItemDefManager *itemdef) const +{ + std::string desc = metadata.getString("short_description"); + if (desc.empty()) + desc = getDefinition(itemdef).short_description; + if (!desc.empty()) + return desc; + // no short_description because of old server version or modified builtin + // return first line of description + std::stringstream sstr(getDescription(itemdef)); + std::getline(sstr, desc, '\n'); + return desc; +} + ItemStack ItemStack::addItem(ItemStack newitem, IItemDefManager *itemdef) { @@ -446,7 +460,6 @@ void InventoryList::deSerialize(std::istream &is) std::getline(is, line, '\n'); std::istringstream iss(line); - //iss.imbue(std::locale("C")); std::string name; std::getline(iss, name, ' '); @@ -490,11 +503,6 @@ void InventoryList::deSerialize(std::istream &is) throw SerializationError(ss.str()); } -InventoryList::InventoryList(const InventoryList &other) -{ - *this = other; -} - InventoryList & InventoryList::operator = (const InventoryList &other) { m_items = other.m_items; @@ -522,21 +530,6 @@ bool InventoryList::operator == (const InventoryList &other) const return true; } -const std::string &InventoryList::getName() const -{ - return m_name; -} - -u32 InventoryList::getSize() const -{ - return m_items.size(); -} - -u32 InventoryList::getWidth() const -{ - return m_width; -} - u32 InventoryList::getUsedSlots() const { u32 num = 0; @@ -547,23 +540,6 @@ u32 InventoryList::getUsedSlots() const return num; } -u32 InventoryList::getFreeSlots() const -{ - return getSize() - getUsedSlots(); -} - -const ItemStack& InventoryList::getItem(u32 i) const -{ - assert(i < m_size); // Pre-condition - return m_items[i]; -} - -ItemStack& InventoryList::getItem(u32 i) -{ - assert(i < m_size); // Pre-condition - return m_items[i]; -} - ItemStack InventoryList::changeItem(u32 i, const ItemStack &newitem) { if(i >= m_items.size()) @@ -924,19 +900,16 @@ void Inventory::deSerialize(std::istream &is) InventoryList * Inventory::addList(const std::string &name, u32 size) { setModified(); + + // Remove existing lists s32 i = getListIndex(name); - if(i != -1) - { - if(m_lists[i]->getSize() != size) - { - delete m_lists[i]; - m_lists[i] = new InventoryList(name, size, m_itemdef); - m_lists[i]->setModified(); - } + if (i != -1) { + delete m_lists[i]; + m_lists[i] = new InventoryList(name, size, m_itemdef); + m_lists[i]->setModified(); return m_lists[i]; } - //don't create list with invalid name if (name.find(' ') != std::string::npos) return nullptr; @@ -951,19 +924,10 @@ InventoryList * Inventory::getList(const std::string &name) { s32 i = getListIndex(name); if(i == -1) - return NULL; + return nullptr; return m_lists[i]; } -std::vector<const InventoryList*> Inventory::getLists() -{ - std::vector<const InventoryList*> lists; - for (auto list : m_lists) { - lists.push_back(list); - } - return lists; -} - bool Inventory::deleteList(const std::string &name) { s32 i = getListIndex(name); @@ -976,15 +940,15 @@ bool Inventory::deleteList(const std::string &name) return true; } -const InventoryList * Inventory::getList(const std::string &name) const +const InventoryList *Inventory::getList(const std::string &name) const { s32 i = getListIndex(name); if(i == -1) - return NULL; + return nullptr; return m_lists[i]; } -const s32 Inventory::getListIndex(const std::string &name) const +s32 Inventory::getListIndex(const std::string &name) const { for(u32 i=0; i<m_lists.size(); i++) { diff --git a/src/inventory.h b/src/inventory.h index 67a7859ed..8b31de3a8 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -49,6 +49,7 @@ struct ItemStack std::string getItemString(bool include_meta = true) const; // Returns the tooltip std::string getDescription(IItemDefManager *itemdef) const; + std::string getShortDescription(IItemDefManager *itemdef) const; /* Quantity methods @@ -197,7 +198,7 @@ public: void serialize(std::ostream &os, bool incremental) const; void deSerialize(std::istream &is); - InventoryList(const InventoryList &other); + InventoryList(const InventoryList &other) { *this = other; } InventoryList & operator = (const InventoryList &other); bool operator == (const InventoryList &other) const; bool operator != (const InventoryList &other) const @@ -205,16 +206,25 @@ public: return !(*this == other); } - const std::string &getName() const; - u32 getSize() const; - u32 getWidth() const; + const std::string &getName() const { return m_name; } + u32 getSize() const { return static_cast<u32>(m_items.size()); } + u32 getWidth() const { return m_width; } // Count used slots u32 getUsedSlots() const; - u32 getFreeSlots() const; // Get reference to item - const ItemStack& getItem(u32 i) const; - ItemStack& getItem(u32 i); + const ItemStack &getItem(u32 i) const + { + assert(i < m_size); // Pre-condition + return m_items[i]; + } + ItemStack &getItem(u32 i) + { + assert(i < m_size); // Pre-condition + return m_items[i]; + } + // Get reference to all items + const std::vector<ItemStack> &getItems() const { return m_items; } // Returns old item. Parameter can be an empty item. ItemStack changeItem(u32 i, const ItemStack &newitem); // Delete item @@ -271,7 +281,7 @@ public: private: std::vector<ItemStack> m_items; std::string m_name; - u32 m_size; + u32 m_size; // always the same as m_items.size() u32 m_width = 0; IItemDefManager *m_itemdef; bool m_dirty = true; @@ -297,10 +307,11 @@ public: void serialize(std::ostream &os, bool incremental = false) const; void deSerialize(std::istream &is); + // Creates a new list if none exists or truncates existing lists InventoryList * addList(const std::string &name, u32 size); InventoryList * getList(const std::string &name); const InventoryList * getList(const std::string &name) const; - std::vector<const InventoryList*> getLists(); + const std::vector<InventoryList *> &getLists() const { return m_lists; } bool deleteList(const std::string &name); // A shorthand for adding items. Returns leftover item (possibly empty). ItemStack addItem(const std::string &listname, const ItemStack &newitem) @@ -334,7 +345,7 @@ public: } private: // -1 if not found - const s32 getListIndex(const std::string &name) const; + s32 getListIndex(const std::string &name) const; std::vector<InventoryList*> m_lists; IItemDefManager *m_itemdef; diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index 635bd2e4b..ecdb56a97 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -172,7 +172,7 @@ void IMoveAction::onPutAndOnTake(const ItemStack &src_item, ServerActiveObject * sa->player_inventory_OnPut(*this, src_item, player); else assert(false); - + if (from_inv.type == InventoryLocation::DETACHED) sa->detached_inventory_OnTake(*this, src_item, player); else if (from_inv.type == InventoryLocation::NODEMETA) @@ -273,7 +273,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame } if (!list_to) { infostream << "IMoveAction::apply(): FAIL: destination list not found: " - << "to_inv=\""<<to_inv.dump() << "\"" + << "to_inv=\"" << to_inv.dump() << "\"" << ", to_list=\"" << to_list << "\"" << std::endl; return; } @@ -301,6 +301,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame if (!list_to->getItem(dest_i).empty()) { to_i = dest_i; apply(mgr, player, gamedef); + assert(move_count <= count); count -= move_count; } } @@ -321,12 +322,20 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame return; } - if ((u16)to_i > list_to->getSize()) { - infostream << "IMoveAction::apply(): FAIL: destination index out of bounds: " - << "to_i=" << to_i - << ", size=" << list_to->getSize() << std::endl; + if (from_i < 0 || list_from->getSize() <= (u32) from_i) { + infostream << "IMoveAction::apply(): FAIL: source index out of bounds: " + << "size of from_list=\"" << list_from->getSize() << "\"" + << ", from_index=\"" << from_i << "\"" << std::endl; return; } + + if (to_i < 0 || list_to->getSize() <= (u32) to_i) { + infostream << "IMoveAction::apply(): FAIL: destination index out of bounds: " + << "size of to_list=\"" << list_to->getSize() << "\"" + << ", to_index=\"" << to_i << "\"" << std::endl; + return; + } + /* Do not handle rollback if both inventories are that of the same player */ @@ -339,7 +348,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame */ ItemStack src_item = list_from->getItem(from_i); - if (count > 0) + if (count > 0 && count < src_item.count) src_item.count = count; if (src_item.empty()) return; @@ -352,10 +361,12 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame bool allow_swap = !list_to->itemFits(to_i, src_item, &restitem) && restitem.count == src_item.count && !caused_by_move_somewhere; + move_count = src_item.count - restitem.count; // Shift-click: Cannot fill this stack, proceed with next slot - if (caused_by_move_somewhere && restitem.count == src_item.count) + if (caused_by_move_somewhere && move_count == 0) { return; + } if (allow_swap) { // Swap will affect the entire stack if it can performed. @@ -384,9 +395,16 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame src_can_take_count = dst_can_put_count = 0; } else { // Take from one inventory, put into another + int src_item_count = src_item.count; + if (caused_by_move_somewhere) + // When moving somewhere: temporarily use the actual movable stack + // size to ensure correct callback execution. + src_item.count = move_count; dst_can_put_count = allowPut(src_item, player); src_can_take_count = allowTake(src_item, player); - + if (caused_by_move_somewhere) + // Reset source item count + src_item.count = src_item_count; bool swap_expected = allow_swap; allow_swap = allow_swap && (src_can_take_count == -1 || src_can_take_count >= src_item.count) @@ -416,12 +434,17 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame count = src_can_take_count; if (dst_can_put_count != -1 && count > dst_can_put_count) count = dst_can_put_count; + /* Limit according to source item count */ if (count > list_from->getItem(from_i).count) count = list_from->getItem(from_i).count; /* If no items will be moved, don't go further */ if (count == 0) { + if (caused_by_move_somewhere) + // Set move count to zero, as no items have been moved + move_count = 0; + // Undo client prediction. See 'clientApply' if (from_inv.type == InventoryLocation::PLAYER) list_from->setModified(); @@ -438,6 +461,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame <<" list=\""<<to_list<<"\"" <<" i="<<to_i <<std::endl; + return; } @@ -455,6 +479,8 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame bool did_swap = false; move_count = list_from->moveItem(from_i, list_to, to_i, count, allow_swap, &did_swap); + if (caused_by_move_somewhere) + count = old_count; assert(allow_swap == did_swap); // If source is infinite, reset it's stack @@ -503,8 +529,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame << std::endl; // If we are inside the move somewhere loop, we don't need to report - // anything if nothing happened (perhaps we don't need to report - // anything for caused_by_move_somewhere == true, but this way its safer) + // anything if nothing happened if (caused_by_move_somewhere && move_count == 0) return; @@ -558,7 +583,15 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame } mgr->setInventoryModified(from_inv); } else { + int src_item_count = src_item.count; + if (caused_by_move_somewhere) + // When moving somewhere: temporarily use the actual movable stack + // size to ensure correct callback execution. + src_item.count = move_count; onPutAndOnTake(src_item, player); + if (caused_by_move_somewhere) + // Reset source item count + src_item.count = src_item_count; if (did_swap) { // Item is now placed in source list src_item = list_from->getItem(from_i); diff --git a/src/irr_ptr.h b/src/irr_ptr.h index 5022adb9d..42b409676 100644 --- a/src/irr_ptr.h +++ b/src/irr_ptr.h @@ -27,9 +27,14 @@ with this program; if not, write to the Free Software Foundation, Inc., * It should only be used for user-managed objects, i.e. those created with * the @c new operator or @c create* functions, like: * `irr_ptr<scene::IMeshBuffer> buf{new scene::SMeshBuffer()};` + * The reference counting is *not* balanced as new objects have reference + * count set to one, and the @c irr_ptr constructor (and @c reset) assumes + * ownership of that reference. * - * It should *never* be used for engine-managed objects, including - * those created with @c addTexture and similar methods. + * It shouldn’t be used for engine-managed objects, including those created + * with @c addTexture and similar methods. Constructing @c irr_ptr directly + * from such object is a bug and may lead to a crash. Indirect construction + * is possible though; see the @c grab free function for details and use cases. */ template <class ReferenceCounted, class = typename std::enable_if<std::is_base_of<IReferenceCounted, @@ -38,16 +43,6 @@ class irr_ptr { ReferenceCounted *value = nullptr; - /** Drops stored pointer replacing it with the given one. - * @note Copy semantics: reference counter *is* increased. - */ - void grab(ReferenceCounted *object) - { - if (object) - object->grab(); - reset(object); - } - public: irr_ptr() {} @@ -71,8 +66,10 @@ public: reset(b.release()); } - /** Constructs a shared pointer out of a plain one + /** Constructs a shared pointer out of a plain one to control object lifetime. + * @param object The object, usually returned by some @c create* function. * @note Move semantics: reference counter is *not* increased. + * @warning Never wrap any @c add* function with this! */ explicit irr_ptr(ReferenceCounted *object) noexcept { reset(object); } @@ -134,4 +131,70 @@ public: value->drop(); value = object; } + + /** Drops stored pointer replacing it with the given one. + * @note Copy semantics: reference counter *is* increased. + */ + void grab(ReferenceCounted *object) noexcept + { + if (object) + object->grab(); + reset(object); + } }; + +// clang-format off +// ^ dislikes long lines + +/** Constructs a shared pointer as a *secondary* reference to an object + * + * This function is intended to make a temporary reference to an object which + * is owned elsewhere so that it is not destroyed too early. To acheive that + * it does balanced reference counting, i.e. reference count is increased + * in this function and decreased when the returned pointer is destroyed. + */ +template <class ReferenceCounted> +irr_ptr<ReferenceCounted> grab(ReferenceCounted *object) noexcept +{ + irr_ptr<ReferenceCounted> ptr; + ptr.grab(object); + return ptr; +} + +template <typename ReferenceCounted> +bool operator==(const irr_ptr<ReferenceCounted> &a, const irr_ptr<ReferenceCounted> &b) noexcept +{ + return a.get() == b.get(); +} + +template <typename ReferenceCounted> +bool operator==(const irr_ptr<ReferenceCounted> &a, const ReferenceCounted *b) noexcept +{ + return a.get() == b; +} + +template <typename ReferenceCounted> +bool operator==(const ReferenceCounted *a, const irr_ptr<ReferenceCounted> &b) noexcept +{ + return a == b.get(); +} + +template <typename ReferenceCounted> +bool operator!=(const irr_ptr<ReferenceCounted> &a, const irr_ptr<ReferenceCounted> &b) noexcept +{ + return a.get() != b.get(); +} + +template <typename ReferenceCounted> +bool operator!=(const irr_ptr<ReferenceCounted> &a, const ReferenceCounted *b) noexcept +{ + return a.get() != b; +} + +template <typename ReferenceCounted> +bool operator!=(const ReferenceCounted *a, const irr_ptr<ReferenceCounted> &b) noexcept +{ + return a != b.get(); +} + +// clang-format on diff --git a/src/irrlicht_changes/CGUITTFont.cpp b/src/irrlicht_changes/CGUITTFont.cpp index bd4e700de..53be27319 100644 --- a/src/irrlicht_changes/CGUITTFont.cpp +++ b/src/irrlicht_changes/CGUITTFont.cpp @@ -1,7 +1,7 @@ /* CGUITTFont FreeType class for Irrlicht Copyright (c) 2009-2010 John Norman - Copyright (c) 2016 Nathanaël Courant + Copyright (c) 2016 Nathanaëlle Courant This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -59,7 +59,7 @@ struct SGUITTFace : public virtual irr::IReferenceCounted // Static variables. FT_Library CGUITTFont::c_library; -core::map<io::path, SGUITTFace*> CGUITTFont::c_faces; +std::map<io::path, SGUITTFace*> CGUITTFont::c_faces; bool CGUITTFont::c_libraryLoaded = false; scene::IMesh* CGUITTFont::shared_plane_ptr_ = 0; scene::SMesh CGUITTFont::shared_plane_; @@ -103,7 +103,7 @@ video::IImage* SGUITTGlyph::createGlyphImage(const FT_Bitmap& bits, video::IVide // Load the monochrome data in. const u32 image_pitch = image->getPitch() / sizeof(u16); - u16* image_data = (u16*)image->lock(); + u16* image_data = (u16*)image->getData(); u8* glyph_data = bits.buffer; for (s32 y = 0; y < (s32)bits.rows; ++y) @@ -119,7 +119,6 @@ video::IImage* SGUITTGlyph::createGlyphImage(const FT_Bitmap& bits, video::IVide } image_data += image_pitch; } - image->unlock(); break; } @@ -133,7 +132,7 @@ video::IImage* SGUITTGlyph::createGlyphImage(const FT_Bitmap& bits, video::IVide // Load the grayscale data in. const float gray_count = static_cast<float>(bits.num_grays); const u32 image_pitch = image->getPitch() / sizeof(u32); - u32* image_data = (u32*)image->lock(); + u32* image_data = (u32*)image->getData(); u8* glyph_data = bits.buffer; for (s32 y = 0; y < (s32)bits.rows; ++y) { @@ -145,7 +144,6 @@ video::IImage* SGUITTGlyph::createGlyphImage(const FT_Bitmap& bits, video::IVide } glyph_data += bits.pitch; } - image->unlock(); break; } default: @@ -277,7 +275,8 @@ CGUITTFont* CGUITTFont::create(IrrlichtDevice *device, const io::path& filename, //! Constructor. CGUITTFont::CGUITTFont(IGUIEnvironment *env) : use_monochrome(false), use_transparency(true), use_hinting(true), use_auto_hinting(true), -batch_load_size(1), Device(0), Environment(env), Driver(0), GlobalKerningWidth(0), GlobalKerningHeight(0) +batch_load_size(1), Device(0), Environment(env), Driver(0), GlobalKerningWidth(0), GlobalKerningHeight(0), +shadow_offset(0), shadow_alpha(0), fallback(0) { #ifdef _DEBUG setDebugName("CGUITTFont"); @@ -293,9 +292,6 @@ batch_load_size(1), Device(0), Environment(env), Driver(0), GlobalKerningWidth(0 Driver->grab(); setInvisibleCharacters(L" "); - - // Glyphs aren't reference counted, so don't try to delete them when we free the array. - Glyphs.set_free_when_destroyed(false); } bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antialias, const bool transparency) @@ -321,11 +317,11 @@ bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antia // Grab the face. SGUITTFace* face = 0; - core::map<io::path, SGUITTFace*>::Node* node = c_faces.find(filename); - if (node == 0) + auto node = c_faces.find(filename); + if (node == c_faces.end()) { face = new SGUITTFace(); - c_faces.set(filename, face); + c_faces.emplace(filename, face); if (filesystem) { @@ -335,7 +331,7 @@ bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antia { if (logger) logger->log(L"CGUITTFont", L"Failed to open the file.", irr::ELL_INFORMATION); - c_faces.remove(filename); + c_faces.erase(filename); delete face; face = 0; return false; @@ -350,7 +346,7 @@ bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antia { if (logger) logger->log(L"CGUITTFont", L"FT_New_Memory_Face failed.", irr::ELL_INFORMATION); - c_faces.remove(filename); + c_faces.erase(filename); delete face; face = 0; return false; @@ -363,7 +359,7 @@ bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antia { if (logger) logger->log(L"CGUITTFont", L"FT_New_Face failed.", irr::ELL_INFORMATION); - c_faces.remove(filename); + c_faces.erase(filename); delete face; face = 0; return false; @@ -373,7 +369,7 @@ bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antia else { // Using another instance of this face. - face = node->getValue(); + face = node->second; face->grab(); } @@ -412,21 +408,20 @@ CGUITTFont::~CGUITTFont() { // Delete the glyphs and glyph pages. reset_images(); - CGUITTAssistDelete::Delete(Glyphs); - //Glyphs.clear(); + Glyphs.clear(); // We aren't using this face anymore. - core::map<io::path, SGUITTFace*>::Node* n = c_faces.find(filename); - if (n) + auto n = c_faces.find(filename); + if (n != c_faces.end()) { - SGUITTFace* f = n->getValue(); + SGUITTFace* f = n->second; // Drop our face. If this was the last face, the destructor will clean up. if (f->drop()) - c_faces.remove(filename); + c_faces.erase(filename); // If there are no more faces referenced by FreeType, clean up. - if (c_faces.size() == 0) + if (c_faces.empty()) { FT_Done_FreeType(c_library); c_libraryLoaded = false; @@ -479,7 +474,7 @@ CGUITTGlyphPage* CGUITTFont::getLastGlyphPage() const CGUITTGlyphPage* CGUITTFont::createGlyphPage(const u8& pixel_mode) { CGUITTGlyphPage* page = 0; - + // Name of our page. io::path name("TTFontGlyphPage_"); name += tt_face->family_name; @@ -548,12 +543,12 @@ void CGUITTFont::setFontHinting(const bool enable, const bool enable_auto_hintin void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip) { - draw(EnrichedString(std::wstring(text.c_str()), color), position, color, hcenter, vcenter, clip); + draw(EnrichedString(std::wstring(text.c_str()), color), position, hcenter, vcenter, clip); } -void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip) +void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& position, bool hcenter, bool vcenter, const core::rect<s32>* clip) { - std::vector<video::SColor> colors = text.getColors(); + const std::vector<video::SColor> &colors = text.getColors(); if (!Driver) return; @@ -563,6 +558,7 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio { Glyph_Pages[i]->render_positions.clear(); Glyph_Pages[i]->render_source_rects.clear(); + Glyph_Pages[i]->render_colors.clear(); } // Set up some variables. @@ -585,13 +581,12 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio core::ustring utext = text.getString(); // Set up our render map. - core::map<u32, CGUITTGlyphPage*> Render_Map; + std::map<u32, CGUITTGlyphPage*> Render_Map; // Start parsing characters. u32 n; uchar32_t previousChar = 0; core::ustring::const_iterator iter(utext); - std::vector<video::SColor> applied_colors; while (!iter.atEnd()) { uchar32_t currentChar = *iter; @@ -637,12 +632,36 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio CGUITTGlyphPage* const page = Glyph_Pages[glyph.glyph_page]; page->render_positions.push_back(core::position2di(offset.X + offx, offset.Y + offy)); page->render_source_rects.push_back(glyph.source_rect); - Render_Map.set(glyph.glyph_page, page); - u32 current_color = iter.getPos(); - if (current_color < colors.size()) - applied_colors.push_back(colors[current_color]); + if (iter.getPos() < colors.size()) + page->render_colors.push_back(colors[iter.getPos()]); + else + page->render_colors.push_back(video::SColor(255,255,255,255)); + Render_Map[glyph.glyph_page] = page; + } + if (n > 0) + { + offset.X += getWidthFromCharacter(currentChar); + } + else if (fallback != 0) + { + // Let the fallback font draw it, this isn't super efficient but hopefully that doesn't matter + wchar_t l1[] = { (wchar_t) currentChar, 0 }, l2 = (wchar_t) previousChar; + + if (visible) + { + // Apply kerning. + offset.X += fallback->getKerningWidth(l1, &l2); + offset.Y += fallback->getKerningHeight(); + + u32 current_color = iter.getPos(); + fallback->draw(core::stringw(l1), + core::rect<s32>({offset.X-1, offset.Y-1}, position.LowerRightCorner), // ??? + current_color < colors.size() ? colors[current_color] : video::SColor(255, 255, 255, 255), + false, false, clip); + } + + offset.X += fallback->getDimension(l1).Width; } - offset.X += getWidthFromCharacter(currentChar); previousChar = currentChar; ++iter; @@ -650,14 +669,14 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio // Draw now. update_glyph_pages(); - core::map<u32, CGUITTGlyphPage*>::Iterator j = Render_Map.getIterator(); - while (!j.atEnd()) + auto it = Render_Map.begin(); + auto ie = Render_Map.end(); + core::array<core::vector2di> tmp_positions; + core::array<core::recti> tmp_source_rects; + while (it != ie) { - core::map<u32, CGUITTGlyphPage*>::Node* n = j.getNode(); - j++; - if (n == 0) continue; - - CGUITTGlyphPage* page = n->getValue(); + CGUITTGlyphPage* page = it->second; + ++it; if (shadow_offset) { for (size_t i = 0; i < page->render_positions.size(); ++i) @@ -666,16 +685,22 @@ void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& positio for (size_t i = 0; i < page->render_positions.size(); ++i) page->render_positions[i] -= core::vector2di(shadow_offset, shadow_offset); } + // render runs of matching color in batch + size_t ibegin; + video::SColor colprev; for (size_t i = 0; i < page->render_positions.size(); ++i) { - irr::video::SColor col; - if (!applied_colors.empty()) { - col = applied_colors[i < applied_colors.size() ? i : 0]; - } else { - col = irr::video::SColor(255, 255, 255, 255); - } + ibegin = i; + colprev = page->render_colors[i]; + do + ++i; + while (i < page->render_positions.size() && page->render_colors[i] == colprev); + tmp_positions.set_data(&page->render_positions[ibegin], i - ibegin); + tmp_source_rects.set_data(&page->render_source_rects[ibegin], i - ibegin); + --i; + if (!use_transparency) - col.color |= 0xff000000; - Driver->draw2DImage(page->texture, page->render_positions[i], page->render_source_rects[i], clip, col, true); + colprev.color |= 0xff000000; + Driver->draw2DImageBatch(page->texture, tmp_positions, tmp_source_rects, clip, colprev, true); } } } @@ -768,6 +793,12 @@ inline u32 CGUITTFont::getWidthFromCharacter(uchar32_t c) const int w = Glyphs[n-1].advance.x / 64; return w; } + if (fallback != 0) + { + wchar_t s[] = { (wchar_t) c, 0 }; + return fallback->getDimension(s).Width; + } + if (c >= 0x2000) return (font_metrics.ascender / 64); else return (font_metrics.ascender / 64) / 2; @@ -791,6 +822,12 @@ inline u32 CGUITTFont::getHeightFromCharacter(uchar32_t c) const s32 height = (font_metrics.ascender / 64) - Glyphs[n-1].offset.Y + Glyphs[n-1].source_rect.getHeight(); return height; } + if (fallback != 0) + { + wchar_t s[] = { (wchar_t) c, 0 }; + return fallback->getDimension(s).Height; + } + if (c >= 0x2000) return (font_metrics.ascender / 64); else return (font_metrics.ascender / 64) / 2; @@ -806,9 +843,9 @@ u32 CGUITTFont::getGlyphIndexByChar(uchar32_t c) const // Get the glyph. u32 glyph = FT_Get_Char_Index(tt_face, c); - // Check for a valid glyph. If it is invalid, attempt to use the replacement character. + // Check for a valid glyph. if (glyph == 0) - glyph = FT_Get_Char_Index(tt_face, core::unicode::UTF_REPLACEMENT_CHARACTER); + return 0; // If our glyph is already loaded, don't bother doing any batch loading code. if (glyph != 0 && Glyphs[glyph - 1].isLoaded) @@ -924,13 +961,26 @@ core::vector2di CGUITTFont::getKerning(const uchar32_t thisLetter, const uchar32 core::vector2di ret(GlobalKerningWidth, GlobalKerningHeight); + u32 n = getGlyphIndexByChar(thisLetter); + + // If we don't have this glyph, ask fallback font + if (n == 0) + { + if (fallback != 0) { + wchar_t l1 = (wchar_t) thisLetter, l2 = (wchar_t) previousLetter; + ret.X = fallback->getKerningWidth(&l1, &l2); + ret.Y = fallback->getKerningHeight(); + } + return ret; + } + // If we don't have kerning, no point in continuing. if (!FT_HAS_KERNING(tt_face)) return ret; // Get the kerning information. FT_Vector v; - FT_Get_Kerning(tt_face, getGlyphIndexByChar(previousLetter), getGlyphIndexByChar(thisLetter), FT_KERNING_DEFAULT, &v); + FT_Get_Kerning(tt_face, getGlyphIndexByChar(previousLetter), n, FT_KERNING_DEFAULT, &v); // If we have a scalable font, the return value will be in font points. if (FT_IS_SCALABLE(tt_face)) @@ -962,6 +1012,9 @@ void CGUITTFont::setInvisibleCharacters(const core::ustring& s) video::IImage* CGUITTFont::createTextureFromChar(const uchar32_t& ch) { u32 n = getGlyphIndexByChar(ch); + if (n == 0) + n = getGlyphIndexByChar((uchar32_t) core::unicode::UTF_REPLACEMENT_CHARACTER); + const SGUITTGlyph& glyph = Glyphs[n-1]; CGUITTGlyphPage* page = Glyph_Pages[glyph.glyph_page]; @@ -971,11 +1024,7 @@ video::IImage* CGUITTFont::createTextureFromChar(const uchar32_t& ch) video::ITexture* tex = page->texture; // Acquire a read-only lock of the corresponding page texture. - #if IRRLICHT_VERSION_MAJOR==1 && IRRLICHT_VERSION_MINOR>=8 void* ptr = tex->lock(video::ETLM_READ_ONLY); - #else - void* ptr = tex->lock(true); - #endif video::ECOLOR_FORMAT format = tex->getColorFormat(); core::dimension2du tex_size = tex->getOriginalSize(); @@ -1132,11 +1181,7 @@ core::array<scene::ISceneNode*> CGUITTFont::addTextSceneNode(const wchar_t* text // Now we copy planes corresponding to the letter size. IMeshManipulator* mani = smgr->getMeshManipulator(); IMesh* meshcopy = mani->createMeshCopy(shared_plane_ptr_); - #if IRRLICHT_VERSION_MAJOR==1 && IRRLICHT_VERSION_MINOR>=8 mani->scale(meshcopy, vector3df((f32)letter_size.Width, (f32)letter_size.Height, 1)); - #else - mani->scaleMesh(meshcopy, vector3df((f32)letter_size.Width, (f32)letter_size.Height, 1)); - #endif ISceneNode* current_node = smgr->addMeshSceneNode(meshcopy, parent, -1, current_pos); meshcopy->drop(); @@ -1149,6 +1194,8 @@ core::array<scene::ISceneNode*> CGUITTFont::addTextSceneNode(const wchar_t* text container.push_back(current_node); } offset.X += getWidthFromCharacter(current_char); + // Note that fallback font handling is missing here (Minetest never uses this) + previous_char = current_char; ++text; } diff --git a/src/irrlicht_changes/CGUITTFont.h b/src/irrlicht_changes/CGUITTFont.h index cf64934a2..2721364f5 100644 --- a/src/irrlicht_changes/CGUITTFont.h +++ b/src/irrlicht_changes/CGUITTFont.h @@ -1,7 +1,7 @@ /* CGUITTFont FreeType class for Irrlicht Copyright (c) 2009-2010 John Norman - Copyright (c) 2016 Nathanaël Courant + Copyright (c) 2016 Nathanaëlle Courant This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any @@ -34,8 +34,10 @@ #include <irrlicht.h> #include <ft2build.h> #include <vector> -#include "irrUString.h" +#include <map> +#include <irrUString.h> #include "util/enriched_string.h" +#include "util/basic_macros.h" #include FT_FREETYPE_H namespace irr @@ -45,23 +47,34 @@ namespace gui struct SGUITTFace; class CGUITTFont; - //! Class to assist in deleting glyphs. - class CGUITTAssistDelete - { - public: - template <class T, typename TAlloc> - static void Delete(core::array<T, TAlloc>& a) - { - TAlloc allocator; - allocator.deallocate(a.pointer()); - } - }; - //! Structure representing a single TrueType glyph. struct SGUITTGlyph { //! Constructor. - SGUITTGlyph() : isLoaded(false), glyph_page(0), surface(0), parent(0) {} + SGUITTGlyph() : + isLoaded(false), + glyph_page(0), + source_rect(), + offset(), + advance(), + surface(0), + parent(0) + {} + + DISABLE_CLASS_COPY(SGUITTGlyph); + + //! This class would be trivially copyable except for the reference count on `surface`. + SGUITTGlyph(SGUITTGlyph &&other) : + isLoaded(other.isLoaded), + glyph_page(other.glyph_page), + source_rect(other.source_rect), + offset(other.offset), + advance(other.advance), + surface(other.surface), + parent(other.parent) + { + other.surface = 0; + } //! Destructor. ~SGUITTGlyph() { unload(); } @@ -199,6 +212,7 @@ namespace gui core::array<core::vector2di> render_positions; core::array<core::recti> render_source_rects; + core::array<video::SColor> render_colors; private: core::array<const SGUITTGlyph*> glyph_to_be_paged; @@ -269,8 +283,8 @@ namespace gui video::SColor color, bool hcenter=false, bool vcenter=false, const core::rect<s32>* clip=0); - virtual void draw(const EnrichedString& text, const core::rect<s32>& position, - video::SColor color, bool hcenter=false, bool vcenter=false, + void draw(const EnrichedString& text, const core::rect<s32>& position, + bool hcenter=false, bool vcenter=false, const core::rect<s32>* clip=0); //! Returns the dimension of a character produced by this font. @@ -313,6 +327,9 @@ namespace gui //! Get the last glyph page's index. u32 getLastGlyphPageIndex() const { return Glyph_Pages.size() - 1; } + //! Set font that should be used for glyphs not present in ours + void setFallback(gui::IGUIFont* font) { fallback = font; } + //! Create corresponding character's software image copy from the font, //! so you can use this data just like any ordinary video::IImage. //! \param ch The character you need @@ -341,7 +358,7 @@ namespace gui private: // Manages the FreeType library. static FT_Library c_library; - static core::map<io::path, SGUITTFace*> c_faces; + static std::map<io::path, SGUITTFace*> c_faces; static bool c_libraryLoaded; static scene::IMesh* shared_plane_ptr_; static scene::SMesh shared_plane_; @@ -356,7 +373,7 @@ namespace gui load_flags = FT_LOAD_DEFAULT | FT_LOAD_RENDER; if (!useHinting()) load_flags |= FT_LOAD_NO_HINTING; if (!useAutoHinting()) load_flags |= FT_LOAD_NO_AUTOHINT; - if (useMonochrome()) load_flags |= FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO | FT_RENDER_MODE_MONO; + if (useMonochrome()) load_flags |= FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO; else load_flags |= FT_LOAD_TARGET_NORMAL; } u32 getWidthFromCharacter(wchar_t c) const; @@ -387,6 +404,8 @@ namespace gui core::ustring Invisible; u32 shadow_offset; u32 shadow_alpha; + + gui::IGUIFont* fallback; }; } // end namespace gui diff --git a/src/irrlicht_changes/CMakeLists.txt b/src/irrlicht_changes/CMakeLists.txt index d2f66ab77..19f431af3 100644 --- a/src/irrlicht_changes/CMakeLists.txt +++ b/src/irrlicht_changes/CMakeLists.txt @@ -1,14 +1,9 @@ if (BUILD_CLIENT) set(client_irrlicht_changes_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/static_text.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/CGUITTFont.cpp ) - if (ENABLE_FREETYPE) - set(client_irrlicht_changes_SRCS ${client_irrlicht_changes_SRCS} - ${CMAKE_CURRENT_SOURCE_DIR}/CGUITTFont.cpp - ) - endif() - # CMake require us to set a local scope and then parent scope # Else the last set win in parent scope set(client_irrlicht_changes_SRCS ${client_irrlicht_changes_SRCS} PARENT_SCOPE) diff --git a/src/irrlicht_changes/irrUString.h b/src/irrlicht_changes/irrUString.h deleted file mode 100644 index b628c092c..000000000 --- a/src/irrlicht_changes/irrUString.h +++ /dev/null @@ -1,3891 +0,0 @@ -/* - Basic Unicode string class for Irrlicht. - Copyright (c) 2009-2011 John Norman - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any - damages arising from the use of this software. - - Permission is granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you use - this software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and - must not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any source - distribution. - - The original version of this class can be located at: - http://irrlicht.suckerfreegames.com/ - - John Norman - john@suckerfreegames.com -*/ - -#pragma once - -#if (__cplusplus > 199711L) || (_MSC_VER >= 1600) || defined(__GXX_EXPERIMENTAL_CXX0X__) -# define USTRING_CPP0X -# if defined(__GXX_EXPERIMENTAL_CXX0X__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5))) -# define USTRING_CPP0X_NEWLITERALS -# endif -#endif - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <cstddef> - -#ifdef _WIN32 -#define __BYTE_ORDER 0 -#define __LITTLE_ENDIAN 0 -#define __BIG_ENDIAN 1 -#elif defined(__MACH__) && defined(__APPLE__) -#include <machine/endian.h> -#elif defined(__FreeBSD__) || defined(__DragonFly__) -#include <sys/endian.h> -#else -#include <endian.h> -#endif - -#ifdef USTRING_CPP0X -# include <utility> -#endif - -#ifndef USTRING_NO_STL -# include <string> -# include <iterator> -# include <ostream> -#endif - -#include "irrTypes.h" -#include "irrAllocator.h" -#include "irrArray.h" -#include "irrMath.h" -#include "irrString.h" -#include "path.h" - -//! UTF-16 surrogate start values. -static const irr::u16 UTF16_HI_SURROGATE = 0xD800; -static const irr::u16 UTF16_LO_SURROGATE = 0xDC00; - -//! Is a UTF-16 code point a surrogate? -#define UTF16_IS_SURROGATE(c) (((c) & 0xF800) == 0xD800) -#define UTF16_IS_SURROGATE_HI(c) (((c) & 0xFC00) == 0xD800) -#define UTF16_IS_SURROGATE_LO(c) (((c) & 0xFC00) == 0xDC00) - - -namespace irr -{ - - // Define our character types. -#ifdef USTRING_CPP0X_NEWLITERALS // C++0x - typedef char32_t uchar32_t; - typedef char16_t uchar16_t; - typedef char uchar8_t; -#else - typedef u32 uchar32_t; - typedef u16 uchar16_t; - typedef u8 uchar8_t; -#endif - -namespace core -{ - -namespace unicode -{ - -//! The unicode replacement character. Used to replace invalid characters. -const irr::u16 UTF_REPLACEMENT_CHARACTER = 0xFFFD; - -//! Convert a UTF-16 surrogate pair into a UTF-32 character. -//! \param high The high value of the pair. -//! \param low The low value of the pair. -//! \return The UTF-32 character expressed by the surrogate pair. -inline uchar32_t toUTF32(uchar16_t high, uchar16_t low) -{ - // Convert the surrogate pair into a single UTF-32 character. - uchar32_t x = ((high & ((1 << 6) -1)) << 10) | (low & ((1 << 10) -1)); - uchar32_t wu = ((high >> 6) & ((1 << 5) - 1)) + 1; - return (wu << 16) | x; -} - -//! Swaps the endianness of a 16-bit value. -//! \return The new value. -inline uchar16_t swapEndian16(const uchar16_t& c) -{ - return ((c >> 8) & 0x00FF) | ((c << 8) & 0xFF00); -} - -//! Swaps the endianness of a 32-bit value. -//! \return The new value. -inline uchar32_t swapEndian32(const uchar32_t& c) -{ - return ((c >> 24) & 0x000000FF) | - ((c >> 8) & 0x0000FF00) | - ((c << 8) & 0x00FF0000) | - ((c << 24) & 0xFF000000); -} - -//! The Unicode byte order mark. -const u16 BOM = 0xFEFF; - -//! The size of the Unicode byte order mark in terms of the Unicode character size. -const u8 BOM_UTF8_LEN = 3; -const u8 BOM_UTF16_LEN = 1; -const u8 BOM_UTF32_LEN = 1; - -//! Unicode byte order marks for file operations. -const u8 BOM_ENCODE_UTF8[3] = { 0xEF, 0xBB, 0xBF }; -const u8 BOM_ENCODE_UTF16_BE[2] = { 0xFE, 0xFF }; -const u8 BOM_ENCODE_UTF16_LE[2] = { 0xFF, 0xFE }; -const u8 BOM_ENCODE_UTF32_BE[4] = { 0x00, 0x00, 0xFE, 0xFF }; -const u8 BOM_ENCODE_UTF32_LE[4] = { 0xFF, 0xFE, 0x00, 0x00 }; - -//! The size in bytes of the Unicode byte marks for file operations. -const u8 BOM_ENCODE_UTF8_LEN = 3; -const u8 BOM_ENCODE_UTF16_LEN = 2; -const u8 BOM_ENCODE_UTF32_LEN = 4; - -//! Unicode encoding type. -enum EUTF_ENCODE -{ - EUTFE_NONE = 0, - EUTFE_UTF8, - EUTFE_UTF16, - EUTFE_UTF16_LE, - EUTFE_UTF16_BE, - EUTFE_UTF32, - EUTFE_UTF32_LE, - EUTFE_UTF32_BE -}; - -//! Unicode endianness. -enum EUTF_ENDIAN -{ - EUTFEE_NATIVE = 0, - EUTFEE_LITTLE, - EUTFEE_BIG -}; - -//! Returns the specified unicode byte order mark in a byte array. -//! The byte order mark is the first few bytes in a text file that signifies its encoding. -/** \param mode The Unicode encoding method that we want to get the byte order mark for. - If EUTFE_UTF16 or EUTFE_UTF32 is passed, it uses the native system endianness. **/ -//! \return An array that contains a byte order mark. -inline core::array<u8> getUnicodeBOM(EUTF_ENCODE mode) -{ -#define COPY_ARRAY(source, size) \ - memcpy(ret.pointer(), source, size); \ - ret.set_used(size) - - core::array<u8> ret(4); - switch (mode) - { - case EUTFE_UTF8: - COPY_ARRAY(BOM_ENCODE_UTF8, BOM_ENCODE_UTF8_LEN); - break; - case EUTFE_UTF16: - #ifdef __BIG_ENDIAN__ - COPY_ARRAY(BOM_ENCODE_UTF16_BE, BOM_ENCODE_UTF16_LEN); - #else - COPY_ARRAY(BOM_ENCODE_UTF16_LE, BOM_ENCODE_UTF16_LEN); - #endif - break; - case EUTFE_UTF16_BE: - COPY_ARRAY(BOM_ENCODE_UTF16_BE, BOM_ENCODE_UTF16_LEN); - break; - case EUTFE_UTF16_LE: - COPY_ARRAY(BOM_ENCODE_UTF16_LE, BOM_ENCODE_UTF16_LEN); - break; - case EUTFE_UTF32: - #ifdef __BIG_ENDIAN__ - COPY_ARRAY(BOM_ENCODE_UTF32_BE, BOM_ENCODE_UTF32_LEN); - #else - COPY_ARRAY(BOM_ENCODE_UTF32_LE, BOM_ENCODE_UTF32_LEN); - #endif - break; - case EUTFE_UTF32_BE: - COPY_ARRAY(BOM_ENCODE_UTF32_BE, BOM_ENCODE_UTF32_LEN); - break; - case EUTFE_UTF32_LE: - COPY_ARRAY(BOM_ENCODE_UTF32_LE, BOM_ENCODE_UTF32_LEN); - break; - case EUTFE_NONE: - // TODO sapier: fixed warning only, - // don't know if something needs to be done here - break; - } - return ret; - -#undef COPY_ARRAY -} - -//! Detects if the given data stream starts with a unicode BOM. -//! \param data The data stream to check. -//! \return The unicode BOM associated with the data stream, or EUTFE_NONE if none was found. -inline EUTF_ENCODE determineUnicodeBOM(const char* data) -{ - if (memcmp(data, BOM_ENCODE_UTF8, 3) == 0) return EUTFE_UTF8; - if (memcmp(data, BOM_ENCODE_UTF16_BE, 2) == 0) return EUTFE_UTF16_BE; - if (memcmp(data, BOM_ENCODE_UTF16_LE, 2) == 0) return EUTFE_UTF16_LE; - if (memcmp(data, BOM_ENCODE_UTF32_BE, 4) == 0) return EUTFE_UTF32_BE; - if (memcmp(data, BOM_ENCODE_UTF32_LE, 4) == 0) return EUTFE_UTF32_LE; - return EUTFE_NONE; -} - -} // end namespace unicode - - -//! UTF-16 string class. -template <typename TAlloc = irrAllocator<uchar16_t> > -class ustring16 -{ -public: - - ///------------------/// - /// iterator classes /// - ///------------------/// - - //! Access an element in a unicode string, allowing one to change it. - class _ustring16_iterator_access - { - public: - _ustring16_iterator_access(const ustring16<TAlloc>* s, u32 p) : ref(s), pos(p) {} - - //! Allow the class to be interpreted as a single UTF-32 character. - operator uchar32_t() const - { - return _get(); - } - - //! Allow one to change the character in the unicode string. - //! \param c The new character to use. - //! \return Myself. - _ustring16_iterator_access& operator=(const uchar32_t c) - { - _set(c); - return *this; - } - - //! Increments the value by 1. - //! \return Myself. - _ustring16_iterator_access& operator++() - { - _set(_get() + 1); - return *this; - } - - //! Increments the value by 1, returning the old value. - //! \return A unicode character. - uchar32_t operator++(int) - { - uchar32_t old = _get(); - _set(old + 1); - return old; - } - - //! Decrements the value by 1. - //! \return Myself. - _ustring16_iterator_access& operator--() - { - _set(_get() - 1); - return *this; - } - - //! Decrements the value by 1, returning the old value. - //! \return A unicode character. - uchar32_t operator--(int) - { - uchar32_t old = _get(); - _set(old - 1); - return old; - } - - //! Adds to the value by a specified amount. - //! \param val The amount to add to this character. - //! \return Myself. - _ustring16_iterator_access& operator+=(int val) - { - _set(_get() + val); - return *this; - } - - //! Subtracts from the value by a specified amount. - //! \param val The amount to subtract from this character. - //! \return Myself. - _ustring16_iterator_access& operator-=(int val) - { - _set(_get() - val); - return *this; - } - - //! Multiples the value by a specified amount. - //! \param val The amount to multiply this character by. - //! \return Myself. - _ustring16_iterator_access& operator*=(int val) - { - _set(_get() * val); - return *this; - } - - //! Divides the value by a specified amount. - //! \param val The amount to divide this character by. - //! \return Myself. - _ustring16_iterator_access& operator/=(int val) - { - _set(_get() / val); - return *this; - } - - //! Modulos the value by a specified amount. - //! \param val The amount to modulo this character by. - //! \return Myself. - _ustring16_iterator_access& operator%=(int val) - { - _set(_get() % val); - return *this; - } - - //! Adds to the value by a specified amount. - //! \param val The amount to add to this character. - //! \return A unicode character. - uchar32_t operator+(int val) const - { - return _get() + val; - } - - //! Subtracts from the value by a specified amount. - //! \param val The amount to subtract from this character. - //! \return A unicode character. - uchar32_t operator-(int val) const - { - return _get() - val; - } - - //! Multiplies the value by a specified amount. - //! \param val The amount to multiply this character by. - //! \return A unicode character. - uchar32_t operator*(int val) const - { - return _get() * val; - } - - //! Divides the value by a specified amount. - //! \param val The amount to divide this character by. - //! \return A unicode character. - uchar32_t operator/(int val) const - { - return _get() / val; - } - - //! Modulos the value by a specified amount. - //! \param val The amount to modulo this character by. - //! \return A unicode character. - uchar32_t operator%(int val) const - { - return _get() % val; - } - - private: - //! Gets a uchar32_t from our current position. - uchar32_t _get() const - { - const uchar16_t* a = ref->c_str(); - if (!UTF16_IS_SURROGATE(a[pos])) - return static_cast<uchar32_t>(a[pos]); - else - { - if (pos + 1 >= ref->size_raw()) - return 0; - - return unicode::toUTF32(a[pos], a[pos + 1]); - } - } - - //! Sets a uchar32_t at our current position. - void _set(uchar32_t c) - { - ustring16<TAlloc>* ref2 = const_cast<ustring16<TAlloc>*>(ref); - const uchar16_t* a = ref2->c_str(); - if (c > 0xFFFF) - { - // c will be multibyte, so split it up into the high and low surrogate pairs. - uchar16_t x = static_cast<uchar16_t>(c); - uchar16_t vh = UTF16_HI_SURROGATE | ((((c >> 16) & ((1 << 5) - 1)) - 1) << 6) | (x >> 10); - uchar16_t vl = UTF16_LO_SURROGATE | (x & ((1 << 10) - 1)); - - // If the previous position was a surrogate pair, just replace them. Else, insert the low pair. - if (UTF16_IS_SURROGATE_HI(a[pos]) && pos + 1 != ref2->size_raw()) - ref2->replace_raw(vl, static_cast<u32>(pos) + 1); - else ref2->insert_raw(vl, static_cast<u32>(pos) + 1); - - ref2->replace_raw(vh, static_cast<u32>(pos)); - } - else - { - // c will be a single byte. - uchar16_t vh = static_cast<uchar16_t>(c); - - // If the previous position was a surrogate pair, remove the extra byte. - if (UTF16_IS_SURROGATE_HI(a[pos])) - ref2->erase_raw(static_cast<u32>(pos) + 1); - - ref2->replace_raw(vh, static_cast<u32>(pos)); - } - } - - const ustring16<TAlloc>* ref; - u32 pos; - }; - typedef typename ustring16<TAlloc>::_ustring16_iterator_access access; - - - //! Iterator to iterate through a UTF-16 string. -#ifndef USTRING_NO_STL - class _ustring16_const_iterator : public std::iterator< - std::bidirectional_iterator_tag, // iterator_category - access, // value_type - ptrdiff_t, // difference_type - const access, // pointer - const access // reference - > -#else - class _ustring16_const_iterator -#endif - { - public: - typedef _ustring16_const_iterator _Iter; - typedef std::iterator<std::bidirectional_iterator_tag, access, ptrdiff_t, const access, const access> _Base; - typedef const access const_pointer; - typedef const access const_reference; - -#ifndef USTRING_NO_STL - typedef typename _Base::value_type value_type; - typedef typename _Base::difference_type difference_type; - typedef typename _Base::difference_type distance_type; - typedef typename _Base::pointer pointer; - typedef const_reference reference; -#else - typedef access value_type; - typedef u32 difference_type; - typedef u32 distance_type; - typedef const_pointer pointer; - typedef const_reference reference; -#endif - - //! Constructors. - _ustring16_const_iterator(const _Iter& i) : ref(i.ref), pos(i.pos) {} - _ustring16_const_iterator(const ustring16<TAlloc>& s) : ref(&s), pos(0) {} - _ustring16_const_iterator(const ustring16<TAlloc>& s, const u32 p) : ref(&s), pos(0) - { - if (ref->size_raw() == 0 || p == 0) - return; - - // Go to the appropriate position. - u32 i = p; - u32 sr = ref->size_raw(); - const uchar16_t* a = ref->c_str(); - while (i != 0 && pos < sr) - { - if (UTF16_IS_SURROGATE_HI(a[pos])) - pos += 2; - else ++pos; - --i; - } - } - - //! Test for equalness. - bool operator==(const _Iter& iter) const - { - if (ref == iter.ref && pos == iter.pos) - return true; - return false; - } - - //! Test for unequalness. - bool operator!=(const _Iter& iter) const - { - if (ref != iter.ref || pos != iter.pos) - return true; - return false; - } - - //! Switch to the next full character in the string. - _Iter& operator++() - { // ++iterator - if (pos == ref->size_raw()) return *this; - const uchar16_t* a = ref->c_str(); - if (UTF16_IS_SURROGATE_HI(a[pos])) - pos += 2; // TODO: check for valid low surrogate? - else ++pos; - if (pos > ref->size_raw()) pos = ref->size_raw(); - return *this; - } - - //! Switch to the next full character in the string, returning the previous position. - _Iter operator++(int) - { // iterator++ - _Iter _tmp(*this); - ++*this; - return _tmp; - } - - //! Switch to the previous full character in the string. - _Iter& operator--() - { // --iterator - if (pos == 0) return *this; - const uchar16_t* a = ref->c_str(); - --pos; - if (UTF16_IS_SURROGATE_LO(a[pos]) && pos != 0) // low surrogate, go back one more. - --pos; - return *this; - } - - //! Switch to the previous full character in the string, returning the previous position. - _Iter operator--(int) - { // iterator-- - _Iter _tmp(*this); - --*this; - return _tmp; - } - - //! Advance a specified number of full characters in the string. - //! \return Myself. - _Iter& operator+=(const difference_type v) - { - if (v == 0) return *this; - if (v < 0) return operator-=(v * -1); - - if (pos >= ref->size_raw()) - return *this; - - // Go to the appropriate position. - // TODO: Don't force u32 on an x64 OS. Make it agnostic. - u32 i = (u32)v; - u32 sr = ref->size_raw(); - const uchar16_t* a = ref->c_str(); - while (i != 0 && pos < sr) - { - if (UTF16_IS_SURROGATE_HI(a[pos])) - pos += 2; - else ++pos; - --i; - } - if (pos > sr) - pos = sr; - - return *this; - } - - //! Go back a specified number of full characters in the string. - //! \return Myself. - _Iter& operator-=(const difference_type v) - { - if (v == 0) return *this; - if (v > 0) return operator+=(v * -1); - - if (pos == 0) - return *this; - - // Go to the appropriate position. - // TODO: Don't force u32 on an x64 OS. Make it agnostic. - u32 i = (u32)v; - const uchar16_t* a = ref->c_str(); - while (i != 0 && pos != 0) - { - --pos; - if (UTF16_IS_SURROGATE_LO(a[pos]) != 0 && pos != 0) - --pos; - --i; - } - - return *this; - } - - //! Return a new iterator that is a variable number of full characters forward from the current position. - _Iter operator+(const difference_type v) const - { - _Iter ret(*this); - ret += v; - return ret; - } - - //! Return a new iterator that is a variable number of full characters backward from the current position. - _Iter operator-(const difference_type v) const - { - _Iter ret(*this); - ret -= v; - return ret; - } - - //! Returns the distance between two iterators. - difference_type operator-(const _Iter& iter) const - { - // Make sure we reference the same object! - if (ref != iter.ref) - return difference_type(); - - _Iter i = iter; - difference_type ret; - - // Walk up. - if (pos > i.pos) - { - while (pos > i.pos) - { - ++i; - ++ret; - } - return ret; - } - - // Walk down. - while (pos < i.pos) - { - --i; - --ret; - } - return ret; - } - - //! Accesses the full character at the iterator's position. - const_reference operator*() const - { - if (pos >= ref->size_raw()) - { - const uchar16_t* a = ref->c_str(); - u32 p = ref->size_raw(); - if (UTF16_IS_SURROGATE_LO(a[p])) - --p; - reference ret(ref, p); - return ret; - } - const_reference ret(ref, pos); - return ret; - } - - //! Accesses the full character at the iterator's position. - reference operator*() - { - if (pos >= ref->size_raw()) - { - const uchar16_t* a = ref->c_str(); - u32 p = ref->size_raw(); - if (UTF16_IS_SURROGATE_LO(a[p])) - --p; - reference ret(ref, p); - return ret; - } - reference ret(ref, pos); - return ret; - } - - //! Accesses the full character at the iterator's position. - const_pointer operator->() const - { - return operator*(); - } - - //! Accesses the full character at the iterator's position. - pointer operator->() - { - return operator*(); - } - - //! Is the iterator at the start of the string? - bool atStart() const - { - return pos == 0; - } - - //! Is the iterator at the end of the string? - bool atEnd() const - { - const uchar16_t* a = ref->c_str(); - if (UTF16_IS_SURROGATE(a[pos])) - return (pos + 1) >= ref->size_raw(); - else return pos >= ref->size_raw(); - } - - //! Moves the iterator to the start of the string. - void toStart() - { - pos = 0; - } - - //! Moves the iterator to the end of the string. - void toEnd() - { - pos = ref->size_raw(); - } - - //! Returns the iterator's position. - //! \return The iterator's position. - u32 getPos() const - { - return pos; - } - - protected: - const ustring16<TAlloc>* ref; - u32 pos; - }; - - //! Iterator to iterate through a UTF-16 string. - class _ustring16_iterator : public _ustring16_const_iterator - { - public: - typedef _ustring16_iterator _Iter; - typedef _ustring16_const_iterator _Base; - typedef typename _Base::const_pointer const_pointer; - typedef typename _Base::const_reference const_reference; - - - typedef typename _Base::value_type value_type; - typedef typename _Base::difference_type difference_type; - typedef typename _Base::distance_type distance_type; - typedef access pointer; - typedef access reference; - - using _Base::pos; - using _Base::ref; - - //! Constructors. - _ustring16_iterator(const _Iter& i) : _ustring16_const_iterator(i) {} - _ustring16_iterator(const ustring16<TAlloc>& s) : _ustring16_const_iterator(s) {} - _ustring16_iterator(const ustring16<TAlloc>& s, const u32 p) : _ustring16_const_iterator(s, p) {} - - //! Accesses the full character at the iterator's position. - reference operator*() const - { - if (pos >= ref->size_raw()) - { - const uchar16_t* a = ref->c_str(); - u32 p = ref->size_raw(); - if (UTF16_IS_SURROGATE_LO(a[p])) - --p; - reference ret(ref, p); - return ret; - } - reference ret(ref, pos); - return ret; - } - - //! Accesses the full character at the iterator's position. - reference operator*() - { - if (pos >= ref->size_raw()) - { - const uchar16_t* a = ref->c_str(); - u32 p = ref->size_raw(); - if (UTF16_IS_SURROGATE_LO(a[p])) - --p; - reference ret(ref, p); - return ret; - } - reference ret(ref, pos); - return ret; - } - - //! Accesses the full character at the iterator's position. - pointer operator->() const - { - return operator*(); - } - - //! Accesses the full character at the iterator's position. - pointer operator->() - { - return operator*(); - } - }; - - typedef typename ustring16<TAlloc>::_ustring16_iterator iterator; - typedef typename ustring16<TAlloc>::_ustring16_const_iterator const_iterator; - - ///----------------------/// - /// end iterator classes /// - ///----------------------/// - - //! Default constructor - ustring16() - : array(0), allocated(1), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - array = allocator.allocate(1); // new u16[1]; - array[0] = 0x0; - } - - - //! Constructor - ustring16(const ustring16<TAlloc>& other) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - *this = other; - } - - - //! Constructor from other string types - template <class B, class A> - ustring16(const string<B, A>& other) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - *this = other; - } - - -#ifndef USTRING_NO_STL - //! Constructor from std::string - template <class B, class A, typename Alloc> - ustring16(const std::basic_string<B, A, Alloc>& other) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - *this = other.c_str(); - } - - - //! Constructor from iterator. - template <typename Itr> - ustring16(Itr first, Itr last) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - reserve(std::distance(first, last)); - array[used] = 0; - - for (; first != last; ++first) - append((uchar32_t)*first); - } -#endif - - -#ifndef USTRING_CPP0X_NEWLITERALS - //! Constructor for copying a character string from a pointer. - ustring16(const char* const c) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - loadDataStream(c, strlen(c)); - //append((uchar8_t*)c); - } - - - //! Constructor for copying a character string from a pointer with a given length. - ustring16(const char* const c, u32 length) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - loadDataStream(c, length); - } -#endif - - - //! Constructor for copying a UTF-8 string from a pointer. - ustring16(const uchar8_t* const c) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - append(c); - } - - - //! Constructor for copying a UTF-8 string from a single char. - ustring16(const char c) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - append((uchar32_t)c); - } - - - //! Constructor for copying a UTF-8 string from a pointer with a given length. - ustring16(const uchar8_t* const c, u32 length) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - append(c, length); - } - - - //! Constructor for copying a UTF-16 string from a pointer. - ustring16(const uchar16_t* const c) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - append(c); - } - - - //! Constructor for copying a UTF-16 string from a pointer with a given length - ustring16(const uchar16_t* const c, u32 length) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - append(c, length); - } - - - //! Constructor for copying a UTF-32 string from a pointer. - ustring16(const uchar32_t* const c) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - append(c); - } - - - //! Constructor for copying a UTF-32 from a pointer with a given length. - ustring16(const uchar32_t* const c, u32 length) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - append(c, length); - } - - - //! Constructor for copying a wchar_t string from a pointer. - ustring16(const wchar_t* const c) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - if (sizeof(wchar_t) == 4) - append(reinterpret_cast<const uchar32_t* const>(c)); - else if (sizeof(wchar_t) == 2) - append(reinterpret_cast<const uchar16_t* const>(c)); - else if (sizeof(wchar_t) == 1) - append(reinterpret_cast<const uchar8_t* const>(c)); - } - - - //! Constructor for copying a wchar_t string from a pointer with a given length. - ustring16(const wchar_t* const c, u32 length) - : array(0), allocated(0), used(0) - { -#if __BYTE_ORDER == __BIG_ENDIAN - encoding = unicode::EUTFE_UTF16_BE; -#else - encoding = unicode::EUTFE_UTF16_LE; -#endif - - if (sizeof(wchar_t) == 4) - append(reinterpret_cast<const uchar32_t* const>(c), length); - else if (sizeof(wchar_t) == 2) - append(reinterpret_cast<const uchar16_t* const>(c), length); - else if (sizeof(wchar_t) == 1) - append(reinterpret_cast<const uchar8_t* const>(c), length); - } - - -#ifdef USTRING_CPP0X - //! Constructor for moving a ustring16 - ustring16(ustring16<TAlloc>&& other) - : array(other.array), encoding(other.encoding), allocated(other.allocated), used(other.used) - { - //std::cout << "MOVE constructor" << std::endl; - other.array = 0; - other.allocated = 0; - other.used = 0; - } -#endif - - - //! Destructor - ~ustring16() - { - allocator.deallocate(array); // delete [] array; - } - - - //! Assignment operator - ustring16& operator=(const ustring16<TAlloc>& other) - { - if (this == &other) - return *this; - - used = other.size_raw(); - if (used >= allocated) - { - allocator.deallocate(array); // delete [] array; - allocated = used + 1; - array = allocator.allocate(used + 1); //new u16[used]; - } - - const uchar16_t* p = other.c_str(); - for (u32 i=0; i<=used; ++i, ++p) - array[i] = *p; - - array[used] = 0; - - // Validate our new UTF-16 string. - validate(); - - return *this; - } - - -#ifdef USTRING_CPP0X - //! Move assignment operator - ustring16& operator=(ustring16<TAlloc>&& other) - { - if (this != &other) - { - //std::cout << "MOVE operator=" << std::endl; - allocator.deallocate(array); - - array = other.array; - allocated = other.allocated; - encoding = other.encoding; - used = other.used; - other.array = 0; - other.used = 0; - } - return *this; - } -#endif - - - //! Assignment operator for other string types - template <class B, class A> - ustring16<TAlloc>& operator=(const string<B, A>& other) - { - *this = other.c_str(); - return *this; - } - - - //! Assignment operator for UTF-8 strings - ustring16<TAlloc>& operator=(const uchar8_t* const c) - { - if (!array) - { - array = allocator.allocate(1); //new u16[1]; - allocated = 1; - } - used = 0; - array[used] = 0x0; - if (!c) return *this; - - //! Append our string now. - append(c); - return *this; - } - - - //! Assignment operator for UTF-16 strings - ustring16<TAlloc>& operator=(const uchar16_t* const c) - { - if (!array) - { - array = allocator.allocate(1); //new u16[1]; - allocated = 1; - } - used = 0; - array[used] = 0x0; - if (!c) return *this; - - //! Append our string now. - append(c); - return *this; - } - - - //! Assignment operator for UTF-32 strings - ustring16<TAlloc>& operator=(const uchar32_t* const c) - { - if (!array) - { - array = allocator.allocate(1); //new u16[1]; - allocated = 1; - } - used = 0; - array[used] = 0x0; - if (!c) return *this; - - //! Append our string now. - append(c); - return *this; - } - - - //! Assignment operator for wchar_t strings. - /** Note that this assumes that a correct unicode string is stored in the wchar_t string. - Since wchar_t changes depending on its platform, it could either be a UTF-8, -16, or -32 string. - This function assumes you are storing the correct unicode encoding inside the wchar_t string. **/ - ustring16<TAlloc>& operator=(const wchar_t* const c) - { - if (sizeof(wchar_t) == 4) - *this = reinterpret_cast<const uchar32_t* const>(c); - else if (sizeof(wchar_t) == 2) - *this = reinterpret_cast<const uchar16_t* const>(c); - else if (sizeof(wchar_t) == 1) - *this = reinterpret_cast<const uchar8_t* const>(c); - - return *this; - } - - - //! Assignment operator for other strings. - /** Note that this assumes that a correct unicode string is stored in the string. **/ - template <class B> - ustring16<TAlloc>& operator=(const B* const c) - { - if (sizeof(B) == 4) - *this = reinterpret_cast<const uchar32_t* const>(c); - else if (sizeof(B) == 2) - *this = reinterpret_cast<const uchar16_t* const>(c); - else if (sizeof(B) == 1) - *this = reinterpret_cast<const uchar8_t* const>(c); - - return *this; - } - - - //! Direct access operator - access operator [](const u32 index) - { - _IRR_DEBUG_BREAK_IF(index>=size()) // bad index - iterator iter(*this, index); - return iter.operator*(); - } - - - //! Direct access operator - const access operator [](const u32 index) const - { - _IRR_DEBUG_BREAK_IF(index>=size()) // bad index - const_iterator iter(*this, index); - return iter.operator*(); - } - - - //! Equality operator - bool operator ==(const uchar16_t* const str) const - { - if (!str) - return false; - - u32 i; - for(i=0; array[i] && str[i]; ++i) - if (array[i] != str[i]) - return false; - - return !array[i] && !str[i]; - } - - - //! Equality operator - bool operator ==(const ustring16<TAlloc>& other) const - { - for(u32 i=0; array[i] && other.array[i]; ++i) - if (array[i] != other.array[i]) - return false; - - return used == other.used; - } - - - //! Is smaller comparator - bool operator <(const ustring16<TAlloc>& other) const - { - for(u32 i=0; array[i] && other.array[i]; ++i) - { - s32 diff = array[i] - other.array[i]; - if ( diff ) - return diff < 0; - } - - return used < other.used; - } - - - //! Inequality operator - bool operator !=(const uchar16_t* const str) const - { - return !(*this == str); - } - - - //! Inequality operator - bool operator !=(const ustring16<TAlloc>& other) const - { - return !(*this == other); - } - - - //! Returns the length of a ustring16 in full characters. - //! \return Length of a ustring16 in full characters. - u32 size() const - { - const_iterator i(*this, 0); - u32 pos = 0; - while (!i.atEnd()) - { - ++i; - ++pos; - } - return pos; - } - - - //! Informs if the ustring is empty or not. - //! \return True if the ustring is empty, false if not. - bool empty() const - { - return (size_raw() == 0); - } - - - //! Returns a pointer to the raw UTF-16 string data. - //! \return pointer to C-style NUL terminated array of UTF-16 code points. - const uchar16_t* c_str() const - { - return array; - } - - - //! Compares the first n characters of this string with another. - //! \param other Other string to compare to. - //! \param n Number of characters to compare. - //! \return True if the n first characters of both strings are equal. - bool equalsn(const ustring16<TAlloc>& other, u32 n) const - { - u32 i; - const uchar16_t* oa = other.c_str(); - for(i=0; array[i] && oa[i] && i < n; ++i) - if (array[i] != oa[i]) - return false; - - // if one (or both) of the strings was smaller then they - // are only equal if they have the same length - return (i == n) || (used == other.used); - } - - - //! Compares the first n characters of this string with another. - //! \param str Other string to compare to. - //! \param n Number of characters to compare. - //! \return True if the n first characters of both strings are equal. - bool equalsn(const uchar16_t* const str, u32 n) const - { - if (!str) - return false; - u32 i; - for(i=0; array[i] && str[i] && i < n; ++i) - if (array[i] != str[i]) - return false; - - // if one (or both) of the strings was smaller then they - // are only equal if they have the same length - return (i == n) || (array[i] == 0 && str[i] == 0); - } - - - //! Appends a character to this ustring16 - //! \param character The character to append. - //! \return A reference to our current string. - ustring16<TAlloc>& append(uchar32_t character) - { - if (used + 2 >= allocated) - reallocate(used + 2); - - if (character > 0xFFFF) - { - used += 2; - - // character will be multibyte, so split it up into a surrogate pair. - uchar16_t x = static_cast<uchar16_t>(character); - uchar16_t vh = UTF16_HI_SURROGATE | ((((character >> 16) & ((1 << 5) - 1)) - 1) << 6) | (x >> 10); - uchar16_t vl = UTF16_LO_SURROGATE | (x & ((1 << 10) - 1)); - array[used-2] = vh; - array[used-1] = vl; - } - else - { - ++used; - array[used-1] = character; - } - array[used] = 0; - - return *this; - } - - - //! Appends a UTF-8 string to this ustring16 - //! \param other The UTF-8 string to append. - //! \param length The length of the string to append. - //! \return A reference to our current string. - ustring16<TAlloc>& append(const uchar8_t* const other, u32 length=0xffffffff) - { - if (!other) - return *this; - - // Determine if the string is long enough for a BOM. - u32 len = 0; - const uchar8_t* p = other; - do - { - ++len; - } while (*p++ && len < unicode::BOM_ENCODE_UTF8_LEN); - - // Check for BOM. - unicode::EUTF_ENCODE c_bom = unicode::EUTFE_NONE; - if (len == unicode::BOM_ENCODE_UTF8_LEN) - { - if (memcmp(other, unicode::BOM_ENCODE_UTF8, unicode::BOM_ENCODE_UTF8_LEN) == 0) - c_bom = unicode::EUTFE_UTF8; - } - - // If a BOM was found, don't include it in the string. - const uchar8_t* c2 = other; - if (c_bom != unicode::EUTFE_NONE) - { - c2 = other + unicode::BOM_UTF8_LEN; - length -= unicode::BOM_UTF8_LEN; - } - - // Calculate the size of the string to read in. - len = 0; - p = c2; - do - { - ++len; - } while(*p++ && len < length); - if (len > length) - len = length; - - // If we need to grow the array, do it now. - if (used + len >= allocated) - reallocate(used + (len * 2)); - u32 start = used; - - // Convert UTF-8 to UTF-16. - u32 pos = start; - for (u32 l = 0; l<len;) - { - ++used; - if (((c2[l] >> 6) & 0x03) == 0x02) - { // Invalid continuation byte. - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - ++l; - } - else if (c2[l] == 0xC0 || c2[l] == 0xC1) - { // Invalid byte - overlong encoding. - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - ++l; - } - else if ((c2[l] & 0xF8) == 0xF0) - { // 4 bytes UTF-8, 2 bytes UTF-16. - // Check for a full string. - if ((l + 3) >= len) - { - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - l += 3; - break; - } - - // Validate. - bool valid = true; - u8 l2 = 0; - if (valid && (((c2[l+1] >> 6) & 0x03) == 0x02)) ++l2; else valid = false; - if (valid && (((c2[l+2] >> 6) & 0x03) == 0x02)) ++l2; else valid = false; - if (valid && (((c2[l+3] >> 6) & 0x03) == 0x02)) ++l2; else valid = false; - if (!valid) - { - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - l += l2; - continue; - } - - // Decode. - uchar8_t b1 = ((c2[l] & 0x7) << 2) | ((c2[l+1] >> 4) & 0x3); - uchar8_t b2 = ((c2[l+1] & 0xF) << 4) | ((c2[l+2] >> 2) & 0xF); - uchar8_t b3 = ((c2[l+2] & 0x3) << 6) | (c2[l+3] & 0x3F); - uchar32_t v = b3 | ((uchar32_t)b2 << 8) | ((uchar32_t)b1 << 16); - - // Split v up into a surrogate pair. - uchar16_t x = static_cast<uchar16_t>(v); - uchar16_t vh = UTF16_HI_SURROGATE | ((((v >> 16) & ((1 << 5) - 1)) - 1) << 6) | (x >> 10); - uchar16_t vl = UTF16_LO_SURROGATE | (x & ((1 << 10) - 1)); - - array[pos++] = vh; - array[pos++] = vl; - l += 4; - ++used; // Using two shorts this time, so increase used by 1. - } - else if ((c2[l] & 0xF0) == 0xE0) - { // 3 bytes UTF-8, 1 byte UTF-16. - // Check for a full string. - if ((l + 2) >= len) - { - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - l += 2; - break; - } - - // Validate. - bool valid = true; - u8 l2 = 0; - if (valid && (((c2[l+1] >> 6) & 0x03) == 0x02)) ++l2; else valid = false; - if (valid && (((c2[l+2] >> 6) & 0x03) == 0x02)) ++l2; else valid = false; - if (!valid) - { - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - l += l2; - continue; - } - - // Decode. - uchar8_t b1 = ((c2[l] & 0xF) << 4) | ((c2[l+1] >> 2) & 0xF); - uchar8_t b2 = ((c2[l+1] & 0x3) << 6) | (c2[l+2] & 0x3F); - uchar16_t ch = b2 | ((uchar16_t)b1 << 8); - array[pos++] = ch; - l += 3; - } - else if ((c2[l] & 0xE0) == 0xC0) - { // 2 bytes UTF-8, 1 byte UTF-16. - // Check for a full string. - if ((l + 1) >= len) - { - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - l += 1; - break; - } - - // Validate. - if (((c2[l+1] >> 6) & 0x03) != 0x02) - { - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - ++l; - continue; - } - - // Decode. - uchar8_t b1 = (c2[l] >> 2) & 0x7; - uchar8_t b2 = ((c2[l] & 0x3) << 6) | (c2[l+1] & 0x3F); - uchar16_t ch = b2 | ((uchar16_t)b1 << 8); - array[pos++] = ch; - l += 2; - } - else - { // 1 byte UTF-8, 1 byte UTF-16. - // Validate. - if (c2[l] > 0x7F) - { // Values above 0xF4 are restricted and aren't used. By now, anything above 0x7F is invalid. - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - } - else array[pos++] = static_cast<uchar16_t>(c2[l]); - ++l; - } - } - array[used] = 0; - - // Validate our new UTF-16 string. - validate(); - - return *this; - } - - - //! Appends a UTF-16 string to this ustring16 - //! \param other The UTF-16 string to append. - //! \param length The length of the string to append. - //! \return A reference to our current string. - ustring16<TAlloc>& append(const uchar16_t* const other, u32 length=0xffffffff) - { - if (!other) - return *this; - - // Determine if the string is long enough for a BOM. - u32 len = 0; - const uchar16_t* p = other; - do - { - ++len; - } while (*p++ && len < unicode::BOM_ENCODE_UTF16_LEN); - - // Check for the BOM to determine the string's endianness. - unicode::EUTF_ENDIAN c_end = unicode::EUTFEE_NATIVE; - if (memcmp(other, unicode::BOM_ENCODE_UTF16_LE, unicode::BOM_ENCODE_UTF16_LEN) == 0) - c_end = unicode::EUTFEE_LITTLE; - else if (memcmp(other, unicode::BOM_ENCODE_UTF16_BE, unicode::BOM_ENCODE_UTF16_LEN) == 0) - c_end = unicode::EUTFEE_BIG; - - // If a BOM was found, don't include it in the string. - const uchar16_t* c2 = other; - if (c_end != unicode::EUTFEE_NATIVE) - { - c2 = other + unicode::BOM_UTF16_LEN; - length -= unicode::BOM_UTF16_LEN; - } - - // Calculate the size of the string to read in. - len = 0; - p = c2; - do - { - ++len; - } while(*p++ && len < length); - if (len > length) - len = length; - - // If we need to grow the size of the array, do it now. - if (used + len >= allocated) - reallocate(used + (len * 2)); - u32 start = used; - used += len; - - // Copy the string now. - unicode::EUTF_ENDIAN m_end = getEndianness(); - for (u32 l = start; l < start + len; ++l) - { - array[l] = (uchar16_t)c2[l]; - if (c_end != unicode::EUTFEE_NATIVE && c_end != m_end) - array[l] = unicode::swapEndian16(array[l]); - } - - array[used] = 0; - - // Validate our new UTF-16 string. - validate(); - return *this; - } - - - //! Appends a UTF-32 string to this ustring16 - //! \param other The UTF-32 string to append. - //! \param length The length of the string to append. - //! \return A reference to our current string. - ustring16<TAlloc>& append(const uchar32_t* const other, u32 length=0xffffffff) - { - if (!other) - return *this; - - // Check for the BOM to determine the string's endianness. - unicode::EUTF_ENDIAN c_end = unicode::EUTFEE_NATIVE; - if (memcmp(other, unicode::BOM_ENCODE_UTF32_LE, unicode::BOM_ENCODE_UTF32_LEN) == 0) - c_end = unicode::EUTFEE_LITTLE; - else if (memcmp(other, unicode::BOM_ENCODE_UTF32_BE, unicode::BOM_ENCODE_UTF32_LEN) == 0) - c_end = unicode::EUTFEE_BIG; - - // If a BOM was found, don't include it in the string. - const uchar32_t* c2 = other; - if (c_end != unicode::EUTFEE_NATIVE) - { - c2 = other + unicode::BOM_UTF32_LEN; - length -= unicode::BOM_UTF32_LEN; - } - - // Calculate the size of the string to read in. - u32 len = 0; - const uchar32_t* p = c2; - do - { - ++len; - } while(*p++ && len < length); - if (len > length) - len = length; - - // If we need to grow the size of the array, do it now. - // In case all of the UTF-32 string is split into surrogate pairs, do len * 2. - if (used + (len * 2) >= allocated) - reallocate(used + ((len * 2) * 2)); - u32 start = used; - - // Convert UTF-32 to UTF-16. - unicode::EUTF_ENDIAN m_end = getEndianness(); - u32 pos = start; - for (u32 l = 0; l<len; ++l) - { - ++used; - - uchar32_t ch = c2[l]; - if (c_end != unicode::EUTFEE_NATIVE && c_end != m_end) - ch = unicode::swapEndian32(ch); - - if (ch > 0xFFFF) - { - // Split ch up into a surrogate pair as it is over 16 bits long. - uchar16_t x = static_cast<uchar16_t>(ch); - uchar16_t vh = UTF16_HI_SURROGATE | ((((ch >> 16) & ((1 << 5) - 1)) - 1) << 6) | (x >> 10); - uchar16_t vl = UTF16_LO_SURROGATE | (x & ((1 << 10) - 1)); - array[pos++] = vh; - array[pos++] = vl; - ++used; // Using two shorts, so increased used again. - } - else if (ch >= 0xD800 && ch <= 0xDFFF) - { - // Between possible UTF-16 surrogates (invalid!) - array[pos++] = unicode::UTF_REPLACEMENT_CHARACTER; - } - else array[pos++] = static_cast<uchar16_t>(ch); - } - array[used] = 0; - - // Validate our new UTF-16 string. - validate(); - - return *this; - } - - - //! Appends a ustring16 to this ustring16 - //! \param other The string to append to this one. - //! \return A reference to our current string. - ustring16<TAlloc>& append(const ustring16<TAlloc>& other) - { - const uchar16_t* oa = other.c_str(); - - u32 len = other.size_raw(); - - if (used + len >= allocated) - reallocate(used + len); - - for (u32 l=0; l<len; ++l) - array[used+l] = oa[l]; - - used += len; - array[used] = 0; - - return *this; - } - - - //! Appends a certain amount of characters of a ustring16 to this ustring16. - //! \param other The string to append to this one. - //! \param length How many characters of the other string to add to this one. - //! \return A reference to our current string. - ustring16<TAlloc>& append(const ustring16<TAlloc>& other, u32 length) - { - if (other.size() == 0) - return *this; - - if (other.size() < length) - { - append(other); - return *this; - } - - if (used + length * 2 >= allocated) - reallocate(used + length * 2); - - const_iterator iter(other, 0); - u32 l = length; - while (!iter.atEnd() && l) - { - uchar32_t c = *iter; - append(c); - ++iter; - --l; - } - - return *this; - } - - - //! Reserves some memory. - //! \param count The amount of characters to reserve. - void reserve(u32 count) - { - if (count < allocated) - return; - - reallocate(count); - } - - - //! Finds first occurrence of character. - //! \param c The character to search for. - //! \return Position where the character has been found, or -1 if not found. - s32 findFirst(uchar32_t c) const - { - const_iterator i(*this, 0); - - s32 pos = 0; - while (!i.atEnd()) - { - uchar32_t t = *i; - if (c == t) - return pos; - ++pos; - ++i; - } - - return -1; - } - - //! Finds first occurrence of a character of a list. - //! \param c A list of characters to find. For example if the method should find the first occurrence of 'a' or 'b', this parameter should be "ab". - //! \param count The amount of characters in the list. Usually, this should be strlen(c). - //! \return Position where one of the characters has been found, or -1 if not found. - s32 findFirstChar(const uchar32_t* const c, u32 count=1) const - { - if (!c || !count) - return -1; - - const_iterator i(*this, 0); - - s32 pos = 0; - while (!i.atEnd()) - { - uchar32_t t = *i; - for (u32 j=0; j<count; ++j) - if (t == c[j]) - return pos; - ++pos; - ++i; - } - - return -1; - } - - - //! Finds first position of a character not in a given list. - //! \param c A list of characters to NOT find. For example if the method should find the first occurrence of a character not 'a' or 'b', this parameter should be "ab". - //! \param count The amount of characters in the list. Usually, this should be strlen(c). - //! \return Position where the character has been found, or -1 if not found. - s32 findFirstCharNotInList(const uchar32_t* const c, u32 count=1) const - { - if (!c || !count) - return -1; - - const_iterator i(*this, 0); - - s32 pos = 0; - while (!i.atEnd()) - { - uchar32_t t = *i; - u32 j; - for (j=0; j<count; ++j) - if (t == c[j]) - break; - - if (j==count) - return pos; - ++pos; - ++i; - } - - return -1; - } - - //! Finds last position of a character not in a given list. - //! \param c A list of characters to NOT find. For example if the method should find the first occurrence of a character not 'a' or 'b', this parameter should be "ab". - //! \param count The amount of characters in the list. Usually, this should be strlen(c). - //! \return Position where the character has been found, or -1 if not found. - s32 findLastCharNotInList(const uchar32_t* const c, u32 count=1) const - { - if (!c || !count) - return -1; - - const_iterator i(end()); - --i; - - s32 pos = size() - 1; - while (!i.atStart()) - { - uchar32_t t = *i; - u32 j; - for (j=0; j<count; ++j) - if (t == c[j]) - break; - - if (j==count) - return pos; - --pos; - --i; - } - - return -1; - } - - //! Finds next occurrence of character. - //! \param c The character to search for. - //! \param startPos The position in the string to start searching. - //! \return Position where the character has been found, or -1 if not found. - s32 findNext(uchar32_t c, u32 startPos) const - { - const_iterator i(*this, startPos); - - s32 pos = startPos; - while (!i.atEnd()) - { - uchar32_t t = *i; - if (t == c) - return pos; - ++pos; - ++i; - } - - return -1; - } - - - //! Finds last occurrence of character. - //! \param c The character to search for. - //! \param start The start position of the reverse search ( default = -1, on end ). - //! \return Position where the character has been found, or -1 if not found. - s32 findLast(uchar32_t c, s32 start = -1) const - { - u32 s = size(); - start = core::clamp ( start < 0 ? (s32)s : start, 0, (s32)s ) - 1; - - const_iterator i(*this, start); - u32 pos = start; - while (!i.atStart()) - { - uchar32_t t = *i; - if (t == c) - return pos; - --pos; - --i; - } - - return -1; - } - - //! Finds last occurrence of a character in a list. - //! \param c A list of strings to find. For example if the method should find the last occurrence of 'a' or 'b', this parameter should be "ab". - //! \param count The amount of characters in the list. Usually, this should be strlen(c). - //! \return Position where one of the characters has been found, or -1 if not found. - s32 findLastChar(const uchar32_t* const c, u32 count=1) const - { - if (!c || !count) - return -1; - - const_iterator i(end()); - --i; - - s32 pos = size(); - while (!i.atStart()) - { - uchar32_t t = *i; - for (u32 j=0; j<count; ++j) - if (t == c[j]) - return pos; - --pos; - --i; - } - - return -1; - } - - - //! Finds another ustring16 in this ustring16. - //! \param str The string to find. - //! \param start The start position of the search. - //! \return Positions where the ustring16 has been found, or -1 if not found. - s32 find(const ustring16<TAlloc>& str, const u32 start = 0) const - { - u32 my_size = size(); - u32 their_size = str.size(); - - if (their_size == 0 || my_size - start < their_size) - return -1; - - const_iterator i(*this, start); - - s32 pos = start; - while (!i.atEnd()) - { - const_iterator i2(i); - const_iterator j(str, 0); - uchar32_t t1 = (uchar32_t)*i2; - uchar32_t t2 = (uchar32_t)*j; - while (t1 == t2) - { - ++i2; - ++j; - if (j.atEnd()) - return pos; - t1 = (uchar32_t)*i2; - t2 = (uchar32_t)*j; - } - ++i; - ++pos; - } - - return -1; - } - - - //! Finds another ustring16 in this ustring16. - //! \param str The string to find. - //! \param start The start position of the search. - //! \return Positions where the string has been found, or -1 if not found. - s32 find_raw(const ustring16<TAlloc>& str, const u32 start = 0) const - { - const uchar16_t* data = str.c_str(); - if (data && *data) - { - u32 len = 0; - - while (data[len]) - ++len; - - if (len > used) - return -1; - - for (u32 i=start; i<=used-len; ++i) - { - u32 j=0; - - while(data[j] && array[i+j] == data[j]) - ++j; - - if (!data[j]) - return i; - } - } - - return -1; - } - - - //! Returns a substring. - //! \param begin: Start of substring. - //! \param length: Length of substring. - //! \return A reference to our current string. - ustring16<TAlloc> subString(u32 begin, s32 length) const - { - u32 len = size(); - // if start after ustring16 - // or no proper substring length - if ((length <= 0) || (begin>=len)) - return ustring16<TAlloc>(""); - // clamp length to maximal value - if ((length+begin) > len) - length = len-begin; - - ustring16<TAlloc> o; - o.reserve((length+1) * 2); - - const_iterator i(*this, begin); - while (!i.atEnd() && length) - { - o.append(*i); - ++i; - --length; - } - - return o; - } - - - //! Appends a character to this ustring16. - //! \param c Character to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (char c) - { - append((uchar32_t)c); - return *this; - } - - - //! Appends a character to this ustring16. - //! \param c Character to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (uchar32_t c) - { - append(c); - return *this; - } - - - //! Appends a number to this ustring16. - //! \param c Number to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (short c) - { - append(core::stringc(c)); - return *this; - } - - - //! Appends a number to this ustring16. - //! \param c Number to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (unsigned short c) - { - append(core::stringc(c)); - return *this; - } - - -#ifdef USTRING_CPP0X_NEWLITERALS - //! Appends a number to this ustring16. - //! \param c Number to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (int c) - { - append(core::stringc(c)); - return *this; - } - - - //! Appends a number to this ustring16. - //! \param c Number to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (unsigned int c) - { - append(core::stringc(c)); - return *this; - } -#endif - - - //! Appends a number to this ustring16. - //! \param c Number to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (long c) - { - append(core::stringc(c)); - return *this; - } - - - //! Appends a number to this ustring16. - //! \param c Number to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (unsigned long c) - { - append(core::stringc(c)); - return *this; - } - - - //! Appends a number to this ustring16. - //! \param c Number to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (double c) - { - append(core::stringc(c)); - return *this; - } - - - //! Appends a char ustring16 to this ustring16. - //! \param c Char ustring16 to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (const uchar16_t* const c) - { - append(c); - return *this; - } - - - //! Appends a ustring16 to this ustring16. - //! \param other ustring16 to append. - //! \return A reference to our current string. - ustring16<TAlloc>& operator += (const ustring16<TAlloc>& other) - { - append(other); - return *this; - } - - - //! Replaces all characters of a given type with another one. - //! \param toReplace Character to replace. - //! \param replaceWith Character replacing the old one. - //! \return A reference to our current string. - ustring16<TAlloc>& replace(uchar32_t toReplace, uchar32_t replaceWith) - { - iterator i(*this, 0); - while (!i.atEnd()) - { - typename ustring16<TAlloc>::access a = *i; - if ((uchar32_t)a == toReplace) - a = replaceWith; - ++i; - } - return *this; - } - - - //! Replaces all instances of a string with another one. - //! \param toReplace The string to replace. - //! \param replaceWith The string replacing the old one. - //! \return A reference to our current string. - ustring16<TAlloc>& replace(const ustring16<TAlloc>& toReplace, const ustring16<TAlloc>& replaceWith) - { - if (toReplace.size() == 0) - return *this; - - const uchar16_t* other = toReplace.c_str(); - const uchar16_t* replace = replaceWith.c_str(); - const u32 other_size = toReplace.size_raw(); - const u32 replace_size = replaceWith.size_raw(); - - // Determine the delta. The algorithm will change depending on the delta. - s32 delta = replace_size - other_size; - - // A character for character replace. The string will not shrink or grow. - if (delta == 0) - { - s32 pos = 0; - while ((pos = find_raw(other, pos)) != -1) - { - for (u32 i = 0; i < replace_size; ++i) - array[pos + i] = replace[i]; - ++pos; - } - return *this; - } - - // We are going to be removing some characters. The string will shrink. - if (delta < 0) - { - u32 i = 0; - for (u32 pos = 0; pos <= used; ++i, ++pos) - { - // Is this potentially a match? - if (array[pos] == *other) - { - // Check to see if we have a match. - u32 j; - for (j = 0; j < other_size; ++j) - { - if (array[pos + j] != other[j]) - break; - } - - // If we have a match, replace characters. - if (j == other_size) - { - for (j = 0; j < replace_size; ++j) - array[i + j] = replace[j]; - i += replace_size - 1; - pos += other_size - 1; - continue; - } - } - - // No match found, just copy characters. - array[i - 1] = array[pos]; - } - array[i] = 0; - used = i; - - return *this; - } - - // We are going to be adding characters, so the string size will increase. - // Count the number of times toReplace exists in the string so we can allocate the new size. - u32 find_count = 0; - s32 pos = 0; - while ((pos = find_raw(other, pos)) != -1) - { - ++find_count; - ++pos; - } - - // Re-allocate the string now, if needed. - u32 len = delta * find_count; - if (used + len >= allocated) - reallocate(used + len); - - // Start replacing. - pos = 0; - while ((pos = find_raw(other, pos)) != -1) - { - uchar16_t* start = array + pos + other_size - 1; - uchar16_t* ptr = array + used; - uchar16_t* end = array + used + delta; - - // Shift characters to make room for the string. - while (ptr != start) - { - *end = *ptr; - --ptr; - --end; - } - - // Add the new string now. - for (u32 i = 0; i < replace_size; ++i) - array[pos + i] = replace[i]; - - pos += replace_size; - used += delta; - } - - // Terminate the string and return ourself. - array[used] = 0; - return *this; - } - - - //! Removes characters from a ustring16.. - //! \param c The character to remove. - //! \return A reference to our current string. - ustring16<TAlloc>& remove(uchar32_t c) - { - u32 pos = 0; - u32 found = 0; - u32 len = (c > 0xFFFF ? 2 : 1); // Remove characters equal to the size of c as a UTF-16 character. - for (u32 i=0; i<=used; ++i) - { - uchar32_t uc32 = 0; - if (!UTF16_IS_SURROGATE_HI(array[i])) - uc32 |= array[i]; - else if (i + 1 <= used) - { - // Convert the surrogate pair into a single UTF-32 character. - uc32 = unicode::toUTF32(array[i], array[i + 1]); - } - u32 len2 = (uc32 > 0xFFFF ? 2 : 1); - - if (uc32 == c) - { - found += len; - continue; - } - - array[pos++] = array[i]; - if (len2 == 2) - array[pos++] = array[++i]; - } - used -= found; - array[used] = 0; - return *this; - } - - - //! Removes a ustring16 from the ustring16. - //! \param toRemove The string to remove. - //! \return A reference to our current string. - ustring16<TAlloc>& remove(const ustring16<TAlloc>& toRemove) - { - u32 size = toRemove.size_raw(); - if (size == 0) return *this; - - const uchar16_t* tra = toRemove.c_str(); - u32 pos = 0; - u32 found = 0; - for (u32 i=0; i<=used; ++i) - { - u32 j = 0; - while (j < size) - { - if (array[i + j] != tra[j]) - break; - ++j; - } - if (j == size) - { - found += size; - i += size - 1; - continue; - } - - array[pos++] = array[i]; - } - used -= found; - array[used] = 0; - return *this; - } - - - //! Removes characters from the ustring16. - //! \param characters The characters to remove. - //! \return A reference to our current string. - ustring16<TAlloc>& removeChars(const ustring16<TAlloc>& characters) - { - if (characters.size_raw() == 0) - return *this; - - u32 pos = 0; - u32 found = 0; - const_iterator iter(characters); - for (u32 i=0; i<=used; ++i) - { - uchar32_t uc32 = 0; - if (!UTF16_IS_SURROGATE_HI(array[i])) - uc32 |= array[i]; - else if (i + 1 <= used) - { - // Convert the surrogate pair into a single UTF-32 character. - uc32 = unicode::toUTF32(array[i], array[i+1]); - } - u32 len2 = (uc32 > 0xFFFF ? 2 : 1); - - bool cont = false; - iter.toStart(); - while (!iter.atEnd()) - { - uchar32_t c = *iter; - if (uc32 == c) - { - found += (c > 0xFFFF ? 2 : 1); // Remove characters equal to the size of c as a UTF-16 character. - ++i; - cont = true; - break; - } - ++iter; - } - if (cont) continue; - - array[pos++] = array[i]; - if (len2 == 2) - array[pos++] = array[++i]; - } - used -= found; - array[used] = 0; - return *this; - } - - - //! Trims the ustring16. - //! Removes the specified characters (by default, Latin-1 whitespace) from the begining and the end of the ustring16. - //! \param whitespace The characters that are to be considered as whitespace. - //! \return A reference to our current string. - ustring16<TAlloc>& trim(const ustring16<TAlloc>& whitespace = " \t\n\r") - { - core::array<uchar32_t> utf32white = whitespace.toUTF32(); - - // find start and end of the substring without the specified characters - const s32 begin = findFirstCharNotInList(utf32white.const_pointer(), whitespace.used + 1); - if (begin == -1) - return (*this=""); - - const s32 end = findLastCharNotInList(utf32white.const_pointer(), whitespace.used + 1); - - return (*this = subString(begin, (end +1) - begin)); - } - - - //! Erases a character from the ustring16. - //! May be slow, because all elements following after the erased element have to be copied. - //! \param index Index of element to be erased. - //! \return A reference to our current string. - ustring16<TAlloc>& erase(u32 index) - { - _IRR_DEBUG_BREAK_IF(index>used) // access violation - - iterator i(*this, index); - - uchar32_t t = *i; - u32 len = (t > 0xFFFF ? 2 : 1); - - for (u32 j = static_cast<u32>(i.getPos()) + len; j <= used; ++j) - array[j - len] = array[j]; - - used -= len; - array[used] = 0; - - return *this; - } - - - //! Validate the existing ustring16, checking for valid surrogate pairs and checking for proper termination. - //! \return A reference to our current string. - ustring16<TAlloc>& validate() - { - // Validate all unicode characters. - for (u32 i=0; i<allocated; ++i) - { - // Terminate on existing null. - if (array[i] == 0) - { - used = i; - return *this; - } - if (UTF16_IS_SURROGATE(array[i])) - { - if (((i+1) >= allocated) || UTF16_IS_SURROGATE_LO(array[i])) - array[i] = unicode::UTF_REPLACEMENT_CHARACTER; - else if (UTF16_IS_SURROGATE_HI(array[i]) && !UTF16_IS_SURROGATE_LO(array[i+1])) - array[i] = unicode::UTF_REPLACEMENT_CHARACTER; - ++i; - } - if (array[i] >= 0xFDD0 && array[i] <= 0xFDEF) - array[i] = unicode::UTF_REPLACEMENT_CHARACTER; - } - - // terminate - used = 0; - if (allocated > 0) - { - used = allocated - 1; - array[used] = 0; - } - return *this; - } - - - //! Gets the last char of the ustring16, or 0. - //! \return The last char of the ustring16, or 0. - uchar32_t lastChar() const - { - if (used < 1) - return 0; - - if (UTF16_IS_SURROGATE_LO(array[used-1])) - { - // Make sure we have a paired surrogate. - if (used < 2) - return 0; - - // Check for an invalid surrogate. - if (!UTF16_IS_SURROGATE_HI(array[used-2])) - return 0; - - // Convert the surrogate pair into a single UTF-32 character. - return unicode::toUTF32(array[used-2], array[used-1]); - } - else - { - return array[used-1]; - } - } - - - //! Split the ustring16 into parts. - /** This method will split a ustring16 at certain delimiter characters - into the container passed in as reference. The type of the container - has to be given as template parameter. It must provide a push_back and - a size method. - \param ret The result container - \param c C-style ustring16 of delimiter characters - \param count Number of delimiter characters - \param ignoreEmptyTokens Flag to avoid empty substrings in the result - container. If two delimiters occur without a character in between, an - empty substring would be placed in the result. If this flag is set, - only non-empty strings are stored. - \param keepSeparators Flag which allows to add the separator to the - result ustring16. If this flag is true, the concatenation of the - substrings results in the original ustring16. Otherwise, only the - characters between the delimiters are returned. - \return The number of resulting substrings - */ - template<class container> - u32 split(container& ret, const uchar32_t* const c, u32 count=1, bool ignoreEmptyTokens=true, bool keepSeparators=false) const - { - if (!c) - return 0; - - const_iterator i(*this); - const u32 oldSize=ret.size(); - u32 pos = 0; - u32 lastpos = 0; - u32 lastpospos = 0; - bool lastWasSeparator = false; - while (!i.atEnd()) - { - uchar32_t ch = *i; - bool foundSeparator = false; - for (u32 j=0; j<count; ++j) - { - if (ch == c[j]) - { - if ((!ignoreEmptyTokens || pos - lastpos != 0) && - !lastWasSeparator) - ret.push_back(ustring16<TAlloc>(&array[lastpospos], pos - lastpos)); - foundSeparator = true; - lastpos = (keepSeparators ? pos : pos + 1); - lastpospos = (keepSeparators ? i.getPos() : i.getPos() + 1); - break; - } - } - lastWasSeparator = foundSeparator; - ++pos; - ++i; - } - u32 s = size() + 1; - if (s > lastpos) - ret.push_back(ustring16<TAlloc>(&array[lastpospos], s - lastpos)); - return ret.size()-oldSize; - } - - - //! Split the ustring16 into parts. - /** This method will split a ustring16 at certain delimiter characters - into the container passed in as reference. The type of the container - has to be given as template parameter. It must provide a push_back and - a size method. - \param ret The result container - \param c A unicode string of delimiter characters - \param ignoreEmptyTokens Flag to avoid empty substrings in the result - container. If two delimiters occur without a character in between, an - empty substring would be placed in the result. If this flag is set, - only non-empty strings are stored. - \param keepSeparators Flag which allows to add the separator to the - result ustring16. If this flag is true, the concatenation of the - substrings results in the original ustring16. Otherwise, only the - characters between the delimiters are returned. - \return The number of resulting substrings - */ - template<class container> - u32 split(container& ret, const ustring16<TAlloc>& c, bool ignoreEmptyTokens=true, bool keepSeparators=false) const - { - core::array<uchar32_t> v = c.toUTF32(); - return split(ret, v.pointer(), v.size(), ignoreEmptyTokens, keepSeparators); - } - - - //! Gets the size of the allocated memory buffer for the string. - //! \return The size of the allocated memory buffer. - u32 capacity() const - { - return allocated; - } - - - //! Returns the raw number of UTF-16 code points in the string which includes the individual surrogates. - //! \return The raw number of UTF-16 code points, excluding the trialing NUL. - u32 size_raw() const - { - return used; - } - - - //! Inserts a character into the string. - //! \param c The character to insert. - //! \param pos The position to insert the character. - //! \return A reference to our current string. - ustring16<TAlloc>& insert(uchar32_t c, u32 pos) - { - u8 len = (c > 0xFFFF ? 2 : 1); - - if (used + len >= allocated) - reallocate(used + len); - - used += len; - - iterator iter(*this, pos); - for (u32 i = used - 2; i > iter.getPos(); --i) - array[i] = array[i - len]; - - if (c > 0xFFFF) - { - // c will be multibyte, so split it up into a surrogate pair. - uchar16_t x = static_cast<uchar16_t>(c); - uchar16_t vh = UTF16_HI_SURROGATE | ((((c >> 16) & ((1 << 5) - 1)) - 1) << 6) | (x >> 10); - uchar16_t vl = UTF16_LO_SURROGATE | (x & ((1 << 10) - 1)); - array[iter.getPos()] = vh; - array[iter.getPos()+1] = vl; - } - else - { - array[iter.getPos()] = static_cast<uchar16_t>(c); - } - array[used] = 0; - return *this; - } - - - //! Inserts a string into the string. - //! \param c The string to insert. - //! \param pos The position to insert the string. - //! \return A reference to our current string. - ustring16<TAlloc>& insert(const ustring16<TAlloc>& c, u32 pos) - { - u32 len = c.size_raw(); - if (len == 0) return *this; - - if (used + len >= allocated) - reallocate(used + len); - - used += len; - - iterator iter(*this, pos); - for (u32 i = used - 2; i > iter.getPos() + len; --i) - array[i] = array[i - len]; - - const uchar16_t* s = c.c_str(); - for (u32 i = 0; i < len; ++i) - { - array[pos++] = *s; - ++s; - } - - array[used] = 0; - return *this; - } - - - //! Inserts a character into the string. - //! \param c The character to insert. - //! \param pos The position to insert the character. - //! \return A reference to our current string. - ustring16<TAlloc>& insert_raw(uchar16_t c, u32 pos) - { - if (used + 1 >= allocated) - reallocate(used + 1); - - ++used; - - for (u32 i = used - 1; i > pos; --i) - array[i] = array[i - 1]; - - array[pos] = c; - array[used] = 0; - return *this; - } - - - //! Removes a character from string. - //! \param pos Position of the character to remove. - //! \return A reference to our current string. - ustring16<TAlloc>& erase_raw(u32 pos) - { - for (u32 i=pos; i<=used; ++i) - { - array[i] = array[i + 1]; - } - --used; - array[used] = 0; - return *this; - } - - - //! Replaces a character in the string. - //! \param c The new character. - //! \param pos The position of the character to replace. - //! \return A reference to our current string. - ustring16<TAlloc>& replace_raw(uchar16_t c, u32 pos) - { - array[pos] = c; - return *this; - } - - - //! Returns an iterator to the beginning of the string. - //! \return An iterator to the beginning of the string. - iterator begin() - { - iterator i(*this, 0); - return i; - } - - - //! Returns an iterator to the beginning of the string. - //! \return An iterator to the beginning of the string. - const_iterator begin() const - { - const_iterator i(*this, 0); - return i; - } - - - //! Returns an iterator to the beginning of the string. - //! \return An iterator to the beginning of the string. - const_iterator cbegin() const - { - const_iterator i(*this, 0); - return i; - } - - - //! Returns an iterator to the end of the string. - //! \return An iterator to the end of the string. - iterator end() - { - iterator i(*this, 0); - i.toEnd(); - return i; - } - - - //! Returns an iterator to the end of the string. - //! \return An iterator to the end of the string. - const_iterator end() const - { - const_iterator i(*this, 0); - i.toEnd(); - return i; - } - - - //! Returns an iterator to the end of the string. - //! \return An iterator to the end of the string. - const_iterator cend() const - { - const_iterator i(*this, 0); - i.toEnd(); - return i; - } - - - //! Converts the string to a UTF-8 encoded string. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return A string containing the UTF-8 encoded string. - core::string<uchar8_t> toUTF8_s(const bool addBOM = false) const - { - core::string<uchar8_t> ret; - ret.reserve(used * 4 + (addBOM ? unicode::BOM_UTF8_LEN : 0) + 1); - const_iterator iter(*this, 0); - - // Add the byte order mark if the user wants it. - if (addBOM) - { - ret.append(unicode::BOM_ENCODE_UTF8[0]); - ret.append(unicode::BOM_ENCODE_UTF8[1]); - ret.append(unicode::BOM_ENCODE_UTF8[2]); - } - - while (!iter.atEnd()) - { - uchar32_t c = *iter; - if (c > 0xFFFF) - { // 4 bytes - uchar8_t b1 = (0x1E << 3) | ((c >> 18) & 0x7); - uchar8_t b2 = (0x2 << 6) | ((c >> 12) & 0x3F); - uchar8_t b3 = (0x2 << 6) | ((c >> 6) & 0x3F); - uchar8_t b4 = (0x2 << 6) | (c & 0x3F); - ret.append(b1); - ret.append(b2); - ret.append(b3); - ret.append(b4); - } - else if (c > 0x7FF) - { // 3 bytes - uchar8_t b1 = (0xE << 4) | ((c >> 12) & 0xF); - uchar8_t b2 = (0x2 << 6) | ((c >> 6) & 0x3F); - uchar8_t b3 = (0x2 << 6) | (c & 0x3F); - ret.append(b1); - ret.append(b2); - ret.append(b3); - } - else if (c > 0x7F) - { // 2 bytes - uchar8_t b1 = (0x6 << 5) | ((c >> 6) & 0x1F); - uchar8_t b2 = (0x2 << 6) | (c & 0x3F); - ret.append(b1); - ret.append(b2); - } - else - { // 1 byte - ret.append(static_cast<uchar8_t>(c)); - } - ++iter; - } - return ret; - } - - - //! Converts the string to a UTF-8 encoded string array. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return An array containing the UTF-8 encoded string. - core::array<uchar8_t> toUTF8(const bool addBOM = false) const - { - core::array<uchar8_t> ret(used * 4 + (addBOM ? unicode::BOM_UTF8_LEN : 0) + 1); - const_iterator iter(*this, 0); - - // Add the byte order mark if the user wants it. - if (addBOM) - { - ret.push_back(unicode::BOM_ENCODE_UTF8[0]); - ret.push_back(unicode::BOM_ENCODE_UTF8[1]); - ret.push_back(unicode::BOM_ENCODE_UTF8[2]); - } - - while (!iter.atEnd()) - { - uchar32_t c = *iter; - if (c > 0xFFFF) - { // 4 bytes - uchar8_t b1 = (0x1E << 3) | ((c >> 18) & 0x7); - uchar8_t b2 = (0x2 << 6) | ((c >> 12) & 0x3F); - uchar8_t b3 = (0x2 << 6) | ((c >> 6) & 0x3F); - uchar8_t b4 = (0x2 << 6) | (c & 0x3F); - ret.push_back(b1); - ret.push_back(b2); - ret.push_back(b3); - ret.push_back(b4); - } - else if (c > 0x7FF) - { // 3 bytes - uchar8_t b1 = (0xE << 4) | ((c >> 12) & 0xF); - uchar8_t b2 = (0x2 << 6) | ((c >> 6) & 0x3F); - uchar8_t b3 = (0x2 << 6) | (c & 0x3F); - ret.push_back(b1); - ret.push_back(b2); - ret.push_back(b3); - } - else if (c > 0x7F) - { // 2 bytes - uchar8_t b1 = (0x6 << 5) | ((c >> 6) & 0x1F); - uchar8_t b2 = (0x2 << 6) | (c & 0x3F); - ret.push_back(b1); - ret.push_back(b2); - } - else - { // 1 byte - ret.push_back(static_cast<uchar8_t>(c)); - } - ++iter; - } - ret.push_back(0); - return ret; - } - - -#ifdef USTRING_CPP0X_NEWLITERALS // C++0x - //! Converts the string to a UTF-16 encoded string. - //! \param endian The desired endianness of the string. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return A string containing the UTF-16 encoded string. - core::string<char16_t> toUTF16_s(const unicode::EUTF_ENDIAN endian = unicode::EUTFEE_NATIVE, const bool addBOM = false) const - { - core::string<char16_t> ret; - ret.reserve(used + (addBOM ? unicode::BOM_UTF16_LEN : 0) + 1); - - // Add the BOM if specified. - if (addBOM) - { - if (endian == unicode::EUTFEE_NATIVE) - ret[0] = unicode::BOM; - else if (endian == unicode::EUTFEE_LITTLE) - { - uchar8_t* ptr8 = reinterpret_cast<uchar8_t*>(&ret[0]); - *ptr8++ = unicode::BOM_ENCODE_UTF16_LE[0]; - *ptr8 = unicode::BOM_ENCODE_UTF16_LE[1]; - } - else - { - uchar8_t* ptr8 = reinterpret_cast<uchar8_t*>(&ret[0]); - *ptr8++ = unicode::BOM_ENCODE_UTF16_BE[0]; - *ptr8 = unicode::BOM_ENCODE_UTF16_BE[1]; - } - } - - ret.append(array); - if (endian != unicode::EUTFEE_NATIVE && getEndianness() != endian) - { - char16_t* ptr = ret.c_str(); - for (u32 i = 0; i < ret.size(); ++i) - *ptr++ = unicode::swapEndian16(*ptr); - } - return ret; - } -#endif - - - //! Converts the string to a UTF-16 encoded string array. - //! Unfortunately, no toUTF16_s() version exists due to limitations with Irrlicht's string class. - //! \param endian The desired endianness of the string. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return An array containing the UTF-16 encoded string. - core::array<uchar16_t> toUTF16(const unicode::EUTF_ENDIAN endian = unicode::EUTFEE_NATIVE, const bool addBOM = false) const - { - core::array<uchar16_t> ret(used + (addBOM ? unicode::BOM_UTF16_LEN : 0) + 1); - uchar16_t* ptr = ret.pointer(); - - // Add the BOM if specified. - if (addBOM) - { - if (endian == unicode::EUTFEE_NATIVE) - *ptr = unicode::BOM; - else if (endian == unicode::EUTFEE_LITTLE) - { - uchar8_t* ptr8 = reinterpret_cast<uchar8_t*>(ptr); - *ptr8++ = unicode::BOM_ENCODE_UTF16_LE[0]; - *ptr8 = unicode::BOM_ENCODE_UTF16_LE[1]; - } - else - { - uchar8_t* ptr8 = reinterpret_cast<uchar8_t*>(ptr); - *ptr8++ = unicode::BOM_ENCODE_UTF16_BE[0]; - *ptr8 = unicode::BOM_ENCODE_UTF16_BE[1]; - } - ++ptr; - } - - memcpy((void*)ptr, (void*)array, used * sizeof(uchar16_t)); - if (endian != unicode::EUTFEE_NATIVE && getEndianness() != endian) - { - for (u32 i = 0; i <= used; ++i) - ptr[i] = unicode::swapEndian16(ptr[i]); - } - ret.set_used(used + (addBOM ? unicode::BOM_UTF16_LEN : 0)); - ret.push_back(0); - return ret; - } - - -#ifdef USTRING_CPP0X_NEWLITERALS // C++0x - //! Converts the string to a UTF-32 encoded string. - //! \param endian The desired endianness of the string. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return A string containing the UTF-32 encoded string. - core::string<char32_t> toUTF32_s(const unicode::EUTF_ENDIAN endian = unicode::EUTFEE_NATIVE, const bool addBOM = false) const - { - core::string<char32_t> ret; - ret.reserve(size() + 1 + (addBOM ? unicode::BOM_UTF32_LEN : 0)); - const_iterator iter(*this, 0); - - // Add the BOM if specified. - if (addBOM) - { - if (endian == unicode::EUTFEE_NATIVE) - ret.append(unicode::BOM); - else - { - union - { - uchar32_t full; - u8 chunk[4]; - } t; - - if (endian == unicode::EUTFEE_LITTLE) - { - t.chunk[0] = unicode::BOM_ENCODE_UTF32_LE[0]; - t.chunk[1] = unicode::BOM_ENCODE_UTF32_LE[1]; - t.chunk[2] = unicode::BOM_ENCODE_UTF32_LE[2]; - t.chunk[3] = unicode::BOM_ENCODE_UTF32_LE[3]; - } - else - { - t.chunk[0] = unicode::BOM_ENCODE_UTF32_BE[0]; - t.chunk[1] = unicode::BOM_ENCODE_UTF32_BE[1]; - t.chunk[2] = unicode::BOM_ENCODE_UTF32_BE[2]; - t.chunk[3] = unicode::BOM_ENCODE_UTF32_BE[3]; - } - ret.append(t.full); - } - } - - while (!iter.atEnd()) - { - uchar32_t c = *iter; - if (endian != unicode::EUTFEE_NATIVE && getEndianness() != endian) - c = unicode::swapEndian32(c); - ret.append(c); - ++iter; - } - return ret; - } -#endif - - - //! Converts the string to a UTF-32 encoded string array. - //! Unfortunately, no toUTF32_s() version exists due to limitations with Irrlicht's string class. - //! \param endian The desired endianness of the string. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return An array containing the UTF-32 encoded string. - core::array<uchar32_t> toUTF32(const unicode::EUTF_ENDIAN endian = unicode::EUTFEE_NATIVE, const bool addBOM = false) const - { - core::array<uchar32_t> ret(size() + (addBOM ? unicode::BOM_UTF32_LEN : 0) + 1); - const_iterator iter(*this, 0); - - // Add the BOM if specified. - if (addBOM) - { - if (endian == unicode::EUTFEE_NATIVE) - ret.push_back(unicode::BOM); - else - { - union - { - uchar32_t full; - u8 chunk[4]; - } t; - - if (endian == unicode::EUTFEE_LITTLE) - { - t.chunk[0] = unicode::BOM_ENCODE_UTF32_LE[0]; - t.chunk[1] = unicode::BOM_ENCODE_UTF32_LE[1]; - t.chunk[2] = unicode::BOM_ENCODE_UTF32_LE[2]; - t.chunk[3] = unicode::BOM_ENCODE_UTF32_LE[3]; - } - else - { - t.chunk[0] = unicode::BOM_ENCODE_UTF32_BE[0]; - t.chunk[1] = unicode::BOM_ENCODE_UTF32_BE[1]; - t.chunk[2] = unicode::BOM_ENCODE_UTF32_BE[2]; - t.chunk[3] = unicode::BOM_ENCODE_UTF32_BE[3]; - } - ret.push_back(t.full); - } - } - ret.push_back(0); - - while (!iter.atEnd()) - { - uchar32_t c = *iter; - if (endian != unicode::EUTFEE_NATIVE && getEndianness() != endian) - c = unicode::swapEndian32(c); - ret.push_back(c); - ++iter; - } - return ret; - } - - - //! Converts the string to a wchar_t encoded string. - /** The size of a wchar_t changes depending on the platform. This function will store a - correct UTF-8, -16, or -32 encoded string depending on the size of a wchar_t. **/ - //! \param endian The desired endianness of the string. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return A string containing the wchar_t encoded string. - core::string<wchar_t> toWCHAR_s(const unicode::EUTF_ENDIAN endian = unicode::EUTFEE_NATIVE, const bool addBOM = false) const - { - if (sizeof(wchar_t) == 4) - { - core::array<uchar32_t> a(toUTF32(endian, addBOM)); - core::stringw ret(a.pointer()); - return ret; - } - else if (sizeof(wchar_t) == 2) - { - if (endian == unicode::EUTFEE_NATIVE && addBOM == false) - { - core::stringw ret(array); - return ret; - } - else - { - core::array<uchar16_t> a(toUTF16(endian, addBOM)); - core::stringw ret(a.pointer()); - return ret; - } - } - else if (sizeof(wchar_t) == 1) - { - core::array<uchar8_t> a(toUTF8(addBOM)); - core::stringw ret(a.pointer()); - return ret; - } - - // Shouldn't happen. - return core::stringw(); - } - - - //! Converts the string to a wchar_t encoded string array. - /** The size of a wchar_t changes depending on the platform. This function will store a - correct UTF-8, -16, or -32 encoded string depending on the size of a wchar_t. **/ - //! \param endian The desired endianness of the string. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return An array containing the wchar_t encoded string. - core::array<wchar_t> toWCHAR(const unicode::EUTF_ENDIAN endian = unicode::EUTFEE_NATIVE, const bool addBOM = false) const - { - if (sizeof(wchar_t) == 4) - { - core::array<uchar32_t> a(toUTF32(endian, addBOM)); - core::array<wchar_t> ret(a.size()); - ret.set_used(a.size()); - memcpy((void*)ret.pointer(), (void*)a.pointer(), a.size() * sizeof(uchar32_t)); - return ret; - } - if (sizeof(wchar_t) == 2) - { - if (endian == unicode::EUTFEE_NATIVE && addBOM == false) - { - core::array<wchar_t> ret(used); - ret.set_used(used); - memcpy((void*)ret.pointer(), (void*)array, used * sizeof(uchar16_t)); - return ret; - } - else - { - core::array<uchar16_t> a(toUTF16(endian, addBOM)); - core::array<wchar_t> ret(a.size()); - ret.set_used(a.size()); - memcpy((void*)ret.pointer(), (void*)a.pointer(), a.size() * sizeof(uchar16_t)); - return ret; - } - } - if (sizeof(wchar_t) == 1) - { - core::array<uchar8_t> a(toUTF8(addBOM)); - core::array<wchar_t> ret(a.size()); - ret.set_used(a.size()); - memcpy((void*)ret.pointer(), (void*)a.pointer(), a.size() * sizeof(uchar8_t)); - return ret; - } - - // Shouldn't happen. - return core::array<wchar_t>(); - } - - //! Converts the string to a properly encoded io::path string. - //! \param endian The desired endianness of the string. - //! \param addBOM If true, the proper unicode byte-order mark will be prefixed to the string. - //! \return An io::path string containing the properly encoded string. - io::path toPATH_s(const unicode::EUTF_ENDIAN endian = unicode::EUTFEE_NATIVE, const bool addBOM = false) const - { -#if defined(_IRR_WCHAR_FILESYSTEM) - return toWCHAR_s(endian, addBOM); -#else - return toUTF8_s(addBOM); -#endif - } - - //! Loads an unknown stream of data. - //! Will attempt to determine if the stream is unicode data. Useful for loading from files. - //! \param data The data stream to load from. - //! \param data_size The length of the data string. - //! \return A reference to our current string. - ustring16<TAlloc>& loadDataStream(const char* data, size_t data_size) - { - // Clear our string. - *this = ""; - if (!data) - return *this; - - unicode::EUTF_ENCODE e = unicode::determineUnicodeBOM(data); - switch (e) - { - default: - case unicode::EUTFE_UTF8: - append((uchar8_t*)data, data_size); - break; - - case unicode::EUTFE_UTF16: - case unicode::EUTFE_UTF16_BE: - case unicode::EUTFE_UTF16_LE: - append((uchar16_t*)data, data_size / 2); - break; - - case unicode::EUTFE_UTF32: - case unicode::EUTFE_UTF32_BE: - case unicode::EUTFE_UTF32_LE: - append((uchar32_t*)data, data_size / 4); - break; - } - - return *this; - } - - //! Gets the encoding of the Unicode string this class contains. - //! \return An enum describing the current encoding of this string. - const unicode::EUTF_ENCODE getEncoding() const - { - return encoding; - } - - //! Gets the endianness of the Unicode string this class contains. - //! \return An enum describing the endianness of this string. - const unicode::EUTF_ENDIAN getEndianness() const - { - if (encoding == unicode::EUTFE_UTF16_LE || - encoding == unicode::EUTFE_UTF32_LE) - return unicode::EUTFEE_LITTLE; - else return unicode::EUTFEE_BIG; - } - -private: - - //! Reallocate the string, making it bigger or smaller. - //! \param new_size The new size of the string. - void reallocate(u32 new_size) - { - uchar16_t* old_array = array; - - array = allocator.allocate(new_size + 1); //new u16[new_size]; - allocated = new_size + 1; - if (old_array == 0) return; - - u32 amount = used < new_size ? used : new_size; - for (u32 i=0; i<=amount; ++i) - array[i] = old_array[i]; - - if (allocated <= used) - used = allocated - 1; - - array[used] = 0; - - allocator.deallocate(old_array); // delete [] old_array; - } - - //--- member variables - - uchar16_t* array; - unicode::EUTF_ENCODE encoding; - u32 allocated; - u32 used; - TAlloc allocator; - //irrAllocator<uchar16_t> allocator; -}; - -typedef ustring16<irrAllocator<uchar16_t> > ustring; - - -//! Appends two ustring16s. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a null-terminated unicode string. -template <typename TAlloc, class B> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const B* const right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a null-terminated unicode string. -template <class B, typename TAlloc> -inline ustring16<TAlloc> operator+(const B* const left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and an Irrlicht string. -template <typename TAlloc, typename B, typename BAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const string<B, BAlloc>& right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and an Irrlicht string. -template <typename TAlloc, typename B, typename BAlloc> -inline ustring16<TAlloc> operator+(const string<B, BAlloc>& left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a std::basic_string. -template <typename TAlloc, typename B, typename A, typename BAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const std::basic_string<B, A, BAlloc>& right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a std::basic_string. -template <typename TAlloc, typename B, typename A, typename BAlloc> -inline ustring16<TAlloc> operator+(const std::basic_string<B, A, BAlloc>& left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a char. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const char right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a char. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const char left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -#ifdef USTRING_CPP0X_NEWLITERALS -//! Appends a ustring16 and a uchar32_t. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const uchar32_t right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a uchar32_t. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const uchar32_t left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret(left); - ret += right; - return ret; -} -#endif - - -//! Appends a ustring16 and a short. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const short right) -{ - ustring16<TAlloc> ret(left); - ret += core::stringc(right); - return ret; -} - - -//! Appends a ustring16 and a short. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const short left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret((core::stringc(left))); - ret += right; - return ret; -} - - -//! Appends a ustring16 and an unsigned short. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const unsigned short right) -{ - ustring16<TAlloc> ret(left); - ret += core::stringc(right); - return ret; -} - - -//! Appends a ustring16 and an unsigned short. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const unsigned short left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret((core::stringc(left))); - ret += right; - return ret; -} - - -//! Appends a ustring16 and an int. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const int right) -{ - ustring16<TAlloc> ret(left); - ret += core::stringc(right); - return ret; -} - - -//! Appends a ustring16 and an int. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const int left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret((core::stringc(left))); - ret += right; - return ret; -} - - -//! Appends a ustring16 and an unsigned int. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const unsigned int right) -{ - ustring16<TAlloc> ret(left); - ret += core::stringc(right); - return ret; -} - - -//! Appends a ustring16 and an unsigned int. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const unsigned int left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret((core::stringc(left))); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a long. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const long right) -{ - ustring16<TAlloc> ret(left); - ret += core::stringc(right); - return ret; -} - - -//! Appends a ustring16 and a long. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const long left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret((core::stringc(left))); - ret += right; - return ret; -} - - -//! Appends a ustring16 and an unsigned long. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const unsigned long right) -{ - ustring16<TAlloc> ret(left); - ret += core::stringc(right); - return ret; -} - - -//! Appends a ustring16 and an unsigned long. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const unsigned long left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret((core::stringc(left))); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a float. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const float right) -{ - ustring16<TAlloc> ret(left); - ret += core::stringc(right); - return ret; -} - - -//! Appends a ustring16 and a float. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const float left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret((core::stringc(left))); - ret += right; - return ret; -} - - -//! Appends a ustring16 and a double. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const ustring16<TAlloc>& left, const double right) -{ - ustring16<TAlloc> ret(left); - ret += core::stringc(right); - return ret; -} - - -//! Appends a ustring16 and a double. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const double left, const ustring16<TAlloc>& right) -{ - ustring16<TAlloc> ret((core::stringc(left))); - ret += right; - return ret; -} - - -#ifdef USTRING_CPP0X -//! Appends two ustring16s. -template <typename TAlloc> -inline ustring16<TAlloc>&& operator+(const ustring16<TAlloc>& left, ustring16<TAlloc>&& right) -{ - //std::cout << "MOVE operator+(&, &&)" << std::endl; - right.insert(left, 0); - return std::move(right); -} - - -//! Appends two ustring16s. -template <typename TAlloc> -inline ustring16<TAlloc>&& operator+(ustring16<TAlloc>&& left, const ustring16<TAlloc>& right) -{ - //std::cout << "MOVE operator+(&&, &)" << std::endl; - left.append(right); - return std::move(left); -} - - -//! Appends two ustring16s. -template <typename TAlloc> -inline ustring16<TAlloc>&& operator+(ustring16<TAlloc>&& left, ustring16<TAlloc>&& right) -{ - //std::cout << "MOVE operator+(&&, &&)" << std::endl; - if ((right.size_raw() <= left.capacity() - left.size_raw()) || - (right.capacity() - right.size_raw() < left.size_raw())) - { - left.append(right); - return std::move(left); - } - else - { - right.insert(left, 0); - return std::move(right); - } -} - - -//! Appends a ustring16 and a null-terminated unicode string. -template <typename TAlloc, class B> -inline ustring16<TAlloc>&& operator+(ustring16<TAlloc>&& left, const B* const right) -{ - //std::cout << "MOVE operator+(&&, B*)" << std::endl; - left.append(right); - return std::move(left); -} - - -//! Appends a ustring16 and a null-terminated unicode string. -template <class B, typename TAlloc> -inline ustring16<TAlloc>&& operator+(const B* const left, ustring16<TAlloc>&& right) -{ - //std::cout << "MOVE operator+(B*, &&)" << std::endl; - right.insert(left, 0); - return std::move(right); -} - - -//! Appends a ustring16 and an Irrlicht string. -template <typename TAlloc, typename B, typename BAlloc> -inline ustring16<TAlloc>&& operator+(const string<B, BAlloc>& left, ustring16<TAlloc>&& right) -{ - //std::cout << "MOVE operator+(&, &&)" << std::endl; - right.insert(left, 0); - return std::move(right); -} - - -//! Appends a ustring16 and an Irrlicht string. -template <typename TAlloc, typename B, typename BAlloc> -inline ustring16<TAlloc>&& operator+(ustring16<TAlloc>&& left, const string<B, BAlloc>& right) -{ - //std::cout << "MOVE operator+(&&, &)" << std::endl; - left.append(right); - return std::move(left); -} - - -//! Appends a ustring16 and a std::basic_string. -template <typename TAlloc, typename B, typename A, typename BAlloc> -inline ustring16<TAlloc>&& operator+(const std::basic_string<B, A, BAlloc>& left, ustring16<TAlloc>&& right) -{ - //std::cout << "MOVE operator+(&, &&)" << std::endl; - right.insert(core::ustring16<TAlloc>(left), 0); - return std::move(right); -} - - -//! Appends a ustring16 and a std::basic_string. -template <typename TAlloc, typename B, typename A, typename BAlloc> -inline ustring16<TAlloc>&& operator+(ustring16<TAlloc>&& left, const std::basic_string<B, A, BAlloc>& right) -{ - //std::cout << "MOVE operator+(&&, &)" << std::endl; - left.append(right); - return std::move(left); -} - - -//! Appends a ustring16 and a char. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const char right) -{ - left.append((uchar32_t)right); - return std::move(left); -} - - -//! Appends a ustring16 and a char. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const char left, ustring16<TAlloc>&& right) -{ - right.insert((uchar32_t)left, 0); - return std::move(right); -} - - -#ifdef USTRING_CPP0X_NEWLITERALS -//! Appends a ustring16 and a uchar32_t. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const uchar32_t right) -{ - left.append(right); - return std::move(left); -} - - -//! Appends a ustring16 and a uchar32_t. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const uchar32_t left, ustring16<TAlloc>&& right) -{ - right.insert(left, 0); - return std::move(right); -} -#endif - - -//! Appends a ustring16 and a short. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const short right) -{ - left.append(core::stringc(right)); - return std::move(left); -} - - -//! Appends a ustring16 and a short. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const short left, ustring16<TAlloc>&& right) -{ - right.insert(core::stringc(left), 0); - return std::move(right); -} - - -//! Appends a ustring16 and an unsigned short. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const unsigned short right) -{ - left.append(core::stringc(right)); - return std::move(left); -} - - -//! Appends a ustring16 and an unsigned short. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const unsigned short left, ustring16<TAlloc>&& right) -{ - right.insert(core::stringc(left), 0); - return std::move(right); -} - - -//! Appends a ustring16 and an int. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const int right) -{ - left.append(core::stringc(right)); - return std::move(left); -} - - -//! Appends a ustring16 and an int. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const int left, ustring16<TAlloc>&& right) -{ - right.insert(core::stringc(left), 0); - return std::move(right); -} - - -//! Appends a ustring16 and an unsigned int. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const unsigned int right) -{ - left.append(core::stringc(right)); - return std::move(left); -} - - -//! Appends a ustring16 and an unsigned int. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const unsigned int left, ustring16<TAlloc>&& right) -{ - right.insert(core::stringc(left), 0); - return std::move(right); -} - - -//! Appends a ustring16 and a long. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const long right) -{ - left.append(core::stringc(right)); - return std::move(left); -} - - -//! Appends a ustring16 and a long. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const long left, ustring16<TAlloc>&& right) -{ - right.insert(core::stringc(left), 0); - return std::move(right); -} - - -//! Appends a ustring16 and an unsigned long. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const unsigned long right) -{ - left.append(core::stringc(right)); - return std::move(left); -} - - -//! Appends a ustring16 and an unsigned long. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const unsigned long left, ustring16<TAlloc>&& right) -{ - right.insert(core::stringc(left), 0); - return std::move(right); -} - - -//! Appends a ustring16 and a float. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const float right) -{ - left.append(core::stringc(right)); - return std::move(left); -} - - -//! Appends a ustring16 and a float. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const float left, ustring16<TAlloc>&& right) -{ - right.insert(core::stringc(left), 0); - return std::move(right); -} - - -//! Appends a ustring16 and a double. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(ustring16<TAlloc>&& left, const double right) -{ - left.append(core::stringc(right)); - return std::move(left); -} - - -//! Appends a ustring16 and a double. -template <typename TAlloc> -inline ustring16<TAlloc> operator+(const double left, ustring16<TAlloc>&& right) -{ - right.insert(core::stringc(left), 0); - return std::move(right); -} -#endif - - -#ifndef USTRING_NO_STL -//! Writes a ustring16 to an ostream. -template <typename TAlloc> -inline std::ostream& operator<<(std::ostream& out, const ustring16<TAlloc>& in) -{ - out << in.toUTF8_s().c_str(); - return out; -} - -//! Writes a ustring16 to a wostream. -template <typename TAlloc> -inline std::wostream& operator<<(std::wostream& out, const ustring16<TAlloc>& in) -{ - out << in.toWCHAR_s().c_str(); - return out; -} -#endif - - -#ifndef USTRING_NO_STL - -namespace unicode -{ - -//! Hashing algorithm for hashing a ustring. Used for things like unordered_maps. -//! Algorithm taken from std::hash<std::string>. -class hash : public std::unary_function<core::ustring, size_t> -{ - public: - size_t operator()(const core::ustring& s) const - { - size_t ret = 2166136261U; - size_t index = 0; - size_t stride = 1 + s.size_raw() / 10; - - core::ustring::const_iterator i = s.begin(); - while (i != s.end()) - { - // TODO: Don't force u32 on an x64 OS. Make it agnostic. - ret = 16777619U * ret ^ (size_t)s[(u32)index]; - index += stride; - i += stride; - } - return (ret); - } -}; - -} // end namespace unicode - -#endif - -} // end namespace core -} // end namespace irr diff --git a/src/irrlicht_changes/static_text.cpp b/src/irrlicht_changes/static_text.cpp index bf61cd64e..a4749bab1 100644 --- a/src/irrlicht_changes/static_text.cpp +++ b/src/irrlicht_changes/static_text.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2002-2012 Nikolaus Gebhardt -// Copyright (C) 2016 Nathanaël Courant: +// Copyright (C) 2016 Nathanaëlle Courant: // Modified the functions to use EnrichedText instead of string. // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h @@ -12,17 +12,12 @@ #include <rect.h> #include <SColor.h> -#if USE_FREETYPE - #include "CGUITTFont.h" -#endif - +#include "CGUITTFont.h" #include "util/string.h" namespace irr { -#if USE_FREETYPE - namespace gui { //! constructor @@ -108,19 +103,12 @@ void StaticText::draw() font->getDimension(str.c_str()).Width; } - //str = colorizeText(BrokenText[i].c_str(), colors, previous_color); - //if (!colors.empty()) - // previous_color = colors[colors.size() - 1]; - -#if USE_FREETYPE if (font->getType() == irr::gui::EGFT_CUSTOM) { - irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(font); + CGUITTFont *tmp = static_cast<CGUITTFont*>(font); tmp->draw(str, - r, previous_color, // FIXME - HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER, + r, HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER, (RestrainTextInside ? &AbsoluteClippingRect : NULL)); } else -#endif { // Draw non-colored text font->draw(str.c_str(), @@ -246,15 +234,17 @@ void StaticText::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vert } -#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7 -const video::SColor& StaticText::getOverrideColor() const -#else video::SColor StaticText::getOverrideColor() const -#endif { return ColoredText.getDefaultColor(); } +#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 +video::SColor StaticText::getActiveColor() const +{ + return getOverrideColor(); +} +#endif //! Sets if the static text should use the overide color or the //! color in the gui skin. @@ -591,54 +581,8 @@ s32 StaticText::getTextWidth() const } -//! Writes attributes of the element. -//! Implement this to expose the attributes of your element for -//! scripting languages, editors, debuggers or xml serialization purposes. -void StaticText::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const -{ - IGUIStaticText::serializeAttributes(out,options); - - out->addBool ("Border", Border); - out->addBool ("OverrideColorEnabled",true); - out->addBool ("OverrideBGColorEnabled",ColoredText.hasBackground()); - out->addBool ("WordWrap", WordWrap); - out->addBool ("Background", Background); - out->addBool ("RightToLeft", RightToLeft); - out->addBool ("RestrainTextInside", RestrainTextInside); - out->addColor ("OverrideColor", ColoredText.getDefaultColor()); - out->addColor ("BGColor", ColoredText.getBackground()); - out->addEnum ("HTextAlign", HAlign, GUIAlignmentNames); - out->addEnum ("VTextAlign", VAlign, GUIAlignmentNames); - - // out->addFont ("OverrideFont", OverrideFont); -} - - -//! Reads attributes of the element -void StaticText::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) -{ - IGUIStaticText::deserializeAttributes(in,options); - - Border = in->getAttributeAsBool("Border"); - setWordWrap(in->getAttributeAsBool("WordWrap")); - Background = in->getAttributeAsBool("Background"); - RightToLeft = in->getAttributeAsBool("RightToLeft"); - RestrainTextInside = in->getAttributeAsBool("RestrainTextInside"); - if (in->getAttributeAsBool("OverrideColorEnabled")) - ColoredText.setDefaultColor(in->getAttributeAsColor("OverrideColor")); - if (in->getAttributeAsBool("OverrideBGColorEnabled")) - ColoredText.setBackground(in->getAttributeAsColor("BGColor")); - - setTextAlignment( (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("HTextAlign", GUIAlignmentNames), - (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("VTextAlign", GUIAlignmentNames)); - - // OverrideFont = in->getAttributeAsFont("OverrideFont"); -} - } // end namespace gui -#endif // USE_FREETYPE - } // end namespace irr diff --git a/src/irrlicht_changes/static_text.h b/src/irrlicht_changes/static_text.h index 1f111ea56..fc58e3e90 100644 --- a/src/irrlicht_changes/static_text.h +++ b/src/irrlicht_changes/static_text.h @@ -1,5 +1,5 @@ // Copyright (C) 2002-2012 Nikolaus Gebhardt -// Copyright (C) 2016 Nathanaël Courant +// Copyright (C) 2016 Nathanaëlle Courant // Modified this class to work with EnrichedStrings too // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h @@ -20,7 +20,6 @@ #include "config.h" #include <IGUIEnvironment.h> -#if USE_FREETYPE namespace irr { @@ -134,10 +133,11 @@ namespace gui virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical); //! Gets the override color - #if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7 - virtual const video::SColor& getOverrideColor() const; - #else virtual video::SColor getOverrideColor() const; + + #if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8 + //! Gets the currently used text color + virtual video::SColor getActiveColor() const; #endif //! Sets if the static text should use the overide color or the @@ -183,12 +183,6 @@ namespace gui //! Checks if the text should be interpreted as right-to-left text virtual bool isRightToLeft() const; - //! Writes attributes of the element. - virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const; - - //! Reads attributes of the element - virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options); - virtual bool hasType(EGUI_ELEMENT_TYPE t) const { return (t == EGUIET_ENRICHED_STATIC_TEXT) || (t == EGUIET_STATIC_TEXT); }; @@ -235,41 +229,6 @@ inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedS } } -#else // USE_FREETYPE - -namespace irr -{ -namespace gui -{ - -class StaticText -{ -public: - static irr::gui::IGUIStaticText *add( - irr::gui::IGUIEnvironment *guienv, - const EnrichedString &text, - const core::rect< s32 > &rectangle, - bool border = false, - bool wordWrap = true, - irr::gui::IGUIElement *parent = NULL, - s32 id = -1, - bool fillBackground = false) - { - return guienv->addStaticText(text.c_str(), rectangle, border, wordWrap, parent, id, fillBackground); - } -}; - -} // end namespace gui - -} // end namespace irr - -inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedString &text) -{ - static_text->setText(text.c_str()); -} - -#endif - inline void setStaticText(irr::gui::IGUIStaticText *static_text, const wchar_t *text) { setStaticText(static_text, EnrichedString(text, static_text->getOverrideColor())); diff --git a/src/irrlichttypes.h b/src/irrlichttypes.h index 794776b26..93c2d105b 100644 --- a/src/irrlichttypes.h +++ b/src/irrlichttypes.h @@ -19,16 +19,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -/* Ensure that <stdint.h> is included before <irrTypes.h>, unless building on - * MSVC, to address an irrlicht issue: https://sourceforge.net/p/irrlicht/bugs/433/ - * - * TODO: Decide whether or not we support non-compliant C++ compilers like old - * versions of MSCV. If we do not then <stdint.h> can always be included - * regardless of the compiler. +/* + * IrrlichtMt already includes stdint.h in irrTypes.h. This works everywhere + * we need it to (including recent MSVC), so should be fine here too. */ -#ifndef _MSC_VER -# include <cstdint> -#endif +#include <cstdint> #include <irrTypes.h> @@ -36,19 +31,6 @@ using namespace irr; namespace irr { -// Irrlicht 1.8+ defines 64bit unsigned symbol in irrTypes.h -#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) -#ifdef _MSC_VER - // Windows - typedef long long s64; - typedef unsigned long long u64; -#else - // Posix - typedef int64_t s64; - typedef uint64_t u64; -#endif -#endif - #if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR >= 9) namespace core { template <typename T> diff --git a/src/itemdef.cpp b/src/itemdef.cpp index 8e0492827..a34805b8e 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -62,6 +62,7 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def) type = def.type; name = def.name; description = def.description; + short_description = def.short_description; inventory_image = def.inventory_image; inventory_overlay = def.inventory_overlay; wield_image = def.wield_image; @@ -70,13 +71,11 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def) stack_max = def.stack_max; usable = def.usable; liquids_pointable = def.liquids_pointable; - if(def.tool_capabilities) - { - tool_capabilities = new ToolCapabilities( - *def.tool_capabilities); - } + if (def.tool_capabilities) + tool_capabilities = new ToolCapabilities(*def.tool_capabilities); groups = def.groups; node_placement_prediction = def.node_placement_prediction; + place_param2 = def.place_param2; sound_place = def.sound_place; sound_place_failed = def.sound_place_failed; range = def.range; @@ -102,6 +101,7 @@ void ItemDefinition::reset() type = ITEM_NONE; name = ""; description = ""; + short_description = ""; inventory_image = ""; inventory_overlay = ""; wield_image = ""; @@ -118,8 +118,8 @@ void ItemDefinition::reset() sound_place = SimpleSoundSpec(); sound_place_failed = SimpleSoundSpec(); range = -1; - node_placement_prediction = ""; + place_param2 = 0; } void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const @@ -128,10 +128,10 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const u8 version = 6; writeU8(os, version); writeU8(os, type); - os << serializeString(name); - os << serializeString(description); - os << serializeString(inventory_image); - os << serializeString(wield_image); + os << serializeString16(name); + os << serializeString16(description); + os << serializeString16(inventory_image); + os << serializeString16(wield_image); writeV3F32(os, wield_scale); writeS16(os, stack_max); writeU8(os, usable); @@ -143,28 +143,32 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const tool_capabilities->serialize(tmp_os, protocol_version); tool_capabilities_s = tmp_os.str(); } - os << serializeString(tool_capabilities_s); + os << serializeString16(tool_capabilities_s); writeU16(os, groups.size()); for (const auto &group : groups) { - os << serializeString(group.first); + os << serializeString16(group.first); writeS16(os, group.second); } - os << serializeString(node_placement_prediction); + os << serializeString16(node_placement_prediction); // Version from ContentFeatures::serialize to keep in sync - sound_place.serialize(os, CONTENTFEATURES_VERSION); - sound_place_failed.serialize(os, CONTENTFEATURES_VERSION); + sound_place.serialize(os, protocol_version); + sound_place_failed.serialize(os, protocol_version); writeF32(os, range); - os << serializeString(palette_image); + os << serializeString16(palette_image); writeARGB8(os, color); - os << serializeString(inventory_overlay); - os << serializeString(wield_overlay); + os << serializeString16(inventory_overlay); + os << serializeString16(wield_overlay); + + os << serializeString16(short_description); + + os << place_param2; } -void ItemDefinition::deSerialize(std::istream &is) +void ItemDefinition::deSerialize(std::istream &is, u16 protocol_version) { // Reset everything reset(); @@ -175,16 +179,16 @@ void ItemDefinition::deSerialize(std::istream &is) throw SerializationError("unsupported ItemDefinition version"); type = (enum ItemType)readU8(is); - name = deSerializeString(is); - description = deSerializeString(is); - inventory_image = deSerializeString(is); - wield_image = deSerializeString(is); + name = deSerializeString16(is); + description = deSerializeString16(is); + inventory_image = deSerializeString16(is); + wield_image = deSerializeString16(is); wield_scale = readV3F32(is); stack_max = readS16(is); usable = readU8(is); liquids_pointable = readU8(is); - std::string tool_capabilities_s = deSerializeString(is); + std::string tool_capabilities_s = deSerializeString16(is); if (!tool_capabilities_s.empty()) { std::istringstream tmp_is(tool_capabilities_s, std::ios::binary); tool_capabilities = new ToolCapabilities; @@ -194,27 +198,29 @@ void ItemDefinition::deSerialize(std::istream &is) groups.clear(); u32 groups_size = readU16(is); for(u32 i=0; i<groups_size; i++){ - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); int value = readS16(is); groups[name] = value; } - node_placement_prediction = deSerializeString(is); + node_placement_prediction = deSerializeString16(is); - // Version from ContentFeatures::serialize to keep in sync - sound_place.deSerialize(is, CONTENTFEATURES_VERSION); - sound_place_failed.deSerialize(is, CONTENTFEATURES_VERSION); + sound_place.deSerialize(is, protocol_version); + sound_place_failed.deSerialize(is, protocol_version); range = readF32(is); - palette_image = deSerializeString(is); + palette_image = deSerializeString16(is); color = readARGB8(is); - inventory_overlay = deSerializeString(is); - wield_overlay = deSerializeString(is); + inventory_overlay = deSerializeString16(is); + wield_overlay = deSerializeString16(is); // If you add anything here, insert it primarily inside the try-catch // block to not need to increase the version. - //try { - //} catch(SerializationError &e) {}; + try { + short_description = deSerializeString16(is); + + place_param2 = readU8(is); // 0 if missing + } catch(SerializationError &e) {}; } @@ -521,39 +527,39 @@ public: // Serialize ItemDefinition and write wrapped in a string std::ostringstream tmp_os(std::ios::binary); def->serialize(tmp_os, protocol_version); - os << serializeString(tmp_os.str()); + os << serializeString16(tmp_os.str()); } writeU16(os, m_aliases.size()); for (const auto &it : m_aliases) { - os << serializeString(it.first); - os << serializeString(it.second); + os << serializeString16(it.first); + os << serializeString16(it.second); } } - void deSerialize(std::istream &is) + void deSerialize(std::istream &is, u16 protocol_version) { // Clear everything clear(); - // Deserialize - int version = readU8(is); - if(version != 0) + + if(readU8(is) != 0) throw SerializationError("unsupported ItemDefManager version"); + u16 count = readU16(is); for(u16 i=0; i<count; i++) { // Deserialize a string and grab an ItemDefinition from it - std::istringstream tmp_is(deSerializeString(is), std::ios::binary); + std::istringstream tmp_is(deSerializeString16(is), std::ios::binary); ItemDefinition def; - def.deSerialize(tmp_is); + def.deSerialize(tmp_is, protocol_version); // Register registerItem(def); } u16 num_aliases = readU16(is); for(u16 i=0; i<num_aliases; i++) { - std::string name = deSerializeString(is); - std::string convert_to = deSerializeString(is); + std::string name = deSerializeString16(is); + std::string convert_to = deSerializeString16(is); registerAlias(name, convert_to); } } diff --git a/src/itemdef.h b/src/itemdef.h index f47e6cbe7..035717379 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -56,6 +56,7 @@ struct ItemDefinition ItemType type; std::string name; // "" = hand std::string description; // Shown in tooltip. + std::string short_description; /* Visual properties @@ -85,6 +86,7 @@ struct ItemDefinition // Server will update the precise end result a moment later. // "" = no prediction std::string node_placement_prediction; + u8 place_param2; /* Some helpful methods @@ -95,7 +97,7 @@ struct ItemDefinition ~ItemDefinition(); void reset(); void serialize(std::ostream &os, u16 protocol_version) const; - void deSerialize(std::istream &is); + void deSerialize(std::istream &is, u16 protocol_version); private: void resetInitial(); }; @@ -175,7 +177,7 @@ public: const std::string &convert_to)=0; virtual void serialize(std::ostream &os, u16 protocol_version)=0; - virtual void deSerialize(std::istream &is)=0; + virtual void deSerialize(std::istream &is, u16 protocol_version)=0; // Do stuff asked by threads that can only be done in the main thread virtual void processQueue(IGameDef *gamedef)=0; diff --git a/src/itemstackmetadata.cpp b/src/itemstackmetadata.cpp index 4aa1a0903..529e0149f 100644 --- a/src/itemstackmetadata.cpp +++ b/src/itemstackmetadata.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemstackmetadata.h" #include "util/serialize.h" #include "util/strfnd.h" +#include <algorithm> #define DESERIALIZE_START '\x01' #define DESERIALIZE_KV_DELIM '\x02' @@ -37,17 +38,29 @@ void ItemStackMetadata::clear() updateToolCapabilities(); } +static void sanitize_string(std::string &str) +{ + str.erase(std::remove(str.begin(), str.end(), DESERIALIZE_START), str.end()); + str.erase(std::remove(str.begin(), str.end(), DESERIALIZE_KV_DELIM), str.end()); + str.erase(std::remove(str.begin(), str.end(), DESERIALIZE_PAIR_DELIM), str.end()); +} + bool ItemStackMetadata::setString(const std::string &name, const std::string &var) { - bool result = Metadata::setString(name, var); - if (name == TOOLCAP_KEY) + std::string clean_name = name; + std::string clean_var = var; + sanitize_string(clean_name); + sanitize_string(clean_var); + + bool result = Metadata::setString(clean_name, clean_var); + if (clean_name == TOOLCAP_KEY) updateToolCapabilities(); return result; } void ItemStackMetadata::serialize(std::ostream &os) const { - std::ostringstream os2; + std::ostringstream os2(std::ios_base::binary); os2 << DESERIALIZE_START; for (const auto &stringvar : m_stringvars) { if (!stringvar.first.empty() || !stringvar.second.empty()) diff --git a/src/cloudparams.h b/src/lighting.h similarity index 78% rename from src/cloudparams.h rename to src/lighting.h index 88b5760ee..e0d9cee09 100644 --- a/src/cloudparams.h +++ b/src/lighting.h @@ -1,6 +1,6 @@ /* Minetest -Copyright (C) 2017 bendeutsch, Ben Deutsch <ben@bendeutsch.de> +Copyright (C) 2021 x2048, Dmitry Kostenko <codeforsmile@gmail.com> 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 @@ -19,12 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -struct CloudParams +/** Describes ambient light settings for a player + */ +struct Lighting { - float density; - video::SColor color_bright; - video::SColor color_ambient; - float thickness; - float height; - v2f speed; + float shadow_intensity {0.0f}; }; diff --git a/src/log.cpp b/src/log.cpp index 54442c39b..ef998f161 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -35,43 +35,30 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <cerrno> #include <cstring> -const int BUFFER_LENGTH = 256; - -class StringBuffer : public std::streambuf { +class LevelTarget : public LogTarget { public: - StringBuffer() { - buffer_index = 0; - } - - int overflow(int c); - virtual void flush(const std::string &buf) = 0; - std::streamsize xsputn(const char *s, std::streamsize n); - void push_back(char c); - -private: - char buffer[BUFFER_LENGTH]; - int buffer_index; -}; - - -class LogBuffer : public StringBuffer { -public: - LogBuffer(Logger &logger, LogLevel lev) : - logger(logger), - level(lev) + LevelTarget(Logger &logger, LogLevel level, bool raw = false) : + m_logger(logger), + m_level(level), + m_raw(raw) {} - void flush(const std::string &buffer); + virtual bool hasOutput() override { + return m_logger.hasOutput(m_level); + } + + virtual void log(const std::string &buf) override { + if (!m_raw) { + m_logger.log(m_level, buf); + } else { + m_logger.logRaw(m_level, buf); + } + } private: - Logger &logger; - LogLevel level; -}; - - -class RawLogBuffer : public StringBuffer { -public: - void flush(const std::string &buffer); + Logger &m_logger; + LogLevel m_level; + bool m_raw; }; //// @@ -80,40 +67,33 @@ public: Logger g_logger; +#ifdef __ANDROID__ +AndroidLogOutput stdout_output; +AndroidLogOutput stderr_output; +#else StreamLogOutput stdout_output(std::cout); StreamLogOutput stderr_output(std::cerr); -std::ostream null_stream(NULL); - -RawLogBuffer raw_buf; - -LogBuffer none_buf(g_logger, LL_NONE); -LogBuffer error_buf(g_logger, LL_ERROR); -LogBuffer warning_buf(g_logger, LL_WARNING); -LogBuffer action_buf(g_logger, LL_ACTION); -LogBuffer info_buf(g_logger, LL_INFO); -LogBuffer verbose_buf(g_logger, LL_VERBOSE); - -// Connection -std::ostream *dout_con_ptr = &null_stream; -std::ostream *derr_con_ptr = &verbosestream; - -// Server -std::ostream *dout_server_ptr = &infostream; -std::ostream *derr_server_ptr = &errorstream; - -#ifndef SERVER -// Client -std::ostream *dout_client_ptr = &infostream; -std::ostream *derr_client_ptr = &errorstream; #endif -std::ostream rawstream(&raw_buf); -std::ostream dstream(&none_buf); -std::ostream errorstream(&error_buf); -std::ostream warningstream(&warning_buf); -std::ostream actionstream(&action_buf); -std::ostream infostream(&info_buf); -std::ostream verbosestream(&verbose_buf); +LevelTarget none_target_raw(g_logger, LL_NONE, true); +LevelTarget none_target(g_logger, LL_NONE); +LevelTarget error_target(g_logger, LL_ERROR); +LevelTarget warning_target(g_logger, LL_WARNING); +LevelTarget action_target(g_logger, LL_ACTION); +LevelTarget info_target(g_logger, LL_INFO); +LevelTarget verbose_target(g_logger, LL_VERBOSE); +LevelTarget trace_target(g_logger, LL_TRACE); + +thread_local LogStream dstream(none_target); +thread_local LogStream rawstream(none_target_raw); +thread_local LogStream errorstream(error_target); +thread_local LogStream warningstream(warning_target); +thread_local LogStream actionstream(action_target); +thread_local LogStream infostream(info_target); +thread_local LogStream verbosestream(verbose_target); +thread_local LogStream tracestream(trace_target); +thread_local LogStream derr_con(verbose_target); +thread_local LogStream dout_con(trace_target); // Android #ifdef __ANDROID__ @@ -127,29 +107,15 @@ static unsigned int g_level_to_android[] = { //ANDROID_LOG_INFO, ANDROID_LOG_DEBUG, // LL_INFO ANDROID_LOG_VERBOSE, // LL_VERBOSE + ANDROID_LOG_VERBOSE, // LL_TRACE }; -class AndroidSystemLogOutput : public ICombinedLogOutput { - public: - AndroidSystemLogOutput() - { - g_logger.addOutput(this); - } - ~AndroidSystemLogOutput() - { - g_logger.removeOutput(this); - } - void logRaw(LogLevel lev, const std::string &line) - { - STATIC_ASSERT(ARRLEN(g_level_to_android) == LL_MAX, - mismatch_between_android_and_internal_loglevels); - __android_log_print(g_level_to_android[lev], - PROJECT_NAME_C, "%s", line.c_str()); - } -}; - -AndroidSystemLogOutput g_android_log_output; - +void AndroidLogOutput::logRaw(LogLevel lev, const std::string &line) { + STATIC_ASSERT(ARRLEN(g_level_to_android) == LL_MAX, + mismatch_between_android_and_internal_loglevels); + __android_log_print(g_level_to_android[lev], + PROJECT_NAME_C, "%s", line.c_str()); +} #endif /////////////////////////////////////////////////////////////////////////////// @@ -173,6 +139,8 @@ LogLevel Logger::stringToLevel(const std::string &name) return LL_INFO; else if (name == "verbose") return LL_VERBOSE; + else if (name == "trace") + return LL_TRACE; else return LL_MAX; } @@ -184,26 +152,35 @@ void Logger::addOutput(ILogOutput *out) void Logger::addOutput(ILogOutput *out, LogLevel lev) { + MutexAutoLock lock(m_mutex); m_outputs[lev].push_back(out); + m_has_outputs[lev] = true; } void Logger::addOutputMasked(ILogOutput *out, LogLevelMask mask) { + MutexAutoLock lock(m_mutex); for (size_t i = 0; i < LL_MAX; i++) { - if (mask & LOGLEVEL_TO_MASKLEVEL(i)) + if (mask & LOGLEVEL_TO_MASKLEVEL(i)) { m_outputs[i].push_back(out); + m_has_outputs[i] = true; + } } } void Logger::addOutputMaxLevel(ILogOutput *out, LogLevel lev) { + MutexAutoLock lock(m_mutex); assert(lev < LL_MAX); - for (size_t i = 0; i <= lev; i++) + for (size_t i = 0; i <= lev; i++) { m_outputs[i].push_back(out); + m_has_outputs[i] = true; + } } LogLevelMask Logger::removeOutput(ILogOutput *out) { + MutexAutoLock lock(m_mutex); LogLevelMask ret_mask = 0; for (size_t i = 0; i < LL_MAX; i++) { std::vector<ILogOutput *>::iterator it; @@ -212,6 +189,7 @@ LogLevelMask Logger::removeOutput(ILogOutput *out) if (it != m_outputs[i].end()) { ret_mask |= LOGLEVEL_TO_MASKLEVEL(i); m_outputs[i].erase(it); + m_has_outputs[i] = !m_outputs[i].empty(); } } return ret_mask; @@ -245,6 +223,7 @@ const std::string Logger::getLevelLabel(LogLevel lev) "ACTION", "INFO", "VERBOSE", + "TRACE", }; assert(lev < LL_MAX && lev >= 0); STATIC_ASSERT(ARRLEN(names) == LL_MAX, @@ -306,7 +285,6 @@ void Logger::logToOutputs(LogLevel lev, const std::string &combined, m_outputs[lev][i]->log(lev, combined, time, thread_name, payload_text); } - //// //// *LogOutput methods //// @@ -358,6 +336,7 @@ void StreamLogOutput::logRaw(LogLevel lev, const std::string &line) m_stream << "\033[37m"; break; case LL_VERBOSE: + case LL_TRACE: // verbose is darker than info m_stream << "\033[2m"; break; @@ -405,55 +384,12 @@ void LogOutputBuffer::logRaw(LogLevel lev, const std::string &line) color = "\x1b(c@#BBB)"; break; case LL_VERBOSE: // dark grey + case LL_TRACE: color = "\x1b(c@#888)"; break; default: break; } } - - m_buffer.push(color.append(line)); -} - -//// -//// *Buffer methods -//// - -int StringBuffer::overflow(int c) -{ - push_back(c); - return c; -} - - -std::streamsize StringBuffer::xsputn(const char *s, std::streamsize n) -{ - for (int i = 0; i < n; ++i) - push_back(s[i]); - return n; -} - -void StringBuffer::push_back(char c) -{ - if (c == '\n' || c == '\r') { - if (buffer_index) - flush(std::string(buffer, buffer_index)); - buffer_index = 0; - } else { - buffer[buffer_index++] = c; - if (buffer_index >= BUFFER_LENGTH) { - flush(std::string(buffer, buffer_index)); - buffer_index = 0; - } - } -} - - -void LogBuffer::flush(const std::string &buffer) -{ - logger.log(level, buffer); -} - -void RawLogBuffer::flush(const std::string &buffer) -{ - g_logger.logRaw(LL_NONE, buffer); + MutexAutoLock lock(m_buffer_mutex); + m_buffer.emplace(color.append(line)); } diff --git a/src/log.h b/src/log.h index 856d3479b..0a84332e7 100644 --- a/src/log.h +++ b/src/log.h @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once +#include <atomic> #include <map> #include <queue> #include <string> @@ -28,6 +29,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #if !defined(_WIN32) // POSIX #include <unistd.h> #endif +#include "threading/mutex_auto_lock.h" +#include "util/basic_macros.h" +#include "util/stream.h" #include "irrlichttypes.h" class ILogOutput; @@ -39,6 +43,7 @@ enum LogLevel { LL_ACTION, // In-game actions LL_INFO, LL_VERBOSE, + LL_TRACE, LL_MAX, }; @@ -67,12 +72,13 @@ public: // Logs without a prefix void logRaw(LogLevel lev, const std::string &text); - void setTraceEnabled(bool enable) { m_trace_enabled = enable; } - bool getTraceEnabled() { return m_trace_enabled; } - static LogLevel stringToLevel(const std::string &name); static const std::string getLevelLabel(LogLevel lev); + bool hasOutput(LogLevel level) { + return m_has_outputs[level].load(std::memory_order_relaxed); + } + static LogColor color_mode; private: @@ -84,6 +90,7 @@ private: const std::string getThreadName(); std::vector<ILogOutput *> m_outputs[LL_MAX]; + std::atomic<bool> m_has_outputs[LL_MAX]; // Should implement atomic loads and stores (even though it's only // written to when one thread has access currently). @@ -91,7 +98,6 @@ private: volatile bool m_silenced_levels[LL_MAX]; std::map<std::thread::id, std::string> m_thread_names; mutable std::mutex m_mutex; - bool m_trace_enabled; }; class ILogOutput { @@ -163,67 +169,207 @@ public: void clear() { + MutexAutoLock lock(m_buffer_mutex); m_buffer = std::queue<std::string>(); } bool empty() const { + MutexAutoLock lock(m_buffer_mutex); return m_buffer.empty(); } std::string get() { - if (empty()) + MutexAutoLock lock(m_buffer_mutex); + if (m_buffer.empty()) return ""; - std::string s = m_buffer.front(); + std::string s = std::move(m_buffer.front()); m_buffer.pop(); return s; } private: + // g_logger serializes calls to logRaw() with a mutex, but that + // doesn't prevent get() / clear() from being called on top of it. + // This mutex prevents that. + mutable std::mutex m_buffer_mutex; std::queue<std::string> m_buffer; Logger &m_logger; }; +#ifdef __ANDROID__ +class AndroidLogOutput : public ICombinedLogOutput { +public: + void logRaw(LogLevel lev, const std::string &line); +}; +#endif +/* + * LogTarget + * + * This is the interface that sits between the LogStreams and the global logger. + * Primarily used to route streams to log levels, but could also enable other + * custom behavior. + * + */ +class LogTarget { +public: + // Must be thread-safe. These can be called from any thread. + virtual bool hasOutput() = 0; + virtual void log(const std::string &buf) = 0; +}; + + +/* + * StreamProxy + * + * An ostream-like object that can proxy to a real ostream or do nothing, + * depending on how it is configured. See LogStream below. + * + */ +class StreamProxy { +public: + StreamProxy(std::ostream *os) : m_os(os) { } + + template<typename T> + StreamProxy& operator<<(T&& arg) { + if (m_os) { + *m_os << std::forward<T>(arg); + } + return *this; + } + + StreamProxy& operator<<(std::ostream& (*manip)(std::ostream&)) { + if (m_os) { + *m_os << manip; + } + return *this; + } + +private: + std::ostream *m_os; +}; + + +/* + * LogStream + * + * The public interface for log streams (infostream, verbosestream, etc). + * + * LogStream minimizes the work done when a given stream is off. (meaning + * it has no output targets, so it goes to /dev/null) + * + * For example, consider: + * + * verbosestream << "hello world" << 123 << std::endl; + * + * The compiler evaluates this as: + * + * (((verbosestream << "hello world") << 123) << std::endl) + * ^ ^ + * + * If `verbosestream` is on, the innermost expression (marked by ^) will return + * a StreamProxy that forwards to a real ostream, that feeds into the logger. + * However, if `verbosestream` is off, it will return a StreamProxy that does + * nothing on all later operations. Specifically, CPU time won't be wasted + * writing "hello world" and 123 into a buffer, or formatting the log entry. + * + * It is also possible to directly check if the stream is on/off: + * + * if (verbosestream) { + * auto data = ComputeExpensiveDataForTheLog(); + * verbosestream << data << endl; + * } + * +*/ + +class LogStream { +public: + LogStream() = delete; + DISABLE_CLASS_COPY(LogStream); + + LogStream(LogTarget &target) : + m_target(target), + m_buffer(std::bind(&LogStream::internalFlush, this, std::placeholders::_1)), + m_dummy_buffer(), + m_stream(&m_buffer), + m_dummy_stream(&m_dummy_buffer), + m_proxy(&m_stream), + m_dummy_proxy(nullptr) { } + + template<typename T> + StreamProxy& operator<<(T&& arg) { + StreamProxy& sp = m_target.hasOutput() ? m_proxy : m_dummy_proxy; + sp << std::forward<T>(arg); + return sp; + } + + StreamProxy& operator<<(std::ostream& (*manip)(std::ostream&)) { + StreamProxy& sp = m_target.hasOutput() ? m_proxy : m_dummy_proxy; + sp << manip; + return sp; + } + + operator bool() { + return m_target.hasOutput(); + } + + void internalFlush(const std::string &buf) { + m_target.log(buf); + } + + operator std::ostream&() { + return m_target.hasOutput() ? m_stream : m_dummy_stream; + } + +private: + // 10 streams per thread x (256 + overhead) ~ 3K per thread + static const int BUFFER_LENGTH = 256; + LogTarget &m_target; + StringStreamBuffer<BUFFER_LENGTH> m_buffer; + DummyStreamBuffer m_dummy_buffer; + std::ostream m_stream; + std::ostream m_dummy_stream; + StreamProxy m_proxy; + StreamProxy m_dummy_proxy; + +}; + +#ifdef __ANDROID__ +extern AndroidLogOutput stdout_output; +extern AndroidLogOutput stderr_output; +#else extern StreamLogOutput stdout_output; extern StreamLogOutput stderr_output; -extern std::ostream null_stream; - -extern std::ostream *dout_con_ptr; -extern std::ostream *derr_con_ptr; -extern std::ostream *dout_server_ptr; -extern std::ostream *derr_server_ptr; - -#ifndef SERVER -extern std::ostream *dout_client_ptr; -extern std::ostream *derr_client_ptr; #endif extern Logger g_logger; -// Writes directly to all LL_NONE log outputs for g_logger with no prefix. -extern std::ostream rawstream; +/* + * By making the streams thread_local, each thread has its own + * private buffer. Two or more threads can write to the same stream + * simultaneously (lock-free), and there won't be any interference. + * + * The finished lines are sent to a LogTarget which is a global (not thread-local) + * object, and from there relayed to g_logger. The final writes are serialized + * by the mutex in g_logger. +*/ -extern std::ostream errorstream; -extern std::ostream warningstream; -extern std::ostream actionstream; -extern std::ostream infostream; -extern std::ostream verbosestream; -extern std::ostream dstream; +extern thread_local LogStream dstream; +extern thread_local LogStream rawstream; // Writes directly to all LL_NONE log outputs with no prefix. +extern thread_local LogStream errorstream; +extern thread_local LogStream warningstream; +extern thread_local LogStream actionstream; +extern thread_local LogStream infostream; +extern thread_local LogStream verbosestream; +extern thread_local LogStream tracestream; +// TODO: Search/replace these with verbose/tracestream +extern thread_local LogStream derr_con; +extern thread_local LogStream dout_con; -#define TRACEDO(x) do { \ - if (g_logger.getTraceEnabled()) { \ - x; \ - } \ +#define TRACESTREAM(x) do { \ + if (tracestream) { \ + tracestream x; \ + } \ } while (0) - -#define TRACESTREAM(x) TRACEDO(verbosestream x) - -#define dout_con (*dout_con_ptr) -#define derr_con (*derr_con_ptr) -#define dout_server (*dout_server_ptr) - -#ifndef SERVER - #define dout_client (*dout_client_ptr) -#endif diff --git a/src/main.cpp b/src/main.cpp index af6d307dc..d927b141b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" // must be included before anything irrlicht, see comment in the file #include "irrlicht.h" // createDevice #include "irrlichttypes_extrabloated.h" +#include "benchmark/benchmark.h" #include "chat_interface.h" #include "debug.h" #include "unittest/test.h" @@ -38,6 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "player.h" #include "porting.h" #include "network/socket.h" +#include "mapblock.h" #if USE_CURSES #include "terminal_chat_console.h" #endif @@ -47,27 +49,45 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gui/guiEngine.h" #include "gui/mainmenumanager.h" #endif - #ifdef HAVE_TOUCHSCREENGUI #include "gui/touchscreengui.h" #endif -#if !defined(SERVER) && \ - (IRRLICHT_VERSION_MAJOR == 1) && \ - (IRRLICHT_VERSION_MINOR == 8) && \ - (IRRLICHT_VERSION_REVISION == 2) - #error "Irrlicht 1.8.2 is known to be broken - please update Irrlicht to version >= 1.8.3" +// for version information only +extern "C" { +#if USE_LUAJIT + #include <luajit.h> +#else + #include <lua.h> +#endif +} + +#if !defined(__cpp_rtti) || !defined(__cpp_exceptions) +#error Minetest cannot be built without exceptions or RTTI +#endif + +#if defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__clang__) && \ + (__GNUC__ < 11 || (__GNUC__ == 11 && __GNUC_MINOR__ < 1)) +// see e.g. https://github.com/minetest/minetest/issues/10137 +#warning ================================== +#warning 32-bit MinGW gcc before 11.1 has known issues with crashes on thread exit, you should upgrade. +#warning ================================== #endif #define DEBUGFILE "debug.txt" #define DEFAULT_SERVER_PORT 30000 +#define ENV_NO_COLOR "NO_COLOR" +#define ENV_CLICOLOR "CLICOLOR" +#define ENV_CLICOLOR_FORCE "CLICOLOR_FORCE" + typedef std::map<std::string, ValueSpec> OptionList; /********************************************************************** * Private functions **********************************************************************/ +static void get_env_opts(Settings &args); static bool get_cmdline_opts(int argc, char *argv[], Settings *cmd_args); static void set_allowed_options(OptionList *allowed_options); @@ -83,6 +103,7 @@ static void list_worlds(bool print_name, bool print_path); static bool setup_log_params(const Settings &cmd_args); static bool create_userdata_path(); static bool init_common(const Settings &cmd_args, int argc, char *argv[]); +static void uninit_common(); static void startup_message(); static bool read_config_file(const Settings &cmd_args); static void init_log_streams(const Settings &cmd_args); @@ -102,6 +123,7 @@ static bool determine_subgame(GameParams *game_params); static bool run_dedicated_server(const GameParams &game_params, const Settings &cmd_args); static bool migrate_map_database(const GameParams &game_params, const Settings &cmd_args); +static bool recompress_map_database(const GameParams &game_params, const Settings &cmd_args, const Address &addr); /**********************************************************************/ @@ -119,6 +141,7 @@ int main(int argc, char *argv[]) g_logger.addOutputMaxLevel(&stderr_output, LL_ACTION); Settings cmd_args; + get_env_opts(cmd_args); bool cmd_args_ok = get_cmdline_opts(argc, argv, &cmd_args); if (!cmd_args_ok || cmd_args.getFlag("help") @@ -193,9 +216,22 @@ int main(int argc, char *argv[]) errorstream << "Unittest support is not enabled in this binary. " << "If you want to enable it, compile project with BUILD_UNITTESTS=1 flag." << std::endl; + return 1; #endif } + + // Run benchmarks + if (cmd_args.getFlag("run-benchmarks")) { +#if BUILD_BENCHMARKS + return run_benchmarks(); +#else + errorstream << "Benchmark support is not enabled in this binary. " + << "If you want to enable it, compile project with BUILD_BENCHMARKS=1 flag." + << std::endl; + return 1; #endif + } +#endif // __ANDROID__ GameStartData game_params; #ifdef SERVER @@ -217,8 +253,7 @@ int main(int argc, char *argv[]) return run_dedicated_server(game_params, cmd_args) ? 0 : 1; #ifndef SERVER - ClientLauncher launcher; - retval = launcher.run(game_params, cmd_args) ? 0 : 1; + retval = ClientLauncher().run(game_params, cmd_args) ? 0 : 1; #else retval = 0; #endif @@ -229,9 +264,6 @@ int main(int argc, char *argv[]) print_modified_quicktune_values(); - // Stop httpfetch thread (if started) - httpfetch_cleanup(); - END_DEBUG_EXCEPTION_HANDLER return retval; @@ -243,6 +275,29 @@ int main(int argc, char *argv[]) *****************************************************************************/ +static void get_env_opts(Settings &args) +{ + // CLICOLOR is a de-facto standard option for colors <https://bixense.com/clicolors/> + // CLICOLOR != 0: ANSI colors are supported (auto-detection, this is the default) + // CLICOLOR == 0: ANSI colors are NOT supported + const char *clicolor = std::getenv(ENV_CLICOLOR); + if (clicolor && std::string(clicolor) == "0") { + args.set("color", "never"); + } + // NO_COLOR only specifies that no color is allowed. + // Implemented according to <http://no-color.org/> + const char *no_color = std::getenv(ENV_NO_COLOR); + if (no_color && no_color[0]) { + args.set("color", "never"); + } + // CLICOLOR_FORCE is another option, which should turn on colors "no matter what". + const char *clicolor_force = std::getenv(ENV_CLICOLOR_FORCE); + if (clicolor_force && std::string(clicolor_force) != "0") { + // should ALWAYS have colors, so we ignore tty (no "auto") + args.set("color", "always"); + } +} + static bool get_cmdline_opts(int argc, char *argv[], Settings *cmd_args) { set_allowed_options(&allowed_options); @@ -264,6 +319,8 @@ static void set_allowed_options(OptionList *allowed_options) _("Set network port (UDP)")))); allowed_options->insert(std::make_pair("run-unittests", ValueSpec(VALUETYPE_FLAG, _("Run the unit tests and exit")))); + allowed_options->insert(std::make_pair("run-benchmarks", ValueSpec(VALUETYPE_FLAG, + _("Run the benchmarks and exit")))); allowed_options->insert(std::make_pair("map-dir", ValueSpec(VALUETYPE_STRING, _("Same as --world (deprecated)")))); allowed_options->insert(std::make_pair("world", ValueSpec(VALUETYPE_STRING, @@ -294,11 +351,13 @@ static void set_allowed_options(OptionList *allowed_options) _("Migrate from current players backend to another (Only works when using minetestserver or with --server)")))); allowed_options->insert(std::make_pair("migrate-auth", ValueSpec(VALUETYPE_STRING, _("Migrate from current auth backend to another (Only works when using minetestserver or with --server)")))); + allowed_options->insert(std::make_pair("migrate-mod-storage", ValueSpec(VALUETYPE_STRING, + _("Migrate from current mod storage backend to another (Only works when using minetestserver or with --server)")))); allowed_options->insert(std::make_pair("terminal", ValueSpec(VALUETYPE_FLAG, _("Feature an interactive terminal (Only works when using minetestserver or with --server)")))); + allowed_options->insert(std::make_pair("recompress", ValueSpec(VALUETYPE_FLAG, + _("Recompress the blocks of the given map database.")))); #ifndef SERVER - allowed_options->insert(std::make_pair("videomodes", ValueSpec(VALUETYPE_FLAG, - _("Show available video modes")))); allowed_options->insert(std::make_pair("speedtests", ValueSpec(VALUETYPE_FLAG, _("Run speed tests")))); allowed_options->insert(std::make_pair("address", ValueSpec(VALUETYPE_STRING, @@ -350,6 +409,11 @@ static void print_version() << " (" << porting::getPlatformName() << ")" << std::endl; #ifndef SERVER std::cout << "Using Irrlicht " IRRLICHT_SDK_VERSION << std::endl; +#endif +#if USE_LUAJIT + std::cout << "Using " << LUAJIT_VERSION << std::endl; +#else + std::cout << "Using " << LUA_RELEASE << std::endl; #endif std::cout << g_build_info << std::endl; } @@ -433,14 +497,6 @@ static bool setup_log_params(const Settings &cmd_args) } } - // If trace is enabled, enable logging of certain things - if (cmd_args.getFlag("trace")) { - dstream << _("Enabling trace level debug output") << std::endl; - g_logger.setTraceEnabled(true); - dout_con_ptr = &verbosestream; // This is somewhat old - socket_enable_debug_output = true; // Sockets doesn't use log.h - } - // In certain cases, output info level on stderr if (cmd_args.getFlag("info") || cmd_args.getFlag("verbose") || cmd_args.getFlag("trace") || cmd_args.getFlag("speedtests")) @@ -450,6 +506,12 @@ static bool setup_log_params(const Settings &cmd_args) if (cmd_args.getFlag("verbose") || cmd_args.getFlag("trace")) g_logger.addOutput(&stderr_output, LL_VERBOSE); + if (cmd_args.getFlag("trace")) { + dstream << _("Enabling trace level debug output") << std::endl; + g_logger.addOutput(&stderr_output, LL_TRACE); + socket_enable_debug_output = true; + } + return true; } @@ -474,11 +536,15 @@ static bool create_userdata_path() static bool init_common(const Settings &cmd_args, int argc, char *argv[]) { startup_message(); - set_default_settings(g_settings); + set_default_settings(); - // Initialize sockets sockets_init(); - atexit(sockets_cleanup); + + // Initialize g_settings + Settings::createLayer(SL_GLOBAL); + + // Set cleanup callback(s) to run at process exit + atexit(uninit_common); if (!read_config_file(cmd_args)) return false; @@ -498,6 +564,17 @@ static bool init_common(const Settings &cmd_args, int argc, char *argv[]) return true; } +static void uninit_common() +{ + httpfetch_cleanup(); + + sockets_cleanup(); + + // It'd actually be okay to leak these but we want to please valgrind... + for (int i = 0; i < (int)SL_TOTAL_COUNT; i++) + delete Settings::getLayer((SettingsLayer)i); +} + static void startup_message() { infostream << PROJECT_NAME << " " << _("with") @@ -564,7 +641,7 @@ static void init_log_streams(const Settings &cmd_args) warningstream << "Deprecated use of debug_log_level with an " "integer value; please update your configuration." << std::endl; static const char *lev_name[] = - {"", "error", "action", "info", "verbose"}; + {"", "error", "action", "info", "verbose", "trace"}; int lev_i = atoi(conf_loglev.c_str()); if (lev_i < 0 || lev_i >= (int)ARRLEN(lev_name)) { warningstream << "Supplied invalid debug_log_level!" @@ -851,7 +928,7 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings & return false; } - // Database migration + // Database migration/compression if (cmd_args.exists("migrate")) return migrate_map_database(game_params, cmd_args); @@ -861,6 +938,12 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings & if (cmd_args.exists("migrate-auth")) return ServerEnvironment::migrateAuthDatabase(game_params, cmd_args); + if (cmd_args.exists("migrate-mod-storage")) + return Server::migrateModStorageDatabase(game_params, cmd_args); + + if (cmd_args.getFlag("recompress")) + return recompress_map_database(game_params, cmd_args, bind_addr); + if (cmd_args.exists("terminal")) { #if USE_CURSES bool name_ok = true; @@ -1010,3 +1093,67 @@ static bool migrate_map_database(const GameParams &game_params, const Settings & return true; } + +static bool recompress_map_database(const GameParams &game_params, const Settings &cmd_args, const Address &addr) +{ + Settings world_mt; + const std::string world_mt_path = game_params.world_path + DIR_DELIM + "world.mt"; + + if (!world_mt.readConfigFile(world_mt_path.c_str())) { + errorstream << "Cannot read world.mt at " << world_mt_path << std::endl; + return false; + } + const std::string &backend = world_mt.get("backend"); + Server server(game_params.world_path, game_params.game_spec, false, addr, false); + MapDatabase *db = ServerMap::createDatabase(backend, game_params.world_path, world_mt); + + u32 count = 0; + u64 last_update_time = 0; + bool &kill = *porting::signal_handler_killstatus(); + const u8 serialize_as_ver = SER_FMT_VER_HIGHEST_WRITE; + + // This is ok because the server doesn't actually run + std::vector<v3s16> blocks; + db->listAllLoadableBlocks(blocks); + db->beginSave(); + std::istringstream iss(std::ios_base::binary); + std::ostringstream oss(std::ios_base::binary); + for (auto it = blocks.begin(); it != blocks.end(); ++it) { + if (kill) return false; + + std::string data; + db->loadBlock(*it, &data); + if (data.empty()) { + errorstream << "Failed to load block " << PP(*it) << std::endl; + return false; + } + + iss.str(data); + iss.clear(); + + MapBlock mb(nullptr, v3s16(0,0,0), &server); + u8 ver = readU8(iss); + mb.deSerialize(iss, ver, true); + + oss.str(""); + oss.clear(); + writeU8(oss, serialize_as_ver); + mb.serialize(oss, serialize_as_ver, true, -1); + + db->saveBlock(*it, oss.str()); + + count++; + if (count % 0xFF == 0 && porting::getTimeS() - last_update_time >= 1) { + std::cerr << " Recompressed " << count << " blocks, " + << (100.0f * count / blocks.size()) << "% completed.\r"; + db->endSave(); + db->beginSave(); + last_update_time = porting::getTimeS(); + } + } + std::cerr << std::endl; + db->endSave(); + + actionstream << "Done, " << count << " blocks were recompressed." << std::endl; + return true; +} diff --git a/src/map.cpp b/src/map.cpp index b9ab7c066..a53680065 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -62,8 +62,7 @@ with this program; if not, write to the Free Software Foundation, Inc., Map */ -Map::Map(std::ostream &dout, IGameDef *gamedef): - m_dout(dout), +Map::Map(IGameDef *gamedef): m_gamedef(gamedef), m_nodedef(gamedef->ndef()) { @@ -103,7 +102,7 @@ MapSector * Map::getSectorNoGenerateNoLock(v2s16 p) return sector; } - std::map<v2s16, MapSector*>::iterator n = m_sectors.find(p); + auto n = m_sectors.find(p); if (n == m_sectors.end()) return NULL; @@ -140,13 +139,6 @@ MapBlock * Map::getBlockNoCreate(v3s16 p3d) return block; } -bool Map::isNodeUnderground(v3s16 p) -{ - v3s16 blockpos = getNodeBlockPos(p); - MapBlock *block = getBlockNoCreateNoEx(blockpos); - return block && block->getIsUnderground(); -} - bool Map::isValidPosition(v3s16 p) { v3s16 blockpos = getNodeBlockPos(p); @@ -173,22 +165,30 @@ MapNode Map::getNode(v3s16 p, bool *is_valid_position) return node; } +static void set_node_in_block(MapBlock *block, v3s16 relpos, MapNode n) +{ + // Never allow placing CONTENT_IGNORE, it causes problems + if(n.getContent() == CONTENT_IGNORE){ + const NodeDefManager *nodedef = block->getParent()->getNodeDefManager(); + v3s16 blockpos = block->getPos(); + v3s16 p = blockpos * MAP_BLOCKSIZE + relpos; + bool temp_bool; + errorstream<<"Not allowing to place CONTENT_IGNORE" + <<" while trying to replace \"" + <<nodedef->get(block->getNodeNoCheck(relpos, &temp_bool)).name + <<"\" at "<<PP(p)<<" (block "<<PP(blockpos)<<")"<<std::endl; + return; + } + block->setNodeNoCheck(relpos, n); +} + // throws InvalidPositionException if not found void Map::setNode(v3s16 p, MapNode & n) { v3s16 blockpos = getNodeBlockPos(p); MapBlock *block = getBlockNoCreate(blockpos); v3s16 relpos = p - blockpos*MAP_BLOCKSIZE; - // Never allow placing CONTENT_IGNORE, it causes problems - if(n.getContent() == CONTENT_IGNORE){ - bool temp_bool; - errorstream<<"Map::setNode(): Not allowing to place CONTENT_IGNORE" - <<" while trying to replace \"" - <<m_nodedef->get(block->getNodeNoCheck(relpos, &temp_bool)).name - <<"\" at "<<PP(p)<<" (block "<<PP(blockpos)<<")"<<std::endl; - return; - } - block->setNodeNoCheck(relpos, n); + set_node_in_block(block, relpos, n); } void Map::addNodeAndUpdate(v3s16 p, MapNode n, @@ -198,8 +198,14 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, // Collect old node for rollback RollbackNode rollback_oldnode(this, p, m_gamedef); + v3s16 blockpos = getNodeBlockPos(p); + MapBlock *block = getBlockNoCreate(blockpos); + if (block->isDummy()) + throw InvalidPositionException(); + v3s16 relpos = p - blockpos * MAP_BLOCKSIZE; + // This is needed for updating the lighting - MapNode oldnode = getNode(p); + MapNode oldnode = block->getNodeUnsafe(relpos); // Remove node metadata if (remove_metadata) { @@ -207,18 +213,29 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, } // Set the node on the map - // Ignore light (because calling voxalgo::update_lighting_nodes) - n.setLight(LIGHTBANK_DAY, 0, m_nodedef); - n.setLight(LIGHTBANK_NIGHT, 0, m_nodedef); - setNode(p, n); + const ContentFeatures &cf = m_nodedef->get(n); + const ContentFeatures &oldcf = m_nodedef->get(oldnode); + if (cf.lightingEquivalent(oldcf)) { + // No light update needed, just copy over the old light. + n.setLight(LIGHTBANK_DAY, oldnode.getLightRaw(LIGHTBANK_DAY, oldcf), cf); + n.setLight(LIGHTBANK_NIGHT, oldnode.getLightRaw(LIGHTBANK_NIGHT, oldcf), cf); + set_node_in_block(block, relpos, n); - // Update lighting - std::vector<std::pair<v3s16, MapNode> > oldnodes; - oldnodes.emplace_back(p, oldnode); - voxalgo::update_lighting_nodes(this, oldnodes, modified_blocks); + modified_blocks[blockpos] = block; + } else { + // Ignore light (because calling voxalgo::update_lighting_nodes) + n.setLight(LIGHTBANK_DAY, 0, cf); + n.setLight(LIGHTBANK_NIGHT, 0, cf); + set_node_in_block(block, relpos, n); - for (auto &modified_block : modified_blocks) { - modified_block.second->expireDayNightDiff(); + // Update lighting + std::vector<std::pair<v3s16, MapNode> > oldnodes; + oldnodes.emplace_back(p, oldnode); + voxalgo::update_lighting_nodes(this, oldnodes, modified_blocks); + + for (auto &modified_block : modified_blocks) { + modified_block.second->expireDayNightDiff(); + } } // Report for rollback @@ -229,22 +246,6 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, action.setSetNode(p, rollback_oldnode, rollback_newnode); m_gamedef->rollback()->reportAction(action); } - - /* - Add neighboring liquid nodes and this node to transform queue. - (it's vital for the node itself to get updated last, if it was removed.) - */ - - for (const v3s16 &dir : g_7dirs) { - v3s16 p2 = p + dir; - - bool is_valid_position; - MapNode n2 = getNode(p2, &is_valid_position); - if(is_valid_position && - (m_nodedef->get(n2).isLiquid() || - n2.getContent() == CONTENT_AIR)) - m_transforming_liquid.push_back(p2); - } } void Map::removeNodeAndUpdate(v3s16 p, @@ -322,10 +323,10 @@ struct TimeOrderedMapBlock { /* Updates usage timers */ -void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, +void Map::timerUpdate(float dtime, float unload_timeout, s32 max_loaded_blocks, std::vector<v3s16> *unloaded_blocks) { - bool save_before_unloading = (mapType() == MAPTYPE_SERVER); + bool save_before_unloading = maySaveBlocks(); // Profile modified reasons Profiler modprofiler; @@ -335,10 +336,11 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, u32 saved_blocks_count = 0; u32 block_count_all = 0; + const auto start_time = porting::getTimeUs(); beginSave(); // If there is no practical limit, we spare creation of mapblock_queue - if (max_loaded_blocks == U32_MAX) { + if (max_loaded_blocks < 0) { for (auto §or_it : m_sectors) { MapSector *sector = sector_it.second; @@ -376,6 +378,7 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, } } + // Delete sector if we emptied it if (all_blocks_deleted) { sector_deletion_queue.push_back(sector_it.first); } @@ -394,8 +397,9 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, } } block_count_all = mapblock_queue.size(); + // Delete old blocks, and blocks over the limit from the memory - while (!mapblock_queue.empty() && (mapblock_queue.size() > max_loaded_blocks + while (!mapblock_queue.empty() && ((s32)mapblock_queue.size() > max_loaded_blocks || mapblock_queue.top().block->getUsageTimer() > unload_timeout)) { TimeOrderedMapBlock b = mapblock_queue.top(); mapblock_queue.pop(); @@ -424,6 +428,7 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, deleted_blocks_count++; block_count_all--; } + // Delete empty sectors for (auto §or_it : m_sectors) { if (sector_it.second->empty()) { @@ -431,7 +436,11 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, } } } + endSave(); + const auto end_time = porting::getTimeUs(); + + reportMetrics(end_time - start_time, saved_blocks_count, block_count_all); // Finally delete the empty sectors deleteSectors(sector_deletion_queue); @@ -510,11 +519,11 @@ struct NodeNeighbor { { } }; -void Map::transforming_liquid_add(v3s16 p) { +void ServerMap::transforming_liquid_add(v3s16 p) { m_transforming_liquid.push_back(p); } -void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, +void ServerMap::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, ServerEnvironment *env) { u32 loopcount = 0; @@ -531,23 +540,6 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, u32 liquid_loop_max = g_settings->getS32("liquid_loop_max"); u32 loop_max = liquid_loop_max; -#if 0 - - /* If liquid_loop_max is not keeping up with the queue size increase - * loop_max up to a maximum of liquid_loop_max * dedicated_server_step. - */ - if (m_transforming_liquid.size() > loop_max * 2) { - // "Burst" mode - float server_step = g_settings->getFloat("dedicated_server_step"); - if (m_transforming_liquid_loop_count_multiplier - 1.0 < server_step) - m_transforming_liquid_loop_count_multiplier *= 1.0 + server_step / 10; - } else { - m_transforming_liquid_loop_count_multiplier = 1.0; - } - - loop_max *= m_transforming_liquid_loop_count_multiplier; -#endif - while (m_transforming_liquid.size() != 0) { // This should be done here so that it is done when continue is used @@ -847,7 +839,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, m_transforming_liquid.push_back(iter); voxalgo::update_lighting_nodes(this, changed_nodes, modified_blocks); - + env->getScriptIface()->on_liquid_transformed(changed_nodes); /* ---------------------------------------------------------------------- * Manage the queue so that it does not grow indefinately @@ -1201,8 +1193,8 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes) */ ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb): - Map(dout_server, gamedef), - settings_mgr(g_settings, savedir + DIR_DELIM + "map_meta.txt"), + Map(gamedef), + settings_mgr(savedir + DIR_DELIM + "map_meta.txt"), m_emerge(emerge) { verbosestream<<FUNCTION_NAME<<std::endl; @@ -1234,7 +1226,14 @@ ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, m_savedir = savedir; m_map_saving_enabled = false; - m_save_time_counter = mb->addCounter("minetest_core_map_save_time", "Map save time (in nanoseconds)"); + m_save_time_counter = mb->addCounter( + "minetest_map_save_time", "Time spent saving blocks (in microseconds)"); + m_save_count_counter = mb->addCounter( + "minetest_map_saved_blocks", "Number of blocks saved"); + m_loaded_blocks_gauge = mb->addGauge( + "minetest_map_loaded_blocks", "Number of loaded blocks"); + + m_map_compression_level = rangelim(g_settings->getS16("map_compression_level_disk"), -1, 9); try { // If directory exists, check contents and load if possible @@ -1301,18 +1300,6 @@ ServerMap::~ServerMap() */ delete dbase; delete dbase_ro; - -#if 0 - /* - Free all MapChunks - */ - core::map<v2s16, MapChunk*>::Iterator i = m_chunks.getIterator(); - for(; i.atEnd() == false; i++) - { - MapChunk *chunk = i.getNode()->getValue(); - delete chunk; - } -#endif } MapgenParams *ServerMap::getMapgenParams() @@ -1327,11 +1314,6 @@ u64 ServerMap::getSeed() return getMapgenParams()->seed; } -s16 ServerMap::getWaterLevel() -{ - return getMapgenParams()->water_level; -} - bool ServerMap::blockpos_over_mapgen_limit(v3s16 p) { const s16 mapgen_limit_bp = rangelim( @@ -1351,6 +1333,9 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) v3s16 bpmin = EmergeManager::getContainingChunk(blockpos, csize); v3s16 bpmax = bpmin + v3s16(1, 1, 1) * (csize - 1); + if (!m_chunks_in_progress.insert(bpmin).second) + return false; + bool enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info; EMERGE_DBG_OUT("initBlockMake(): " PP(bpmin) " - " PP(bpmax)); @@ -1366,7 +1351,6 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) data->seed = getSeed(); data->blockpos_min = bpmin; data->blockpos_max = bpmax; - data->blockpos_requested = blockpos; data->nodedef = m_nodedef; /* @@ -1404,25 +1388,6 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) data->vmanip = new MMVManip(this); data->vmanip->initialEmerge(full_bpmin, full_bpmax); - // Note: we may need this again at some point. -#if 0 - // Ensure none of the blocks to be generated were marked as - // containing CONTENT_IGNORE - for (s16 z = blockpos_min.Z; z <= blockpos_max.Z; z++) { - for (s16 y = blockpos_min.Y; y <= blockpos_max.Y; y++) { - for (s16 x = blockpos_min.X; x <= blockpos_max.X; x++) { - core::map<v3s16, u8>::Node *n; - n = data->vmanip->m_loaded_blocks.find(v3s16(x, y, z)); - if (n == NULL) - continue; - u8 flags = n->getValue(); - flags &= ~VMANIP_BLOCK_CONTAINS_CIGNORE; - n->setValue(flags); - } - } - } -#endif - // Data is ready now. return true; } @@ -1433,8 +1398,6 @@ void ServerMap::finishBlockMake(BlockMakeData *data, v3s16 bpmin = data->blockpos_min; v3s16 bpmax = data->blockpos_max; - v3s16 extra_borders(1, 1, 1); - bool enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info; EMERGE_DBG_OUT("finishBlockMake(): " PP(bpmin) " - " PP(bpmax)); @@ -1488,6 +1451,7 @@ void ServerMap::finishBlockMake(BlockMakeData *data, NOTE: Will be saved later. */ //save(MOD_STATE_WRITE_AT_UNLOAD); + m_chunks_in_progress.erase(bpmin); } MapSector *ServerMap::createSector(v2s16 p2d) @@ -1502,11 +1466,7 @@ MapSector *ServerMap::createSector(v2s16 p2d) /* Do not create over max mapgen limit */ - const s16 max_limit_bp = MAX_MAP_GENERATION_LIMIT / MAP_BLOCKSIZE; - if (p2d.X < -max_limit_bp || - p2d.X > max_limit_bp || - p2d.Y < -max_limit_bp || - p2d.Y > max_limit_bp) + if (blockpos_over_max_limit(v3s16(p2d.X, 0, p2d.Y))) throw InvalidPositionException("createSector(): pos. over max mapgen limit"); /* @@ -1515,9 +1475,6 @@ MapSector *ServerMap::createSector(v2s16 p2d) sector = new MapSector(this, p2d, m_gamedef); - // Sector position on map in nodes - //v2s16 nodepos2d = p2d * MAP_BLOCKSIZE; - /* Insert to container */ @@ -1526,116 +1483,6 @@ MapSector *ServerMap::createSector(v2s16 p2d) return sector; } -#if 0 -/* - This is a quick-hand function for calling makeBlock(). -*/ -MapBlock * ServerMap::generateBlock( - v3s16 p, - std::map<v3s16, MapBlock*> &modified_blocks -) -{ - bool enable_mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info"); - - TimeTaker timer("generateBlock"); - - //MapBlock *block = original_dummy; - - v2s16 p2d(p.X, p.Z); - v2s16 p2d_nodes = p2d * MAP_BLOCKSIZE; - - /* - Do not generate over-limit - */ - if(blockpos_over_limit(p)) - { - infostream<<FUNCTION_NAME<<": Block position over limit"<<std::endl; - throw InvalidPositionException("generateBlock(): pos. over limit"); - } - - /* - Create block make data - */ - BlockMakeData data; - initBlockMake(&data, p); - - /* - Generate block - */ - { - TimeTaker t("mapgen::make_block()"); - mapgen->makeChunk(&data); - //mapgen::make_block(&data); - - if(enable_mapgen_debug_info == false) - t.stop(true); // Hide output - } - - /* - Blit data back on map, update lighting, add mobs and whatever this does - */ - finishBlockMake(&data, modified_blocks); - - /* - Get central block - */ - MapBlock *block = getBlockNoCreateNoEx(p); - -#if 0 - /* - Check result - */ - if(block) - { - bool erroneus_content = false; - for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++) - for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++) - for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++) - { - v3s16 p(x0,y0,z0); - MapNode n = block->getNode(p); - if(n.getContent() == CONTENT_IGNORE) - { - infostream<<"CONTENT_IGNORE at " - <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")" - <<std::endl; - erroneus_content = true; - assert(0); - } - } - if(erroneus_content) - { - assert(0); - } - } -#endif - -#if 0 - /* - Generate a completely empty block - */ - if(block) - { - for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++) - for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++) - { - for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++) - { - MapNode n; - n.setContent(CONTENT_AIR); - block->setNode(v3s16(x0,y0,z0), n); - } - } - } -#endif - - if(enable_mapgen_debug_info == false) - timer.stop(true); // Hide output - - return block; -} -#endif - MapBlock * ServerMap::createBlock(v3s16 p) { /* @@ -1710,6 +1557,34 @@ MapBlock *ServerMap::getBlockOrEmerge(v3s16 p3d) return block; } +bool ServerMap::isBlockInQueue(v3s16 pos) +{ + return m_emerge && m_emerge->isBlockInQueue(pos); +} + +void ServerMap::addNodeAndUpdate(v3s16 p, MapNode n, + std::map<v3s16, MapBlock*> &modified_blocks, + bool remove_metadata) +{ + Map::addNodeAndUpdate(p, n, modified_blocks, remove_metadata); + + /* + Add neighboring liquid nodes and this node to transform queue. + (it's vital for the node itself to get updated last, if it was removed.) + */ + + for (const v3s16 &dir : g_7dirs) { + v3s16 p2 = p + dir; + + bool is_valid_position; + MapNode n2 = getNode(p2, &is_valid_position); + if(is_valid_position && + (m_nodedef->get(n2).isLiquid() || + n2.getContent() == CONTENT_AIR)) + m_transforming_liquid.push_back(p2); + } +} + // N.B. This requires no synchronization, since data will not be modified unless // the VoxelManipulator being updated belongs to the same thread. void ServerMap::updateVManip(v3s16 pos) @@ -1732,57 +1607,11 @@ void ServerMap::updateVManip(v3s16 pos) vm->m_is_dirty = true; } -s16 ServerMap::findGroundLevel(v2s16 p2d) +void ServerMap::reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) { -#if 0 - /* - Uh, just do something random... - */ - // Find existing map from top to down - s16 max=63; - s16 min=-64; - v3s16 p(p2d.X, max, p2d.Y); - for(; p.Y>min; p.Y--) - { - MapNode n = getNodeNoEx(p); - if(n.getContent() != CONTENT_IGNORE) - break; - } - if(p.Y == min) - goto plan_b; - // If this node is not air, go to plan b - if(getNodeNoEx(p).getContent() != CONTENT_AIR) - goto plan_b; - // Search existing walkable and return it - for(; p.Y>min; p.Y--) - { - MapNode n = getNodeNoEx(p); - if(content_walkable(n.d) && n.getContent() != CONTENT_IGNORE) - return p.Y; - } - - // Move to plan b -plan_b: -#endif - - /* - Determine from map generator noise functions - */ - - s16 level = m_emerge->getGroundLevelAtPoint(p2d); - return level; - - //double level = base_rock_level_2d(m_seed, p2d) + AVERAGE_MUD_AMOUNT; - //return (s16)level; -} - -void ServerMap::createDirs(const std::string &path) -{ - if (!fs::CreateAllDirs(path)) { - m_dout<<"ServerMap: Failed to create directory " - <<"\""<<path<<"\""<<std::endl; - throw BaseException("ServerMap failed to create directory"); - } + m_loaded_blocks_gauge->set(all_blocks); + m_save_time_counter->increment(save_time_us); + m_save_count_counter->increment(saved_blocks); } void ServerMap::save(ModifiedState save_level) @@ -1792,7 +1621,7 @@ void ServerMap::save(ModifiedState save_level) return; } - u64 start_time = porting::getTimeNs(); + const auto start_time = porting::getTimeUs(); if(save_level == MOD_STATE_CLEAN) infostream<<"ServerMap: Saving whole map, this can take time." @@ -1853,8 +1682,8 @@ void ServerMap::save(ModifiedState save_level) modprofiler.print(infostream); } - auto end_time = porting::getTimeNs(); - m_save_time_counter->increment(end_time - start_time); + const auto end_time = porting::getTimeUs(); + reportMetrics(end_time - start_time, block_count, block_count_all); } void ServerMap::listAllLoadableBlocks(std::vector<v3s16> &dst) @@ -1919,10 +1748,10 @@ void ServerMap::endSave() bool ServerMap::saveBlock(MapBlock *block) { - return saveBlock(block, dbase); + return saveBlock(block, dbase, m_map_compression_level); } -bool ServerMap::saveBlock(MapBlock *block, MapDatabase *db) +bool ServerMap::saveBlock(MapBlock *block, MapDatabase *db, int compression_level) { v3s16 p3d = block->getPos(); @@ -1942,7 +1771,7 @@ bool ServerMap::saveBlock(MapBlock *block, MapDatabase *db) */ std::ostringstream o(std::ios_base::binary); o.write((char*) &version, 1); - block->serialize(o, version, true); + block->serialize(o, version, true, compression_level); bool ret = db->saveBlock(p3d, o.str()); if (ret) { @@ -2087,6 +1916,7 @@ MMVManip::MMVManip(Map *map): VoxelManipulator(), m_map(map) { + assert(map); } void MMVManip::initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, @@ -2094,6 +1924,8 @@ void MMVManip::initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, { TimeTaker timer1("initialEmerge", &emerge_time); + assert(m_map); + // Units of these are MapBlocks v3s16 p_min = blockpos_min; v3s16 p_max = blockpos_max; @@ -2177,6 +2009,7 @@ void MMVManip::blitBackAll(std::map<v3s16, MapBlock*> *modified_blocks, { if(m_area.getExtent() == v3s16(0,0,0)) return; + assert(m_map); /* Copy data of all blocks @@ -2197,4 +2030,33 @@ void MMVManip::blitBackAll(std::map<v3s16, MapBlock*> *modified_blocks, } } +MMVManip *MMVManip::clone() const +{ + MMVManip *ret = new MMVManip(); + + const s32 size = m_area.getVolume(); + ret->m_area = m_area; + if (m_data) { + ret->m_data = new MapNode[size]; + memcpy(ret->m_data, m_data, size * sizeof(MapNode)); + } + if (m_flags) { + ret->m_flags = new u8[size]; + memcpy(ret->m_flags, m_flags, size * sizeof(u8)); + } + + ret->m_is_dirty = m_is_dirty; + // Even if the copy is disconnected from a map object keep the information + // needed to write it back to one + ret->m_loaded_blocks = m_loaded_blocks; + + return ret; +} + +void MMVManip::reparent(Map *map) +{ + assert(map && !m_map); + m_map = map; +} + //END diff --git a/src/map.h b/src/map.h index 4d9847063..6bc2aaaee 100644 --- a/src/map.h +++ b/src/map.h @@ -54,10 +54,6 @@ struct BlockMakeData; MapEditEvent */ -#define MAPTYPE_BASE 0 -#define MAPTYPE_SERVER 1 -#define MAPTYPE_CLIENT 2 - enum MapEditEventType{ // Node added (changed from air or something else to something) MEET_ADDNODE, @@ -123,15 +119,10 @@ class Map /*: public NodeContainer*/ { public: - Map(std::ostream &dout, IGameDef *gamedef); + Map(IGameDef *gamedef); virtual ~Map(); DISABLE_CLASS_COPY(Map); - virtual s32 mapType() const - { - return MAPTYPE_BASE; - } - /* Drop (client) or delete (server) the map. */ @@ -149,8 +140,6 @@ public: MapSector * getSectorNoGenerateNoLock(v2s16 p2d); // Same as the above (there exists no lock anymore) MapSector * getSectorNoGenerate(v2s16 p2d); - // Gets an existing sector or creates an empty one - //MapSector * getSectorCreate(v2s16 p2d); /* This is overloaded by ClientMap and ServerMap to allow @@ -169,9 +158,6 @@ public: inline const NodeDefManager * getNodeDefManager() { return m_nodedef; } - // Returns InvalidPositionException if not found - bool isNodeUnderground(v3s16 p); - bool isValidPosition(v3s16 p); // throws InvalidPositionException if not found @@ -185,7 +171,7 @@ public: /* These handle lighting but not faces. */ - void addNodeAndUpdate(v3s16 p, MapNode n, + virtual void addNodeAndUpdate(v3s16 p, MapNode n, std::map<v3s16, MapBlock*> &modified_blocks, bool remove_metadata = true); void removeNodeAndUpdate(v3s16 p, @@ -205,6 +191,11 @@ public: virtual void save(ModifiedState save_level) { FATAL_ERROR("FIXME"); } + /* + Return true unless the map definitely cannot save blocks. + */ + virtual bool maySaveBlocks() { return true; } + // Server implements these. // Client leaves them as no-op. virtual bool saveBlock(MapBlock *block) { return false; } @@ -212,14 +203,14 @@ public: /* Updates usage timers and unloads unused blocks and sectors. - Saves modified blocks before unloading on MAPTYPE_SERVER. + Saves modified blocks before unloading if possible. */ - void timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, + void timerUpdate(float dtime, float unload_timeout, s32 max_loaded_blocks, std::vector<v3s16> *unloaded_blocks=NULL); /* Unloads all blocks with a zero refCount(). - Saves modified blocks before unloading on MAPTYPE_SERVER. + Saves modified blocks before unloading if possible. */ void unloadUnreferencedBlocks(std::vector<v3s16> *unloaded_blocks=NULL); @@ -231,9 +222,6 @@ public: // For debug printing. Prints "Map: ", "ServerMap: " or "ClientMap: " virtual void PrintInfo(std::ostream &out); - void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks, - ServerEnvironment *env); - /* Node metadata These are basically coordinate wrappers to MapBlock @@ -268,50 +256,33 @@ public: void setNodeTimer(const NodeTimer &t); void removeNodeTimer(v3s16 p); - /* - Misc. - */ - std::map<v2s16, MapSector*> *getSectorsPtr(){return &m_sectors;} - /* Variables */ - void transforming_liquid_add(v3s16 p); - bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes); protected: - friend class LuaVoxelManip; - - std::ostream &m_dout; // A bit deprecated, could be removed - IGameDef *m_gamedef; std::set<MapEventReceiver*> m_event_receivers; - std::map<v2s16, MapSector*> m_sectors; + std::unordered_map<v2s16, MapSector*> m_sectors; // Be sure to set this to NULL when the cached sector is deleted MapSector *m_sector_cache = nullptr; v2s16 m_sector_cache_p; - // Queued transforming water nodes - UniqueQueue<v3s16> m_transforming_liquid; - // This stores the properties of the nodes on the map. const NodeDefManager *m_nodedef; + // Can be implemented by child class + virtual void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) {} + bool determineAdditionalOcclusionCheck(const v3s16 &pos_camera, const core::aabbox3d<s16> &block_bounds, v3s16 &check); bool isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target, float step, float stepfac, float start_offset, float end_offset, u32 needed_count); - -private: - f32 m_transforming_liquid_loop_count_multiplier = 1.0f; - u32 m_unprocessed_count = 0; - u64 m_inc_trending_up_start_time = 0; // milliseconds - bool m_queue_size_timer_started = false; }; /* @@ -329,11 +300,6 @@ public: ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb); ~ServerMap(); - s32 mapType() const - { - return MAPTYPE_SERVER; - } - /* Get a sector from somewhere. - Check memory @@ -364,7 +330,7 @@ public: - Create blank filled with CONTENT_IGNORE */ - MapBlock *emergeBlock(v3s16 p, bool create_blank=true); + MapBlock *emergeBlock(v3s16 p, bool create_blank=true) override; /* Try to get a block. @@ -374,14 +340,11 @@ public: */ MapBlock *getBlockOrEmerge(v3s16 p3d); - // Helper for placing objects on ground level - s16 findGroundLevel(v2s16 p2d); + bool isBlockInQueue(v3s16 pos); - /* - Misc. helper functions for fiddling with directory and file - names when saving - */ - void createDirs(const std::string &path); + void addNodeAndUpdate(v3s16 p, MapNode n, + std::map<v3s16, MapBlock*> &modified_blocks, + bool remove_metadata) override; /* Database functions @@ -389,32 +352,31 @@ public: static MapDatabase *createDatabase(const std::string &name, const std::string &savedir, Settings &conf); // Call these before and after saving of blocks - void beginSave(); - void endSave(); + void beginSave() override; + void endSave() override; - void save(ModifiedState save_level); + void save(ModifiedState save_level) override; void listAllLoadableBlocks(std::vector<v3s16> &dst); void listAllLoadedBlocks(std::vector<v3s16> &dst); MapgenParams *getMapgenParams(); - bool saveBlock(MapBlock *block); - static bool saveBlock(MapBlock *block, MapDatabase *db); + bool saveBlock(MapBlock *block) override; + static bool saveBlock(MapBlock *block, MapDatabase *db, int compression_level = -1); MapBlock* loadBlock(v3s16 p); // Database version void loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load=false); - bool deleteBlock(v3s16 blockpos); + bool deleteBlock(v3s16 blockpos) override; void updateVManip(v3s16 pos); // For debug printing - virtual void PrintInfo(std::ostream &out); + void PrintInfo(std::ostream &out) override; bool isSavingEnabled(){ return m_map_saving_enabled; } u64 getSeed(); - s16 getWaterLevel(); /*! * Fixes lighting in one map block. @@ -426,22 +388,36 @@ public: bool repairBlockLight(v3s16 blockpos, std::map<v3s16, MapBlock *> *modified_blocks); + void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks, + ServerEnvironment *env); + + void transforming_liquid_add(v3s16 p); + MapSettingsManager settings_mgr; +protected: + + void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) override; + private: + friend class LuaVoxelManip; + // Emerge manager EmergeManager *m_emerge; std::string m_savedir; bool m_map_saving_enabled; -#if 0 - // Chunk size in MapSectors - // If 0, chunks are disabled. - s16 m_chunksize; - // Chunks - core::map<v2s16, MapChunk*> m_chunks; -#endif + int m_map_compression_level; + + std::set<v3s16> m_chunks_in_progress; + + // Queued transforming water nodes + UniqueQueue<v3s16> m_transforming_liquid; + f32 m_transforming_liquid_loop_count_multiplier = 1.0f; + u32 m_unprocessed_count = 0; + u64 m_inc_trending_up_start_time = 0; // milliseconds + bool m_queue_size_timer_started = false; /* Metadata is re-written on disk only if this is true. @@ -451,7 +427,10 @@ private: MapDatabase *dbase = nullptr; MapDatabase *dbase_ro = nullptr; + // Map metrics + MetricGaugePtr m_loaded_blocks_gauge; MetricCounterPtr m_save_time_counter; + MetricCounterPtr m_save_count_counter; }; @@ -477,10 +456,25 @@ public: void blitBackAll(std::map<v3s16, MapBlock*> * modified_blocks, bool overwrite_generated = true); + /* + Creates a copy of this VManip including contents, the copy will not be + associated with a Map. + */ + MMVManip *clone() const; + + // Reassociates a copied VManip to a map + void reparent(Map *map); + + // Is it impossible to call initialEmerge / blitBackAll? + inline bool isOrphan() const { return !m_map; } + bool m_is_dirty = false; protected: - Map *m_map; + MMVManip() {}; + + // may be null + Map *m_map = nullptr; /* key = blockpos value = flags describing the block diff --git a/src/map_settings_manager.cpp b/src/map_settings_manager.cpp index 9c447b3d0..c75483edb 100644 --- a/src/map_settings_manager.cpp +++ b/src/map_settings_manager.cpp @@ -25,22 +25,25 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "map_settings_manager.h" -MapSettingsManager::MapSettingsManager(Settings *user_settings, - const std::string &map_meta_path): +MapSettingsManager::MapSettingsManager(const std::string &map_meta_path): m_map_meta_path(map_meta_path), - m_map_settings(new Settings()), - m_user_settings(user_settings) + m_hierarchy(g_settings) { - assert(m_user_settings != NULL); - - Mapgen::setDefaultSettings(m_map_settings); - // This inherits the combined defaults provided by loadGameConfAndInitWorld. - m_map_settings->overrideDefaults(user_settings); + /* + * We build our own hierarchy which falls back to the global one. + * It looks as follows: (lowest prio first) + * 0: whatever is picked up from g_settings (incl. engine defaults) + * 1: defaults set by scripts (override_meta = false) + * 2: settings present in map_meta.txt or overriden by scripts + */ + m_defaults = new Settings("", &m_hierarchy, 1); + m_map_settings = new Settings("[end_of_params]", &m_hierarchy, 2); } MapSettingsManager::~MapSettingsManager() { + delete m_defaults; delete m_map_settings; delete mapgen_params; } @@ -49,22 +52,15 @@ MapSettingsManager::~MapSettingsManager() bool MapSettingsManager::getMapSetting( const std::string &name, std::string *value_out) { - if (m_map_settings->getNoEx(name, *value_out)) - return true; - - // Compatibility kludge - if (m_user_settings == g_settings && name == "seed") - return m_user_settings->getNoEx("fixed_map_seed", *value_out); - - return m_user_settings->getNoEx(name, *value_out); + return m_map_settings->getNoEx(name, *value_out); } bool MapSettingsManager::getMapSettingNoiseParams( const std::string &name, NoiseParams *value_out) { - return m_map_settings->getNoiseParams(name, *value_out) || - m_user_settings->getNoiseParams(name, *value_out); + // TODO: Rename to "getNoiseParams" + return m_map_settings->getNoiseParams(name, *value_out); } @@ -77,7 +73,7 @@ bool MapSettingsManager::setMapSetting( if (override_meta) m_map_settings->set(name, value); else - m_map_settings->setDefault(name, value); + m_defaults->set(name, value); return true; } @@ -89,7 +85,11 @@ bool MapSettingsManager::setMapSettingNoiseParams( if (mapgen_params) return false; - m_map_settings->setNoiseParams(name, *value, !override_meta); + if (override_meta) + m_map_settings->setNoiseParams(name, *value); + else + m_defaults->setNoiseParams(name, *value); + return true; } @@ -104,8 +104,8 @@ bool MapSettingsManager::loadMapMeta() return false; } - if (!m_map_settings->parseConfigLines(is, "[end_of_params]")) { - errorstream << "loadMapMeta: [end_of_params] not found!" << std::endl; + if (!m_map_settings->parseConfigLines(is)) { + errorstream << "loadMapMeta: Format error. '[end_of_params]' missing?" << std::endl; return false; } @@ -116,28 +116,23 @@ bool MapSettingsManager::loadMapMeta() bool MapSettingsManager::saveMapMeta() { // If mapgen params haven't been created yet; abort - if (!mapgen_params) + if (!mapgen_params) { + infostream << "saveMapMeta: mapgen_params not present! " + << "Server startup was probably interrupted." << std::endl; return false; + } + // Paths set up by subgames.cpp, but not in unittests if (!fs::CreateAllDirs(fs::RemoveLastPathComponent(m_map_meta_path))) { errorstream << "saveMapMeta: could not create dirs to " << m_map_meta_path; return false; } - std::ostringstream oss(std::ios_base::binary); - Settings conf; + mapgen_params->MapgenParams::writeParams(m_map_settings); + mapgen_params->writeParams(m_map_settings); - mapgen_params->MapgenParams::writeParams(&conf); - mapgen_params->writeParams(&conf); - conf.writeLines(oss); - - // NOTE: If there are ever types of map settings other than - // those relating to map generation, save them here - - oss << "[end_of_params]\n"; - - if (!fs::safeWriteToFile(m_map_meta_path, oss.str())) { + if (!m_map_settings->updateConfigFile(m_map_meta_path.c_str())) { errorstream << "saveMapMeta: could not write " << m_map_meta_path << std::endl; return false; @@ -152,23 +147,14 @@ MapgenParams *MapSettingsManager::makeMapgenParams() if (mapgen_params) return mapgen_params; - assert(m_user_settings != NULL); - assert(m_map_settings != NULL); - - // At this point, we have (in order of precedence): - // 1). m_mapgen_settings->m_settings containing map_meta.txt settings or - // explicit overrides from scripts - // 2). m_mapgen_settings->m_defaults containing script-set mgparams without - // overrides - // 3). g_settings->m_settings containing all user-specified config file - // settings - // 4). g_settings->m_defaults containing any low-priority settings from - // scripts, e.g. mods using Lua as an enhanced config file) + assert(m_map_settings); + assert(m_defaults); // Now, get the mapgen type so we can create the appropriate MapgenParams std::string mg_name; MapgenType mgtype = getMapSetting("mg_name", &mg_name) ? Mapgen::getMapgenType(mg_name) : MAPGEN_DEFAULT; + if (mgtype == MAPGEN_INVALID) { errorstream << "EmergeManager: mapgen '" << mg_name << "' not valid; falling back to " << diff --git a/src/map_settings_manager.h b/src/map_settings_manager.h index 5baa38455..fa271268d 100644 --- a/src/map_settings_manager.h +++ b/src/map_settings_manager.h @@ -20,8 +20,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include <string> +#include "settings.h" -class Settings; struct NoiseParams; struct MapgenParams; @@ -44,8 +44,7 @@ struct MapgenParams; */ class MapSettingsManager { public: - MapSettingsManager(Settings *user_settings, - const std::string &map_meta_path); + MapSettingsManager(const std::string &map_meta_path); ~MapSettingsManager(); // Finalized map generation parameters @@ -71,6 +70,8 @@ public: private: std::string m_map_meta_path; + + SettingsHierarchy m_hierarchy; + Settings *m_defaults; Settings *m_map_settings; - Settings *m_user_settings; }; diff --git a/src/mapblock.cpp b/src/mapblock.cpp index 5b755b7a6..2bbc0ebbf 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -218,61 +218,39 @@ void MapBlock::expireDayNightDiff() m_day_night_differs_expired = true; } -s16 MapBlock::getGroundLevel(v2s16 p2d) -{ - if(isDummy()) - return -3; - try - { - s16 y = MAP_BLOCKSIZE-1; - for(; y>=0; y--) - { - MapNode n = getNodeRef(p2d.X, y, p2d.Y); - if (m_gamedef->ndef()->get(n).walkable) { - if(y == MAP_BLOCKSIZE-1) - return -2; - - return y; - } - } - return -1; - } - catch(InvalidPositionException &e) - { - return -3; - } -} - /* Serialization */ + // List relevant id-name pairs for ids in the block using nodedef -// Renumbers the content IDs (starting at 0 and incrementing -// use static memory requires about 65535 * sizeof(int) ram in order to be -// sure we can handle all content ids. But it's absolutely worth it as it's -// a speedup of 4 for one of the major time consuming functions on storing -// mapblocks. -static content_t getBlockNodeIdMapping_mapping[USHRT_MAX + 1]; +// Renumbers the content IDs (starting at 0 and incrementing) static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes, const NodeDefManager *nodedef) { - memset(getBlockNodeIdMapping_mapping, 0xFF, (USHRT_MAX + 1) * sizeof(content_t)); + // The static memory requires about 65535 * sizeof(int) RAM in order to be + // sure we can handle all content ids. But it's absolutely worth it as it's + // a speedup of 4 for one of the major time consuming functions on storing + // mapblocks. + thread_local std::unique_ptr<content_t[]> mapping; + static_assert(sizeof(content_t) == 2, "content_t must be 16-bit"); + if (!mapping) + mapping = std::make_unique<content_t[]>(USHRT_MAX + 1); - std::set<content_t> unknown_contents; + memset(mapping.get(), 0xFF, (USHRT_MAX + 1) * sizeof(content_t)); + + std::unordered_set<content_t> unknown_contents; content_t id_counter = 0; for (u32 i = 0; i < MapBlock::nodecount; i++) { content_t global_id = nodes[i].getContent(); content_t id = CONTENT_IGNORE; // Try to find an existing mapping - if (getBlockNodeIdMapping_mapping[global_id] != 0xFFFF) { - id = getBlockNodeIdMapping_mapping[global_id]; - } - else - { + if (mapping[global_id] != 0xFFFF) { + id = mapping[global_id]; + } else { // We have to assign a new mapping id = id_counter++; - getBlockNodeIdMapping_mapping[global_id] = id; + mapping[global_id] = id; const ContentFeatures &f = nodedef->get(global_id); const std::string &name = f.name; @@ -290,6 +268,7 @@ static void getBlockNodeIdMapping(NameIdMapping *nimap, MapNode *nodes, << "Name for node id " << unknown_content << " not known" << std::endl; } } + // Correct ids in the block to match nodedef based on names. // Unknown ones are added to nodedef. // Will not update itself to match id-name pairs in nodedef. @@ -355,7 +334,7 @@ static void correctBlockNodeIds(const NameIdMapping *nimap, MapNode *nodes, } } -void MapBlock::serialize(std::ostream &os, u8 version, bool disk) +void MapBlock::serialize(std::ostream &os_compressed, u8 version, bool disk, int compression_level) { if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapBlock format not supported"); @@ -365,6 +344,9 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) FATAL_ERROR_IF(version < SER_FMT_VER_LOWEST_WRITE, "Serialisation version error"); + std::ostringstream os_raw(std::ios_base::binary); + std::ostream &os = version >= 29 ? os_raw : os_compressed; + // First byte u8 flags = 0; if(is_underground) @@ -382,37 +364,52 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) Bulk node data */ NameIdMapping nimap; - if(disk) + SharedBuffer<u8> buf; + const u8 content_width = 2; + const u8 params_width = 2; + if(disk) { MapNode *tmp_nodes = new MapNode[nodecount]; - for(u32 i=0; i<nodecount; i++) - tmp_nodes[i] = data[i]; + memcpy(tmp_nodes, data, nodecount * sizeof(MapNode)); getBlockNodeIdMapping(&nimap, tmp_nodes, m_gamedef->ndef()); - u8 content_width = 2; - u8 params_width = 2; - writeU8(os, content_width); - writeU8(os, params_width); - MapNode::serializeBulk(os, version, tmp_nodes, nodecount, - content_width, params_width, true); + buf = MapNode::serializeBulk(version, tmp_nodes, nodecount, + content_width, params_width); delete[] tmp_nodes; + + // write timestamp and node/id mapping first + if (version >= 29) { + writeU32(os, getTimestamp()); + + nimap.serialize(os); + } } else { - u8 content_width = 2; - u8 params_width = 2; - writeU8(os, content_width); - writeU8(os, params_width); - MapNode::serializeBulk(os, version, data, nodecount, - content_width, params_width, true); + buf = MapNode::serializeBulk(version, data, nodecount, + content_width, params_width); + } + + writeU8(os, content_width); + writeU8(os, params_width); + if (version >= 29) { + os.write(reinterpret_cast<char*>(*buf), buf.getSize()); + } else { + // prior to 29 node data was compressed individually + compress(buf, os, version, compression_level); } /* Node metadata */ - std::ostringstream oss(std::ios_base::binary); - m_node_metadata.serialize(oss, version, disk); - compressZlib(oss.str(), os); + if (version >= 29) { + m_node_metadata.serialize(os, version, disk); + } else { + // use os_raw from above to avoid allocating another stream object + m_node_metadata.serialize(os_raw, version, disk); + // prior to 29 node data was compressed individually + compress(os_raw.str(), os, version, compression_level); + } /* Data that goes to disk, but not the network @@ -427,17 +424,24 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk) // Static objects m_static_objects.serialize(os); - // Timestamp - writeU32(os, getTimestamp()); + if(version < 29){ + // Timestamp + writeU32(os, getTimestamp()); - // Write block-specific node definition id mapping - nimap.serialize(os); + // Write block-specific node definition id mapping + nimap.serialize(os); + } if(version >= 25){ // Node timers m_node_timers.serialize(os, version); } } + + if (version >= 29) { + // now compress the whole thing + compress(os_raw.str(), os_compressed, version, compression_level); + } } void MapBlock::serializeNetworkSpecific(std::ostream &os) @@ -449,7 +453,7 @@ void MapBlock::serializeNetworkSpecific(std::ostream &os) writeU8(os, 2); // version } -void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) +void MapBlock::deSerialize(std::istream &in_compressed, u8 version, bool disk) { if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapBlock format not supported"); @@ -460,10 +464,16 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) if(version <= 21) { - deSerialize_pre22(is, version, disk); + deSerialize_pre22(in_compressed, version, disk); return; } + // Decompress the whole block (version >= 29) + std::stringstream in_raw(std::ios_base::binary | std::ios_base::in | std::ios_base::out); + if (version >= 29) + decompress(in_compressed, in_raw, version); + std::istream &is = version >= 29 ? in_raw : in_compressed; + u8 flags = readU8(is); is_underground = (flags & 0x01) != 0; m_day_night_differs = (flags & 0x02) != 0; @@ -473,9 +483,20 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) m_lighting_complete = readU16(is); m_generated = (flags & 0x08) == 0; - /* - Bulk node data - */ + NameIdMapping nimap; + if (disk && version >= 29) { + // Timestamp + TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) + <<": Timestamp"<<std::endl); + setTimestampNoChangedFlag(readU32(is)); + m_disk_timestamp = m_timestamp; + + // Node/id mapping + TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) + <<": NameIdMapping"<<std::endl); + nimap.deSerialize(is); + } + TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) <<": Bulk node data"<<std::endl); u8 content_width = readU8(is); @@ -484,29 +505,44 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) throw SerializationError("MapBlock::deSerialize(): invalid content_width"); if(params_width != 2) throw SerializationError("MapBlock::deSerialize(): invalid params_width"); - MapNode::deSerializeBulk(is, version, data, nodecount, - content_width, params_width, true); + + /* + Bulk node data + */ + if (version >= 29) { + MapNode::deSerializeBulk(is, version, data, nodecount, + content_width, params_width); + } else { + // use in_raw from above to avoid allocating another stream object + decompress(is, in_raw, version); + MapNode::deSerializeBulk(in_raw, version, data, nodecount, + content_width, params_width); + } /* NodeMetadata */ TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) <<": Node metadata"<<std::endl); - // Ignore errors - try { - std::ostringstream oss(std::ios_base::binary); - decompressZlib(is, oss); - std::istringstream iss(oss.str(), std::ios_base::binary); - if (version >= 23) - m_node_metadata.deSerialize(iss, m_gamedef->idef()); - else - content_nodemeta_deserialize_legacy(iss, - &m_node_metadata, &m_node_timers, - m_gamedef->idef()); - } catch(SerializationError &e) { - warningstream<<"MapBlock::deSerialize(): Ignoring an error" - <<" while deserializing node metadata at (" - <<PP(getPos())<<": "<<e.what()<<std::endl; + if (version >= 29) { + m_node_metadata.deSerialize(is, m_gamedef->idef()); + } else { + try { + // reuse in_raw + in_raw.str(""); + in_raw.clear(); + decompress(is, in_raw, version); + if (version >= 23) + m_node_metadata.deSerialize(in_raw, m_gamedef->idef()); + else + content_nodemeta_deserialize_legacy(in_raw, + &m_node_metadata, &m_node_timers, + m_gamedef->idef()); + } catch(SerializationError &e) { + warningstream<<"MapBlock::deSerialize(): Ignoring an error" + <<" while deserializing node metadata at (" + <<PP(getPos())<<": "<<e.what()<<std::endl; + } } /* @@ -530,17 +566,20 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) <<": Static objects"<<std::endl); m_static_objects.deSerialize(is); - // Timestamp - TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) - <<": Timestamp"<<std::endl); - setTimestamp(readU32(is)); - m_disk_timestamp = m_timestamp; + if(version < 29) { + // Timestamp + TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) + <<": Timestamp"<<std::endl); + setTimestampNoChangedFlag(readU32(is)); + m_disk_timestamp = m_timestamp; + + // Node/id mapping + TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) + <<": NameIdMapping"<<std::endl); + nimap.deSerialize(is); + } // Dynamically re-set ids based on node names - TRACESTREAM(<<"MapBlock::deSerialize "<<PP(getPos()) - <<": NameIdMapping"<<std::endl); - NameIdMapping nimap; - nimap.deSerialize(is); correctBlockNodeIds(&nimap, data, m_gamedef); if(version >= 25){ @@ -668,13 +707,13 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk) // Ignore errors try { if (version <= 15) { - std::string data = deSerializeString(is); + std::string data = deSerializeString16(is); std::istringstream iss(data, std::ios_base::binary); content_nodemeta_deserialize_legacy(iss, &m_node_metadata, &m_node_timers, m_gamedef->idef()); } else { - //std::string data = deSerializeLongString(is); + //std::string data = deSerializeString32(is); std::ostringstream oss(std::ios_base::binary); decompressZlib(is, oss); std::istringstream iss(oss.str(), std::ios_base::binary); @@ -716,10 +755,10 @@ void MapBlock::deSerialize_pre22(std::istream &is, u8 version, bool disk) // Timestamp if (version >= 17) { - setTimestamp(readU32(is)); + setTimestampNoChangedFlag(readU32(is)); m_disk_timestamp = m_timestamp; } else { - setTimestamp(BLOCK_TIMESTAMP_UNDEFINED); + setTimestampNoChangedFlag(BLOCK_TIMESTAMP_UNDEFINED); } // Dynamically re-set ids based on node names diff --git a/src/mapblock.h b/src/mapblock.h index 6b5015cab..a86db7b70 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -140,7 +140,7 @@ public: //// Flags //// - inline bool isDummy() + inline bool isDummy() const { return !data; } @@ -340,15 +340,6 @@ public: // is not valid on this MapBlock. bool isValidPositionParent(v3s16 p); MapNode getNodeParent(v3s16 p, bool *is_valid_position = NULL); - void setNodeParent(v3s16 p, MapNode & n); - - inline void drawbox(s16 x0, s16 y0, s16 z0, s16 w, s16 h, s16 d, MapNode node) - { - for (u16 z = 0; z < d; z++) - for (u16 y = 0; y < h; y++) - for (u16 x = 0; x < w; x++) - setNode(x0 + x, y0 + y, z0 + z, node); - } // Copies data to VoxelManipulator to getPosRelative() void copyTo(VoxelManipulator &dst); @@ -372,20 +363,6 @@ public: return m_day_night_differs; } - //// - //// Miscellaneous stuff - //// - - /* - Tries to measure ground level. - Return value: - -1 = only air - -2 = only ground - -3 = random fail - 0...MAP_BLOCKSIZE-1 = ground level - */ - s16 getGroundLevel(v2s16 p2d); - //// //// Timestamp (see m_timestamp) //// @@ -482,7 +459,7 @@ public: // These don't write or read version by itself // Set disk to true for on-disk format, false for over-the-network format // Precondition: version >= SER_FMT_VER_LOWEST_WRITE - void serialize(std::ostream &os, u8 version, bool disk); + void serialize(std::ostream &result, u8 version, bool disk, int compression_level); // If disk == true: In addition to doing other things, will add // unknown blocks from id-name mapping to wndef void deSerialize(std::istream &is, u8 version, bool disk); @@ -624,7 +601,7 @@ typedef std::vector<MapBlock*> MapBlockVect; inline bool objectpos_over_limit(v3f p) { - const float max_limit_bs = MAX_MAP_GENERATION_LIMIT * BS; + const float max_limit_bs = (MAX_MAP_GENERATION_LIMIT + 0.5f) * BS; return p.X < -max_limit_bs || p.X > max_limit_bs || p.Y < -max_limit_bs || diff --git a/src/mapgen/dungeongen.cpp b/src/mapgen/dungeongen.cpp index acdb1a0f0..1d439abeb 100644 --- a/src/mapgen/dungeongen.cpp +++ b/src/mapgen/dungeongen.cpp @@ -71,7 +71,7 @@ DungeonGen::DungeonGen(const NodeDefManager *ndef, dp.num_dungeons = 1; dp.notifytype = GENNOTIFY_DUNGEON; - dp.np_alt_wall = + dp.np_alt_wall = NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0); } } diff --git a/src/mapgen/mapgen.cpp b/src/mapgen/mapgen.cpp index 52ef64e7e..99db50426 100644 --- a/src/mapgen/mapgen.cpp +++ b/src/mapgen/mapgen.cpp @@ -238,32 +238,13 @@ u32 Mapgen::getBlockSeed(v3s16 p, s32 seed) u32 Mapgen::getBlockSeed2(v3s16 p, s32 seed) { - u32 n = 1619 * p.X + 31337 * p.Y + 52591 * p.Z + 1013 * seed; + // Multiply by unsigned number to avoid signed overflow (UB) + u32 n = 1619U * p.X + 31337U * p.Y + 52591U * p.Z + 1013U * seed; n = (n >> 13) ^ n; return (n * (n * n * 60493 + 19990303) + 1376312589); } -// Returns Y one under area minimum if not found -s16 Mapgen::findGroundLevelFull(v2s16 p2d) -{ - const v3s16 &em = vm->m_area.getExtent(); - s16 y_nodes_max = vm->m_area.MaxEdge.Y; - s16 y_nodes_min = vm->m_area.MinEdge.Y; - u32 i = vm->m_area.index(p2d.X, y_nodes_max, p2d.Y); - s16 y; - - for (y = y_nodes_max; y >= y_nodes_min; y--) { - MapNode &n = vm->m_data[i]; - if (ndef->get(n).walkable) - break; - - VoxelArea::add_y(em, i, -1); - } - return (y >= y_nodes_min) ? y : y_nodes_min - 1; -} - - // Returns -MAX_MAP_GENERATION_LIMIT if not found s16 Mapgen::findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax) { @@ -472,9 +453,8 @@ void Mapgen::lightSpread(VoxelArea &a, std::queue<std::pair<v3s16, u8>> &queue, !ndef->get(n).light_propagates) return; - // Since this recursive function only terminates when there is no light from - // either bank left, we need to take the max of both banks into account for - // the case where spreading has stopped for one light bank but not the other. + // MYMAX still needed here because we only exit early if both banks have + // nothing to propagate anymore. light = MYMAX(light_day, n.param1 & 0x0F) | MYMAX(light_night, n.param1 & 0xF0); @@ -489,12 +469,9 @@ void Mapgen::calcLighting(v3s16 nmin, v3s16 nmax, v3s16 full_nmin, v3s16 full_nm bool propagate_shadow) { ScopeProfiler sp(g_profiler, "EmergeThread: update lighting", SPT_AVG); - //TimeTaker t("updateLighting"); propagateSunlight(nmin, nmax, propagate_shadow); spreadLight(full_nmin, full_nmax); - - //printf("updateLighting: %dms\n", t.stop()); } @@ -615,7 +592,8 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeParams *emerg this->heightmap = new s16[csize.X * csize.Z]; //// Initialize biome generator - biomegen = m_bmgr->createBiomeGen(BIOMEGEN_ORIGINAL, params->bparams, csize); + biomegen = emerge->biomegen; + biomegen->assertChunkSize(csize); biomemap = biomegen->biomemap; //// Look up some commonly used content @@ -641,7 +619,6 @@ MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeParams *emerg MapgenBasic::~MapgenBasic() { - delete biomegen; delete []heightmap; delete m_emerge; // destroying EmergeParams is our responsibility @@ -984,19 +961,6 @@ GenerateNotifier::GenerateNotifier(u32 notify_on, } -void GenerateNotifier::setNotifyOn(u32 notify_on) -{ - m_notify_on = notify_on; -} - - -void GenerateNotifier::setNotifyOnDecoIds( - const std::set<u32> *notify_on_deco_ids) -{ - m_notify_on_deco_ids = notify_on_deco_ids; -} - - bool GenerateNotifier::addEvent(GenNotifyType type, v3s16 pos, u32 id) { if (!(m_notify_on & (1 << type))) @@ -1051,10 +1015,11 @@ MapgenParams::~MapgenParams() void MapgenParams::readParams(const Settings *settings) { - std::string seed_str; - const char *seed_name = (settings == g_settings) ? "fixed_map_seed" : "seed"; + // should always be used via MapSettingsManager + assert(settings != g_settings); - if (settings->getNoEx(seed_name, seed_str)) { + std::string seed_str; + if (settings->getNoEx("seed", seed_str)) { if (!seed_str.empty()) seed = read_seed(seed_str.c_str()); else @@ -1073,6 +1038,8 @@ void MapgenParams::readParams(const Settings *settings) settings->getS16NoEx("chunksize", chunksize); settings->getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen); + chunksize = rangelim(chunksize, 1, 10); + delete bparams; bparams = BiomeManager::createBiomeParams(BIOMEGEN_ORIGINAL); if (bparams) { diff --git a/src/mapgen/mapgen.h b/src/mapgen/mapgen.h index 0f2977c4c..ef5de6029 100644 --- a/src/mapgen/mapgen.h +++ b/src/mapgen/mapgen.h @@ -30,10 +30,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MAPGEN_DEFAULT_NAME "v7" /////////////////// Mapgen flags -#define MG_TREES 0x01 // Obsolete. Moved into mgv6 flags #define MG_CAVES 0x02 #define MG_DUNGEONS 0x04 -#define MG_FLAT 0x08 // Obsolete. Moved into mgv6 flags #define MG_LIGHT 0x10 #define MG_DECORATIONS 0x20 #define MG_BIOMES 0x40 @@ -88,19 +86,17 @@ struct GenNotifyEvent { class GenerateNotifier { public: + // Use only for temporary Mapgen objects with no map generation! GenerateNotifier() = default; GenerateNotifier(u32 notify_on, const std::set<u32> *notify_on_deco_ids); - void setNotifyOn(u32 notify_on); - void setNotifyOnDecoIds(const std::set<u32> *notify_on_deco_ids); - bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0); void getEvents(std::map<std::string, std::vector<v3s16> > &event_map); void clearEvents(); private: u32 m_notify_on = 0; - const std::set<u32> *m_notify_on_deco_ids; + const std::set<u32> *m_notify_on_deco_ids = nullptr; std::list<GenNotifyEvent> m_notify_events; }; @@ -186,7 +182,6 @@ public: static u32 getBlockSeed(v3s16 p, s32 seed); static u32 getBlockSeed2(v3s16 p, s32 seed); - s16 findGroundLevelFull(v2s16 p2d); s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax); s16 findLiquidSurface(v2s16 p2d, s16 ymin, s16 ymax); void updateHeightmap(v3s16 nmin, v3s16 nmax); @@ -195,12 +190,38 @@ public: void updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nmax); + /** + * Set light in entire area to fixed value. + * @param light Light value (contains both banks) + * @param nmin Area to operate on + * @param nmax ^ + */ void setLighting(u8 light, v3s16 nmin, v3s16 nmax); - void lightSpread(VoxelArea &a, std::queue<std::pair<v3s16, u8>> &queue, - const v3s16 &p, u8 light); + /** + * Run all lighting calculations. + * @param nmin Area to spread sunlight in + * @param nmax ^ + * @param full_nmin Area to recalculate light in + * @param full_nmax ^ + * @param propagate_shadow see propagateSunlight() + */ void calcLighting(v3s16 nmin, v3s16 nmax, v3s16 full_nmin, v3s16 full_nmax, bool propagate_shadow = true); + /** + * Spread sunlight from the area above downwards. + * Note that affected nodes have their night bank cleared so you want to + * run a light spread afterwards. + * @param nmin Area to operate on + * @param nmax ^ + * @param propagate_shadow Ignore obstructions above and spread sun anyway + */ void propagateSunlight(v3s16 nmin, v3s16 nmax, bool propagate_shadow); + /** + * Spread light in the given area. + * Artificial light is taken from nodedef, sunlight must already be set. + * @param nmin Area to operate on + * @param nmax ^ + */ void spreadLight(const v3s16 &nmin, const v3s16 &nmax); virtual void makeChunk(BlockMakeData *data) {} @@ -223,6 +244,18 @@ public: static void setDefaultSettings(Settings *settings); private: + /** + * Spread light to the node at the given position, add to queue if changed. + * The given light value is diminished once. + * @param a VoxelArea being operated on + * @param queue Queue for later lightSpread() calls + * @param p Node position + * @param light Light value (contains both banks) + * + */ + void lightSpread(VoxelArea &a, std::queue<std::pair<v3s16, u8>> &queue, + const v3s16 &p, u8 light); + // isLiquidHorizontallyFlowable() is a helper function for updateLiquid() // that checks whether there are floodable nodes without liquid beneath // the node at index vi. diff --git a/src/mapgen/mapgen_carpathian.cpp b/src/mapgen/mapgen_carpathian.cpp index 74ed263ba..b3a0bd270 100644 --- a/src/mapgen/mapgen_carpathian.cpp +++ b/src/mapgen/mapgen_carpathian.cpp @@ -260,12 +260,6 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_flat.cpp b/src/mapgen/mapgen_flat.cpp index d62548014..6b249ea1f 100644 --- a/src/mapgen/mapgen_flat.cpp +++ b/src/mapgen/mapgen_flat.cpp @@ -177,7 +177,7 @@ void MapgenFlatParams::setDefaultSettings(Settings *settings) int MapgenFlat::getSpawnLevelAtPoint(v2s16 p) { s16 stone_level = ground_level; - float n_terrain = + float n_terrain = ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) ? NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed) : 0.0f; @@ -209,12 +209,6 @@ void MapgenFlat::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_fractal.cpp b/src/mapgen/mapgen_fractal.cpp index 3b6bbd6c1..c9071cecf 100644 --- a/src/mapgen/mapgen_fractal.cpp +++ b/src/mapgen/mapgen_fractal.cpp @@ -131,6 +131,7 @@ void MapgenFractalParams::readParams(const Settings *settings) settings->getNoiseParams("mgfractal_np_cave1", np_cave1); settings->getNoiseParams("mgfractal_np_cave2", np_cave2); settings->getNoiseParams("mgfractal_np_dungeons", np_dungeons); + iterations = std::max<u16>(iterations, 1); } @@ -209,12 +210,6 @@ void MapgenFractal::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); //TimeTaker t("makeChunk"); diff --git a/src/mapgen/mapgen_singlenode.cpp b/src/mapgen/mapgen_singlenode.cpp index cade9e7a8..5382423fa 100644 --- a/src/mapgen/mapgen_singlenode.cpp +++ b/src/mapgen/mapgen_singlenode.cpp @@ -50,12 +50,6 @@ void MapgenSinglenode::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_v5.cpp b/src/mapgen/mapgen_v5.cpp index 0f6a19fa1..87e54755f 100644 --- a/src/mapgen/mapgen_v5.cpp +++ b/src/mapgen/mapgen_v5.cpp @@ -201,12 +201,6 @@ void MapgenV5::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_v6.cpp b/src/mapgen/mapgen_v6.cpp index 8bea5eb69..a418acace 100644 --- a/src/mapgen/mapgen_v6.cpp +++ b/src/mapgen/mapgen_v6.cpp @@ -341,12 +341,6 @@ float MapgenV6::baseTerrainLevelFromMap(int index) } -s16 MapgenV6::find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision) -{ - return baseTerrainLevelFromNoise(p2d) + MGV6_AVERAGE_MUD_AMOUNT; -} - - int MapgenV6::getGroundLevelAtPoint(v2s16 p) { return baseTerrainLevelFromNoise(p) + MGV6_AVERAGE_MUD_AMOUNT; @@ -366,19 +360,6 @@ int MapgenV6::getSpawnLevelAtPoint(v2s16 p) //////////////////////// Noise functions -float MapgenV6::getMudAmount(v2s16 p) -{ - int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); - return getMudAmount(index); -} - - -bool MapgenV6::getHaveBeach(v2s16 p) -{ - int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X); - return getHaveBeach(index); -} - BiomeV6Type MapgenV6::getBiome(v2s16 p) { @@ -518,12 +499,6 @@ void MapgenV6::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; @@ -804,7 +779,7 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos) v3s16(0, 0, -1), // Front v3s16(-1, 0, 0), // Left }; - + // Iterate twice for (s16 k = 0; k < 2; k++) { for (s16 z = mudflow_minpos; z <= mudflow_maxpos; z++) @@ -1067,7 +1042,6 @@ void MapgenV6::growGrass() // Add surface nodes MapNode n_dirt_with_grass(c_dirt_with_grass); MapNode n_dirt_with_snow(c_dirt_with_snow); MapNode n_snowblock(c_snowblock); - MapNode n_snow(c_snow); const v3s16 &em = vm->m_area.getExtent(); u32 index = 0; diff --git a/src/mapgen/mapgen_v6.h b/src/mapgen/mapgen_v6.h index ff565edec..b0eb67893 100644 --- a/src/mapgen/mapgen_v6.h +++ b/src/mapgen/mapgen_v6.h @@ -150,14 +150,11 @@ public: s16 find_stone_level(v2s16 p2d); bool block_is_underground(u64 seed, v3s16 blockpos); - s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); float getHumidity(v2s16 p); float getTreeAmount(v2s16 p); bool getHaveAppleTree(v2s16 p); - float getMudAmount(v2s16 p); - virtual float getMudAmount(int index); - bool getHaveBeach(v2s16 p); + float getMudAmount(int index); bool getHaveBeach(int index); BiomeV6Type getBiome(v2s16 p); BiomeV6Type getBiome(int index, v2s16 p); diff --git a/src/mapgen/mapgen_v7.cpp b/src/mapgen/mapgen_v7.cpp index a1fe25ab6..91f004518 100644 --- a/src/mapgen/mapgen_v7.cpp +++ b/src/mapgen/mapgen_v7.cpp @@ -297,7 +297,7 @@ int MapgenV7::getSpawnLevelAtPoint(v2s16 p) int iters = 256; while (iters > 0 && y <= max_spawn_y) { if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) { - if (y <= water_level || y > max_spawn_y) + if (y <= water_level) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point // y + 1 due to biome 'dust' @@ -317,12 +317,6 @@ void MapgenV7::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); //TimeTaker t("makeChunk"); @@ -342,10 +336,6 @@ void MapgenV7::makeChunk(BlockMakeData *data) // Generate base and mountain terrain s16 stone_surface_max_y = generateTerrain(); - // Generate rivers - if (spflags & MGV7_RIDGES) - generateRidgeTerrain(); - // Create heightmap updateHeightmap(node_min, node_max); @@ -467,6 +457,23 @@ bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y) } +bool MapgenV7::getRiverChannelFromMap(int idx_xyz, int idx_xz, s16 y) +{ + // Maximum width of river channel. Creates the vertical canyon walls + float width = 0.2f; + float absuwatern = std::fabs(noise_ridge_uwater->result[idx_xz]) * 2.0f; + if (absuwatern > width) + return false; + + float altitude = y - water_level; + float height_mod = (altitude + 17.0f) / 2.5f; + float width_mod = width - absuwatern; + float nridge = noise_ridge->result[idx_xyz] * std::fmax(altitude, 0.0f) / 7.0f; + + return nridge + width_mod * height_mod >= 0.6f; +} + + bool MapgenV7::getFloatlandTerrainFromMap(int idx_xyz, float float_offset) { return noise_floatland->result[idx_xyz] + floatland_density - float_offset >= 0.0f; @@ -521,6 +528,15 @@ int MapgenV7::generateTerrain() } } + // 'Generate rivers in this mapchunk' bool for + // simplification of condition checks in y-loop. + bool gen_rivers = (spflags & MGV7_RIDGES) && node_max.Y >= water_level - 16 && + !gen_floatlands; + if (gen_rivers) { + noise_ridge->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z); + noise_ridge_uwater->perlinMap2D(node_min.X, node_min.Z); + } + //// Place nodes const v3s16 &em = vm->m_area.getExtent(); s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; @@ -544,10 +560,13 @@ int MapgenV7::generateTerrain() if (vm->m_data[vi].getContent() != CONTENT_IGNORE) continue; - if (y <= surface_y) { + bool is_river_channel = gen_rivers && + getRiverChannelFromMap(index3d, index2d, y); + if (y <= surface_y && !is_river_channel) { vm->m_data[vi] = n_stone; // Base terrain } else if ((spflags & MGV7_MOUNTAINS) && - getMountainTerrainFromMap(index3d, index2d, y)) { + getMountainTerrainFromMap(index3d, index2d, y) && + !is_river_channel) { vm->m_data[vi] = n_stone; // Mountain terrain if (y > stone_surface_max_y) stone_surface_max_y = y; @@ -569,45 +588,3 @@ int MapgenV7::generateTerrain() return stone_surface_max_y; } - - -void MapgenV7::generateRidgeTerrain() -{ - if (node_max.Y < water_level - 16 || - (node_max.Y >= floatland_ymin && node_min.Y <= floatland_ymax)) - return; - - noise_ridge->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z); - noise_ridge_uwater->perlinMap2D(node_min.X, node_min.Z); - - MapNode n_water(c_water_source); - MapNode n_air(CONTENT_AIR); - u32 index3d = 0; - float width = 0.2f; - - for (s16 z = node_min.Z; z <= node_max.Z; z++) - for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { - u32 vi = vm->m_area.index(node_min.X, y, z); - for (s16 x = node_min.X; x <= node_max.X; x++, index3d++, vi++) { - u32 index2d = (z - node_min.Z) * csize.X + (x - node_min.X); - float uwatern = noise_ridge_uwater->result[index2d] * 2.0f; - if (std::fabs(uwatern) > width) - continue; - // Optimises, but also avoids removing nodes placed by mods in - // 'on-generated', when generating outside mapchunk. - content_t c = vm->m_data[vi].getContent(); - if (c != c_stone) - continue; - - float altitude = y - water_level; - float height_mod = (altitude + 17.0f) / 2.5f; - float width_mod = width - std::fabs(uwatern); - float nridge = noise_ridge->result[index3d] * - std::fmax(altitude, 0.0f) / 7.0f; - if (nridge + width_mod * height_mod < 0.6f) - continue; - - vm->m_data[vi] = (y > water_level) ? n_air : n_water; - } - } -} diff --git a/src/mapgen/mapgen_v7.h b/src/mapgen/mapgen_v7.h index 4020cd935..5db10a304 100644 --- a/src/mapgen/mapgen_v7.h +++ b/src/mapgen/mapgen_v7.h @@ -94,10 +94,10 @@ public: float baseTerrainLevelFromMap(int index); bool getMountainTerrainAtPoint(s16 x, s16 y, s16 z); bool getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y); + bool getRiverChannelFromMap(int idx_xyz, int idx_xz, s16 y); bool getFloatlandTerrainFromMap(int idx_xyz, float float_offset); int generateTerrain(); - void generateRidgeTerrain(); private: s16 mount_zero_level; diff --git a/src/mapgen/mapgen_valleys.cpp b/src/mapgen/mapgen_valleys.cpp index d7b6f738f..80a99b1f0 100644 --- a/src/mapgen/mapgen_valleys.cpp +++ b/src/mapgen/mapgen_valleys.cpp @@ -57,7 +57,8 @@ FlagDesc flagdesc_mapgen_valleys[] = { MapgenValleys::MapgenValleys(MapgenValleysParams *params, EmergeParams *emerge) : MapgenBasic(MAPGEN_VALLEYS, params, emerge) { - // NOTE: MapgenValleys has a hard dependency on BiomeGenOriginal + FATAL_ERROR_IF(biomegen->getType() != BIOMEGEN_ORIGINAL, + "MapgenValleys has a hard dependency on BiomeGenOriginal"); m_bgen = (BiomeGenOriginal *)biomegen; spflags = params->spflags; @@ -210,12 +211,6 @@ void MapgenValleys::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); //TimeTaker t("makeChunk"); diff --git a/src/mapgen/mg_biome.cpp b/src/mapgen/mg_biome.cpp index 610c38594..8b4c96cd5 100644 --- a/src/mapgen/mg_biome.cpp +++ b/src/mapgen/mg_biome.cpp @@ -101,71 +101,6 @@ BiomeManager *BiomeManager::clone() const return mgr; } - -// For BiomeGen type 'BiomeGenOriginal' -float BiomeManager::getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat, - NoiseParams &np_heat_blend, u64 seed) const -{ - return - NoisePerlin2D(&np_heat, pos.X, pos.Z, seed) + - NoisePerlin2D(&np_heat_blend, pos.X, pos.Z, seed); -} - - -// For BiomeGen type 'BiomeGenOriginal' -float BiomeManager::getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity, - NoiseParams &np_humidity_blend, u64 seed) const -{ - return - NoisePerlin2D(&np_humidity, pos.X, pos.Z, seed) + - NoisePerlin2D(&np_humidity_blend, pos.X, pos.Z, seed); -} - - -// For BiomeGen type 'BiomeGenOriginal' -const Biome *BiomeManager::getBiomeFromNoiseOriginal(float heat, - float humidity, v3s16 pos) const -{ - Biome *biome_closest = nullptr; - Biome *biome_closest_blend = nullptr; - float dist_min = FLT_MAX; - float dist_min_blend = FLT_MAX; - - for (size_t i = 1; i < getNumObjects(); i++) { - Biome *b = (Biome *)getRaw(i); - if (!b || - pos.Y < b->min_pos.Y || pos.Y > b->max_pos.Y + b->vertical_blend || - pos.X < b->min_pos.X || pos.X > b->max_pos.X || - pos.Z < b->min_pos.Z || pos.Z > b->max_pos.Z) - continue; - - float d_heat = heat - b->heat_point; - float d_humidity = humidity - b->humidity_point; - float dist = (d_heat * d_heat) + (d_humidity * d_humidity); - - if (pos.Y <= b->max_pos.Y) { // Within y limits of biome b - if (dist < dist_min) { - dist_min = dist; - biome_closest = b; - } - } else if (dist < dist_min_blend) { // Blend area above biome b - dist_min_blend = dist; - biome_closest_blend = b; - } - } - - const u64 seed = pos.Y + (heat + humidity) * 0.9f; - PcgRandom rng(seed); - - if (biome_closest_blend && dist_min_blend <= dist_min && - rng.range(0, biome_closest_blend->vertical_blend) >= - pos.Y - biome_closest_blend->max_pos.Y) - return biome_closest_blend; - - return (biome_closest) ? biome_closest : (Biome *)getRaw(BIOME_NONE); -} - - //////////////////////////////////////////////////////////////////////////////// void BiomeParamsOriginal::readParams(const Settings *settings) @@ -189,7 +124,7 @@ void BiomeParamsOriginal::writeParams(Settings *settings) const //////////////////////////////////////////////////////////////////////////////// BiomeGenOriginal::BiomeGenOriginal(BiomeManager *biomemgr, - BiomeParamsOriginal *params, v3s16 chunksize) + const BiomeParamsOriginal *params, v3s16 chunksize) { m_bmgr = biomemgr; m_params = params; @@ -224,17 +159,26 @@ BiomeGenOriginal::~BiomeGenOriginal() delete noise_humidity_blend; } -// Only usable in a mapgen thread +BiomeGen *BiomeGenOriginal::clone(BiomeManager *biomemgr) const +{ + return new BiomeGenOriginal(biomemgr, m_params, m_csize); +} + +float BiomeGenOriginal::calcHeatAtPoint(v3s16 pos) const +{ + return NoisePerlin2D(&m_params->np_heat, pos.X, pos.Z, m_params->seed) + + NoisePerlin2D(&m_params->np_heat_blend, pos.X, pos.Z, m_params->seed); +} + +float BiomeGenOriginal::calcHumidityAtPoint(v3s16 pos) const +{ + return NoisePerlin2D(&m_params->np_humidity, pos.X, pos.Z, m_params->seed) + + NoisePerlin2D(&m_params->np_humidity_blend, pos.X, pos.Z, m_params->seed); +} + Biome *BiomeGenOriginal::calcBiomeAtPoint(v3s16 pos) const { - float heat = - NoisePerlin2D(&m_params->np_heat, pos.X, pos.Z, m_params->seed) + - NoisePerlin2D(&m_params->np_heat_blend, pos.X, pos.Z, m_params->seed); - float humidity = - NoisePerlin2D(&m_params->np_humidity, pos.X, pos.Z, m_params->seed) + - NoisePerlin2D(&m_params->np_humidity_blend, pos.X, pos.Z, m_params->seed); - - return calcBiomeFromNoise(heat, humidity, pos); + return calcBiomeFromNoise(calcHeatAtPoint(pos), calcHumidityAtPoint(pos), pos); } @@ -329,7 +273,7 @@ Biome *BiomeGenOriginal::calcBiomeFromNoise(float heat, float humidity, v3s16 po pos.Y - biome_closest_blend->max_pos.Y) return biome_closest_blend; - return (biome_closest) ? biome_closest : (Biome *)m_bmgr->getRaw(BIOME_NONE); + return (biome_closest) ? biome_closest : (Biome *)m_bmgr->getRaw(BIOME_NONE); } diff --git a/src/mapgen/mg_biome.h b/src/mapgen/mg_biome.h index be4cfea4d..c85afc3a0 100644 --- a/src/mapgen/mg_biome.h +++ b/src/mapgen/mg_biome.h @@ -97,6 +97,15 @@ public: virtual BiomeGenType getType() const = 0; + // Clone this BiomeGen and set a the new BiomeManager to be used by the copy + virtual BiomeGen *clone(BiomeManager *biomemgr) const = 0; + + // Check that the internal chunk size is what the mapgen expects, just to be sure. + inline void assertChunkSize(v3s16 expect) const + { + FATAL_ERROR_IF(m_csize != expect, "Chunk size mismatches"); + } + // Calculates the biome at the exact position provided. This function can // be called at any time, but may be less efficient than the latter methods, // depending on implementation. @@ -158,12 +167,18 @@ struct BiomeParamsOriginal : public BiomeParams { class BiomeGenOriginal : public BiomeGen { public: BiomeGenOriginal(BiomeManager *biomemgr, - BiomeParamsOriginal *params, v3s16 chunksize); + const BiomeParamsOriginal *params, v3s16 chunksize); virtual ~BiomeGenOriginal(); BiomeGenType getType() const { return BIOMEGEN_ORIGINAL; } + BiomeGen *clone(BiomeManager *biomemgr) const; + + // Slower, meant for Script API use + float calcHeatAtPoint(v3s16 pos) const; + float calcHumidityAtPoint(v3s16 pos) const; Biome *calcBiomeAtPoint(v3s16 pos) const; + void calcBiomeNoise(v3s16 pmin); biome_t *getBiomes(s16 *heightmap, v3s16 pmin); @@ -176,7 +191,7 @@ public: float *humidmap; private: - BiomeParamsOriginal *m_params; + const BiomeParamsOriginal *m_params; Noise *noise_heat; Noise *noise_humidity; @@ -229,14 +244,6 @@ public: virtual void clear(); - // For BiomeGen type 'BiomeGenOriginal' - float getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat, - NoiseParams &np_heat_blend, u64 seed) const; - float getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity, - NoiseParams &np_humidity_blend, u64 seed) const; - const Biome *getBiomeFromNoiseOriginal(float heat, float humidity, - v3s16 pos) const; - private: BiomeManager() {}; diff --git a/src/mapgen/mg_ore.cpp b/src/mapgen/mg_ore.cpp index b50ed6a32..4f0c35548 100644 --- a/src/mapgen/mg_ore.cpp +++ b/src/mapgen/mg_ore.cpp @@ -498,7 +498,11 @@ void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed, } // randval ranges from -1..1 - float randval = (float)pr.next() / (pr.RANDOM_RANGE / 2) - 1.f; + /* + Note: can generate values slightly larger than 1 + but this can't be changed as mapgen must be deterministic accross versions. + */ + float randval = (float)pr.next() / float(pr.RANDOM_RANGE / 2) - 1.f; float noiseval = contour(noise->result[index]); float noiseval2 = contour(noise2->result[index]); if (noiseval * noiseval2 + randval * random_factor < nthresh) diff --git a/src/mapgen/mg_ore.h b/src/mapgen/mg_ore.h index 76420fab4..a757fa6d0 100644 --- a/src/mapgen/mg_ore.h +++ b/src/mapgen/mg_ore.h @@ -52,7 +52,7 @@ extern FlagDesc flagdesc_ore[]; class Ore : public ObjDef, public NodeResolver { public: - static const bool NEEDS_NOISE = false; + const bool needs_noise; content_t c_ore; // the node to place std::vector<content_t> c_wherein; // the nodes to be placed in @@ -68,7 +68,7 @@ public: Noise *noise = nullptr; std::unordered_set<biome_t> biomes; - Ore() = default;; + explicit Ore(bool needs_noise): needs_noise(needs_noise) {} virtual ~Ore(); virtual void resolveNodeNames(); @@ -83,88 +83,81 @@ protected: class OreScatter : public Ore { public: - static const bool NEEDS_NOISE = false; + OreScatter() : Ore(false) {} - ObjDef *clone() const; + ObjDef *clone() const override; - virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, - v3s16 nmin, v3s16 nmax, biome_t *biomemap); + void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; }; class OreSheet : public Ore { public: - static const bool NEEDS_NOISE = true; + OreSheet() : Ore(true) {} - ObjDef *clone() const; + ObjDef *clone() const override; u16 column_height_min; u16 column_height_max; float column_midpoint_factor; - virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, - v3s16 nmin, v3s16 nmax, biome_t *biomemap); + void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; }; class OrePuff : public Ore { public: - static const bool NEEDS_NOISE = true; - - ObjDef *clone() const; + ObjDef *clone() const override; NoiseParams np_puff_top; NoiseParams np_puff_bottom; Noise *noise_puff_top = nullptr; Noise *noise_puff_bottom = nullptr; - OrePuff() = default; + OrePuff() : Ore(true) {} virtual ~OrePuff(); - virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, - v3s16 nmin, v3s16 nmax, biome_t *biomemap); + void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; }; class OreBlob : public Ore { public: - static const bool NEEDS_NOISE = true; + ObjDef *clone() const override; - ObjDef *clone() const; - - virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, - v3s16 nmin, v3s16 nmax, biome_t *biomemap); + OreBlob() : Ore(true) {} + void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; }; class OreVein : public Ore { public: - static const bool NEEDS_NOISE = true; - - ObjDef *clone() const; + ObjDef *clone() const override; float random_factor; Noise *noise2 = nullptr; int sizey_prev = 0; - OreVein() = default; + OreVein() : Ore(true) {} virtual ~OreVein(); - virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, - v3s16 nmin, v3s16 nmax, biome_t *biomemap); + void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; }; class OreStratum : public Ore { public: - static const bool NEEDS_NOISE = false; - - ObjDef *clone() const; + ObjDef *clone() const override; NoiseParams np_stratum_thickness; Noise *noise_stratum_thickness = nullptr; u16 stratum_thickness; - OreStratum() = default; + OreStratum() : Ore(false) {} virtual ~OreStratum(); - virtual void generate(MMVManip *vm, int mapseed, u32 blockseed, - v3s16 nmin, v3s16 nmax, biome_t *biomemap); + void generate(MMVManip *vm, int mapseed, u32 blockseed, + v3s16 nmin, v3s16 nmax, biome_t *biomemap) override; }; class OreManager : public ObjDefManager { diff --git a/src/mapgen/mg_schematic.cpp b/src/mapgen/mg_schematic.cpp index ba102d997..b9ba70302 100644 --- a/src/mapgen/mg_schematic.cpp +++ b/src/mapgen/mg_schematic.cpp @@ -76,10 +76,6 @@ void SchematicManager::clear() /////////////////////////////////////////////////////////////////////////////// -Schematic::Schematic() -= default; - - Schematic::~Schematic() { delete []schemdata; @@ -108,13 +104,19 @@ ObjDef *Schematic::clone() const void Schematic::resolveNodeNames() { + c_nodes.clear(); getIdsFromNrBacklog(&c_nodes, true, CONTENT_AIR); size_t bufsize = size.X * size.Y * size.Z; for (size_t i = 0; i != bufsize; i++) { content_t c_original = schemdata[i].getContent(); - content_t c_new = c_nodes[c_original]; - schemdata[i].setContent(c_new); + if (c_original >= c_nodes.size()) { + errorstream << "Corrupt schematic. name=\"" << name + << "\" at index " << i << std::endl; + c_original = 0; + } + // Unfold condensed ID layout to content_t + schemdata[i].setContent(c_nodes[c_original]); } } @@ -279,8 +281,7 @@ void Schematic::placeOnMap(ServerMap *map, v3s16 p, u32 flags, } -bool Schematic::deserializeFromMts(std::istream *is, - std::vector<std::string> *names) +bool Schematic::deserializeFromMts(std::istream *is) { std::istream &ss = *is; content_t cignore = CONTENT_IGNORE; @@ -312,9 +313,11 @@ bool Schematic::deserializeFromMts(std::istream *is, slice_probs[y] = (version >= 3) ? readU8(ss) : MTSCHEM_PROB_ALWAYS_OLD; //// Read node names + NodeResolver::reset(); + u16 nidmapcount = readU16(ss); for (int i = 0; i != nidmapcount; i++) { - std::string name = deSerializeString(ss); + std::string name = deSerializeString16(ss); // Instances of "ignore" from v1 are converted to air (and instances // are fixed to have MTSCHEM_PROB_NEVER later on). @@ -324,17 +327,22 @@ bool Schematic::deserializeFromMts(std::istream *is, have_cignore = true; } - names->push_back(name); + m_nodenames.push_back(name); } + // Prepare for node resolver + m_nnlistsizes.push_back(m_nodenames.size()); + //// Read node data size_t nodecount = size.X * size.Y * size.Z; delete []schemdata; schemdata = new MapNode[nodecount]; - MapNode::deSerializeBulk(ss, SER_FMT_VER_HIGHEST_READ, schemdata, - nodecount, 2, 2, true); + std::stringstream d_ss(std::ios_base::binary | std::ios_base::in | std::ios_base::out); + decompress(ss, d_ss, MTSCHEM_MAPNODE_SER_FMT_VER); + MapNode::deSerializeBulk(d_ss, MTSCHEM_MAPNODE_SER_FMT_VER, schemdata, + nodecount, 2, 2); // Fix probability values for nodes that were ignore; removed in v2 if (version < 2) { @@ -358,9 +366,11 @@ bool Schematic::deserializeFromMts(std::istream *is, } -bool Schematic::serializeToMts(std::ostream *os, - const std::vector<std::string> &names) const +bool Schematic::serializeToMts(std::ostream *os) const { + // Nodes must not be resolved (-> condensed) + // checking here is not possible because "schemdata" might be temporary. + std::ostream &ss = *os; writeU32(ss, MTSCHEM_FILE_SIGNATURE); // signature @@ -370,20 +380,21 @@ bool Schematic::serializeToMts(std::ostream *os, for (int y = 0; y != size.Y; y++) // Y slice probabilities writeU8(ss, slice_probs[y]); - writeU16(ss, names.size()); // name count - for (size_t i = 0; i != names.size(); i++) - ss << serializeString(names[i]); // node names + writeU16(ss, m_nodenames.size()); // name count + for (size_t i = 0; i != m_nodenames.size(); i++) { + ss << serializeString16(m_nodenames[i]); // node names + } // compressed bulk node data - MapNode::serializeBulk(ss, SER_FMT_VER_HIGHEST_WRITE, - schemdata, size.X * size.Y * size.Z, 2, 2, true); + SharedBuffer<u8> buf = MapNode::serializeBulk(MTSCHEM_MAPNODE_SER_FMT_VER, + schemdata, size.X * size.Y * size.Z, 2, 2); + compress(buf, ss, MTSCHEM_MAPNODE_SER_FMT_VER); return true; } -bool Schematic::serializeToLua(std::ostream *os, - const std::vector<std::string> &names, bool use_comments, +bool Schematic::serializeToLua(std::ostream *os, bool use_comments, u32 indent_spaces) const { std::ostream &ss = *os; @@ -392,6 +403,9 @@ bool Schematic::serializeToLua(std::ostream *os, if (indent_spaces > 0) indent.assign(indent_spaces, ' '); + bool resolve_done = isResolveDone(); + FATAL_ERROR_IF(resolve_done && !m_ndef, "serializeToLua: NodeDefManager is required"); + //// Write header { ss << "schematic = {" << std::endl; @@ -436,9 +450,22 @@ bool Schematic::serializeToLua(std::ostream *os, u8 probability = schemdata[i].param1 & MTSCHEM_PROB_MASK; bool force_place = schemdata[i].param1 & MTSCHEM_FORCE_PLACE; - ss << indent << indent << "{" - << "name=\"" << names[schemdata[i].getContent()] - << "\", prob=" << (u16)probability * 2 + // After node resolving: real content_t, lookup using NodeDefManager + // Prior node resolving: condensed ID, lookup using m_nodenames + content_t c = schemdata[i].getContent(); + + ss << indent << indent << "{" << "name=\""; + + if (!resolve_done) { + // Prior node resolving (eg. direct schematic load) + FATAL_ERROR_IF(c >= m_nodenames.size(), "Invalid node list"); + ss << m_nodenames[c]; + } else { + // After node resolving (eg. biome decoration) + ss << m_ndef->get(c).name; + } + + ss << "\", prob=" << (u16)probability * 2 << ", param2=" << (u16)schemdata[i].param2; if (force_place) @@ -467,25 +494,24 @@ bool Schematic::loadSchematicFromFile(const std::string &filename, return false; } - size_t origsize = m_nodenames.size(); - if (!deserializeFromMts(&is, &m_nodenames)) - return false; + if (!m_ndef) + m_ndef = ndef; - m_nnlistsizes.push_back(m_nodenames.size() - origsize); + if (!deserializeFromMts(&is)) + return false; name = filename; if (replace_names) { - for (size_t i = origsize; i < m_nodenames.size(); i++) { - std::string &node_name = m_nodenames[i]; + for (std::string &node_name : m_nodenames) { StringMap::iterator it = replace_names->find(node_name); if (it != replace_names->end()) node_name = it->second; } } - if (ndef) - ndef->pendNodeResolve(this); + if (m_ndef) + m_ndef->pendNodeResolve(this); return true; } @@ -494,33 +520,26 @@ bool Schematic::loadSchematicFromFile(const std::string &filename, bool Schematic::saveSchematicToFile(const std::string &filename, const NodeDefManager *ndef) { - MapNode *orig_schemdata = schemdata; - std::vector<std::string> ndef_nodenames; - std::vector<std::string> *names; + Schematic *schem = this; - if (m_resolve_done && ndef == NULL) - ndef = m_ndef; + bool needs_condense = isResolveDone(); - if (ndef) { - names = &ndef_nodenames; + if (!m_ndef) + m_ndef = ndef; - u32 volume = size.X * size.Y * size.Z; - schemdata = new MapNode[volume]; - for (u32 i = 0; i != volume; i++) - schemdata[i] = orig_schemdata[i]; + if (needs_condense) { + if (!m_ndef) + return false; - generate_nodelist_and_update_ids(schemdata, volume, names, ndef); - } else { // otherwise, use the names we have on hand in the list - names = &m_nodenames; + schem = (Schematic *)this->clone(); + schem->condenseContentIds(); } std::ostringstream os(std::ios_base::binary); - bool status = serializeToMts(&os, *names); + bool status = schem->serializeToMts(&os); - if (ndef) { - delete []schemdata; - schemdata = orig_schemdata; - } + if (needs_condense) + delete schem; if (!status) return false; @@ -556,6 +575,10 @@ bool Schematic::getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2) } delete vm; + + // Reset and mark as complete + NodeResolver::reset(true); + return true; } @@ -578,32 +601,36 @@ void Schematic::applyProbabilities(v3s16 p0, } for (size_t i = 0; i != splist->size(); i++) { - s16 y = (*splist)[i].first - p0.Y; - slice_probs[y] = (*splist)[i].second; + s16 slice = (*splist)[i].first; + if (slice < size.Y) + slice_probs[slice] = (*splist)[i].second; } } -void generate_nodelist_and_update_ids(MapNode *nodes, size_t nodecount, - std::vector<std::string> *usednodes, const NodeDefManager *ndef) +void Schematic::condenseContentIds() { std::unordered_map<content_t, content_t> nodeidmap; content_t numids = 0; + // Reset node resolve fields + NodeResolver::reset(); + + size_t nodecount = size.X * size.Y * size.Z; for (size_t i = 0; i != nodecount; i++) { content_t id; - content_t c = nodes[i].getContent(); + content_t c = schemdata[i].getContent(); - std::unordered_map<content_t, content_t>::const_iterator it = nodeidmap.find(c); + auto it = nodeidmap.find(c); if (it == nodeidmap.end()) { id = numids; numids++; - usednodes->push_back(ndef->get(c).name); - nodeidmap.insert(std::make_pair(c, id)); + m_nodenames.push_back(m_ndef->get(c).name); + nodeidmap.emplace(std::make_pair(c, id)); } else { id = it->second; } - nodes[i].setContent(id); + schemdata[i].setContent(id); } } diff --git a/src/mapgen/mg_schematic.h b/src/mapgen/mg_schematic.h index 6b31251b6..9189bb3a7 100644 --- a/src/mapgen/mg_schematic.h +++ b/src/mapgen/mg_schematic.h @@ -70,6 +70,7 @@ class Server; #define MTSCHEM_FILE_SIGNATURE 0x4d54534d // 'MTSM' #define MTSCHEM_FILE_VER_HIGHEST_READ 4 #define MTSCHEM_FILE_VER_HIGHEST_WRITE 4 +#define MTSCHEM_MAPNODE_SER_FMT_VER 28 // Fixed serialization version for schematics since these still need to use Zlib #define MTSCHEM_PROB_MASK 0x7F @@ -92,7 +93,7 @@ enum SchematicFormatType { class Schematic : public ObjDef, public NodeResolver { public: - Schematic(); + Schematic() = default; virtual ~Schematic(); ObjDef *clone() const; @@ -105,11 +106,9 @@ public: const NodeDefManager *ndef); bool getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2); - bool deserializeFromMts(std::istream *is, std::vector<std::string> *names); - bool serializeToMts(std::ostream *os, - const std::vector<std::string> &names) const; - bool serializeToLua(std::ostream *os, const std::vector<std::string> &names, - bool use_comments, u32 indent_spaces) const; + bool deserializeFromMts(std::istream *is); + bool serializeToMts(std::ostream *os) const; + bool serializeToLua(std::ostream *os, bool use_comments, u32 indent_spaces) const; void blitToVManip(MMVManip *vm, v3s16 p, Rotation rot, bool force_place); bool placeOnVManip(MMVManip *vm, v3s16 p, u32 flags, Rotation rot, bool force_place); @@ -124,6 +123,10 @@ public: v3s16 size; MapNode *schemdata = nullptr; u8 *slice_probs = nullptr; + +private: + // Counterpart to the node resolver: Condense content_t to a sequential "m_nodenames" list + void condenseContentIds(); }; class SchematicManager : public ObjDefManager { @@ -151,5 +154,3 @@ private: Server *m_server; }; -void generate_nodelist_and_update_ids(MapNode *nodes, size_t nodecount, - std::vector<std::string> *usednodes, const NodeDefManager *ndef); diff --git a/src/mapgen/treegen.cpp b/src/mapgen/treegen.cpp index e7e30c880..ec7771439 100644 --- a/src/mapgen/treegen.cpp +++ b/src/mapgen/treegen.cpp @@ -406,7 +406,8 @@ treegen::error make_ltree(MMVManip &vmanip, v3s16 p0, v3f(position.X, position.Y, position.Z - 1), tree_definition ); - } if (!stack_orientation.empty()) { + } + if (!stack_orientation.empty()) { s16 size = 1; for (x = -size; x <= size; x++) for (y = -size; y <= size; y++) @@ -527,19 +528,6 @@ treegen::error make_ltree(MMVManip &vmanip, v3s16 p0, } -void tree_node_placement(MMVManip &vmanip, v3f p0, MapNode node) -{ - v3s16 p1 = v3s16(myround(p0.X), myround(p0.Y), myround(p0.Z)); - if (!vmanip.m_area.contains(p1)) - return; - u32 vi = vmanip.m_area.index(p1); - if (vmanip.m_data[vi].getContent() != CONTENT_AIR - && vmanip.m_data[vi].getContent() != CONTENT_IGNORE) - return; - vmanip.m_data[vmanip.m_area.index(p1)] = node; -} - - void tree_trunk_placement(MMVManip &vmanip, v3f p0, TreeDef &tree_definition) { v3s16 p1 = v3s16(myround(p0.X), myround(p0.Y), myround(p0.Z)); diff --git a/src/mapgen/treegen.h b/src/mapgen/treegen.h index 447baabb3..59a418824 100644 --- a/src/mapgen/treegen.h +++ b/src/mapgen/treegen.h @@ -76,8 +76,6 @@ namespace treegen { const NodeDefManager *ndef, const TreeDef &tree_definition); // L-System tree gen helper functions - void tree_node_placement(MMVManip &vmanip, v3f p0, - MapNode node); void tree_trunk_placement(MMVManip &vmanip, v3f p0, TreeDef &tree_definition); void tree_leaves_placement(MMVManip &vmanip, v3f p0, diff --git a/src/mapnode.cpp b/src/mapnode.cpp index dcf1f6d6e..42f020e71 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -159,8 +159,13 @@ u8 MapNode::getWallMounted(const NodeDefManager *nodemgr) const { const ContentFeatures &f = nodemgr->get(*this); if (f.param_type_2 == CPT2_WALLMOUNTED || - f.param_type_2 == CPT2_COLORED_WALLMOUNTED) + f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { return getParam2() & 0x07; + } else if (f.drawtype == NDT_SIGNLIKE || f.drawtype == NDT_TORCHLIKE || + f.drawtype == NDT_PLANTLIKE || + f.drawtype == NDT_PLANTLIKE_ROOTED) { + return 1; + } return 0; } @@ -177,6 +182,16 @@ v3s16 MapNode::getWallMountedDir(const NodeDefManager *nodemgr) const } } +u8 MapNode::getDegRotate(const NodeDefManager *nodemgr) const +{ + const ContentFeatures &f = nodemgr->get(*this); + if (f.param_type_2 == CPT2_DEGROTATE) + return getParam2() % 240; + if (f.param_type_2 == CPT2_COLORED_DEGROTATE) + return 10 * ((getParam2() & 0x1F) % 24); + return 0; +} + void MapNode::rotateAlongYAxis(const NodeDefManager *nodemgr, Rotation rot) { ContentParamType2 cpt2 = nodemgr->get(*this).param_type_2; @@ -230,6 +245,17 @@ void MapNode::rotateAlongYAxis(const NodeDefManager *nodemgr, Rotation rot) Rotation oldrot = wallmounted_to_rot[wmountface - 2]; param2 &= ~7; param2 |= rot_to_wallmounted[(oldrot - rot) & 3]; + } else if (cpt2 == CPT2_DEGROTATE) { + int angle = param2; // in 1.5° + angle += 60 * rot; // don’t do that on u8 + angle %= 240; + param2 = angle; + } else if (cpt2 == CPT2_COLORED_DEGROTATE) { + int angle = param2 & 0x1F; // in 15° + int color = param2 & 0xE0; + angle += 6 * rot; + angle %= 24; + param2 = color | angle; } } @@ -240,10 +266,12 @@ void transformNodeBox(const MapNode &n, const NodeBox &nodebox, std::vector<aabb3f> &boxes = *p_boxes; if (nodebox.type == NODEBOX_FIXED || nodebox.type == NODEBOX_LEVELED) { - const std::vector<aabb3f> &fixed = nodebox.fixed; + const auto &fixed = nodebox.fixed; int facedir = n.getFaceDir(nodemgr, true); u8 axisdir = facedir>>2; facedir&=0x03; + + boxes.reserve(boxes.size() + fixed.size()); for (aabb3f box : fixed) { if (nodebox.type == NODEBOX_LEVELED) box.MaxEdge.Y = (-0.5f + n.getLevel(nodemgr) / 64.0f) * BS; @@ -411,41 +439,43 @@ void transformNodeBox(const MapNode &n, const NodeBox &nodebox, { size_t boxes_size = boxes.size(); boxes_size += nodebox.fixed.size(); + const auto &c = nodebox.getConnected(); + if (neighbors & 1) - boxes_size += nodebox.connect_top.size(); + boxes_size += c.connect_top.size(); else - boxes_size += nodebox.disconnected_top.size(); + boxes_size += c.disconnected_top.size(); if (neighbors & 2) - boxes_size += nodebox.connect_bottom.size(); + boxes_size += c.connect_bottom.size(); else - boxes_size += nodebox.disconnected_bottom.size(); + boxes_size += c.disconnected_bottom.size(); if (neighbors & 4) - boxes_size += nodebox.connect_front.size(); + boxes_size += c.connect_front.size(); else - boxes_size += nodebox.disconnected_front.size(); + boxes_size += c.disconnected_front.size(); if (neighbors & 8) - boxes_size += nodebox.connect_left.size(); + boxes_size += c.connect_left.size(); else - boxes_size += nodebox.disconnected_left.size(); + boxes_size += c.disconnected_left.size(); if (neighbors & 16) - boxes_size += nodebox.connect_back.size(); + boxes_size += c.connect_back.size(); else - boxes_size += nodebox.disconnected_back.size(); + boxes_size += c.disconnected_back.size(); if (neighbors & 32) - boxes_size += nodebox.connect_right.size(); + boxes_size += c.connect_right.size(); else - boxes_size += nodebox.disconnected_right.size(); + boxes_size += c.disconnected_right.size(); if (neighbors == 0) - boxes_size += nodebox.disconnected.size(); + boxes_size += c.disconnected.size(); if (neighbors < 4) - boxes_size += nodebox.disconnected_sides.size(); + boxes_size += c.disconnected_sides.size(); boxes.reserve(boxes_size); @@ -458,47 +488,47 @@ void transformNodeBox(const MapNode &n, const NodeBox &nodebox, BOXESPUSHBACK(nodebox.fixed); if (neighbors & 1) { - BOXESPUSHBACK(nodebox.connect_top); + BOXESPUSHBACK(c.connect_top); } else { - BOXESPUSHBACK(nodebox.disconnected_top); + BOXESPUSHBACK(c.disconnected_top); } if (neighbors & 2) { - BOXESPUSHBACK(nodebox.connect_bottom); + BOXESPUSHBACK(c.connect_bottom); } else { - BOXESPUSHBACK(nodebox.disconnected_bottom); + BOXESPUSHBACK(c.disconnected_bottom); } if (neighbors & 4) { - BOXESPUSHBACK(nodebox.connect_front); + BOXESPUSHBACK(c.connect_front); } else { - BOXESPUSHBACK(nodebox.disconnected_front); + BOXESPUSHBACK(c.disconnected_front); } if (neighbors & 8) { - BOXESPUSHBACK(nodebox.connect_left); + BOXESPUSHBACK(c.connect_left); } else { - BOXESPUSHBACK(nodebox.disconnected_left); + BOXESPUSHBACK(c.disconnected_left); } if (neighbors & 16) { - BOXESPUSHBACK(nodebox.connect_back); + BOXESPUSHBACK(c.connect_back); } else { - BOXESPUSHBACK(nodebox.disconnected_back); + BOXESPUSHBACK(c.disconnected_back); } if (neighbors & 32) { - BOXESPUSHBACK(nodebox.connect_right); + BOXESPUSHBACK(c.connect_right); } else { - BOXESPUSHBACK(nodebox.disconnected_right); + BOXESPUSHBACK(c.disconnected_right); } if (neighbors == 0) { - BOXESPUSHBACK(nodebox.disconnected); + BOXESPUSHBACK(c.disconnected); } if (neighbors < 4) { - BOXESPUSHBACK(nodebox.disconnected_sides); + BOXESPUSHBACK(c.disconnected_sides); } } @@ -704,9 +734,10 @@ void MapNode::deSerialize(u8 *source, u8 version) } } } -void MapNode::serializeBulk(std::ostream &os, int version, + +SharedBuffer<u8> MapNode::serializeBulk(int version, const MapNode *nodes, u32 nodecount, - u8 content_width, u8 params_width, bool compressed) + u8 content_width, u8 params_width) { if (!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapNode format not supported"); @@ -720,8 +751,7 @@ void MapNode::serializeBulk(std::ostream &os, int version, throw SerializationError("MapNode::serializeBulk: serialization to " "version < 24 not possible"); - size_t databuf_size = nodecount * (content_width + params_width); - u8 *databuf = new u8[databuf_size]; + SharedBuffer<u8> databuf(nodecount * (content_width + params_width)); u32 start1 = content_width * nodecount; u32 start2 = (content_width + 1) * nodecount; @@ -732,23 +762,13 @@ void MapNode::serializeBulk(std::ostream &os, int version, writeU8(&databuf[start1 + i], nodes[i].param1); writeU8(&databuf[start2 + i], nodes[i].param2); } - - /* - Compress data to output stream - */ - - if (compressed) - compressZlib(databuf, databuf_size, os); - else - os.write((const char*) &databuf[0], databuf_size); - - delete [] databuf; + return databuf; } // Deserialize bulk node data void MapNode::deSerializeBulk(std::istream &is, int version, MapNode *nodes, u32 nodecount, - u8 content_width, u8 params_width, bool compressed) + u8 content_width, u8 params_width) { if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapNode format not supported"); @@ -758,26 +778,10 @@ void MapNode::deSerializeBulk(std::istream &is, int version, || params_width != 2) FATAL_ERROR("Deserialize bulk node data error"); - // Uncompress or read data - u32 len = nodecount * (content_width + params_width); - SharedBuffer<u8> databuf(len); - if(compressed) - { - std::ostringstream os(std::ios_base::binary); - decompressZlib(is, os); - std::string s = os.str(); - if(s.size() != len) - throw SerializationError("deSerializeBulkNodes: " - "decompress resulted in invalid size"); - memcpy(&databuf[0], s.c_str(), len); - } - else - { - is.read((char*) &databuf[0], len); - if(is.eof() || is.fail()) - throw SerializationError("deSerializeBulkNodes: " - "failed to read bulk node data"); - } + // read data + const u32 len = nodecount * (content_width + params_width); + Buffer<u8> databuf(len); + is.read(reinterpret_cast<char*>(*databuf), len); // Deserialize content if(content_width == 1) diff --git a/src/mapnode.h b/src/mapnode.h index 32ac1b4f6..afd3a96be 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include "light.h" +#include "util/pointer.h" #include <string> #include <vector> @@ -240,6 +241,9 @@ struct MapNode u8 getWallMounted(const NodeDefManager *nodemgr) const; v3s16 getWallMountedDir(const NodeDefManager *nodemgr) const; + /// @returns Rotation in range 0–239 (in 1.5° steps) + u8 getDegRotate(const NodeDefManager *nodemgr) const; + void rotateAlongYAxis(const NodeDefManager *nodemgr, Rotation rot); /*! @@ -290,12 +294,12 @@ struct MapNode // content_width = the number of bytes of content per node // params_width = the number of bytes of params per node // compressed = true to zlib-compress output - static void serializeBulk(std::ostream &os, int version, + static SharedBuffer<u8> serializeBulk(int version, const MapNode *nodes, u32 nodecount, - u8 content_width, u8 params_width, bool compressed); + u8 content_width, u8 params_width); static void deSerializeBulk(std::istream &is, int version, MapNode *nodes, u32 nodecount, - u8 content_width, u8 params_width, bool compressed); + u8 content_width, u8 params_width); private: // Deprecated serialization methods diff --git a/src/mapsector.h b/src/mapsector.h index dede364f6..ffd4cdd1d 100644 --- a/src/mapsector.h +++ b/src/mapsector.h @@ -62,6 +62,7 @@ public: bool empty() const { return m_blocks.empty(); } + int size() const { return m_blocks.size(); } protected: // The pile of MapBlocks diff --git a/src/modchannels.cpp b/src/modchannels.cpp index 301dcb092..9626e8e0c 100644 --- a/src/modchannels.cpp +++ b/src/modchannels.cpp @@ -88,8 +88,7 @@ bool ModChannelMgr::canWriteOnChannel(const std::string &channel) const void ModChannelMgr::registerChannel(const std::string &channel) { - m_registered_channels[channel] = - std::unique_ptr<ModChannel>(new ModChannel(channel)); + m_registered_channels[channel] = std::make_unique<ModChannel>(channel); } bool ModChannelMgr::setChannelState(const std::string &channel, ModChannelState state) diff --git a/src/nameidmapping.cpp b/src/nameidmapping.cpp index bd5bb1fc8..05cfae069 100644 --- a/src/nameidmapping.cpp +++ b/src/nameidmapping.cpp @@ -27,7 +27,7 @@ void NameIdMapping::serialize(std::ostream &os) const writeU16(os, m_id_to_name.size()); for (const auto &i : m_id_to_name) { writeU16(os, i.first); - os << serializeString(i.second); + os << serializeString16(i.second); } } @@ -41,7 +41,7 @@ void NameIdMapping::deSerialize(std::istream &is) m_name_to_id.clear(); for (u32 i = 0; i < count; i++) { u16 id = readU16(is); - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); m_id_to_name[id] = name; m_name_to_id[name] = id; } diff --git a/src/network/address.cpp b/src/network/address.cpp index 05678aa62..cf2e6208d 100644 --- a/src/network/address.cpp +++ b/src/network/address.cpp @@ -87,38 +87,31 @@ Address::Address(const IPv6AddressBytes *ipv6_bytes, u16 port) setPort(port); } -// Equality (address family, address and port must be equal) -bool Address::operator==(const Address &address) +// Equality (address family, IP and port must be equal) +bool Address::operator==(const Address &other) { - if (address.m_addr_family != m_addr_family || address.m_port != m_port) + if (other.m_addr_family != m_addr_family || other.m_port != m_port) return false; if (m_addr_family == AF_INET) { - return m_address.ipv4.sin_addr.s_addr == - address.m_address.ipv4.sin_addr.s_addr; + return m_address.ipv4.s_addr == other.m_address.ipv4.s_addr; } if (m_addr_family == AF_INET6) { - return memcmp(m_address.ipv6.sin6_addr.s6_addr, - address.m_address.ipv6.sin6_addr.s6_addr, 16) == 0; + return memcmp(m_address.ipv6.s6_addr, + other.m_address.ipv6.s6_addr, 16) == 0; } return false; } -bool Address::operator!=(const Address &address) -{ - return !(*this == address); -} - void Address::Resolve(const char *name) { if (!name || name[0] == 0) { - if (m_addr_family == AF_INET) { - setAddress((u32)0); - } else if (m_addr_family == AF_INET6) { - setAddress((IPv6AddressBytes *)0); - } + if (m_addr_family == AF_INET) + setAddress(static_cast<u32>(0)); + else if (m_addr_family == AF_INET6) + setAddress(static_cast<IPv6AddressBytes*>(nullptr)); return; } @@ -126,9 +119,6 @@ void Address::Resolve(const char *name) memset(&hints, 0, sizeof(hints)); // Setup hints - hints.ai_socktype = 0; - hints.ai_protocol = 0; - hints.ai_flags = 0; if (g_settings->getBool("enable_ipv6")) { // AF_UNSPEC allows both IPv6 and IPv4 addresses to be returned hints.ai_family = AF_UNSPEC; @@ -145,14 +135,13 @@ void Address::Resolve(const char *name) if (resolved->ai_family == AF_INET) { struct sockaddr_in *t = (struct sockaddr_in *)resolved->ai_addr; m_addr_family = AF_INET; - m_address.ipv4 = *t; + m_address.ipv4 = t->sin_addr; } else if (resolved->ai_family == AF_INET6) { struct sockaddr_in6 *t = (struct sockaddr_in6 *)resolved->ai_addr; m_addr_family = AF_INET6; - m_address.ipv6 = *t; + m_address.ipv6 = t->sin6_addr; } else { - freeaddrinfo(resolved); - throw ResolveError(""); + m_addr_family = 0; } freeaddrinfo(resolved); } @@ -163,47 +152,37 @@ std::string Address::serializeString() const // windows XP doesnt have inet_ntop, maybe use better func #ifdef _WIN32 if (m_addr_family == AF_INET) { - u8 a, b, c, d; - u32 addr; - addr = ntohl(m_address.ipv4.sin_addr.s_addr); - a = (addr & 0xFF000000) >> 24; - b = (addr & 0x00FF0000) >> 16; - c = (addr & 0x0000FF00) >> 8; - d = (addr & 0x000000FF); - return itos(a) + "." + itos(b) + "." + itos(c) + "." + itos(d); + return inet_ntoa(m_address.ipv4); } else if (m_addr_family == AF_INET6) { std::ostringstream os; + os << std::hex; for (int i = 0; i < 16; i += 2) { - u16 section = (m_address.ipv6.sin6_addr.s6_addr[i] << 8) | - (m_address.ipv6.sin6_addr.s6_addr[i + 1]); - os << std::hex << section; + u16 section = (m_address.ipv6.s6_addr[i] << 8) | + (m_address.ipv6.s6_addr[i + 1]); + os << section; if (i < 14) os << ":"; } return os.str(); - } else - return std::string(""); + } else { + return ""; + } #else char str[INET6_ADDRSTRLEN]; - if (inet_ntop(m_addr_family, - (m_addr_family == AF_INET) - ? (void *)&(m_address.ipv4.sin_addr) - : (void *)&(m_address.ipv6.sin6_addr), - str, INET6_ADDRSTRLEN) == NULL) { - return std::string(""); - } - return std::string(str); + if (inet_ntop(m_addr_family, (void*) &m_address, str, sizeof(str)) == nullptr) + return ""; + return str; #endif } -struct sockaddr_in Address::getAddress() const +struct in_addr Address::getAddress() const { - return m_address.ipv4; // NOTE: NO PORT INCLUDED, use getPort() + return m_address.ipv4; } -struct sockaddr_in6 Address::getAddress6() const +struct in6_addr Address::getAddress6() const { - return m_address.ipv6; // NOTE: NO PORT INCLUDED, use getPort() + return m_address.ipv6; } u16 Address::getPort() const @@ -211,52 +190,39 @@ u16 Address::getPort() const return m_port; } -int Address::getFamily() const -{ - return m_addr_family; -} - -bool Address::isIPv6() const -{ - return m_addr_family == AF_INET6; -} - bool Address::isZero() const { if (m_addr_family == AF_INET) { - return m_address.ipv4.sin_addr.s_addr == 0; + return m_address.ipv4.s_addr == 0; } if (m_addr_family == AF_INET6) { static const char zero[16] = {0}; - return memcmp(m_address.ipv6.sin6_addr.s6_addr, zero, 16) == 0; + return memcmp(m_address.ipv6.s6_addr, zero, 16) == 0; } + return false; } void Address::setAddress(u32 address) { m_addr_family = AF_INET; - m_address.ipv4.sin_family = AF_INET; - m_address.ipv4.sin_addr.s_addr = htonl(address); + m_address.ipv4.s_addr = htonl(address); } void Address::setAddress(u8 a, u8 b, u8 c, u8 d) { - m_addr_family = AF_INET; - m_address.ipv4.sin_family = AF_INET; - u32 addr = htonl((a << 24) | (b << 16) | (c << 8) | d); - m_address.ipv4.sin_addr.s_addr = addr; + u32 addr = (a << 24) | (b << 16) | (c << 8) | d; + setAddress(addr); } void Address::setAddress(const IPv6AddressBytes *ipv6_bytes) { m_addr_family = AF_INET6; - m_address.ipv6.sin6_family = AF_INET6; if (ipv6_bytes) - memcpy(m_address.ipv6.sin6_addr.s6_addr, ipv6_bytes->bytes, 16); + memcpy(m_address.ipv6.s6_addr, ipv6_bytes->bytes, 16); else - memset(m_address.ipv6.sin6_addr.s6_addr, 0, 16); + memset(m_address.ipv6.s6_addr, 0, 16); } void Address::setPort(u16 port) @@ -264,27 +230,30 @@ void Address::setPort(u16 port) m_port = port; } -void Address::print(std::ostream *s) const +void Address::print(std::ostream& s) const { if (m_addr_family == AF_INET6) - *s << "[" << serializeString() << "]:" << m_port; + s << "[" << serializeString() << "]:" << m_port; + else if (m_addr_family == AF_INET) + s << serializeString() << ":" << m_port; else - *s << serializeString() << ":" << m_port; + s << "(undefined)"; } bool Address::isLocalhost() const { if (isIPv6()) { - static const unsigned char localhost_bytes[] = { + static const u8 localhost_bytes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; - static const unsigned char mapped_ipv4_localhost[] = { + static const u8 mapped_ipv4_localhost[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0x7f, 0, 0, 0}; - auto addr = m_address.ipv6.sin6_addr.s6_addr; + auto addr = m_address.ipv6.s6_addr; return memcmp(addr, localhost_bytes, 16) == 0 || memcmp(addr, mapped_ipv4_localhost, 13) == 0; } - return (m_address.ipv4.sin_addr.s_addr & 0xFF) == 0x7f; + auto addr = ntohl(m_address.ipv4.s_addr); + return (addr >> 24) == 0x7f; } diff --git a/src/network/address.h b/src/network/address.h index 4329c84a8..692bf82c5 100644 --- a/src/network/address.h +++ b/src/network/address.h @@ -36,9 +36,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" #include "networkexceptions.h" -class IPv6AddressBytes +struct IPv6AddressBytes { -public: u8 bytes[16]; IPv6AddressBytes() { memset(bytes, 0, 16); } }; @@ -50,30 +49,34 @@ public: Address(u32 address, u16 port); Address(u8 a, u8 b, u8 c, u8 d, u16 port); Address(const IPv6AddressBytes *ipv6_bytes, u16 port); + bool operator==(const Address &address); - bool operator!=(const Address &address); - // Resolve() may throw ResolveError (address is unchanged in this case) - void Resolve(const char *name); - struct sockaddr_in getAddress() const; - unsigned short getPort() const; - void setAddress(u32 address); - void setAddress(u8 a, u8 b, u8 c, u8 d); - void setAddress(const IPv6AddressBytes *ipv6_bytes); - struct sockaddr_in6 getAddress6() const; - int getFamily() const; - bool isIPv6() const; + bool operator!=(const Address &address) { return !(*this == address); } + + struct in_addr getAddress() const; + struct in6_addr getAddress6() const; + u16 getPort() const; + int getFamily() const { return m_addr_family; } + bool isIPv6() const { return m_addr_family == AF_INET6; } bool isZero() const; - void setPort(unsigned short port); - void print(std::ostream *s) const; + void print(std::ostream &s) const; std::string serializeString() const; bool isLocalhost() const; + // Resolve() may throw ResolveError (address is unchanged in this case) + void Resolve(const char *name); + + void setAddress(u32 address); + void setAddress(u8 a, u8 b, u8 c, u8 d); + void setAddress(const IPv6AddressBytes *ipv6_bytes); + void setPort(u16 port); + private: - unsigned int m_addr_family = 0; + unsigned short m_addr_family = 0; union { - struct sockaddr_in ipv4; - struct sockaddr_in6 ipv6; + struct in_addr ipv4; + struct in6_addr ipv6; } m_address; u16 m_port = 0; // Port is separate from sockaddr structures }; diff --git a/src/network/clientopcodes.cpp b/src/network/clientopcodes.cpp index f812a08a1..6a78b4652 100644 --- a/src/network/clientopcodes.cpp +++ b/src/network/clientopcodes.cpp @@ -122,6 +122,8 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] = null_command_handler, { "TOCLIENT_SRP_BYTES_S_B", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_SrpBytesSandB }, // 0x60 { "TOCLIENT_FORMSPEC_PREPEND", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_FormspecPrepend }, // 0x61, + { "TOCLIENT_MINIMAP_MODES", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_MinimapModes }, // 0x62, + { "TOCLIENT_SET_LIGHTING", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_SetLighting }, // 0x63, }; const static ServerCommandFactory null_command_factory = { "TOSERVER_NULL", 0, false }; @@ -203,7 +205,7 @@ const ServerCommandFactory serverCommandFactoryTable[TOSERVER_NUM_MSG_TYPES] = null_command_factory, // 0x3e null_command_factory, // 0x3f { "TOSERVER_REQUEST_MEDIA", 1, true }, // 0x40 - null_command_factory, // 0x41 + { "TOSERVER_HAVE_MEDIA", 2, true }, // 0x41 null_command_factory, // 0x42 { "TOSERVER_CLIENT_READY", 1, true }, // 0x43 null_command_factory, // 0x44 diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 8d87ff8f2..25c1d2690 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -43,6 +43,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "tileanimation.h" #include "gettext.h" #include "skyparams.h" +#include <memory> void Client::handleCommand_Deprecated(NetworkPacket* pkt) { @@ -88,7 +89,7 @@ void Client::handleCommand_Hello(NetworkPacket* pkt) // This is only neccessary though when we actually want to add casing support if (m_chosen_auth_mech != AUTH_MECHANISM_NONE) { - // we recieved a TOCLIENT_HELLO while auth was already going on + // we received a TOCLIENT_HELLO while auth was already going on errorstream << "Client: TOCLIENT_HELLO while auth was already going on" << "(chosen_mech=" << m_chosen_auth_mech << ")." << std::endl; if (m_chosen_auth_mech == AUTH_MECHANISM_SRP || @@ -100,11 +101,20 @@ void Client::handleCommand_Hello(NetworkPacket* pkt) // Authenticate using that method, or abort if there wasn't any method found if (chosen_auth_mechanism != AUTH_MECHANISM_NONE) { - if (chosen_auth_mechanism == AUTH_MECHANISM_FIRST_SRP && - !m_simple_singleplayer_mode && - !getServerAddress().isLocalhost() && - g_settings->getBool("enable_register_confirmation")) { - promptConfirmRegistration(chosen_auth_mechanism); + bool is_register = chosen_auth_mechanism == AUTH_MECHANISM_FIRST_SRP; + ELoginRegister mode = is_register ? ELoginRegister::Register : ELoginRegister::Login; + if (m_allow_login_or_register != ELoginRegister::Any && + m_allow_login_or_register != mode) { + m_chosen_auth_mech = AUTH_MECHANISM_NONE; + m_access_denied = true; + if (m_allow_login_or_register == ELoginRegister::Login) { + m_access_denied_reason = + gettext("Name is not registered. To create an account on this server, click 'Register'"); + } else { + m_access_denied_reason = + gettext("Name is taken. Please choose another name"); + } + m_con->Disconnect(); } else { startAuth(chosen_auth_mechanism); } @@ -156,7 +166,7 @@ void Client::handleCommand_AcceptSudoMode(NetworkPacket* pkt) m_password = m_new_password; - verbosestream << "Client: Recieved TOCLIENT_ACCEPT_SUDO_MODE." << std::endl; + verbosestream << "Client: Received TOCLIENT_ACCEPT_SUDO_MODE." << std::endl; // send packet to actually set the password startAuth(AUTH_MECHANISM_FIRST_SRP); @@ -182,7 +192,7 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt) m_access_denied_reason = "Unknown"; if (pkt->getCommand() != TOCLIENT_ACCESS_DENIED) { - // 13/03/15 Legacy code from 0.4.12 and lesser but is still used + // Legacy code from 0.4.12 and older but is still used // in some places of the server code if (pkt->getSize() >= 2) { std::wstring wide_reason; @@ -195,14 +205,14 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt) if (pkt->getSize() < 1) return; - u8 denyCode = SERVER_ACCESSDENIED_UNEXPECTED_DATA; + u8 denyCode; *pkt >> denyCode; + if (denyCode == SERVER_ACCESSDENIED_SHUTDOWN || denyCode == SERVER_ACCESSDENIED_CRASH) { *pkt >> m_access_denied_reason; - if (m_access_denied_reason.empty()) { + if (m_access_denied_reason.empty()) m_access_denied_reason = accessDeniedStrings[denyCode]; - } u8 reconnect; *pkt >> reconnect; m_access_denied_reconnect = reconnect & 1; @@ -219,9 +229,8 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt) // Until then (which may be never), this is outside // of the defined protocol. *pkt >> m_access_denied_reason; - if (m_access_denied_reason.empty()) { + if (m_access_denied_reason.empty()) m_access_denied_reason = "Unknown"; - } } } @@ -261,7 +270,7 @@ void Client::handleCommand_NodemetaChanged(NetworkPacket *pkt) return; std::istringstream is(pkt->readLongString(), std::ios::binary); - std::stringstream sstr; + std::stringstream sstr(std::ios::binary | std::ios::in | std::ios::out); decompressZlib(is, sstr); NodeMetadataList meta_updates_list(false); @@ -497,7 +506,7 @@ void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt) if (!is.good()) break; - std::string message = deSerializeString(is); + std::string message = deSerializeString16(is); // Pass on to the environment m_env.processActiveObjectMessage(id, message); @@ -561,6 +570,10 @@ void Client::handleCommand_HP(NetworkPacket *pkt) u16 hp; *pkt >> hp; + bool damage_effect = true; + try { + *pkt >> damage_effect; + } catch (PacketError &e) {}; player->hp = hp; @@ -572,6 +585,7 @@ void Client::handleCommand_HP(NetworkPacket *pkt) ClientEvent *event = new ClientEvent(); event->type = CE_PLAYER_DAMAGE; event->player_damage.amount = oldhp - hp; + event->player_damage.effect = damage_effect; m_client_event_queue.push(event); } } @@ -670,21 +684,19 @@ void Client::handleCommand_AnnounceMedia(NetworkPacket* pkt) m_media_downloader->addFile(name, sha1_raw); } - try { + { std::string str; - *pkt >> str; Strfnd sf(str); - while(!sf.at_end()) { + while (!sf.at_end()) { std::string baseurl = trim(sf.next(",")); - if (!baseurl.empty()) + if (!baseurl.empty()) { + m_remote_media_servers.emplace_back(baseurl); m_media_downloader->addRemoteServer(baseurl); + } } } - catch(SerializationError& e) { - // not supported by server or turned off - } m_media_downloader->step(this); } @@ -716,31 +728,38 @@ void Client::handleCommand_Media(NetworkPacket* pkt) if (num_files == 0) return; - if (!m_media_downloader || !m_media_downloader->isStarted()) { - const char *problem = m_media_downloader ? - "media has not been requested" : - "all media has been received already"; - errorstream << "Client: Received media but " - << problem << "! " - << " bunch " << bunch_i << "/" << num_bunches - << " files=" << num_files - << " size=" << pkt->getSize() << std::endl; - return; + bool init_phase = m_media_downloader && m_media_downloader->isStarted(); + + if (init_phase) { + // Mesh update thread must be stopped while + // updating content definitions + sanity_check(!m_mesh_update_thread.isRunning()); } - // Mesh update thread must be stopped while - // updating content definitions - sanity_check(!m_mesh_update_thread.isRunning()); - - for (u32 i=0; i < num_files; i++) { - std::string name; + for (u32 i = 0; i < num_files; i++) { + std::string name, data; *pkt >> name; + data = pkt->readLongString(); - std::string data = pkt->readLongString(); - - m_media_downloader->conventionalTransferDone( - name, data, this); + bool ok = false; + if (init_phase) { + ok = m_media_downloader->conventionalTransferDone(name, data, this); + } else { + // Check pending dynamic transfers, one of them must be it + for (const auto &it : m_pending_media_downloads) { + if (it.second->conventionalTransferDone(name, data, this)) { + ok = true; + break; + } + } + } + if (!ok) { + errorstream << "Client: Received media \"" << name + << "\" but no downloads pending. " << num_bunches << " bunches, " + << num_files << " in this one. (init_phase=" << init_phase + << ")" << std::endl; + } } } @@ -755,12 +774,11 @@ void Client::handleCommand_NodeDef(NetworkPacket* pkt) // Decompress node definitions std::istringstream tmp_is(pkt->readLongString(), std::ios::binary); - std::ostringstream tmp_os; + std::stringstream tmp_os(std::ios::binary | std::ios::in | std::ios::out); decompressZlib(tmp_is, tmp_os); // Deserialize node definitions - std::istringstream tmp_is2(tmp_os.str()); - m_nodedef->deSerialize(tmp_is2); + m_nodedef->deSerialize(tmp_os, m_proto_ver); m_nodedef_received = true; } @@ -775,12 +793,11 @@ void Client::handleCommand_ItemDef(NetworkPacket* pkt) // Decompress item definitions std::istringstream tmp_is(pkt->readLongString(), std::ios::binary); - std::ostringstream tmp_os; + std::stringstream tmp_os(std::ios::binary | std::ios::in | std::ios::out); decompressZlib(tmp_is, tmp_os); // Deserialize node definitions - std::istringstream tmp_is2(tmp_os.str()); - m_itemdef->deSerialize(tmp_is2); + m_itemdef->deSerialize(tmp_os, m_proto_ver); m_itemdef_received = true; } @@ -801,44 +818,38 @@ void Client::handleCommand_PlaySound(NetworkPacket* pkt) */ s32 server_id; - std::string name; - float gain; - u8 type; // 0=local, 1=positional, 2=object + SimpleSoundSpec spec; + SoundLocation type; // 0=local, 1=positional, 2=object v3f pos; u16 object_id; - bool loop; - float fade = 0.0f; - float pitch = 1.0f; bool ephemeral = false; - *pkt >> server_id >> name >> gain >> type >> pos >> object_id >> loop; + *pkt >> server_id >> spec.name >> spec.gain >> (u8 &)type >> pos >> object_id >> spec.loop; try { - *pkt >> fade; - *pkt >> pitch; + *pkt >> spec.fade; + *pkt >> spec.pitch; *pkt >> ephemeral; } catch (PacketError &e) {}; // Start playing int client_id = -1; switch(type) { - case 0: // local - client_id = m_sound->playSound(name, loop, gain, fade, pitch); - break; - case 1: // positional - client_id = m_sound->playSoundAt(name, loop, gain, pos, pitch); - break; - case 2: - { // object + case SoundLocation::Local: + client_id = m_sound->playSound(spec); + break; + case SoundLocation::Position: + client_id = m_sound->playSoundAt(spec, pos); + break; + case SoundLocation::Object: + { ClientActiveObject *cao = m_env.getActiveObject(object_id); if (cao) pos = cao->getPosition(); - client_id = m_sound->playSoundAt(name, loop, gain, pos, pitch); + client_id = m_sound->playSoundAt(spec, pos); break; } - default: - break; } if (client_id != -1) { @@ -983,18 +994,18 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) p.amount = readU16(is); p.time = readF32(is); - p.minpos = readV3F32(is); - p.maxpos = readV3F32(is); - p.minvel = readV3F32(is); - p.maxvel = readV3F32(is); - p.minacc = readV3F32(is); - p.maxacc = readV3F32(is); - p.minexptime = readF32(is); - p.maxexptime = readF32(is); - p.minsize = readF32(is); - p.maxsize = readF32(is); + + // older protocols do not support tweening, and send only + // static ranges, so we can't just use the normal serialization + // functions for the older values. + p.pos.start.legacyDeSerialize(is); + p.vel.start.legacyDeSerialize(is); + p.acc.start.legacyDeSerialize(is); + p.exptime.start.legacyDeSerialize(is); + p.size.start.legacyDeSerialize(is); + p.collisiondetection = readU8(is); - p.texture = deSerializeLongString(is); + p.texture.string = deSerializeString32(is); server_id = readU32(is); @@ -1007,6 +1018,8 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) p.glow = readU8(is); p.object_collision = readU8(is); + bool legacy_format = true; + // This is kinda awful do { u16 tmp_param0 = readU16(is); @@ -1015,7 +1028,70 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) p.node.param0 = tmp_param0; p.node.param2 = readU8(is); p.node_tile = readU8(is); - } while (0); + + // v >= 5.6.0 + f32 tmp_sbias = readF32(is); + if (is.eof()) + break; + + // initial bias must be stored separately in the stream to preserve + // backwards compatibility with older clients, which do not support + // a bias field in their range "format" + p.pos.start.bias = tmp_sbias; + p.vel.start.bias = readF32(is); + p.acc.start.bias = readF32(is); + p.exptime.start.bias = readF32(is); + p.size.start.bias = readF32(is); + + p.pos.end.deSerialize(is); + p.vel.end.deSerialize(is); + p.acc.end.deSerialize(is); + p.exptime.end.deSerialize(is); + p.size.end.deSerialize(is); + + // properties for legacy texture field + p.texture.deSerialize(is, m_proto_ver, true); + + p.drag.deSerialize(is); + p.jitter.deSerialize(is); + p.bounce.deSerialize(is); + ParticleParamTypes::deSerializeParameterValue(is, p.attractor_kind); + using ParticleParamTypes::AttractorKind; + if (p.attractor_kind != AttractorKind::none) { + p.attract.deSerialize(is); + p.attractor_origin.deSerialize(is); + p.attractor_attachment = readU16(is); + /* we only check the first bit, in order to allow this value + * to be turned into a bit flag field later if needed */ + p.attractor_kill = !!(readU8(is) & 1); + if (p.attractor_kind != AttractorKind::point) { + p.attractor_direction.deSerialize(is); + p.attractor_direction_attachment = readU16(is); + } + } + p.radius.deSerialize(is); + + u16 texpoolsz = readU16(is); + p.texpool.reserve(texpoolsz); + for (u16 i = 0; i < texpoolsz; ++i) { + ServerParticleTexture newtex; + newtex.deSerialize(is, m_proto_ver); + p.texpool.push_back(newtex); + } + + legacy_format = false; + } while(0); + + if (legacy_format) { + // there's no tweening data to be had, so we need to set the + // legacy params to constant values, otherwise everything old + // will tween to zero + p.pos.end = p.pos.start; + p.vel.end = p.vel.start; + p.acc.end = p.acc.start; + p.exptime.end = p.exptime.start; + p.size.end = p.size.start; + } auto event = new ClientEvent(); event->type = CE_ADD_PARTICLESPAWNER; @@ -1041,9 +1117,6 @@ void Client::handleCommand_DeleteParticleSpawner(NetworkPacket* pkt) void Client::handleCommand_HudAdd(NetworkPacket* pkt) { - std::string datastring(pkt->getString(0), pkt->getSize()); - std::istringstream is(datastring, std::ios_base::binary); - u32 server_id; u8 type; v2f pos; @@ -1059,6 +1132,7 @@ void Client::handleCommand_HudAdd(NetworkPacket* pkt) v2s32 size; s16 z_index = 0; std::string text2; + u32 style = 0; *pkt >> server_id >> type >> pos >> name >> scale >> text >> number >> item >> dir >> align >> offset; @@ -1067,25 +1141,28 @@ void Client::handleCommand_HudAdd(NetworkPacket* pkt) *pkt >> size; *pkt >> z_index; *pkt >> text2; + *pkt >> style; } catch(PacketError &e) {}; ClientEvent *event = new ClientEvent(); - event->type = CE_HUDADD; - event->hudadd.server_id = server_id; - event->hudadd.type = type; - event->hudadd.pos = new v2f(pos); - event->hudadd.name = new std::string(name); - event->hudadd.scale = new v2f(scale); - event->hudadd.text = new std::string(text); - event->hudadd.number = number; - event->hudadd.item = item; - event->hudadd.dir = dir; - event->hudadd.align = new v2f(align); - event->hudadd.offset = new v2f(offset); - event->hudadd.world_pos = new v3f(world_pos); - event->hudadd.size = new v2s32(size); - event->hudadd.z_index = z_index; - event->hudadd.text2 = new std::string(text2); + event->type = CE_HUDADD; + event->hudadd = new ClientEventHudAdd(); + event->hudadd->server_id = server_id; + event->hudadd->type = type; + event->hudadd->pos = pos; + event->hudadd->name = name; + event->hudadd->scale = scale; + event->hudadd->text = text; + event->hudadd->number = number; + event->hudadd->item = item; + event->hudadd->dir = dir; + event->hudadd->align = align; + event->hudadd->offset = offset; + event->hudadd->world_pos = world_pos; + event->hudadd->size = size; + event->hudadd->z_index = z_index; + event->hudadd->text2 = text2; + event->hudadd->style = style; m_client_event_queue.push(event); } @@ -1095,16 +1172,10 @@ void Client::handleCommand_HudRemove(NetworkPacket* pkt) *pkt >> server_id; - auto i = m_hud_server_to_client.find(server_id); - if (i != m_hud_server_to_client.end()) { - int client_id = i->second; - m_hud_server_to_client.erase(i); - - ClientEvent *event = new ClientEvent(); - event->type = CE_HUDRM; - event->hudrm.id = client_id; - m_client_event_queue.push(event); - } + ClientEvent *event = new ClientEvent(); + event->type = CE_HUDRM; + event->hudrm.id = server_id; + m_client_event_queue.push(event); } void Client::handleCommand_HudChange(NetworkPacket* pkt) @@ -1119,31 +1190,41 @@ void Client::handleCommand_HudChange(NetworkPacket* pkt) *pkt >> server_id >> stat; - if (stat == HUD_STAT_POS || stat == HUD_STAT_SCALE || - stat == HUD_STAT_ALIGN || stat == HUD_STAT_OFFSET) - *pkt >> v2fdata; - else if (stat == HUD_STAT_NAME || stat == HUD_STAT_TEXT || stat == HUD_STAT_TEXT2) - *pkt >> sdata; - else if (stat == HUD_STAT_WORLD_POS) - *pkt >> v3fdata; - else if (stat == HUD_STAT_SIZE ) - *pkt >> v2s32data; - else - *pkt >> intdata; - - std::unordered_map<u32, u32>::const_iterator i = m_hud_server_to_client.find(server_id); - if (i != m_hud_server_to_client.end()) { - ClientEvent *event = new ClientEvent(); - event->type = CE_HUDCHANGE; - event->hudchange.id = i->second; - event->hudchange.stat = (HudElementStat)stat; - event->hudchange.v2fdata = new v2f(v2fdata); - event->hudchange.v3fdata = new v3f(v3fdata); - event->hudchange.sdata = new std::string(sdata); - event->hudchange.data = intdata; - event->hudchange.v2s32data = new v2s32(v2s32data); - m_client_event_queue.push(event); + // Keep in sync with:server.cpp -> SendHUDChange + switch ((HudElementStat)stat) { + case HUD_STAT_POS: + case HUD_STAT_SCALE: + case HUD_STAT_ALIGN: + case HUD_STAT_OFFSET: + *pkt >> v2fdata; + break; + case HUD_STAT_NAME: + case HUD_STAT_TEXT: + case HUD_STAT_TEXT2: + *pkt >> sdata; + break; + case HUD_STAT_WORLD_POS: + *pkt >> v3fdata; + break; + case HUD_STAT_SIZE: + *pkt >> v2s32data; + break; + default: + *pkt >> intdata; + break; } + + ClientEvent *event = new ClientEvent(); + event->type = CE_HUDCHANGE; + event->hudchange = new ClientEventHudChange(); + event->hudchange->id = server_id; + event->hudchange->stat = static_cast<HudElementStat>(stat); + event->hudchange->v2fdata = v2fdata; + event->hudchange->v3fdata = v3fdata; + event->hudchange->sdata = sdata; + event->hudchange->data = intdata; + event->hudchange->v2s32data = v2s32data; + m_client_event_queue.push(event); } void Client::handleCommand_HudSetFlags(NetworkPacket* pkt) @@ -1164,15 +1245,24 @@ void Client::handleCommand_HudSetFlags(NetworkPacket* pkt) m_minimap_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE); bool m_minimap_radar_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE); + // Not so satisying code to keep compatibility with old fixed mode system + // --> + // Hide minimap if it has been disabled by the server if (m_minimap && m_minimap_disabled_by_server && was_minimap_visible) // defers a minimap update, therefore only call it if really // needed, by checking that minimap was visible before - m_minimap->setMinimapMode(MINIMAP_MODE_OFF); + m_minimap->setModeIndex(0); - // Switch to surface mode if radar disabled by server - if (m_minimap && m_minimap_radar_disabled_by_server && was_minimap_radar_visible) - m_minimap->setMinimapMode(MINIMAP_MODE_SURFACEx1); + // If radar has been disabled, try to find a non radar mode or fall back to 0 + if (m_minimap && m_minimap_radar_disabled_by_server + && was_minimap_radar_visible) { + while (m_minimap->getModeIndex() > 0 && + m_minimap->getModeDef().type == MINIMAP_TYPE_RADAR) + m_minimap->nextMode(); + } + // <-- + // End of 'not so satifying code' } void Client::handleCommand_HudSetParam(NetworkPacket* pkt) @@ -1207,11 +1297,11 @@ void Client::handleCommand_HudSetSky(NetworkPacket* pkt) SkyboxParams skybox; skybox.bgcolor = video::SColor(readARGB8(is)); - skybox.type = std::string(deSerializeString(is)); + skybox.type = std::string(deSerializeString16(is)); u16 count = readU16(is); for (size_t i = 0; i < count; i++) - skybox.textures.emplace_back(deSerializeString(is)); + skybox.textures.emplace_back(deSerializeString16(is)); skybox.clouds = true; try { @@ -1219,19 +1309,17 @@ void Client::handleCommand_HudSetSky(NetworkPacket* pkt) } catch (...) {} // Use default skybox settings: - SkyboxDefaults sky_defaults; - SunParams sun = sky_defaults.getSunDefaults(); - MoonParams moon = sky_defaults.getMoonDefaults(); - StarParams stars = sky_defaults.getStarDefaults(); + SunParams sun = SkyboxDefaults::getSunDefaults(); + MoonParams moon = SkyboxDefaults::getMoonDefaults(); + StarParams stars = SkyboxDefaults::getStarDefaults(); // Fix for "regular" skies, as color isn't kept: if (skybox.type == "regular") { - skybox.sky_color = sky_defaults.getSkyColorDefaults(); + skybox.sky_color = SkyboxDefaults::getSkyColorDefaults(); skybox.fog_tint_type = "default"; skybox.fog_moon_tint = video::SColor(255, 255, 255, 255); skybox.fog_sun_tint = video::SColor(255, 255, 255, 255); - } - else { + } else { sun.visible = false; sun.sunrise_visible = false; moon.visible = false; @@ -1315,10 +1403,13 @@ void Client::handleCommand_HudSetMoon(NetworkPacket *pkt) void Client::handleCommand_HudSetStars(NetworkPacket *pkt) { - StarParams stars; + StarParams stars = SkyboxDefaults::getStarDefaults(); *pkt >> stars.visible >> stars.count >> stars.starcolor >> stars.scale; + try { + *pkt >> stars.day_opacity; + } catch (PacketError &e) {}; ClientEvent *event = new ClientEvent(); event->type = CE_SET_STARS; @@ -1381,6 +1472,8 @@ void Client::handleCommand_LocalPlayerAnimations(NetworkPacket* pkt) *pkt >> player->local_animations[2]; *pkt >> player->local_animations[3]; *pkt >> player->local_animation_speed; + + player->last_animation = -1; } void Client::handleCommand_EyeOffset(NetworkPacket* pkt) @@ -1478,46 +1571,72 @@ void Client::handleCommand_PlayerSpeed(NetworkPacket *pkt) void Client::handleCommand_MediaPush(NetworkPacket *pkt) { std::string raw_hash, filename, filedata; + u32 token; bool cached; *pkt >> raw_hash >> filename >> cached; - filedata = pkt->readLongString(); + if (m_proto_ver >= 40) + *pkt >> token; + else + filedata = pkt->readLongString(); - if (raw_hash.size() != 20 || filedata.empty() || filename.empty() || + if (raw_hash.size() != 20 || filename.empty() || + (m_proto_ver < 40 && filedata.empty()) || !string_allowed(filename, TEXTURENAME_ALLOWED_CHARS)) { throw PacketError("Illegal filename, data or hash"); } - verbosestream << "Server pushes media file \"" << filename << "\" with " - << filedata.size() << " bytes of data (cached=" << cached - << ")" << std::endl; + verbosestream << "Server pushes media file \"" << filename << "\" "; + if (filedata.empty()) + verbosestream << "to be fetched "; + else + verbosestream << "with " << filedata.size() << " bytes "; + verbosestream << "(cached=" << cached << ")" << std::endl; if (m_media_pushed_files.count(filename) != 0) { - // Silently ignore for synchronization purposes + // Ignore (but acknowledge). Previously this was for sync purposes, + // but even in new versions media cannot be replaced at runtime. + if (m_proto_ver >= 40) + sendHaveMedia({ token }); return; } - // Compute and check checksum of data - std::string computed_hash; - { - SHA1 ctx; - ctx.addBytes(filedata.c_str(), filedata.size()); - unsigned char *buf = ctx.getDigest(); - computed_hash.assign((char*) buf, 20); - free(buf); - } - if (raw_hash != computed_hash) { - verbosestream << "Hash of file data mismatches, ignoring." << std::endl; + if (!filedata.empty()) { + // LEGACY CODEPATH + // Compute and check checksum of data + std::string computed_hash; + { + SHA1 ctx; + ctx.addBytes(filedata.c_str(), filedata.size()); + unsigned char *buf = ctx.getDigest(); + computed_hash.assign((char*) buf, 20); + free(buf); + } + if (raw_hash != computed_hash) { + verbosestream << "Hash of file data mismatches, ignoring." << std::endl; + return; + } + + // Actually load media + loadMedia(filedata, filename, true); + m_media_pushed_files.insert(filename); + + // Cache file for the next time when this client joins the same server + if (cached) + clientMediaUpdateCache(raw_hash, filedata); return; } - // Actually load media - loadMedia(filedata, filename, true); m_media_pushed_files.insert(filename); - // Cache file for the next time when this client joins the same server - if (cached) - clientMediaUpdateCache(raw_hash, filedata); + // create a downloader for this file + auto downloader(std::make_shared<SingleMediaDownloader>(cached)); + m_pending_media_downloads.emplace_back(token, downloader); + downloader->addFile(filename, raw_hash); + for (const auto &baseurl : m_remote_media_servers) + downloader->addRemoteServer(baseurl); + + downloader->step(this); } /* @@ -1611,3 +1730,38 @@ void Client::handleCommand_ModChannelSignal(NetworkPacket *pkt) if (valid_signal) m_script->on_modchannel_signal(channel, signal); } + +void Client::handleCommand_MinimapModes(NetworkPacket *pkt) +{ + u16 count; // modes + u16 mode; // wanted current mode index after change + + *pkt >> count >> mode; + + if (m_minimap) + m_minimap->clearModes(); + + for (size_t index = 0; index < count; index++) { + u16 type; + std::string label; + u16 size; + std::string texture; + u16 scale; + + *pkt >> type >> label >> size >> texture >> scale; + + if (m_minimap) + m_minimap->addMode(MinimapType(type), size, label, texture, scale); + } + + if (m_minimap) + m_minimap->setModeIndex(mode); +} + +void Client::handleCommand_SetLighting(NetworkPacket *pkt) +{ + Lighting& lighting = m_env.getLocalPlayer()->getLighting(); + + if (pkt->getRemainingBytes() >= 4) + *pkt >> lighting.shadow_intensity; +} diff --git a/src/network/connection.cpp b/src/network/connection.cpp index 1875d1461..6fb676f25 100644 --- a/src/network/connection.cpp +++ b/src/network/connection.cpp @@ -41,39 +41,37 @@ namespace con /* defines used for debugging and profiling */ /******************************************************************************/ #ifdef NDEBUG - #define LOG(a) a #define PROFILE(a) #else - #if 0 - /* this mutex is used to achieve log message consistency */ - std::mutex log_message_mutex; - #define LOG(a) \ - { \ - MutexAutoLock loglock(log_message_mutex); \ - a; \ - } - #else - // Prevent deadlocks until a solution is found after 5.2.0 (TODO) - #define LOG(a) a - #endif - #define PROFILE(a) a #endif +// TODO: Clean this up. +#define LOG(a) a + #define PING_TIMEOUT 5.0 -BufferedPacket makePacket(Address &address, const SharedBuffer<u8> &data, +u16 BufferedPacket::getSeqnum() const +{ + if (size() < BASE_HEADER_SIZE + 3) + return 0; // should never happen + + return readU16(&data[BASE_HEADER_SIZE + 1]); +} + +BufferedPacketPtr makePacket(Address &address, const SharedBuffer<u8> &data, u32 protocol_id, session_t sender_peer_id, u8 channel) { u32 packet_size = data.getSize() + BASE_HEADER_SIZE; - BufferedPacket p(packet_size); - p.address = address; - writeU32(&p.data[0], protocol_id); - writeU16(&p.data[4], sender_peer_id); - writeU8(&p.data[6], channel); + BufferedPacketPtr p(new BufferedPacket(packet_size)); + p->address = address; - memcpy(&p.data[BASE_HEADER_SIZE], *data, data.getSize()); + writeU32(&p->data[0], protocol_id); + writeU16(&p->data[4], sender_peer_id); + writeU8(&p->data[6], channel); + + memcpy(&p->data[BASE_HEADER_SIZE], *data, data.getSize()); return p; } @@ -169,9 +167,8 @@ void ReliablePacketBuffer::print() MutexAutoLock listlock(m_list_mutex); LOG(dout_con<<"Dump of ReliablePacketBuffer:" << std::endl); unsigned int index = 0; - for (BufferedPacket &bufferedPacket : m_list) { - u16 s = readU16(&(bufferedPacket.data[BASE_HEADER_SIZE+1])); - LOG(dout_con<<index<< ":" << s << std::endl); + for (BufferedPacketPtr &packet : m_list) { + LOG(dout_con<<index<< ":" << packet->getSeqnum() << std::endl); index++; } } @@ -188,20 +185,12 @@ u32 ReliablePacketBuffer::size() return m_list.size(); } -RPBSearchResult ReliablePacketBuffer::findPacket(u16 seqnum) +RPBSearchResult ReliablePacketBuffer::findPacketNoLock(u16 seqnum) { - std::list<BufferedPacket>::iterator i = m_list.begin(); - for(; i != m_list.end(); ++i) - { - u16 s = readU16(&(i->data[BASE_HEADER_SIZE+1])); - if (s == seqnum) - break; + for (auto it = m_list.begin(); it != m_list.end(); ++it) { + if ((*it)->getSeqnum() == seqnum) + return it; } - return i; -} - -RPBSearchResult ReliablePacketBuffer::notFound() -{ return m_list.end(); } @@ -210,62 +199,54 @@ bool ReliablePacketBuffer::getFirstSeqnum(u16& result) MutexAutoLock listlock(m_list_mutex); if (m_list.empty()) return false; - const BufferedPacket &p = *m_list.begin(); - result = readU16(&p.data[BASE_HEADER_SIZE + 1]); + result = m_list.front()->getSeqnum(); return true; } -BufferedPacket ReliablePacketBuffer::popFirst() +BufferedPacketPtr ReliablePacketBuffer::popFirst() { MutexAutoLock listlock(m_list_mutex); if (m_list.empty()) throw NotFoundException("Buffer is empty"); - BufferedPacket p = *m_list.begin(); - m_list.erase(m_list.begin()); + + BufferedPacketPtr p(m_list.front()); + m_list.pop_front(); if (m_list.empty()) { m_oldest_non_answered_ack = 0; } else { - m_oldest_non_answered_ack = - readU16(&m_list.begin()->data[BASE_HEADER_SIZE + 1]); + m_oldest_non_answered_ack = m_list.front()->getSeqnum(); } return p; } -BufferedPacket ReliablePacketBuffer::popSeqnum(u16 seqnum) +BufferedPacketPtr ReliablePacketBuffer::popSeqnum(u16 seqnum) { MutexAutoLock listlock(m_list_mutex); - RPBSearchResult r = findPacket(seqnum); - if (r == notFound()) { + RPBSearchResult r = findPacketNoLock(seqnum); + if (r == m_list.end()) { LOG(dout_con<<"Sequence number: " << seqnum << " not found in reliable buffer"<<std::endl); throw NotFoundException("seqnum not found in buffer"); } - BufferedPacket p = *r; - - - RPBSearchResult next = r; - ++next; - if (next != notFound()) { - u16 s = readU16(&(next->data[BASE_HEADER_SIZE+1])); - m_oldest_non_answered_ack = s; - } + BufferedPacketPtr p(*r); m_list.erase(r); if (m_list.empty()) { m_oldest_non_answered_ack = 0; } else { - m_oldest_non_answered_ack = - readU16(&m_list.begin()->data[BASE_HEADER_SIZE + 1]); + m_oldest_non_answered_ack = m_list.front()->getSeqnum(); } return p; } -void ReliablePacketBuffer::insert(BufferedPacket &p, u16 next_expected) +void ReliablePacketBuffer::insert(BufferedPacketPtr &p_ptr, u16 next_expected) { MutexAutoLock listlock(m_list_mutex); - if (p.data.getSize() < BASE_HEADER_SIZE + 3) { + const BufferedPacket &p = *p_ptr; + + if (p.size() < BASE_HEADER_SIZE + 3) { errorstream << "ReliablePacketBuffer::insert(): Invalid data size for " "reliable packet" << std::endl; return; @@ -276,7 +257,7 @@ void ReliablePacketBuffer::insert(BufferedPacket &p, u16 next_expected) << std::endl; return; } - u16 seqnum = readU16(&p.data[BASE_HEADER_SIZE + 1]); + const u16 seqnum = p.getSeqnum(); if (!seqnum_in_window(seqnum, next_expected, MAX_RELIABLE_WINDOW_SIZE)) { errorstream << "ReliablePacketBuffer::insert(): seqnum is outside of " @@ -293,44 +274,44 @@ void ReliablePacketBuffer::insert(BufferedPacket &p, u16 next_expected) // Find the right place for the packet and insert it there // If list is empty, just add it - if (m_list.empty()) - { - m_list.push_back(p); + if (m_list.empty()) { + m_list.push_back(p_ptr); m_oldest_non_answered_ack = seqnum; // Done. return; } // Otherwise find the right place - std::list<BufferedPacket>::iterator i = m_list.begin(); + auto it = m_list.begin(); // Find the first packet in the list which has a higher seqnum - u16 s = readU16(&(i->data[BASE_HEADER_SIZE+1])); + u16 s = (*it)->getSeqnum(); /* case seqnum is smaller then next_expected seqnum */ /* this is true e.g. on wrap around */ if (seqnum < next_expected) { - while(((s < seqnum) || (s >= next_expected)) && (i != m_list.end())) { - ++i; - if (i != m_list.end()) - s = readU16(&(i->data[BASE_HEADER_SIZE+1])); + while(((s < seqnum) || (s >= next_expected)) && (it != m_list.end())) { + ++it; + if (it != m_list.end()) + s = (*it)->getSeqnum(); } } /* non wrap around case (at least for incoming and next_expected */ else { - while(((s < seqnum) && (s >= next_expected)) && (i != m_list.end())) { - ++i; - if (i != m_list.end()) - s = readU16(&(i->data[BASE_HEADER_SIZE+1])); + while(((s < seqnum) && (s >= next_expected)) && (it != m_list.end())) { + ++it; + if (it != m_list.end()) + s = (*it)->getSeqnum(); } } if (s == seqnum) { /* nothing to do this seems to be a resent packet */ /* for paranoia reason data should be compared */ + auto &i = *it; if ( - (readU16(&(i->data[BASE_HEADER_SIZE+1])) != seqnum) || - (i->data.getSize() != p.data.getSize()) || + (i->getSeqnum() != seqnum) || + (i->size() != p.size()) || (i->address != p.address) ) { @@ -338,49 +319,52 @@ void ReliablePacketBuffer::insert(BufferedPacket &p, u16 next_expected) fprintf(stderr, "Duplicated seqnum %d non matching packet detected:\n", seqnum); - fprintf(stderr, "Old: seqnum: %05d size: %04d, address: %s\n", - readU16(&(i->data[BASE_HEADER_SIZE+1])),i->data.getSize(), + fprintf(stderr, "Old: seqnum: %05d size: %04zu, address: %s\n", + i->getSeqnum(), i->size(), i->address.serializeString().c_str()); - fprintf(stderr, "New: seqnum: %05d size: %04u, address: %s\n", - readU16(&(p.data[BASE_HEADER_SIZE+1])),p.data.getSize(), + fprintf(stderr, "New: seqnum: %05d size: %04zu, address: %s\n", + p.getSeqnum(), p.size(), p.address.serializeString().c_str()); throw IncomingDataCorruption("duplicated packet isn't same as original one"); } } /* insert or push back */ - else if (i != m_list.end()) { - m_list.insert(i, p); + else if (it != m_list.end()) { + m_list.insert(it, p_ptr); } else { - m_list.push_back(p); + m_list.push_back(p_ptr); } /* update last packet number */ - m_oldest_non_answered_ack = readU16(&(*m_list.begin()).data[BASE_HEADER_SIZE+1]); + m_oldest_non_answered_ack = m_list.front()->getSeqnum(); } void ReliablePacketBuffer::incrementTimeouts(float dtime) { MutexAutoLock listlock(m_list_mutex); - for (BufferedPacket &bufferedPacket : m_list) { - bufferedPacket.time += dtime; - bufferedPacket.totaltime += dtime; + for (auto &packet : m_list) { + packet->time += dtime; + packet->totaltime += dtime; } } -std::list<BufferedPacket> ReliablePacketBuffer::getTimedOuts(float timeout, - unsigned int max_packets) +std::list<ConstSharedPtr<BufferedPacket>> + ReliablePacketBuffer::getTimedOuts(float timeout, u32 max_packets) { MutexAutoLock listlock(m_list_mutex); - std::list<BufferedPacket> timed_outs; - for (BufferedPacket &bufferedPacket : m_list) { - if (bufferedPacket.time >= timeout) { - timed_outs.push_back(bufferedPacket); + std::list<ConstSharedPtr<BufferedPacket>> timed_outs; + for (auto &packet : m_list) { + if (packet->time < timeout) + continue; - //this packet will be sent right afterwards reset timeout here - bufferedPacket.time = 0.0f; - if (timed_outs.size() >= max_packets) - break; - } + // caller will resend packet so reset time and increase counter + packet->time = 0.0f; + packet->resend_count++; + + timed_outs.emplace_back(packet); + + if (timed_outs.size() >= max_packets) + break; } return timed_outs; } @@ -439,11 +423,13 @@ IncomingSplitBuffer::~IncomingSplitBuffer() } } -SharedBuffer<u8> IncomingSplitBuffer::insert(const BufferedPacket &p, bool reliable) +SharedBuffer<u8> IncomingSplitBuffer::insert(BufferedPacketPtr &p_ptr, bool reliable) { MutexAutoLock listlock(m_map_mutex); + const BufferedPacket &p = *p_ptr; + u32 headersize = BASE_HEADER_SIZE + 7; - if (p.data.getSize() < headersize) { + if (p.size() < headersize) { errorstream << "Invalid data size for split packet" << std::endl; return SharedBuffer<u8>(); } @@ -484,7 +470,7 @@ SharedBuffer<u8> IncomingSplitBuffer::insert(const BufferedPacket &p, bool relia <<std::endl); // Cut chunk data out of packet - u32 chunkdatasize = p.data.getSize() - headersize; + u32 chunkdatasize = p.size() - headersize; SharedBuffer<u8> chunkdata(chunkdatasize); memcpy(*chunkdata, &(p.data[headersize]), chunkdatasize); @@ -531,14 +517,67 @@ void IncomingSplitBuffer::removeUnreliableTimedOuts(float dtime, float timeout) ConnectionCommand */ -void ConnectionCommand::send(session_t peer_id_, u8 channelnum_, NetworkPacket *pkt, - bool reliable_) +ConnectionCommandPtr ConnectionCommand::create(ConnectionCommandType type) { - type = CONNCMD_SEND; - peer_id = peer_id_; - channelnum = channelnum_; - data = pkt->oldForgePacket(); - reliable = reliable_; + return ConnectionCommandPtr(new ConnectionCommand(type)); +} + +ConnectionCommandPtr ConnectionCommand::serve(Address address) +{ + auto c = create(CONNCMD_SERVE); + c->address = address; + return c; +} + +ConnectionCommandPtr ConnectionCommand::connect(Address address) +{ + auto c = create(CONNCMD_CONNECT); + c->address = address; + return c; +} + +ConnectionCommandPtr ConnectionCommand::disconnect() +{ + return create(CONNCMD_DISCONNECT); +} + +ConnectionCommandPtr ConnectionCommand::disconnect_peer(session_t peer_id) +{ + auto c = create(CONNCMD_DISCONNECT_PEER); + c->peer_id = peer_id; + return c; +} + +ConnectionCommandPtr ConnectionCommand::send(session_t peer_id, u8 channelnum, + NetworkPacket *pkt, bool reliable) +{ + auto c = create(CONNCMD_SEND); + c->peer_id = peer_id; + c->channelnum = channelnum; + c->reliable = reliable; + c->data = pkt->oldForgePacket(); + return c; +} + +ConnectionCommandPtr ConnectionCommand::ack(session_t peer_id, u8 channelnum, const Buffer<u8> &data) +{ + auto c = create(CONCMD_ACK); + c->peer_id = peer_id; + c->channelnum = channelnum; + c->reliable = false; + data.copyTo(c->data); + return c; +} + +ConnectionCommandPtr ConnectionCommand::createPeer(session_t peer_id, const Buffer<u8> &data) +{ + auto c = create(CONCMD_CREATE_PEER); + c->peer_id = peer_id; + c->channelnum = 0; + c->reliable = true; + c->raw = true; + data.copyTo(c->data); + return c; } /* @@ -573,39 +612,38 @@ void Channel::setNextSplitSeqNum(u16 seqnum) u16 Channel::getOutgoingSequenceNumber(bool& successful) { MutexAutoLock internal(m_internal_mutex); + u16 retval = next_outgoing_seqnum; - u16 lowest_unacked_seqnumber; + successful = false; /* shortcut if there ain't any packet in outgoing list */ - if (outgoing_reliables_sent.empty()) - { + if (outgoing_reliables_sent.empty()) { + successful = true; next_outgoing_seqnum++; return retval; } - if (outgoing_reliables_sent.getFirstSeqnum(lowest_unacked_seqnumber)) - { + u16 lowest_unacked_seqnumber; + if (outgoing_reliables_sent.getFirstSeqnum(lowest_unacked_seqnumber)) { if (lowest_unacked_seqnumber < next_outgoing_seqnum) { // ugly cast but this one is required in order to tell compiler we // know about difference of two unsigned may be negative in general // but we already made sure it won't happen in this case - if (((u16)(next_outgoing_seqnum - lowest_unacked_seqnumber)) > window_size) { - successful = false; + if (((u16)(next_outgoing_seqnum - lowest_unacked_seqnumber)) > m_window_size) { return 0; } - } - else { + } else { // ugly cast but this one is required in order to tell compiler we // know about difference of two unsigned may be negative in general // but we already made sure it won't happen in this case if ((next_outgoing_seqnum + (u16)(SEQNUM_MAX - lowest_unacked_seqnumber)) > - window_size) { - successful = false; + m_window_size) { return 0; } } } + successful = true; next_outgoing_seqnum++; return retval; } @@ -677,7 +715,7 @@ void Channel::UpdateTimers(float dtime) //packet_too_late = current_packet_too_late; packets_successful = current_packet_successful; - if (current_bytes_transfered > (unsigned int) (window_size*512/2)) { + if (current_bytes_transfered > (unsigned int) (m_window_size*512/2)) { reasonable_amount_of_data_transmitted = true; } current_packet_loss = 0; @@ -692,37 +730,25 @@ void Channel::UpdateTimers(float dtime) if (packets_successful > 0) { successful_to_lost_ratio = packet_loss/packets_successful; } else if (packet_loss > 0) { - window_size = std::max( - (window_size - 10), - MIN_RELIABLE_WINDOW_SIZE); + setWindowSize(m_window_size - 10); done = true; } if (!done) { - if ((successful_to_lost_ratio < 0.01f) && - (window_size < MAX_RELIABLE_WINDOW_SIZE)) { + if (successful_to_lost_ratio < 0.01f) { /* don't even think about increasing if we didn't even * use major parts of our window */ if (reasonable_amount_of_data_transmitted) - window_size = std::min( - (window_size + 100), - MAX_RELIABLE_WINDOW_SIZE); - } else if ((successful_to_lost_ratio < 0.05f) && - (window_size < MAX_RELIABLE_WINDOW_SIZE)) { + setWindowSize(m_window_size + 100); + } else if (successful_to_lost_ratio < 0.05f) { /* don't even think about increasing if we didn't even * use major parts of our window */ if (reasonable_amount_of_data_transmitted) - window_size = std::min( - (window_size + 50), - MAX_RELIABLE_WINDOW_SIZE); + setWindowSize(m_window_size + 50); } else if (successful_to_lost_ratio > 0.15f) { - window_size = std::max( - (window_size - 100), - MIN_RELIABLE_WINDOW_SIZE); + setWindowSize(m_window_size - 100); } else if (successful_to_lost_ratio > 0.1f) { - window_size = std::max( - (window_size - 50), - MIN_RELIABLE_WINDOW_SIZE); + setWindowSize(m_window_size - 50); } } } @@ -969,45 +995,45 @@ bool UDPPeer::Ping(float dtime,SharedBuffer<u8>& data) return false; } -void UDPPeer::PutReliableSendCommand(ConnectionCommand &c, +void UDPPeer::PutReliableSendCommand(ConnectionCommandPtr &c, unsigned int max_packet_size) { if (m_pending_disconnect) return; - Channel &chan = channels[c.channelnum]; + Channel &chan = channels[c->channelnum]; if (chan.queued_commands.empty() && /* don't queue more packets then window size */ - (chan.queued_reliables.size() < chan.getWindowSize() / 2)) { + (chan.queued_reliables.size() + 1 < chan.getWindowSize() / 2)) { LOG(dout_con<<m_connection->getDesc() - <<" processing reliable command for peer id: " << c.peer_id - <<" data size: " << c.data.getSize() << std::endl); - if (!processReliableSendCommand(c,max_packet_size)) { - chan.queued_commands.push_back(c); - } - } - else { + <<" processing reliable command for peer id: " << c->peer_id + <<" data size: " << c->data.getSize() << std::endl); + if (processReliableSendCommand(c, max_packet_size)) + return; + } else { LOG(dout_con<<m_connection->getDesc() - <<" Queueing reliable command for peer id: " << c.peer_id - <<" data size: " << c.data.getSize() <<std::endl); - chan.queued_commands.push_back(c); - if (chan.queued_commands.size() >= chan.getWindowSize() / 2) { + <<" Queueing reliable command for peer id: " << c->peer_id + <<" data size: " << c->data.getSize() <<std::endl); + + if (chan.queued_commands.size() + 1 >= chan.getWindowSize() / 2) { LOG(derr_con << m_connection->getDesc() - << "Possible packet stall to peer id: " << c.peer_id + << "Possible packet stall to peer id: " << c->peer_id << " queued_commands=" << chan.queued_commands.size() << std::endl); } } + chan.queued_commands.push_back(c); } bool UDPPeer::processReliableSendCommand( - ConnectionCommand &c, + ConnectionCommandPtr &c_ptr, unsigned int max_packet_size) { if (m_pending_disconnect) return true; + const auto &c = *c_ptr; Channel &chan = channels[c.channelnum]; u32 chunksize_max = max_packet_size @@ -1026,9 +1052,9 @@ bool UDPPeer::processReliableSendCommand( chan.setNextSplitSeqNum(split_sequence_number); } - bool have_sequence_number = true; + bool have_sequence_number = false; bool have_initial_sequence_number = false; - std::queue<BufferedPacket> toadd; + std::queue<BufferedPacketPtr> toadd; volatile u16 initial_sequence_number = 0; for (SharedBuffer<u8> &original : originals) { @@ -1047,7 +1073,7 @@ bool UDPPeer::processReliableSendCommand( SharedBuffer<u8> reliable = makeReliablePacket(original, seqnum); // Add base headers and make a packet - BufferedPacket p = con::makePacket(address, reliable, + BufferedPacketPtr p = con::makePacket(address, reliable, m_connection->GetProtocolID(), m_connection->GetPeerID(), c.channelnum); @@ -1055,9 +1081,8 @@ bool UDPPeer::processReliableSendCommand( } if (have_sequence_number) { - volatile u16 pcount = 0; while (!toadd.empty()) { - BufferedPacket p = toadd.front(); + BufferedPacketPtr p = toadd.front(); toadd.pop(); // LOG(dout_con<<connection->getDesc() // << " queuing reliable packet for peer_id: " << c.peer_id @@ -1065,7 +1090,6 @@ bool UDPPeer::processReliableSendCommand( // << " seqnum: " << readU16(&p.data[BASE_HEADER_SIZE+1]) // << std::endl) chan.queued_reliables.push(p); - pcount++; } sanity_check(chan.queued_reliables.size() < 0xFFFF); return true; @@ -1074,6 +1098,7 @@ bool UDPPeer::processReliableSendCommand( volatile u16 packets_available = toadd.size(); /* we didn't get a single sequence number no need to fill queue */ if (!have_initial_sequence_number) { + LOG(derr_con << m_connection->getDesc() << "Ran out of sequence numbers!" << std::endl); return false; } @@ -1119,18 +1144,18 @@ void UDPPeer::RunCommandQueues( (channel.queued_reliables.size() < maxtransfer) && (commands_processed < maxcommands)) { try { - ConnectionCommand c = channel.queued_commands.front(); + ConnectionCommandPtr c = channel.queued_commands.front(); LOG(dout_con << m_connection->getDesc() << " processing queued reliable command " << std::endl); // Packet is processed, remove it from queue - if (processReliableSendCommand(c,max_packet_size)) { + if (processReliableSendCommand(c, max_packet_size)) { channel.queued_commands.pop_front(); } else { LOG(dout_con << m_connection->getDesc() - << " Failed to queue packets for peer_id: " << c.peer_id - << ", delaying sending of " << c.data.getSize() + << " Failed to queue packets for peer_id: " << c->peer_id + << ", delaying sending of " << c->data.getSize() << " bytes" << std::endl); } } @@ -1153,13 +1178,70 @@ void UDPPeer::setNextSplitSequenceNumber(u8 channel, u16 seqnum) channels[channel].setNextSplitSeqNum(seqnum); } -SharedBuffer<u8> UDPPeer::addSplitPacket(u8 channel, const BufferedPacket &toadd, +SharedBuffer<u8> UDPPeer::addSplitPacket(u8 channel, BufferedPacketPtr &toadd, bool reliable) { assert(channel < CHANNEL_COUNT); // Pre-condition return channels[channel].incoming_splits.insert(toadd, reliable); } +/* + ConnectionEvent +*/ + +const char *ConnectionEvent::describe() const +{ + switch(type) { + case CONNEVENT_NONE: + return "CONNEVENT_NONE"; + case CONNEVENT_DATA_RECEIVED: + return "CONNEVENT_DATA_RECEIVED"; + case CONNEVENT_PEER_ADDED: + return "CONNEVENT_PEER_ADDED"; + case CONNEVENT_PEER_REMOVED: + return "CONNEVENT_PEER_REMOVED"; + case CONNEVENT_BIND_FAILED: + return "CONNEVENT_BIND_FAILED"; + } + return "Invalid ConnectionEvent"; +} + + +ConnectionEventPtr ConnectionEvent::create(ConnectionEventType type) +{ + return std::shared_ptr<ConnectionEvent>(new ConnectionEvent(type)); +} + +ConnectionEventPtr ConnectionEvent::dataReceived(session_t peer_id, const Buffer<u8> &data) +{ + auto e = create(CONNEVENT_DATA_RECEIVED); + e->peer_id = peer_id; + data.copyTo(e->data); + return e; +} + +ConnectionEventPtr ConnectionEvent::peerAdded(session_t peer_id, Address address) +{ + auto e = create(CONNEVENT_PEER_ADDED); + e->peer_id = peer_id; + e->address = address; + return e; +} + +ConnectionEventPtr ConnectionEvent::peerRemoved(session_t peer_id, bool is_timeout, Address address) +{ + auto e = create(CONNEVENT_PEER_REMOVED); + e->peer_id = peer_id; + e->timeout = is_timeout; + e->address = address; + return e; +} + +ConnectionEventPtr ConnectionEvent::bindFailed() +{ + return create(CONNEVENT_BIND_FAILED); +} + /* Connection */ @@ -1208,9 +1290,10 @@ Connection::~Connection() } /* Internal stuff */ -void Connection::putEvent(ConnectionEvent &e) + +void Connection::putEvent(ConnectionEventPtr e) { - assert(e.type != CONNEVENT_NONE); // Pre-condition + assert(e->type != CONNEVENT_NONE); // Pre-condition m_event_queue.push_back(e); } @@ -1276,11 +1359,9 @@ bool Connection::deletePeer(session_t peer_id, bool timeout) Address peer_address; //any peer has a primary address this never fails! peer->getAddress(MTP_PRIMARY, peer_address); - // Create event - ConnectionEvent e; - e.peerRemoved(peer_id, timeout, peer_address); - putEvent(e); + // Create event + putEvent(ConnectionEvent::peerRemoved(peer_id, timeout, peer_address)); peer->Drop(); return true; @@ -1288,18 +1369,16 @@ bool Connection::deletePeer(session_t peer_id, bool timeout) /* Interface */ -ConnectionEvent Connection::waitEvent(u32 timeout_ms) +ConnectionEventPtr Connection::waitEvent(u32 timeout_ms) { try { return m_event_queue.pop_front(timeout_ms); } catch(ItemNotFoundException &ex) { - ConnectionEvent e; - e.type = CONNEVENT_NONE; - return e; + return ConnectionEvent::create(CONNEVENT_NONE); } } -void Connection::putCommand(ConnectionCommand &c) +void Connection::putCommand(ConnectionCommandPtr c) { if (!m_shutting_down) { m_command_queue.push_back(c); @@ -1309,16 +1388,12 @@ void Connection::putCommand(ConnectionCommand &c) void Connection::Serve(Address bind_addr) { - ConnectionCommand c; - c.serve(bind_addr); - putCommand(c); + putCommand(ConnectionCommand::serve(bind_addr)); } void Connection::Connect(Address address) { - ConnectionCommand c; - c.connect(address); - putCommand(c); + putCommand(ConnectionCommand::connect(address)); } bool Connection::Connected() @@ -1340,9 +1415,7 @@ bool Connection::Connected() void Connection::Disconnect() { - ConnectionCommand c; - c.disconnect(); - putCommand(c); + putCommand(ConnectionCommand::disconnect()); } bool Connection::Receive(NetworkPacket *pkt, u32 timeout) @@ -1353,11 +1426,15 @@ bool Connection::Receive(NetworkPacket *pkt, u32 timeout) This is not considered to be a problem (is it?) */ for(;;) { - ConnectionEvent e = waitEvent(timeout); - if (e.type != CONNEVENT_NONE) + ConnectionEventPtr e_ptr = waitEvent(timeout); + const ConnectionEvent &e = *e_ptr; + + if (e.type != CONNEVENT_NONE) { LOG(dout_con << getDesc() << ": Receive: got event: " << e.describe() << std::endl); - switch(e.type) { + } + + switch (e.type) { case CONNEVENT_NONE: return false; case CONNEVENT_DATA_RECEIVED: @@ -1405,10 +1482,7 @@ void Connection::Send(session_t peer_id, u8 channelnum, { assert(channelnum < CHANNEL_COUNT); // Pre-condition - ConnectionCommand c; - - c.send(peer_id, channelnum, pkt, reliable); - putCommand(c); + putCommand(ConnectionCommand::send(peer_id, channelnum, pkt, reliable)); } Address Connection::GetPeerAddress(session_t peer_id) @@ -1507,41 +1581,31 @@ u16 Connection::createPeer(Address& sender, MTProtocols protocol, int fd) LOG(dout_con << getDesc() << "createPeer(): giving peer_id=" << peer_id_new << std::endl); - ConnectionCommand cmd; - SharedBuffer<u8> reply(4); - writeU8(&reply[0], PACKET_TYPE_CONTROL); - writeU8(&reply[1], CONTROLTYPE_SET_PEER_ID); - writeU16(&reply[2], peer_id_new); - cmd.createPeer(peer_id_new,reply); - putCommand(cmd); + { + Buffer<u8> reply(4); + writeU8(&reply[0], PACKET_TYPE_CONTROL); + writeU8(&reply[1], CONTROLTYPE_SET_PEER_ID); + writeU16(&reply[2], peer_id_new); + putCommand(ConnectionCommand::createPeer(peer_id_new, reply)); + } // Create peer addition event - ConnectionEvent e; - e.peerAdded(peer_id_new, sender); - putEvent(e); + putEvent(ConnectionEvent::peerAdded(peer_id_new, sender)); // We're now talking to a valid peer_id return peer_id_new; } -void Connection::PrintInfo(std::ostream &out) -{ - m_info_mutex.lock(); - out<<getDesc()<<": "; - m_info_mutex.unlock(); -} - const std::string Connection::getDesc() { + MutexAutoLock _(m_info_mutex); return std::string("con(")+ itos(m_udpSocket.GetHandle())+"/"+itos(m_peer_id)+")"; } void Connection::DisconnectPeer(session_t peer_id) { - ConnectionCommand discon; - discon.disconnect_peer(peer_id); - putCommand(discon); + putCommand(ConnectionCommand::disconnect_peer(peer_id)); } void Connection::sendAck(session_t peer_id, u8 channelnum, u16 seqnum) @@ -1553,20 +1617,18 @@ void Connection::sendAck(session_t peer_id, u8 channelnum, u16 seqnum) " channel: " << (channelnum & 0xFF) << " seqnum: " << seqnum << std::endl); - ConnectionCommand c; SharedBuffer<u8> ack(4); writeU8(&ack[0], PACKET_TYPE_CONTROL); writeU8(&ack[1], CONTROLTYPE_ACK); writeU16(&ack[2], seqnum); - c.ack(peer_id, channelnum, ack); - putCommand(c); + putCommand(ConnectionCommand::ack(peer_id, channelnum, ack)); m_sendThread->Trigger(); } UDPPeer* Connection::createServerPeer(Address& address) { - if (getPeerNoEx(PEER_ID_SERVER) != 0) + if (ConnectedToServer()) { throw ConnectionException("Already connected to a server"); } diff --git a/src/network/connection.h b/src/network/connection.h index 2dc6d4397..b5ae24882 100644 --- a/src/network/connection.h +++ b/src/network/connection.h @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -#include "irrlichttypes_bloated.h" +#include "irrlichttypes.h" #include "peerhandler.h" #include "socket.h" #include "constants.h" @@ -29,10 +29,98 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/numeric.h" #include "networkprotocol.h" #include <iostream> -#include <fstream> #include <vector> #include <map> +#define MAX_UDP_PEERS 65535 + +/* +=== NOTES === + +A packet is sent through a channel to a peer with a basic header: + Header (7 bytes): + [0] u32 protocol_id + [4] session_t sender_peer_id + [6] u8 channel +sender_peer_id: + Unique to each peer. + value 0 (PEER_ID_INEXISTENT) is reserved for making new connections + value 1 (PEER_ID_SERVER) is reserved for server + these constants are defined in constants.h +channel: + Channel numbers have no intrinsic meaning. Currently only 0, 1, 2 exist. +*/ +#define BASE_HEADER_SIZE 7 +#define CHANNEL_COUNT 3 + +/* +Packet types: + +CONTROL: This is a packet used by the protocol. +- When this is processed, nothing is handed to the user. + Header (2 byte): + [0] u8 type + [1] u8 controltype +controltype and data description: + CONTROLTYPE_ACK + [2] u16 seqnum + CONTROLTYPE_SET_PEER_ID + [2] session_t peer_id_new + CONTROLTYPE_PING + - There is no actual reply, but this can be sent in a reliable + packet to get a reply + CONTROLTYPE_DISCO +*/ +enum ControlType : u8 { + CONTROLTYPE_ACK = 0, + CONTROLTYPE_SET_PEER_ID = 1, + CONTROLTYPE_PING = 2, + CONTROLTYPE_DISCO = 3, +}; + +/* +ORIGINAL: This is a plain packet with no control and no error +checking at all. +- When this is processed, it is directly handed to the user. + Header (1 byte): + [0] u8 type +*/ +//#define TYPE_ORIGINAL 1 +#define ORIGINAL_HEADER_SIZE 1 + +/* +SPLIT: These are sequences of packets forming one bigger piece of +data. +- When processed and all the packet_nums 0...packet_count-1 are + present (this should be buffered), the resulting data shall be + directly handed to the user. +- If the data fails to come up in a reasonable time, the buffer shall + be silently discarded. +- These can be sent as-is or atop of a RELIABLE packet stream. + Header (7 bytes): + [0] u8 type + [1] u16 seqnum + [3] u16 chunk_count + [5] u16 chunk_num +*/ +//#define TYPE_SPLIT 2 + +/* +RELIABLE: Delivery of all RELIABLE packets shall be forced by ACKs, +and they shall be delivered in the same order as sent. This is done +with a buffer in the receiving and transmitting end. +- When this is processed, the contents of each packet is recursively + processed as packets. + Header (3 bytes): + [0] u8 type + [1] u16 seqnum + +*/ +//#define TYPE_RELIABLE 3 +#define RELIABLE_HEADER_SIZE 3 +#define SEQNUM_INITIAL 65500 +#define SEQNUM_MAX 65535 + class NetworkPacket; namespace con @@ -47,9 +135,13 @@ typedef enum MTProtocols { MTP_MINETEST_RELIABLE_UDP } MTProtocols; -#define MAX_UDP_PEERS 65535 - -#define SEQNUM_MAX 65535 +enum PacketType : u8 { + PACKET_TYPE_CONTROL = 0, + PACKET_TYPE_ORIGINAL = 1, + PACKET_TYPE_SPLIT = 2, + PACKET_TYPE_RELIABLE = 3, + PACKET_TYPE_MAX +}; inline bool seqnum_higher(u16 totest, u16 base) { @@ -86,24 +178,40 @@ static inline float CALC_DTIME(u64 lasttime, u64 curtime) return MYMAX(MYMIN(value,0.1),0.0); } -struct BufferedPacket -{ - BufferedPacket(u8 *a_data, u32 a_size): - data(a_data, a_size) - {} - BufferedPacket(u32 a_size): - data(a_size) - {} - Buffer<u8> data; // Data of the packet, including headers +/* + Struct for all kinds of packets. Includes following data: + BASE_HEADER + u8[] packet data (usually copied from SharedBuffer<u8>) +*/ +struct BufferedPacket { + BufferedPacket(u32 a_size) + { + m_data.resize(a_size); + data = &m_data[0]; + } + + DISABLE_CLASS_COPY(BufferedPacket) + + u16 getSeqnum() const; + + inline size_t size() const { return m_data.size(); } + + u8 *data; // Direct memory access float time = 0.0f; // Seconds from buffering the packet or re-sending float totaltime = 0.0f; // Seconds from buffering the packet u64 absolute_send_time = -1; Address address; // Sender or destination unsigned int resend_count = 0; + +private: + std::vector<u8> m_data; // Data of the packet, including headers }; +typedef std::shared_ptr<BufferedPacket> BufferedPacketPtr; + + // This adds the base headers to the data and makes a packet out of it -BufferedPacket makePacket(Address &address, const SharedBuffer<u8> &data, +BufferedPacketPtr makePacket(Address &address, const SharedBuffer<u8> &data, u32 protocol_id, session_t sender_peer_id, u8 channel); // Depending on size, make a TYPE_ORIGINAL or TYPE_SPLIT packet @@ -137,101 +245,12 @@ private: std::map<u16, SharedBuffer<u8>> chunks; }; -/* -=== NOTES === - -A packet is sent through a channel to a peer with a basic header: - Header (7 bytes): - [0] u32 protocol_id - [4] session_t sender_peer_id - [6] u8 channel -sender_peer_id: - Unique to each peer. - value 0 (PEER_ID_INEXISTENT) is reserved for making new connections - value 1 (PEER_ID_SERVER) is reserved for server - these constants are defined in constants.h -channel: - Channel numbers have no intrinsic meaning. Currently only 0, 1, 2 exist. -*/ -#define BASE_HEADER_SIZE 7 -#define CHANNEL_COUNT 3 -/* -Packet types: - -CONTROL: This is a packet used by the protocol. -- When this is processed, nothing is handed to the user. - Header (2 byte): - [0] u8 type - [1] u8 controltype -controltype and data description: - CONTROLTYPE_ACK - [2] u16 seqnum - CONTROLTYPE_SET_PEER_ID - [2] session_t peer_id_new - CONTROLTYPE_PING - - There is no actual reply, but this can be sent in a reliable - packet to get a reply - CONTROLTYPE_DISCO -*/ -//#define TYPE_CONTROL 0 -#define CONTROLTYPE_ACK 0 -#define CONTROLTYPE_SET_PEER_ID 1 -#define CONTROLTYPE_PING 2 -#define CONTROLTYPE_DISCO 3 - -/* -ORIGINAL: This is a plain packet with no control and no error -checking at all. -- When this is processed, it is directly handed to the user. - Header (1 byte): - [0] u8 type -*/ -//#define TYPE_ORIGINAL 1 -#define ORIGINAL_HEADER_SIZE 1 -/* -SPLIT: These are sequences of packets forming one bigger piece of -data. -- When processed and all the packet_nums 0...packet_count-1 are - present (this should be buffered), the resulting data shall be - directly handed to the user. -- If the data fails to come up in a reasonable time, the buffer shall - be silently discarded. -- These can be sent as-is or atop of a RELIABLE packet stream. - Header (7 bytes): - [0] u8 type - [1] u16 seqnum - [3] u16 chunk_count - [5] u16 chunk_num -*/ -//#define TYPE_SPLIT 2 -/* -RELIABLE: Delivery of all RELIABLE packets shall be forced by ACKs, -and they shall be delivered in the same order as sent. This is done -with a buffer in the receiving and transmitting end. -- When this is processed, the contents of each packet is recursively - processed as packets. - Header (3 bytes): - [0] u8 type - [1] u16 seqnum - -*/ -//#define TYPE_RELIABLE 3 -#define RELIABLE_HEADER_SIZE 3 -#define SEQNUM_INITIAL 65500 - -enum PacketType: u8 { - PACKET_TYPE_CONTROL = 0, - PACKET_TYPE_ORIGINAL = 1, - PACKET_TYPE_SPLIT = 2, - PACKET_TYPE_RELIABLE = 3, - PACKET_TYPE_MAX -}; /* A buffer which stores reliable packets and sorts them internally for fast access to the smallest one. */ -typedef std::list<BufferedPacket>::iterator RPBSearchResult; +typedef std::list<BufferedPacketPtr>::iterator RPBSearchResult; class ReliablePacketBuffer { @@ -240,24 +259,22 @@ public: bool getFirstSeqnum(u16& result); - BufferedPacket popFirst(); - BufferedPacket popSeqnum(u16 seqnum); - void insert(BufferedPacket &p, u16 next_expected); + BufferedPacketPtr popFirst(); + BufferedPacketPtr popSeqnum(u16 seqnum); + void insert(BufferedPacketPtr &p_ptr, u16 next_expected); void incrementTimeouts(float dtime); - std::list<BufferedPacket> getTimedOuts(float timeout, - unsigned int max_packets); + std::list<ConstSharedPtr<BufferedPacket>> getTimedOuts(float timeout, u32 max_packets); void print(); bool empty(); - RPBSearchResult notFound(); u32 size(); private: - RPBSearchResult findPacket(u16 seqnum); // does not perform locking + RPBSearchResult findPacketNoLock(u16 seqnum); - std::list<BufferedPacket> m_list; + std::list<BufferedPacketPtr> m_list; u16 m_oldest_non_answered_ack; @@ -276,7 +293,7 @@ public: Returns a reference counted buffer of length != 0 when a full split packet is constructed. If not, returns one of length 0. */ - SharedBuffer<u8> insert(const BufferedPacket &p, bool reliable); + SharedBuffer<u8> insert(BufferedPacketPtr &p_ptr, bool reliable); void removeUnreliableTimedOuts(float dtime, float timeout); @@ -287,25 +304,6 @@ private: std::mutex m_map_mutex; }; -struct OutgoingPacket -{ - session_t peer_id; - u8 channelnum; - SharedBuffer<u8> data; - bool reliable; - bool ack; - - OutgoingPacket(session_t peer_id_, u8 channelnum_, const SharedBuffer<u8> &data_, - bool reliable_,bool ack_=false): - peer_id(peer_id_), - channelnum(channelnum_), - data(data_), - reliable(reliable_), - ack(ack_) - { - } -}; - enum ConnectionCommandType{ CONNCMD_NONE, CONNCMD_SERVE, @@ -318,9 +316,13 @@ enum ConnectionCommandType{ CONCMD_CREATE_PEER }; +struct ConnectionCommand; +typedef std::shared_ptr<ConnectionCommand> ConnectionCommandPtr; + +// This is very similar to ConnectionEvent struct ConnectionCommand { - enum ConnectionCommandType type = CONNCMD_NONE; + const ConnectionCommandType type; Address address; session_t peer_id = PEER_ID_INEXISTENT; u8 channelnum = 0; @@ -328,60 +330,21 @@ struct ConnectionCommand bool reliable = false; bool raw = false; - ConnectionCommand() = default; - ConnectionCommand &operator=(const ConnectionCommand &other) - { - type = other.type; - address = other.address; - peer_id = other.peer_id; - channelnum = other.channelnum; - // We must copy the buffer here to prevent race condition - data = SharedBuffer<u8>(*other.data, other.data.getSize()); - reliable = other.reliable; - raw = other.raw; - return *this; - } + DISABLE_CLASS_COPY(ConnectionCommand); - void serve(Address address_) - { - type = CONNCMD_SERVE; - address = address_; - } - void connect(Address address_) - { - type = CONNCMD_CONNECT; - address = address_; - } - void disconnect() - { - type = CONNCMD_DISCONNECT; - } - void disconnect_peer(session_t peer_id_) - { - type = CONNCMD_DISCONNECT_PEER; - peer_id = peer_id_; - } + static ConnectionCommandPtr serve(Address address); + static ConnectionCommandPtr connect(Address address); + static ConnectionCommandPtr disconnect(); + static ConnectionCommandPtr disconnect_peer(session_t peer_id); + static ConnectionCommandPtr send(session_t peer_id, u8 channelnum, NetworkPacket *pkt, bool reliable); + static ConnectionCommandPtr ack(session_t peer_id, u8 channelnum, const Buffer<u8> &data); + static ConnectionCommandPtr createPeer(session_t peer_id, const Buffer<u8> &data); - void send(session_t peer_id_, u8 channelnum_, NetworkPacket *pkt, bool reliable_); +private: + ConnectionCommand(ConnectionCommandType type_) : + type(type_) {} - void ack(session_t peer_id_, u8 channelnum_, const SharedBuffer<u8> &data_) - { - type = CONCMD_ACK; - peer_id = peer_id_; - channelnum = channelnum_; - data = data_; - reliable = false; - } - - void createPeer(session_t peer_id_, const SharedBuffer<u8> &data_) - { - type = CONCMD_CREATE_PEER; - peer_id = peer_id_; - data = data_; - channelnum = 0; - reliable = true; - raw = true; - } + static ConnectionCommandPtr create(ConnectionCommandType type); }; /* maximum window size to use, 0xFFFF is theoretical maximum. don't think about @@ -416,10 +379,10 @@ public: ReliablePacketBuffer outgoing_reliables_sent; //queued reliable packets - std::queue<BufferedPacket> queued_reliables; + std::queue<BufferedPacketPtr> queued_reliables; //queue commands prior splitting to packets - std::deque<ConnectionCommand> queued_commands; + std::deque<ConnectionCommandPtr> queued_commands; IncomingSplitBuffer incoming_splits; @@ -434,34 +397,38 @@ public: void UpdateTimers(float dtime); - const float getCurrentDownloadRateKB() + float getCurrentDownloadRateKB() { MutexAutoLock lock(m_internal_mutex); return cur_kbps; }; - const float getMaxDownloadRateKB() + float getMaxDownloadRateKB() { MutexAutoLock lock(m_internal_mutex); return max_kbps; }; - const float getCurrentLossRateKB() + float getCurrentLossRateKB() { MutexAutoLock lock(m_internal_mutex); return cur_kbps_lost; }; - const float getMaxLossRateKB() + float getMaxLossRateKB() { MutexAutoLock lock(m_internal_mutex); return max_kbps_lost; }; - const float getCurrentIncomingRateKB() + float getCurrentIncomingRateKB() { MutexAutoLock lock(m_internal_mutex); return cur_incoming_kbps; }; - const float getMaxIncomingRateKB() + float getMaxIncomingRateKB() { MutexAutoLock lock(m_internal_mutex); return max_incoming_kbps; }; - const float getAvgDownloadRateKB() + float getAvgDownloadRateKB() { MutexAutoLock lock(m_internal_mutex); return avg_kbps; }; - const float getAvgLossRateKB() + float getAvgLossRateKB() { MutexAutoLock lock(m_internal_mutex); return avg_kbps_lost; }; - const float getAvgIncomingRateKB() + float getAvgIncomingRateKB() { MutexAutoLock lock(m_internal_mutex); return avg_incoming_kbps; }; - const unsigned int getWindowSize() const { return window_size; }; + u16 getWindowSize() const { return m_window_size; }; + + void setWindowSize(long size) + { + m_window_size = (u16)rangelim(size, MIN_RELIABLE_WINDOW_SIZE, MAX_RELIABLE_WINDOW_SIZE); + } - void setWindowSize(unsigned int size) { window_size = size; }; private: std::mutex m_internal_mutex; - int window_size = MIN_RELIABLE_WINDOW_SIZE; + u16 m_window_size = MIN_RELIABLE_WINDOW_SIZE; u16 next_incoming_seqnum = SEQNUM_INITIAL; @@ -524,7 +491,7 @@ class Peer { public: friend class PeerHelper; - Peer(Address address_,u16 id_,Connection* connection) : + Peer(Address address_,session_t id_,Connection* connection) : id(id_), m_connection(connection), address(address_), @@ -538,11 +505,11 @@ class Peer { }; // Unique id of the peer - u16 id; + const session_t id; void Drop(); - virtual void PutReliableSendCommand(ConnectionCommand &c, + virtual void PutReliableSendCommand(ConnectionCommandPtr &c, unsigned int max_packet_size) {}; virtual bool getAddress(MTProtocols type, Address& toset) = 0; @@ -559,7 +526,7 @@ class Peer { virtual u16 getNextSplitSequenceNumber(u8 channel) { return 0; }; virtual void setNextSplitSequenceNumber(u8 channel, u16 seqnum) {}; - virtual SharedBuffer<u8> addSplitPacket(u8 channel, const BufferedPacket &toadd, + virtual SharedBuffer<u8> addSplitPacket(u8 channel, BufferedPacketPtr &toadd, bool reliable) { errorstream << "Peer::addSplitPacket called," @@ -596,7 +563,7 @@ class Peer { bool IncUseCount(); void DecUseCount(); - std::mutex m_exclusive_access_mutex; + mutable std::mutex m_exclusive_access_mutex; bool m_pending_deletion = false; @@ -644,7 +611,7 @@ public: UDPPeer(u16 a_id, Address a_address, Connection* connection); virtual ~UDPPeer() = default; - void PutReliableSendCommand(ConnectionCommand &c, + void PutReliableSendCommand(ConnectionCommandPtr &c, unsigned int max_packet_size); bool getAddress(MTProtocols type, Address& toset); @@ -652,7 +619,7 @@ public: u16 getNextSplitSequenceNumber(u8 channel); void setNextSplitSequenceNumber(u8 channel, u16 seqnum); - SharedBuffer<u8> addSplitPacket(u8 channel, const BufferedPacket &toadd, + SharedBuffer<u8> addSplitPacket(u8 channel, BufferedPacketPtr &toadd, bool reliable); protected: @@ -681,7 +648,7 @@ private: float resend_timeout = 0.5; bool processReliableSendCommand( - ConnectionCommand &c, + ConnectionCommandPtr &c_ptr, unsigned int max_packet_size); }; @@ -689,7 +656,7 @@ private: Connection */ -enum ConnectionEventType{ +enum ConnectionEventType { CONNEVENT_NONE, CONNEVENT_DATA_RECEIVED, CONNEVENT_PEER_ADDED, @@ -697,56 +664,32 @@ enum ConnectionEventType{ CONNEVENT_BIND_FAILED, }; +struct ConnectionEvent; +typedef std::shared_ptr<ConnectionEvent> ConnectionEventPtr; + +// This is very similar to ConnectionCommand struct ConnectionEvent { - enum ConnectionEventType type = CONNEVENT_NONE; + const ConnectionEventType type; session_t peer_id = 0; Buffer<u8> data; bool timeout = false; Address address; - ConnectionEvent() = default; + // We don't want to copy "data" + DISABLE_CLASS_COPY(ConnectionEvent); - std::string describe() - { - switch(type) { - case CONNEVENT_NONE: - return "CONNEVENT_NONE"; - case CONNEVENT_DATA_RECEIVED: - return "CONNEVENT_DATA_RECEIVED"; - case CONNEVENT_PEER_ADDED: - return "CONNEVENT_PEER_ADDED"; - case CONNEVENT_PEER_REMOVED: - return "CONNEVENT_PEER_REMOVED"; - case CONNEVENT_BIND_FAILED: - return "CONNEVENT_BIND_FAILED"; - } - return "Invalid ConnectionEvent"; - } + static ConnectionEventPtr create(ConnectionEventType type); + static ConnectionEventPtr dataReceived(session_t peer_id, const Buffer<u8> &data); + static ConnectionEventPtr peerAdded(session_t peer_id, Address address); + static ConnectionEventPtr peerRemoved(session_t peer_id, bool is_timeout, Address address); + static ConnectionEventPtr bindFailed(); - void dataReceived(session_t peer_id_, const SharedBuffer<u8> &data_) - { - type = CONNEVENT_DATA_RECEIVED; - peer_id = peer_id_; - data = data_; - } - void peerAdded(session_t peer_id_, Address address_) - { - type = CONNEVENT_PEER_ADDED; - peer_id = peer_id_; - address = address_; - } - void peerRemoved(session_t peer_id_, bool timeout_, Address address_) - { - type = CONNEVENT_PEER_REMOVED; - peer_id = peer_id_; - timeout = timeout_; - address = address_; - } - void bindFailed() - { - type = CONNEVENT_BIND_FAILED; - } + const char *describe() const; + +private: + ConnectionEvent(ConnectionEventType type_) : + type(type_) {} }; class PeerHandler; @@ -762,8 +705,9 @@ public: ~Connection(); /* Interface */ - ConnectionEvent waitEvent(u32 timeout_ms); - void putCommand(ConnectionCommand &c); + ConnectionEventPtr waitEvent(u32 timeout_ms); + + void putCommand(ConnectionCommandPtr c); void SetTimeoutMs(u32 timeout) { m_bc_receive_timeout = timeout; } void Serve(Address bind_addr); @@ -777,7 +721,7 @@ public: Address GetPeerAddress(session_t peer_id); float getPeerStat(session_t peer_id, rtt_stat_type type); float getLocalStat(rate_stat_type type); - const u32 GetProtocolID() const { return m_protocol_id; }; + u32 GetProtocolID() const { return m_protocol_id; }; const std::string getDesc(); void DisconnectPeer(session_t peer_id); @@ -793,8 +737,6 @@ protected: void sendAck(session_t peer_id, u8 channelnum, u16 seqnum); - void PrintInfo(std::ostream &out); - std::vector<session_t> getPeerIDs() { MutexAutoLock peerlock(m_peers_mutex); @@ -802,15 +744,22 @@ protected: } UDPSocket m_udpSocket; - MutexedQueue<ConnectionCommand> m_command_queue; + // Command queue: user -> SendThread + MutexedQueue<ConnectionCommandPtr> m_command_queue; bool Receive(NetworkPacket *pkt, u32 timeout); - void putEvent(ConnectionEvent &e); + void putEvent(ConnectionEventPtr e); void TriggerSend(); + + bool ConnectedToServer() + { + return getPeerNoEx(PEER_ID_SERVER) != nullptr; + } private: - MutexedQueue<ConnectionEvent> m_event_queue; + // Event queue: ReceiveThread -> user + MutexedQueue<ConnectionEventPtr> m_event_queue; session_t m_peer_id = 0; u32 m_protocol_id; @@ -822,7 +771,7 @@ private: std::unique_ptr<ConnectionSendThread> m_sendThread; std::unique_ptr<ConnectionReceiveThread> m_receiveThread; - std::mutex m_info_mutex; + mutable std::mutex m_info_mutex; // Backwards compatibility PeerHandler *m_bc_peerhandler; diff --git a/src/network/connectionthreads.cpp b/src/network/connectionthreads.cpp index 28ed798d9..90936b43d 100644 --- a/src/network/connectionthreads.cpp +++ b/src/network/connectionthreads.cpp @@ -32,32 +32,25 @@ namespace con /* defines used for debugging and profiling */ /******************************************************************************/ #ifdef NDEBUG -#define LOG(a) a #define PROFILE(a) #undef DEBUG_CONNECTION_KBPS #else /* this mutex is used to achieve log message consistency */ -std::mutex log_conthread_mutex; -#define LOG(a) \ - { \ - MutexAutoLock loglock(log_conthread_mutex); \ - a; \ - } #define PROFILE(a) a //#define DEBUG_CONNECTION_KBPS #undef DEBUG_CONNECTION_KBPS #endif -/* maximum number of retries for reliable packets */ -#define MAX_RELIABLE_RETRY 5 +// TODO: Clean this up. +#define LOG(a) a #define WINDOW_SIZE 5 -static session_t readPeerId(u8 *packetdata) +static session_t readPeerId(const u8 *packetdata) { return readU16(&packetdata[4]); } -static u8 readChannel(u8 *packetdata) +static u8 readChannel(const u8 *packetdata) { return readU8(&packetdata[6]); } @@ -117,9 +110,9 @@ void *ConnectionSendThread::run() } /* translate commands to packets */ - ConnectionCommand c = m_connection->m_command_queue.pop_frontNoEx(0); - while (c.type != CONNCMD_NONE) { - if (c.reliable) + auto c = m_connection->m_command_queue.pop_frontNoEx(0); + while (c && c->type != CONNCMD_NONE) { + if (c->reliable) processReliableCommand(c); else processNonReliableCommand(c); @@ -174,6 +167,11 @@ void ConnectionSendThread::runTimeouts(float dtime) std::vector<session_t> timeouted_peers; std::vector<session_t> peerIds = m_connection->getPeerIDs(); + const u32 numpeers = m_connection->m_peers.size(); + + if (numpeers == 0) + return; + for (session_t &peerId : peerIds) { PeerHelper peer = m_connection->getPeerNoEx(peerId); @@ -207,9 +205,7 @@ void ConnectionSendThread::runTimeouts(float dtime) } float resend_timeout = udpPeer->getResendTimeout(); - bool retry_count_exceeded = false; for (Channel &channel : udpPeer->channels) { - std::list<BufferedPacket> timed_outs; // Remove timed out incomplete unreliable split packets channel.incoming_splits.removeUnreliableTimedOuts(dtime, m_timeout); @@ -217,13 +213,8 @@ void ConnectionSendThread::runTimeouts(float dtime) // Increment reliable packet times channel.outgoing_reliables_sent.incrementTimeouts(dtime); - unsigned int numpeers = m_connection->m_peers.size(); - - if (numpeers == 0) - return; - // Re-send timed out outgoing reliables - timed_outs = channel.outgoing_reliables_sent.getTimedOuts(resend_timeout, + auto timed_outs = channel.outgoing_reliables_sent.getTimedOuts(resend_timeout, (m_max_data_packets_per_iteration / numpeers)); channel.UpdatePacketLossCounter(timed_outs.size()); @@ -231,48 +222,30 @@ void ConnectionSendThread::runTimeouts(float dtime) m_iteration_packets_avaialble -= timed_outs.size(); - for (std::list<BufferedPacket>::iterator k = timed_outs.begin(); - k != timed_outs.end(); ++k) { - session_t peer_id = readPeerId(*(k->data)); - u8 channelnum = readChannel(*(k->data)); - u16 seqnum = readU16(&(k->data[BASE_HEADER_SIZE + 1])); + for (const auto &k : timed_outs) { + u8 channelnum = readChannel(k->data); + u16 seqnum = k->getSeqnum(); - channel.UpdateBytesLost(k->data.getSize()); - k->resend_count++; - - if (k->resend_count > MAX_RELIABLE_RETRY) { - retry_count_exceeded = true; - timeouted_peers.push_back(peer->id); - /* no need to check additional packets if a single one did timeout*/ - break; - } + channel.UpdateBytesLost(k->size()); LOG(derr_con << m_connection->getDesc() << "RE-SENDING timed-out RELIABLE to " << k->address.serializeString() << "(t/o=" << resend_timeout << "): " - << "from_peer_id=" << peer_id + << "count=" << k->resend_count << ", channel=" << ((int) channelnum & 0xff) << ", seqnum=" << seqnum << std::endl); - rawSend(*k); + rawSend(k.get()); // do not handle rtt here as we can't decide if this packet was // lost or really takes more time to transmit } - if (retry_count_exceeded) { - break; /* no need to check other channels if we already did timeout */ - } - channel.UpdateTimers(dtime); } - /* skip to next peer if we did timeout */ - if (retry_count_exceeded) - continue; - /* send ping if necessary */ if (udpPeer->Ping(dtime, data)) { LOG(dout_con << m_connection->getDesc() @@ -297,25 +270,24 @@ void ConnectionSendThread::runTimeouts(float dtime) } } -void ConnectionSendThread::rawSend(const BufferedPacket &packet) +void ConnectionSendThread::rawSend(const BufferedPacket *p) { try { - m_connection->m_udpSocket.Send(packet.address, *packet.data, - packet.data.getSize()); + m_connection->m_udpSocket.Send(p->address, p->data, p->size()); LOG(dout_con << m_connection->getDesc() - << " rawSend: " << packet.data.getSize() + << " rawSend: " << p->size() << " bytes sent" << std::endl); } catch (SendFailedException &e) { LOG(derr_con << m_connection->getDesc() << "Connection::rawSend(): SendFailedException: " - << packet.address.serializeString() << std::endl); + << p->address.serializeString() << std::endl); } } -void ConnectionSendThread::sendAsPacketReliable(BufferedPacket &p, Channel *channel) +void ConnectionSendThread::sendAsPacketReliable(BufferedPacketPtr &p, Channel *channel) { try { - p.absolute_send_time = porting::getTimeMs(); + p->absolute_send_time = porting::getTimeMs(); // Buffer the packet channel->outgoing_reliables_sent.insert(p, (channel->readOutgoingSequenceNumber() - MAX_RELIABLE_WINDOW_SIZE) @@ -328,7 +300,7 @@ void ConnectionSendThread::sendAsPacketReliable(BufferedPacket &p, Channel *chan } // Send the packet - rawSend(p); + rawSend(p.get()); } bool ConnectionSendThread::rawSendAsPacket(session_t peer_id, u8 channelnum, @@ -344,11 +316,10 @@ bool ConnectionSendThread::rawSendAsPacket(session_t peer_id, u8 channelnum, Channel *channel = &(dynamic_cast<UDPPeer *>(&peer)->channels[channelnum]); if (reliable) { - bool have_sequence_number_for_raw_packet = true; - u16 seqnum = - channel->getOutgoingSequenceNumber(have_sequence_number_for_raw_packet); + bool have_seqnum = false; + const u16 seqnum = channel->getOutgoingSequenceNumber(have_seqnum); - if (!have_sequence_number_for_raw_packet) + if (!have_seqnum) return false; SharedBuffer<u8> reliable = makeReliablePacket(data, seqnum); @@ -356,13 +327,12 @@ bool ConnectionSendThread::rawSendAsPacket(session_t peer_id, u8 channelnum, peer->getAddress(MTP_MINETEST_RELIABLE_UDP, peer_address); // Add base headers and make a packet - BufferedPacket p = con::makePacket(peer_address, reliable, + BufferedPacketPtr p = con::makePacket(peer_address, reliable, m_connection->GetProtocolID(), m_connection->GetPeerID(), channelnum); // first check if our send window is already maxed out - if (channel->outgoing_reliables_sent.size() - < channel->getWindowSize()) { + if (channel->outgoing_reliables_sent.size() < channel->getWindowSize()) { LOG(dout_con << m_connection->getDesc() << " INFO: sending a reliable packet to peer_id " << peer_id << " channel: " << (u32)channelnum @@ -382,12 +352,12 @@ bool ConnectionSendThread::rawSendAsPacket(session_t peer_id, u8 channelnum, Address peer_address; if (peer->getAddress(MTP_UDP, peer_address)) { // Add base headers and make a packet - BufferedPacket p = con::makePacket(peer_address, data, + BufferedPacketPtr p = con::makePacket(peer_address, data, m_connection->GetProtocolID(), m_connection->GetPeerID(), channelnum); // Send the packet - rawSend(p); + rawSend(p.get()); return true; } @@ -397,11 +367,11 @@ bool ConnectionSendThread::rawSendAsPacket(session_t peer_id, u8 channelnum, return false; } -void ConnectionSendThread::processReliableCommand(ConnectionCommand &c) +void ConnectionSendThread::processReliableCommand(ConnectionCommandPtr &c) { - assert(c.reliable); // Pre-condition + assert(c->reliable); // Pre-condition - switch (c.type) { + switch (c->type) { case CONNCMD_NONE: LOG(dout_con << m_connection->getDesc() << "UDP processing reliable CONNCMD_NONE" << std::endl); @@ -422,7 +392,7 @@ void ConnectionSendThread::processReliableCommand(ConnectionCommand &c) case CONCMD_CREATE_PEER: LOG(dout_con << m_connection->getDesc() << "UDP processing reliable CONCMD_CREATE_PEER" << std::endl); - if (!rawSendAsPacket(c.peer_id, c.channelnum, c.data, c.reliable)) { + if (!rawSendAsPacket(c->peer_id, c->channelnum, c->data, c->reliable)) { /* put to queue if we couldn't send it immediately */ sendReliable(c); } @@ -435,13 +405,14 @@ void ConnectionSendThread::processReliableCommand(ConnectionCommand &c) FATAL_ERROR("Got command that shouldn't be reliable as reliable command"); default: LOG(dout_con << m_connection->getDesc() - << " Invalid reliable command type: " << c.type << std::endl); + << " Invalid reliable command type: " << c->type << std::endl); } } -void ConnectionSendThread::processNonReliableCommand(ConnectionCommand &c) +void ConnectionSendThread::processNonReliableCommand(ConnectionCommandPtr &c_ptr) { + const ConnectionCommand &c = *c_ptr; assert(!c.reliable); // Pre-condition switch (c.type) { @@ -503,9 +474,7 @@ void ConnectionSendThread::serve(Address bind_address) } catch (SocketException &e) { // Create event - ConnectionEvent ce; - ce.bindFailed(); - m_connection->putEvent(ce); + m_connection->putEvent(ConnectionEvent::bindFailed()); } } @@ -518,9 +487,7 @@ void ConnectionSendThread::connect(Address address) UDPPeer *peer = m_connection->createServerPeer(address); // Create event - ConnectionEvent e; - e.peerAdded(peer->id, peer->address); - m_connection->putEvent(e); + m_connection->putEvent(ConnectionEvent::peerAdded(peer->id, peer->address)); Address bind_addr; @@ -609,9 +576,9 @@ void ConnectionSendThread::send(session_t peer_id, u8 channelnum, } } -void ConnectionSendThread::sendReliable(ConnectionCommand &c) +void ConnectionSendThread::sendReliable(ConnectionCommandPtr &c) { - PeerHelper peer = m_connection->getPeerNoEx(c.peer_id); + PeerHelper peer = m_connection->getPeerNoEx(c->peer_id); if (!peer) return; @@ -627,7 +594,7 @@ void ConnectionSendThread::sendToAll(u8 channelnum, const SharedBuffer<u8> &data } } -void ConnectionSendThread::sendToAllReliable(ConnectionCommand &c) +void ConnectionSendThread::sendToAllReliable(ConnectionCommandPtr &c) { std::vector<session_t> peerids = m_connection->getPeerIDs(); @@ -686,8 +653,12 @@ void ConnectionSendThread::sendPackets(float dtime) // first send queued reliable packets for all peers (if possible) for (unsigned int i = 0; i < CHANNEL_COUNT; i++) { Channel &channel = udpPeer->channels[i]; - u16 next_to_ack = 0; + // Reduces logging verbosity + if (channel.queued_reliables.empty()) + continue; + + u16 next_to_ack = 0; channel.outgoing_reliables_sent.getFirstSeqnum(next_to_ack); u16 next_to_receive = 0; channel.incoming_reliables.getFirstSeqnum(next_to_receive); @@ -717,13 +688,15 @@ void ConnectionSendThread::sendPackets(float dtime) channel.outgoing_reliables_sent.size() < channel.getWindowSize() && peer->m_increment_packets_remaining > 0) { - BufferedPacket p = channel.queued_reliables.front(); + BufferedPacketPtr p = channel.queued_reliables.front(); channel.queued_reliables.pop(); + LOG(dout_con << m_connection->getDesc() << " INFO: sending a queued reliable packet " << " channel: " << i - << ", seqnum: " << readU16(&p.data[BASE_HEADER_SIZE + 1]) + << ", seqnum: " << p->getSeqnum() << std::endl); + sendAsPacketReliable(p, &channel); peer->m_increment_packets_remaining--; } @@ -902,17 +875,14 @@ void ConnectionReceiveThread::receive(SharedBuffer<u8> &packetdata, try { // First, see if there any buffered packets we can process now if (packet_queued) { - bool data_left = true; session_t peer_id; SharedBuffer<u8> resultdata; - while (data_left) { + while (true) { try { - data_left = getFromBuffers(peer_id, resultdata); - if (data_left) { - ConnectionEvent e; - e.dataReceived(peer_id, resultdata); - m_connection->putEvent(e); - } + if (!getFromBuffers(peer_id, resultdata)) + break; + + m_connection->putEvent(ConnectionEvent::dataReceived(peer_id, resultdata)); } catch (ProcessedSilentlyException &e) { /* try reading again */ @@ -929,7 +899,7 @@ void ConnectionReceiveThread::receive(SharedBuffer<u8> &packetdata, return; if ((received_size < BASE_HEADER_SIZE) || - (readU32(&packetdata[0]) != m_connection->GetProtocolID())) { + (readU32(&packetdata[0]) != m_connection->GetProtocolID())) { LOG(derr_con << m_connection->getDesc() << "Receive(): Invalid incoming packet, " << "size: " << received_size @@ -956,8 +926,11 @@ void ConnectionReceiveThread::receive(SharedBuffer<u8> &packetdata, // command was sent reliably. } - /* The peer was not found in our lists. Add it. */ if (peer_id == PEER_ID_INEXISTENT) { + /* Ignore it if we are a client */ + if (m_connection->ConnectedToServer()) + return; + /* The peer was not found in our lists. Add it. */ peer_id = m_connection->createPeer(sender, MTP_MINETEST_RELIABLE_UDP, 0); } @@ -1017,9 +990,7 @@ void ConnectionReceiveThread::receive(SharedBuffer<u8> &packetdata, << ", channel: " << (u32)channelnum << ", returned " << resultdata.getSize() << " bytes" << std::endl); - ConnectionEvent e; - e.dataReceived(peer_id, resultdata); - m_connection->putEvent(e); + m_connection->putEvent(ConnectionEvent::dataReceived(peer_id, resultdata)); } catch (ProcessedSilentlyException &e) { } @@ -1044,10 +1015,11 @@ bool ConnectionReceiveThread::getFromBuffers(session_t &peer_id, SharedBuffer<u8 if (!peer) continue; - if (dynamic_cast<UDPPeer *>(&peer) == 0) + UDPPeer *p = dynamic_cast<UDPPeer *>(&peer); + if (!p) continue; - for (Channel &channel : (dynamic_cast<UDPPeer *>(&peer))->channels) { + for (Channel &channel : p->channels) { if (checkIncomingBuffers(&channel, peer_id, dst)) { return true; } @@ -1060,32 +1032,34 @@ bool ConnectionReceiveThread::checkIncomingBuffers(Channel *channel, session_t &peer_id, SharedBuffer<u8> &dst) { u16 firstseqnum = 0; - if (channel->incoming_reliables.getFirstSeqnum(firstseqnum)) { - if (firstseqnum == channel->readNextIncomingSeqNum()) { - BufferedPacket p = channel->incoming_reliables.popFirst(); - peer_id = readPeerId(*p.data); - u8 channelnum = readChannel(*p.data); - u16 seqnum = readU16(&p.data[BASE_HEADER_SIZE + 1]); + if (!channel->incoming_reliables.getFirstSeqnum(firstseqnum)) + return false; - LOG(dout_con << m_connection->getDesc() - << "UNBUFFERING TYPE_RELIABLE" - << " seqnum=" << seqnum - << " peer_id=" << peer_id - << " channel=" << ((int) channelnum & 0xff) - << std::endl); + if (firstseqnum != channel->readNextIncomingSeqNum()) + return false; - channel->incNextIncomingSeqNum(); + BufferedPacketPtr p = channel->incoming_reliables.popFirst(); - u32 headers_size = BASE_HEADER_SIZE + RELIABLE_HEADER_SIZE; - // Get out the inside packet and re-process it - SharedBuffer<u8> payload(p.data.getSize() - headers_size); - memcpy(*payload, &p.data[headers_size], payload.getSize()); + peer_id = readPeerId(p->data); // Carried over to caller function + u8 channelnum = readChannel(p->data); + u16 seqnum = p->getSeqnum(); - dst = processPacket(channel, payload, peer_id, channelnum, true); - return true; - } - } - return false; + LOG(dout_con << m_connection->getDesc() + << "UNBUFFERING TYPE_RELIABLE" + << " seqnum=" << seqnum + << " peer_id=" << peer_id + << " channel=" << ((int) channelnum & 0xff) + << std::endl); + + channel->incNextIncomingSeqNum(); + + u32 headers_size = BASE_HEADER_SIZE + RELIABLE_HEADER_SIZE; + // Get out the inside packet and re-process it + SharedBuffer<u8> payload(p->size() - headers_size); + memcpy(*payload, &p->data[headers_size], payload.getSize()); + + dst = processPacket(channel, payload, peer_id, channelnum, true); + return true; } SharedBuffer<u8> ConnectionReceiveThread::processPacket(Channel *channel, @@ -1133,7 +1107,7 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Control(Channel *chan if (packetdata.getSize() < 2) throw InvalidIncomingDataException("packetdata.getSize() < 2"); - u8 controltype = readU8(&(packetdata[1])); + ControlType controltype = (ControlType)readU8(&(packetdata[1])); if (controltype == CONTROLTYPE_ACK) { assert(channel != NULL); @@ -1149,31 +1123,32 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Control(Channel *chan << seqnum << " ]" << std::endl); try { - BufferedPacket p = channel->outgoing_reliables_sent.popSeqnum(seqnum); + BufferedPacketPtr p = channel->outgoing_reliables_sent.popSeqnum(seqnum); - // only calculate rtt from straight sent packets - if (p.resend_count == 0) { + // the rtt calculation will be a bit off for re-sent packets but that's okay + { // Get round trip time u64 current_time = porting::getTimeMs(); // a overflow is quite unlikely but as it'd result in major // rtt miscalculation we handle it here - if (current_time > p.absolute_send_time) { - float rtt = (current_time - p.absolute_send_time) / 1000.0; + if (current_time > p->absolute_send_time) { + float rtt = (current_time - p->absolute_send_time) / 1000.0; // Let peer calculate stuff according to it // (avg_rtt and resend_timeout) dynamic_cast<UDPPeer *>(peer)->reportRTT(rtt); - } else if (p.totaltime > 0) { - float rtt = p.totaltime; + } else if (p->totaltime > 0) { + float rtt = p->totaltime; // Let peer calculate stuff according to it // (avg_rtt and resend_timeout) dynamic_cast<UDPPeer *>(peer)->reportRTT(rtt); } } + // put bytes for max bandwidth calculation - channel->UpdateBytesSent(p.data.getSize(), 1); + channel->UpdateBytesSent(p->size(), 1); if (channel->outgoing_reliables_sent.size() == 0) m_connection->TriggerSend(); } catch (NotFoundException &e) { @@ -1221,7 +1196,7 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Control(Channel *chan throw ProcessedSilentlyException("Got a DISCO"); } else { LOG(derr_con << m_connection->getDesc() - << "INVALID TYPE_CONTROL: invalid controltype=" + << "INVALID controltype=" << ((int) controltype & 0xff) << std::endl); throw InvalidIncomingDataException("Invalid control type"); } @@ -1249,7 +1224,7 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Split(Channel *channe if (peer->getAddress(MTP_UDP, peer_address)) { // We have to create a packet again for buffering // This isn't actually too bad an idea. - BufferedPacket packet = makePacket(peer_address, + BufferedPacketPtr packet = con::makePacket(peer_address, packetdata, m_connection->GetProtocolID(), peer->id, @@ -1284,7 +1259,7 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Reliable(Channel *cha if (packetdata.getSize() < RELIABLE_HEADER_SIZE) throw InvalidIncomingDataException("packetdata.getSize() < RELIABLE_HEADER_SIZE"); - u16 seqnum = readU16(&packetdata[1]); + const u16 seqnum = readU16(&packetdata[1]); bool is_future_packet = false; bool is_old_packet = false; @@ -1328,7 +1303,7 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Reliable(Channel *cha // This one comes later, buffer it. // Actually we have to make a packet to buffer one. // Well, we have all the ingredients, so just do it. - BufferedPacket packet = con::makePacket( + BufferedPacketPtr packet = con::makePacket( peer_address, packetdata, m_connection->GetProtocolID(), @@ -1345,9 +1320,7 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Reliable(Channel *cha throw ProcessedQueued("Buffered future reliable packet"); } catch (AlreadyExistsException &e) { } catch (IncomingDataCorruption &e) { - ConnectionCommand discon; - discon.disconnect_peer(peer->id); - m_connection->putCommand(discon); + m_connection->putCommand(ConnectionCommand::disconnect_peer(peer->id)); LOG(derr_con << m_connection->getDesc() << "INVALID, TYPE_RELIABLE peer_id: " << peer->id @@ -1368,7 +1341,7 @@ SharedBuffer<u8> ConnectionReceiveThread::handlePacketType_Reliable(Channel *cha u16 queued_seqnum = 0; if (channel->incoming_reliables.getFirstSeqnum(queued_seqnum)) { if (queued_seqnum == seqnum) { - BufferedPacket queued_packet = channel->incoming_reliables.popFirst(); + BufferedPacketPtr queued_packet = channel->incoming_reliables.popFirst(); /** TODO find a way to verify the new against the old packet */ } } diff --git a/src/network/connectionthreads.h b/src/network/connectionthreads.h index 612407c3b..c2e2dae12 100644 --- a/src/network/connectionthreads.h +++ b/src/network/connectionthreads.h @@ -29,6 +29,25 @@ namespace con class Connection; +struct OutgoingPacket +{ + session_t peer_id; + u8 channelnum; + SharedBuffer<u8> data; + bool reliable; + bool ack; + + OutgoingPacket(session_t peer_id_, u8 channelnum_, const SharedBuffer<u8> &data_, + bool reliable_,bool ack_=false): + peer_id(peer_id_), + channelnum(channelnum_), + data(data_), + reliable(reliable_), + ack(ack_) + { + } +}; + class ConnectionSendThread : public Thread { @@ -51,27 +70,27 @@ public: private: void runTimeouts(float dtime); - void rawSend(const BufferedPacket &packet); + void rawSend(const BufferedPacket *p); bool rawSendAsPacket(session_t peer_id, u8 channelnum, const SharedBuffer<u8> &data, bool reliable); - void processReliableCommand(ConnectionCommand &c); - void processNonReliableCommand(ConnectionCommand &c); + void processReliableCommand(ConnectionCommandPtr &c); + void processNonReliableCommand(ConnectionCommandPtr &c); void serve(Address bind_address); void connect(Address address); void disconnect(); void disconnect_peer(session_t peer_id); void send(session_t peer_id, u8 channelnum, const SharedBuffer<u8> &data); - void sendReliable(ConnectionCommand &c); + void sendReliable(ConnectionCommandPtr &c); void sendToAll(u8 channelnum, const SharedBuffer<u8> &data); - void sendToAllReliable(ConnectionCommand &c); + void sendToAllReliable(ConnectionCommandPtr &c); void sendPackets(float dtime); void sendAsPacket(session_t peer_id, u8 channelnum, const SharedBuffer<u8> &data, bool ack = false); - void sendAsPacketReliable(BufferedPacket &p, Channel *channel); + void sendAsPacketReliable(BufferedPacketPtr &p, Channel *channel); bool packetsQueued(); diff --git a/src/network/networkexceptions.h b/src/network/networkexceptions.h index f4913928c..58a3bb490 100644 --- a/src/network/networkexceptions.h +++ b/src/network/networkexceptions.h @@ -56,12 +56,6 @@ public: InvalidIncomingDataException(const char *s) : BaseException(s) {} }; -class InvalidOutgoingDataException : public BaseException -{ -public: - InvalidOutgoingDataException(const char *s) : BaseException(s) {} -}; - class NoIncomingDataException : public BaseException { public: @@ -103,4 +97,4 @@ class SendFailedException : public BaseException { public: SendFailedException(const std::string &s) : BaseException(s) {} -}; \ No newline at end of file +}; diff --git a/src/network/networkpacket.cpp b/src/network/networkpacket.cpp index 4d531b611..6b8b0f703 100644 --- a/src/network/networkpacket.cpp +++ b/src/network/networkpacket.cpp @@ -50,7 +50,7 @@ void NetworkPacket::checkReadOffset(u32 from_offset, u32 field_size) } } -void NetworkPacket::putRawPacket(u8 *data, u32 datasize, session_t peer_id) +void NetworkPacket::putRawPacket(const u8 *data, u32 datasize, session_t peer_id) { // If a m_command is already set, we are rewriting on same packet // This is not permitted @@ -145,6 +145,8 @@ void NetworkPacket::putLongString(const std::string &src) putRawString(src.c_str(), msgsize); } +static constexpr bool NEED_SURROGATE_CODING = sizeof(wchar_t) > 2; + NetworkPacket& NetworkPacket::operator>>(std::wstring& dst) { checkReadOffset(m_read_offset, 2); @@ -160,9 +162,16 @@ NetworkPacket& NetworkPacket::operator>>(std::wstring& dst) checkReadOffset(m_read_offset, strLen * 2); dst.reserve(strLen); - for(u16 i=0; i<strLen; i++) { - wchar_t c16 = readU16(&m_data[m_read_offset]); - dst.append(&c16, 1); + for (u16 i = 0; i < strLen; i++) { + wchar_t c = readU16(&m_data[m_read_offset]); + if (NEED_SURROGATE_CODING && c >= 0xD800 && c < 0xDC00 && i+1 < strLen) { + i++; + m_read_offset += sizeof(u16); + + wchar_t c2 = readU16(&m_data[m_read_offset]); + c = 0x10000 + ( ((c & 0x3ff) << 10) | (c2 & 0x3ff) ); + } + dst.push_back(c); m_read_offset += sizeof(u16); } @@ -175,15 +184,37 @@ NetworkPacket& NetworkPacket::operator<<(const std::wstring &src) throw PacketError("String too long"); } - u16 msgsize = src.size(); + if (!NEED_SURROGATE_CODING || src.size() == 0) { + *this << static_cast<u16>(src.size()); + for (u16 i = 0; i < src.size(); i++) + *this << static_cast<u16>(src[i]); - *this << msgsize; - - // Write string - for (u16 i=0; i<msgsize; i++) { - *this << (u16) src[i]; + return *this; } + // write dummy value, to be overwritten later + const u32 len_offset = m_read_offset; + u32 written = 0; + *this << static_cast<u16>(0xfff0); + + for (u16 i = 0; i < src.size(); i++) { + wchar_t c = src[i]; + if (c > 0xffff) { + // Encode high code-points as surrogate pairs + u32 n = c - 0x10000; + *this << static_cast<u16>(0xD800 | (n >> 10)) + << static_cast<u16>(0xDC00 | (n & 0x3ff)); + written += 2; + } else { + *this << static_cast<u16>(c); + written++; + } + } + + if (written > WIDE_STRING_MAX_LEN) + throw PacketError("String too long"); + writeU16(&m_data[len_offset], written); + return *this; } @@ -223,13 +254,6 @@ NetworkPacket& NetworkPacket::operator>>(char& dst) return *this; } -char NetworkPacket::getChar(u32 offset) -{ - checkReadOffset(offset, 1); - - return readU8(&m_data[offset]); -} - NetworkPacket& NetworkPacket::operator<<(char src) { checkDataSize(1); @@ -525,14 +549,11 @@ NetworkPacket& NetworkPacket::operator<<(video::SColor src) return *this; } -SharedBuffer<u8> NetworkPacket::oldForgePacket() +Buffer<u8> NetworkPacket::oldForgePacket() { - SharedBuffer<u8> sb(m_datasize + 2); + Buffer<u8> sb(m_datasize + 2); writeU16(&sb[0], m_command); + memcpy(&sb[2], m_data.data(), m_datasize); - u8* datas = getU8Ptr(0); - - if (datas != NULL) - memcpy(&sb[2], datas, m_datasize); return sb; } diff --git a/src/network/networkpacket.h b/src/network/networkpacket.h index fc8617651..b9c39f332 100644 --- a/src/network/networkpacket.h +++ b/src/network/networkpacket.h @@ -34,14 +34,14 @@ public: ~NetworkPacket(); - void putRawPacket(u8 *data, u32 datasize, session_t peer_id); + void putRawPacket(const u8 *data, u32 datasize, session_t peer_id); void clear(); // Getters u32 getSize() const { return m_datasize; } session_t getPeerId() const { return m_peer_id; } u16 getCommand() { return m_command; } - const u32 getRemainingBytes() const { return m_datasize - m_read_offset; } + u32 getRemainingBytes() const { return m_datasize - m_read_offset; } const char *getRemainingString() { return getString(m_read_offset); } // Returns a c-string without copying. @@ -64,7 +64,6 @@ public: std::string readLongString(); - char getChar(u32 offset); NetworkPacket &operator>>(char &dst); NetworkPacket &operator<<(char src); @@ -116,7 +115,8 @@ public: NetworkPacket &operator<<(video::SColor src); // Temp, we remove SharedBuffer when migration finished - SharedBuffer<u8> oldForgePacket(); + // ^ this comment has been here for 4 years + Buffer<u8> oldForgePacket(); private: void checkReadOffset(u32 from_offset, u32 field_size); diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 05600cda9..3ab839f8d 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -204,9 +204,14 @@ with this program; if not, write to the Free Software Foundation, Inc., PROTOCOL VERSION 39: Updated set_sky packet Adds new sun, moon and stars packets + Minimap modes + PROTOCOL VERSION 40: + TOCLIENT_MEDIA_PUSH changed, TOSERVER_HAVE_MEDIA added + Added new particlespawner parameters + [scheduled bump for 5.6.0] */ -#define LATEST_PROTOCOL_VERSION 39 +#define LATEST_PROTOCOL_VERSION 41 #define LATEST_PROTOCOL_VERSION_STRING TOSTRING(LATEST_PROTOCOL_VERSION) // Server's supported network protocol range @@ -225,23 +230,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #define PASSWORD_SIZE 28 // Maximum password length. Allows for // base64-encoded SHA-1 (27+\0). -/* - Changes by FORMSPEC_API_VERSION: - - FORMSPEC VERSION 1: - (too much) - FORMSPEC VERSION 2: - Forced real coordinates - background9[]: 9-slice scaling parameters - FORMSPEC VERSION 3: - Formspec elements are drawn in the order of definition - bgcolor[]: use 3 parameters (bgcolor, formspec (now an enum), fbgcolor) - box[] and image[] elements enable clipping by default - new element: scroll_container[] - FORMSPEC VERSION 4: - Allow dropdown indexing events -*/ -#define FORMSPEC_API_VERSION 4 +// See also formspec [Version History] in doc/lua_api.txt +#define FORMSPEC_API_VERSION 6 #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-" @@ -329,9 +319,8 @@ enum ToClientCommand /* std::string raw_hash std::string filename + u32 callback_token bool should_be_cached - u32 len - char filedata[len] */ // (oops, there is some gap here) @@ -524,11 +513,12 @@ enum ToClientCommand TOCLIENT_SPAWN_PARTICLE = 0x46, /* - v3f1000 pos - v3f1000 velocity - v3f1000 acceleration - f1000 expirationtime - f1000 size + -- struct range<T> { T min, T max, f32 bias }; + v3f pos + v3f velocity + v3f acceleration + f32 expirationtime + f32 size u8 bool collisiondetection u32 len u8[len] texture @@ -537,22 +527,26 @@ enum ToClientCommand TileAnimation animation u8 glow u8 object_collision + v3f drag + range<v3f> bounce */ TOCLIENT_ADD_PARTICLESPAWNER = 0x47, /* + -- struct range<T> { T min, T max, f32 bias }; + -- struct tween<T> { T start, T end }; u16 amount - f1000 spawntime - v3f1000 minpos - v3f1000 maxpos - v3f1000 minvel - v3f1000 maxvel - v3f1000 minacc - v3f1000 maxacc - f1000 minexptime - f1000 maxexptime - f1000 minsize - f1000 maxsize + f32 spawntime + v3f minpos + v3f maxpos + v3f minvel + v3f maxvel + v3f minacc + v3f maxacc + f32 minexptime + f32 maxexptime + f32 minsize + f32 maxsize u8 bool collisiondetection u32 len u8[len] texture @@ -562,6 +556,63 @@ enum ToClientCommand TileAnimation animation u8 glow u8 object_collision + + f32 pos_start_bias + f32 vel_start_bias + f32 acc_start_bias + f32 exptime_start_bias + f32 size_start_bias + + range<v3f> pos_end + -- i.e v3f pos_end_min + -- v3f pos_end_max + -- f32 pos_end_bias + range<v3f> vel_end + range<v3f> acc_end + + tween<range<v3f>> drag + -- i.e. v3f drag_start_min + -- v3f drag_start_max + -- f32 drag_start_bias + -- v3f drag_end_min + -- v3f drag_end_max + -- f32 drag_end_bias + tween<range<v3f>> jitter + tween<range<f32>> bounce + + u8 attraction_kind + none = 0 + point = 1 + line = 2 + plane = 3 + + if attraction_kind > none { + tween<range<f32>> attract_strength + tween<v3f> attractor_origin + u16 attractor_origin_attachment_object_id + u8 spawner_flags + bit 1: attractor_kill (particles dies on contact) + if attraction_mode > point { + tween<v3f> attractor_angle + u16 attractor_origin_attachment_object_id + } + } + + tween<range<v3f>> radius + tween<range<v3f>> drag + + u16 texpool_sz + texpool_sz.times { + u8 flags + -- bit 0: animated + -- other bits free & ignored as of proto v40 + tween<f32> alpha + tween<v2f> scale + if flags.animated { + TileAnimation animation + } + } + */ TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48, // Obsolete @@ -748,6 +799,7 @@ enum ToClientCommand u32 count u8[4] starcolor (ARGB) f32 scale + f32 day_opacity */ TOCLIENT_SRP_BYTES_S_B = 0x60, @@ -764,7 +816,23 @@ enum ToClientCommand u8[len] formspec */ - TOCLIENT_NUM_MSG_TYPES = 0x62, + TOCLIENT_MINIMAP_MODES = 0x62, + /* + u16 count // modes + u16 mode // wanted current mode index after change + for each mode + u16 type + std::string label + u16 size + std::string extra + */ + + TOCLIENT_SET_LIGHTING = 0x63, + /* + f32 shadow_intensity + */ + + TOCLIENT_NUM_MSG_TYPES = 0x64, }; enum ToServerCommand @@ -939,7 +1007,13 @@ enum ToServerCommand } */ - TOSERVER_RECEIVED_MEDIA = 0x41, // Obsolete + TOSERVER_HAVE_MEDIA = 0x41, + /* + u8 number of callback tokens + for each: + u32 token + */ + TOSERVER_BREATH = 0x42, // Obsolete TOSERVER_CLIENT_READY = 0x43, @@ -997,7 +1071,7 @@ enum AuthMechanism AUTH_MECHANISM_FIRST_SRP = 1 << 2, }; -enum AccessDeniedCode { +enum AccessDeniedCode : u8 { SERVER_ACCESSDENIED_WRONG_PASSWORD, SERVER_ACCESSDENIED_UNEXPECTED_DATA, SERVER_ACCESSDENIED_SINGLEPLAYER, @@ -1020,18 +1094,18 @@ enum NetProtoCompressionMode { const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = { "Invalid password", - "Your client sent something the server didn't expect. Try reconnecting or updating your client", + "Your client sent something the server didn't expect. Try reconnecting or updating your client.", "The server is running in simple singleplayer mode. You cannot connect.", - "Your client's version is not supported.\nPlease contact server administrator.", - "Player name contains disallowed characters.", - "Player name not allowed.", - "Too many users.", + "Your client's version is not supported.\nPlease contact the server administrator.", + "Player name contains disallowed characters", + "Player name not allowed", + "Too many users", "Empty passwords are disallowed. Set a password and try again.", "Another client is connected with this name. If your client closed unexpectedly, try again in a minute.", - "Server authentication failed. This is likely a server error.", + "Internal server error", "", - "Server shutting down.", - "This server has experienced an internal error. You will now be disconnected." + "Server shutting down", + "The server has experienced an internal error. You will now be disconnected." }; enum PlayerListModifer : u8 diff --git a/src/network/serveropcodes.cpp b/src/network/serveropcodes.cpp index 2fc3197c2..12665e7f1 100644 --- a/src/network/serveropcodes.cpp +++ b/src/network/serveropcodes.cpp @@ -89,7 +89,7 @@ const ToServerCommandHandler toServerCommandTable[TOSERVER_NUM_MSG_TYPES] = null_command_handler, // 0x3e null_command_handler, // 0x3f { "TOSERVER_REQUEST_MEDIA", TOSERVER_STATE_STARTUP, &Server::handleCommand_RequestMedia }, // 0x40 - null_command_handler, // 0x41 + { "TOSERVER_HAVE_MEDIA", TOSERVER_STATE_INGAME, &Server::handleCommand_HaveMedia }, // 0x41 null_command_handler, // 0x42 { "TOSERVER_CLIENT_READY", TOSERVER_STATE_STARTUP, &Server::handleCommand_ClientReady }, // 0x43 null_command_handler, // 0x44 @@ -167,7 +167,7 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] = { "TOCLIENT_TIME_OF_DAY", 0, true }, // 0x29 { "TOCLIENT_CSM_RESTRICTION_FLAGS", 0, true }, // 0x2A { "TOCLIENT_PLAYER_SPEED", 0, true }, // 0x2B - { "TOCLIENT_MEDIA_PUSH", 0, true }, // 0x2C (sent over channel 1 too) + { "TOCLIENT_MEDIA_PUSH", 0, true }, // 0x2C (sent over channel 1 too if legacy) null_command_factory, // 0x2D null_command_factory, // 0x2E { "TOCLIENT_CHAT_MESSAGE", 0, true }, // 0x2F @@ -176,7 +176,7 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] = { "TOCLIENT_ACTIVE_OBJECT_MESSAGES", 0, true }, // 0x32 (may be sent as unrel over channel 1 too) { "TOCLIENT_HP", 0, true }, // 0x33 { "TOCLIENT_MOVE_PLAYER", 0, true }, // 0x34 - { "TOCLIENT_ACCESS_DENIED_LEGACY", 0, true }, // 0x35 + null_command_factory, // 0x35 { "TOCLIENT_FOV", 0, true }, // 0x36 { "TOCLIENT_DEATHSCREEN", 0, true }, // 0x37 { "TOCLIENT_MEDIA", 2, true }, // 0x38 @@ -221,4 +221,5 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] = null_command_factory, // 0x5f { "TOSERVER_SRP_BYTES_S_B", 0, true }, // 0x60 { "TOCLIENT_FORMSPEC_PREPEND", 0, true }, // 0x61 + { "TOCLIENT_MINIMAP_MODES", 0, true }, // 0x62 }; diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index 0bd09e637..a5ee81a9c 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -56,12 +56,12 @@ void Server::handleCommand_Init(NetworkPacket* pkt) session_t peer_id = pkt->getPeerId(); RemoteClient *client = getClient(peer_id, CS_Created); + Address addr; std::string addr_s; try { - Address address = getPeerAddress(peer_id); - addr_s = address.serializeString(); - } - catch (con::PeerNotFoundException &e) { + addr = m_con->GetPeerAddress(peer_id); + addr_s = addr.serializeString(); + } catch (con::PeerNotFoundException &e) { /* * no peer for this packet found * most common reason is peer timeout, e.g. peer didn't @@ -73,19 +73,20 @@ void Server::handleCommand_Init(NetworkPacket* pkt) return; } - // If net_proto_version is set, this client has already been handled if (client->getState() > CS_Created) { verbosestream << "Server: Ignoring multiple TOSERVER_INITs from " << addr_s << " (peer_id=" << peer_id << ")" << std::endl; return; } + client->setCachedAddress(addr); + verbosestream << "Server: Got TOSERVER_INIT from " << addr_s << " (peer_id=" << peer_id << ")" << std::endl; // Do not allow multiple players in simple singleplayer mode. // This isn't a perfect way to do it, but will suffice for now - if (m_simple_singleplayer_mode && m_clients.getClientIDs().size() > 1) { + if (m_simple_singleplayer_mode && !m_clients.getClientIDs().empty()) { infostream << "Server: Not allowing another client (" << addr_s << ") to connect in simple singleplayer mode" << std::endl; DenyAccess(peer_id, SERVER_ACCESSDENIED_SINGLEPLAYER); @@ -107,8 +108,10 @@ void Server::handleCommand_Init(NetworkPacket* pkt) // Use the highest version supported by both u8 depl_serial_v = std::min(client_max, our_max); // If it's lower than the lowest supported, give up. +#if SER_FMT_VER_LOWEST_READ > 0 if (depl_serial_v < SER_FMT_VER_LOWEST_READ) depl_serial_v = SER_FMT_VER_INVALID; +#endif if (depl_serial_v == SER_FMT_VER_INVALID) { actionstream << "Server: A mismatched client tried to connect from " << @@ -173,6 +176,16 @@ void Server::handleCommand_Init(NetworkPacket* pkt) return; } + RemotePlayer *player = m_env->getPlayer(playername); + + // If player is already connected, cancel + if (player && player->getPeerId() != PEER_ID_INEXISTENT) { + actionstream << "Server: Player with name \"" << playername << + "\" tried to connect, but player with same name is already connected" << std::endl; + DenyAccess(peer_id, SERVER_ACCESSDENIED_ALREADY_CONNECTED); + return; + } + m_clients.setPlayerName(peer_id, playername); //TODO (later) case insensitivity @@ -216,7 +229,7 @@ void Server::handleCommand_Init(NetworkPacket* pkt) Compose auth methods for answer */ std::string encpwd; // encrypted Password field for the user - bool has_auth = m_script->getAuth(playername, &encpwd, NULL); + bool has_auth = m_script->getAuth(playername, &encpwd, nullptr); u32 auth_mechs = 0; client->chosen_mech = AUTH_MECHANISM_NONE; @@ -316,7 +329,7 @@ void Server::handleCommand_Init2(NetworkPacket* pkt) // Send active objects { PlayerSAO *sao = getPlayerSAO(peer_id); - if (client && sao) + if (sao) SendActiveObjectRemoveAdd(client, sao); } @@ -351,16 +364,15 @@ void Server::handleCommand_RequestMedia(NetworkPacket* pkt) session_t peer_id = pkt->getPeerId(); infostream << "Sending " << numfiles << " files to " << getPlayerName(peer_id) << std::endl; - verbosestream << "TOSERVER_REQUEST_MEDIA: " << std::endl; + verbosestream << "TOSERVER_REQUEST_MEDIA: requested file(s)" << std::endl; for (u16 i = 0; i < numfiles; i++) { std::string name; *pkt >> name; - tosend.push_back(name); - verbosestream << "TOSERVER_REQUEST_MEDIA: requested file " - << name << std::endl; + tosend.emplace_back(name); + verbosestream << " " << name << std::endl; } sendRequestedMedia(peer_id, tosend); @@ -370,55 +382,47 @@ void Server::handleCommand_ClientReady(NetworkPacket* pkt) { session_t peer_id = pkt->getPeerId(); - PlayerSAO* playersao = StageTwoClientInit(peer_id); + // decode all information first + u8 major_ver, minor_ver, patch_ver, reserved; + u16 formspec_ver = 1; // v1 for clients older than 5.1.0-dev + std::string full_ver; - if (playersao == NULL) { - errorstream << "TOSERVER_CLIENT_READY stage 2 client init failed " + *pkt >> major_ver >> minor_ver >> patch_ver >> reserved >> full_ver; + if (pkt->getRemainingBytes() >= 2) + *pkt >> formspec_ver; + + m_clients.setClientVersion(peer_id, major_ver, minor_ver, patch_ver, + full_ver); + + // Emerge player + PlayerSAO* playersao = StageTwoClientInit(peer_id); + if (!playersao) { + errorstream << "Server: stage 2 client init failed " "peer_id=" << peer_id << std::endl; DisconnectPeer(peer_id); return; } - - if (pkt->getSize() < 8) { - errorstream << "TOSERVER_CLIENT_READY client sent inconsistent data, " - "disconnecting peer_id: " << peer_id << std::endl; - DisconnectPeer(peer_id); - return; - } - - u8 major_ver, minor_ver, patch_ver, reserved; - std::string full_ver; - *pkt >> major_ver >> minor_ver >> patch_ver >> reserved >> full_ver; - - m_clients.setClientVersion(peer_id, major_ver, minor_ver, patch_ver, - full_ver); - - if (pkt->getRemainingBytes() >= 2) - *pkt >> playersao->getPlayer()->formspec_version; - - const std::vector<std::string> &players = m_clients.getPlayerNames(); - NetworkPacket list_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, peer_id); - list_pkt << (u8) PLAYER_LIST_INIT << (u16) players.size(); - for (const std::string &player: players) { - list_pkt << player; - } - m_clients.send(peer_id, 0, &list_pkt, true); - - NetworkPacket notice_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, PEER_ID_INEXISTENT); - // (u16) 1 + std::string represents a pseudo vector serialization representation - notice_pkt << (u8) PLAYER_LIST_ADD << (u16) 1 << std::string(playersao->getPlayer()->getName()); - m_clients.sendToAll(¬ice_pkt); + playersao->getPlayer()->formspec_version = formspec_ver; m_clients.event(peer_id, CSE_SetClientReady); + // Send player list to this client + { + const std::vector<std::string> &players = m_clients.getPlayerNames(); + NetworkPacket list_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, peer_id); + list_pkt << (u8) PLAYER_LIST_INIT << (u16) players.size(); + for (const auto &player : players) + list_pkt << player; + Send(peer_id, &list_pkt); + } + s64 last_login; m_script->getAuth(playersao->getPlayer()->getName(), nullptr, nullptr, &last_login); m_script->on_joinplayer(playersao, last_login); // Send shutdown timer if shutdown has been scheduled - if (m_shutdown_state.isTimerRunning()) { + if (m_shutdown_state.isTimerRunning()) SendChatMessage(peer_id, m_shutdown_state.getShutdownTimerMessage()); - } } void Server::handleCommand_GotBlocks(NetworkPacket* pkt) @@ -437,13 +441,14 @@ void Server::handleCommand_GotBlocks(NetworkPacket* pkt) u8 count; *pkt >> count; - RemoteClient *client = getClient(pkt->getPeerId()); - if ((s16)pkt->getSize() < 1 + (int)count * 6) { throw con::InvalidIncomingDataException ("GOTBLOCKS length is too short"); } + ClientInterface::AutoLock lock(m_clients); + RemoteClient *client = m_clients.lockedGetClientNoEx(pkt->getPeerId()); + for (u16 i = 0; i < count; i++) { v3s16 p; *pkt >> p; @@ -470,7 +475,6 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao, f32 yaw = (f32)f32yaw / 100.0f; u32 keyPressed = 0; - // default behavior (in case an old client doesn't send these) f32 fov = 0; u8 wanted_range = 0; @@ -485,24 +489,18 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao, pitch = modulo360f(pitch); yaw = wrapDegrees_0_360(yaw); - playersao->setBasePosition(position); - player->setSpeed(speed); + if (!playersao->isAttached()) { + // Only update player positions when moving freely + // to not interfere with attachment handling + playersao->setBasePosition(position); + player->setSpeed(speed); + } playersao->setLookPitch(pitch); playersao->setPlayerYaw(yaw); playersao->setFov(fov); playersao->setWantedRange(wanted_range); - player->keyPressed = keyPressed; - player->control.up = (keyPressed & (0x1 << 0)); - player->control.down = (keyPressed & (0x1 << 1)); - player->control.left = (keyPressed & (0x1 << 2)); - player->control.right = (keyPressed & (0x1 << 3)); - player->control.jump = (keyPressed & (0x1 << 4)); - player->control.aux1 = (keyPressed & (0x1 << 5)); - player->control.sneak = (keyPressed & (0x1 << 6)); - player->control.dig = (keyPressed & (0x1 << 7)); - player->control.place = (keyPressed & (0x1 << 8)); - player->control.zoom = (keyPressed & (0x1 << 9)); + player->control.unpackKeysPressed(keyPressed); if (playersao->checkMovementCheat()) { // Call callbacks @@ -619,21 +617,36 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) const bool player_has_interact = checkPriv(player->getName(), "interact"); - auto check_inv_access = [player, player_has_interact] ( + auto check_inv_access = [player, player_has_interact, this] ( const InventoryLocation &loc) -> bool { - if (loc.type == InventoryLocation::CURRENT_PLAYER) - return false; // Only used internally on the client, never sent - if (loc.type == InventoryLocation::PLAYER) { - // Allow access to own inventory in all cases - return loc.name == player->getName(); - } - if (!player_has_interact) { + // Players without interact may modify their own inventory + if (!player_has_interact && loc.type != InventoryLocation::PLAYER) { infostream << "Cannot modify foreign inventory: " << "No interact privilege" << std::endl; return false; } - return true; + + switch (loc.type) { + case InventoryLocation::CURRENT_PLAYER: + // Only used internally on the client, never sent + return false; + case InventoryLocation::PLAYER: + // Allow access to own inventory in all cases + return loc.name == player->getName(); + case InventoryLocation::NODEMETA: + { + // Check for out-of-range interaction + v3f node_pos = intToFloat(loc.p, BS); + v3f player_pos = player->getPlayerSAO()->getEyePosition(); + f32 d = player_pos.getDistanceFrom(node_pos); + return checkInteractDistance(player, d, "inventory"); + } + case InventoryLocation::DETACHED: + return getInventoryMgr()->checkDetachedInventoryAccess(loc, player->getName()); + default: + return false; + } }; /* @@ -653,18 +666,6 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) !check_inv_access(ma->to_inv)) return; - InventoryLocation *remote = ma->from_inv.type == InventoryLocation::PLAYER ? - &ma->to_inv : &ma->from_inv; - - // Check for out-of-range interaction - if (remote->type == InventoryLocation::NODEMETA) { - v3f node_pos = intToFloat(remote->p, BS); - v3f player_pos = player->getPlayerSAO()->getEyePosition(); - f32 d = player_pos.getDistanceFrom(node_pos); - if (!checkInteractDistance(player, d, "inventory")) - return; - } - /* Disable moving items out of craftpreview */ @@ -749,21 +750,8 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) void Server::handleCommand_ChatMessage(NetworkPacket* pkt) { - /* - u16 command - u16 length - wstring message - */ - u16 len; - *pkt >> len; - std::wstring message; - for (u16 i = 0; i < len; i++) { - u16 tmp_wchar; - *pkt >> tmp_wchar; - - message += (wchar_t)tmp_wchar; - } + *pkt >> message; session_t peer_id = pkt->getPeerId(); RemotePlayer *player = m_env->getPlayer(peer_id); @@ -775,15 +763,13 @@ void Server::handleCommand_ChatMessage(NetworkPacket* pkt) return; } - // Get player name of this client std::string name = player->getName(); - std::wstring wname = narrow_to_wide(name); - std::wstring answer_to_sender = handleChat(name, wname, message, true, player); + std::wstring answer_to_sender = handleChat(name, message, true, player); if (!answer_to_sender.empty()) { // Send the answer to sender - SendChatMessage(peer_id, ChatMessage(CHATMESSAGE_TYPE_NORMAL, - answer_to_sender, wname)); + SendChatMessage(peer_id, ChatMessage(CHATMESSAGE_TYPE_SYSTEM, + answer_to_sender)); } } @@ -826,8 +812,7 @@ void Server::handleCommand_Damage(NetworkPacket* pkt) << std::endl; PlayerHPChangeReason reason(PlayerHPChangeReason::FALL); - playersao->setHP((s32)playersao->getHP() - (s32)damage, reason); - SendPlayerHPOrDie(playersao, reason); + playersao->setHP((s32)playersao->getHP() - (s32)damage, reason, true); } } @@ -921,6 +906,13 @@ bool Server::checkInteractDistance(RemotePlayer *player, const f32 d, const std: return true; } +// Tiny helper to retrieve the selected item into an Optional +static inline void getWieldedItem(const PlayerSAO *playersao, Optional<ItemStack> &ret) +{ + ret = ItemStack(); + playersao->getWieldedItem(&(*ret)); +} + void Server::handleCommand_Interact(NetworkPacket *pkt) { /* @@ -1046,16 +1038,23 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) if (pointed.type == POINTEDTHING_NODE) { target_pos = intToFloat(pointed.node_undersurface, BS); } else if (pointed.type == POINTEDTHING_OBJECT) { + if (playersao->getId() == pointed_object->getId()) { + actionstream << "Server: " << player->getName() + << " attempted to interact with themselves" << std::endl; + m_script->on_cheat(playersao, "interacted_with_self"); + return; + } target_pos = pointed_object->getBasePosition(); } float d = playersao->getEyePosition().getDistanceFrom(target_pos); - if (!checkInteractDistance(player, d, pointed.dump()) - && pointed.type == POINTEDTHING_NODE) { - // Re-send block to revert change on client-side - RemoteClient *client = getClient(peer_id); - v3s16 blockpos = getNodeBlockPos(pointed.node_undersurface); - client->SetBlockNotSent(blockpos); + if (!checkInteractDistance(player, d, pointed.dump())) { + if (pointed.type == POINTEDTHING_NODE) { + // Re-send block to revert change on client-side + RemoteClient *client = getClient(peer_id); + v3s16 blockpos = getNodeBlockPos(pointed.node_undersurface); + client->SetBlockNotSent(blockpos); + } return; } } @@ -1105,11 +1104,8 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) float time_from_last_punch = playersao->resetTimeFromLastPunch(); - u16 src_original_hp = pointed_object->getHP(); - u16 dst_origin_hp = playersao->getHP(); - - u16 wear = pointed_object->punch(dir, &toolcap, playersao, - time_from_last_punch); + u32 wear = pointed_object->punch(dir, &toolcap, playersao, + time_from_last_punch, tool_item.wear); // Callback may have changed item, so get it again playersao->getWieldedItem(&selected_item); @@ -1117,18 +1113,6 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) if (changed) playersao->setWieldedItem(selected_item); - // If the object is a player and its HP changed - if (src_original_hp != pointed_object->getHP() && - pointed_object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - SendPlayerHPOrDie((PlayerSAO *)pointed_object, - PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, playersao)); - } - - // If the puncher is a player and its HP changed - if (dst_origin_hp != playersao->getHP()) - SendPlayerHPOrDie(playersao, - PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, pointed_object)); - return; } // action == INTERACT_START_DIGGING @@ -1174,7 +1158,8 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) // Get diggability and expected digging time DigParams params = getDigParams(m_nodedef->get(n).groups, - &selected_item.getToolCapabilities(m_itemdef)); + &selected_item.getToolCapabilities(m_itemdef), + selected_item.wear); // If can't dig, try hand if (!params.diggable) { params = getDigParams(m_nodedef->get(n).groups, @@ -1236,14 +1221,17 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) // Place block or right-click object case INTERACT_PLACE: { - ItemStack selected_item; - playersao->getWieldedItem(&selected_item, nullptr); + Optional<ItemStack> selected_item; + getWieldedItem(playersao, selected_item); // Reset build time counter if (pointed.type == POINTEDTHING_NODE && - selected_item.getDefinition(m_itemdef).type == ITEM_NODE) + selected_item->getDefinition(m_itemdef).type == ITEM_NODE) getClient(peer_id)->m_time_from_building = 0.0; + const bool had_prediction = !selected_item->getDefinition(m_itemdef). + node_placement_prediction.empty(); + if (pointed.type == POINTEDTHING_OBJECT) { // Right click object @@ -1256,11 +1244,9 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) << pointed_object->getDescription() << std::endl; // Do stuff - if (m_script->item_OnSecondaryUse( - selected_item, playersao, pointed)) { - if (playersao->setWieldedItem(selected_item)) { + if (m_script->item_OnSecondaryUse(selected_item, playersao, pointed)) { + if (selected_item.has_value() && playersao->setWieldedItem(*selected_item)) SendInventory(playersao, true); - } } pointed_object->rightClick(playersao); @@ -1268,7 +1254,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) // Placement was handled in lua // Apply returned ItemStack - if (playersao->setWieldedItem(selected_item)) + if (selected_item.has_value() && playersao->setWieldedItem(*selected_item)) SendInventory(playersao, true); } @@ -1280,8 +1266,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) RemoteClient *client = getClient(peer_id); v3s16 blockpos = getNodeBlockPos(pointed.node_abovesurface); v3s16 blockpos2 = getNodeBlockPos(pointed.node_undersurface); - if (!selected_item.getDefinition(m_itemdef - ).node_placement_prediction.empty()) { + if (had_prediction) { client->SetBlockNotSent(blockpos); if (blockpos2 != blockpos) client->SetBlockNotSent(blockpos2); @@ -1295,15 +1280,15 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) } // action == INTERACT_PLACE case INTERACT_USE: { - ItemStack selected_item; - playersao->getWieldedItem(&selected_item, nullptr); + Optional<ItemStack> selected_item; + getWieldedItem(playersao, selected_item); - actionstream << player->getName() << " uses " << selected_item.name + actionstream << player->getName() << " uses " << selected_item->name << ", pointing at " << pointed.dump() << std::endl; if (m_script->item_OnUse(selected_item, playersao, pointed)) { // Apply returned ItemStack - if (playersao->setWieldedItem(selected_item)) + if (selected_item.has_value() && playersao->setWieldedItem(*selected_item)) SendInventory(playersao, true); } @@ -1312,16 +1297,17 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) // Rightclick air case INTERACT_ACTIVATE: { - ItemStack selected_item; - playersao->getWieldedItem(&selected_item, nullptr); + Optional<ItemStack> selected_item; + getWieldedItem(playersao, selected_item); actionstream << player->getName() << " activates " - << selected_item.name << std::endl; + << selected_item->name << std::endl; pointed.type = POINTEDTHING_NOTHING; // can only ever be NOTHING if (m_script->item_OnSecondaryUse(selected_item, playersao, pointed)) { - if (playersao->setWieldedItem(selected_item)) + // Apply returned ItemStack + if (selected_item.has_value() && playersao->setWieldedItem(*selected_item)) SendInventory(playersao, true); } @@ -1477,11 +1463,9 @@ void Server::handleCommand_FirstSrp(NetworkPacket* pkt) session_t peer_id = pkt->getPeerId(); RemoteClient *client = getClient(peer_id, CS_Invalid); ClientState cstate = client->getState(); + const std::string playername = client->getName(); - std::string playername = client->getName(); - - std::string salt; - std::string verification_key; + std::string salt, verification_key; std::string addr_s = getPeerAddress(peer_id).serializeString(); u8 is_empty; @@ -1491,6 +1475,9 @@ void Server::handleCommand_FirstSrp(NetworkPacket* pkt) verbosestream << "Server: Got TOSERVER_FIRST_SRP from " << addr_s << ", with is_empty=" << (is_empty == 1) << std::endl; + const bool empty_disallowed = !isSingleplayer() && is_empty == 1 && + g_settings->getBool("disallow_empty_password"); + // Either this packet is sent because the user is new or to change the password if (cstate == CS_HelloSent) { if (!client->isMechAllowed(AUTH_MECHANISM_FIRST_SRP)) { @@ -1501,9 +1488,7 @@ void Server::handleCommand_FirstSrp(NetworkPacket* pkt) return; } - if (!isSingleplayer() && - g_settings->getBool("disallow_empty_password") && - is_empty == 1) { + if (empty_disallowed) { actionstream << "Server: " << playername << " supplied empty password from " << addr_s << std::endl; DenyAccess(peer_id, SERVER_ACCESSDENIED_EMPTY_PASSWORD); @@ -1511,8 +1496,19 @@ void Server::handleCommand_FirstSrp(NetworkPacket* pkt) } std::string initial_ver_key; - initial_ver_key = encode_srp_verifier(verification_key, salt); + + // It is possible for multiple connections to get this far with the same + // player name. In the end only one player with a given name will be emerged + // (see Server::StateTwoClientInit) but we still have to be careful here. + if (m_script->getAuth(playername, nullptr, nullptr)) { + // Another client beat us to it + actionstream << "Server: Client from " << addr_s + << " tried to register " << playername << " a second time." + << std::endl; + DenyAccess(peer_id, SERVER_ACCESSDENIED_ALREADY_CONNECTED); + return; + } m_script->createAuth(playername, initial_ver_key); m_script->on_authplayer(playername, addr_s, true); @@ -1525,6 +1521,15 @@ void Server::handleCommand_FirstSrp(NetworkPacket* pkt) return; } m_clients.event(peer_id, CSE_SudoLeave); + + if (empty_disallowed) { + actionstream << "Server: " << playername + << " supplied empty password" << std::endl; + SendChatMessage(peer_id, ChatMessage(CHATMESSAGE_TYPE_SYSTEM, + L"Changing to an empty password is not allowed.")); + return; + } + std::string pw_db_field = encode_srp_verifier(verification_key, salt); bool success = m_script->setPassword(playername, pw_db_field); if (success) { @@ -1546,8 +1551,6 @@ void Server::handleCommand_SrpBytesA(NetworkPacket* pkt) RemoteClient *client = getClient(peer_id, CS_Invalid); ClientState cstate = client->getState(); - bool wantSudo = (cstate == CS_Active); - if (!((cstate == CS_HelloSent) || (cstate == CS_Active))) { actionstream << "Server: got SRP _A packet in wrong state " << cstate << " from " << getPeerAddress(peer_id).serializeString() << @@ -1555,6 +1558,8 @@ void Server::handleCommand_SrpBytesA(NetworkPacket* pkt) return; } + const bool wantSudo = (cstate == CS_Active); + if (client->chosen_mech != AUTH_MECHANISM_NONE) { actionstream << "Server: got SRP _A packet, while auth is already " "going on with mech " << client->chosen_mech << " from " << @@ -1601,8 +1606,7 @@ void Server::handleCommand_SrpBytesA(NetworkPacket* pkt) client->chosen_mech = chosen; - std::string salt; - std::string verifier; + std::string salt, verifier; if (based_on == 0) { @@ -1634,6 +1638,7 @@ void Server::handleCommand_SrpBytesA(NetworkPacket* pkt) << std::endl; if (wantSudo) { DenySudoAccess(peer_id); + client->resetChosenMech(); return; } @@ -1651,24 +1656,23 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt) session_t peer_id = pkt->getPeerId(); RemoteClient *client = getClient(peer_id, CS_Invalid); ClientState cstate = client->getState(); - std::string addr_s = getPeerAddress(pkt->getPeerId()).serializeString(); - std::string playername = client->getName(); + const std::string addr_s = client->getAddress().serializeString(); + const std::string playername = client->getName(); - bool wantSudo = (cstate == CS_Active); + const bool wantSudo = (cstate == CS_Active); - verbosestream << "Server: Received TOCLIENT_SRP_BYTES_M." << std::endl; + verbosestream << "Server: Received TOSERVER_SRP_BYTES_M." << std::endl; if (!((cstate == CS_HelloSent) || (cstate == CS_Active))) { - actionstream << "Server: got SRP _M packet in wrong state " - << cstate << " from " << addr_s - << ". Ignoring." << std::endl; + warningstream << "Server: got SRP_M packet in wrong state " + << cstate << " from " << addr_s << ". Ignoring." << std::endl; return; } if (client->chosen_mech != AUTH_MECHANISM_SRP && client->chosen_mech != AUTH_MECHANISM_LEGACY_PASSWORD) { - actionstream << "Server: got SRP _M packet, while auth" - << "is going on with mech " << client->chosen_mech << " from " + warningstream << "Server: got SRP_M packet, while auth " + "is going on with mech " << client->chosen_mech << " from " << addr_s << " (wantSudo=" << wantSudo << "). Denying." << std::endl; if (wantSudo) { DenySudoAccess(peer_id); @@ -1701,6 +1705,7 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt) << " tried to change their password, but supplied wrong" << " (SRP) password for authentication." << std::endl; DenySudoAccess(peer_id); + client->resetChosenMech(); return; } @@ -1714,9 +1719,8 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt) if (client->create_player_on_auth_success) { m_script->createAuth(playername, client->enc_pwd); - std::string checkpwd; // not used, but needed for passing something - if (!m_script->getAuth(playername, &checkpwd, NULL)) { - actionstream << "Server: " << playername << + if (!m_script->getAuth(playername, nullptr, nullptr)) { + errorstream << "Server: " << playername << " cannot be authenticated (auth handler does not work?)" << std::endl; DenyAccess(peer_id, SERVER_ACCESSDENIED_SERVER_FAIL); @@ -1810,3 +1814,30 @@ void Server::handleCommand_ModChannelMsg(NetworkPacket *pkt) broadcastModChannelMessage(channel_name, channel_msg, peer_id); } + +void Server::handleCommand_HaveMedia(NetworkPacket *pkt) +{ + std::vector<u32> tokens; + u8 numtokens; + + *pkt >> numtokens; + for (u16 i = 0; i < numtokens; i++) { + u32 n; + *pkt >> n; + tokens.emplace_back(n); + } + + const session_t peer_id = pkt->getPeerId(); + auto player = m_env->getPlayer(peer_id); + + for (const u32 token : tokens) { + auto it = m_pending_dyn_media.find(token); + if (it == m_pending_dyn_media.end()) + continue; + if (it->second.waiting_players.count(peer_id)) { + it->second.waiting_players.erase(peer_id); + if (player) + getScriptIface()->on_dynamic_media_added(token, player->getName()); + } + } +} diff --git a/src/network/socket.cpp b/src/network/socket.cpp index 94a9f4180..786171802 100644 --- a/src/network/socket.cpp +++ b/src/network/socket.cpp @@ -23,14 +23,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <iostream> #include <cstdlib> #include <cstring> -#include <cerrno> -#include <sstream> #include <iomanip> #include "util/string.h" #include "util/numeric.h" #include "constants.h" #include "debug.h" -#include "settings.h" #include "log.h" #ifdef _WIN32 @@ -42,9 +39,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <winsock2.h> #include <ws2tcpip.h> #define LAST_SOCKET_ERR() WSAGetLastError() -typedef SOCKET socket_t; +#define SOCKET_ERR_STR(e) itos(e) typedef int socklen_t; #else +#include <cerrno> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> @@ -53,7 +51,7 @@ typedef int socklen_t; #include <unistd.h> #include <arpa/inet.h> #define LAST_SOCKET_ERR() (errno) -typedef int socket_t; +#define SOCKET_ERR_STR(e) strerror(e) #endif // Set to true to enable verbose debug output @@ -93,7 +91,7 @@ UDPSocket::UDPSocket(bool ipv6) bool UDPSocket::init(bool ipv6, bool noExceptions) { if (!g_sockets_initialized) { - dstream << "Sockets not initialized" << std::endl; + tracestream << "Sockets not initialized" << std::endl; return false; } @@ -102,7 +100,7 @@ bool UDPSocket::init(bool ipv6, bool noExceptions) m_handle = socket(m_addr_family, SOCK_DGRAM, IPPROTO_UDP); if (socket_enable_debug_output) { - dstream << "UDPSocket(" << (int)m_handle + tracestream << "UDPSocket(" << (int)m_handle << ")::UDPSocket(): ipv6 = " << (ipv6 ? "true" : "false") << std::endl; } @@ -113,7 +111,7 @@ bool UDPSocket::init(bool ipv6, bool noExceptions) } throw SocketException(std::string("Failed to create socket: error ") + - itos(LAST_SOCKET_ERR())); + SOCKET_ERR_STR(LAST_SOCKET_ERR())); } setTimeoutMs(0); @@ -133,7 +131,7 @@ bool UDPSocket::init(bool ipv6, bool noExceptions) UDPSocket::~UDPSocket() { if (socket_enable_debug_output) { - dstream << "UDPSocket( " << (int)m_handle << ")::~UDPSocket()" + tracestream << "UDPSocket( " << (int)m_handle << ")::~UDPSocket()" << std::endl; } @@ -147,46 +145,46 @@ UDPSocket::~UDPSocket() void UDPSocket::Bind(Address addr) { if (socket_enable_debug_output) { - dstream << "UDPSocket(" << (int)m_handle + tracestream << "UDPSocket(" << (int)m_handle << ")::Bind(): " << addr.serializeString() << ":" << addr.getPort() << std::endl; } if (addr.getFamily() != m_addr_family) { - static const char *errmsg = + const char *errmsg = "Socket and bind address families do not match"; errorstream << "Bind failed: " << errmsg << std::endl; throw SocketException(errmsg); } + int ret = 0; + if (m_addr_family == AF_INET6) { struct sockaddr_in6 address; memset(&address, 0, sizeof(address)); - address = addr.getAddress6(); address.sin6_family = AF_INET6; + address.sin6_addr = addr.getAddress6(); address.sin6_port = htons(addr.getPort()); - if (bind(m_handle, (const struct sockaddr *)&address, - sizeof(struct sockaddr_in6)) < 0) { - dstream << (int)m_handle << ": Bind failed: " << strerror(errno) - << std::endl; - throw SocketException("Failed to bind socket"); - } + ret = bind(m_handle, (const struct sockaddr *) &address, + sizeof(struct sockaddr_in6)); } else { struct sockaddr_in address; memset(&address, 0, sizeof(address)); - address = addr.getAddress(); address.sin_family = AF_INET; + address.sin_addr = addr.getAddress(); address.sin_port = htons(addr.getPort()); - if (bind(m_handle, (const struct sockaddr *)&address, - sizeof(struct sockaddr_in)) < 0) { - dstream << (int)m_handle << ": Bind failed: " << strerror(errno) - << std::endl; - throw SocketException("Failed to bind socket"); - } + ret = bind(m_handle, (const struct sockaddr *) &address, + sizeof(struct sockaddr_in)); + } + + if (ret < 0) { + tracestream << (int)m_handle << ": Bind failed: " + << SOCKET_ERR_STR(LAST_SOCKET_ERR()) << std::endl; + throw SocketException("Failed to bind socket"); } } @@ -199,31 +197,31 @@ void UDPSocket::Send(const Address &destination, const void *data, int size) if (socket_enable_debug_output) { // Print packet destination and size - dstream << (int)m_handle << " -> "; - destination.print(&dstream); - dstream << ", size=" << size; + tracestream << (int)m_handle << " -> "; + destination.print(tracestream); + tracestream << ", size=" << size; // Print packet contents - dstream << ", data="; + tracestream << ", data="; for (int i = 0; i < size && i < 20; i++) { if (i % 2 == 0) - dstream << " "; + tracestream << " "; unsigned int a = ((const unsigned char *)data)[i]; - dstream << std::hex << std::setw(2) << std::setfill('0') << a; + tracestream << std::hex << std::setw(2) << std::setfill('0') << a; } if (size > 20) - dstream << "..."; + tracestream << "..."; if (dumping_packet) - dstream << " (DUMPED BY INTERNET_SIMULATOR)"; + tracestream << " (DUMPED BY INTERNET_SIMULATOR)"; - dstream << std::endl; + tracestream << std::endl; } if (dumping_packet) { // Lol let's forget it - dstream << "UDPSocket::Send(): INTERNET_SIMULATOR: dumping packet." + tracestream << "UDPSocket::Send(): INTERNET_SIMULATOR: dumping packet." << std::endl; return; } @@ -233,13 +231,19 @@ void UDPSocket::Send(const Address &destination, const void *data, int size) int sent; if (m_addr_family == AF_INET6) { - struct sockaddr_in6 address = destination.getAddress6(); + struct sockaddr_in6 address = {}; + address.sin6_family = AF_INET6; + address.sin6_addr = destination.getAddress6(); address.sin6_port = htons(destination.getPort()); + sent = sendto(m_handle, (const char *)data, size, 0, (struct sockaddr *)&address, sizeof(struct sockaddr_in6)); } else { - struct sockaddr_in address = destination.getAddress(); + struct sockaddr_in address = {}; + address.sin_family = AF_INET; + address.sin_addr = destination.getAddress(); address.sin_port = htons(destination.getPort()); + sent = sendto(m_handle, (const char *)data, size, 0, (struct sockaddr *)&address, sizeof(struct sockaddr_in)); } @@ -267,9 +271,9 @@ int UDPSocket::Receive(Address &sender, void *data, int size) return -1; u16 address_port = ntohs(address.sin6_port); - IPv6AddressBytes bytes; - memcpy(bytes.bytes, address.sin6_addr.s6_addr, 16); - sender = Address(&bytes, address_port); + const auto *bytes = reinterpret_cast<IPv6AddressBytes*> + (address.sin6_addr.s6_addr); + sender = Address(bytes, address_port); } else { struct sockaddr_in address; memset(&address, 0, sizeof(address)); @@ -290,22 +294,22 @@ int UDPSocket::Receive(Address &sender, void *data, int size) if (socket_enable_debug_output) { // Print packet sender and size - dstream << (int)m_handle << " <- "; - sender.print(&dstream); - dstream << ", size=" << received; + tracestream << (int)m_handle << " <- "; + sender.print(tracestream); + tracestream << ", size=" << received; // Print packet contents - dstream << ", data="; + tracestream << ", data="; for (int i = 0; i < received && i < 20; i++) { if (i % 2 == 0) - dstream << " "; + tracestream << " "; unsigned int a = ((const unsigned char *)data)[i]; - dstream << std::hex << std::setw(2) << std::setfill('0') << a; + tracestream << std::hex << std::setw(2) << std::setfill('0') << a; } if (received > 20) - dstream << "..."; + tracestream << "..."; - dstream << std::endl; + tracestream << std::endl; } return received; @@ -341,7 +345,12 @@ bool UDPSocket::WaitData(int timeout_ms) if (result == 0) return false; - if (result < 0 && (errno == EINTR || errno == EBADF)) { + int e = LAST_SOCKET_ERR(); +#ifdef _WIN32 + if (result < 0 && (e == WSAEINTR || e == WSAEBADF)) { +#else + if (result < 0 && (e == EINTR || e == EBADF)) { +#endif // N.B. select() fails when sockets are destroyed on Connection's dtor // with EBADF. Instead of doing tricky synchronization, allow this // thread to exit but don't throw an exception. @@ -349,18 +358,9 @@ bool UDPSocket::WaitData(int timeout_ms) } if (result < 0) { - dstream << m_handle << ": Select failed: " << strerror(errno) + tracestream << (int)m_handle << ": Select failed: " << SOCKET_ERR_STR(e) << std::endl; -#ifdef _WIN32 - int e = WSAGetLastError(); - dstream << (int)m_handle << ": WSAGetLastError()=" << e << std::endl; - if (e == 10004 /* WSAEINTR */ || e == 10009 /* WSAEBADF */) { - infostream << "Ignoring WSAEINTR/WSAEBADF." << std::endl; - return false; - } -#endif - throw SocketException("Select failed"); } else if (!FD_ISSET(m_handle, &readset)) { // No data diff --git a/src/network/socket.h b/src/network/socket.h index e0e76f4c2..d34186b44 100644 --- a/src/network/socket.h +++ b/src/network/socket.h @@ -19,18 +19,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -#ifdef _WIN32 -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif -#include <windows.h> -#include <winsock2.h> -#include <ws2tcpip.h> -#else -#include <sys/socket.h> -#include <netinet/in.h> -#endif - #include <ostream> #include <cstring> #include "address.h" @@ -53,8 +41,6 @@ public: bool init(bool ipv6, bool noExceptions = false); - // void Close(); - // bool IsOpen(); void Send(const Address &destination, const void *data, int size); // Returns -1 if there is no data int Receive(Address &sender, void *data, int size); diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 392f5eb98..d1eb12f3e 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "nameidmapping.h" #include "util/numeric.h" #include "util/serialize.h" +#include "util/string.h" #include "exceptions.h" #include "debug.h" #include "gamedef.h" @@ -55,27 +56,12 @@ void NodeBox::reset() wall_bottom = aabb3f(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2); wall_side = aabb3f(-BS/2, -BS/2, -BS/2, -BS/2+BS/16., BS/2, BS/2); // no default for other parts - connect_top.clear(); - connect_bottom.clear(); - connect_front.clear(); - connect_left.clear(); - connect_back.clear(); - connect_right.clear(); - disconnected_top.clear(); - disconnected_bottom.clear(); - disconnected_front.clear(); - disconnected_left.clear(); - disconnected_back.clear(); - disconnected_right.clear(); - disconnected.clear(); - disconnected_sides.clear(); + connected.reset(); } void NodeBox::serialize(std::ostream &os, u16 protocol_version) const { - // Protocol >= 36 - const u8 version = 6; - writeU8(os, version); + writeU8(os, 6); // version. Protocol >= 36 switch (type) { case NODEBOX_LEVELED: @@ -98,7 +84,7 @@ void NodeBox::serialize(std::ostream &os, u16 protocol_version) const writeV3F32(os, wall_side.MinEdge); writeV3F32(os, wall_side.MaxEdge); break; - case NODEBOX_CONNECTED: + case NODEBOX_CONNECTED: { writeU8(os, type); #define WRITEBOX(box) \ @@ -108,22 +94,25 @@ void NodeBox::serialize(std::ostream &os, u16 protocol_version) const writeV3F32(os, i.MaxEdge); \ }; + const auto &c = getConnected(); + WRITEBOX(fixed); - WRITEBOX(connect_top); - WRITEBOX(connect_bottom); - WRITEBOX(connect_front); - WRITEBOX(connect_left); - WRITEBOX(connect_back); - WRITEBOX(connect_right); - WRITEBOX(disconnected_top); - WRITEBOX(disconnected_bottom); - WRITEBOX(disconnected_front); - WRITEBOX(disconnected_left); - WRITEBOX(disconnected_back); - WRITEBOX(disconnected_right); - WRITEBOX(disconnected); - WRITEBOX(disconnected_sides); + WRITEBOX(c.connect_top); + WRITEBOX(c.connect_bottom); + WRITEBOX(c.connect_front); + WRITEBOX(c.connect_left); + WRITEBOX(c.connect_back); + WRITEBOX(c.connect_right); + WRITEBOX(c.disconnected_top); + WRITEBOX(c.disconnected_bottom); + WRITEBOX(c.disconnected_front); + WRITEBOX(c.disconnected_left); + WRITEBOX(c.disconnected_back); + WRITEBOX(c.disconnected_right); + WRITEBOX(c.disconnected); + WRITEBOX(c.disconnected_sides); break; + } default: writeU8(os, type); break; @@ -132,8 +121,7 @@ void NodeBox::serialize(std::ostream &os, u16 protocol_version) const void NodeBox::deSerialize(std::istream &is) { - int version = readU8(is); - if (version < 6) + if (readU8(is) < 6) throw SerializationError("unsupported NodeBox version"); reset(); @@ -172,21 +160,23 @@ void NodeBox::deSerialize(std::istream &is) u16 count; + auto &c = getConnected(); + READBOXES(fixed); - READBOXES(connect_top); - READBOXES(connect_bottom); - READBOXES(connect_front); - READBOXES(connect_left); - READBOXES(connect_back); - READBOXES(connect_right); - READBOXES(disconnected_top); - READBOXES(disconnected_bottom); - READBOXES(disconnected_front); - READBOXES(disconnected_left); - READBOXES(disconnected_back); - READBOXES(disconnected_right); - READBOXES(disconnected); - READBOXES(disconnected_sides); + READBOXES(c.connect_top); + READBOXES(c.connect_bottom); + READBOXES(c.connect_front); + READBOXES(c.connect_left); + READBOXES(c.connect_back); + READBOXES(c.connect_right); + READBOXES(c.disconnected_top); + READBOXES(c.disconnected_bottom); + READBOXES(c.disconnected_front); + READBOXES(c.disconnected_left); + READBOXES(c.disconnected_back); + READBOXES(c.disconnected_right); + READBOXES(c.disconnected); + READBOXES(c.disconnected_sides); } } @@ -207,7 +197,28 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const u8 version = 6; writeU8(os, version); - os << serializeString(name); + if (protocol_version > 39) { + os << serializeString16(name); + } else { + // Before f018737, TextureSource::getTextureAverageColor did not handle + // missing textures. "[png" can be used as base texture, but is not known + // on older clients. Hence use "blank.png" to avoid this problem. + // To be forward-compatible with future base textures/modifiers, + // we apply the same prefix to any texture beginning with [, + // except for the ones that are supported on older clients. + bool pass_through = true; + + if (!name.empty() && name[0] == '[') { + pass_through = str_starts_with(name, "[combine:") || + str_starts_with(name, "[inventorycube{") || + str_starts_with(name, "[lowpart:"); + } + + if (pass_through) + os << serializeString16(name); + else + os << serializeString16("blank.png^" + name); + } animation.serialize(os, version); bool has_scale = scale > 0; u16 flags = 0; @@ -235,14 +246,13 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const writeU8(os, align_style); } -void TileDef::deSerialize(std::istream &is, u8 contentfeatures_version, - NodeDrawType drawtype) +void TileDef::deSerialize(std::istream &is, NodeDrawType drawtype, u16 protocol_version) { - int version = readU8(is); - if (version < 6) + if (readU8(is) < 6) throw SerializationError("unsupported TileDef version"); - name = deSerializeString(is); - animation.deSerialize(is, version); + + name = deSerializeString16(is); + animation.deSerialize(is, protocol_version); u16 flags = readU16(is); backface_culling = flags & TILE_FLAG_BACKFACE_CULLING; tileable_horizontal = flags & TILE_FLAG_TILEABLE_HORIZONTAL; @@ -266,13 +276,10 @@ void TextureSettings::readSettings() { connected_glass = g_settings->getBool("connected_glass"); opaque_water = g_settings->getBool("opaque_water"); - bool enable_shaders = g_settings->getBool("enable_shaders"); - bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping"); - bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion"); bool smooth_lighting = g_settings->getBool("smooth_lighting"); enable_mesh_cache = g_settings->getBool("enable_mesh_cache"); enable_minimap = g_settings->getBool("enable_minimap"); - node_texture_size = g_settings->getU16("texture_min_size"); + node_texture_size = std::max<u16>(g_settings->getU16("texture_min_size"), 1); std::string leaves_style_str = g_settings->get("leaves_style"); std::string world_aligned_mode_str = g_settings->get("world_aligned_mode"); std::string autoscale_mode_str = g_settings->get("autoscale_mode"); @@ -281,8 +288,6 @@ void TextureSettings::readSettings() if (smooth_lighting) enable_mesh_cache = false; - use_normal_texture = enable_shaders && - (enable_bumpmapping || enable_parallax_occlusion); if (leaves_style_str == "fancy") { leaves_style = LEAVES_FANCY; } else if (leaves_style_str == "simple") { @@ -365,7 +370,7 @@ void ContentFeatures::reset() i = TileDef(); for (auto &j : tiledef_special) j = TileDef(); - alpha = 255; + alpha = ALPHAMODE_OPAQUE; post_effect_color = video::SColor(0, 0, 0, 0); param_type = CPT_NONE; param_type_2 = CPT2_NONE; @@ -392,9 +397,9 @@ void ContentFeatures::reset() drowning = 0; light_source = 0; damage_per_second = 0; - node_box = NodeBox(); - selection_box = NodeBox(); - collision_box = NodeBox(); + node_box.reset(); + selection_box.reset(); + collision_box.reset(); waving = 0; legacy_facedir_simple = false; legacy_wallmounted = false; @@ -408,26 +413,57 @@ void ContentFeatures::reset() palette_name = ""; palette = NULL; node_dig_prediction = "air"; + move_resistance = 0; + liquid_move_physics = false; +} + +void ContentFeatures::setAlphaFromLegacy(u8 legacy_alpha) +{ + // No special handling for nodebox/mesh here as it doesn't make sense to + // throw warnings when the server is too old to support the "correct" way + switch (drawtype) { + case NDT_NORMAL: + alpha = legacy_alpha == 255 ? ALPHAMODE_OPAQUE : ALPHAMODE_CLIP; + break; + case NDT_LIQUID: + case NDT_FLOWINGLIQUID: + alpha = legacy_alpha == 255 ? ALPHAMODE_OPAQUE : ALPHAMODE_BLEND; + break; + default: + alpha = legacy_alpha == 255 ? ALPHAMODE_CLIP : ALPHAMODE_BLEND; + break; + } +} + +u8 ContentFeatures::getAlphaForLegacy() const +{ + // This is so simple only because 255 and 0 mean wildly different things + // depending on drawtype... + return alpha == ALPHAMODE_OPAQUE ? 255 : 0; } void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const { - const u8 version = CONTENTFEATURES_VERSION; - writeU8(os, version); + writeU8(os, CONTENTFEATURES_VERSION); // general - os << serializeString(name); + os << serializeString16(name); writeU16(os, groups.size()); for (const auto &group : groups) { - os << serializeString(group.first); - writeS16(os, group.second); + os << serializeString16(group.first); + if (protocol_version < 41 && group.first.compare("bouncy") == 0) { + // Old clients may choke on negative bouncy value + writeS16(os, abs(group.second)); + } else { + writeS16(os, group.second); + } } writeU8(os, param_type); writeU8(os, param_type_2); // visual writeU8(os, drawtype); - os << serializeString(mesh); + os << serializeString16(mesh); writeF32(os, visual_scale); writeU8(os, 6); for (const TileDef &td : tiledef) @@ -438,11 +474,11 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const for (const TileDef &td : tiledef_special) { td.serialize(os, protocol_version); } - writeU8(os, alpha); + writeU8(os, getAlphaForLegacy()); writeU8(os, color.getRed()); writeU8(os, color.getGreen()); writeU8(os, color.getBlue()); - os << serializeString(palette_name); + os << serializeString16(palette_name); writeU8(os, waving); writeU8(os, connect_sides); writeU16(os, connects_to_ids.size()); @@ -469,9 +505,18 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const writeU32(os, damage_per_second); // liquid - writeU8(os, liquid_type); - os << serializeString(liquid_alternative_flowing); - os << serializeString(liquid_alternative_source); + LiquidType liquid_type_bc = liquid_type; + if (protocol_version <= 39) { + // Since commit 7f25823, liquid drawtypes can be used even with LIQUID_NONE + // solution: force liquid type accordingly to accepted values + if (drawtype == NDT_LIQUID) + liquid_type_bc = LIQUID_SOURCE; + else if (drawtype == NDT_FLOWINGLIQUID) + liquid_type_bc = LIQUID_FLOWING; + } + writeU8(os, liquid_type_bc); + os << serializeString16(liquid_alternative_flowing); + os << serializeString16(liquid_alternative_source); writeU8(os, liquid_viscosity); writeU8(os, liquid_renewable); writeU8(os, liquid_range); @@ -484,46 +529,33 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const collision_box.serialize(os, protocol_version); // sound - sound_footstep.serialize(os, version); - sound_dig.serialize(os, version); - sound_dug.serialize(os, version); + sound_footstep.serialize(os, protocol_version); + sound_dig.serialize(os, protocol_version); + sound_dug.serialize(os, protocol_version); // legacy writeU8(os, legacy_facedir_simple); writeU8(os, legacy_wallmounted); - os << serializeString(node_dig_prediction); + // new attributes + os << serializeString16(node_dig_prediction); writeU8(os, leveled_max); + writeU8(os, alpha); + writeU8(os, move_resistance); + writeU8(os, liquid_move_physics); } -void ContentFeatures::correctAlpha(TileDef *tiles, int length) +void ContentFeatures::deSerialize(std::istream &is, u16 protocol_version) { - // alpha == 0 means that the node is using texture alpha - if (alpha == 0 || alpha == 255) - return; - - for (int i = 0; i < length; i++) { - if (tiles[i].name.empty()) - continue; - std::stringstream s; - s << tiles[i].name << "^[noalpha^[opacity:" << ((int)alpha); - tiles[i].name = s.str(); - } -} - -void ContentFeatures::deSerialize(std::istream &is) -{ - // version detection - const u8 version = readU8(is); - if (version < CONTENTFEATURES_VERSION) + if (readU8(is) < CONTENTFEATURES_VERSION) throw SerializationError("unsupported ContentFeatures version"); // general - name = deSerializeString(is); + name = deSerializeString16(is); groups.clear(); u32 groups_size = readU16(is); for (u32 i = 0; i < groups_size; i++) { - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); int value = readS16(is); groups[name] = value; } @@ -532,23 +564,23 @@ void ContentFeatures::deSerialize(std::istream &is) // visual drawtype = (enum NodeDrawType) readU8(is); - mesh = deSerializeString(is); + mesh = deSerializeString16(is); visual_scale = readF32(is); if (readU8(is) != 6) throw SerializationError("unsupported tile count"); for (TileDef &td : tiledef) - td.deSerialize(is, version, drawtype); + td.deSerialize(is, drawtype, protocol_version); for (TileDef &td : tiledef_overlay) - td.deSerialize(is, version, drawtype); + td.deSerialize(is, drawtype, protocol_version); if (readU8(is) != CF_SPECIAL_COUNT) throw SerializationError("unsupported CF_SPECIAL_COUNT"); for (TileDef &td : tiledef_special) - td.deSerialize(is, version, drawtype); - alpha = readU8(is); + td.deSerialize(is, drawtype, protocol_version); + setAlphaFromLegacy(readU8(is)); color.setRed(readU8(is)); color.setGreen(readU8(is)); color.setBlue(readU8(is)); - palette_name = deSerializeString(is); + palette_name = deSerializeString16(is); waving = readU8(is); connect_sides = readU8(is); u16 connects_to_size = readU16(is); @@ -578,9 +610,11 @@ void ContentFeatures::deSerialize(std::istream &is) // liquid liquid_type = (enum LiquidType) readU8(is); - liquid_alternative_flowing = deSerializeString(is); - liquid_alternative_source = deSerializeString(is); + liquid_move_physics = liquid_type != LIQUID_NONE; + liquid_alternative_flowing = deSerializeString16(is); + liquid_alternative_source = deSerializeString16(is); liquid_viscosity = readU8(is); + move_resistance = liquid_viscosity; // set default move_resistance liquid_renewable = readU8(is); liquid_range = readU8(is); drowning = readU8(is); @@ -592,20 +626,36 @@ void ContentFeatures::deSerialize(std::istream &is) collision_box.deSerialize(is); // sounds - sound_footstep.deSerialize(is, version); - sound_dig.deSerialize(is, version); - sound_dug.deSerialize(is, version); + sound_footstep.deSerialize(is, protocol_version); + sound_dig.deSerialize(is, protocol_version); + sound_dug.deSerialize(is, protocol_version); // read legacy properties legacy_facedir_simple = readU8(is); legacy_wallmounted = readU8(is); try { - node_dig_prediction = deSerializeString(is); - u8 tmp_leveled_max = readU8(is); + node_dig_prediction = deSerializeString16(is); + + u8 tmp = readU8(is); if (is.eof()) /* readU8 doesn't throw exceptions so we have to do this */ throw SerializationError(""); - leveled_max = tmp_leveled_max; + leveled_max = tmp; + + tmp = readU8(is); + if (is.eof()) + throw SerializationError(""); + alpha = static_cast<enum AlphaMode>(tmp); + + tmp = readU8(is); + if (is.eof()) + throw SerializationError(""); + move_resistance = tmp; + + tmp = readU8(is); + if (is.eof()) + throw SerializationError(""); + liquid_move_physics = tmp; } catch(SerializationError &e) {}; } @@ -635,10 +685,6 @@ static void fillTileAttribs(ITextureSource *tsrc, TileLayer *layer, if (!tile.world_aligned) layer->scale = 1; - // Normal texture and shader flags texture - if (tsettings.use_normal_texture) { - layer->normal_texture = tsrc->getNormalTexture(tiledef.name); - } layer->flags_texture = tsrc->getShaderFlagsTexture(layer->normal_texture ? true : false); // Material flags @@ -662,6 +708,7 @@ static void fillTileAttribs(ITextureSource *tsrc, TileLayer *layer, // Animation parameters int frame_count = 1; if (layer->material_flags & MATERIAL_FLAG_ANIMATION) { + assert(layer->texture); int frame_length_ms; tiledef.animation.determineParams(layer->texture->getOriginalSize(), &frame_count, &frame_length_ms, NULL); @@ -672,14 +719,13 @@ static void fillTileAttribs(ITextureSource *tsrc, TileLayer *layer, if (frame_count == 1) { layer->material_flags &= ~MATERIAL_FLAG_ANIMATION; } else { - std::ostringstream os(std::ios::binary); - if (!layer->frames) { + assert(layer->texture); + if (!layer->frames) layer->frames = new std::vector<FrameSpec>(); - } layer->frames->resize(frame_count); + std::ostringstream os(std::ios::binary); for (int i = 0; i < frame_count; i++) { - FrameSpec frame; os.str(""); @@ -701,6 +747,7 @@ bool ContentFeatures::textureAlphaCheck(ITextureSource *tsrc, const TileDef *til video::IVideoDriver *driver = RenderingEngine::get_video_driver(); static thread_local bool long_warning_printed = false; std::set<std::string> seen; + for (int i = 0; i < length; i++) { if (seen.find(tiles[i].name) != seen.end()) continue; @@ -725,20 +772,21 @@ bool ContentFeatures::textureAlphaCheck(ITextureSource *tsrc, const TileDef *til break_loop: image->drop(); - if (!ok) { - warningstream << "Texture \"" << tiles[i].name << "\" of " - << name << " has transparent pixels, assuming " - "use_texture_alpha = true." << std::endl; - if (!long_warning_printed) { - warningstream << " This warning can be a false-positive if " - "unused pixels in the texture are transparent. However if " - "it is meant to be transparent, you *MUST* update the " - "nodedef and set use_texture_alpha = true! This compatibility " - "code will be removed in a few releases." << std::endl; - long_warning_printed = true; - } - return true; + if (ok) + continue; + warningstream << "Texture \"" << tiles[i].name << "\" of " + << name << " has transparency, assuming " + "use_texture_alpha = \"clip\"." << std::endl; + if (!long_warning_printed) { + warningstream << " This warning can be a false-positive if " + "unused pixels in the texture are transparent. However if " + "it is meant to be transparent, you *MUST* update the " + "nodedef and set use_texture_alpha = \"clip\"! This " + "compatibility code will be removed in a few releases." + << std::endl; + long_warning_printed = true; } + return true; } return false; } @@ -769,8 +817,10 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc TileDef tdef[6]; for (u32 j = 0; j < 6; j++) { tdef[j] = tiledef[j]; - if (tdef[j].name.empty()) - tdef[j].name = "unknown_node.png"; + if (tdef[j].name.empty()) { + tdef[j].name = "no_texture.png"; + tdef[j].backface_culling = false; + } } // also the overlay tiles TileDef tdef_overlay[6]; @@ -778,36 +828,39 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc tdef_overlay[j] = tiledef_overlay[j]; // also the special tiles TileDef tdef_spec[6]; - for (u32 j = 0; j < CF_SPECIAL_COUNT; j++) + for (u32 j = 0; j < CF_SPECIAL_COUNT; j++) { tdef_spec[j] = tiledef_special[j]; + } bool is_liquid = false; - u8 material_type = (alpha == 255) ? - TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA; + if (alpha == ALPHAMODE_LEGACY_COMPAT) { + // Before working with the alpha mode, resolve any legacy kludges + alpha = textureAlphaCheck(tsrc, tdef, 6) ? ALPHAMODE_CLIP : ALPHAMODE_OPAQUE; + } + + MaterialType material_type = alpha == ALPHAMODE_OPAQUE ? + TILE_MATERIAL_OPAQUE : (alpha == ALPHAMODE_CLIP ? TILE_MATERIAL_BASIC : + TILE_MATERIAL_ALPHA); switch (drawtype) { default: case NDT_NORMAL: - material_type = (alpha == 255) ? - TILE_MATERIAL_OPAQUE : TILE_MATERIAL_ALPHA; solidness = 2; break; case NDT_AIRLIKE: solidness = 0; break; case NDT_LIQUID: - assert(liquid_type == LIQUID_SOURCE); if (tsettings.opaque_water) - alpha = 255; + alpha = ALPHAMODE_OPAQUE; solidness = 1; is_liquid = true; break; case NDT_FLOWINGLIQUID: - assert(liquid_type == LIQUID_FLOWING); solidness = 0; if (tsettings.opaque_water) - alpha = 255; + alpha = ALPHAMODE_OPAQUE; is_liquid = true; break; case NDT_GLASSLIKE: @@ -841,8 +894,15 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc solidness = 0; visual_solidness = 1; } else { - drawtype = NDT_NORMAL; - solidness = 2; + if (waving >= 1) { + // waving nodes must make faces so there are no gaps + drawtype = NDT_ALLFACES; + solidness = 0; + visual_solidness = 1; + } else { + drawtype = NDT_NORMAL; + solidness = 2; + } for (TileDef &td : tdef) td.name += std::string("^[noalpha"); } @@ -859,19 +919,16 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc break; case NDT_MESH: case NDT_NODEBOX: - if (alpha == 255 && textureAlphaCheck(tsrc, tdef, 6)) - alpha = 0; - solidness = 0; - if (waving == 1) + if (waving == 1) { material_type = TILE_MATERIAL_WAVING_PLANTS; - else if (waving == 2) + } else if (waving == 2) { material_type = TILE_MATERIAL_WAVING_LEAVES; - else if (waving == 3) - material_type = (alpha == 255) ? TILE_MATERIAL_WAVING_LIQUID_OPAQUE : - TILE_MATERIAL_WAVING_LIQUID_BASIC; - else if (alpha == 255) - material_type = TILE_MATERIAL_OPAQUE; + } else if (waving == 3) { + material_type = alpha == ALPHAMODE_OPAQUE ? + TILE_MATERIAL_WAVING_LIQUID_OPAQUE : (alpha == ALPHAMODE_CLIP ? + TILE_MATERIAL_WAVING_LIQUID_BASIC : TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT); + } break; case NDT_TORCHLIKE: case NDT_SIGNLIKE: @@ -885,23 +942,19 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc } if (is_liquid) { - // Vertex alpha is no longer supported, correct if necessary. - correctAlpha(tdef, 6); - correctAlpha(tdef_overlay, 6); - correctAlpha(tdef_spec, CF_SPECIAL_COUNT); - if (waving == 3) { - material_type = (alpha == 255) ? TILE_MATERIAL_WAVING_LIQUID_OPAQUE : - TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT; + material_type = alpha == ALPHAMODE_OPAQUE ? + TILE_MATERIAL_WAVING_LIQUID_OPAQUE : (alpha == ALPHAMODE_CLIP ? + TILE_MATERIAL_WAVING_LIQUID_BASIC : TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT); } else { - material_type = (alpha == 255) ? TILE_MATERIAL_LIQUID_OPAQUE : + material_type = alpha == ALPHAMODE_OPAQUE ? TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT; } } u32 tile_shader = shdsrc->getShader("nodes_shader", material_type, drawtype); - u8 overlay_material = material_type; + MaterialType overlay_material = material_type; if (overlay_material == TILE_MATERIAL_OPAQUE) overlay_material = TILE_MATERIAL_BASIC; else if (overlay_material == TILE_MATERIAL_LIQUID_OPAQUE) @@ -922,7 +975,7 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc tdef[j].backface_culling, tsettings); } - u8 special_material = material_type; + MaterialType special_material = material_type; if (drawtype == NDT_PLANTLIKE_ROOTED) { if (waving == 1) special_material = TILE_MATERIAL_WAVING_PLANTS; @@ -939,7 +992,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc if (param_type_2 == CPT2_COLOR || param_type_2 == CPT2_COLORED_FACEDIR || - param_type_2 == CPT2_COLORED_WALLMOUNTED) + param_type_2 == CPT2_COLORED_WALLMOUNTED || + param_type_2 == CPT2_COLORED_DEGROTATE) palette = tsrc->getPalette(palette_name); if (drawtype == NDT_MESH && !mesh.empty()) { @@ -1029,6 +1083,8 @@ void NodeDefManager::clear() { ContentFeatures f; f.name = "unknown"; + for (int t = 0; t < 6; t++) + f.tiledef[t].name = "unknown_node.png"; // Insert directly into containers content_t c = CONTENT_UNKNOWN; m_content_features[c] = f; @@ -1230,22 +1286,23 @@ void getNodeBoxUnion(const NodeBox &nodebox, const ContentFeatures &features, break; } case NODEBOX_CONNECTED: { + const auto &c = nodebox.getConnected(); // Add all possible connected boxes - boxVectorUnion(nodebox.fixed, box_union); - boxVectorUnion(nodebox.connect_top, box_union); - boxVectorUnion(nodebox.connect_bottom, box_union); - boxVectorUnion(nodebox.connect_front, box_union); - boxVectorUnion(nodebox.connect_left, box_union); - boxVectorUnion(nodebox.connect_back, box_union); - boxVectorUnion(nodebox.connect_right, box_union); - boxVectorUnion(nodebox.disconnected_top, box_union); - boxVectorUnion(nodebox.disconnected_bottom, box_union); - boxVectorUnion(nodebox.disconnected_front, box_union); - boxVectorUnion(nodebox.disconnected_left, box_union); - boxVectorUnion(nodebox.disconnected_back, box_union); - boxVectorUnion(nodebox.disconnected_right, box_union); - boxVectorUnion(nodebox.disconnected, box_union); - boxVectorUnion(nodebox.disconnected_sides, box_union); + boxVectorUnion(nodebox.fixed, box_union); + boxVectorUnion(c.connect_top, box_union); + boxVectorUnion(c.connect_bottom, box_union); + boxVectorUnion(c.connect_front, box_union); + boxVectorUnion(c.connect_left, box_union); + boxVectorUnion(c.connect_back, box_union); + boxVectorUnion(c.connect_right, box_union); + boxVectorUnion(c.disconnected_top, box_union); + boxVectorUnion(c.disconnected_bottom, box_union); + boxVectorUnion(c.disconnected_front, box_union); + boxVectorUnion(c.disconnected_left, box_union); + boxVectorUnion(c.disconnected_back, box_union); + boxVectorUnion(c.disconnected_right, box_union); + boxVectorUnion(c.disconnected, box_union); + boxVectorUnion(c.disconnected_sides, box_union); break; } default: { @@ -1388,50 +1445,56 @@ void NodeDefManager::applyTextureOverrides(const std::vector<TextureOverride> &o ContentFeatures &nodedef = m_content_features[id]; + auto apply = [&] (TileDef &tile) { + tile.name = texture_override.texture; + if (texture_override.world_scale > 0) { + tile.align_style = ALIGN_STYLE_WORLD; + tile.scale = texture_override.world_scale; + } + }; + // Override tiles if (texture_override.hasTarget(OverrideTarget::TOP)) - nodedef.tiledef[0].name = texture_override.texture; + apply(nodedef.tiledef[0]); if (texture_override.hasTarget(OverrideTarget::BOTTOM)) - nodedef.tiledef[1].name = texture_override.texture; + apply(nodedef.tiledef[1]); if (texture_override.hasTarget(OverrideTarget::RIGHT)) - nodedef.tiledef[2].name = texture_override.texture; + apply(nodedef.tiledef[2]); if (texture_override.hasTarget(OverrideTarget::LEFT)) - nodedef.tiledef[3].name = texture_override.texture; + apply(nodedef.tiledef[3]); if (texture_override.hasTarget(OverrideTarget::BACK)) - nodedef.tiledef[4].name = texture_override.texture; + apply(nodedef.tiledef[4]); if (texture_override.hasTarget(OverrideTarget::FRONT)) - nodedef.tiledef[5].name = texture_override.texture; + apply(nodedef.tiledef[5]); // Override special tiles, if applicable if (texture_override.hasTarget(OverrideTarget::SPECIAL_1)) - nodedef.tiledef_special[0].name = texture_override.texture; + apply(nodedef.tiledef_special[0]); if (texture_override.hasTarget(OverrideTarget::SPECIAL_2)) - nodedef.tiledef_special[1].name = texture_override.texture; + apply(nodedef.tiledef_special[1]); if (texture_override.hasTarget(OverrideTarget::SPECIAL_3)) - nodedef.tiledef_special[2].name = texture_override.texture; + apply(nodedef.tiledef_special[2]); if (texture_override.hasTarget(OverrideTarget::SPECIAL_4)) - nodedef.tiledef_special[3].name = texture_override.texture; + apply(nodedef.tiledef_special[3]); if (texture_override.hasTarget(OverrideTarget::SPECIAL_5)) - nodedef.tiledef_special[4].name = texture_override.texture; + apply(nodedef.tiledef_special[4]); if (texture_override.hasTarget(OverrideTarget::SPECIAL_6)) - nodedef.tiledef_special[5].name = texture_override.texture; + apply(nodedef.tiledef_special[5]); } } -void NodeDefManager::updateTextures(IGameDef *gamedef, - void (*progress_callback)(void *progress_args, u32 progress, u32 max_progress), - void *progress_callback_args) +void NodeDefManager::updateTextures(IGameDef *gamedef, void *progress_callback_args) { #ifndef SERVER infostream << "NodeDefManager::updateTextures(): Updating " @@ -1440,8 +1503,8 @@ void NodeDefManager::updateTextures(IGameDef *gamedef, Client *client = (Client *)gamedef; ITextureSource *tsrc = client->tsrc(); IShaderSource *shdsrc = client->getShaderSource(); - scene::IMeshManipulator *meshmanip = - RenderingEngine::get_scene_manager()->getMeshManipulator(); + auto smgr = client->getSceneManager(); + scene::IMeshManipulator *meshmanip = smgr->getMeshManipulator(); TextureSettings tsettings; tsettings.readSettings(); @@ -1450,7 +1513,7 @@ void NodeDefManager::updateTextures(IGameDef *gamedef, for (u32 i = 0; i < size; i++) { ContentFeatures *f = &(m_content_features[i]); f->updateTextures(tsrc, shdsrc, meshmanip, client, tsettings); - progress_callback(progress_callback_args, i, size); + client->showUpdateProgressTexture(progress_callback_args, i, size); } #endif } @@ -1472,7 +1535,7 @@ void NodeDefManager::serialize(std::ostream &os, u16 protocol_version) const // strict version incompatibilities std::ostringstream wrapper_os(std::ios::binary); f->serialize(wrapper_os, protocol_version); - os2<<serializeString(wrapper_os.str()); + os2<<serializeString16(wrapper_os.str()); // must not overflow u16 next = count + 1; @@ -1480,26 +1543,27 @@ void NodeDefManager::serialize(std::ostream &os, u16 protocol_version) const count++; } writeU16(os, count); - os << serializeLongString(os2.str()); + os << serializeString32(os2.str()); } -void NodeDefManager::deSerialize(std::istream &is) +void NodeDefManager::deSerialize(std::istream &is, u16 protocol_version) { clear(); - int version = readU8(is); - if (version != 1) + + if (readU8(is) < 1) throw SerializationError("unsupported NodeDefinitionManager version"); + u16 count = readU16(is); - std::istringstream is2(deSerializeLongString(is), std::ios::binary); + std::istringstream is2(deSerializeString32(is), std::ios::binary); ContentFeatures f; for (u16 n = 0; n < count; n++) { u16 i = readU16(is2); // Read it from the string wrapper - std::string wrapper = deSerializeString(is2); + std::string wrapper = deSerializeString16(is2); std::istringstream wrapper_is(wrapper, std::ios::binary); - f.deSerialize(wrapper_is); + f.deSerialize(wrapper_is, protocol_version); // Check error conditions if (i == CONTENT_IGNORE || i == CONTENT_AIR || i == CONTENT_UNKNOWN) { @@ -1538,10 +1602,10 @@ void NodeDefManager::deSerialize(std::istream &is) } -void NodeDefManager::addNameIdMapping(content_t i, std::string name) +void NodeDefManager::addNameIdMapping(content_t i, const std::string &name) { m_name_id_mapping.set(i, name); - m_name_id_mapping_with_aliases.insert(std::make_pair(name, i)); + m_name_id_mapping_with_aliases.emplace(name, i); } @@ -1605,7 +1669,7 @@ static void removeDupes(std::vector<content_t> &list) void NodeDefManager::resolveCrossrefs() { for (ContentFeatures &f : m_content_features) { - if (f.liquid_type != LIQUID_NONE) { + if (f.liquid_type != LIQUID_NONE || f.drawtype == NDT_LIQUID || f.drawtype == NDT_FLOWINGLIQUID) { f.liquid_alternative_flowing_id = getId(f.liquid_alternative_flowing); f.liquid_alternative_source_id = getId(f.liquid_alternative_source); continue; @@ -1670,8 +1734,7 @@ bool NodeDefManager::nodeboxConnects(MapNode from, MapNode to, NodeResolver::NodeResolver() { - m_nodenames.reserve(16); - m_nnlistsizes.reserve(4); + reset(); } @@ -1774,3 +1837,16 @@ bool NodeResolver::getIdsFromNrBacklog(std::vector<content_t> *result_out, return success; } + +void NodeResolver::reset(bool resolve_done) +{ + m_nodenames.clear(); + m_nodenames_idx = 0; + m_nnlistsizes.clear(); + m_nnlistsizes_idx = 0; + + m_resolve_done = resolve_done; + + m_nodenames.reserve(16); + m_nnlistsizes.reserve(4); +} diff --git a/src/nodedef.h b/src/nodedef.h index 71c56bda9..f4367cba9 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -36,14 +36,14 @@ class Client; #include "texture_override.h" // TextureOverride #include "tileanimation.h" -// PROTOCOL_VERSION >= 37 -static const u8 CONTENTFEATURES_VERSION = 13; - class IItemDefManager; class ITextureSource; class IShaderSource; class IGameDef; class NodeResolver; +#if BUILD_UNITTESTS +class TestSchematic; +#endif enum ContentParamType { @@ -64,7 +64,7 @@ enum ContentParamType2 CPT2_WALLMOUNTED, // Block level like FLOWINGLIQUID CPT2_LEVELED, - // 2D rotation for things like plants + // 2D rotation CPT2_DEGROTATE, // Mesh options for plants CPT2_MESHOPTIONS, @@ -76,6 +76,8 @@ enum ContentParamType2 CPT2_COLORED_WALLMOUNTED, // Glasslike framed drawtype internal liquid level, param2 values 0 to 63 CPT2_GLASSLIKE_LIQUID_LEVEL, + // 3 bits of palette index, then degrotate + CPT2_COLORED_DEGROTATE, }; enum LiquidType @@ -94,17 +96,8 @@ enum NodeBoxType NODEBOX_CONNECTED, // optionally draws nodeboxes if a neighbor node attaches }; -struct NodeBox +struct NodeBoxConnected { - enum NodeBoxType type; - // NODEBOX_REGULAR (no parameters) - // NODEBOX_FIXED - std::vector<aabb3f> fixed; - // NODEBOX_WALLMOUNTED - aabb3f wall_top; - aabb3f wall_bottom; - aabb3f wall_side; // being at the -X side - // NODEBOX_CONNECTED std::vector<aabb3f> connect_top; std::vector<aabb3f> connect_bottom; std::vector<aabb3f> connect_front; @@ -119,9 +112,35 @@ struct NodeBox std::vector<aabb3f> disconnected_right; std::vector<aabb3f> disconnected; std::vector<aabb3f> disconnected_sides; +}; + +struct NodeBox +{ + enum NodeBoxType type; + // NODEBOX_REGULAR (no parameters) + // NODEBOX_FIXED + std::vector<aabb3f> fixed; + // NODEBOX_WALLMOUNTED + aabb3f wall_top; + aabb3f wall_bottom; + aabb3f wall_side; // being at the -X side + // NODEBOX_CONNECTED + // (kept externally to not bloat the structure) + std::shared_ptr<NodeBoxConnected> connected; NodeBox() { reset(); } + ~NodeBox() = default; + + inline NodeBoxConnected &getConnected() { + if (!connected) + connected = std::make_shared<NodeBoxConnected>(); + return *connected; + } + inline const NodeBoxConnected &getConnected() const { + assert(connected); + return *connected; + } void reset(); void serialize(std::ostream &os, u16 protocol_version) const; @@ -158,7 +177,6 @@ public: int node_texture_size; bool opaque_water; bool connected_glass; - bool use_normal_texture; bool enable_mesh_cache; bool enable_minimap; @@ -232,6 +250,14 @@ enum AlignStyle : u8 { ALIGN_STYLE_USER_DEFINED, }; +enum AlphaMode : u8 { + ALPHAMODE_BLEND, + ALPHAMODE_CLIP, + ALPHAMODE_OPAQUE, + ALPHAMODE_LEGACY_COMPAT, /* means either opaque or clip */ +}; + + /* Stand-alone definition of a TileSpec (basically a server-side TileSpec) */ @@ -257,8 +283,7 @@ struct TileDef } void serialize(std::ostream &os, u16 protocol_version) const; - void deSerialize(std::istream &is, u8 contentfeatures_version, - NodeDrawType drawtype); + void deSerialize(std::istream &is, NodeDrawType drawtype, u16 protocol_version); }; // Defines the number of special tiles per nodedef @@ -270,6 +295,10 @@ struct TileDef struct ContentFeatures { + // PROTOCOL_VERSION >= 37. This is legacy and should not be increased anymore, + // write checks that depend directly on the protocol version instead. + static const u8 CONTENTFEATURES_VERSION = 13; + /* Cached stuff */ @@ -278,7 +307,6 @@ struct ContentFeatures // up down right left back front TileSpec tiles[6]; // Special tiles - // - Currently used for flowing liquids TileSpec special_tiles[CF_SPECIAL_COUNT]; u8 solidness; // Used when choosing which face is drawn u8 visual_solidness; // When solidness=0, this tells how it looks like @@ -316,9 +344,7 @@ struct ContentFeatures // These will be drawn over the base tiles. TileDef tiledef_overlay[6]; TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid - // If 255, the node is opaque. - // Otherwise it uses texture alpha. - u8 alpha; + AlphaMode alpha; // The color of the node. video::SColor color; std::string palette_name; @@ -366,11 +392,15 @@ struct ContentFeatures u32 damage_per_second; // client dig prediction std::string node_dig_prediction; + // how slow players move through + u8 move_resistance = 0; // --- LIQUID PROPERTIES --- // Whether the node is non-liquid, source liquid or flowing liquid enum LiquidType liquid_type; + // If true, movement (e.g. of players) inside this node is liquid-like. + bool liquid_move_physics; // If the content is liquid, this is the flowing version of the liquid. std::string liquid_alternative_flowing; content_t liquid_alternative_flowing_id; @@ -417,31 +447,29 @@ struct ContentFeatures ~ContentFeatures(); void reset(); void serialize(std::ostream &os, u16 protocol_version) const; - void deSerialize(std::istream &is); - - /*! - * Since vertex alpha is no longer supported, this method - * adds opacity directly to the texture pixels. - * - * \param tiles array of the tile definitions. - * \param length length of tiles - */ - void correctAlpha(TileDef *tiles, int length); - -#ifndef SERVER - /* - * Checks if any tile texture has any transparent pixels. - * Prints a warning and returns true if that is the case, false otherwise. - * This is supposed to be used for use_texture_alpha backwards compatibility. - */ - bool textureAlphaCheck(ITextureSource *tsrc, const TileDef *tiles, - int length); -#endif - + void deSerialize(std::istream &is, u16 protocol_version); /* Some handy methods */ + void setDefaultAlphaMode() + { + switch (drawtype) { + case NDT_NORMAL: + case NDT_LIQUID: + case NDT_FLOWINGLIQUID: + alpha = ALPHAMODE_OPAQUE; + break; + case NDT_NODEBOX: + case NDT_MESH: + alpha = ALPHAMODE_LEGACY_COMPAT; // this should eventually be OPAQUE + break; + default: + alpha = ALPHAMODE_CLIP; + break; + } + } + bool needsBackfaceCulling() const { switch (drawtype) { @@ -466,6 +494,12 @@ struct ContentFeatures return (liquid_alternative_flowing_id == f.liquid_alternative_flowing_id); } + bool lightingEquivalent(const ContentFeatures &other) const { + return light_propagates == other.light_propagates + && sunlight_propagates == other.sunlight_propagates + && light_source == other.light_source; + } + int getGroup(const std::string &group) const { return itemgroup_get(groups, group); @@ -475,6 +509,21 @@ struct ContentFeatures void updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc, scene::IMeshManipulator *meshmanip, Client *client, const TextureSettings &tsettings); #endif + +private: +#ifndef SERVER + /* + * Checks if any tile texture has any transparent pixels. + * Prints a warning and returns true if that is the case, false otherwise. + * This is supposed to be used for use_texture_alpha backwards compatibility. + */ + bool textureAlphaCheck(ITextureSource *tsrc, const TileDef *tiles, + int length); +#endif + + void setAlphaFromLegacy(u8 legacy_alpha); + + u8 getAlphaForLegacy() const; }; /*! @@ -506,7 +555,7 @@ public: */ inline const ContentFeatures& get(content_t c) const { return - c < m_content_features.size() ? + (c < m_content_features.size() && !m_content_features[c].name.empty()) ? m_content_features[c] : m_content_features[CONTENT_UNKNOWN]; } @@ -637,13 +686,11 @@ public: * total ContentFeatures. * @param progress_cbk_args passed to the callback function */ - void updateTextures(IGameDef *gamedef, - void (*progress_cbk)(void *progress_args, u32 progress, u32 max_progress), - void *progress_cbk_args); + void updateTextures(IGameDef *gamedef, void *progress_cbk_args); /*! * Writes the content of this manager to the given output stream. - * @param protocol_version serialization version of ContentFeatures + * @param protocol_version Active network protocol version */ void serialize(std::ostream &os, u16 protocol_version) const; @@ -651,8 +698,9 @@ public: * Restores the manager from a serialized stream. * This clears the previous state. * @param is input stream containing a serialized NodeDefManager + * @param protocol_version Active network protocol version */ - void deSerialize(std::istream &is); + void deSerialize(std::istream &is, u16 protocol_version); /*! * Used to indicate that node registration has finished. @@ -702,7 +750,7 @@ private: * @param i a content ID * @param name a node name */ - void addNameIdMapping(content_t i, std::string name); + void addNameIdMapping(content_t i, const std::string &name); /*! * Removes a content ID from all groups. @@ -771,10 +819,13 @@ private: NodeDefManager *createNodeDefManager(); +// NodeResolver: Queue for node names which are then translated +// to content_t after the NodeDefManager was initialized class NodeResolver { public: NodeResolver(); virtual ~NodeResolver(); + // Callback which is run as soon NodeDefManager is ready virtual void resolveNodeNames() = 0; // required because this class is used as mixin for ObjDef @@ -786,12 +837,31 @@ public: bool getIdsFromNrBacklog(std::vector<content_t> *result_out, bool all_required = false, content_t c_fallback = CONTENT_IGNORE); + inline bool isResolveDone() const { return m_resolve_done; } + void reset(bool resolve_done = false); + + // Vector containing all node names in the resolve "queue" + std::vector<std::string> m_nodenames; + // Specifies the "set size" of node names which are to be processed + // this is used for getIdsFromNrBacklog + // TODO: replace or remove + std::vector<size_t> m_nnlistsizes; + +protected: + friend class NodeDefManager; // m_ndef + + const NodeDefManager *m_ndef = nullptr; + // Index of the next "m_nodenames" entry to resolve + u32 m_nodenames_idx = 0; + +private: +#if BUILD_UNITTESTS + // Unittest requires access to m_resolve_done + friend class TestSchematic; +#endif void nodeResolveInternal(); - u32 m_nodenames_idx = 0; + // Index of the next "m_nnlistsizes" entry to process u32 m_nnlistsizes_idx = 0; - std::vector<std::string> m_nodenames; - std::vector<size_t> m_nnlistsizes; - const NodeDefManager *m_ndef = nullptr; bool m_resolve_done = false; }; diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp index b84ffc8cb..b5052c3b8 100644 --- a/src/nodemetadata.cpp +++ b/src/nodemetadata.cpp @@ -49,8 +49,8 @@ void NodeMetadata::serialize(std::ostream &os, u8 version, bool disk) const if (!disk && priv) continue; - os << serializeString(sv.first); - os << serializeLongString(sv.second); + os << serializeString16(sv.first); + os << serializeString32(sv.second); if (version >= 2) writeU8(os, (priv) ? 1 : 0); } @@ -63,8 +63,8 @@ void NodeMetadata::deSerialize(std::istream &is, u8 version) clear(); int num_vars = readU32(is); for(int i=0; i<num_vars; i++){ - std::string name = deSerializeString(is); - std::string var = deSerializeLongString(is); + std::string name = deSerializeString16(is); + std::string var = deSerializeString32(is); m_stringvars[name] = var; if (version >= 2) { if (readU8(is) == 1) @@ -113,13 +113,13 @@ int NodeMetadata::countNonPrivate() const */ void NodeMetadataList::serialize(std::ostream &os, u8 blockver, bool disk, - bool absolute_pos) const + bool absolute_pos, bool include_empty) const { /* Version 0 is a placeholder for "nothing to see here; go away." */ - u16 count = countNonEmpty(); + u16 count = include_empty ? m_data.size() : countNonEmpty(); if (count == 0) { writeU8(os, 0); // version return; @@ -134,7 +134,7 @@ void NodeMetadataList::serialize(std::ostream &os, u8 blockver, bool disk, i != m_data.end(); ++i) { v3s16 p = i->first; NodeMetadata *data = i->second; - if (data->empty()) + if (!include_empty && data->empty()) continue; if (absolute_pos) { @@ -206,10 +206,9 @@ NodeMetadataList::~NodeMetadataList() std::vector<v3s16> NodeMetadataList::getAllKeys() { std::vector<v3s16> keys; - - NodeMetadataMap::const_iterator it; - for (it = m_data.begin(); it != m_data.end(); ++it) - keys.push_back(it->first); + keys.reserve(m_data.size()); + for (const auto &it : m_data) + keys.push_back(it.first); return keys; } @@ -218,7 +217,7 @@ NodeMetadata *NodeMetadataList::get(v3s16 p) { NodeMetadataMap::const_iterator n = m_data.find(p); if (n == m_data.end()) - return NULL; + return nullptr; return n->second; } @@ -235,7 +234,7 @@ void NodeMetadataList::remove(v3s16 p) void NodeMetadataList::set(v3s16 p, NodeMetadata *d) { remove(p); - m_data.insert(std::make_pair(p, d)); + m_data.emplace(p, d); } void NodeMetadataList::clear() @@ -251,9 +250,8 @@ void NodeMetadataList::clear() int NodeMetadataList::countNonEmpty() const { int n = 0; - NodeMetadataMap::const_iterator it; - for (it = m_data.begin(); it != m_data.end(); ++it) { - if (!it->second->empty()) + for (const auto &it : m_data) { + if (!it.second->empty()) n++; } return n; diff --git a/src/nodemetadata.h b/src/nodemetadata.h index c028caf88..4b5b4d887 100644 --- a/src/nodemetadata.h +++ b/src/nodemetadata.h @@ -82,7 +82,7 @@ public: ~NodeMetadataList(); void serialize(std::ostream &os, u8 blockver, bool disk = true, - bool absolute_pos = false) const; + bool absolute_pos = false, bool include_empty = false) const; void deSerialize(std::istream &is, IItemDefManager *item_def_mgr, bool absolute_pos = false); diff --git a/src/noise.cpp b/src/noise.cpp index e16564b05..99624f80d 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -35,16 +35,8 @@ #define NOISE_MAGIC_X 1619 #define NOISE_MAGIC_Y 31337 #define NOISE_MAGIC_Z 52591 -#define NOISE_MAGIC_SEED 1013 - -typedef float (*Interp2dFxn)( - float v00, float v10, float v01, float v11, - float x, float y); - -typedef float (*Interp3dFxn)( - float v000, float v100, float v010, float v110, - float v001, float v101, float v011, float v111, - float x, float y, float z); +// Unsigned magic seed prevents undefined behavior. +#define NOISE_MAGIC_SEED 1013U FlagDesc flagdesc_noiseparams[] = { {"defaults", NOISE_FLAG_DEFAULTS}, @@ -197,47 +189,34 @@ inline float linearInterpolation(float v0, float v1, float t) inline float biLinearInterpolation( float v00, float v10, float v01, float v11, - float x, float y) -{ - float tx = easeCurve(x); - float ty = easeCurve(y); - float u = linearInterpolation(v00, v10, tx); - float v = linearInterpolation(v01, v11, tx); - return linearInterpolation(u, v, ty); -} - - -inline float biLinearInterpolationNoEase( - float v00, float v10, - float v01, float v11, - float x, float y) + float x, float y, + bool eased) { + // Inlining will optimize this branch out when possible + if (eased) { + x = easeCurve(x); + y = easeCurve(y); + } float u = linearInterpolation(v00, v10, x); float v = linearInterpolation(v01, v11, x); return linearInterpolation(u, v, y); } -float triLinearInterpolation( +inline float triLinearInterpolation( float v000, float v100, float v010, float v110, float v001, float v101, float v011, float v111, - float x, float y, float z) + float x, float y, float z, + bool eased) { - float tx = easeCurve(x); - float ty = easeCurve(y); - float tz = easeCurve(z); - float u = biLinearInterpolationNoEase(v000, v100, v010, v110, tx, ty); - float v = biLinearInterpolationNoEase(v001, v101, v011, v111, tx, ty); - return linearInterpolation(u, v, tz); -} - -float triLinearInterpolationNoEase( - float v000, float v100, float v010, float v110, - float v001, float v101, float v011, float v111, - float x, float y, float z) -{ - float u = biLinearInterpolationNoEase(v000, v100, v010, v110, x, y); - float v = biLinearInterpolationNoEase(v001, v101, v011, v111, x, y); + // Inlining will optimize this branch out when possible + if (eased) { + x = easeCurve(x); + y = easeCurve(y); + z = easeCurve(z); + } + float u = biLinearInterpolation(v000, v100, v010, v110, x, y, false); + float v = biLinearInterpolation(v001, v101, v011, v111, x, y, false); return linearInterpolation(u, v, z); } @@ -255,10 +234,7 @@ float noise2d_gradient(float x, float y, s32 seed, bool eased) float v01 = noise2d(x0, y0+1, seed); float v11 = noise2d(x0+1, y0+1, seed); // Interpolate - if (eased) - return biLinearInterpolation(v00, v10, v01, v11, xl, yl); - - return biLinearInterpolationNoEase(v00, v10, v01, v11, xl, yl); + return biLinearInterpolation(v00, v10, v01, v11, xl, yl, eased); } @@ -282,17 +258,11 @@ float noise3d_gradient(float x, float y, float z, s32 seed, bool eased) float v011 = noise3d(x0, y0 + 1, z0 + 1, seed); float v111 = noise3d(x0 + 1, y0 + 1, z0 + 1, seed); // Interpolate - if (eased) { - return triLinearInterpolation( - v000, v100, v010, v110, - v001, v101, v011, v111, - xl, yl, zl); - } - - return triLinearInterpolationNoEase( + return triLinearInterpolation( v000, v100, v010, v110, v001, v101, v011, v111, - xl, yl, zl); + xl, yl, zl, + eased); } @@ -312,51 +282,6 @@ float noise2d_perlin(float x, float y, s32 seed, } -float noise2d_perlin_abs(float x, float y, s32 seed, - int octaves, float persistence, bool eased) -{ - float a = 0; - float f = 1.0; - float g = 1.0; - for (int i = 0; i < octaves; i++) { - a += g * std::fabs(noise2d_gradient(x * f, y * f, seed + i, eased)); - f *= 2.0; - g *= persistence; - } - return a; -} - - -float noise3d_perlin(float x, float y, float z, s32 seed, - int octaves, float persistence, bool eased) -{ - float a = 0; - float f = 1.0; - float g = 1.0; - for (int i = 0; i < octaves; i++) { - a += g * noise3d_gradient(x * f, y * f, z * f, seed + i, eased); - f *= 2.0; - g *= persistence; - } - return a; -} - - -float noise3d_perlin_abs(float x, float y, float z, s32 seed, - int octaves, float persistence, bool eased) -{ - float a = 0; - float f = 1.0; - float g = 1.0; - for (int i = 0; i < octaves; i++) { - a += g * std::fabs(noise3d_gradient(x * f, y * f, z * f, seed + i, eased)); - f *= 2.0; - g *= persistence; - } - return a; -} - - float contour(float v) { v = std::fabs(v); @@ -369,7 +294,7 @@ float contour(float v) ///////////////////////// [ New noise ] //////////////////////////// -float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed) +float NoisePerlin2D(const NoiseParams *np, float x, float y, s32 seed) { float a = 0; float f = 1.0; @@ -395,7 +320,7 @@ float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed) } -float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed) +float NoisePerlin3D(const NoiseParams *np, float x, float y, float z, s32 seed) { float a = 0; float f = 1.0; @@ -422,7 +347,7 @@ float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed) } -Noise::Noise(NoiseParams *np_, s32 seed, u32 sx, u32 sy, u32 sz) +Noise::Noise(const NoiseParams *np_, s32 seed, u32 sx, u32 sy, u32 sz) { np = *np_; this->seed = seed; @@ -562,9 +487,6 @@ void Noise::gradientMap2D( s32 x0, y0; bool eased = np.flags & (NOISE_FLAG_DEFAULTS | NOISE_FLAG_EASED); - Interp2dFxn interpolate = eased ? - biLinearInterpolation : biLinearInterpolationNoEase; - x0 = std::floor(x); y0 = std::floor(y); u = x - (float)x0; @@ -591,7 +513,8 @@ void Noise::gradientMap2D( u = orig_u; noisex = 0; for (i = 0; i != sx; i++) { - gradient_buf[index++] = interpolate(v00, v10, v01, v11, u, v); + gradient_buf[index++] = + biLinearInterpolation(v00, v10, v01, v11, u, v, eased); u += step_x; if (u >= 1.0) { @@ -627,8 +550,7 @@ void Noise::gradientMap3D( u32 nlx, nly, nlz; s32 x0, y0, z0; - Interp3dFxn interpolate = (np.flags & NOISE_FLAG_EASED) ? - triLinearInterpolation : triLinearInterpolationNoEase; + bool eased = np.flags & NOISE_FLAG_EASED; x0 = std::floor(x); y0 = std::floor(y); @@ -669,10 +591,11 @@ void Noise::gradientMap3D( u = orig_u; noisex = 0; for (i = 0; i != sx; i++) { - gradient_buf[index++] = interpolate( + gradient_buf[index++] = triLinearInterpolation( v000, v100, v010, v110, v001, v101, v011, v111, - u, v, w); + u, v, w, + eased); u += step_x; if (u >= 1.0) { diff --git a/src/noise.h b/src/noise.h index 613879890..e4a9ed6c7 100644 --- a/src/noise.h +++ b/src/noise.h @@ -146,7 +146,7 @@ public: float *persist_buf = nullptr; float *result = nullptr; - Noise(NoiseParams *np, s32 seed, u32 sx, u32 sy, u32 sz=1); + Noise(const NoiseParams *np, s32 seed, u32 sx, u32 sy, u32 sz=1); ~Noise(); void setSize(u32 sx, u32 sy, u32 sz=1); @@ -192,8 +192,8 @@ private: }; -float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed); -float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed); +float NoisePerlin2D(const NoiseParams *np, float x, float y, s32 seed); +float NoisePerlin3D(const NoiseParams *np, float x, float y, float z, s32 seed); inline float NoisePerlin2D_PO(NoiseParams *np, float x, float xoff, float y, float yoff, s32 seed) @@ -224,15 +224,6 @@ float noise3d_gradient(float x, float y, float z, s32 seed, bool eased=false); float noise2d_perlin(float x, float y, s32 seed, int octaves, float persistence, bool eased=true); -float noise2d_perlin_abs(float x, float y, s32 seed, - int octaves, float persistence, bool eased=true); - -float noise3d_perlin(float x, float y, float z, s32 seed, - int octaves, float persistence, bool eased=false); - -float noise3d_perlin_abs(float x, float y, float z, s32 seed, - int octaves, float persistence, bool eased=false); - inline float easeCurve(float t) { return t * t * t * (t * (6.f * t - 15.f) + 10.f); diff --git a/src/object_properties.cpp b/src/object_properties.cpp index 8d51bcbfa..c7f6becf0 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -24,9 +24,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/basic_macros.h" #include <sstream> +static const video::SColor NULL_BGCOLOR{0, 1, 1, 1}; + ObjectProperties::ObjectProperties() { - textures.emplace_back("unknown_object.png"); + textures.emplace_back("no_texture.png"); colors.emplace_back(255,255,255,255); } @@ -62,6 +64,13 @@ std::string ObjectProperties::dump() os << ", nametag=" << nametag; os << ", nametag_color=" << "\"" << nametag_color.getAlpha() << "," << nametag_color.getRed() << "," << nametag_color.getGreen() << "," << nametag_color.getBlue() << "\" "; + + if (nametag_bgcolor) + os << ", nametag_bgcolor=" << "\"" << nametag_color.getAlpha() << "," << nametag_color.getRed() + << "," << nametag_color.getGreen() << "," << nametag_color.getBlue() << "\" "; + else + os << ", nametag_bgcolor=null "; + os << ", selectionbox=" << PP(selectionbox.MinEdge) << "," << PP(selectionbox.MaxEdge); os << ", pointable=" << pointable; os << ", static_save=" << static_save; @@ -70,9 +79,43 @@ std::string ObjectProperties::dump() os << ", use_texture_alpha=" << use_texture_alpha; os << ", damage_texture_modifier=" << damage_texture_modifier; os << ", shaded=" << shaded; + os << ", show_on_minimap=" << show_on_minimap; return os.str(); } +bool ObjectProperties::validate() +{ + const char *func = "ObjectProperties::validate(): "; + bool ret = true; + + // cf. where serializeString16 is used below + for (u32 i = 0; i < textures.size(); i++) { + if (textures[i].size() > U16_MAX) { + warningstream << func << "texture " << (i+1) << " has excessive length, " + "clearing it." << std::endl; + textures[i].clear(); + ret = false; + } + } + if (nametag.length() > U16_MAX) { + warningstream << func << "nametag has excessive length, clearing it." << std::endl; + nametag.clear(); + ret = false; + } + if (infotext.length() > U16_MAX) { + warningstream << func << "infotext has excessive length, clearing it." << std::endl; + infotext.clear(); + ret = false; + } + if (wield_item.length() > U16_MAX) { + warningstream << func << "wield_item has excessive length, clearing it." << std::endl; + wield_item.clear(); + ret = false; + } + + return ret; +} + void ObjectProperties::serialize(std::ostream &os) const { writeU8(os, 4); // PROTOCOL_VERSION >= 37 @@ -84,19 +127,18 @@ void ObjectProperties::serialize(std::ostream &os) const writeV3F32(os, selectionbox.MinEdge); writeV3F32(os, selectionbox.MaxEdge); writeU8(os, pointable); - os << serializeString(visual); + os << serializeString16(visual); writeV3F32(os, visual_size); writeU16(os, textures.size()); for (const std::string &texture : textures) { - os << serializeString(texture); + os << serializeString16(texture); } writeV2S16(os, spritediv); writeV2S16(os, initial_sprite_basepos); writeU8(os, is_visible); writeU8(os, makes_footstep_sound); writeF32(os, automatic_rotate); - // Added in protocol version 14 - os << serializeString(mesh); + os << serializeString16(mesh); writeU16(os, colors.size()); for (video::SColor color : colors) { writeARGB8(os, color); @@ -106,18 +148,26 @@ void ObjectProperties::serialize(std::ostream &os) const writeU8(os, automatic_face_movement_dir); writeF32(os, automatic_face_movement_dir_offset); writeU8(os, backface_culling); - os << serializeString(nametag); + os << serializeString16(nametag); writeARGB8(os, nametag_color); writeF32(os, automatic_face_movement_max_rotation_per_sec); - os << serializeString(infotext); - os << serializeString(wield_item); + os << serializeString16(infotext); + os << serializeString16(wield_item); writeS8(os, glow); writeU16(os, breath_max); writeF32(os, eye_height); writeF32(os, zoom_fov); writeU8(os, use_texture_alpha); - os << serializeString(damage_texture_modifier); + os << serializeString16(damage_texture_modifier); writeU8(os, shaded); + writeU8(os, show_on_minimap); + + if (!nametag_bgcolor) + writeARGB8(os, NULL_BGCOLOR); + else if (nametag_bgcolor.value().getAlpha() == 0) + writeARGB8(os, video::SColor(0, 0, 0, 0)); + else + writeARGB8(os, nametag_bgcolor.value()); // Add stuff only at the bottom. // Never remove anything, because we don't want new versions of this @@ -137,19 +187,19 @@ void ObjectProperties::deSerialize(std::istream &is) selectionbox.MinEdge = readV3F32(is); selectionbox.MaxEdge = readV3F32(is); pointable = readU8(is); - visual = deSerializeString(is); + visual = deSerializeString16(is); visual_size = readV3F32(is); textures.clear(); u32 texture_count = readU16(is); for (u32 i = 0; i < texture_count; i++){ - textures.push_back(deSerializeString(is)); + textures.push_back(deSerializeString16(is)); } spritediv = readV2S16(is); initial_sprite_basepos = readV2S16(is); is_visible = readU8(is); makes_footstep_sound = readU8(is); automatic_rotate = readF32(is); - mesh = deSerializeString(is); + mesh = deSerializeString16(is); colors.clear(); u32 color_count = readU16(is); for (u32 i = 0; i < color_count; i++){ @@ -160,21 +210,31 @@ void ObjectProperties::deSerialize(std::istream &is) automatic_face_movement_dir = readU8(is); automatic_face_movement_dir_offset = readF32(is); backface_culling = readU8(is); - nametag = deSerializeString(is); + nametag = deSerializeString16(is); nametag_color = readARGB8(is); automatic_face_movement_max_rotation_per_sec = readF32(is); - infotext = deSerializeString(is); - wield_item = deSerializeString(is); + infotext = deSerializeString16(is); + wield_item = deSerializeString16(is); glow = readS8(is); breath_max = readU16(is); eye_height = readF32(is); zoom_fov = readF32(is); use_texture_alpha = readU8(is); try { - damage_texture_modifier = deSerializeString(is); + damage_texture_modifier = deSerializeString16(is); u8 tmp = readU8(is); if (is.eof()) - throw SerializationError(""); + return; shaded = tmp; + tmp = readU8(is); + if (is.eof()) + return; + show_on_minimap = tmp; + + auto bgcolor = readARGB8(is); + if (bgcolor != NULL_BGCOLOR) + nametag_bgcolor = bgcolor; + else + nametag_bgcolor = nullopt; } catch (SerializationError &e) {} } diff --git a/src/object_properties.h b/src/object_properties.h index f010c1daf..79866a22c 100644 --- a/src/object_properties.h +++ b/src/object_properties.h @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <iostream> #include <map> #include <vector> +#include "util/Optional.h" struct ObjectProperties { @@ -53,6 +54,7 @@ struct ObjectProperties s8 glow = 0; std::string nametag = ""; video::SColor nametag_color = video::SColor(255, 255, 255, 255); + Optional<video::SColor> nametag_bgcolor = nullopt; f32 automatic_face_movement_max_rotation_per_sec = -1.0f; std::string infotext; //! For dropped items, this contains item information. @@ -62,9 +64,12 @@ struct ObjectProperties float zoom_fov = 0.0f; bool use_texture_alpha = false; bool shaded = true; + bool show_on_minimap = false; ObjectProperties(); std::string dump(); + // check limits of some important properties (strings) that'd cause exceptions later on + bool validate(); void serialize(std::ostream &os) const; void deSerialize(std::istream &is); }; diff --git a/src/particles.cpp b/src/particles.cpp index fd81238dc..19b3418b7 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -18,7 +18,103 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "particles.h" -#include "util/serialize.h" +#include <type_traits> +using namespace ParticleParamTypes; + +#define PARAM_PVFN(n) ParticleParamTypes::n##ParameterValue +v2f PARAM_PVFN(pick) (float* f, const v2f a, const v2f b) { + return v2f( + numericalBlend(f[0], a.X, b.X), + numericalBlend(f[1], a.Y, b.Y) + ); +} + +v3f PARAM_PVFN(pick) (float* f, const v3f a, const v3f b) { + return v3f( + numericalBlend(f[0], a.X, b.X), + numericalBlend(f[1], a.Y, b.Y), + numericalBlend(f[2], a.Z, b.Z) + ); +} + +v2f PARAM_PVFN(interpolate) (float fac, const v2f a, const v2f b) + { return b.getInterpolated(a, fac); } +v3f PARAM_PVFN(interpolate) (float fac, const v3f a, const v3f b) + { return b.getInterpolated(a, fac); } + +#define PARAM_DEF_SRZR(T, wr, rd) \ + void PARAM_PVFN(serialize) (std::ostream& os, T v) {wr(os,v); } \ + void PARAM_PVFN(deSerialize)(std::istream& is, T& v) {v = rd(is);} + + +#define PARAM_DEF_NUM(T, wr, rd) PARAM_DEF_SRZR(T, wr, rd) \ + T PARAM_PVFN(interpolate)(float fac, const T a, const T b) \ + { return numericalBlend<T>(fac,a,b); } \ + T PARAM_PVFN(pick) (float* f, const T a, const T b) \ + { return numericalBlend<T>(f[0],a,b); } + +PARAM_DEF_NUM(u8, writeU8, readU8); PARAM_DEF_NUM(s8, writeS8, readS8); +PARAM_DEF_NUM(u16, writeU16, readU16); PARAM_DEF_NUM(s16, writeS16, readS16); +PARAM_DEF_NUM(u32, writeU32, readU32); PARAM_DEF_NUM(s32, writeS32, readS32); +PARAM_DEF_NUM(f32, writeF32, readF32); +PARAM_DEF_SRZR(v2f, writeV2F32, readV2F32); +PARAM_DEF_SRZR(v3f, writeV3F32, readV3F32); + +enum class ParticleTextureFlags : u8 { + /* each value specifies a bit in a bitmask; if the maximum value + * goes above 1<<7 the type of the flags field must be changed + * from u8, which will necessitate a protocol change! */ + + // the first bit indicates whether the texture is animated + animated = 1, + + /* the next three bits indicate the blending mode of the texture + * blendmode is encoded by (flags |= (u8)blend << 1); retrieve with + * (flags & ParticleTextureFlags::blend) >> 1. note that the third + * bit is currently reserved for adding more blend modes in the future */ + blend = 0x7 << 1, +}; + +/* define some shorthand so we don't have to repeat ourselves or use + * decltype everywhere */ +using FlagT = std::underlying_type_t<ParticleTextureFlags>; + +void ServerParticleTexture::serialize(std::ostream &os, u16 protocol_ver, bool newPropertiesOnly) const +{ + /* newPropertiesOnly is used to de/serialize parameters of the legacy texture + * field, which are encoded separately from the texspec string */ + FlagT flags = 0; + if (animated) + flags |= FlagT(ParticleTextureFlags::animated); + if (blendmode != BlendMode::alpha) + flags |= FlagT(blendmode) << 1; + serializeParameterValue(os, flags); + + alpha.serialize(os); + scale.serialize(os); + if (!newPropertiesOnly) + os << serializeString32(string); + + if (animated) + animation.serialize(os, protocol_ver); +} + +void ServerParticleTexture::deSerialize(std::istream &is, u16 protocol_ver, bool newPropertiesOnly) +{ + FlagT flags = 0; + deSerializeParameterValue(is, flags); + + animated = !!(flags & FlagT(ParticleTextureFlags::animated)); + blendmode = BlendMode((flags & FlagT(ParticleTextureFlags::blend)) >> 1); + + alpha.deSerialize(is); + scale.deSerialize(is); + if (!newPropertiesOnly) + string = deSerializeString32(is); + + if (animated) + animation.deSerialize(is, protocol_ver); +} void ParticleParameters::serialize(std::ostream &os, u16 protocol_ver) const { @@ -28,7 +124,7 @@ void ParticleParameters::serialize(std::ostream &os, u16 protocol_ver) const writeF32(os, expirationtime); writeF32(os, size); writeU8(os, collisiondetection); - os << serializeLongString(texture); + os << serializeString32(texture.string); writeU8(os, vertical); writeU8(os, collision_removal); animation.serialize(os, 6); /* NOT the protocol ver */ @@ -37,6 +133,20 @@ void ParticleParameters::serialize(std::ostream &os, u16 protocol_ver) const writeU16(os, node.param0); writeU8(os, node.param2); writeU8(os, node_tile); + writeV3F32(os, drag); + jitter.serialize(os); + bounce.serialize(os); +} + +template <typename T, T (reader)(std::istream& is)> +inline bool streamEndsBeforeParam(T& val, std::istream& is) +{ + // This is kinda awful + T tmp = reader(is); + if (is.eof()) + return true; + val = tmp; + return false; } void ParticleParameters::deSerialize(std::istream &is, u16 protocol_ver) @@ -47,17 +157,20 @@ void ParticleParameters::deSerialize(std::istream &is, u16 protocol_ver) expirationtime = readF32(is); size = readF32(is); collisiondetection = readU8(is); - texture = deSerializeLongString(is); + texture.string = deSerializeString32(is); vertical = readU8(is); collision_removal = readU8(is); animation.deSerialize(is, 6); /* NOT the protocol ver */ glow = readU8(is); object_collision = readU8(is); - // This is kinda awful - u16 tmp_param0 = readU16(is); - if (is.eof()) + + if (streamEndsBeforeParam<u16, readU16>(node.param0, is)) return; - node.param0 = tmp_param0; node.param2 = readU8(is); node_tile = readU8(is); + + if (streamEndsBeforeParam<v3f, readV3F32>(drag, is)) + return; + jitter.deSerialize(is); + bounce.deSerialize(is); } diff --git a/src/particles.h b/src/particles.h index 6f518b771..3061deb83 100644 --- a/src/particles.h +++ b/src/particles.h @@ -20,19 +20,350 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include <string> +#include <sstream> +#include <vector> +#include <ctgmath> +#include <type_traits> #include "irrlichttypes_bloated.h" #include "tileanimation.h" #include "mapnode.h" +#include "util/serialize.h" +#include "util/numeric.h" // This file defines the particle-related structures that both the server and // client need. The ParticleManager and rendering is in client/particles.h -struct CommonParticleParams { +namespace ParticleParamTypes +{ + template <bool cond, typename T> + using enableIf = typename std::enable_if<cond, T>::type; + // std::enable_if_t does not appear to be present in GCC???? + // std::is_enum_v also missing. wtf. these are supposed to be + // present as of c++14 + + template<typename T> using BlendFunction = T(float,T,T); + #define DECL_PARAM_SRZRS(type) \ + void serializeParameterValue (std::ostream& os, type v); \ + void deSerializeParameterValue(std::istream& is, type& r); + #define DECL_PARAM_OVERLOADS(type) DECL_PARAM_SRZRS(type) \ + type interpolateParameterValue(float fac, const type a, const type b); \ + type pickParameterValue (float* facs, const type a, const type b); + + DECL_PARAM_OVERLOADS(u8); DECL_PARAM_OVERLOADS(s8); + DECL_PARAM_OVERLOADS(u16); DECL_PARAM_OVERLOADS(s16); + DECL_PARAM_OVERLOADS(u32); DECL_PARAM_OVERLOADS(s32); + DECL_PARAM_OVERLOADS(f32); + DECL_PARAM_OVERLOADS(v2f); + DECL_PARAM_OVERLOADS(v3f); + + /* C++ is a strongly typed language. this means that enums cannot be implicitly + * cast to integers, as they can be in C. while this may sound good in principle, + * it means that our normal serialization functions cannot be called on + * enumerations unless they are explicitly cast to a particular type first. this + * is problematic, because in C++ enums can have any integral type as an underlying + * type, and that type would need to be named everywhere an enumeration is + * de/serialized. + * + * this is obviously not cool, both in terms of writing legible, succinct code, + * and in terms of robustness: the underlying type might be changed at some point, + * e.g. if a bitmask gets too big for its britches. we could use an equivalent of + * `std::to_underlying(value)` everywhere we need to deal with enumerations, but + * that's hideous and unintuitive. instead, we supply the following functions to + * transparently map enumeration types to their underlying values. */ + + template <typename E, enableIf<std::is_enum<E>::value, bool> = true> + void serializeParameterValue(std::ostream& os, E k) { + serializeParameterValue(os, (std::underlying_type_t<E>)k); + } + + template <typename E, enableIf<std::is_enum<E>::value, bool> = true> + void deSerializeParameterValue(std::istream& is, E& k) { + std::underlying_type_t<E> v; + deSerializeParameterValue(is, v); + k = (E)v; + } + + /* this is your brain on C++. */ + + template <typename T, size_t PN> + struct Parameter + { + using ValType = T; + using pickFactors = float[PN]; + + T val = T(); + using This = Parameter<T, PN>; + + Parameter() = default; + + template <typename... Args> + Parameter(Args... args) : val(args...) {} + + virtual void serialize(std::ostream &os) const + { serializeParameterValue (os, this->val); } + virtual void deSerialize(std::istream &is) + { deSerializeParameterValue(is, this->val); } + + virtual T interpolate(float fac, const This& against) const + { + return interpolateParameterValue(fac, this->val, against.val); + } + + static T pick(float* f, const This& a, const This& b) + { + return pickParameterValue(f, a.val, b.val); + } + + operator T() const { return val; } + T operator=(T b) { return val = b; } + + }; + + template <typename T> T numericalBlend(float fac, T min, T max) + { return min + ((max - min) * fac); } + + template <typename T, size_t N> + struct VectorParameter : public Parameter<T,N> { + using This = VectorParameter<T,N>; + template <typename... Args> + VectorParameter(Args... args) : Parameter<T,N>(args...) {} + }; + + template <typename T, size_t PN> + inline std::string dump(const Parameter<T,PN>& p) + { + return std::to_string(p.val); + } + + template <typename T, size_t N> + inline std::string dump(const VectorParameter<T,N>& v) + { + std::ostringstream oss; + if (N == 3) + oss << PP(v.val); + else + oss << PP2(v.val); + return oss.str(); + } + + using u8Parameter = Parameter<u8, 1>; using s8Parameter = Parameter<s8, 1>; + using u16Parameter = Parameter<u16, 1>; using s16Parameter = Parameter<s16, 1>; + using u32Parameter = Parameter<u32, 1>; using s32Parameter = Parameter<s32, 1>; + + using f32Parameter = Parameter<f32, 1>; + + using v2fParameter = VectorParameter<v2f, 2>; + using v3fParameter = VectorParameter<v3f, 3>; + + template <typename T> + struct RangedParameter + { + using ValType = T; + using This = RangedParameter<T>; + + T min, max; + f32 bias = 0; + + RangedParameter() = default; + RangedParameter(T _min, T _max) : min(_min), max(_max) {} + template <typename M> RangedParameter(M b) : min(b), max(b) {} + + // these functions handle the old range serialization "format"; bias must + // be manually encoded in a separate part of the stream. NEVER ADD FIELDS + // TO THESE FUNCTIONS + void legacySerialize(std::ostream& os) const + { + min.serialize(os); + max.serialize(os); + } + void legacyDeSerialize(std::istream& is) + { + min.deSerialize(is); + max.deSerialize(is); + } + + // these functions handle the format used by new fields. new fields go here + void serialize(std::ostream &os) const + { + legacySerialize(os); + writeF32(os, bias); + } + void deSerialize(std::istream &is) + { + legacyDeSerialize(is); + bias = readF32(is); + } + + This interpolate(float fac, const This against) const + { + This r; + r.min = min.interpolate(fac, against.min); + r.max = max.interpolate(fac, against.max); + r.bias = bias; + return r; + } + + T pickWithin() const + { + typename T::pickFactors values; + auto p = numericAbsolute(bias) + 1; + for (size_t i = 0; i < sizeof(values) / sizeof(values[0]); ++i) { + if (bias < 0) + values[i] = 1.0f - pow(myrand_float(), p); + else + values[i] = pow(myrand_float(), p); + } + return T::pick(values, min, max); + } + + }; + + template <typename T> + inline std::string dump(const RangedParameter<T>& r) + { + std::ostringstream s; + s << "range<" << dump(r.min) << " ~ " << dump(r.max); + if (r.bias != 0) + s << " :: " << r.bias; + s << ">"; + return s.str(); + } + + enum class TweenStyle : u8 { fwd, rev, pulse, flicker }; + + template <typename T> + struct TweenedParameter + { + using ValType = T; + using This = TweenedParameter<T>; + + TweenStyle style = TweenStyle::fwd; + u16 reps = 1; + f32 beginning = 0.0f; + + T start, end; + + TweenedParameter() = default; + TweenedParameter(T _start, T _end) : start(_start), end(_end) {} + template <typename M> TweenedParameter(M b) : start(b), end(b) {} + + T blend(float fac) const + { + // warp time coordinates in accordance w/ settings + if (fac > beginning) { + // remap for beginning offset + auto len = 1 - beginning; + fac -= beginning; + fac /= len; + + // remap for repetitions + fac *= reps; + if (fac > 1) // poor man's modulo + fac -= (decltype(reps))fac; + + // remap for style + switch (style) { + case TweenStyle::fwd: /* do nothing */ break; + case TweenStyle::rev: fac = 1.0f - fac; break; + case TweenStyle::pulse: + case TweenStyle::flicker: { + if (fac > 0.5f) { + fac = 1.f - (fac*2.f - 1.f); + } else { + fac = fac * 2; + } + if (style == TweenStyle::flicker) { + fac *= myrand_range(0.7f, 1.0f); + } + } + } + if (fac>1.f) + fac = 1.f; + else if (fac<0.f) + fac = 0.f; + } else { + fac = (style == TweenStyle::rev) ? 1.f : 0.f; + } + + return start.interpolate(fac, end); + } + + void serialize(std::ostream &os) const + { + writeU8(os, static_cast<u8>(style)); + writeU16(os, reps); + writeF32(os, beginning); + start.serialize(os); + end.serialize(os); + } + void deSerialize(std::istream &is) + { + style = static_cast<TweenStyle>(readU8(is)); + reps = readU16(is); + beginning = readF32(is); + start.deSerialize(is); + end.deSerialize(is); + } + }; + + template <typename T> + inline std::string dump(const TweenedParameter<T>& t) + { + std::ostringstream s; + const char* icon; + switch (t.style) { + case TweenStyle::fwd: icon = "→"; break; + case TweenStyle::rev: icon = "←"; break; + case TweenStyle::pulse: icon = "↔"; break; + case TweenStyle::flicker: icon = "↯"; break; + } + s << "tween<"; + if (t.reps != 1) + s << t.reps << "x "; + s << dump(t.start) << " "<<icon<<" " << dump(t.end) << ">"; + return s.str(); + } + + enum class AttractorKind : u8 { none, point, line, plane }; + enum class BlendMode : u8 { alpha, add, sub, screen }; + + // these are consistently-named convenience aliases to make code more readable without `using ParticleParamTypes` declarations + using v3fRange = RangedParameter<v3fParameter>; + using f32Range = RangedParameter<f32Parameter>; + + using v2fTween = TweenedParameter<v2fParameter>; + using v3fTween = TweenedParameter<v3fParameter>; + using f32Tween = TweenedParameter<f32Parameter>; + using v3fRangeTween = TweenedParameter<v3fRange>; + using f32RangeTween = TweenedParameter<f32Range>; + + #undef DECL_PARAM_SRZRS + #undef DECL_PARAM_OVERLOADS +} + +struct ParticleTexture +{ + bool animated = false; + ParticleParamTypes::BlendMode blendmode = ParticleParamTypes::BlendMode::alpha; + TileAnimationParams animation; + ParticleParamTypes::f32Tween alpha{1.0f}; + ParticleParamTypes::v2fTween scale{v2f(1.0f)}; +}; + +struct ServerParticleTexture : public ParticleTexture +{ + std::string string; + void serialize(std::ostream &os, u16 protocol_ver, bool newPropertiesOnly = false) const; + void deSerialize(std::istream &is, u16 protocol_ver, bool newPropertiesOnly = false); +}; + +struct CommonParticleParams +{ bool collisiondetection = false; bool collision_removal = false; bool object_collision = false; bool vertical = false; - std::string texture; + ServerParticleTexture texture; struct TileAnimationParams animation; u8 glow = 0; MapNode node; @@ -58,22 +389,42 @@ struct CommonParticleParams { } }; -struct ParticleParameters : CommonParticleParams { - v3f pos; - v3f vel; - v3f acc; - f32 expirationtime = 1; - f32 size = 1; +struct ParticleParameters : CommonParticleParams +{ + v3f pos, vel, acc, drag; + f32 size = 1, expirationtime = 1; + ParticleParamTypes::f32Range bounce; + ParticleParamTypes::v3fRange jitter; void serialize(std::ostream &os, u16 protocol_ver) const; void deSerialize(std::istream &is, u16 protocol_ver); }; -struct ParticleSpawnerParameters : CommonParticleParams { +struct ParticleSpawnerParameters : CommonParticleParams +{ u16 amount = 1; - v3f minpos, maxpos, minvel, maxvel, minacc, maxacc; f32 time = 1; - f32 minexptime = 1, maxexptime = 1, minsize = 1, maxsize = 1; + + std::vector<ServerParticleTexture> texpool; + + ParticleParamTypes::v3fRangeTween + pos, vel, acc, drag, radius, jitter; + + ParticleParamTypes::AttractorKind + attractor_kind; + ParticleParamTypes::v3fTween + attractor_origin, attractor_direction; + // object IDs + u16 attractor_attachment = 0, + attractor_direction_attachment = 0; + // do particles disappear when they cross the attractor threshold? + bool attractor_kill = true; + + ParticleParamTypes::f32RangeTween + exptime{1.0f}, + size {1.0f}, + attract{0.0f}, + bounce {0.0f}; // For historical reasons no (de-)serialization methods here }; diff --git a/src/pathfinder.cpp b/src/pathfinder.cpp index 3f0b98c10..c45ce9158 100644 --- a/src/pathfinder.cpp +++ b/src/pathfinder.cpp @@ -157,9 +157,8 @@ public: ArrayGridNodeContainer(Pathfinder *pathf, v3s16 dimensions); virtual PathGridnode &access(v3s16 p); -private: - v3s16 m_dimensions; +private: int m_x_stride; int m_y_stride; std::vector<PathGridnode> m_nodes_array; @@ -306,8 +305,6 @@ private: int m_max_index_y = 0; /**< max index of search area in y direction */ int m_max_index_z = 0; /**< max index of search area in z direction */ - - int m_searchdistance = 0; /**< max distance to search in each direction */ int m_maxdrop = 0; /**< maximum number of blocks a path may drop */ int m_maxjump = 0; /**< maximum number of blocks a path may jump */ int m_min_target_distance = 0; /**< current smalest path to target */ @@ -619,7 +616,6 @@ std::vector<v3s16> Pathfinder::getPath(v3s16 source, std::vector<v3s16> retval; //initialization - m_searchdistance = searchdistance; m_maxjump = max_jump; m_maxdrop = max_drop; m_start = source; @@ -1432,7 +1428,7 @@ std::string Pathfinder::dirToName(PathDirections dir) } /******************************************************************************/ -void Pathfinder::printPath(std::vector<v3s16> path) +void Pathfinder::printPath(const std::vector<v3s16> &path) { unsigned int current = 0; for (std::vector<v3s16>::iterator i = path.begin(); diff --git a/src/player.cpp b/src/player.cpp index d3ba5c2c2..1e064c1da 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "player.h" +#include <cmath> #include "threading/mutex_auto_lock.h" #include "util/numeric.h" #include "hud.h" @@ -70,7 +71,7 @@ Player::Player(const char *name, IItemDefManager *idef): HUD_FLAG_HOTBAR_VISIBLE | HUD_FLAG_HEALTHBAR_VISIBLE | HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE | HUD_FLAG_BREATHBAR_VISIBLE | HUD_FLAG_MINIMAP_VISIBLE | - HUD_FLAG_MINIMAP_RADAR_VISIBLE; + HUD_FLAG_MINIMAP_RADAR_VISIBLE | HUD_FLAG_BASIC_DEBUG; hud_hotbar_itemcount = HUD_HOTBAR_ITEMCOUNT_DEFAULT; @@ -159,6 +160,64 @@ void Player::clearHud() } } +#ifndef SERVER + +u32 PlayerControl::getKeysPressed() const +{ + u32 keypress_bits = + ( (u32)(jump & 1) << 4) | + ( (u32)(aux1 & 1) << 5) | + ( (u32)(sneak & 1) << 6) | + ( (u32)(dig & 1) << 7) | + ( (u32)(place & 1) << 8) | + ( (u32)(zoom & 1) << 9) + ; + + // If any direction keys are pressed pass those through + if (direction_keys != 0) + { + keypress_bits |= direction_keys; + } + // Otherwise set direction keys based on joystick movement (for mod compatibility) + else if (isMoving()) + { + float abs_d; + + // (absolute value indicates forward / backward) + abs_d = abs(movement_direction); + if (abs_d < 3.0f / 8.0f * M_PI) + keypress_bits |= (u32)1; // Forward + if (abs_d > 5.0f / 8.0f * M_PI) + keypress_bits |= (u32)1 << 1; // Backward + + // rotate entire coordinate system by 90 degree + abs_d = movement_direction + M_PI_2; + if (abs_d >= M_PI) + abs_d -= 2 * M_PI; + abs_d = abs(abs_d); + // (value now indicates left / right) + if (abs_d < 3.0f / 8.0f * M_PI) + keypress_bits |= (u32)1 << 2; // Left + if (abs_d > 5.0f / 8.0f * M_PI) + keypress_bits |= (u32)1 << 3; // Right + } + + return keypress_bits; +} + +#endif + +void PlayerControl::unpackKeysPressed(u32 keypress_bits) +{ + direction_keys = keypress_bits & 0xf; + jump = keypress_bits & (1 << 4); + aux1 = keypress_bits & (1 << 5); + sneak = keypress_bits & (1 << 6); + dig = keypress_bits & (1 << 7); + place = keypress_bits & (1 << 8); + zoom = keypress_bits & (1 << 9); +} + void PlayerSettings::readGlobalSettings() { free_move = g_settings->getBool("free_move"); diff --git a/src/player.h b/src/player.h index ec068a8b1..7c8077d38 100644 --- a/src/player.h +++ b/src/player.h @@ -49,26 +49,18 @@ struct PlayerControl PlayerControl() = default; PlayerControl( - bool a_up, - bool a_down, - bool a_left, - bool a_right, - bool a_jump, - bool a_aux1, - bool a_sneak, + bool a_up, bool a_down, bool a_left, bool a_right, + bool a_jump, bool a_aux1, bool a_sneak, bool a_zoom, - bool a_dig, - bool a_place, - float a_pitch, - float a_yaw, - float a_sidew_move_joystick_axis, - float a_forw_move_joystick_axis + bool a_dig, bool a_place, + float a_pitch, float a_yaw, + float a_movement_speed, float a_movement_direction ) { - up = a_up; - down = a_down; - left = a_left; - right = a_right; + // Encode direction keys into a single value so nobody uses it accidentally + // as movement_{speed,direction} is supposed to be the source of truth. + direction_keys = (a_up&1) | ((a_down&1) << 1) | + ((a_left&1) << 2) | ((a_right&1) << 3); jump = a_jump; aux1 = a_aux1; sneak = a_sneak; @@ -77,23 +69,43 @@ struct PlayerControl place = a_place; pitch = a_pitch; yaw = a_yaw; - sidew_move_joystick_axis = a_sidew_move_joystick_axis; - forw_move_joystick_axis = a_forw_move_joystick_axis; + movement_speed = a_movement_speed; + movement_direction = a_movement_direction; } - bool up = false; - bool down = false; - bool left = false; - bool right = false; + +#ifndef SERVER + // For client use + u32 getKeysPressed() const; + inline bool isMoving() const { return movement_speed > 0.001f; } +#endif + + // For server use + void unpackKeysPressed(u32 keypress_bits); + + u8 direction_keys = 0; bool jump = false; bool aux1 = false; bool sneak = false; bool zoom = false; bool dig = false; bool place = false; + // Note: These four are NOT available on the server float pitch = 0.0f; float yaw = 0.0f; - float sidew_move_joystick_axis = 0.0f; - float forw_move_joystick_axis = 0.0f; + float movement_speed = 0.0f; + float movement_direction = 0.0f; +}; + +struct PlayerPhysicsOverride +{ + float speed = 1.f; + float jump = 1.f; + float gravity = 1.f; + + bool sneak = true; + bool sneak_glitch = false; + // "Temporary" option for old move code + bool new_move = true; }; struct PlayerSettings @@ -134,12 +146,12 @@ public: std::vector<CollisionInfo> *collision_info) {} - const v3f &getSpeed() const + v3f getSpeed() const { return m_speed; } - void setSpeed(const v3f &speed) + void setSpeed(v3f speed) { m_speed = speed; } @@ -182,6 +194,7 @@ public: PlayerControl control; const PlayerControl& getPlayerControl() { return control; } + PlayerPhysicsOverride physics_override; PlayerSettings &getPlayerSettings() { return m_player_settings; } static void settingsChangedCallback(const std::string &name, void *data); @@ -200,8 +213,6 @@ public: return m_fov_override_spec; } - u32 keyPressed = 0; - HudElement* getHud(u32 id); u32 addHud(HudElement* hud); HudElement* removeHud(u32 id); diff --git a/src/porting.cpp b/src/porting.cpp index e7ed4e090..09627431c 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <algorithm> #include <shlwapi.h> #include <shellapi.h> + #include <mmsystem.h> #endif #if !defined(_WIN32) #include <unistd.h> @@ -69,6 +70,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <cstdarg> #include <cstdio> +#if !defined(SERVER) && defined(_WIN32) +// On Windows export some driver-specific variables to encourage Minetest to be +// executed on the discrete GPU in case of systems with two. Portability is fun. +extern "C" { + __declspec(dllexport) DWORD NvOptimusEnablement = 1; + __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 1; +} +#endif + namespace porting { @@ -598,7 +608,7 @@ void initializePaths() // First try $XDG_CACHE_HOME/PROJECT_NAME const char *cache_dir = getenv("XDG_CACHE_HOME"); const char *home_dir = getenv("HOME"); - if (cache_dir) { + if (cache_dir && cache_dir[0] != '\0') { path_cache = std::string(cache_dir) + DIR_DELIM + PROJECT_NAME; } else if (home_dir) { // Then try $HOME/.cache/PROJECT_NAME @@ -719,34 +729,56 @@ int mt_snprintf(char *buf, const size_t buf_size, const char *fmt, ...) return c; } -bool openURL(const std::string &url) +static bool open_uri(const std::string &uri) { - if ((url.substr(0, 7) != "http://" && url.substr(0, 8) != "https://") || - url.find_first_of("\r\n") != std::string::npos) { - errorstream << "Invalid url: " << url << std::endl; + if (uri.find_first_of("\r\n") != std::string::npos) { + errorstream << "Unable to open URI as it is invalid, contains new line: " << uri << std::endl; return false; } #if defined(_WIN32) - return (intptr_t)ShellExecuteA(NULL, NULL, url.c_str(), NULL, NULL, SW_SHOWNORMAL) > 32; + return (intptr_t)ShellExecuteA(NULL, NULL, uri.c_str(), NULL, NULL, SW_SHOWNORMAL) > 32; #elif defined(__ANDROID__) - openURLAndroid(url); + openURIAndroid(uri); return true; #elif defined(__APPLE__) - const char *argv[] = {"open", url.c_str(), NULL}; + const char *argv[] = {"open", uri.c_str(), NULL}; return posix_spawnp(NULL, "open", NULL, NULL, (char**)argv, (*_NSGetEnviron())) == 0; #else - const char *argv[] = {"xdg-open", url.c_str(), NULL}; + const char *argv[] = {"xdg-open", uri.c_str(), NULL}; return posix_spawnp(NULL, "xdg-open", NULL, NULL, (char**)argv, environ) == 0; #endif } +bool open_url(const std::string &url) +{ + if (url.substr(0, 7) != "http://" && url.substr(0, 8) != "https://") { + errorstream << "Unable to open browser as URL is missing schema: " << url << std::endl; + return false; + } + + return open_uri(url); +} + +bool open_directory(const std::string &path) +{ + if (!fs::IsDir(path)) { + errorstream << "Unable to open directory as it does not exist: " << path << std::endl; + return false; + } + + return open_uri(path); +} + // Load performance counter frequency only once at startup #ifdef _WIN32 inline double get_perf_freq() { + // Also use this opportunity to enable high-res timers + timeBeginPeriod(1); + LARGE_INTEGER freq; QueryPerformanceFrequency(&freq); return freq.QuadPart; diff --git a/src/porting.h b/src/porting.h index c7adf12a2..93932e1d9 100644 --- a/src/porting.h +++ b/src/porting.h @@ -234,21 +234,21 @@ inline u64 getTimeMs() { struct timespec ts; os_get_clock(&ts); - return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + return ((u64) ts.tv_sec) * 1000LL + ((u64) ts.tv_nsec) / 1000000LL; } inline u64 getTimeUs() { struct timespec ts; os_get_clock(&ts); - return ts.tv_sec * 1000000 + ts.tv_nsec / 1000; + return ((u64) ts.tv_sec) * 1000000LL + ((u64) ts.tv_nsec) / 1000LL; } inline u64 getTimeNs() { struct timespec ts; os_get_clock(&ts); - return ts.tv_sec * 1000000000 + ts.tv_nsec; + return ((u64) ts.tv_sec) * 1000000000LL + ((u64) ts.tv_nsec); } #endif @@ -332,7 +332,25 @@ void attachOrCreateConsole(); int mt_snprintf(char *buf, const size_t buf_size, const char *fmt, ...); -bool openURL(const std::string &url); +/** + * Opens URL in default web browser + * + * Must begin with http:// or https://, and not contain any new lines + * + * @param url The URL + * @return true on success, false on failure + */ +bool open_url(const std::string &url); + +/** + * Opens a directory in the default file manager + * + * The directory must exist. + * + * @param path Path to directory + * @return true on success, false on failure + */ +bool open_directory(const std::string &path); } // namespace porting diff --git a/src/porting_android.cpp b/src/porting_android.cpp index 41b521ec2..83b590b99 100644 --- a/src/porting_android.cpp +++ b/src/porting_android.cpp @@ -152,47 +152,35 @@ static std::string javaStringToUTF8(jstring js) return str; } -// Calls static method if obj is NULL -static std::string getAndroidPath( - jclass cls, jobject obj, jmethodID mt_getAbsPath, const char *getter) -{ - // Get getter method - jmethodID mt_getter; - if (obj) - mt_getter = jnienv->GetMethodID(cls, getter, "()Ljava/io/File;"); - else - mt_getter = jnienv->GetStaticMethodID(cls, getter, "()Ljava/io/File;"); - - // Call getter - jobject ob_file; - if (obj) - ob_file = jnienv->CallObjectMethod(obj, mt_getter); - else - ob_file = jnienv->CallStaticObjectMethod(cls, mt_getter); - - // Call getAbsolutePath - auto js_path = (jstring) jnienv->CallObjectMethod(ob_file, mt_getAbsPath); - - return javaStringToUTF8(js_path); -} - void initializePathsAndroid() { - // Get Environment class - jclass cls_Env = jnienv->FindClass("android/os/Environment"); - // Get File class - jclass cls_File = jnienv->FindClass("java/io/File"); - // Get getAbsolutePath method - jmethodID mt_getAbsPath = jnienv->GetMethodID(cls_File, - "getAbsolutePath", "()Ljava/lang/String;"); - std::string path_storage = getAndroidPath(cls_Env, nullptr, - mt_getAbsPath, "getExternalStorageDirectory"); + // Set user and share paths + { + jmethodID getUserDataPath = jnienv->GetMethodID(nativeActivity, + "getUserDataPath", "()Ljava/lang/String;"); + FATAL_ERROR_IF(getUserDataPath==nullptr, + "porting::initializePathsAndroid unable to find Java getUserDataPath method"); + jobject result = jnienv->CallObjectMethod(app_global->activity->clazz, getUserDataPath); + const char *javachars = jnienv->GetStringUTFChars((jstring) result, nullptr); + path_user = javachars; + path_share = javachars; + path_locale = path_share + DIR_DELIM + "locale"; + jnienv->ReleaseStringUTFChars((jstring) result, javachars); + } - path_user = path_storage + DIR_DELIM + PROJECT_NAME_C; - path_share = path_storage + DIR_DELIM + PROJECT_NAME_C; - path_cache = getAndroidPath(nativeActivity, - app_global->activity->clazz, mt_getAbsPath, "getCacheDir"); - migrateCachePath(); + // Set cache path + { + jmethodID getCachePath = jnienv->GetMethodID(nativeActivity, + "getCachePath", "()Ljava/lang/String;"); + FATAL_ERROR_IF(getCachePath==nullptr, + "porting::initializePathsAndroid unable to find Java getCachePath method"); + jobject result = jnienv->CallObjectMethod(app_global->activity->clazz, getCachePath); + const char *javachars = jnienv->GetStringUTFChars((jstring) result, nullptr); + path_cache = javachars; + jnienv->ReleaseStringUTFChars((jstring) result, javachars); + + migrateCachePath(); + } } void showInputDialog(const std::string &acceptButton, const std::string &hint, @@ -213,18 +201,30 @@ void showInputDialog(const std::string &acceptButton, const std::string &hint, jacceptButton, jhint, jcurrent, jeditType); } -void openURLAndroid(const std::string &url) +void openURIAndroid(const std::string &url) { - jmethodID url_open = jnienv->GetMethodID(nativeActivity, "openURL", + jmethodID url_open = jnienv->GetMethodID(nativeActivity, "openURI", "(Ljava/lang/String;)V"); FATAL_ERROR_IF(url_open == nullptr, - "porting::openURLAndroid unable to find java openURL method"); + "porting::openURIAndroid unable to find java openURI method"); jstring jurl = jnienv->NewStringUTF(url.c_str()); jnienv->CallVoidMethod(app_global->activity->clazz, url_open, jurl); } +void shareFileAndroid(const std::string &path) +{ + jmethodID url_open = jnienv->GetMethodID(nativeActivity, "shareFile", + "(Ljava/lang/String;)V"); + + FATAL_ERROR_IF(url_open == nullptr, + "porting::shareFileAndroid unable to find java openURI method"); + + jstring jurl = jnienv->NewStringUTF(path.c_str()); + jnienv->CallVoidMethod(app_global->activity->clazz, url_open, jurl); +} + int getInputDialogState() { jmethodID dialogstate = jnienv->GetMethodID(nativeActivity, diff --git a/src/porting_android.h b/src/porting_android.h index 6eb054041..265825fbd 100644 --- a/src/porting_android.h +++ b/src/porting_android.h @@ -58,7 +58,14 @@ void initializePathsAndroid(); void showInputDialog(const std::string &acceptButton, const std::string &hint, const std::string ¤t, int editType); -void openURLAndroid(const std::string &url); +void openURIAndroid(const std::string &url); + +/** + * Opens a share intent to the file at path + * + * @param path + */ +void shareFileAndroid(const std::string &path); /** * WORKAROUND for not working callbacks from java -> c++ diff --git a/src/profiler.cpp b/src/profiler.cpp index be8be591e..d05b7abfe 100644 --- a/src/profiler.cpp +++ b/src/profiler.cpp @@ -38,7 +38,7 @@ ScopeProfiler::~ScopeProfiler() return; float duration_ms = m_timer->stop(true); - float duration = duration_ms / 1000.0; + float duration = duration_ms; if (m_profiler) { switch (m_type) { case SPT_ADD: diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp index bef60c792..20be7a8c8 100644 --- a/src/remoteplayer.cpp +++ b/src/remoteplayer.cpp @@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., /* RemotePlayer */ + // static config cache for remoteplayer bool RemotePlayer::m_setting_cache_loaded = false; float RemotePlayer::m_setting_chat_message_limit_per_10sec = 0.0f; @@ -46,6 +47,7 @@ RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef): g_settings->getU16("chat_message_limit_trigger_kick"); RemotePlayer::m_setting_cache_loaded = true; } + movement_acceleration_default = g_settings->getFloat("movement_acceleration_default") * BS; movement_acceleration_air = g_settings->getFloat("movement_acceleration_air") * BS; movement_acceleration_fast = g_settings->getFloat("movement_acceleration_fast") * BS; @@ -59,148 +61,16 @@ RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef): movement_liquid_sink = g_settings->getFloat("movement_liquid_sink") * BS; movement_gravity = g_settings->getFloat("movement_gravity") * BS; - // copy defaults - m_cloud_params.density = 0.4f; - m_cloud_params.color_bright = video::SColor(229, 240, 240, 255); - m_cloud_params.color_ambient = video::SColor(255, 0, 0, 0); - m_cloud_params.height = 120.0f; - m_cloud_params.thickness = 16.0f; - m_cloud_params.speed = v2f(0.0f, -2.0f); - // Skybox defaults: - - SkyboxDefaults sky_defaults; - - m_skybox_params.sky_color = sky_defaults.getSkyColorDefaults(); - m_skybox_params.type = "regular"; - m_skybox_params.clouds = true; - m_skybox_params.fog_sun_tint = video::SColor(255, 244, 125, 29); - m_skybox_params.fog_moon_tint = video::SColorf(0.5, 0.6, 0.8, 1).toSColor(); - m_skybox_params.fog_tint_type = "default"; - - m_sun_params = sky_defaults.getSunDefaults(); - m_moon_params = sky_defaults.getMoonDefaults(); - m_star_params = sky_defaults.getStarDefaults(); -} - -void RemotePlayer::serializeExtraAttributes(std::string &output) -{ - assert(m_sao); - Json::Value json_root; - - const StringMap &attrs = m_sao->getMeta().getStrings(); - for (const auto &attr : attrs) { - json_root[attr.first] = attr.second; - } - - output = fastWriteJson(json_root); + m_cloud_params = SkyboxDefaults::getCloudDefaults(); + m_skybox_params = SkyboxDefaults::getSkyDefaults(); + m_sun_params = SkyboxDefaults::getSunDefaults(); + m_moon_params = SkyboxDefaults::getMoonDefaults(); + m_star_params = SkyboxDefaults::getStarDefaults(); } -void RemotePlayer::deSerialize(std::istream &is, const std::string &playername, - PlayerSAO *sao) -{ - Settings args; - - if (!args.parseConfigLines(is, "PlayerArgsEnd")) { - throw SerializationError("PlayerArgsEnd of player " + playername + " not found!"); - } - - m_dirty = true; - //args.getS32("version"); // Version field value not used - const std::string &name = args.get("name"); - strlcpy(m_name, name.c_str(), PLAYERNAME_SIZE); - - if (sao) { - try { - sao->setHPRaw(args.getU16("hp")); - } catch(SettingNotFoundException &e) { - sao->setHPRaw(PLAYER_MAX_HP_DEFAULT); - } - - try { - sao->setBasePosition(args.getV3F("position")); - } catch (SettingNotFoundException &e) {} - - try { - sao->setLookPitch(args.getFloat("pitch")); - } catch (SettingNotFoundException &e) {} - try { - sao->setPlayerYaw(args.getFloat("yaw")); - } catch (SettingNotFoundException &e) {} - - try { - sao->setBreath(args.getU16("breath"), false); - } catch (SettingNotFoundException &e) {} - - try { - const std::string &extended_attributes = args.get("extended_attributes"); - std::istringstream iss(extended_attributes); - Json::CharReaderBuilder builder; - builder.settings_["collectComments"] = false; - std::string errs; - - Json::Value attr_root; - Json::parseFromStream(builder, iss, &attr_root, &errs); - - const Json::Value::Members attr_list = attr_root.getMemberNames(); - for (const auto &it : attr_list) { - Json::Value attr_value = attr_root[it]; - sao->getMeta().setString(it, attr_value.asString()); - } - sao->getMeta().setModified(false); - } catch (SettingNotFoundException &e) {} - } - - try { - inventory.deSerialize(is); - } catch (SerializationError &e) { - errorstream << "Failed to deserialize player inventory. player_name=" - << name << " " << e.what() << std::endl; - } - - if (!inventory.getList("craftpreview") && inventory.getList("craftresult")) { - // Convert players without craftpreview - inventory.addList("craftpreview", 1); - - bool craftresult_is_preview = true; - if(args.exists("craftresult_is_preview")) - craftresult_is_preview = args.getBool("craftresult_is_preview"); - if(craftresult_is_preview) - { - // Clear craftresult - inventory.getList("craftresult")->changeItem(0, ItemStack()); - } - } -} - -void RemotePlayer::serialize(std::ostream &os) -{ - // Utilize a Settings object for storing values - Settings args; - args.setS32("version", 1); - args.set("name", m_name); - - // This should not happen - assert(m_sao); - args.setU16("hp", m_sao->getHP()); - args.setV3F("position", m_sao->getBasePosition()); - args.setFloat("pitch", m_sao->getLookPitch()); - args.setFloat("yaw", m_sao->getRotation().Y); - args.setU16("breath", m_sao->getBreath()); - - std::string extended_attrs; - serializeExtraAttributes(extended_attrs); - args.set("extended_attributes", extended_attrs); - - args.writeLines(os); - - os<<"PlayerArgsEnd\n"; - - inventory.serialize(os); -} - -const RemotePlayerChatResult RemotePlayer::canSendChatMessage() +RemotePlayerChatResult RemotePlayer::canSendChatMessage() { // Rate limit messages u32 now = time(NULL); diff --git a/src/remoteplayer.h b/src/remoteplayer.h index e4209c54f..0ab33adfe 100644 --- a/src/remoteplayer.h +++ b/src/remoteplayer.h @@ -21,8 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include "player.h" -#include "cloudparams.h" #include "skyparams.h" +#include "lighting.h" class PlayerSAO; @@ -44,12 +44,10 @@ public: RemotePlayer(const char *name, IItemDefManager *idef); virtual ~RemotePlayer() = default; - void deSerialize(std::istream &is, const std::string &playername, PlayerSAO *sao); - PlayerSAO *getPlayerSAO() { return m_sao; } void setPlayerSAO(PlayerSAO *sao) { m_sao = sao; } - const RemotePlayerChatResult canSendChatMessage(); + RemotePlayerChatResult canSendChatMessage(); void setHotbarItemcount(s32 hotbar_itemcount) { @@ -128,12 +126,14 @@ public: *frame_speed = local_animation_speed; } + void setLighting(const Lighting &lighting) { m_lighting = lighting; } + + const Lighting& getLighting() const { return m_lighting; } + void setDirty(bool dirty) { m_dirty = true; } u16 protocol_version = 0; - - // v1 for clients older than 5.1.0-dev - u16 formspec_version = 1; + u16 formspec_version = 0; session_t getPeerId() const { return m_peer_id; } @@ -142,14 +142,6 @@ public: void onSuccessfulSave(); private: - /* - serialize() writes a bunch of text that can contain - any characters except a '\0', and such an ending that - deSerialize stops reading exactly at the right point. - */ - void serialize(std::ostream &os); - void serializeExtraAttributes(std::string &output); - PlayerSAO *m_sao = nullptr; bool m_dirty = false; @@ -173,5 +165,7 @@ private: MoonParams m_moon_params; StarParams m_star_params; + Lighting m_lighting; + session_t m_peer_id = PEER_ID_INEXISTENT; }; diff --git a/src/rollback.cpp b/src/rollback.cpp index 3cd9c7ce7..b454e40c9 100644 --- a/src/rollback.cpp +++ b/src/rollback.cpp @@ -483,6 +483,7 @@ const std::list<ActionRow> RollbackManager::actionRowsFromSelect(sqlite3_stmt* s row.actor = sqlite3_column_int (stmt, 0); row.timestamp = sqlite3_column_int64(stmt, 1); row.type = sqlite3_column_int (stmt, 2); + row.nodeMeta = 0; if (row.type == RollbackAction::TYPE_MODIFY_INVENTORY_STACK) { text = sqlite3_column_text (stmt, 3); @@ -941,12 +942,6 @@ void RollbackManager::addAction(const RollbackAction & action) } } -std::list<RollbackAction> RollbackManager::getEntriesSince(time_t first_time) -{ - flush(); - return getActionsSince(first_time); -} - std::list<RollbackAction> RollbackManager::getNodeActors(v3s16 pos, int range, time_t seconds, int limit) { diff --git a/src/rollback.h b/src/rollback.h index 1d9949d15..ff96e513f 100644 --- a/src/rollback.h +++ b/src/rollback.h @@ -46,7 +46,6 @@ public: void flush(); void addAction(const RollbackAction & action); - std::list<RollbackAction> getEntriesSince(time_t first_time); std::list<RollbackAction> getNodeActors(v3s16 pos, int range, time_t seconds, int limit); std::list<RollbackAction> getRevertActions( diff --git a/src/script/common/CMakeLists.txt b/src/script/common/CMakeLists.txt index d07f6ab1b..3e84b46c7 100644 --- a/src/script/common/CMakeLists.txt +++ b/src/script/common/CMakeLists.txt @@ -3,6 +3,7 @@ set(common_SCRIPT_COMMON_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/c_converter.cpp ${CMAKE_CURRENT_SOURCE_DIR}/c_types.cpp ${CMAKE_CURRENT_SOURCE_DIR}/c_internal.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/c_packer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/helper.cpp PARENT_SCOPE) diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 774b6a326..fafb2edc9 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -42,7 +42,7 @@ struct EnumString es_TileAnimationType[] = {TAT_NONE, "none"}, {TAT_VERTICAL_FRAMES, "vertical_frames"}, {TAT_SHEET_2D, "sheet_2d"}, - {0, NULL}, + {0, nullptr}, }; /******************************************************************************/ @@ -56,6 +56,7 @@ void read_item_definition(lua_State* L, int index, es_ItemType, ITEM_NONE); getstringfield(L, index, "name", def.name); getstringfield(L, index, "description", def.description); + getstringfield(L, index, "short_description", def.short_description); getstringfield(L, index, "inventory_image", def.inventory_image); getstringfield(L, index, "inventory_overlay", def.inventory_overlay); getstringfield(L, index, "wield_image", def.wield_image); @@ -82,9 +83,6 @@ void read_item_definition(lua_State* L, int index, getboolfield(L, index, "liquids_pointable", def.liquids_pointable); - warn_if_field_exists(L, index, "tool_digging_properties", - "Obsolete; use tool_capabilities"); - lua_getfield(L, index, "tool_capabilities"); if(lua_istable(L, -1)){ def.tool_capabilities = new ToolCapabilities( @@ -121,6 +119,8 @@ void read_item_definition(lua_State* L, int index, // "" = no prediction getstringfield(L, index, "node_placement_prediction", def.node_placement_prediction); + + getintfield(L, index, "place_param2", def.place_param2); } /******************************************************************************/ @@ -142,6 +142,10 @@ void push_item_definition_full(lua_State *L, const ItemDefinition &i) lua_setfield(L, -2, "name"); lua_pushstring(L, i.description.c_str()); lua_setfield(L, -2, "description"); + if (!i.short_description.empty()) { + lua_pushstring(L, i.short_description.c_str()); + lua_setfield(L, -2, "short_description"); + } lua_pushstring(L, type.c_str()); lua_setfield(L, -2, "type"); lua_pushstring(L, i.inventory_image.c_str()); @@ -192,12 +196,13 @@ void read_object_properties(lua_State *L, int index, int hp_max = 0; if (getintfield(L, -1, "hp_max", hp_max)) { prop->hp_max = (u16)rangelim(hp_max, 0, U16_MAX); + // hp_max = 0 is sometimes used as a hack to keep players dead, only validate for entities + if (prop->hp_max == 0 && sao->getType() != ACTIVEOBJECT_TYPE_PLAYER) + throw LuaError("The hp_max property may not be 0 for entities!"); if (prop->hp_max < sao->getHP()) { - PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP); + PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP_MAX); sao->setHP(prop->hp_max, reason); - if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) - sao->getEnv()->getGameDef()->SendPlayerHPOrDie((PlayerSAO *)sao, reason); } } @@ -310,6 +315,17 @@ void read_object_properties(lua_State *L, int index, prop->nametag_color = color; } lua_pop(L, 1); + lua_getfield(L, -1, "nametag_bgcolor"); + if (!lua_isnil(L, -1)) { + if (lua_toboolean(L, -1)) { + video::SColor color; + if (read_color(L, -1, &color)) + prop->nametag_bgcolor = color; + } else { + prop->nametag_bgcolor = nullopt; + } + } + lua_pop(L, 1); lua_getfield(L, -1, "automatic_face_movement_max_rotation_per_sec"); if (lua_isnumber(L, -1)) { @@ -328,6 +344,7 @@ void read_object_properties(lua_State *L, int index, getfloatfield(L, -1, "zoom_fov", prop->zoom_fov); getboolfield(L, -1, "use_texture_alpha", prop->use_texture_alpha); getboolfield(L, -1, "shaded", prop->shaded); + getboolfield(L, -1, "show_on_minimap", prop->show_on_minimap); getstringfield(L, -1, "damage_texture_modifier", prop->damage_texture_modifier); } @@ -400,6 +417,13 @@ void push_object_properties(lua_State *L, ObjectProperties *prop) lua_setfield(L, -2, "nametag"); push_ARGB8(L, prop->nametag_color); lua_setfield(L, -2, "nametag_color"); + if (prop->nametag_bgcolor) { + push_ARGB8(L, prop->nametag_bgcolor.value()); + lua_setfield(L, -2, "nametag_bgcolor"); + } else { + lua_pushboolean(L, false); + lua_setfield(L, -2, "nametag_bgcolor"); + } lua_pushnumber(L, prop->automatic_face_movement_max_rotation_per_sec); lua_setfield(L, -2, "automatic_face_movement_max_rotation_per_sec"); lua_pushlstring(L, prop->infotext.c_str(), prop->infotext.size()); @@ -416,6 +440,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop) lua_setfield(L, -2, "shaded"); lua_pushlstring(L, prop->damage_texture_modifier.c_str(), prop->damage_texture_modifier.size()); lua_setfield(L, -2, "damage_texture_modifier"); + lua_pushboolean(L, prop->show_on_minimap); + lua_setfield(L, -2, "show_on_minimap"); } /******************************************************************************/ @@ -488,13 +514,11 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) } /******************************************************************************/ -ContentFeatures read_content_features(lua_State *L, int index) +void read_content_features(lua_State *L, ContentFeatures &f, int index) { if(index < 0) index = lua_gettop(L) + 1 + index; - ContentFeatures f; - /* Cache existence of some callbacks */ lua_getfield(L, index, "on_construct"); if(!lua_isnil(L, -1)) f.has_on_construct = true; @@ -529,13 +553,6 @@ ContentFeatures read_content_features(lua_State *L, int index) // tiles = {} lua_getfield(L, index, "tiles"); - // If nil, try the deprecated name "tile_images" instead - if(lua_isnil(L, -1)){ - lua_pop(L, 1); - warn_if_field_exists(L, index, "tile_images", - "Deprecated; new name is \"tiles\"."); - lua_getfield(L, index, "tile_images"); - } if(lua_istable(L, -1)){ int table = lua_gettop(L); lua_pushnil(L); @@ -592,13 +609,6 @@ ContentFeatures read_content_features(lua_State *L, int index) // special_tiles = {} lua_getfield(L, index, "special_tiles"); - // If nil, try the deprecated name "special_materials" instead - if(lua_isnil(L, -1)){ - lua_pop(L, 1); - warn_if_field_exists(L, index, "special_materials", - "Deprecated; new name is \"special_tiles\"."); - lua_getfield(L, index, "special_materials"); - } if(lua_istable(L, -1)){ int table = lua_gettop(L); lua_pushnil(L); @@ -617,22 +627,39 @@ ContentFeatures read_content_features(lua_State *L, int index) } lua_pop(L, 1); - f.alpha = getintfield_default(L, index, "alpha", 255); + /* alpha & use_texture_alpha */ + // This is a bit complicated due to compatibility - bool usealpha = getboolfield_default(L, index, - "use_texture_alpha", false); - if (usealpha) - f.alpha = 0; + f.setDefaultAlphaMode(); + + warn_if_field_exists(L, index, "alpha", + "Obsolete, only limited compatibility provided; " + "replaced by \"use_texture_alpha\""); + if (getintfield_default(L, index, "alpha", 255) != 255) + f.alpha = ALPHAMODE_BLEND; + + lua_getfield(L, index, "use_texture_alpha"); + if (lua_isboolean(L, -1)) { + warn_if_field_exists(L, index, "use_texture_alpha", + "Boolean values are deprecated; use the new choices"); + if (lua_toboolean(L, -1)) + f.alpha = (f.drawtype == NDT_NORMAL) ? ALPHAMODE_CLIP : ALPHAMODE_BLEND; + } else if (check_field_or_nil(L, -1, LUA_TSTRING, "use_texture_alpha")) { + int result = f.alpha; + string_to_enum(ScriptApiNode::es_TextureAlphaMode, result, + std::string(lua_tostring(L, -1))); + f.alpha = static_cast<enum AlphaMode>(result); + } + lua_pop(L, 1); + + /* Other stuff */ - // Read node color. lua_getfield(L, index, "color"); read_color(L, -1, &f.color); lua_pop(L, 1); getstringfield(L, index, "palette", f.palette_name); - /* Other stuff */ - lua_getfield(L, index, "post_effect_color"); read_color(L, -1, &f.post_effect_color); lua_pop(L, 1); @@ -645,24 +672,11 @@ ContentFeatures read_content_features(lua_State *L, int index) if (!f.palette_name.empty() && !(f.param_type_2 == CPT2_COLOR || f.param_type_2 == CPT2_COLORED_FACEDIR || - f.param_type_2 == CPT2_COLORED_WALLMOUNTED)) + f.param_type_2 == CPT2_COLORED_WALLMOUNTED || + f.param_type_2 == CPT2_COLORED_DEGROTATE)) warningstream << "Node " << f.name.c_str() << " has a palette, but not a suitable paramtype2." << std::endl; - // Warn about some obsolete fields - warn_if_field_exists(L, index, "wall_mounted", - "Obsolete; use paramtype2 = 'wallmounted'"); - warn_if_field_exists(L, index, "light_propagates", - "Obsolete; determined from paramtype"); - warn_if_field_exists(L, index, "dug_item", - "Obsolete; use 'drop' field"); - warn_if_field_exists(L, index, "extra_dug_item", - "Obsolete; use 'drop' field"); - warn_if_field_exists(L, index, "extra_dug_item_rarity", - "Obsolete; use 'drop' field"); - warn_if_field_exists(L, index, "metadata_name", - "Obsolete; use on_add and metadata callbacks"); - // True for all ground-like things like stone and mud, false for eg. trees getboolfield(L, index, "is_ground_content", f.is_ground_content); f.light_propagates = (f.param_type == CPT_LIGHT); @@ -694,6 +708,9 @@ ContentFeatures read_content_features(lua_State *L, int index) // the slowest possible f.liquid_viscosity = getintfield_default(L, index, "liquid_viscosity", f.liquid_viscosity); + // If move_resistance is not set explicitly, + // move_resistance is equal to liquid_viscosity + f.move_resistance = f.liquid_viscosity; f.liquid_range = getintfield_default(L, index, "liquid_range", f.liquid_range); f.leveled = getintfield_default(L, index, "leveled", f.leveled); @@ -797,7 +814,21 @@ ContentFeatures read_content_features(lua_State *L, int index) getstringfield(L, index, "node_dig_prediction", f.node_dig_prediction); - return f; + // How much the node slows down players, ranging from 1 to 7, + // the higher, the slower. + f.move_resistance = getintfield_default(L, index, + "move_resistance", f.move_resistance); + + // Whether e.g. players in this node will have liquid movement physics + lua_getfield(L, index, "liquid_move_physics"); + if(lua_isboolean(L, -1)) { + f.liquid_move_physics = lua_toboolean(L, -1); + } else if(lua_isnil(L, -1)) { + f.liquid_move_physics = f.liquid_type != LIQUID_NONE; + } else { + errorstream << "Field \"liquid_move_physics\": Invalid type!" << std::endl; + } + lua_pop(L, 1); } void push_content_features(lua_State *L, const ContentFeatures &c) @@ -925,6 +956,10 @@ void push_content_features(lua_State *L, const ContentFeatures &c) lua_setfield(L, -2, "legacy_wallmounted"); lua_pushstring(L, c.node_dig_prediction.c_str()); lua_setfield(L, -2, "node_dig_prediction"); + lua_pushnumber(L, c.move_resistance); + lua_setfield(L, -2, "move_resistance"); + lua_pushboolean(L, c.liquid_move_physics); + lua_setfield(L, -2, "liquid_move_physics"); } /******************************************************************************/ @@ -954,22 +989,25 @@ void push_nodebox(lua_State *L, const NodeBox &box) push_aabb3f(L, box.wall_side); lua_setfield(L, -2, "wall_side"); break; - case NODEBOX_CONNECTED: + case NODEBOX_CONNECTED: { lua_pushstring(L, "connected"); lua_setfield(L, -2, "type"); - push_box(L, box.connect_top); + const auto &c = box.getConnected(); + push_box(L, c.connect_top); lua_setfield(L, -2, "connect_top"); - push_box(L, box.connect_bottom); + push_box(L, c.connect_bottom); lua_setfield(L, -2, "connect_bottom"); - push_box(L, box.connect_front); + push_box(L, c.connect_front); lua_setfield(L, -2, "connect_front"); - push_box(L, box.connect_back); + push_box(L, c.connect_back); lua_setfield(L, -2, "connect_back"); - push_box(L, box.connect_left); + push_box(L, c.connect_left); lua_setfield(L, -2, "connect_left"); - push_box(L, box.connect_right); + push_box(L, c.connect_right); lua_setfield(L, -2, "connect_right"); + // half the boxes are missing here? break; + } default: FATAL_ERROR("Invalid box.type"); break; @@ -1002,22 +1040,26 @@ void push_palette(lua_State *L, const std::vector<video::SColor> *palette) /******************************************************************************/ void read_server_sound_params(lua_State *L, int index, - ServerSoundParams ¶ms) + ServerPlayingSound ¶ms) { if(index < 0) index = lua_gettop(L) + 1 + index; - // Clear - params = ServerSoundParams(); + if(lua_istable(L, index)){ + // Functional overlap: this may modify SimpleSoundSpec contents + getfloatfield(L, index, "fade", params.spec.fade); + getfloatfield(L, index, "pitch", params.spec.pitch); + getboolfield(L, index, "loop", params.spec.loop); + getfloatfield(L, index, "gain", params.gain); + + // Handle positional information getstringfield(L, index, "to_player", params.to_player); - getfloatfield(L, index, "fade", params.fade); - getfloatfield(L, index, "pitch", params.pitch); lua_getfield(L, index, "pos"); if(!lua_isnil(L, -1)){ v3f p = read_v3f(L, -1)*BS; params.pos = p; - params.type = ServerSoundParams::SSP_POSITIONAL; + params.type = SoundLocation::Position; } lua_pop(L, 1); lua_getfield(L, index, "object"); @@ -1026,13 +1068,12 @@ void read_server_sound_params(lua_State *L, int index, ServerActiveObject *sao = ObjectRef::getobject(ref); if(sao){ params.object = sao->getId(); - params.type = ServerSoundParams::SSP_OBJECT; + params.type = SoundLocation::Object; } } lua_pop(L, 1); params.max_hear_distance = BS*getfloatfield_default(L, index, "max_hear_distance", params.max_hear_distance/BS); - getboolfield(L, index, "loop", params.loop); getstringfield(L, index, "exclude_player", params.exclude_player); } } @@ -1097,20 +1138,24 @@ NodeBox read_nodebox(lua_State *L, int index) NODEBOXREAD(nodebox.wall_top, "wall_top"); NODEBOXREAD(nodebox.wall_bottom, "wall_bottom"); NODEBOXREAD(nodebox.wall_side, "wall_side"); - NODEBOXREADVEC(nodebox.connect_top, "connect_top"); - NODEBOXREADVEC(nodebox.connect_bottom, "connect_bottom"); - NODEBOXREADVEC(nodebox.connect_front, "connect_front"); - NODEBOXREADVEC(nodebox.connect_left, "connect_left"); - NODEBOXREADVEC(nodebox.connect_back, "connect_back"); - NODEBOXREADVEC(nodebox.connect_right, "connect_right"); - NODEBOXREADVEC(nodebox.disconnected_top, "disconnected_top"); - NODEBOXREADVEC(nodebox.disconnected_bottom, "disconnected_bottom"); - NODEBOXREADVEC(nodebox.disconnected_front, "disconnected_front"); - NODEBOXREADVEC(nodebox.disconnected_left, "disconnected_left"); - NODEBOXREADVEC(nodebox.disconnected_back, "disconnected_back"); - NODEBOXREADVEC(nodebox.disconnected_right, "disconnected_right"); - NODEBOXREADVEC(nodebox.disconnected, "disconnected"); - NODEBOXREADVEC(nodebox.disconnected_sides, "disconnected_sides"); + + if (nodebox.type == NODEBOX_CONNECTED) { + auto &c = nodebox.getConnected(); + NODEBOXREADVEC(c.connect_top, "connect_top"); + NODEBOXREADVEC(c.connect_bottom, "connect_bottom"); + NODEBOXREADVEC(c.connect_front, "connect_front"); + NODEBOXREADVEC(c.connect_left, "connect_left"); + NODEBOXREADVEC(c.connect_back, "connect_back"); + NODEBOXREADVEC(c.connect_right, "connect_right"); + NODEBOXREADVEC(c.disconnected_top, "disconnected_top"); + NODEBOXREADVEC(c.disconnected_bottom, "disconnected_bottom"); + NODEBOXREADVEC(c.disconnected_front, "disconnected_front"); + NODEBOXREADVEC(c.disconnected_left, "disconnected_left"); + NODEBOXREADVEC(c.disconnected_back, "disconnected_back"); + NODEBOXREADVEC(c.disconnected_right, "disconnected_right"); + NODEBOXREADVEC(c.disconnected, "disconnected"); + NODEBOXREADVEC(c.disconnected_sides, "disconnected_sides"); + } return nodebox; } @@ -1305,45 +1350,52 @@ void push_tool_capabilities(lua_State *L, } /******************************************************************************/ -void push_inventory_list(lua_State *L, Inventory *inv, const char *name) +void push_inventory_list(lua_State *L, const InventoryList &invlist) { - InventoryList *invlist = inv->getList(name); - if(invlist == NULL){ - lua_pushnil(L); - return; + push_items(L, invlist.getItems()); +} + +/******************************************************************************/ +void push_inventory_lists(lua_State *L, const Inventory &inv) +{ + const auto &lists = inv.getLists(); + lua_createtable(L, 0, lists.size()); + for(const InventoryList *list : lists) { + const std::string &name = list->getName(); + lua_pushlstring(L, name.c_str(), name.size()); + push_inventory_list(L, *list); + lua_rawset(L, -3); } - std::vector<ItemStack> items; - for(u32 i=0; i<invlist->getSize(); i++) - items.push_back(invlist->getItem(i)); - push_items(L, items); } /******************************************************************************/ void read_inventory_list(lua_State *L, int tableindex, - Inventory *inv, const char *name, Server* srv, int forcesize) + Inventory *inv, const char *name, IGameDef *gdef, int forcesize) { if(tableindex < 0) tableindex = lua_gettop(L) + 1 + tableindex; + // If nil, delete list if(lua_isnil(L, tableindex)){ inv->deleteList(name); return; } - // Otherwise set list - std::vector<ItemStack> items = read_items(L, tableindex,srv); - int listsize = (forcesize != -1) ? forcesize : items.size(); + + // Get Lua-specified items to insert into the list + std::vector<ItemStack> items = read_items(L, tableindex, gdef); + size_t listsize = (forcesize >= 0) ? forcesize : items.size(); + + // Create or resize/clear list InventoryList *invlist = inv->addList(name, listsize); - int index = 0; - for(std::vector<ItemStack>::const_iterator - i = items.begin(); i != items.end(); ++i){ - if(forcesize != -1 && index == forcesize) - break; - invlist->changeItem(index, *i); - index++; + if (!invlist) { + luaL_error(L, "inventory list: cannot create list named '%s'", name); + return; } - while(forcesize != -1 && index < forcesize){ - invlist->deleteItem(index); - index++; + + for (size_t i = 0; i < items.size(); ++i) { + if (i == listsize) + break; // Truncate provided list of items + invlist->changeItem(i, items[i]); } } @@ -1582,7 +1634,7 @@ void push_items(lua_State *L, const std::vector<ItemStack> &items) } /******************************************************************************/ -std::vector<ItemStack> read_items(lua_State *L, int index, Server *srv) +std::vector<ItemStack> read_items(lua_State *L, int index, IGameDef *gdef) { if(index < 0) index = lua_gettop(L) + 1 + index; @@ -1598,7 +1650,7 @@ std::vector<ItemStack> read_items(lua_State *L, int index, Server *srv) if (items.size() < (u32) key) { items.resize(key); } - items[key - 1] = read_item(L, -1, srv->idef()); + items[key - 1] = read_item(L, -1, gdef->idef()); lua_pop(L, 1); } return items; @@ -1649,24 +1701,19 @@ bool read_noiseparams(lua_State *L, int index, NoiseParams *np) void push_noiseparams(lua_State *L, NoiseParams *np) { lua_newtable(L); - push_float_string(L, np->offset); - lua_setfield(L, -2, "offset"); - push_float_string(L, np->scale); - lua_setfield(L, -2, "scale"); - push_float_string(L, np->persist); - lua_setfield(L, -2, "persistence"); - push_float_string(L, np->lacunarity); - lua_setfield(L, -2, "lacunarity"); - lua_pushnumber(L, np->seed); - lua_setfield(L, -2, "seed"); - lua_pushnumber(L, np->octaves); - lua_setfield(L, -2, "octaves"); + setfloatfield(L, -1, "offset", np->offset); + setfloatfield(L, -1, "scale", np->scale); + setfloatfield(L, -1, "persist", np->persist); + setfloatfield(L, -1, "persistence", np->persist); + setfloatfield(L, -1, "lacunarity", np->lacunarity); + setintfield( L, -1, "seed", np->seed); + setintfield( L, -1, "octaves", np->octaves); push_flags_string(L, flagdesc_noiseparams, np->flags, np->flags); lua_setfield(L, -2, "flags"); - push_v3_float_string(L, np->spread); + push_v3f(L, np->spread); lua_setfield(L, -2, "spread"); } @@ -1900,6 +1947,8 @@ void read_hud_element(lua_State *L, HudElement *elem) elem->world_pos = lua_istable(L, -1) ? read_v3f(L, -1) : v3f(); lua_pop(L, 1); + elem->style = getintfield_default(L, 2, "style", 0); + /* check for known deprecated element usage */ if ((elem->type == HUD_ELEM_STATBAR) && (elem->size == v2s32())) log_deprecated(L,"Deprecated usage of statbar without size!"); @@ -1927,6 +1976,12 @@ void push_hud_element(lua_State *L, HudElement *elem) lua_pushnumber(L, elem->number); lua_setfield(L, -2, "number"); + if (elem->type == HUD_ELEM_WAYPOINT) { + // waypoints reuse the item field to store precision, precision = item - 1 + lua_pushnumber(L, elem->item - 1); + lua_setfield(L, -2, "precision"); + } + // push the item field for waypoints as well for backwards compatibility lua_pushnumber(L, elem->item); lua_setfield(L, -2, "item"); @@ -1954,17 +2009,22 @@ void push_hud_element(lua_State *L, HudElement *elem) lua_pushstring(L, elem->text2.c_str()); lua_setfield(L, -2, "text2"); + + lua_pushinteger(L, elem->style); + lua_setfield(L, -2, "style"); } -HudElementStat read_hud_change(lua_State *L, HudElement *elem, void **value) +bool read_hud_change(lua_State *L, HudElementStat &stat, HudElement *elem, void **value) { - HudElementStat stat = HUD_STAT_NUMBER; - std::string statstr; - if (lua_isstring(L, 3)) { + std::string statstr = lua_tostring(L, 3); + { int statint; - statstr = lua_tostring(L, 3); - stat = string_to_enum(es_HudElementStat, statint, statstr) ? - (HudElementStat)statint : stat; + if (!string_to_enum(es_HudElementStat, statint, statstr)) { + script_log_unique(L, "Unknown HUD stat type: " + statstr, warningstream); + return false; + } + + stat = (HudElementStat)statint; } switch (stat) { @@ -2022,8 +2082,13 @@ HudElementStat read_hud_change(lua_State *L, HudElement *elem, void **value) elem->text2 = luaL_checkstring(L, 4); *value = &elem->text2; break; + case HUD_STAT_STYLE: + elem->style = luaL_checknumber(L, 4); + *value = &elem->style; + break; } - return stat; + + return true; } /******************************************************************************/ @@ -2081,3 +2146,35 @@ void push_collision_move_result(lua_State *L, const collisionMoveResult &res) lua_setfield(L, -2, "collisions"); /**/ } + + +void push_mod_spec(lua_State *L, const ModSpec &spec, bool include_unsatisfied) +{ + lua_newtable(L); + + lua_pushstring(L, spec.name.c_str()); + lua_setfield(L, -2, "name"); + + lua_pushstring(L, spec.author.c_str()); + lua_setfield(L, -2, "author"); + + lua_pushinteger(L, spec.release); + lua_setfield(L, -2, "release"); + + lua_pushstring(L, spec.desc.c_str()); + lua_setfield(L, -2, "description"); + + lua_pushstring(L, spec.path.c_str()); + lua_setfield(L, -2, "path"); + + lua_pushstring(L, spec.virtual_path.c_str()); + lua_setfield(L, -2, "virtual_path"); + + lua_newtable(L); + int i = 1; + for (const auto &dep : spec.unsatisfied_depends) { + lua_pushstring(L, dep.c_str()); + lua_rawseti(L, -2, i++); + } + lua_setfield(L, -2, "unsatisfied_depends"); +} diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h index 8f32e58eb..ade3e4c1e 100644 --- a/src/script/common/c_content.h +++ b/src/script/common/c_content.h @@ -39,7 +39,10 @@ extern "C" { #include "itemgroup.h" #include "itemdef.h" #include "c_types.h" -#include "hud.h" +// We do a explicit path include because by default c_content.h include src/client/hud.h +// prior to the src/hud.h, which is not good on server only build +#include "../../hud.h" +#include "content/mods.h" namespace Json { class Value; } @@ -51,12 +54,13 @@ struct ItemDefinition; struct ToolCapabilities; struct ObjectProperties; struct SimpleSoundSpec; -struct ServerSoundParams; +struct ServerPlayingSound; class Inventory; +class InventoryList; struct NodeBox; struct ContentFeatures; struct TileDef; -class Server; +class IGameDef; struct DigParams; struct HitParams; struct EnumString; @@ -67,7 +71,8 @@ struct collisionMoveResult; extern struct EnumString es_TileAnimationType[]; -ContentFeatures read_content_features (lua_State *L, int index); +void read_content_features (lua_State *L, ContentFeatures &f, + int index); void push_content_features (lua_State *L, const ContentFeatures &c); @@ -87,7 +92,7 @@ void read_soundspec (lua_State *L, int index, NodeBox read_nodebox (lua_State *L, int index); void read_server_sound_params (lua_State *L, int index, - ServerSoundParams ¶ms); + ServerPlayingSound ¶ms); void push_dig_params (lua_State *L, const DigParams ¶ms); @@ -117,11 +122,12 @@ void push_object_properties (lua_State *L, ObjectProperties *prop); void push_inventory_list (lua_State *L, - Inventory *inv, - const char *name); + const InventoryList &invlist); +void push_inventory_lists (lua_State *L, + const Inventory &inv); void read_inventory_list (lua_State *L, int tableindex, Inventory *inv, const char *name, - Server *srv, int forcesize=-1); + IGameDef *gdef, int forcesize=-1); MapNode readnode (lua_State *L, int index, const NodeDefManager *ndef); @@ -161,7 +167,7 @@ void push_items (lua_State *L, std::vector<ItemStack> read_items (lua_State *L, int index, - Server* srv); + IGameDef* gdef); void push_soundspec (lua_State *L, const SimpleSoundSpec &spec); @@ -190,12 +196,14 @@ void read_json_value (lua_State *L, Json::Value &root, void push_pointed_thing(lua_State *L, const PointedThing &pointed, bool csm = false, bool hitpoint = false); -void push_objectRef (lua_State *L, const u16 id); +void push_objectRef (lua_State *L, const u16 id); -void read_hud_element (lua_State *L, HudElement *elem); +void read_hud_element (lua_State *L, HudElement *elem); -void push_hud_element (lua_State *L, HudElement *elem); +void push_hud_element (lua_State *L, HudElement *elem); -HudElementStat read_hud_change (lua_State *L, HudElement *elem, void **value); +bool read_hud_change (lua_State *L, HudElementStat &stat, HudElement *elem, void **value); -void push_collision_move_result(lua_State *L, const collisionMoveResult &res); +void push_collision_move_result(lua_State *L, const collisionMoveResult &res); + +void push_mod_spec(lua_State *L, const ModSpec &spec, bool include_unsatisfied); diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp index eb6ab5331..69da35b73 100644 --- a/src/script/common/c_converter.cpp +++ b/src/script/common/c_converter.cpp @@ -18,8 +18,8 @@ with this program; if not, write to the Free Software Foundation, Inc., */ extern "C" { -#include "lua.h" -#include "lauxlib.h" +#include <lua.h> +#include <lauxlib.h> } #include "util/numeric.h" @@ -29,35 +29,52 @@ extern "C" { #include "common/c_internal.h" #include "constants.h" #include <set> +#include <cmath> -#define CHECK_TYPE(index, name, type) { \ +#define CHECK_TYPE(index, name, type) do { \ int t = lua_type(L, (index)); \ if (t != (type)) { \ throw LuaError(std::string("Invalid ") + (name) + \ " (expected " + lua_typename(L, (type)) + \ " got " + lua_typename(L, t) + ")."); \ } \ - } -#define CHECK_POS_COORD(name) CHECK_TYPE(-1, "position coordinate '" name "'", LUA_TNUMBER) -#define CHECK_FLOAT_RANGE(value, name) \ -if (value < F1000_MIN || value > F1000_MAX) { \ - std::ostringstream error_text; \ - error_text << "Invalid float vector dimension range '" name "' " << \ - "(expected " << F1000_MIN << " < " name " < " << F1000_MAX << \ - " got " << value << ")." << std::endl; \ - throw LuaError(error_text.str()); \ -} -#define CHECK_POS_TAB(index) CHECK_TYPE(index, "position", LUA_TTABLE) + } while(0) + +#define CHECK_FLOAT(value, name) do {\ + if (std::isnan(value) || std::isinf(value)) { \ + throw LuaError("Invalid float value for '" name \ + "' (NaN or infinity)"); \ + } \ + } while (0) + +#define CHECK_POS_COORD(name) CHECK_TYPE(-1, "vector coordinate " name, LUA_TNUMBER) +#define CHECK_POS_TAB(index) CHECK_TYPE(index, "vector", LUA_TTABLE) -void push_float_string(lua_State *L, float value) +/** + * A helper which sets the vector metatable for the table on top of the stack + */ +static void set_vector_metatable(lua_State *L) { - std::stringstream ss; - std::string str; - ss << value; - str = ss.str(); - lua_pushstring(L, str.c_str()); + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_VECTOR_METATABLE); + lua_setmetatable(L, -2); +} + +// Retrieve an integer vector where all components are optional +template<class T> +static bool getv3intfield(lua_State *L, int index, + const char *fieldname, T &result) +{ + lua_getfield(L, index, fieldname); + bool got = false; + if (lua_istable(L, -1)) { + got |= getintfield(L, -1, "x", result.X); + got |= getintfield(L, -1, "y", result.Y); + got |= getintfield(L, -1, "z", result.Z); + } + lua_pop(L, 1); + return got; } void push_v3f(lua_State *L, v3f p) @@ -69,6 +86,7 @@ void push_v3f(lua_State *L, v3f p) lua_setfield(L, -2, "y"); lua_pushnumber(L, p.Z); lua_setfield(L, -2, "z"); + set_vector_metatable(L); } void push_v2f(lua_State *L, v2f p) @@ -80,26 +98,6 @@ void push_v2f(lua_State *L, v2f p) lua_setfield(L, -2, "y"); } -void push_v3_float_string(lua_State *L, v3f p) -{ - lua_createtable(L, 0, 3); - push_float_string(L, p.X); - lua_setfield(L, -2, "x"); - push_float_string(L, p.Y); - lua_setfield(L, -2, "y"); - push_float_string(L, p.Z); - lua_setfield(L, -2, "z"); -} - -void push_v2_float_string(lua_State *L, v2f p) -{ - lua_createtable(L, 0, 2); - push_float_string(L, p.X); - lua_setfield(L, -2, "x"); - push_float_string(L, p.Y); - lua_setfield(L, -2, "y"); -} - v2s16 read_v2s16(lua_State *L, int index) { v2s16 p; @@ -164,10 +162,12 @@ v2f check_v2f(lua_State *L, int index) lua_getfield(L, index, "x"); CHECK_POS_COORD("x"); p.X = lua_tonumber(L, -1); + CHECK_FLOAT(p.X, "x"); lua_pop(L, 1); lua_getfield(L, index, "y"); CHECK_POS_COORD("y"); p.Y = lua_tonumber(L, -1); + CHECK_FLOAT(p.Y, "y"); lua_pop(L, 1); return p; } @@ -195,17 +195,17 @@ v3f check_v3f(lua_State *L, int index) lua_getfield(L, index, "x"); CHECK_POS_COORD("x"); pos.X = lua_tonumber(L, -1); - CHECK_FLOAT_RANGE(pos.X, "x") + CHECK_FLOAT(pos.X, "x"); lua_pop(L, 1); lua_getfield(L, index, "y"); CHECK_POS_COORD("y"); pos.Y = lua_tonumber(L, -1); - CHECK_FLOAT_RANGE(pos.Y, "y") + CHECK_FLOAT(pos.Y, "y"); lua_pop(L, 1); lua_getfield(L, index, "z"); CHECK_POS_COORD("z"); pos.Z = lua_tonumber(L, -1); - CHECK_FLOAT_RANGE(pos.Z, "z") + CHECK_FLOAT(pos.Z, "z"); lua_pop(L, 1); return pos; } @@ -233,17 +233,17 @@ v3d check_v3d(lua_State *L, int index) lua_getfield(L, index, "x"); CHECK_POS_COORD("x"); pos.X = lua_tonumber(L, -1); - CHECK_FLOAT_RANGE(pos.X, "x") + CHECK_FLOAT(pos.X, "x"); lua_pop(L, 1); lua_getfield(L, index, "y"); CHECK_POS_COORD("y"); pos.Y = lua_tonumber(L, -1); - CHECK_FLOAT_RANGE(pos.Y, "y") + CHECK_FLOAT(pos.Y, "y"); lua_pop(L, 1); lua_getfield(L, index, "z"); CHECK_POS_COORD("z"); pos.Z = lua_tonumber(L, -1); - CHECK_FLOAT_RANGE(pos.Z, "z") + CHECK_FLOAT(pos.Z, "z"); lua_pop(L, 1); return pos; } @@ -281,6 +281,7 @@ void push_v3s16(lua_State *L, v3s16 p) lua_setfield(L, -2, "y"); lua_pushinteger(L, p.Z); lua_setfield(L, -2, "z"); + set_vector_metatable(L); } v3s16 read_v3s16(lua_State *L, int index) @@ -457,17 +458,9 @@ size_t read_stringlist(lua_State *L, int index, std::vector<std::string> *result Table field getters */ -#if defined(__MINGW32__) && !defined(__MINGW64__) -/* MinGW 32-bit somehow crashes in the std::set destructor when this - * variable is thread-local, so just don't do that. */ -static std::set<u64> warned_msgs; -#endif - bool check_field_or_nil(lua_State *L, int index, int type, const char *fieldname) { -#if !defined(__MINGW32__) || defined(__MINGW64__) thread_local std::set<u64> warned_msgs; -#endif int t = lua_type(L, index); if (t == LUA_TNIL) @@ -679,48 +672,3 @@ size_t write_array_slice_float( return elem_index - 1; } - - -size_t write_array_slice_u16( - lua_State *L, - int table_index, - u16 *data, - v3u16 data_size, - v3u16 slice_offset, - v3u16 slice_size) -{ - v3u16 pmin, pmax(data_size); - - if (slice_offset.X > 0) { - slice_offset.X--; - pmin.X = slice_offset.X; - pmax.X = MYMIN(slice_offset.X + slice_size.X, data_size.X); - } - - if (slice_offset.Y > 0) { - slice_offset.Y--; - pmin.Y = slice_offset.Y; - pmax.Y = MYMIN(slice_offset.Y + slice_size.Y, data_size.Y); - } - - if (slice_offset.Z > 0) { - slice_offset.Z--; - pmin.Z = slice_offset.Z; - pmax.Z = MYMIN(slice_offset.Z + slice_size.Z, data_size.Z); - } - - const u32 ystride = data_size.X; - const u32 zstride = data_size.X * data_size.Y; - - u32 elem_index = 1; - for (u32 z = pmin.Z; z != pmax.Z; z++) - for (u32 y = pmin.Y; y != pmax.Y; y++) - for (u32 x = pmin.X; x != pmax.X; x++) { - u32 i = z * zstride + y * ystride + x; - lua_pushinteger(L, data[i]); - lua_rawseti(L, table_index, elem_index); - elem_index++; - } - - return elem_index - 1; -} diff --git a/src/script/common/c_converter.h b/src/script/common/c_converter.h index a4a7079fd..2af726d16 100644 --- a/src/script/common/c_converter.h +++ b/src/script/common/c_converter.h @@ -61,23 +61,10 @@ bool getintfield(lua_State *L, int table, return got; } -template<class T> -bool getv3intfield(lua_State *L, int index, - const char *fieldname, T &result) -{ - lua_getfield(L, index, fieldname); - bool got = false; - if (lua_istable(L, -1)) { - got |= getintfield(L, -1, "x", result.X); - got |= getintfield(L, -1, "y", result.Y); - got |= getintfield(L, -1, "z", result.Z); - } - lua_pop(L, 1); - return got; -} - +// Retrieve an v3s16 where all components are optional (falls back to default) v3s16 getv3s16field_default(lua_State *L, int table, const char *fieldname, v3s16 default_); + bool getstringfield(lua_State *L, int table, const char *fieldname, std::string &result); size_t getstringlistfield(lua_State *L, int table, @@ -100,6 +87,7 @@ void setboolfield(lua_State *L, int table, const char *fieldname, bool value); v3f checkFloatPos (lua_State *L, int index); +v2f check_v2f (lua_State *L, int index); v3f check_v3f (lua_State *L, int index); v3s16 check_v3s16 (lua_State *L, int index); @@ -118,9 +106,6 @@ std::vector<aabb3f> read_aabb3f_vector (lua_State *L, int index, f32 scale); size_t read_stringlist (lua_State *L, int index, std::vector<std::string> *result); -void push_float_string (lua_State *L, float value); -void push_v3_float_string(lua_State *L, v3f p); -void push_v2_float_string(lua_State *L, v2f p); void push_v2s16 (lua_State *L, v2s16 p); void push_v2s32 (lua_State *L, v2s32 p); void push_v3s16 (lua_State *L, v3s16 p); @@ -136,5 +121,3 @@ void warn_if_field_exists(lua_State *L, int table, size_t write_array_slice_float(lua_State *L, int table_index, float *data, v3u16 data_size, v3u16 slice_offset, v3u16 slice_size); -size_t write_array_slice_u16(lua_State *L, int table_index, u16 *data, - v3u16 data_size, v3u16 slice_offset, v3u16 slice_size); diff --git a/src/script/common/c_internal.cpp b/src/script/common/c_internal.cpp index 6df1f8b7b..ddd2d184c 100644 --- a/src/script/common/c_internal.cpp +++ b/src/script/common/c_internal.cpp @@ -18,10 +18,12 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "common/c_internal.h" +#include "util/numeric.h" #include "debug.h" #include "log.h" #include "porting.h" #include "settings.h" +#include <algorithm> // std::find std::string script_get_backtrace(lua_State *L) { @@ -99,80 +101,82 @@ void script_error(lua_State *L, int pcall_result, const char *mod, const char *f throw LuaError(err_msg); } -// Push the list of callbacks (a lua table). -// Then push nargs arguments. -// Then call this function, which -// - runs the callbacks -// - replaces the table and arguments with the return value, -// computed depending on mode -void script_run_callbacks_f(lua_State *L, int nargs, - RunCallbacksMode mode, const char *fxn) -{ - FATAL_ERROR_IF(lua_gettop(L) < nargs + 1, "Not enough arguments"); - - // Insert error handler - PUSH_ERROR_HANDLER(L); - int error_handler = lua_gettop(L) - nargs - 1; - lua_insert(L, error_handler); - - // Insert run_callbacks between error handler and table - lua_getglobal(L, "core"); - lua_getfield(L, -1, "run_callbacks"); - lua_remove(L, -2); - lua_insert(L, error_handler + 1); - - // Insert mode after table - lua_pushnumber(L, (int) mode); - lua_insert(L, error_handler + 3); - - // Stack now looks like this: - // ... <error handler> <run_callbacks> <table> <mode> <arg#1> <arg#2> ... <arg#n> - - int result = lua_pcall(L, nargs + 2, 1, error_handler); - if (result != 0) - script_error(L, result, NULL, fxn); - - lua_remove(L, error_handler); -} - -static void script_log(lua_State *L, const std::string &message, - std::ostream &log_to, bool do_error, int stack_depth) +static void script_log_add_source(lua_State *L, std::string &message, int stack_depth) { lua_Debug ar; - log_to << message << " "; if (lua_getstack(L, stack_depth, &ar)) { FATAL_ERROR_IF(!lua_getinfo(L, "Sl", &ar), "lua_getinfo() failed"); - log_to << "(at " << ar.short_src << ":" << ar.currentline << ")"; + message.append(" (at " + std::string(ar.short_src) + ":" + + std::to_string(ar.currentline) + ")"); } else { - log_to << "(at ?:?)"; + message.append(" (at ?:?)"); } - log_to << std::endl; - - if (do_error) - script_error(L, LUA_ERRRUN, NULL, NULL); - else - infostream << script_get_backtrace(L) << std::endl; } -void log_deprecated(lua_State *L, const std::string &message, int stack_depth) +bool script_log_unique(lua_State *L, std::string message, std::ostream &log_to, + int stack_depth) +{ + thread_local std::vector<u64> logged_messages; + + script_log_add_source(L, message, stack_depth); + u64 hash = murmur_hash_64_ua(message.data(), message.length(), 0xBADBABE); + + if (std::find(logged_messages.begin(), logged_messages.end(), hash) + == logged_messages.end()) { + + logged_messages.emplace_back(hash); + log_to << message << std::endl; + return true; + } + return false; +} + +DeprecatedHandlingMode get_deprecated_handling_mode() { static thread_local bool configured = false; - static thread_local bool do_log = false; - static thread_local bool do_error = false; + static thread_local DeprecatedHandlingMode ret = DeprecatedHandlingMode::Ignore; // Only read settings on first call if (!configured) { std::string value = g_settings->get("deprecated_lua_api_handling"); if (value == "log") { - do_log = true; + ret = DeprecatedHandlingMode::Log; } else if (value == "error") { - do_log = true; - do_error = true; + ret = DeprecatedHandlingMode::Error; } configured = true; } - if (do_log) - script_log(L, message, warningstream, do_error, stack_depth); + return ret; +} + +void log_deprecated(lua_State *L, std::string message, int stack_depth) +{ + DeprecatedHandlingMode mode = get_deprecated_handling_mode(); + if (mode == DeprecatedHandlingMode::Ignore) + return; + + script_log_add_source(L, message, stack_depth); + warningstream << message << std::endl; + + if (mode == DeprecatedHandlingMode::Error) + script_error(L, LUA_ERRRUN, NULL, NULL); + else + infostream << script_get_backtrace(L) << std::endl; +} + +void call_string_dump(lua_State *L, int idx) +{ + // Retrieve string.dump from insecure env to avoid it being tampered with + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_GLOBALS_BACKUP); + if (!lua_isnil(L, -1)) + lua_getfield(L, -1, "string"); + else + lua_getglobal(L, "string"); + lua_getfield(L, -1, "dump"); + lua_remove(L, -2); // remove _G + lua_remove(L, -2); // remove 'string' table + lua_pushvalue(L, idx); + lua_call(L, 1, 1); } diff --git a/src/script/common/c_internal.h b/src/script/common/c_internal.h index 442546332..272a39941 100644 --- a/src/script/common/c_internal.h +++ b/src/script/common/c_internal.h @@ -54,6 +54,10 @@ extern "C" { #define CUSTOM_RIDX_GLOBALS_BACKUP (CUSTOM_RIDX_BASE + 1) #define CUSTOM_RIDX_CURRENT_MOD_NAME (CUSTOM_RIDX_BASE + 2) #define CUSTOM_RIDX_BACKTRACE (CUSTOM_RIDX_BASE + 3) +#define CUSTOM_RIDX_HTTP_API_LUA (CUSTOM_RIDX_BASE + 4) +#define CUSTOM_RIDX_VECTOR_METATABLE (CUSTOM_RIDX_BASE + 5) +#define CUSTOM_RIDX_METATABLE_MAP (CUSTOM_RIDX_BASE + 6) + // Determine if CUSTOM_RIDX_SCRIPTAPI will hold a light or full userdata #if defined(__aarch64__) && USE_LUAJIT @@ -75,9 +79,6 @@ extern "C" { } \ } -#define script_run_callbacks(L, nargs, mode) \ - script_run_callbacks_f((L), (nargs), (mode), __FUNCTION__) - // What script_run_callbacks does with the return values of callbacks. // Regardless of the mode, if only one callback is defined, // its return value is the total return value. @@ -108,11 +109,38 @@ enum RunCallbacksMode // are converted by readParam<bool> to true or false, respectively. }; +// Gets a backtrace of the current execution point std::string script_get_backtrace(lua_State *L); +// Wrapper for CFunction calls that converts C++ exceptions to Lua errors int script_exception_wrapper(lua_State *L, lua_CFunction f); +// Takes an error from lua_pcall and throws it as a LuaError void script_error(lua_State *L, int pcall_result, const char *mod, const char *fxn); -void script_run_callbacks_f(lua_State *L, int nargs, - RunCallbacksMode mode, const char *fxn); -void log_deprecated(lua_State *L, const std::string &message, - int stack_depth=1); +bool script_log_unique(lua_State *L, std::string message, std::ostream &log_to, + int stack_depth = 1); + +enum DeprecatedHandlingMode { + Ignore, + Log, + Error +}; + +/** + * Reads `deprecated_lua_api_handling` in settings, returns cached value. + * + * @return DeprecatedHandlingMode + */ +DeprecatedHandlingMode get_deprecated_handling_mode(); + +/** + * Handles a deprecation warning based on user settings + * + * @param L Lua State + * @param message The deprecation method + * @param stack_depth How far on the stack to the first user function (ie: not builtin or core) + */ +void log_deprecated(lua_State *L, std::string message, int stack_depth = 1); + +// Safely call string.dump on a function value +// (does not pop, leaves one value on stack) +void call_string_dump(lua_State *L, int idx); diff --git a/src/script/common/c_packer.cpp b/src/script/common/c_packer.cpp new file mode 100644 index 000000000..597f5e447 --- /dev/null +++ b/src/script/common/c_packer.cpp @@ -0,0 +1,596 @@ +/* +Minetest +Copyright (C) 2022 sfan5 <sfan5@live.de> + +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. +*/ + +#include <cstdio> +#include <cstring> +#include <cmath> +#include <cassert> +#include <unordered_set> +#include <unordered_map> +#include "c_packer.h" +#include "c_internal.h" +#include "log.h" +#include "debug.h" +#include "threading/mutex_auto_lock.h" + +extern "C" { +#include <lauxlib.h> +} + +// +// Helpers +// + +// convert negative index to absolute position on Lua stack +static inline int absidx(lua_State *L, int idx) +{ + assert(idx < 0); + return lua_gettop(L) + idx + 1; +} + +// does the type put anything into PackedInstr::sdata? +static inline bool uses_sdata(int type) +{ + switch (type) { + case LUA_TSTRING: + case LUA_TFUNCTION: + case LUA_TUSERDATA: + return true; + default: + return false; + } +} + +// does the type put anything into PackedInstr::<union>? +static inline bool uses_union(int type) +{ + switch (type) { + case LUA_TNIL: + case LUA_TSTRING: + case LUA_TFUNCTION: + return false; + default: + return true; + } +} + +static inline bool can_set_into(int ktype, int vtype) +{ + switch (ktype) { + case LUA_TNUMBER: + return !uses_union(vtype); + case LUA_TSTRING: + return !uses_sdata(vtype); + default: + return false; + } +} + +// is the key suitable for use with set_into? +static inline bool suitable_key(lua_State *L, int idx) +{ + if (lua_type(L, idx) == LUA_TSTRING) { + // strings may not have a NULL byte (-> lua_setfield) + size_t len; + const char *str = lua_tolstring(L, idx, &len); + return strlen(str) == len; + } else { + assert(lua_type(L, idx) == LUA_TNUMBER); + // numbers must fit into an s32 and be integers (-> lua_rawseti) + lua_Number n = lua_tonumber(L, idx); + return std::floor(n) == n && n >= S32_MIN && n <= S32_MAX; + } +} + +namespace { + // checks if you left any values on the stack, for debugging + class StackChecker { + lua_State *L; + int top; + public: + StackChecker(lua_State *L) : L(L), top(lua_gettop(L)) {} + ~StackChecker() { + assert(lua_gettop(L) >= top); + if (lua_gettop(L) > top) { + rawstream << "Lua stack not cleaned up: " + << lua_gettop(L) << " != " << top + << " (false-positive if exception thrown)" << std::endl; + } + } + }; + + // Since an std::vector may reallocate, this is the only safe way to keep + // a reference to a particular element. + template <typename T> + class VectorRef { + std::vector<T> *vec; + size_t idx; + VectorRef(std::vector<T> *vec, size_t idx) : vec(vec), idx(idx) {} + public: + constexpr VectorRef() : vec(nullptr), idx(0) {} + static VectorRef<T> front(std::vector<T> &vec) { + return VectorRef(&vec, 0); + } + static VectorRef<T> back(std::vector<T> &vec) { + return VectorRef(&vec, vec.size() - 1); + } + T &operator*() { return (*vec)[idx]; } + T *operator->() { return &(*vec)[idx]; } + operator bool() const { return vec != nullptr; } + }; + + struct Packer { + PackInFunc fin; + PackOutFunc fout; + }; + + typedef std::pair<std::string, Packer> PackerTuple; +} + +static inline auto emplace(PackedValue &pv, s16 type) +{ + pv.i.emplace_back(); + auto ref = VectorRef<PackedInstr>::back(pv.i); + ref->type = type; + // Initialize fields that may be left untouched + if (type == LUA_TTABLE) { + ref->uidata1 = 0; + ref->uidata2 = 0; + } else if (type == LUA_TUSERDATA) { + ref->ptrdata = nullptr; + } else if (type == INSTR_POP) { + ref->sidata2 = 0; + } + return ref; +} + +// +// Management of registered packers +// + +static std::unordered_map<std::string, Packer> g_packers; +static std::mutex g_packers_lock; + +void script_register_packer(lua_State *L, const char *regname, + PackInFunc fin, PackOutFunc fout) +{ + // Store away callbacks + { + MutexAutoLock autolock(g_packers_lock); + auto it = g_packers.find(regname); + if (it == g_packers.end()) { + auto &ref = g_packers[regname]; + ref.fin = fin; + ref.fout = fout; + } else { + FATAL_ERROR_IF(it->second.fin != fin || it->second.fout != fout, + "Packer registered twice with mismatching callbacks"); + } + } + + // Save metatable so we can identify instances later + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_METATABLE_MAP); + if (lua_isnil(L, -1)) { + lua_newtable(L); + lua_pushvalue(L, -1); + lua_rawseti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_METATABLE_MAP); + } + + luaL_getmetatable(L, regname); + FATAL_ERROR_IF(lua_isnil(L, -1), "No metatable registered with that name"); + + // CUSTOM_RIDX_METATABLE_MAP contains { [metatable] = "regname", ... } + // check first + lua_pushstring(L, regname); + lua_rawget(L, -3); + if (!lua_isnil(L, -1)) { + FATAL_ERROR_IF(lua_topointer(L, -1) != lua_topointer(L, -2), + "Packer registered twice with inconsistent metatable"); + } + lua_pop(L, 1); + // then set + lua_pushstring(L, regname); + lua_rawset(L, -3); + + lua_pop(L, 1); +} + +static bool find_packer(const char *regname, PackerTuple &out) +{ + MutexAutoLock autolock(g_packers_lock); + auto it = g_packers.find(regname); + if (it == g_packers.end()) + return false; + // copy data for thread safety + out.first = it->first; + out.second = it->second; + return true; +} + +static bool find_packer(lua_State *L, int idx, PackerTuple &out) +{ +#ifndef NDEBUG + StackChecker checker(L); +#endif + + // retrieve metatable of the object + if (lua_getmetatable(L, idx) != 1) + return false; + + // use our global table to map it to the registry name + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_METATABLE_MAP); + assert(lua_istable(L, -1)); + lua_pushvalue(L, -2); + lua_rawget(L, -2); + if (lua_isnil(L, -1)) { + lua_pop(L, 3); + return false; + } + + // load the associated data + bool found = find_packer(lua_tostring(L, -1), out); + FATAL_ERROR_IF(!found, "Inconsistent internal state"); + lua_pop(L, 3); + return true; +} + +// +// Packing implementation +// + +static VectorRef<PackedInstr> record_object(lua_State *L, int idx, PackedValue &pv, + std::unordered_map<const void *, s32> &seen) +{ + const void *ptr = lua_topointer(L, idx); + assert(ptr); + auto found = seen.find(ptr); + if (found == seen.end()) { + seen[ptr] = pv.i.size(); + return VectorRef<PackedInstr>(); + } + s32 ref = found->second; + assert(ref < (s32)pv.i.size()); + // reuse the value from first time + auto r = emplace(pv, INSTR_PUSHREF); + r->ref = ref; + pv.i[ref].keep_ref = true; + return r; +} + +static VectorRef<PackedInstr> pack_inner(lua_State *L, int idx, int vidx, PackedValue &pv, + std::unordered_map<const void *, s32> &seen) +{ +#ifndef NDEBUG + StackChecker checker(L); + assert(idx > 0); + assert(vidx > 0); +#endif + + switch (lua_type(L, idx)) { + case LUA_TNONE: + case LUA_TNIL: + return emplace(pv, LUA_TNIL); + case LUA_TBOOLEAN: { + auto r = emplace(pv, LUA_TBOOLEAN); + r->bdata = lua_toboolean(L, idx); + return r; + } + case LUA_TNUMBER: { + auto r = emplace(pv, LUA_TNUMBER); + r->ndata = lua_tonumber(L, idx); + return r; + } + case LUA_TSTRING: { + auto r = emplace(pv, LUA_TSTRING); + size_t len; + const char *str = lua_tolstring(L, idx, &len); + assert(str); + r->sdata.assign(str, len); + return r; + } + case LUA_TTABLE: { + auto r = record_object(L, idx, pv, seen); + if (r) + return r; + break; // execution continues + } + case LUA_TFUNCTION: { + auto r = record_object(L, idx, pv, seen); + if (r) + return r; + r = emplace(pv, LUA_TFUNCTION); + call_string_dump(L, idx); + size_t len; + const char *str = lua_tolstring(L, -1, &len); + assert(str); + r->sdata.assign(str, len); + lua_pop(L, 1); + return r; + } + case LUA_TUSERDATA: { + auto r = record_object(L, idx, pv, seen); + if (r) + return r; + PackerTuple ser; + if (!find_packer(L, idx, ser)) + throw LuaError("Cannot serialize unsupported userdata"); + pv.contains_userdata = true; + r = emplace(pv, LUA_TUSERDATA); + r->sdata = ser.first; + r->ptrdata = ser.second.fin(L, idx); + return r; + } + default: { + std::string err = "Cannot serialize type "; + err += lua_typename(L, lua_type(L, idx)); + throw LuaError(err); + } + } + + // LUA_TTABLE + lua_checkstack(L, 5); + + auto rtable = emplace(pv, LUA_TTABLE); + const int vi_table = vidx++; + + lua_pushnil(L); + while (lua_next(L, idx) != 0) { + // key at -2, value at -1 + const int ktype = lua_type(L, -2), vtype = lua_type(L, -1); + if (ktype == LUA_TNUMBER) + rtable->uidata1++; // narr + else + rtable->uidata2++; // nrec + + // check if we can use a shortcut + if (can_set_into(ktype, vtype) && suitable_key(L, -2)) { + // push only the value + auto rval = pack_inner(L, absidx(L, -1), vidx, pv, seen); + rval->pop = rval->type != LUA_TTABLE; + // and where to put it: + rval->set_into = vi_table; + if (ktype == LUA_TSTRING) + rval->sdata = lua_tostring(L, -2); + else + rval->sidata1 = lua_tointeger(L, -2); + // pop tables after the fact + if (!rval->pop) { + auto ri1 = emplace(pv, INSTR_POP); + ri1->sidata1 = vidx; + } + } else { + // push the key and value + pack_inner(L, absidx(L, -2), vidx, pv, seen); + vidx++; + pack_inner(L, absidx(L, -1), vidx, pv, seen); + vidx++; + // push an instruction to set them + auto ri1 = emplace(pv, INSTR_SETTABLE); + ri1->set_into = vi_table; + ri1->sidata1 = vidx - 2; + ri1->sidata2 = vidx - 1; + ri1->pop = true; + vidx -= 2; + } + + lua_pop(L, 1); + } + + assert(vidx == vi_table + 1); + return rtable; +} + +PackedValue *script_pack(lua_State *L, int idx) +{ + if (idx < 0) + idx = absidx(L, idx); + + PackedValue pv; + std::unordered_map<const void *, s32> seen; + pack_inner(L, idx, 1, pv, seen); + + return new PackedValue(std::move(pv)); +} + +// +// Unpacking implementation +// + +void script_unpack(lua_State *L, PackedValue *pv) +{ + lua_newtable(L); // table at index top to track ref indices -> objects + const int top = lua_gettop(L); + int ctr = 0; + + for (size_t packed_idx = 0; packed_idx < pv->i.size(); packed_idx++) { + auto &i = pv->i[packed_idx]; + + // If leaving values on stack make sure there's space (every 5th iteration) + if (!i.pop && (ctr++) >= 5) { + lua_checkstack(L, 5); + ctr = 0; + } + + switch (i.type) { + /* Instructions */ + case INSTR_SETTABLE: + lua_pushvalue(L, top + i.sidata1); // key + lua_pushvalue(L, top + i.sidata2); // value + lua_rawset(L, top + i.set_into); + if (i.pop) { + if (i.sidata1 != i.sidata2) { + // removing moves indices so pop higher index first + lua_remove(L, top + std::max(i.sidata1, i.sidata2)); + lua_remove(L, top + std::min(i.sidata1, i.sidata2)); + } else { + lua_remove(L, top + i.sidata1); + } + } + continue; + case INSTR_POP: + lua_remove(L, top + i.sidata1); + if (i.sidata2 > 0) + lua_remove(L, top + i.sidata2); + continue; + case INSTR_PUSHREF: + lua_pushinteger(L, i.ref); + lua_rawget(L, top); + break; + + /* Lua types */ + case LUA_TNIL: + lua_pushnil(L); + break; + case LUA_TBOOLEAN: + lua_pushboolean(L, i.bdata); + break; + case LUA_TNUMBER: + lua_pushnumber(L, i.ndata); + break; + case LUA_TSTRING: + lua_pushlstring(L, i.sdata.data(), i.sdata.size()); + break; + case LUA_TTABLE: + lua_createtable(L, i.uidata1, i.uidata2); + break; + case LUA_TFUNCTION: + luaL_loadbuffer(L, i.sdata.data(), i.sdata.size(), nullptr); + break; + case LUA_TUSERDATA: { + PackerTuple ser; + sanity_check(find_packer(i.sdata.c_str(), ser)); + ser.second.fout(L, i.ptrdata); + i.ptrdata = nullptr; // ownership taken by callback + break; + } + + default: + assert(0); + break; + } + + if (i.keep_ref) { + lua_pushinteger(L, packed_idx); + lua_pushvalue(L, -2); + lua_rawset(L, top); + } + + if (i.set_into) { + if (!i.pop) + lua_pushvalue(L, -1); + if (uses_sdata(i.type)) + lua_rawseti(L, top + i.set_into, i.sidata1); + else + lua_setfield(L, top + i.set_into, i.sdata.c_str()); + } else { + if (i.pop) + lua_pop(L, 1); + } + } + + // as part of the unpacking process we take ownership of all userdata + pv->contains_userdata = false; + // leave exactly one value on the stack + lua_settop(L, top+1); + lua_remove(L, top); +} + +// +// PackedValue +// + +PackedValue::~PackedValue() +{ + if (!contains_userdata) + return; + for (auto &i : this->i) { + if (i.type == LUA_TUSERDATA && i.ptrdata) { + PackerTuple ser; + if (find_packer(i.sdata.c_str(), ser)) { + // tell it to deallocate object + ser.second.fout(nullptr, i.ptrdata); + } else { + assert(false); + } + } + } +} + +// +// script_dump_packed +// + +#ifndef NDEBUG +void script_dump_packed(const PackedValue *val) +{ + printf("instruction stream: [\n"); + for (const auto &i : val->i) { + printf("\t("); + switch (i.type) { + case INSTR_SETTABLE: + printf("SETTABLE(%d, %d)", i.sidata1, i.sidata2); + break; + case INSTR_POP: + printf(i.sidata2 ? "POP(%d, %d)" : "POP(%d)", i.sidata1, i.sidata2); + break; + case INSTR_PUSHREF: + printf("PUSHREF(%d)", i.ref); + break; + case LUA_TNIL: + printf("nil"); + break; + case LUA_TBOOLEAN: + printf(i.bdata ? "true" : "false"); + break; + case LUA_TNUMBER: + printf("%f", i.ndata); + break; + case LUA_TSTRING: + printf("\"%s\"", i.sdata.c_str()); + break; + case LUA_TTABLE: + printf("table(%d, %d)", i.uidata1, i.uidata2); + break; + case LUA_TFUNCTION: + printf("function(%lu byte)", i.sdata.size()); + break; + case LUA_TUSERDATA: + printf("userdata %s %p", i.sdata.c_str(), i.ptrdata); + break; + default: + printf("!!UNKNOWN!!"); + break; + } + if (i.set_into) { + if (i.type >= 0 && uses_sdata(i.type)) + printf(", k=%d, into=%d", i.sidata1, i.set_into); + else if (i.type >= 0) + printf(", k=\"%s\", into=%d", i.sdata.c_str(), i.set_into); + else + printf(", into=%d", i.set_into); + } + if (i.keep_ref) + printf(", keep_ref"); + if (i.pop) + printf(", pop"); + printf(")\n"); + } + printf("]\n"); +} +#endif diff --git a/src/script/common/c_packer.h b/src/script/common/c_packer.h new file mode 100644 index 000000000..fe072c10a --- /dev/null +++ b/src/script/common/c_packer.h @@ -0,0 +1,126 @@ +/* +Minetest +Copyright (C) 2022 sfan5 <sfan5@live.de> + +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. +*/ + +#pragma once + +#include <string> +#include <vector> +#include "irrlichttypes.h" +#include "util/basic_macros.h" + +extern "C" { +#include <lua.h> +} + +/* + This file defines an in-memory representation of Lua objects including + support for functions and userdata. It it used to move data between Lua + states and cannot be used for persistence or network transfer. +*/ + +#define INSTR_SETTABLE (-10) +#define INSTR_POP (-11) +#define INSTR_PUSHREF (-12) + +/** + * Represents a single instruction that pushes a new value or works with existing ones. + */ +struct PackedInstr +{ + s16 type; // LUA_T* or INSTR_* + u16 set_into; // set into table on stack + bool keep_ref; // is referenced later by INSTR_PUSHREF? + bool pop; // remove from stack? + union { + bool bdata; // boolean: value + lua_Number ndata; // number: value + struct { + u16 uidata1, uidata2; // table: narr, nrec + }; + struct { + /* + SETTABLE: key index, value index + POP: indices to remove + otherwise w/ set_into: numeric key, - + */ + s32 sidata1, sidata2; + }; + void *ptrdata; // userdata: implementation defined + s32 ref; // PUSHREF: index of referenced instr + }; + /* + - string: value + - function: buffer + - w/ set_into: string key (no null bytes!) + - userdata: name in registry + */ + std::string sdata; + + PackedInstr() : type(0), set_into(0), keep_ref(false), pop(false) {} +}; + +/** + * A packed value can be a primitive like a string or number but also a table + * including all of its contents. It is made up of a linear stream of + * 'instructions' that build the final value when executed. + */ +struct PackedValue +{ + std::vector<PackedInstr> i; + // Indicates whether there are any userdata pointers that need to be deallocated + bool contains_userdata = false; + + PackedValue() = default; + ~PackedValue(); + + DISABLE_CLASS_COPY(PackedValue) + + ALLOW_CLASS_MOVE(PackedValue) +}; + +/* + * Packing callback: Turns a Lua value at given index into a void* + */ +typedef void *(*PackInFunc)(lua_State *L, int idx); +/* + * Unpacking callback: Turns a void* back into the Lua value (left on top of stack) + * + * Note that this function must take ownership of the pointer, so make sure + * to free or keep the memory. + * `L` can be nullptr to indicate that data should just be discarded. + */ +typedef void (*PackOutFunc)(lua_State *L, void *ptr); +/* + * Register a packable type with the name of its metatable. + * + * Even though the callbacks are global this must be called for every Lua state + * that supports objects of this type. + * This function is thread-safe. + */ +void script_register_packer(lua_State *L, const char *regname, + PackInFunc fin, PackOutFunc fout); + +// Pack a Lua value +PackedValue *script_pack(lua_State *L, int idx); +// Unpack a Lua value (left on top of stack) +// Note that this may modify the PackedValue, reusability is not guaranteed! +void script_unpack(lua_State *L, PackedValue *val); + +// Dump contents of PackedValue to stdout for debugging +void script_dump_packed(const PackedValue *val); diff --git a/src/script/common/helper.cpp b/src/script/common/helper.cpp index f53a2b7e8..72de2b14a 100644 --- a/src/script/common/helper.cpp +++ b/src/script/common/helper.cpp @@ -17,95 +17,68 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +extern "C" { +#include <lauxlib.h> +} + #include "helper.h" #include <cmath> -#include <sstream> #include <irr_v2d.h> +#include <irr_v3d.h> +#include "c_converter.h" #include "c_types.h" -#include "c_internal.h" - -// imported from c_converter.cpp with pure C++ style -static inline void check_lua_type(lua_State *L, int index, const char *name, int type) -{ - int t = lua_type(L, index); - if (t != type) { - std::string traceback = script_get_backtrace(L); - throw LuaError(std::string("Invalid ") + (name) + " (expected " + - lua_typename(L, (type)) + " got " + lua_typename(L, t) + - ").\n" + traceback); - } -} - -// imported from c_converter.cpp -#define CHECK_POS_COORD(name) \ - check_lua_type(L, -1, "position coordinate '" name "'", LUA_TNUMBER) -#define CHECK_POS_TAB(index) check_lua_type(L, index, "position", LUA_TTABLE) - -bool LuaHelper::isNaN(lua_State *L, int idx) -{ - return lua_type(L, idx) == LUA_TNUMBER && std::isnan(lua_tonumber(L, idx)); -} /* * Read template functions */ -template <> bool LuaHelper::readParam(lua_State *L, int index) +template <> +bool LuaHelper::readParam(lua_State *L, int index) { return lua_toboolean(L, index) != 0; } -template <> bool LuaHelper::readParam(lua_State *L, int index, const bool &default_value) +template <> +s16 LuaHelper::readParam(lua_State *L, int index) { - if (lua_isnil(L, index)) - return default_value; - - return lua_toboolean(L, index) != 0; + return luaL_checkinteger(L, index); } -template <> s16 LuaHelper::readParam(lua_State *L, int index) +template <> +int LuaHelper::readParam(lua_State *L, int index) { - return lua_tonumber(L, index); + return luaL_checkinteger(L, index); } -template <> float LuaHelper::readParam(lua_State *L, int index) +template <> +float LuaHelper::readParam(lua_State *L, int index) { - if (isNaN(L, index)) - throw LuaError("NaN value is not allowed."); + lua_Number v = luaL_checknumber(L, index); + if (std::isnan(v) && std::isinf(v)) + throw LuaError("Invalid float value (NaN or infinity)"); - return (float)luaL_checknumber(L, index); + return static_cast<float>(v); } -template <> v2s16 LuaHelper::readParam(lua_State *L, int index) +template <> +v2s16 LuaHelper::readParam(lua_State *L, int index) { - v2s16 p; - CHECK_POS_TAB(index); - lua_getfield(L, index, "x"); - CHECK_POS_COORD("x"); - p.X = readParam<s16>(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - CHECK_POS_COORD("y"); - p.Y = readParam<s16>(L, -1); - lua_pop(L, 1); - return p; + return read_v2s16(L, index); } -template <> v2f LuaHelper::readParam(lua_State *L, int index) +template <> +v2f LuaHelper::readParam(lua_State *L, int index) { - v2f p; - CHECK_POS_TAB(index); - lua_getfield(L, index, "x"); - CHECK_POS_COORD("x"); - p.X = readParam<float>(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - CHECK_POS_COORD("y"); - p.Y = readParam<float>(L, -1); - lua_pop(L, 1); - return p; + return check_v2f(L, index); } -template <> std::string LuaHelper::readParam(lua_State *L, int index) +template <> +v3f LuaHelper::readParam(lua_State *L, int index) +{ + return check_v3f(L, index); +} + +template <> +std::string LuaHelper::readParam(lua_State *L, int index) { size_t length; std::string result; @@ -113,16 +86,3 @@ template <> std::string LuaHelper::readParam(lua_State *L, int index) result.assign(str, length); return result; } - -template <> -std::string LuaHelper::readParam( - lua_State *L, int index, const std::string &default_value) -{ - std::string result; - const char *str = lua_tostring(L, index); - if (str) - result.append(str); - else - result = default_value; - return result; -} diff --git a/src/script/common/helper.h b/src/script/common/helper.h index d639d6e16..fc462b6ef 100644 --- a/src/script/common/helper.h +++ b/src/script/common/helper.h @@ -21,14 +21,11 @@ with this program; if not, write to the Free Software Foundation, Inc., extern "C" { #include <lua.h> -#include <lauxlib.h> } class LuaHelper { protected: - static bool isNaN(lua_State *L, int idx); - /** * Read a value using a template type T from Lua State L and index * @@ -38,7 +35,8 @@ protected: * @param index Lua Index to read * @return read value from Lua */ - template <typename T> static T readParam(lua_State *L, int index); + template <typename T> + static T readParam(lua_State *L, int index); /** * Read a value using a template type T from Lua State L and index @@ -50,5 +48,8 @@ protected: * @return read value from Lua or default value if nil */ template <typename T> - static T readParam(lua_State *L, int index, const T &default_value); + static inline T readParam(lua_State *L, int index, const T &default_value) + { + return lua_isnoneornil(L, index) ? default_value : readParam<T>(L, index); + } }; diff --git a/src/script/cpp_api/s_async.cpp b/src/script/cpp_api/s_async.cpp index 5f1f9297e..42a794ceb 100644 --- a/src/script/cpp_api/s_async.cpp +++ b/src/script/cpp_api/s_async.cpp @@ -21,9 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <cstdlib> extern "C" { -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" +#include <lua.h> +#include <lauxlib.h> +#include <lualib.h> } #include "server.h" @@ -32,20 +32,20 @@ extern "C" { #include "filesys.h" #include "porting.h" #include "common/c_internal.h" +#include "common/c_packer.h" +#include "lua_api/l_base.h" /******************************************************************************/ AsyncEngine::~AsyncEngine() { - // Request all threads to stop for (AsyncWorkerThread *workerThread : workerThreads) { workerThread->stop(); } - // Wake up all threads - for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin(); - it != workerThreads.end(); ++it) { + for (auto it : workerThreads) { + (void)it; jobQueueCounter.post(); } @@ -68,6 +68,7 @@ AsyncEngine::~AsyncEngine() /******************************************************************************/ void AsyncEngine::registerStateInitializer(StateInitializer func) { + FATAL_ERROR_IF(initDone, "Initializer may not be registered after init"); stateInitializers.push_back(func); } @@ -76,45 +77,76 @@ void AsyncEngine::initialize(unsigned int numEngines) { initDone = true; - for (unsigned int i = 0; i < numEngines; i++) { - AsyncWorkerThread *toAdd = new AsyncWorkerThread(this, - std::string("AsyncWorker-") + itos(i)); - workerThreads.push_back(toAdd); - toAdd->start(); + if (numEngines == 0) { + // Leave one core for the main thread and one for whatever else + autoscaleMaxWorkers = Thread::getNumberOfProcessors(); + if (autoscaleMaxWorkers >= 2) + autoscaleMaxWorkers -= 2; + infostream << "AsyncEngine: using at most " << autoscaleMaxWorkers + << " threads with automatic scaling" << std::endl; + + addWorkerThread(); + } else { + for (unsigned int i = 0; i < numEngines; i++) + addWorkerThread(); } } -/******************************************************************************/ -unsigned int AsyncEngine::queueAsyncJob(const std::string &func, - const std::string ¶ms) +void AsyncEngine::addWorkerThread() { - jobQueueMutex.lock(); - LuaJobInfo toAdd; - toAdd.id = jobIdCounter++; - toAdd.serializedFunction = func; - toAdd.serializedParams = params; - - jobQueue.push_back(toAdd); - - jobQueueCounter.post(); - - jobQueueMutex.unlock(); - - return toAdd.id; + AsyncWorkerThread *toAdd = new AsyncWorkerThread(this, + std::string("AsyncWorker-") + itos(workerThreads.size())); + workerThreads.push_back(toAdd); + toAdd->start(); } /******************************************************************************/ -LuaJobInfo AsyncEngine::getJob() +u32 AsyncEngine::queueAsyncJob(std::string &&func, std::string &¶ms, + const std::string &mod_origin) +{ + MutexAutoLock autolock(jobQueueMutex); + u32 jobId = jobIdCounter++; + + jobQueue.emplace_back(); + auto &to_add = jobQueue.back(); + to_add.id = jobId; + to_add.function = std::move(func); + to_add.params = std::move(params); + to_add.mod_origin = mod_origin; + + jobQueueCounter.post(); + return jobId; +} + +u32 AsyncEngine::queueAsyncJob(std::string &&func, PackedValue *params, + const std::string &mod_origin) +{ + MutexAutoLock autolock(jobQueueMutex); + u32 jobId = jobIdCounter++; + + jobQueue.emplace_back(); + auto &to_add = jobQueue.back(); + to_add.id = jobId; + to_add.function = std::move(func); + to_add.params_ext.reset(params); + to_add.mod_origin = mod_origin; + + jobQueueCounter.post(); + return jobId; +} + +/******************************************************************************/ +bool AsyncEngine::getJob(LuaJobInfo *job) { jobQueueCounter.wait(); jobQueueMutex.lock(); - LuaJobInfo retval; + bool retval = false; if (!jobQueue.empty()) { - retval = jobQueue.front(); + *job = std::move(jobQueue.front()); jobQueue.pop_front(); - retval.valid = true; + retval = true; } jobQueueMutex.unlock(); @@ -122,96 +154,149 @@ LuaJobInfo AsyncEngine::getJob() } /******************************************************************************/ -void AsyncEngine::putJobResult(const LuaJobInfo &result) +void AsyncEngine::putJobResult(LuaJobInfo &&result) { resultQueueMutex.lock(); - resultQueue.push_back(result); + resultQueue.emplace_back(std::move(result)); resultQueueMutex.unlock(); } /******************************************************************************/ void AsyncEngine::step(lua_State *L) +{ + stepJobResults(L); + stepAutoscale(); +} + +void AsyncEngine::stepJobResults(lua_State *L) { int error_handler = PUSH_ERROR_HANDLER(L); lua_getglobal(L, "core"); - resultQueueMutex.lock(); + + ScriptApiBase *script = ModApiBase::getScriptApiBase(L); + + MutexAutoLock autolock(resultQueueMutex); while (!resultQueue.empty()) { - LuaJobInfo jobDone = resultQueue.front(); + LuaJobInfo j = std::move(resultQueue.front()); resultQueue.pop_front(); lua_getfield(L, -1, "async_event_handler"); - - if (lua_isnil(L, -1)) { + if (lua_isnil(L, -1)) FATAL_ERROR("Async event handler does not exist!"); - } - luaL_checktype(L, -1, LUA_TFUNCTION); - lua_pushinteger(L, jobDone.id); - lua_pushlstring(L, jobDone.serializedResult.data(), - jobDone.serializedResult.size()); + lua_pushinteger(L, j.id); + if (j.result_ext) + script_unpack(L, j.result_ext.get()); + else + lua_pushlstring(L, j.result.data(), j.result.size()); - PCALL_RESL(L, lua_pcall(L, 2, 0, error_handler)); + // Call handler + const char *origin = j.mod_origin.empty() ? nullptr : j.mod_origin.c_str(); + script->setOriginDirect(origin); + int result = lua_pcall(L, 2, 0, error_handler); + if (result) + script_error(L, result, origin, "<async>"); } - resultQueueMutex.unlock(); + lua_pop(L, 2); // Pop core and error handler } -/******************************************************************************/ -void AsyncEngine::pushFinishedJobs(lua_State* L) { - // Result Table - MutexAutoLock l(resultQueueMutex); +void AsyncEngine::stepAutoscale() +{ + if (workerThreads.size() >= autoscaleMaxWorkers) + return; - unsigned int index = 1; - lua_createtable(L, resultQueue.size(), 0); - int top = lua_gettop(L); + MutexAutoLock autolock(jobQueueMutex); - while (!resultQueue.empty()) { - LuaJobInfo jobDone = resultQueue.front(); - resultQueue.pop_front(); + // 2) If the timer elapsed, check again + if (autoscaleTimer && porting::getTimeMs() >= autoscaleTimer) { + autoscaleTimer = 0; + // Determine overlap with previous snapshot + unsigned int n = 0; + for (const auto &it : jobQueue) + n += autoscaleSeenJobs.count(it.id); + autoscaleSeenJobs.clear(); + infostream << "AsyncEngine: " << n << " jobs were still waiting after 1s" << std::endl; + // Start this many new threads + while (workerThreads.size() < autoscaleMaxWorkers && n > 0) { + addWorkerThread(); + n--; + } + return; + } - lua_createtable(L, 0, 2); // Pre-allocate space for two map fields - int top_lvl2 = lua_gettop(L); - - lua_pushstring(L, "jobid"); - lua_pushnumber(L, jobDone.id); - lua_settable(L, top_lvl2); - - lua_pushstring(L, "retval"); - lua_pushlstring(L, jobDone.serializedResult.data(), - jobDone.serializedResult.size()); - lua_settable(L, top_lvl2); - - lua_rawseti(L, top, index++); + // 1) Check if there's anything in the queue + if (!autoscaleTimer && !jobQueue.empty()) { + // Take a snapshot of all jobs we have seen + for (const auto &it : jobQueue) + autoscaleSeenJobs.emplace(it.id); + // and set a timer for 1 second + autoscaleTimer = porting::getTimeMs() + 1000; } } /******************************************************************************/ -void AsyncEngine::prepareEnvironment(lua_State* L, int top) +bool AsyncEngine::prepareEnvironment(lua_State* L, int top) { for (StateInitializer &stateInitializer : stateInitializers) { stateInitializer(L, top); } + + auto *script = ModApiBase::getScriptApiBase(L); + try { + script->loadMod(Server::getBuiltinLuaPath() + DIR_DELIM + "init.lua", + BUILTIN_MOD_NAME); + } catch (const ModError &e) { + errorstream << "Execution of async base environment failed: " + << e.what() << std::endl; + FATAL_ERROR("Execution of async base environment failed"); + } + + // Load per mod stuff + if (server) { + const auto &list = server->m_async_init_files; + try { + for (auto &it : list) + script->loadMod(it.second, it.first); + } catch (const ModError &e) { + errorstream << "Failed to load mod script inside async environment." << std::endl; + server->setAsyncFatalError(e.what()); + return false; + } + } + + return true; } /******************************************************************************/ AsyncWorkerThread::AsyncWorkerThread(AsyncEngine* jobDispatcher, const std::string &name) : - Thread(name), ScriptApiBase(ScriptingType::Async), + Thread(name), jobDispatcher(jobDispatcher) { lua_State *L = getStack(); + if (jobDispatcher->server) { + setGameDef(jobDispatcher->server); + + if (g_settings->getBool("secure.enable_security")) + initializeSecurity(); + } + // Prepare job lua environment lua_getglobal(L, "core"); int top = lua_gettop(L); // Push builtin initialization type - lua_pushstring(L, "async"); + lua_pushstring(L, jobDispatcher->server ? "async_game" : "async"); lua_setglobal(L, "INIT"); - jobDispatcher->prepareEnvironment(L, top); + if (!jobDispatcher->prepareEnvironment(L, top)) { + // can't throw from here so we're stuck with this + isErrored = true; + } } /******************************************************************************/ @@ -223,63 +308,78 @@ AsyncWorkerThread::~AsyncWorkerThread() /******************************************************************************/ void* AsyncWorkerThread::run() { + if (isErrored) + return nullptr; + lua_State *L = getStack(); - std::string script = getServer()->getBuiltinLuaPath() + DIR_DELIM + "init.lua"; - try { - loadScript(script); - } catch (const ModError &e) { - errorstream << "Execution of async base environment failed: " - << e.what() << std::endl; - FATAL_ERROR("Execution of async base environment failed"); - } - int error_handler = PUSH_ERROR_HANDLER(L); + auto report_error = [this] (const ModError &e) { + if (jobDispatcher->server) + jobDispatcher->server->setAsyncFatalError(e.what()); + else + errorstream << e.what() << std::endl; + }; + lua_getglobal(L, "core"); if (lua_isnil(L, -1)) { FATAL_ERROR("Unable to find core within async environment!"); } // Main loop + LuaJobInfo j; while (!stopRequested()) { // Wait for job - LuaJobInfo toProcess = jobDispatcher->getJob(); - - if (!toProcess.valid || stopRequested()) { + if (!jobDispatcher->getJob(&j) || stopRequested()) continue; - } + + const bool use_ext = !!j.params_ext; lua_getfield(L, -1, "job_processor"); - if (lua_isnil(L, -1)) { + if (lua_isnil(L, -1)) FATAL_ERROR("Unable to get async job processor!"); - } - luaL_checktype(L, -1, LUA_TFUNCTION); - // Call it - lua_pushlstring(L, - toProcess.serializedFunction.data(), - toProcess.serializedFunction.size()); - lua_pushlstring(L, - toProcess.serializedParams.data(), - toProcess.serializedParams.size()); + if (luaL_loadbuffer(L, j.function.data(), j.function.size(), "=(async)")) { + errorstream << "ASYNC WORKER: Unable to deserialize function" << std::endl; + lua_pushnil(L); + } + if (use_ext) + script_unpack(L, j.params_ext.get()); + else + lua_pushlstring(L, j.params.data(), j.params.size()); + // Call it + setOriginDirect(j.mod_origin.empty() ? nullptr : j.mod_origin.c_str()); int result = lua_pcall(L, 2, 1, error_handler); if (result) { - PCALL_RES(result); - toProcess.serializedResult = ""; + try { + scriptError(result, "<async>"); + } catch (const ModError &e) { + report_error(e); + } } else { // Fetch result - size_t length; - const char *retval = lua_tolstring(L, -1, &length); - toProcess.serializedResult = std::string(retval, length); + if (use_ext) { + try { + j.result_ext.reset(script_pack(L, -1)); + } catch (const ModError &e) { + report_error(e); + result = LUA_ERRERR; + } + } else { + size_t length; + const char *retval = lua_tolstring(L, -1, &length); + j.result.assign(retval, length); + } } lua_pop(L, 1); // Pop retval // Put job result - jobDispatcher->putJobResult(toProcess); + if (result == 0) + jobDispatcher->putJobResult(std::move(j)); } lua_pop(L, 2); // Pop core and error handler diff --git a/src/script/cpp_api/s_async.h b/src/script/cpp_api/s_async.h index b1f4bf45f..1e34e40ea 100644 --- a/src/script/cpp_api/s_async.h +++ b/src/script/cpp_api/s_async.h @@ -21,12 +21,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <vector> #include <deque> -#include <map> +#include <unordered_set> +#include <memory> +#include <lua.h> #include "threading/semaphore.h" #include "threading/thread.h" -#include "lua.h" +#include "common/c_packer.h" #include "cpp_api/s_base.h" +#include "cpp_api/s_security.h" // Forward declarations class AsyncEngine; @@ -39,28 +42,37 @@ struct LuaJobInfo { LuaJobInfo() = default; - // Function to be called in async environment - std::string serializedFunction = ""; - // Parameter to be passed to function - std::string serializedParams = ""; - // Result of function call - std::string serializedResult = ""; + // Function to be called in async environment (from string.dump) + std::string function; + // Parameter to be passed to function (serialized) + std::string params; + // Alternative parameters + std::unique_ptr<PackedValue> params_ext; + // Result of function call (serialized) + std::string result; + // Alternative result + std::unique_ptr<PackedValue> result_ext; + // Name of the mod who invoked this call + std::string mod_origin; // JobID used to identify a job and match it to callback - unsigned int id = 0; - - bool valid = false; + u32 id; }; // Asynchronous working environment -class AsyncWorkerThread : public Thread, public ScriptApiBase { +class AsyncWorkerThread : public Thread, + virtual public ScriptApiBase, public ScriptApiSecurity { + friend class AsyncEngine; public: - AsyncWorkerThread(AsyncEngine* jobDispatcher, const std::string &name); virtual ~AsyncWorkerThread(); void *run(); +protected: + AsyncWorkerThread(AsyncEngine* jobDispatcher, const std::string &name); + private: AsyncEngine *jobDispatcher = nullptr; + bool isErrored = false; }; // Asynchornous thread and job management @@ -69,6 +81,7 @@ class AsyncEngine { typedef void (*StateInitializer)(lua_State *L, int top); public: AsyncEngine() = default; + AsyncEngine(Server *server) : server(server) {}; ~AsyncEngine(); /** @@ -79,7 +92,7 @@ public: /** * Create async engine tasks and lock function registration - * @param numEngines Number of async threads to be started + * @param numEngines Number of worker threads, 0 for automatic scaling */ void initialize(unsigned int numEngines); @@ -89,34 +102,53 @@ public: * @param params Serialized parameters * @return jobid The job is queued */ - unsigned int queueAsyncJob(const std::string &func, const std::string ¶ms); + u32 queueAsyncJob(std::string &&func, std::string &¶ms, + const std::string &mod_origin = ""); + + /** + * Queue an async job + * @param func Serialized lua function + * @param params Serialized parameters (takes ownership!) + * @return ID of queued job + */ + u32 queueAsyncJob(std::string &&func, PackedValue *params, + const std::string &mod_origin = ""); /** * Engine step to process finished jobs - * the engine step is one way to pass events back, PushFinishedJobs another * @param L The Lua stack */ void step(lua_State *L); - /** - * Push a list of finished jobs onto the stack - * @param L The Lua stack - */ - void pushFinishedJobs(lua_State *L); - protected: /** * Get a Job from queue to be processed * this function blocks until a job is ready - * @return a job to be processed + * @param job a job to be processed + * @return whether a job was available */ - LuaJobInfo getJob(); + bool getJob(LuaJobInfo *job); /** * Put a Job result back to result queue * @param result result of completed job */ - void putJobResult(const LuaJobInfo &result); + void putJobResult(LuaJobInfo &&result); + + /** + * Start an additional worker thread + */ + void addWorkerThread(); + + /** + * Process finished jobs callbacks + */ + void stepJobResults(lua_State *L); + + /** + * Handle automatic scaling of worker threads + */ + void stepAutoscale(); /** * Initialize environment with current registred functions @@ -124,22 +156,31 @@ protected: * passed lua stack * @param L Lua stack to initialize * @param top Stack position + * @return false if a mod error ocurred */ - void prepareEnvironment(lua_State* L, int top); + bool prepareEnvironment(lua_State* L, int top); private: // Variable locking the engine against further modification bool initDone = false; + // Maximum number of worker threads for automatic scaling + // 0 if disabled + unsigned int autoscaleMaxWorkers = 0; + u64 autoscaleTimer = 0; + std::unordered_set<u32> autoscaleSeenJobs; + + // Only set for the server async environment (duh) + Server *server = nullptr; + // Internal store for registred state initializers std::vector<StateInitializer> stateInitializers; // Internal counter to create job IDs - unsigned int jobIdCounter = 0; + u32 jobIdCounter = 0; // Mutex to protect job queue std::mutex jobQueueMutex; - // Job queue std::deque<LuaJobInfo> jobQueue; diff --git a/src/script/cpp_api/s_base.cpp b/src/script/cpp_api/s_base.cpp index f965975a3..595c9e540 100644 --- a/src/script/cpp_api/s_base.cpp +++ b/src/script/cpp_api/s_base.cpp @@ -37,6 +37,8 @@ extern "C" { #include "lualib.h" #if USE_LUAJIT #include "luajit.h" +#else + #include "bit.h" #endif } @@ -88,6 +90,11 @@ ScriptApiBase::ScriptApiBase(ScriptingType type): else luaL_openlibs(m_luastack); + // Load bit library + lua_pushcfunction(m_luastack, luaopen_bit); + lua_pushstring(m_luastack, LUA_BITLIBNAME); + lua_call(m_luastack, 1, 0); + // Make the ScriptApiBase* accessible to ModApiBase #if INDIRECT_SCRIPTAPI_RIDX *(void **)(lua_newuserdata(m_luastack, sizeof(void *))) = this; @@ -114,6 +121,14 @@ ScriptApiBase::ScriptApiBase(ScriptingType type): lua_newtable(m_luastack); lua_setglobal(m_luastack, "core"); + // vector.metatable is stored in the registry for quick access from C++. + lua_newtable(m_luastack); + lua_rawseti(m_luastack, LUA_REGISTRYINDEX, CUSTOM_RIDX_VECTOR_METATABLE); + lua_newtable(m_luastack); + lua_rawgeti(m_luastack, LUA_REGISTRYINDEX, CUSTOM_RIDX_VECTOR_METATABLE); + lua_setfield(m_luastack, -2, "metatable"); + lua_setglobal(m_luastack, "vector"); + if (m_type == ScriptingType::Client) lua_pushstring(m_luastack, "/"); else @@ -331,13 +346,9 @@ void ScriptApiBase::setOriginDirect(const char *origin) void ScriptApiBase::setOriginFromTableRaw(int index, const char *fxn) { -#ifdef SCRIPTAPI_DEBUG lua_State *L = getStack(); - m_last_run_mod = lua_istable(L, index) ? getstringfield_default(L, index, "mod_origin", "") : ""; - //printf(">>>> running %s for mod: %s\n", fxn, m_last_run_mod.c_str()); -#endif } /* diff --git a/src/script/cpp_api/s_base.h b/src/script/cpp_api/s_base.h index 86f7f7bac..244d81605 100644 --- a/src/script/cpp_api/s_base.h +++ b/src/script/cpp_api/s_base.h @@ -39,7 +39,6 @@ extern "C" { #include "config.h" #define SCRIPTAPI_LOCK_DEBUG -#define SCRIPTAPI_DEBUG // MUST be an invalid mod name so that mods can't // use that name to bypass security! @@ -108,7 +107,9 @@ public: Client* getClient(); #endif - std::string getOrigin() { return m_last_run_mod; } + // IMPORTANT: these cannot be used for any security-related uses, they exist + // only to enrich error messages + const std::string &getOrigin() { return m_last_run_mod; } void setOriginDirect(const char *origin); void setOriginFromTableRaw(int index, const char *fxn); @@ -124,11 +125,23 @@ protected: friend class ModApiEnvMod; friend class LuaVoxelManip; + /* + Subtle edge case with coroutines: If for whatever reason you have a + method in a subclass that's called from existing lua_CFunction + (any of the l_*.cpp files) then make it static and take the lua_State* + as an argument. This is REQUIRED because getStack() will not return the + correct state if called inside coroutines. + + Also note that src/script/common/ is the better place for such helpers. + */ lua_State* getStack() { return m_luastack; } + // Checks that stack size is sane void realityCheck(); + // Takes an error from lua_pcall and throws it as a LuaError void scriptError(int result, const char *fxn); + // Dumps stack contents for debugging void stackDump(std::ostream &o); void setGameDef(IGameDef* gamedef) { m_gamedef = gamedef; } diff --git a/src/script/cpp_api/s_client.cpp b/src/script/cpp_api/s_client.cpp index f2cc9730b..b02a0c7be 100644 --- a/src/script/cpp_api/s_client.cpp +++ b/src/script/cpp_api/s_client.cpp @@ -33,7 +33,11 @@ void ScriptApiClient::on_mods_loaded() lua_getglobal(L, "core"); lua_getfield(L, -1, "registered_on_mods_loaded"); // Call callbacks - runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); + try { + runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); + } catch (LuaError &e) { + getClient()->setFatalError(e); + } } void ScriptApiClient::on_shutdown() @@ -44,7 +48,11 @@ void ScriptApiClient::on_shutdown() lua_getglobal(L, "core"); lua_getfield(L, -1, "registered_on_shutdown"); // Call callbacks - runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); + try { + runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); + } catch (LuaError &e) { + getClient()->setFatalError(e); + } } bool ScriptApiClient::on_sending_message(const std::string &message) @@ -56,7 +64,12 @@ bool ScriptApiClient::on_sending_message(const std::string &message) lua_getfield(L, -1, "registered_on_sending_chat_message"); // Call callbacks lua_pushstring(L, message.c_str()); - runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + try { + runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + } catch (LuaError &e) { + getClient()->setFatalError(e); + return true; + } return readParam<bool>(L, -1); } @@ -69,7 +82,12 @@ bool ScriptApiClient::on_receiving_message(const std::string &message) lua_getfield(L, -1, "registered_on_receiving_chat_message"); // Call callbacks lua_pushstring(L, message.c_str()); - runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + try { + runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + } catch (LuaError &e) { + getClient()->setFatalError(e); + return true; + } return readParam<bool>(L, -1); } @@ -82,7 +100,11 @@ void ScriptApiClient::on_damage_taken(int32_t damage_amount) lua_getfield(L, -1, "registered_on_damage_taken"); // Call callbacks lua_pushinteger(L, damage_amount); - runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + try { + runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + } catch (LuaError &e) { + getClient()->setFatalError(e); + } } void ScriptApiClient::on_hp_modification(int32_t newhp) @@ -94,7 +116,11 @@ void ScriptApiClient::on_hp_modification(int32_t newhp) lua_getfield(L, -1, "registered_on_hp_modification"); // Call callbacks lua_pushinteger(L, newhp); - runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + try { + runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC); + } catch (LuaError &e) { + getClient()->setFatalError(e); + } } void ScriptApiClient::on_death() @@ -105,7 +131,11 @@ void ScriptApiClient::on_death() lua_getglobal(L, "core"); lua_getfield(L, -1, "registered_on_death"); // Call callbacks - runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); + try { + runCallbacks(0, RUN_CALLBACKS_MODE_FIRST); + } catch (LuaError &e) { + getClient()->setFatalError(e); + } } void ScriptApiClient::environment_step(float dtime) @@ -120,8 +150,7 @@ void ScriptApiClient::environment_step(float dtime) try { runCallbacks(1, RUN_CALLBACKS_MODE_FIRST); } catch (LuaError &e) { - getClient()->setFatalError(std::string("Client environment_step: ") + e.what() + "\n" - + script_get_backtrace(L)); + getClient()->setFatalError(e); } } @@ -146,7 +175,11 @@ void ScriptApiClient::on_formspec_input(const std::string &formname, lua_pushlstring(L, value.c_str(), value.size()); lua_settable(L, -3); } - runCallbacks(2, RUN_CALLBACKS_MODE_OR_SC); + try { + runCallbacks(2, RUN_CALLBACKS_MODE_OR_SC); + } catch (LuaError &e) { + getClient()->setFatalError(e); + } } bool ScriptApiClient::on_dignode(v3s16 p, MapNode node) @@ -164,7 +197,12 @@ bool ScriptApiClient::on_dignode(v3s16 p, MapNode node) pushnode(L, node, ndef); // Call functions - runCallbacks(2, RUN_CALLBACKS_MODE_OR); + try { + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + } catch (LuaError &e) { + getClient()->setFatalError(e); + return true; + } return lua_toboolean(L, -1); } @@ -183,7 +221,12 @@ bool ScriptApiClient::on_punchnode(v3s16 p, MapNode node) pushnode(L, node, ndef); // Call functions - runCallbacks(2, RUN_CALLBACKS_MODE_OR); + try { + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + } catch (LuaError &e) { + getClient()->setFatalError(e); + return true; + } return readParam<bool>(L, -1); } @@ -200,7 +243,12 @@ bool ScriptApiClient::on_placenode(const PointedThing &pointed, const ItemDefini push_item_definition(L, item); // Call functions - runCallbacks(2, RUN_CALLBACKS_MODE_OR); + try { + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + } catch (LuaError &e) { + getClient()->setFatalError(e); + return true; + } return readParam<bool>(L, -1); } @@ -217,7 +265,12 @@ bool ScriptApiClient::on_item_use(const ItemStack &item, const PointedThing &poi push_pointed_thing(L, pointed, true); // Call functions - runCallbacks(2, RUN_CALLBACKS_MODE_OR); + try { + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + } catch (LuaError &e) { + getClient()->setFatalError(e); + return true; + } return readParam<bool>(L, -1); } @@ -228,17 +281,14 @@ bool ScriptApiClient::on_inventory_open(Inventory *inventory) lua_getglobal(L, "core"); lua_getfield(L, -1, "registered_on_inventory_open"); - std::vector<const InventoryList*> lists = inventory->getLists(); - std::vector<const InventoryList*>::iterator iter = lists.begin(); - lua_createtable(L, 0, lists.size()); - for (; iter != lists.end(); iter++) { - const char* name = (*iter)->getName().c_str(); - lua_pushstring(L, name); - push_inventory_list(L, inventory, name); - lua_rawset(L, -3); - } + push_inventory_lists(L, *inventory); - runCallbacks(1, RUN_CALLBACKS_MODE_OR); + try { + runCallbacks(1, RUN_CALLBACKS_MODE_OR); + } catch (LuaError &e) { + getClient()->setFatalError(e); + return true; + } return readParam<bool>(L, -1); } diff --git a/src/script/cpp_api/s_entity.cpp b/src/script/cpp_api/s_entity.cpp index ea9320051..852a27ddc 100644 --- a/src/script/cpp_api/s_entity.cpp +++ b/src/script/cpp_api/s_entity.cpp @@ -103,6 +103,32 @@ void ScriptApiEntity::luaentity_Activate(u16 id, lua_pop(L, 2); // Pop object and error handler } +void ScriptApiEntity::luaentity_Deactivate(u16 id, bool removal) +{ + SCRIPTAPI_PRECHECKHEADER + + verbosestream << "scriptapi_luaentity_deactivate: id=" << id << std::endl; + + int error_handler = PUSH_ERROR_HANDLER(L); + + // Get the entity + luaentity_get(L, id); + int object = lua_gettop(L); + + // Get on_deactivate + lua_getfield(L, -1, "on_deactivate"); + if (!lua_isnil(L, -1)) { + luaL_checktype(L, -1, LUA_TFUNCTION); + lua_pushvalue(L, object); + lua_pushboolean(L, removal); + setOriginFromTable(object); + PCALL_RES(lua_pcall(L, 2, 0, error_handler)); + } else { + lua_pop(L, 1); + } + lua_pop(L, 2); // Pop object and error handler +} + void ScriptApiEntity::luaentity_Remove(u16 id) { SCRIPTAPI_PRECHECKHEADER @@ -214,11 +240,11 @@ void ScriptApiEntity::luaentity_Step(u16 id, float dtime, // tool_capabilities, direction, damage) bool ScriptApiEntity::luaentity_Punch(u16 id, ServerActiveObject *puncher, float time_from_last_punch, - const ToolCapabilities *toolcap, v3f dir, s16 damage) + const ToolCapabilities *toolcap, v3f dir, s32 damage) { SCRIPTAPI_PRECHECKHEADER - //infostream<<"scriptapi_luaentity_step: id="<<id<<std::endl; + assert(puncher); int error_handler = PUSH_ERROR_HANDLER(L); @@ -268,7 +294,10 @@ bool ScriptApiEntity::luaentity_run_simple_callback(u16 id, } luaL_checktype(L, -1, LUA_TFUNCTION); lua_pushvalue(L, object); // self - objectrefGetOrCreate(L, sao); // killer reference + if (sao) + objectrefGetOrCreate(L, sao); // sao reference + else + lua_pushnil(L); setOriginFromTable(object); PCALL_RES(lua_pcall(L, 2, 1, error_handler)); diff --git a/src/script/cpp_api/s_entity.h b/src/script/cpp_api/s_entity.h index b5f7a6586..13f3e9aa3 100644 --- a/src/script/cpp_api/s_entity.h +++ b/src/script/cpp_api/s_entity.h @@ -33,6 +33,7 @@ public: bool luaentity_Add(u16 id, const char *name); void luaentity_Activate(u16 id, const std::string &staticdata, u32 dtime_s); + void luaentity_Deactivate(u16 id, bool removal); void luaentity_Remove(u16 id); std::string luaentity_GetStaticdata(u16 id); void luaentity_GetProperties(u16 id, @@ -41,7 +42,7 @@ public: const collisionMoveResult *moveresult); bool luaentity_Punch(u16 id, ServerActiveObject *puncher, float time_from_last_punch, - const ToolCapabilities *toolcap, v3f dir, s16 damage); + const ToolCapabilities *toolcap, v3f dir, s32 damage); bool luaentity_on_death(u16 id, ServerActiveObject *killer); void luaentity_Rightclick(u16 id, ServerActiveObject *clicker); void luaentity_on_attach_child(u16 id, ServerActiveObject *child); diff --git a/src/script/cpp_api/s_env.cpp b/src/script/cpp_api/s_env.cpp index 8da5debaa..af68f689f 100644 --- a/src/script/cpp_api/s_env.cpp +++ b/src/script/cpp_api/s_env.cpp @@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen/mapgen.h" #include "lua_api/l_env.h" #include "server.h" +#include "script/common/c_content.h" + void ScriptApiEnv::environment_OnGenerated(v3s16 minp, v3s16 maxp, u32 blockseed) @@ -51,13 +53,7 @@ void ScriptApiEnv::environment_Step(float dtime) lua_getfield(L, -1, "registered_globalsteps"); // Call callbacks lua_pushnumber(L, dtime); - try { - runCallbacks(1, RUN_CALLBACKS_MODE_FIRST); - } catch (LuaError &e) { - getServer()->setAsyncFatalError( - std::string("environment_Step: ") + e.what() + "\n" - + script_get_backtrace(L)); - } + runCallbacks(1, RUN_CALLBACKS_MODE_FIRST); } void ScriptApiEnv::player_event(ServerActiveObject *player, const std::string &type) @@ -74,13 +70,7 @@ void ScriptApiEnv::player_event(ServerActiveObject *player, const std::string &t // Call callbacks objectrefGetOrCreate(L, player); // player lua_pushstring(L,type.c_str()); // event type - try { - runCallbacks(2, RUN_CALLBACKS_MODE_FIRST); - } catch (LuaError &e) { - getServer()->setAsyncFatalError( - std::string("player_event: ") + e.what() + "\n" - + script_get_backtrace(L) ); - } + runCallbacks(2, RUN_CALLBACKS_MODE_FIRST); } void ScriptApiEnv::initializeEnvironment(ServerEnvironment *env) @@ -151,12 +141,18 @@ void ScriptApiEnv::initializeEnvironment(ServerEnvironment *env) bool simple_catch_up = true; getboolfield(L, current_abm, "catch_up", simple_catch_up); + s16 min_y = INT16_MIN; + getintfield(L, current_abm, "min_y", min_y); + + s16 max_y = INT16_MAX; + getintfield(L, current_abm, "max_y", max_y); + lua_getfield(L, current_abm, "action"); luaL_checktype(L, current_abm + 1, LUA_TFUNCTION); lua_pop(L, 1); LuaABM *abm = new LuaABM(L, id, trigger_contents, required_neighbors, - trigger_interval, trigger_chance, simple_catch_up); + trigger_interval, trigger_chance, simple_catch_up, min_y, max_y); env->addActiveBlockModifier(abm); @@ -249,9 +245,8 @@ void ScriptApiEnv::on_emerge_area_completion( try { PCALL_RES(lua_pcall(L, 4, 0, error_handler)); } catch (LuaError &e) { - server->setAsyncFatalError( - std::string("on_emerge_area_completion: ") + e.what() + "\n" - + script_get_backtrace(L)); + // Note: don't throw here, we still need to run the cleanup code below + server->setAsyncFatalError(e); } lua_pop(L, 1); // Pop error handler @@ -261,3 +256,35 @@ void ScriptApiEnv::on_emerge_area_completion( luaL_unref(L, LUA_REGISTRYINDEX, state->args_ref); } } + +void ScriptApiEnv::on_liquid_transformed( + const std::vector<std::pair<v3s16, MapNode>> &list) +{ + SCRIPTAPI_PRECHECKHEADER + + // Get core.registered_on_liquid_transformed + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_liquid_transformed"); + luaL_checktype(L, -1, LUA_TTABLE); + lua_remove(L, -2); + + // Skip converting list and calling hook if there are + // no registered callbacks. + if(lua_objlen(L, -1) < 1) return; + + // Convert the list to a pos array and a node array for lua + int index = 1; + const NodeDefManager *ndef = getEnv()->getGameDef()->ndef(); + lua_createtable(L, list.size(), 0); + lua_createtable(L, list.size(), 0); + for(std::pair<v3s16, MapNode> p : list) { + lua_pushnumber(L, index); + push_v3s16(L, p.first); + lua_rawset(L, -4); + lua_pushnumber(L, index++); + pushnode(L, p.second, ndef); + lua_rawset(L, -3); + } + + runCallbacks(2, RUN_CALLBACKS_MODE_FIRST); +} diff --git a/src/script/cpp_api/s_env.h b/src/script/cpp_api/s_env.h index 232a08aaf..090858f17 100644 --- a/src/script/cpp_api/s_env.h +++ b/src/script/cpp_api/s_env.h @@ -21,6 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "cpp_api/s_base.h" #include "irr_v3d.h" +#include "mapnode.h" +#include <vector> class ServerEnvironment; struct ScriptCallbackState; @@ -41,5 +43,8 @@ public: void on_emerge_area_completion(v3s16 blockpos, int action, ScriptCallbackState *state); + // Called after liquid transform changes + void on_liquid_transformed(const std::vector<std::pair<v3s16, MapNode>> &list); + void initializeEnvironment(ServerEnvironment *env); }; diff --git a/src/script/cpp_api/s_item.cpp b/src/script/cpp_api/s_item.cpp index 24955cefc..b1916070e 100644 --- a/src/script/cpp_api/s_item.cpp +++ b/src/script/cpp_api/s_item.cpp @@ -29,6 +29,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventory.h" #include "inventorymanager.h" +#define WRAP_LUAERROR(e, detail) \ + LuaError(std::string(__FUNCTION__) + ": " + (e).what() + ". " detail) + bool ScriptApiItem::item_OnDrop(ItemStack &item, ServerActiveObject *dropper, v3f pos) { @@ -49,20 +52,21 @@ bool ScriptApiItem::item_OnDrop(ItemStack &item, try { item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { - throw LuaError(std::string(e.what()) + ". item=" + item.name); + throw WRAP_LUAERROR(e, "item=" + item.name); } } lua_pop(L, 2); // Pop item and error handler return true; } -bool ScriptApiItem::item_OnPlace(ItemStack &item, +bool ScriptApiItem::item_OnPlace(Optional<ItemStack> &ret_item, ServerActiveObject *placer, const PointedThing &pointed) { SCRIPTAPI_PRECHECKHEADER int error_handler = PUSH_ERROR_HANDLER(L); + const ItemStack &item = *ret_item; // Push callback function on stack if (!getItemCallback(item.name.c_str(), "on_place")) return false; @@ -79,22 +83,25 @@ bool ScriptApiItem::item_OnPlace(ItemStack &item, PCALL_RES(lua_pcall(L, 3, 1, error_handler)); if (!lua_isnil(L, -1)) { try { - item = read_item(L, -1, getServer()->idef()); + ret_item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { - throw LuaError(std::string(e.what()) + ". item=" + item.name); + throw WRAP_LUAERROR(e, "item=" + item.name); } + } else { + ret_item = nullopt; } lua_pop(L, 2); // Pop item and error handler return true; } -bool ScriptApiItem::item_OnUse(ItemStack &item, +bool ScriptApiItem::item_OnUse(Optional<ItemStack> &ret_item, ServerActiveObject *user, const PointedThing &pointed) { SCRIPTAPI_PRECHECKHEADER int error_handler = PUSH_ERROR_HANDLER(L); + const ItemStack &item = *ret_item; // Push callback function on stack if (!getItemCallback(item.name.c_str(), "on_use")) return false; @@ -106,22 +113,25 @@ bool ScriptApiItem::item_OnUse(ItemStack &item, PCALL_RES(lua_pcall(L, 3, 1, error_handler)); if(!lua_isnil(L, -1)) { try { - item = read_item(L, -1, getServer()->idef()); + ret_item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { - throw LuaError(std::string(e.what()) + ". item=" + item.name); + throw WRAP_LUAERROR(e, "item=" + item.name); } + } else { + ret_item = nullopt; } lua_pop(L, 2); // Pop item and error handler return true; } -bool ScriptApiItem::item_OnSecondaryUse(ItemStack &item, +bool ScriptApiItem::item_OnSecondaryUse(Optional<ItemStack> &ret_item, ServerActiveObject *user, const PointedThing &pointed) { SCRIPTAPI_PRECHECKHEADER int error_handler = PUSH_ERROR_HANDLER(L); + const ItemStack &item = *ret_item; if (!getItemCallback(item.name.c_str(), "on_secondary_use")) return false; @@ -131,10 +141,12 @@ bool ScriptApiItem::item_OnSecondaryUse(ItemStack &item, PCALL_RES(lua_pcall(L, 3, 1, error_handler)); if (!lua_isnil(L, -1)) { try { - item = read_item(L, -1, getServer()->idef()); + ret_item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { - throw LuaError(std::string(e.what()) + ". item=" + item.name); + throw WRAP_LUAERROR(e, "item=" + item.name); } + } else { + ret_item = nullopt; } lua_pop(L, 2); // Pop item and error handler return true; @@ -165,7 +177,7 @@ bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user, try { item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { - throw LuaError(std::string(e.what()) + ". item=" + item.name); + throw WRAP_LUAERROR(e, "item=" + item.name); } } lua_pop(L, 2); // Pop item and error handler @@ -197,7 +209,7 @@ bool ScriptApiItem::item_CraftPredict(ItemStack &item, ServerActiveObject *user, try { item = read_item(L, -1, getServer()->idef()); } catch (LuaError &e) { - throw LuaError(std::string(e.what()) + ". item=" + item.name); + throw WRAP_LUAERROR(e, "item=" + item.name); } } lua_pop(L, 2); // Pop item and error handler diff --git a/src/script/cpp_api/s_item.h b/src/script/cpp_api/s_item.h index 25a3501f9..5015d8bd4 100644 --- a/src/script/cpp_api/s_item.h +++ b/src/script/cpp_api/s_item.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "cpp_api/s_base.h" #include "irr_v3d.h" +#include "util/Optional.h" struct PointedThing; struct ItemStack; @@ -35,13 +36,20 @@ class ScriptApiItem : virtual public ScriptApiBase { public: + /* + * Functions with Optional<ItemStack> are for callbacks where Lua may + * want to prevent the engine from modifying the inventory after it's done. + * This has a longer backstory where on_use may need to empty the player's + * inventory without the engine interfering (see issue #6546). + */ + bool item_OnDrop(ItemStack &item, ServerActiveObject *dropper, v3f pos); - bool item_OnPlace(ItemStack &item, + bool item_OnPlace(Optional<ItemStack> &item, ServerActiveObject *placer, const PointedThing &pointed); - bool item_OnUse(ItemStack &item, + bool item_OnUse(Optional<ItemStack> &item, ServerActiveObject *user, const PointedThing &pointed); - bool item_OnSecondaryUse(ItemStack &item, + bool item_OnSecondaryUse(Optional<ItemStack> &item, ServerActiveObject *user, const PointedThing &pointed); bool item_OnCraft(ItemStack &item, ServerActiveObject *user, const InventoryList *old_craft_grid, const InventoryLocation &craft_inv); diff --git a/src/script/cpp_api/s_mainmenu.h b/src/script/cpp_api/s_mainmenu.h index aef36ce39..470577a29 100644 --- a/src/script/cpp_api/s_mainmenu.h +++ b/src/script/cpp_api/s_mainmenu.h @@ -38,7 +38,7 @@ public: void handleMainMenuEvent(std::string text); /** - * process field data recieved from formspec + * process field data received from formspec * @param fields data in field format */ void handleMainMenuButtons(const StringMap &fields); diff --git a/src/script/cpp_api/s_node.cpp b/src/script/cpp_api/s_node.cpp index e0f9bcd78..029cb6308 100644 --- a/src/script/cpp_api/s_node.cpp +++ b/src/script/cpp_api/s_node.cpp @@ -65,6 +65,7 @@ struct EnumString ScriptApiNode::es_ContentParamType2[] = {CPT2_COLORED_FACEDIR, "colorfacedir"}, {CPT2_COLORED_WALLMOUNTED, "colorwallmounted"}, {CPT2_GLASSLIKE_LIQUID_LEVEL, "glasslikeliquidlevel"}, + {CPT2_COLORED_DEGROTATE, "colordegrotate"}, {0, NULL}, }; @@ -93,6 +94,14 @@ struct EnumString ScriptApiNode::es_NodeBoxType[] = {0, NULL}, }; +struct EnumString ScriptApiNode::es_TextureAlphaMode[] = + { + {ALPHAMODE_OPAQUE, "opaque"}, + {ALPHAMODE_CLIP, "clip"}, + {ALPHAMODE_BLEND, "blend"}, + {0, NULL}, + }; + bool ScriptApiNode::node_on_punch(v3s16 p, MapNode node, ServerActiveObject *puncher, const PointedThing &pointed) { @@ -133,9 +142,14 @@ bool ScriptApiNode::node_on_dig(v3s16 p, MapNode node, push_v3s16(L, p); pushnode(L, node, ndef); objectrefGetOrCreate(L, digger); - PCALL_RES(lua_pcall(L, 3, 0, error_handler)); - lua_pop(L, 1); // Pop error handler - return true; + PCALL_RES(lua_pcall(L, 3, 1, error_handler)); + + // nil is treated as true for backwards compat + bool result = lua_isnil(L, -1) || lua_toboolean(L, -1); + + lua_pop(L, 2); // Pop error handler and result + + return result; } void ScriptApiNode::node_on_construct(v3s16 p, MapNode node) diff --git a/src/script/cpp_api/s_node.h b/src/script/cpp_api/s_node.h index 81b44f0f0..3c6a8445b 100644 --- a/src/script/cpp_api/s_node.h +++ b/src/script/cpp_api/s_node.h @@ -53,5 +53,7 @@ public: static struct EnumString es_ContentParamType[]; static struct EnumString es_ContentParamType2[]; static struct EnumString es_LiquidType[]; + static struct EnumString es_LiquidMoveType[]; static struct EnumString es_NodeBoxType[]; + static struct EnumString es_TextureAlphaMode[]; }; diff --git a/src/script/cpp_api/s_nodemeta.cpp b/src/script/cpp_api/s_nodemeta.cpp index c081e9fc4..7ab3757f3 100644 --- a/src/script/cpp_api/s_nodemeta.cpp +++ b/src/script/cpp_api/s_nodemeta.cpp @@ -43,7 +43,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowMove( return 0; // Push callback function on stack - std::string nodename = ndef->get(node).name; + const auto &nodename = ndef->get(node).name; if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_move", &ma.to_inv.p)) return count; @@ -58,7 +58,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowMove( PCALL_RES(lua_pcall(L, 7, 1, error_handler)); if (!lua_isnumber(L, -1)) throw LuaError("allow_metadata_inventory_move should" - " return a number, guilty node: " + nodename); + " return a number. node=" + nodename); int num = luaL_checkinteger(L, -1); lua_pop(L, 2); // Pop integer and error handler return num; @@ -81,7 +81,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowPut( return 0; // Push callback function on stack - std::string nodename = ndef->get(node).name; + const auto &nodename = ndef->get(node).name; if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_put", &ma.to_inv.p)) return stack.count; @@ -94,7 +94,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowPut( PCALL_RES(lua_pcall(L, 5, 1, error_handler)); if(!lua_isnumber(L, -1)) throw LuaError("allow_metadata_inventory_put should" - " return a number, guilty node: " + nodename); + " return a number. node=" + nodename); int num = luaL_checkinteger(L, -1); lua_pop(L, 2); // Pop integer and error handler return num; @@ -117,7 +117,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowTake( return 0; // Push callback function on stack - std::string nodename = ndef->get(node).name; + const auto &nodename = ndef->get(node).name; if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_take", &ma.from_inv.p)) return stack.count; @@ -130,7 +130,7 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowTake( PCALL_RES(lua_pcall(L, 5, 1, error_handler)); if (!lua_isnumber(L, -1)) throw LuaError("allow_metadata_inventory_take should" - " return a number, guilty node: " + nodename); + " return a number. node=" + nodename); int num = luaL_checkinteger(L, -1); lua_pop(L, 2); // Pop integer and error handler return num; @@ -153,7 +153,7 @@ void ScriptApiNodemeta::nodemeta_inventory_OnMove( return; // Push callback function on stack - std::string nodename = ndef->get(node).name; + const auto &nodename = ndef->get(node).name; if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_move", &ma.from_inv.p)) return; @@ -186,7 +186,7 @@ void ScriptApiNodemeta::nodemeta_inventory_OnPut( return; // Push callback function on stack - std::string nodename = ndef->get(node).name; + const auto &nodename = ndef->get(node).name; if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_put", &ma.to_inv.p)) return; @@ -217,7 +217,7 @@ void ScriptApiNodemeta::nodemeta_inventory_OnTake( return; // Push callback function on stack - std::string nodename = ndef->get(node).name; + const auto &nodename = ndef->get(node).name; if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_take", &ma.from_inv.p)) return; diff --git a/src/script/cpp_api/s_player.cpp b/src/script/cpp_api/s_player.cpp index 712120c61..22b24f363 100644 --- a/src/script/cpp_api/s_player.cpp +++ b/src/script/cpp_api/s_player.cpp @@ -60,7 +60,7 @@ bool ScriptApiPlayer::on_punchplayer(ServerActiveObject *player, float time_from_last_punch, const ToolCapabilities *toolcap, v3f dir, - s16 damage) + s32 damage) { SCRIPTAPI_PRECHECKHEADER // Get core.registered_on_punchplayers @@ -77,6 +77,19 @@ bool ScriptApiPlayer::on_punchplayer(ServerActiveObject *player, return readParam<bool>(L, -1); } +void ScriptApiPlayer::on_rightclickplayer(ServerActiveObject *player, + ServerActiveObject *clicker) +{ + SCRIPTAPI_PRECHECKHEADER + // Get core.registered_on_rightclickplayers + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_rightclickplayers"); + // Call callbacks + objectrefGetOrCreate(L, player); + objectrefGetOrCreate(L, clicker); + runCallbacks(2, RUN_CALLBACKS_MODE_FIRST); +} + s32 ScriptApiPlayer::on_player_hpchange(ServerActiveObject *player, s32 hp_change, const PlayerHPChangeReason &reason) { diff --git a/src/script/cpp_api/s_player.h b/src/script/cpp_api/s_player.h index a337f975b..e866aee46 100644 --- a/src/script/cpp_api/s_player.h +++ b/src/script/cpp_api/s_player.h @@ -46,7 +46,8 @@ public: void on_cheat(ServerActiveObject *player, const std::string &cheat_type); bool on_punchplayer(ServerActiveObject *player, ServerActiveObject *hitter, float time_from_last_punch, const ToolCapabilities *toolcap, - v3f dir, s16 damage); + v3f dir, s32 damage); + void on_rightclickplayer(ServerActiveObject *player, ServerActiveObject *clicker); s32 on_player_hpchange(ServerActiveObject *player, s32 hp_change, const PlayerHPChangeReason &reason); void on_playerReceiveFields(ServerActiveObject *player, diff --git a/src/script/cpp_api/s_security.cpp b/src/script/cpp_api/s_security.cpp index 2afa3a191..316b19926 100644 --- a/src/script/cpp_api/s_security.cpp +++ b/src/script/cpp_api/s_security.cpp @@ -18,7 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "cpp_api/s_security.h" - +#include "lua_api/l_base.h" #include "filesys.h" #include "porting.h" #include "server.h" @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <cerrno> #include <string> +#include <algorithm> #include <iostream> @@ -45,6 +46,21 @@ static inline void copy_safe(lua_State *L, const char *list[], unsigned len, int } } +static void shallow_copy_table(lua_State *L, int from=-2, int to=-1) +{ + if (from < 0) from = lua_gettop(L) + from + 1; + if (to < 0) to = lua_gettop(L) + to + 1; + lua_pushnil(L); + while (lua_next(L, from) != 0) { + assert(lua_type(L, -1) != LUA_TTABLE); + // duplicate key and value for lua_rawset + lua_pushvalue(L, -2); + lua_pushvalue(L, -2); + lua_rawset(L, to); + lua_pop(L, 1); + } +} + // Pushes the original version of a library function on the stack, from the old version static inline void push_original(lua_State *L, const char *lib, const char *func) { @@ -82,12 +98,17 @@ void ScriptApiSecurity::initializeSecurity() "type", "unpack", "_VERSION", + "vector", "xpcall", - // Completely safe libraries + }; + static const char *whitelist_tables[] = { + // These libraries are completely safe BUT we need to duplicate their table + // to ensure the sandbox can't affect the insecure env "coroutine", "string", "table", "math", + "bit" }; static const char *io_whitelist[] = { "close", @@ -101,21 +122,15 @@ void ScriptApiSecurity::initializeSecurity() "date", "difftime", "getenv", - "setlocale", "time", - "tmpname", }; static const char *debug_whitelist[] = { "gethook", "traceback", "getinfo", - "getmetatable", - "setupvalue", - "setmetatable", "upvalueid", "sethook", "debug", - "setlocal", }; static const char *package_whitelist[] = { "config", @@ -167,6 +182,17 @@ void ScriptApiSecurity::initializeSecurity() lua_pop(L, 1); + // Copy safe libraries + for (const char *libname : whitelist_tables) { + lua_getfield(L, old_globals, libname); + lua_newtable(L); + shallow_copy_table(L); + + lua_setglobal(L, libname); + lua_pop(L, 1); + } + + // Copy safe IO functions lua_getfield(L, old_globals, "io"); lua_newtable(L); @@ -190,6 +216,7 @@ void ScriptApiSecurity::initializeSecurity() // And replace unsafe ones SECURE_API(os, remove); SECURE_API(os, rename); + SECURE_API(os, setlocale); lua_setglobal(L, "os"); lua_pop(L, 1); // Pop old OS @@ -221,7 +248,29 @@ void ScriptApiSecurity::initializeSecurity() lua_pop(L, 1); // Pop old jit #endif + // Get rid of 'core' in the old globals, we don't want anyone thinking it's + // safe or even usable. + lua_pushnil(L); + lua_setfield(L, old_globals, "core"); + + // 'vector' as well. + lua_pushnil(L); + lua_setfield(L, old_globals, "vector"); + lua_pop(L, 1); // Pop globals_backup + + + /* + * In addition to copying the tables in whitelist_tables, we also need to + * replace the string metatable. Otherwise old_globals.string would + * be accessible via getmetatable("").__index from inside the sandbox. + */ + lua_pushliteral(L, ""); + lua_newtable(L); + lua_getglobal(L, "string"); + lua_setfield(L, -2, "__index"); + lua_setmetatable(L, -2); + lua_pop(L, 1); // Pop empty string } void ScriptApiSecurity::initializeSecurityClient() @@ -243,19 +292,21 @@ void ScriptApiSecurity::initializeSecurityClient() "rawset", "select", "setfenv", - // getmetatable can be used to escape the sandbox + // getmetatable can be used to escape the sandbox <- ??? "setmetatable", "tonumber", "tostring", "type", "unpack", "_VERSION", + "vector", "xpcall", // Completely safe libraries "coroutine", "string", "table", "math", + "bit", }; static const char *os_whitelist[] = { "clock", @@ -264,7 +315,7 @@ void ScriptApiSecurity::initializeSecurityClient() "time" }; static const char *debug_whitelist[] = { - "getinfo", + "getinfo", // used by builtin and unset before mods load "traceback" }; @@ -366,6 +417,12 @@ void ScriptApiSecurity::setLuaEnv(lua_State *L, int thread) bool ScriptApiSecurity::isSecure(lua_State *L) { +#ifndef SERVER + auto script = ModApiBase::getScriptApiBase(L); + // CSM keeps no globals backup but is always secure + if (script->getType() == ScriptingType::Client) + return true; +#endif lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_GLOBALS_BACKUP); bool secure = !lua_isnil(L, -1); lua_pop(L, 1); @@ -398,10 +455,9 @@ bool ScriptApiSecurity::safeLoadFile(lua_State *L, const char *path, const char lua_pushfstring(L, "%s: %s", path, strerror(errno)); return false; } - chunk_name = new char[strlen(display_name) + 2]; - chunk_name[0] = '@'; - chunk_name[1] = '\0'; - strcat(chunk_name, display_name); + size_t len = strlen(display_name) + 2; + chunk_name = new char[len]; + snprintf(chunk_name, len, "@%s", display_name); } size_t start = 0; @@ -497,15 +553,8 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path, if (!removed.empty()) abs_path += DIR_DELIM + removed; - // Get server from registry - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_SCRIPTAPI); - ScriptApiBase *script; -#if INDIRECT_SCRIPTAPI_RIDX - script = (ScriptApiBase *) *(void**)(lua_touserdata(L, -1)); -#else - script = (ScriptApiBase *) lua_touserdata(L, -1); -#endif - lua_pop(L, 1); + // Get gamedef from registry + ScriptApiBase *script = ModApiBase::getScriptApiBase(L); const IGameDef *gamedef = script->getGameDef(); if (!gamedef) return false; @@ -570,6 +619,38 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path, return false; } +bool ScriptApiSecurity::checkWhitelisted(lua_State *L, const std::string &setting) +{ + assert(str_starts_with(setting, "secure.")); + + // We have to make sure that this function is being called directly by + // a mod, otherwise a malicious mod could override this function and + // steal its return value. + lua_Debug info; + + // Make sure there's only one item below this function on the stack... + if (lua_getstack(L, 2, &info)) + return false; + FATAL_ERROR_IF(!lua_getstack(L, 1, &info), "lua_getstack() failed"); + FATAL_ERROR_IF(!lua_getinfo(L, "S", &info), "lua_getinfo() failed"); + + // ...and that that item is the main file scope. + if (strcmp(info.what, "main") != 0) + return false; + + // Mod must be listed in secure.http_mods or secure.trusted_mods + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); + if (!lua_isstring(L, -1)) + return false; + std::string mod_name = readParam<std::string>(L, -1); + + std::string value = g_settings->get(setting); + value.erase(std::remove(value.begin(), value.end(), ' '), value.end()); + auto mod_list = str_split(value, ','); + + return CONTAINS(mod_list, mod_name); +} + int ScriptApiSecurity::sl_g_dofile(lua_State *L) { @@ -628,9 +709,7 @@ int ScriptApiSecurity::sl_g_load(lua_State *L) int ScriptApiSecurity::sl_g_loadfile(lua_State *L) { #ifndef SERVER - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_SCRIPTAPI); - ScriptApiBase *script = (ScriptApiBase *) lua_touserdata(L, -1); - lua_pop(L, 1); + ScriptApiBase *script = ModApiBase::getScriptApiBase(L); // Client implementation if (script->getType() == ScriptingType::Client) { @@ -803,3 +882,20 @@ int ScriptApiSecurity::sl_os_remove(lua_State *L) return 2; } + +int ScriptApiSecurity::sl_os_setlocale(lua_State *L) +{ + const bool cat = lua_gettop(L) > 1; + // Don't allow changes + if (!lua_isnoneornil(L, 1)) { + lua_pushnil(L); + return 1; + } + + push_original(L, "os", "setlocale"); + lua_pushnil(L); + if (cat) + lua_pushvalue(L, 2); + lua_call(L, cat ? 2 : 1, 1); + return 1; +} diff --git a/src/script/cpp_api/s_security.h b/src/script/cpp_api/s_security.h index 73e763548..880ce1638 100644 --- a/src/script/cpp_api/s_security.h +++ b/src/script/cpp_api/s_security.h @@ -40,11 +40,6 @@ with this program; if not, write to the Free Software Foundation, Inc., class ScriptApiSecurity : virtual public ScriptApiBase { public: - int getThread(lua_State *L); - // creates an empty Lua environment - void createEmptyEnv(lua_State *L); - // sets the enviroment to the table thats on top of the stack - void setLuaEnv(lua_State *L, int thread); // Sets up security on the ScriptApi's Lua state void initializeSecurity(); void initializeSecurityClient(); @@ -57,8 +52,17 @@ public: // Checks if mods are allowed to read (and optionally write) to the path static bool checkPath(lua_State *L, const char *path, bool write_required, bool *write_allowed=NULL); + // Check if mod is whitelisted in the given setting + // This additionally checks that the mod's main file scope is executing. + static bool checkWhitelisted(lua_State *L, const std::string &setting); private: + int getThread(lua_State *L); + // sets the enviroment to the table thats on top of the stack + void setLuaEnv(lua_State *L, int thread); + // creates an empty Lua environment + void createEmptyEnv(lua_State *L); + // Syntax: "sl_" <Library name or 'g' (global)> '_' <Function name> // (sl stands for Secure Lua) @@ -75,4 +79,5 @@ private: static int sl_os_rename(lua_State *L); static int sl_os_remove(lua_State *L); + static int sl_os_setlocale(lua_State *L); }; diff --git a/src/script/cpp_api/s_server.cpp b/src/script/cpp_api/s_server.cpp index 96cb28b28..c255b0c71 100644 --- a/src/script/cpp_api/s_server.cpp +++ b/src/script/cpp_api/s_server.cpp @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "cpp_api/s_server.h" #include "cpp_api/s_internal.h" #include "common/c_converter.h" +#include "util/numeric.h" // myrand bool ScriptApiServer::getAuth(const std::string &playername, std::string *dst_password, @@ -196,3 +197,66 @@ std::string ScriptApiServer::formatChatMessage(const std::string &name, return ret; } + +u32 ScriptApiServer::allocateDynamicMediaCallback(lua_State *L, int f_idx) +{ + if (f_idx < 0) + f_idx = lua_gettop(L) + f_idx + 1; + + lua_getglobal(L, "core"); + lua_getfield(L, -1, "dynamic_media_callbacks"); + luaL_checktype(L, -1, LUA_TTABLE); + + // Find a randomly generated token that doesn't exist yet + int tries = 100; + u32 token; + while (1) { + token = myrand(); + lua_rawgeti(L, -2, token); + bool is_free = lua_isnil(L, -1); + lua_pop(L, 1); + if (is_free) + break; + if (--tries < 0) + FATAL_ERROR("Ran out of callbacks IDs?!"); + } + + // core.dynamic_media_callbacks[token] = callback_func + lua_pushvalue(L, f_idx); + lua_rawseti(L, -2, token); + + lua_pop(L, 2); + + verbosestream << "allocateDynamicMediaCallback() = " << token << std::endl; + return token; +} + +void ScriptApiServer::freeDynamicMediaCallback(u32 token) +{ + SCRIPTAPI_PRECHECKHEADER + + verbosestream << "freeDynamicMediaCallback(" << token << ")" << std::endl; + + // core.dynamic_media_callbacks[token] = nil + lua_getglobal(L, "core"); + lua_getfield(L, -1, "dynamic_media_callbacks"); + luaL_checktype(L, -1, LUA_TTABLE); + lua_pushnil(L); + lua_rawseti(L, -2, token); + lua_pop(L, 2); +} + +void ScriptApiServer::on_dynamic_media_added(u32 token, const char *playername) +{ + SCRIPTAPI_PRECHECKHEADER + + int error_handler = PUSH_ERROR_HANDLER(L); + lua_getglobal(L, "core"); + lua_getfield(L, -1, "dynamic_media_callbacks"); + luaL_checktype(L, -1, LUA_TTABLE); + lua_rawgeti(L, -1, token); + luaL_checktype(L, -1, LUA_TFUNCTION); + + lua_pushstring(L, playername); + PCALL_RES(lua_pcall(L, 1, 0, error_handler)); +} diff --git a/src/script/cpp_api/s_server.h b/src/script/cpp_api/s_server.h index d8639cba7..58c8c0e48 100644 --- a/src/script/cpp_api/s_server.h +++ b/src/script/cpp_api/s_server.h @@ -49,6 +49,12 @@ public: const std::string &password); bool setPassword(const std::string &playername, const std::string &password); + + /* dynamic media handling */ + static u32 allocateDynamicMediaCallback(lua_State *L, int f_idx); + void freeDynamicMediaCallback(u32 token); + void on_dynamic_media_added(u32 token, const char *playername); + private: void getAuthHandler(); void readPrivileges(int index, std::set<std::string> &result); diff --git a/src/script/lua_api/l_areastore.cpp b/src/script/lua_api/l_areastore.cpp index 908c766b0..ec2656c4a 100644 --- a/src/script/lua_api/l_areastore.cpp +++ b/src/script/lua_api/l_areastore.cpp @@ -27,26 +27,26 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "filesys.h" #include <fstream> -static inline void get_data_and_border_flags(lua_State *L, u8 start_i, - bool *borders, bool *data) +static inline void get_data_and_corner_flags(lua_State *L, u8 start_i, + bool *corners, bool *data) { if (!lua_isboolean(L, start_i)) return; - *borders = lua_toboolean(L, start_i); + *corners = lua_toboolean(L, start_i); if (!lua_isboolean(L, start_i + 1)) return; *data = lua_toboolean(L, start_i + 1); } static void push_area(lua_State *L, const Area *a, - bool include_borders, bool include_data) + bool include_corners, bool include_data) { - if (!include_borders && !include_data) { + if (!include_corners && !include_data) { lua_pushboolean(L, true); return; } lua_newtable(L); - if (include_borders) { + if (include_corners) { push_v3s16(L, a->minedge); lua_setfield(L, -2, "min"); push_v3s16(L, a->maxedge); @@ -59,13 +59,13 @@ static void push_area(lua_State *L, const Area *a, } static inline void push_areas(lua_State *L, const std::vector<Area *> &areas, - bool borders, bool data) + bool corners, bool data) { lua_newtable(L); size_t cnt = areas.size(); for (size_t i = 0; i < cnt; i++) { lua_pushnumber(L, areas[i]->id); - push_area(L, areas[i], borders, data); + push_area(L, areas[i], corners, data); lua_settable(L, -3); } } @@ -94,7 +94,7 @@ int LuaAreaStore::gc_object(lua_State *L) return 0; } -// get_area(id, include_borders, include_data) +// get_area(id, include_corners, include_data) int LuaAreaStore::l_get_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -104,9 +104,9 @@ int LuaAreaStore::l_get_area(lua_State *L) u32 id = luaL_checknumber(L, 2); - bool include_borders = true; + bool include_corners = true; bool include_data = false; - get_data_and_border_flags(L, 3, &include_borders, &include_data); + get_data_and_corner_flags(L, 3, &include_corners, &include_data); const Area *res; @@ -114,12 +114,12 @@ int LuaAreaStore::l_get_area(lua_State *L) if (!res) return 0; - push_area(L, res, include_borders, include_data); + push_area(L, res, include_corners, include_data); return 1; } -// get_areas_for_pos(pos, include_borders, include_data) +// get_areas_for_pos(pos, include_corners, include_data) int LuaAreaStore::l_get_areas_for_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -129,19 +129,19 @@ int LuaAreaStore::l_get_areas_for_pos(lua_State *L) v3s16 pos = check_v3s16(L, 2); - bool include_borders = true; + bool include_corners = true; bool include_data = false; - get_data_and_border_flags(L, 3, &include_borders, &include_data); + get_data_and_corner_flags(L, 3, &include_corners, &include_data); std::vector<Area *> res; ast->getAreasForPos(&res, pos); - push_areas(L, res, include_borders, include_data); + push_areas(L, res, include_corners, include_data); return 1; } -// get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data) +// get_areas_in_area(corner1, corner2, accept_overlap, include_corners, include_data) int LuaAreaStore::l_get_areas_in_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -149,25 +149,26 @@ int LuaAreaStore::l_get_areas_in_area(lua_State *L) LuaAreaStore *o = checkobject(L, 1); AreaStore *ast = o->as; - v3s16 minedge = check_v3s16(L, 2); - v3s16 maxedge = check_v3s16(L, 3); + v3s16 minp = check_v3s16(L, 2); + v3s16 maxp = check_v3s16(L, 3); + sortBoxVerticies(minp, maxp); - bool include_borders = true; + bool include_corners = true; bool include_data = false; bool accept_overlap = false; if (lua_isboolean(L, 4)) { accept_overlap = readParam<bool>(L, 4); - get_data_and_border_flags(L, 5, &include_borders, &include_data); + get_data_and_corner_flags(L, 5, &include_corners, &include_data); } std::vector<Area *> res; - ast->getAreasInArea(&res, minedge, maxedge, accept_overlap); - push_areas(L, res, include_borders, include_data); + ast->getAreasInArea(&res, minp, maxp, accept_overlap); + push_areas(L, res, include_corners, include_data); return 1; } -// insert_area(edge1, edge2, data, id) +// insert_area(corner1, corner2, data, id) int LuaAreaStore::l_insert_area(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -372,7 +373,7 @@ void LuaAreaStore::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable // Can be created from Lua (AreaStore()) diff --git a/src/script/lua_api/l_auth.cpp b/src/script/lua_api/l_auth.cpp index 0fc57ba3a..32d8a7411 100644 --- a/src/script/lua_api/l_auth.cpp +++ b/src/script/lua_api/l_auth.cpp @@ -32,8 +32,11 @@ AuthDatabase *ModApiAuth::getAuthDb(lua_State *L) { ServerEnvironment *server_environment = dynamic_cast<ServerEnvironment *>(getEnv(L)); - if (!server_environment) + if (!server_environment) { + luaL_error(L, "Attempt to access an auth function but the auth" + " system is yet not initialized. This causes bugs."); return nullptr; + } return server_environment->getAuthDatabase(); } diff --git a/src/script/lua_api/l_base.cpp b/src/script/lua_api/l_base.cpp index 2bee09436..f842671b8 100644 --- a/src/script/lua_api/l_base.cpp +++ b/src/script/lua_api/l_base.cpp @@ -100,32 +100,21 @@ bool ModApiBase::registerFunction(lua_State *L, const char *name, return true; } -std::unordered_map<std::string, luaL_Reg> ModApiBase::m_deprecated_wrappers; -bool ModApiBase::m_error_deprecated_calls = false; - -int ModApiBase::l_deprecated_function(lua_State *L) +int ModApiBase::l_deprecated_function(lua_State *L, const char *good, const char *bad, lua_CFunction func) { thread_local std::vector<u64> deprecated_logged; + DeprecatedHandlingMode dep_mode = get_deprecated_handling_mode(); + if (dep_mode == DeprecatedHandlingMode::Ignore) + return func(L); + u64 start_time = porting::getTimeUs(); lua_Debug ar; - // Get function name for lookup - FATAL_ERROR_IF(!lua_getstack(L, 0, &ar), "lua_getstack() failed"); - FATAL_ERROR_IF(!lua_getinfo(L, "n", &ar), "lua_getinfo() failed"); - - // Combine name with line and script backtrace + // Get caller name with line and script backtrace FATAL_ERROR_IF(!lua_getstack(L, 1, &ar), "lua_getstack() failed"); FATAL_ERROR_IF(!lua_getinfo(L, "Sl", &ar), "lua_getinfo() failed"); - // Get parent class to get the wrappers map - luaL_checktype(L, 1, LUA_TUSERDATA); - void *ud = lua_touserdata(L, 1); - ModApiBase *o = *(ModApiBase**)ud; - - // New function and new function name - auto it = o->m_deprecated_wrappers.find(ar.name); - // Get backtrace and hash it to reduce the warning flood std::string backtrace = ar.short_src; backtrace.append(":").append(std::to_string(ar.currentline)); @@ -135,45 +124,16 @@ int ModApiBase::l_deprecated_function(lua_State *L) == deprecated_logged.end()) { deprecated_logged.emplace_back(hash); - warningstream << "Call to deprecated function '" << ar.name << "', please use '" - << it->second.name << "' at " << backtrace << std::endl; + warningstream << "Call to deprecated function '" << bad << "', please use '" + << good << "' at " << backtrace << std::endl; - if (m_error_deprecated_calls) + if (dep_mode == DeprecatedHandlingMode::Error) script_error(L, LUA_ERRRUN, NULL, NULL); } u64 end_time = porting::getTimeUs(); g_profiler->avg("l_deprecated_function", end_time - start_time); - return it->second.func(L); + return func(L); } -void ModApiBase::markAliasDeprecated(luaL_Reg *reg) -{ - std::string value = g_settings->get("deprecated_lua_api_handling"); - m_error_deprecated_calls = value == "error"; - - if (!m_error_deprecated_calls && value != "log") - return; - - const char *last_name = nullptr; - lua_CFunction last_func = nullptr; - - // ! Null termination ! - while (reg->func) { - if (last_func == reg->func) { - // Duplicate found - luaL_Reg original_reg; - // Do not inline struct. Breaks MSVC or is error-prone - original_reg.name = last_name; - original_reg.func = reg->func; - m_deprecated_wrappers.emplace( - std::pair<std::string, luaL_Reg>(reg->name, original_reg)); - reg->func = l_deprecated_function; - } - - last_func = reg->func; - last_name = reg->name; - ++reg; - } -} diff --git a/src/script/lua_api/l_base.h b/src/script/lua_api/l_base.h index 65fce8481..aa5905d26 100644 --- a/src/script/lua_api/l_base.h +++ b/src/script/lua_api/l_base.h @@ -41,7 +41,6 @@ class Environment; class ServerInventoryManager; class ModApiBase : protected LuaHelper { - public: static ScriptApiBase* getScriptApiBase(lua_State *L); static Server* getServer(lua_State *L); @@ -75,10 +74,18 @@ public: lua_CFunction func, int top); - static int l_deprecated_function(lua_State *L); - static void markAliasDeprecated(luaL_Reg *reg); -private: - // <old_name> = { <new_name>, <new_function> } - static std::unordered_map<std::string, luaL_Reg> m_deprecated_wrappers; - static bool m_error_deprecated_calls; + /** + * A wrapper for deprecated functions. + * + * When called, handles the deprecation according to user settings and then calls `func`. + * + * @throws Lua Error if required by the user settings. + * + * @param L Lua state + * @param good Name of good function/method + * @param bad Name of deprecated function/method + * @param func Actual implementation of function + * @return value from `func` + */ + static int l_deprecated_function(lua_State *L, const char *good, const char *bad, lua_CFunction func); }; diff --git a/src/script/lua_api/l_camera.cpp b/src/script/lua_api/l_camera.cpp index bfa60be67..d85d16283 100644 --- a/src/script/lua_api/l_camera.cpp +++ b/src/script/lua_api/l_camera.cpp @@ -63,7 +63,8 @@ int LuaCamera::l_set_camera_mode(lua_State *L) return 0; camera->setCameraMode((CameraMode)((int)lua_tonumber(L, 2))); - playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); + // Make the player visible depending on camera mode. + playercao->updateMeshCulling(); playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); return 0; } @@ -218,7 +219,7 @@ void LuaCamera::Register(lua_State *L) lua_pop(L, 1); - luaL_openlib(L, 0, methods, 0); + luaL_register(L, nullptr, methods); lua_pop(L, 1); } diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp index aaced7cd0..05ac53cbb 100644 --- a/src/script/lua_api/l_client.cpp +++ b/src/script/lua_api/l_client.cpp @@ -268,30 +268,32 @@ int ModApiClient::l_sound_play(lua_State *L) SimpleSoundSpec spec; read_soundspec(L, 1, spec); + SoundLocation type = SoundLocation::Local; float gain = 1.0f; - float pitch = 1.0f; - bool looped = false; - s32 handle; + v3f position; if (lua_istable(L, 2)) { getfloatfield(L, 2, "gain", gain); - getfloatfield(L, 2, "pitch", pitch); - getboolfield(L, 2, "loop", looped); + getfloatfield(L, 2, "pitch", spec.pitch); + getboolfield(L, 2, "loop", spec.loop); lua_getfield(L, 2, "pos"); if (!lua_isnil(L, -1)) { - v3f pos = read_v3f(L, -1) * BS; + position = read_v3f(L, -1) * BS; + type = SoundLocation::Position; lua_pop(L, 1); - handle = sound->playSoundAt( - spec.name, looped, gain * spec.gain, pos, pitch); - lua_pushinteger(L, handle); - return 1; } } - handle = sound->playSound(spec.name, looped, gain * spec.gain, spec.fade, pitch); - lua_pushinteger(L, handle); + spec.gain *= gain; + s32 handle; + if (type == SoundLocation::Local) + handle = sound->playSound(spec); + else + handle = sound->playSoundAt(spec, position); + + lua_pushinteger(L, handle); return 1; } diff --git a/src/script/lua_api/l_craft.cpp b/src/script/lua_api/l_craft.cpp index 18622ee00..137b210be 100644 --- a/src/script/lua_api/l_craft.cpp +++ b/src/script/lua_api/l_craft.cpp @@ -371,8 +371,9 @@ int ModApiCraft::l_clear_craft(lua_State *L) int ModApiCraft::l_get_craft_result(lua_State *L) { NO_MAP_LOCK_REQUIRED; + IGameDef *gdef = getGameDef(L); - int input_i = 1; + const int input_i = 1; std::string method_s = getstringfield_default(L, input_i, "method", "normal"); enum CraftMethod method = (CraftMethod)getenumfield(L, input_i, "method", es_CraftMethod, CRAFT_METHOD_NORMAL); @@ -382,10 +383,9 @@ int ModApiCraft::l_get_craft_result(lua_State *L) width = luaL_checkinteger(L, -1); lua_pop(L, 1); lua_getfield(L, input_i, "items"); - std::vector<ItemStack> items = read_items(L, -1,getServer(L)); + std::vector<ItemStack> items = read_items(L, -1, gdef); lua_pop(L, 1); // items - IGameDef *gdef = getServer(L); ICraftDefManager *cdef = gdef->cdef(); CraftInput input(method, width, items); CraftOutput output; @@ -465,13 +465,13 @@ static void push_craft_recipes(lua_State *L, IGameDef *gdef, const std::vector<CraftDefinition*> &recipes, const CraftOutput &output) { - lua_createtable(L, recipes.size(), 0); - if (recipes.empty()) { lua_pushnil(L); return; } + lua_createtable(L, recipes.size(), 0); + std::vector<CraftDefinition*>::const_iterator it = recipes.begin(); for (unsigned i = 0; it != recipes.end(); ++it) { lua_newtable(L); @@ -487,10 +487,9 @@ int ModApiCraft::l_get_craft_recipe(lua_State *L) NO_MAP_LOCK_REQUIRED; std::string item = luaL_checkstring(L, 1); - Server *server = getServer(L); + IGameDef *gdef = getGameDef(L); CraftOutput output(item, 0); - std::vector<CraftDefinition*> recipes = server->cdef() - ->getCraftRecipes(output, server, 1); + auto recipes = gdef->cdef()->getCraftRecipes(output, gdef, 1); lua_createtable(L, 1, 0); @@ -500,7 +499,7 @@ int ModApiCraft::l_get_craft_recipe(lua_State *L) setintfield(L, -1, "width", 0); return 1; } - push_craft_recipe(L, server, recipes[0], output); + push_craft_recipe(L, gdef, recipes[0], output); return 1; } @@ -510,12 +509,11 @@ int ModApiCraft::l_get_all_craft_recipes(lua_State *L) NO_MAP_LOCK_REQUIRED; std::string item = luaL_checkstring(L, 1); - Server *server = getServer(L); + IGameDef *gdef = getGameDef(L); CraftOutput output(item, 0); - std::vector<CraftDefinition*> recipes = server->cdef() - ->getCraftRecipes(output, server); + auto recipes = gdef->cdef()->getCraftRecipes(output, gdef); - push_craft_recipes(L, server, recipes, output); + push_craft_recipes(L, gdef, recipes, output); return 1; } @@ -527,3 +525,11 @@ void ModApiCraft::Initialize(lua_State *L, int top) API_FCT(register_craft); API_FCT(clear_craft); } + +void ModApiCraft::InitializeAsync(lua_State *L, int top) +{ + // all read-only functions + API_FCT(get_all_craft_recipes); + API_FCT(get_craft_recipe); + API_FCT(get_craft_result); +} diff --git a/src/script/lua_api/l_craft.h b/src/script/lua_api/l_craft.h index 9002b23ef..5234af56f 100644 --- a/src/script/lua_api/l_craft.h +++ b/src/script/lua_api/l_craft.h @@ -45,4 +45,5 @@ private: public: static void Initialize(lua_State *L, int top); + static void InitializeAsync(lua_State *L, int top); }; diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 138e88ae8..b26c89e7d 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -46,13 +46,22 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/client.h" #endif -struct EnumString ModApiEnvMod::es_ClearObjectsMode[] = +const EnumString ModApiEnvMod::es_ClearObjectsMode[] = { {CLEAR_OBJECTS_MODE_FULL, "full"}, {CLEAR_OBJECTS_MODE_QUICK, "quick"}, {0, NULL}, }; +const EnumString ModApiEnvMod::es_BlockStatusType[] = +{ + {ServerEnvironment::BS_UNKNOWN, "unknown"}, + {ServerEnvironment::BS_EMERGING, "emerging"}, + {ServerEnvironment::BS_LOADED, "loaded"}, + {ServerEnvironment::BS_ACTIVE, "active"}, + {0, NULL}, +}; + /////////////////////////////////////////////////////////////////////////////// @@ -228,7 +237,7 @@ void LuaRaycast::Register(lua_State *L) lua_pop(L, 1); - luaL_openlib(L, 0, methods, 0); + luaL_register(L, nullptr, methods); lua_pop(L, 1); lua_register(L, className, create_object); @@ -407,6 +416,46 @@ int ModApiEnvMod::l_get_node_light(lua_State *L) return 1; } + +// get_natural_light(pos, timeofday) +// pos = {x=num, y=num, z=num} +// timeofday: nil = current time, 0 = night, 0.5 = day +int ModApiEnvMod::l_get_natural_light(lua_State *L) +{ + GET_ENV_PTR; + + v3s16 pos = read_v3s16(L, 1); + + bool is_position_ok; + MapNode n = env->getMap().getNode(pos, &is_position_ok); + if (!is_position_ok) + return 0; + + // If the daylight is 0, nothing needs to be calculated + u8 daylight = n.param1 & 0x0f; + if (daylight == 0) { + lua_pushinteger(L, 0); + return 1; + } + + u32 time_of_day; + if (lua_isnumber(L, 2)) { + time_of_day = 24000.0 * lua_tonumber(L, 2); + time_of_day %= 24000; + } else { + time_of_day = env->getTimeOfDay(); + } + u32 dnr = time_to_daynight_ratio(time_of_day, true); + + // If it's the same as the artificial light, the sunlight needs to be + // searched for because the value may not emanate from the sun + if (daylight == n.param1 >> 4) + daylight = env->findSunlight(pos); + + lua_pushinteger(L, dnr * daylight / 1000); + return 1; +} + // place_node(pos, node) // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_place_node(lua_State *L) @@ -428,7 +477,7 @@ int ModApiEnvMod::l_place_node(lua_State *L) return 1; } // Create item to place - ItemStack item(ndef->get(n).name, 1, 0, idef); + Optional<ItemStack> item = ItemStack(ndef->get(n).name, 1, 0, idef); // Make pointed position PointedThing pointed; pointed.type = POINTEDTHING_NODE; @@ -591,7 +640,7 @@ int ModApiEnvMod::l_add_entity(lua_State *L) v3f pos = checkFloatPos(L, 1); const char *name = luaL_checkstring(L, 2); - const char *staticdata = luaL_optstring(L, 3, ""); + std::string staticdata = readParam<std::string>(L, 3, ""); ServerActiveObject *obj = new LuaEntitySAO(env, pos, name, staticdata); int objectid = env->addActiveObject(obj); @@ -703,6 +752,31 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L) return 1; } +// get_objects_in_area(pos, minp, maxp) +int ModApiEnvMod::l_get_objects_in_area(lua_State *L) +{ + GET_ENV_PTR; + ScriptApiBase *script = getScriptApiBase(L); + + v3f minp = read_v3f(L, 1) * BS; + v3f maxp = read_v3f(L, 2) * BS; + aabb3f box(minp, maxp); + box.repair(); + std::vector<ServerActiveObject *> objs; + + auto include_obj_cb = [](ServerActiveObject *obj){ return !obj->isGone(); }; + env->getObjectsInArea(objs, box, include_obj_cb); + + int i = 0; + lua_createtable(L, objs.size(), 0); + for (const auto obj : objs) { + // Insert object reference into table + script->objectrefGetOrCreate(L, obj); + lua_rawseti(L, -2, ++i); + } + return 1; +} + // set_timeofday(val) // val = 0...1 int ModApiEnvMod::l_set_timeofday(lua_State *L) @@ -711,8 +785,9 @@ int ModApiEnvMod::l_set_timeofday(lua_State *L) // Do it float timeofday_f = readParam<float>(L, 1); - sanity_check(timeofday_f >= 0.0 && timeofday_f <= 1.0); - int timeofday_mh = (int)(timeofday_f * 24000.0); + luaL_argcheck(L, timeofday_f >= 0.0f && timeofday_f <= 1.0f, 1, + "value must be between 0 and 1"); + int timeofday_mh = (int)(timeofday_f * 24000.0f); // This should be set directly in the environment but currently // such changes aren't immediately sent to the clients, so call // the server instead. @@ -805,6 +880,21 @@ int ModApiEnvMod::l_find_node_near(lua_State *L) return 0; } +static void checkArea(v3s16 &minp, v3s16 &maxp) +{ + auto volume = VoxelArea(minp, maxp).getVolume(); + // Volume limit equal to 8 default mapchunks, (80 * 2) ^ 3 = 4,096,000 + if (volume > 4096000) { + throw LuaError("Area volume exceeds allowed value of 4096000"); + } + + // Clamp to map range to avoid problems +#define CLAMP(arg) core::clamp(arg, (s16)-MAX_MAP_GENERATION_LIMIT, (s16)MAX_MAP_GENERATION_LIMIT) + minp = v3s16(CLAMP(minp.X), CLAMP(minp.Y), CLAMP(minp.Z)); + maxp = v3s16(CLAMP(maxp.X), CLAMP(maxp.Y), CLAMP(maxp.Z)); +#undef CLAMP +} + // find_nodes_in_area(minp, maxp, nodenames, [grouped]) int ModApiEnvMod::l_find_nodes_in_area(lua_State *L) { @@ -824,13 +914,7 @@ int ModApiEnvMod::l_find_nodes_in_area(lua_State *L) } #endif - v3s16 cube = maxp - minp + 1; - // Volume limit equal to 8 default mapchunks, (80 * 2) ^ 3 = 4,096,000 - if ((u64)cube.X * (u64)cube.Y * (u64)cube.Z > 4096000) { - luaL_error(L, "find_nodes_in_area(): area volume" - " exceeds allowed value of 4096000"); - return 0; - } + checkArea(minp, maxp); std::vector<content_t> filter; collectNodeIds(L, 3, ndef, filter); @@ -935,13 +1019,7 @@ int ModApiEnvMod::l_find_nodes_in_area_under_air(lua_State *L) } #endif - v3s16 cube = maxp - minp + 1; - // Volume limit equal to 8 default mapchunks, (80 * 2) ^ 3 = 4,096,000 - if ((u64)cube.X * (u64)cube.Y * (u64)cube.Z > 4096000) { - luaL_error(L, "find_nodes_in_area_under_air(): area volume" - " exceeds allowed value of 4096000"); - return 0; - } + checkArea(minp, maxp); std::vector<content_t> filter; collectNodeIds(L, 3, ndef, filter); @@ -1141,7 +1219,8 @@ int ModApiEnvMod::l_emerge_area(lua_State *L) sortBoxVerticies(bpmin, bpmax); size_t num_blocks = VoxelArea(bpmin, bpmax).getVolume(); - assert(num_blocks != 0); + if (num_blocks == 0) + return 0; if (lua_isfunction(L, 3)) { callback = LuaEmergeAreaCallback; @@ -1308,7 +1387,7 @@ int ModApiEnvMod::l_transforming_liquid_add(lua_State *L) GET_ENV_PTR; v3s16 p0 = read_v3s16(L, 1); - env->getMap().transforming_liquid_add(p0); + env->getServerMap().transforming_liquid_add(p0); return 1; } @@ -1323,6 +1402,24 @@ int ModApiEnvMod::l_forceload_block(lua_State *L) return 0; } +// compare_block_status(nodepos) +int ModApiEnvMod::l_compare_block_status(lua_State *L) +{ + GET_ENV_PTR; + + v3s16 nodepos = check_v3s16(L, 1); + std::string condition_s = luaL_checkstring(L, 2); + auto status = env->getBlockStatus(getNodeBlockPos(nodepos)); + + int condition_i = -1; + if (!string_to_enum(es_BlockStatusType, condition_i, condition_s)) + return 0; // Unsupported + + lua_pushboolean(L, status >= condition_i); + return 1; +} + + // forceload_free_block(blockpos) // blockpos = {x=num, y=num, z=num} int ModApiEnvMod::l_forceload_free_block(lua_State *L) @@ -1358,6 +1455,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(get_node); API_FCT(get_node_or_nil); API_FCT(get_node_light); + API_FCT(get_natural_light); API_FCT(place_node); API_FCT(dig_node); API_FCT(punch_node); @@ -1371,6 +1469,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(get_node_timer); API_FCT(get_connected_players); API_FCT(get_player_by_name); + API_FCT(get_objects_in_area); API_FCT(get_objects_inside_radius); API_FCT(set_timeofday); API_FCT(get_timeofday); @@ -1394,6 +1493,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(transforming_liquid_add); API_FCT(forceload_block); API_FCT(forceload_free_block); + API_FCT(compare_block_status); API_FCT(get_translated_string); } diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 07d4d2438..a7d406d2a 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -56,6 +56,11 @@ private: // timeofday: nil = current time, 0 = night, 0.5 = day static int l_get_node_light(lua_State *L); + // get_natural_light(pos, timeofday) + // pos = {x=num, y=num, z=num} + // timeofday: nil = current time, 0 = night, 0.5 = day + static int l_get_natural_light(lua_State *L); + // place_node(pos, node) // pos = {x=num, y=num, z=num} static int l_place_node(lua_State *L); @@ -110,6 +115,9 @@ private: // get_objects_inside_radius(pos, radius) static int l_get_objects_inside_radius(lua_State *L); + // get_objects_in_area(pos, minp, maxp) + static int l_get_objects_in_area(lua_State *L); + // set_timeofday(val) // val = 0...1 static int l_set_timeofday(lua_State *L); @@ -187,6 +195,9 @@ private: // stops forceloading a position static int l_forceload_free_block(lua_State *L); + // compare_block_status(nodepos) + static int l_compare_block_status(lua_State *L); + // Get a string translated server side static int l_get_translated_string(lua_State * L); @@ -199,7 +210,8 @@ public: static void Initialize(lua_State *L, int top); static void InitializeClient(lua_State *L, int top); - static struct EnumString es_ClearObjectsMode[]; + static const EnumString es_ClearObjectsMode[]; + static const EnumString es_BlockStatusType[]; }; class LuaABM : public ActiveBlockModifier { @@ -211,17 +223,21 @@ private: float m_trigger_interval; u32 m_trigger_chance; bool m_simple_catch_up; + s16 m_min_y; + s16 m_max_y; public: LuaABM(lua_State *L, int id, const std::vector<std::string> &trigger_contents, const std::vector<std::string> &required_neighbors, - float trigger_interval, u32 trigger_chance, bool simple_catch_up): + float trigger_interval, u32 trigger_chance, bool simple_catch_up, s16 min_y, s16 max_y): m_id(id), m_trigger_contents(trigger_contents), m_required_neighbors(required_neighbors), m_trigger_interval(trigger_interval), m_trigger_chance(trigger_chance), - m_simple_catch_up(simple_catch_up) + m_simple_catch_up(simple_catch_up), + m_min_y(min_y), + m_max_y(max_y) { } virtual const std::vector<std::string> &getTriggerContents() const @@ -244,6 +260,14 @@ public: { return m_simple_catch_up; } + virtual s16 getMinY() + { + return m_min_y; + } + virtual s16 getMaxY() + { + return m_max_y; + } virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider); }; diff --git a/src/script/lua_api/l_http.cpp b/src/script/lua_api/l_http.cpp index 5ea3b3f99..5566a8523 100644 --- a/src/script/lua_api/l_http.cpp +++ b/src/script/lua_api/l_http.cpp @@ -21,14 +21,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_converter.h" #include "common/c_content.h" #include "lua_api/l_http.h" +#include "cpp_api/s_security.h" #include "httpfetch.h" #include "settings.h" #include "debug.h" #include "log.h" -#include <algorithm> #include <iomanip> -#include <cctype> #define HTTP_API(name) \ lua_pushstring(L, #name); \ @@ -42,12 +41,10 @@ void ModApiHttp::read_http_fetch_request(lua_State *L, HTTPFetchRequest &req) req.caller = httpfetch_caller_alloc_secure(); getstringfield(L, 1, "url", req.url); - lua_getfield(L, 1, "user_agent"); - if (lua_isstring(L, -1)) - req.useragent = getstringfield_default(L, 1, "user_agent", ""); - lua_pop(L, 1); + getstringfield(L, 1, "user_agent", req.useragent); req.multipart = getboolfield_default(L, 1, "multipart", false); - req.timeout = getintfield_default(L, 1, "timeout", 3) * 1000; + if (getintfield(L, 1, "timeout", req.timeout)) + req.timeout *= 1000; lua_getfield(L, 1, "method"); if (lua_isstring(L, -1)) { @@ -169,54 +166,22 @@ int ModApiHttp::l_request_http_api(lua_State *L) { NO_MAP_LOCK_REQUIRED; - // We have to make sure that this function is being called directly by - // a mod, otherwise a malicious mod could override this function and - // steal its return value. - lua_Debug info; - - // Make sure there's only one item below this function on the stack... - if (lua_getstack(L, 2, &info)) { - return 0; - } - FATAL_ERROR_IF(!lua_getstack(L, 1, &info), "lua_getstack() failed"); - FATAL_ERROR_IF(!lua_getinfo(L, "S", &info), "lua_getinfo() failed"); - - // ...and that that item is the main file scope. - if (strcmp(info.what, "main") != 0) { - return 0; - } - - // Mod must be listed in secure.http_mods or secure.trusted_mods - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); - if (!lua_isstring(L, -1)) { - return 0; - } - - std::string mod_name = readParam<std::string>(L, -1); - std::string http_mods = g_settings->get("secure.http_mods"); - http_mods.erase(std::remove(http_mods.begin(), http_mods.end(), ' '), http_mods.end()); - std::vector<std::string> mod_list_http = str_split(http_mods, ','); - - std::string trusted_mods = g_settings->get("secure.trusted_mods"); - trusted_mods.erase(std::remove(trusted_mods.begin(), trusted_mods.end(), ' '), trusted_mods.end()); - std::vector<std::string> mod_list_trusted = str_split(trusted_mods, ','); - - mod_list_http.insert(mod_list_http.end(), mod_list_trusted.begin(), mod_list_trusted.end()); - if (std::find(mod_list_http.begin(), mod_list_http.end(), mod_name) == mod_list_http.end()) { + if (!ScriptApiSecurity::checkWhitelisted(L, "secure.http_mods") && + !ScriptApiSecurity::checkWhitelisted(L, "secure.trusted_mods")) { lua_pushnil(L); return 1; } - lua_getglobal(L, "core"); - lua_getfield(L, -1, "http_add_fetch"); + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_HTTP_API_LUA); + assert(lua_isfunction(L, -1)); lua_newtable(L); HTTP_API(fetch_async); HTTP_API(fetch_async_get); // Stack now looks like this: - // <core.http_add_fetch> <table with fetch_async, fetch_async_get> - // Now call core.http_add_fetch to append .fetch(request, callback) to table + // <function> <table with fetch_async, fetch_async_get> + // Now call it to append .fetch(request, callback) to table lua_call(L, 1, 1); return 1; @@ -236,6 +201,22 @@ int ModApiHttp::l_get_http_api(lua_State *L) #endif +int ModApiHttp::l_set_http_api_lua(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + +#if USE_CURL + // This is called by builtin to give us a function that will later + // populate the http_api table with additional method(s). + // We need this because access to the HTTP api is security-relevant and + // any mod could just mess with a global variable. + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_rawseti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_HTTP_API_LUA); +#endif + + return 0; +} + void ModApiHttp::Initialize(lua_State *L, int top) { #if USE_CURL @@ -249,8 +230,14 @@ void ModApiHttp::Initialize(lua_State *L, int top) API_FCT(get_http_api); } else { API_FCT(request_http_api); + API_FCT(set_http_api_lua); } +#else + + // Define this function anyway so builtin can call it without checking + API_FCT(set_http_api_lua); + #endif } diff --git a/src/script/lua_api/l_http.h b/src/script/lua_api/l_http.h index c3a2a5276..8d084ecd9 100644 --- a/src/script/lua_api/l_http.h +++ b/src/script/lua_api/l_http.h @@ -48,6 +48,10 @@ private: static int l_get_http_api(lua_State *L); #endif + // set_http_api_lua() [internal] + static int l_set_http_api_lua(lua_State *L); + + public: static void Initialize(lua_State *L, int top); static void InitializeAsync(lua_State *L, int top); diff --git a/src/script/lua_api/l_internal.h b/src/script/lua_api/l_internal.h index a86eeaf79..de73ff42a 100644 --- a/src/script/lua_api/l_internal.h +++ b/src/script/lua_api/l_internal.h @@ -29,7 +29,16 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_internal.h" #define luamethod(class, name) {#name, class::l_##name} -#define luamethod_aliased(class, name, alias) {#name, class::l_##name}, {#alias, class::l_##name} + +#define luamethod_dep(class, good, bad) \ + {#bad, [](lua_State *L) -> int { \ + return l_deprecated_function(L, #good, #bad, &class::l_##good); \ + }} + +#define luamethod_aliased(class, good, bad) \ + luamethod(class, good), \ + luamethod_dep(class, good, bad) + #define API_FCT(name) registerFunction(L, #name, l_##name, top) // For future use @@ -60,7 +69,7 @@ with this program; if not, write to the Free Software Foundation, Inc., // Retrieve Environment pointer as `env` (no map lock) #define GET_PLAIN_ENV_PTR_NO_MAP_LOCK \ - Environment *env = (Environment *)getEnv(L); \ + Environment *env = getEnv(L); \ if (env == NULL) \ return 0 diff --git a/src/script/lua_api/l_inventory.cpp b/src/script/lua_api/l_inventory.cpp index e41b5cb41..175047e58 100644 --- a/src/script/lua_api/l_inventory.cpp +++ b/src/script/lua_api/l_inventory.cpp @@ -214,11 +214,16 @@ int InvRef::l_get_list(lua_State *L) InvRef *ref = checkobject(L, 1); const char *listname = luaL_checkstring(L, 2); Inventory *inv = getinv(L, ref); - if(inv){ - push_inventory_list(L, inv, listname); - } else { + if (!inv) { lua_pushnil(L); + return 1; } + InventoryList *invlist = inv->getList(listname); + if (!invlist) { + lua_pushnil(L); + return 1; + } + push_inventory_list(L, *invlist); return 1; } @@ -242,7 +247,7 @@ int InvRef::l_set_list(lua_State *L) return 0; } -// get_lists(self) -> list of InventoryLists +// get_lists(self) -> table that maps listnames to InventoryLists int InvRef::l_get_lists(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -251,15 +256,7 @@ int InvRef::l_get_lists(lua_State *L) if (!inv) { return 0; } - std::vector<const InventoryList*> lists = inv->getLists(); - std::vector<const InventoryList*>::iterator iter = lists.begin(); - lua_createtable(L, 0, lists.size()); - for (; iter != lists.end(); iter++) { - const char* name = (*iter)->getName().c_str(); - lua_pushstring(L, name); - push_inventory_list(L, inv, name); - lua_rawset(L, -3); - } + push_inventory_lists(L, *inv); return 1; } @@ -280,6 +277,7 @@ int InvRef::l_set_lists(lua_State *L) Server *server = getServer(L); lua_pushnil(L); + luaL_checktype(L, 2, LUA_TTABLE); while (lua_next(L, 2)) { const char *listname = lua_tostring(L, -2); read_inventory_list(L, -1, tempInv, listname, server); @@ -420,19 +418,6 @@ void InvRef::create(lua_State *L, const InventoryLocation &loc) luaL_getmetatable(L, className); lua_setmetatable(L, -2); } -void InvRef::createPlayer(lua_State *L, RemotePlayer *player) -{ - NO_MAP_LOCK_REQUIRED; - InventoryLocation loc; - loc.setPlayer(player->getName()); - create(L, loc); -} -void InvRef::createNodeMeta(lua_State *L, v3s16 p) -{ - InventoryLocation loc; - loc.setNodeMeta(p); - create(L, loc); -} void InvRef::Register(lua_State *L) { @@ -455,7 +440,7 @@ void InvRef::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable // Cannot be created from Lua diff --git a/src/script/lua_api/l_inventory.h b/src/script/lua_api/l_inventory.h index 94f670c9d..6a75bac0f 100644 --- a/src/script/lua_api/l_inventory.h +++ b/src/script/lua_api/l_inventory.h @@ -111,8 +111,6 @@ public: // Creates an InvRef and leaves it on top of stack // Not callable from Lua; all references are created on the C side. static void create(lua_State *L, const InventoryLocation &loc); - static void createPlayer(lua_State *L, RemotePlayer *player); - static void createNodeMeta(lua_State *L, v3s16 p); static void Register(lua_State *L); }; diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index d67cab76f..13d046d00 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_internal.h" #include "common/c_converter.h" #include "common/c_content.h" +#include "common/c_packer.h" #include "itemdef.h" #include "nodedef.h" #include "server.h" @@ -193,6 +194,16 @@ int LuaItemStack::l_get_description(lua_State *L) return 1; } +// get_short_description(self) +int LuaItemStack::l_get_short_description(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + LuaItemStack *o = checkobject(L, 1); + std::string desc = o->m_stack.getShortDescription(getGameDef(L)->idef()); + lua_pushstring(L, desc.c_str()); + return 1; +} + // clear(self) -> true int LuaItemStack::l_clear(lua_State *L) { @@ -332,7 +343,7 @@ int LuaItemStack::l_get_tool_capabilities(lua_State *L) } // add_wear(self, amount) -> true/false -// The range for "amount" is [0,65535]. Wear is only added if the item +// The range for "amount" is [0,65536]. Wear is only added if the item // is a tool. Adding wear might destroy the item. // Returns true if the item is (or was) a tool. int LuaItemStack::l_add_wear(lua_State *L) @@ -346,6 +357,25 @@ int LuaItemStack::l_add_wear(lua_State *L) return 1; } +// add_wear_by_uses(self, max_uses) -> true/false +// The range for "max_uses" is [0,65536]. +// Adds wear to the item in such a way that, if +// only this function is called to add wear, the item +// will be destroyed exactly after `max_uses` times of calling it. +// No-op if `max_uses` is 0 or item is not a tool. +// Returns true if the item is (or was) a tool. +int LuaItemStack::l_add_wear_by_uses(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + LuaItemStack *o = checkobject(L, 1); + ItemStack &item = o->m_stack; + u32 max_uses = readParam<int>(L, 2); + u32 add_wear = calculateResultWear(max_uses, item.wear); + bool result = item.addWear(add_wear, getGameDef(L)->idef()); + lua_pushboolean(L, result); + return 1; +} + // add_item(self, itemstack or itemstring or table or nil) -> itemstack // Returns leftover item stack int LuaItemStack::l_add_item(lua_State *L) @@ -431,6 +461,7 @@ int LuaItemStack::create_object(lua_State *L) lua_setmetatable(L, -2); return 1; } + // Not callable from Lua int LuaItemStack::create(lua_State *L, const ItemStack &item) { @@ -447,6 +478,20 @@ LuaItemStack *LuaItemStack::checkobject(lua_State *L, int narg) return *(LuaItemStack **)luaL_checkudata(L, narg, className); } +void *LuaItemStack::packIn(lua_State *L, int idx) +{ + LuaItemStack *o = checkobject(L, idx); + return new ItemStack(o->getItem()); +} + +void LuaItemStack::packOut(lua_State *L, void *ptr) +{ + ItemStack *stack = reinterpret_cast<ItemStack*>(ptr); + if (L) + create(L, *stack); + delete stack; +} + void LuaItemStack::Register(lua_State *L) { lua_newtable(L); @@ -473,11 +518,13 @@ void LuaItemStack::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable // Can be created from Lua (ItemStack(itemstack or itemstring or table or nil)) lua_register(L, className, create_object); + + script_register_packer(L, className, packIn, packOut); } const char LuaItemStack::className[] = "ItemStack"; @@ -493,6 +540,7 @@ const luaL_Reg LuaItemStack::methods[] = { luamethod(LuaItemStack, get_metadata), luamethod(LuaItemStack, set_metadata), luamethod(LuaItemStack, get_description), + luamethod(LuaItemStack, get_short_description), luamethod(LuaItemStack, clear), luamethod(LuaItemStack, replace), luamethod(LuaItemStack, to_string), @@ -503,6 +551,7 @@ const luaL_Reg LuaItemStack::methods[] = { luamethod(LuaItemStack, get_definition), luamethod(LuaItemStack, get_tool_capabilities), luamethod(LuaItemStack, add_wear), + luamethod(LuaItemStack, add_wear_by_uses), luamethod(LuaItemStack, add_item), luamethod(LuaItemStack, item_fits), luamethod(LuaItemStack, take_item), @@ -559,11 +608,15 @@ int ModApiItemMod::l_register_item_raw(lua_State *L) // Read the node definition (content features) and register it if (def.type == ITEM_NODE) { - ContentFeatures f = read_content_features(L, table); + ContentFeatures f; + read_content_features(L, f, table); // when a mod reregisters ignore, only texture changes and such should // be done if (f.name == "ignore") return 0; + // This would break everything + if (f.name.empty()) + throw LuaError("Cannot register node with empty name"); content_t id = ndef->set(f.name, f); @@ -620,8 +673,8 @@ int ModApiItemMod::l_get_content_id(lua_State *L) NO_MAP_LOCK_REQUIRED; std::string name = luaL_checkstring(L, 1); - const IItemDefManager *idef = getGameDef(L)->getItemDefManager(); - const NodeDefManager *ndef = getGameDef(L)->getNodeDefManager(); + const IItemDefManager *idef = getGameDef(L)->idef(); + const NodeDefManager *ndef = getGameDef(L)->ndef(); // If this is called at mod load time, NodeDefManager isn't aware of // aliases yet, so we need to handle them manually @@ -646,7 +699,7 @@ int ModApiItemMod::l_get_name_from_content_id(lua_State *L) NO_MAP_LOCK_REQUIRED; content_t c = luaL_checkint(L, 1); - const NodeDefManager *ndef = getGameDef(L)->getNodeDefManager(); + const NodeDefManager *ndef = getGameDef(L)->ndef(); const char *name = ndef->get(c).name.c_str(); lua_pushstring(L, name); @@ -661,3 +714,10 @@ void ModApiItemMod::Initialize(lua_State *L, int top) API_FCT(get_content_id); API_FCT(get_name_from_content_id); } + +void ModApiItemMod::InitializeAsync(lua_State *L, int top) +{ + // all read-only functions + API_FCT(get_content_id); + API_FCT(get_name_from_content_id); +} diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h index 98744c071..a392555d2 100644 --- a/src/script/lua_api/l_item.h +++ b/src/script/lua_api/l_item.h @@ -72,6 +72,9 @@ private: // get_description(self) static int l_get_description(lua_State *L); + // get_short_description(self) + static int l_get_short_description(lua_State *L); + // clear(self) -> true static int l_clear(lua_State *L); @@ -105,11 +108,20 @@ private: static int l_get_tool_capabilities(lua_State *L); // add_wear(self, amount) -> true/false - // The range for "amount" is [0,65535]. Wear is only added if the item + // The range for "amount" is [0,65536]. Wear is only added if the item // is a tool. Adding wear might destroy the item. // Returns true if the item is (or was) a tool. static int l_add_wear(lua_State *L); + // add_wear_by_uses(self, max_uses) -> true/false + // The range for "max_uses" is [0,65536]. + // Adds wear to the item in such a way that, if + // only this function is called to add wear, the item + // will be destroyed exactly after `max_uses` times of calling it. + // No-op if `max_uses` is 0 or item is not a tool. + // Returns true if the item is (or was) a tool. + static int l_add_wear_by_uses(lua_State *L); + // add_item(self, itemstack or itemstring or table or nil) -> itemstack // Returns leftover item stack static int l_add_item(lua_State *L); @@ -138,8 +150,11 @@ public: // Not callable from Lua static int create(lua_State *L, const ItemStack &item); static LuaItemStack* checkobject(lua_State *L, int narg); - static void Register(lua_State *L); + static void *packIn(lua_State *L, int idx); + static void packOut(lua_State *L, void *ptr); + + static void Register(lua_State *L); }; class ModApiItemMod : public ModApiBase { @@ -149,6 +164,8 @@ private: static int l_register_alias_raw(lua_State *L); static int l_get_content_id(lua_State *L); static int l_get_name_from_content_id(lua_State *L); + public: static void Initialize(lua_State *L, int top); + static void InitializeAsync(lua_State *L, int top); }; diff --git a/src/script/lua_api/l_itemstackmeta.cpp b/src/script/lua_api/l_itemstackmeta.cpp index d1ba1bda4..739fb9221 100644 --- a/src/script/lua_api/l_itemstackmeta.cpp +++ b/src/script/lua_api/l_itemstackmeta.cpp @@ -114,7 +114,7 @@ void ItemStackMetaRef::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable // Cannot be created from Lua diff --git a/src/script/lua_api/l_localplayer.cpp b/src/script/lua_api/l_localplayer.cpp index 33fa27c8b..1066beed1 100644 --- a/src/script/lua_api/l_localplayer.cpp +++ b/src/script/lua_api/l_localplayer.cpp @@ -128,11 +128,11 @@ int LuaLocalPlayer::l_is_in_liquid_stable(lua_State *L) return 1; } -int LuaLocalPlayer::l_get_liquid_viscosity(lua_State *L) +int LuaLocalPlayer::l_get_move_resistance(lua_State *L) { LocalPlayer *player = getobject(L, 1); - lua_pushinteger(L, player->liquid_viscosity); + lua_pushinteger(L, player->move_resistance); return 1; } @@ -157,23 +157,24 @@ int LuaLocalPlayer::l_get_physics_override(lua_State *L) { LocalPlayer *player = getobject(L, 1); + const auto &phys = player->physics_override; lua_newtable(L); - lua_pushnumber(L, player->physics_override_speed); + lua_pushnumber(L, phys.speed); lua_setfield(L, -2, "speed"); - lua_pushnumber(L, player->physics_override_jump); + lua_pushnumber(L, phys.jump); lua_setfield(L, -2, "jump"); - lua_pushnumber(L, player->physics_override_gravity); + lua_pushnumber(L, phys.gravity); lua_setfield(L, -2, "gravity"); - lua_pushboolean(L, player->physics_override_sneak); + lua_pushboolean(L, phys.sneak); lua_setfield(L, -2, "sneak"); - lua_pushboolean(L, player->physics_override_sneak_glitch); + lua_pushboolean(L, phys.sneak_glitch); lua_setfield(L, -2, "sneak_glitch"); - lua_pushboolean(L, player->physics_override_new_move); + lua_pushboolean(L, phys.new_move); lua_setfield(L, -2, "new_move"); return 1; @@ -223,16 +224,22 @@ int LuaLocalPlayer::l_get_control(lua_State *L) }; lua_createtable(L, 0, 12); - set("up", c.up); - set("down", c.down); - set("left", c.left); - set("right", c.right); - set("jump", c.jump); - set("aux1", c.aux1); + set("jump", c.jump); + set("aux1", c.aux1); set("sneak", c.sneak); - set("zoom", c.zoom); - set("dig", c.dig); + set("zoom", c.zoom); + set("dig", c.dig); set("place", c.place); + // Player movement in polar coordinates and non-binary speed + lua_pushnumber(L, c.movement_speed); + lua_setfield(L, -2, "movement_speed"); + lua_pushnumber(L, c.movement_direction); + lua_setfield(L, -2, "movement_direction"); + // Provide direction keys to ensure compatibility + set("up", c.direction_keys & (1 << 0)); + set("down", c.direction_keys & (1 << 1)); + set("left", c.direction_keys & (1 << 2)); + set("right", c.direction_keys & (1 << 3)); return 1; } @@ -369,10 +376,11 @@ int LuaLocalPlayer::l_hud_change(lua_State *L) if (!element) return 0; + HudElementStat stat; void *unused; - read_hud_change(L, element, &unused); + bool ok = read_hud_change(L, stat, element, &unused); - lua_pushboolean(L, true); + lua_pushboolean(L, ok); return 1; } @@ -446,7 +454,7 @@ void LuaLocalPlayer::Register(lua_State *L) lua_pop(L, 1); // Drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // Drop methodtable } @@ -461,7 +469,6 @@ const luaL_Reg LuaLocalPlayer::methods[] = { luamethod(LuaLocalPlayer, is_touching_ground), luamethod(LuaLocalPlayer, is_in_liquid), luamethod(LuaLocalPlayer, is_in_liquid_stable), - luamethod(LuaLocalPlayer, get_liquid_viscosity), luamethod(LuaLocalPlayer, is_climbing), luamethod(LuaLocalPlayer, swimming_vertical), luamethod(LuaLocalPlayer, get_physics_override), @@ -483,5 +490,7 @@ const luaL_Reg LuaLocalPlayer::methods[] = { luamethod(LuaLocalPlayer, hud_change), luamethod(LuaLocalPlayer, hud_get), + luamethod(LuaLocalPlayer, get_move_resistance), + {0, 0} }; diff --git a/src/script/lua_api/l_localplayer.h b/src/script/lua_api/l_localplayer.h index 4413f2bdb..041545a49 100644 --- a/src/script/lua_api/l_localplayer.h +++ b/src/script/lua_api/l_localplayer.h @@ -51,7 +51,6 @@ private: static int l_is_touching_ground(lua_State *L); static int l_is_in_liquid(lua_State *L); static int l_is_in_liquid_stable(lua_State *L); - static int l_get_liquid_viscosity(lua_State *L); static int l_is_climbing(lua_State *L); static int l_swimming_vertical(lua_State *L); @@ -96,6 +95,8 @@ private: // hud_get(self, id) static int l_hud_get(lua_State *L); + static int l_get_move_resistance(lua_State *L); + LocalPlayer *m_localplayer = nullptr; public: diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp index e49ec4052..cf4a057e1 100644 --- a/src/script/lua_api/l_mainmenu.cpp +++ b/src/script/lua_api/l_mainmenu.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_internal.h" #include "common/c_content.h" #include "cpp_api/s_async.h" +#include "scripting_mainmenu.h" #include "gui/guiEngine.h" #include "gui/guiMainMenu.h" #include "gui/guiKeyChangeMenu.h" @@ -29,18 +30,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" #include "filesys.h" #include "convert_json.h" -#include "content/packages.h" #include "content/content.h" #include "content/subgames.h" #include "serverlist.h" #include "mapgen/mapgen.h" #include "settings.h" - -#include <IFileArchive.h> -#include <IFileSystem.h> +#include "client/client.h" #include "client/renderingengine.h" #include "network/networkprotocol.h" - +#include "content/mod_configuration.h" /******************************************************************************/ std::string ModApiMainMenu::getTextData(lua_State *L, std::string name) @@ -141,6 +139,14 @@ int ModApiMainMenu::l_start(lua_State *L) data->password = getTextData(L,"password"); data->address = getTextData(L,"address"); data->port = getTextData(L,"port"); + + const auto val = getTextData(L, "allow_login_or_register"); + if (val == "login") + data->allow_login_or_register = ELoginRegister::Login; + else if (val == "register") + data->allow_login_or_register = ELoginRegister::Register; + else + data->allow_login_or_register = ELoginRegister::Any; } data->serverdescription = getTextData(L,"serverdescription"); data->servername = getTextData(L,"servername"); @@ -275,207 +281,6 @@ int ModApiMainMenu::l_get_worlds(lua_State *L) return 1; } -/******************************************************************************/ -int ModApiMainMenu::l_get_favorites(lua_State *L) -{ - std::string listtype = "local"; - - if (!lua_isnone(L, 1)) { - listtype = luaL_checkstring(L, 1); - } - - std::vector<ServerListSpec> servers; - - if(listtype == "online") { - servers = ServerList::getOnline(); - } else { - servers = ServerList::getLocal(); - } - - lua_newtable(L); - int top = lua_gettop(L); - unsigned int index = 1; - - for (const Json::Value &server : servers) { - - lua_pushnumber(L, index); - - lua_newtable(L); - int top_lvl2 = lua_gettop(L); - - if (!server["clients"].asString().empty()) { - std::string clients_raw = server["clients"].asString(); - char* endptr = 0; - int numbervalue = strtol(clients_raw.c_str(), &endptr,10); - - if ((!clients_raw.empty()) && (*endptr == 0)) { - lua_pushstring(L, "clients"); - lua_pushnumber(L, numbervalue); - lua_settable(L, top_lvl2); - } - } - - if (!server["clients_max"].asString().empty()) { - - std::string clients_max_raw = server["clients_max"].asString(); - char* endptr = 0; - int numbervalue = strtol(clients_max_raw.c_str(), &endptr,10); - - if ((!clients_max_raw.empty()) && (*endptr == 0)) { - lua_pushstring(L, "clients_max"); - lua_pushnumber(L, numbervalue); - lua_settable(L, top_lvl2); - } - } - - if (!server["version"].asString().empty()) { - lua_pushstring(L, "version"); - std::string topush = server["version"].asString(); - lua_pushstring(L, topush.c_str()); - lua_settable(L, top_lvl2); - } - - if (!server["proto_min"].asString().empty()) { - lua_pushstring(L, "proto_min"); - lua_pushinteger(L, server["proto_min"].asInt()); - lua_settable(L, top_lvl2); - } - - if (!server["proto_max"].asString().empty()) { - lua_pushstring(L, "proto_max"); - lua_pushinteger(L, server["proto_max"].asInt()); - lua_settable(L, top_lvl2); - } - - if (!server["password"].asString().empty()) { - lua_pushstring(L, "password"); - lua_pushboolean(L, server["password"].asBool()); - lua_settable(L, top_lvl2); - } - - if (!server["creative"].asString().empty()) { - lua_pushstring(L, "creative"); - lua_pushboolean(L, server["creative"].asBool()); - lua_settable(L, top_lvl2); - } - - if (!server["damage"].asString().empty()) { - lua_pushstring(L, "damage"); - lua_pushboolean(L, server["damage"].asBool()); - lua_settable(L, top_lvl2); - } - - if (!server["pvp"].asString().empty()) { - lua_pushstring(L, "pvp"); - lua_pushboolean(L, server["pvp"].asBool()); - lua_settable(L, top_lvl2); - } - - if (!server["description"].asString().empty()) { - lua_pushstring(L, "description"); - std::string topush = server["description"].asString(); - lua_pushstring(L, topush.c_str()); - lua_settable(L, top_lvl2); - } - - if (!server["name"].asString().empty()) { - lua_pushstring(L, "name"); - std::string topush = server["name"].asString(); - lua_pushstring(L, topush.c_str()); - lua_settable(L, top_lvl2); - } - - if (!server["address"].asString().empty()) { - lua_pushstring(L, "address"); - std::string topush = server["address"].asString(); - lua_pushstring(L, topush.c_str()); - lua_settable(L, top_lvl2); - } - - if (!server["port"].asString().empty()) { - lua_pushstring(L, "port"); - std::string topush = server["port"].asString(); - lua_pushstring(L, topush.c_str()); - lua_settable(L, top_lvl2); - } - - if (server.isMember("ping")) { - float ping = server["ping"].asFloat(); - lua_pushstring(L, "ping"); - lua_pushnumber(L, ping); - lua_settable(L, top_lvl2); - } - - if (server["clients_list"].isArray()) { - unsigned int index_lvl2 = 1; - lua_pushstring(L, "clients_list"); - lua_newtable(L); - int top_lvl3 = lua_gettop(L); - for (const Json::Value &client : server["clients_list"]) { - lua_pushnumber(L, index_lvl2); - std::string topush = client.asString(); - lua_pushstring(L, topush.c_str()); - lua_settable(L, top_lvl3); - index_lvl2++; - } - lua_settable(L, top_lvl2); - } - - if (server["mods"].isArray()) { - unsigned int index_lvl2 = 1; - lua_pushstring(L, "mods"); - lua_newtable(L); - int top_lvl3 = lua_gettop(L); - for (const Json::Value &mod : server["mods"]) { - - lua_pushnumber(L, index_lvl2); - std::string topush = mod.asString(); - lua_pushstring(L, topush.c_str()); - lua_settable(L, top_lvl3); - index_lvl2++; - } - lua_settable(L, top_lvl2); - } - - lua_settable(L, top); - index++; - } - return 1; -} - -/******************************************************************************/ -int ModApiMainMenu::l_delete_favorite(lua_State *L) -{ - std::vector<ServerListSpec> servers; - - std::string listtype = "local"; - - if (!lua_isnone(L,2)) { - listtype = luaL_checkstring(L,2); - } - - if ((listtype != "local") && - (listtype != "online")) - return 0; - - - if(listtype == "online") { - servers = ServerList::getOnline(); - } else { - servers = ServerList::getLocal(); - } - - int fav_idx = luaL_checkinteger(L,1) -1; - - if ((fav_idx >= 0) && - (fav_idx < (int) servers.size())) { - - ServerList::deleteEntry(servers[fav_idx]); - } - - return 0; -} - /******************************************************************************/ int ModApiMainMenu::l_get_games(lua_State *L) { @@ -507,7 +312,11 @@ int ModApiMainMenu::l_get_games(lua_State *L) lua_settable(L, top_lvl2); lua_pushstring(L, "name"); - lua_pushstring(L, game.name.c_str()); + lua_pushstring(L, game.title.c_str()); + lua_settable(L, top_lvl2); + + lua_pushstring(L, "title"); + lua_pushstring(L, game.title.c_str()); lua_settable(L, top_lvl2); lua_pushstring(L, "author"); @@ -526,9 +335,9 @@ int ModApiMainMenu::l_get_games(lua_State *L) lua_newtable(L); int table2 = lua_gettop(L); int internal_index = 1; - for (const std::string &addon_mods_path : game.addon_mods_paths) { + for (const auto &addon_mods_path : game.addon_mods_paths) { lua_pushnumber(L, internal_index); - lua_pushstring(L, addon_mods_path.c_str()); + lua_pushstring(L, addon_mods_path.second.c_str()); lua_settable(L, table2); internal_index++; } @@ -559,6 +368,11 @@ int ModApiMainMenu::l_get_content_info(lua_State *L) lua_pushstring(L, spec.author.c_str()); lua_setfield(L, -2, "author"); + if (!spec.title.empty()) { + lua_pushstring(L, spec.title.c_str()); + lua_setfield(L, -2, "title"); + } + lua_pushinteger(L, spec.release); lua_setfield(L, -2, "release"); @@ -595,13 +409,108 @@ int ModApiMainMenu::l_get_content_info(lua_State *L) return 1; } +/******************************************************************************/ +int ModApiMainMenu::l_check_mod_configuration(lua_State *L) +{ + std::string worldpath = luaL_checkstring(L, 1); + + ModConfiguration modmgr; + + // Add all game mods + SubgameSpec gamespec = findWorldSubgame(worldpath); + modmgr.addGameMods(gamespec); + modmgr.addModsInPath(worldpath + DIR_DELIM + "worldmods", "worldmods"); + + // Add user-configured mods + std::vector<ModSpec> modSpecs; + + luaL_checktype(L, 2, LUA_TTABLE); + + lua_pushnil(L); + while (lua_next(L, 2)) { + // Ignore non-string keys + if (lua_type(L, -2) != LUA_TSTRING) { + throw LuaError( + "Unexpected non-string key in table passed to " + "core.check_mod_configuration"); + } + + std::string modpath = luaL_checkstring(L, -1); + lua_pop(L, 1); + std::string virtual_path = lua_tostring(L, -1); + + modSpecs.emplace_back(); + ModSpec &spec = modSpecs.back(); + spec.name = fs::GetFilenameFromPath(modpath.c_str()); + spec.path = modpath; + spec.virtual_path = virtual_path; + if (!parseModContents(spec)) { + throw LuaError("Not a mod!"); + } + } + + modmgr.addMods(modSpecs); + try { + modmgr.checkConflictsAndDeps(); + } catch (const ModError &err) { + errorstream << err.what() << std::endl; + + lua_newtable(L); + + lua_pushboolean(L, false); + lua_setfield(L, -2, "is_consistent"); + + lua_newtable(L); + lua_setfield(L, -2, "unsatisfied_mods"); + + lua_newtable(L); + lua_setfield(L, -2, "satisfied_mods"); + + lua_pushstring(L, err.what()); + lua_setfield(L, -2, "error_message"); + return 1; + } + + + lua_newtable(L); + + lua_pushboolean(L, modmgr.isConsistent()); + lua_setfield(L, -2, "is_consistent"); + + lua_newtable(L); + int top = lua_gettop(L); + unsigned int index = 1; + for (const auto &spec : modmgr.getUnsatisfiedMods()) { + lua_pushnumber(L, index); + push_mod_spec(L, spec, true); + lua_settable(L, top); + index++; + } + + lua_setfield(L, -2, "unsatisfied_mods"); + + lua_newtable(L); + top = lua_gettop(L); + index = 1; + for (const auto &spec : modmgr.getMods()) { + lua_pushnumber(L, index); + push_mod_spec(L, spec, false); + lua_settable(L, top); + index++; + } + lua_setfield(L, -2, "satisfied_mods"); + + return 1; +} + /******************************************************************************/ int ModApiMainMenu::l_show_keys_menu(lua_State *L) { GUIEngine* engine = getGuiEngine(L); sanity_check(engine != NULL); - GUIKeyChangeMenu *kmenu = new GUIKeyChangeMenu(RenderingEngine::get_gui_env(), + GUIKeyChangeMenu *kmenu = new GUIKeyChangeMenu( + engine->m_rendering_engine->get_gui_env(), engine->m_parent, -1, engine->m_menumanager, @@ -616,25 +525,53 @@ int ModApiMainMenu::l_create_world(lua_State *L) const char *name = luaL_checkstring(L, 1); int gameidx = luaL_checkinteger(L,2) -1; + StringMap use_settings; + luaL_checktype(L, 3, LUA_TTABLE); + lua_pushnil(L); + while (lua_next(L, 3) != 0) { + // key at index -2 and value at index -1 + use_settings[luaL_checkstring(L, -2)] = luaL_checkstring(L, -1); + lua_pop(L, 1); + } + lua_pop(L, 1); + std::string path = porting::path_user + DIR_DELIM "worlds" + DIR_DELIM + sanitizeDirName(name, "world_"); std::vector<SubgameSpec> games = getAvailableGames(); - - if ((gameidx >= 0) && - (gameidx < (int) games.size())) { - - // Create world if it doesn't exist - try { - loadGameConfAndInitWorld(path, name, games[gameidx], true); - lua_pushnil(L); - } catch (const BaseException &e) { - lua_pushstring(L, (std::string("Failed to initialize world: ") + e.what()).c_str()); - } - } else { + if (gameidx < 0 || gameidx >= (int) games.size()) { lua_pushstring(L, "Invalid game index"); + return 1; } + + // Set the settings for world creation + // this is a bad hack but the best we have right now.. + StringMap backup; + for (auto it : use_settings) { + if (g_settings->existsLocal(it.first)) + backup[it.first] = g_settings->get(it.first); + g_settings->set(it.first, it.second); + } + + // Create world if it doesn't exist + try { + loadGameConfAndInitWorld(path, name, games[gameidx], true); + lua_pushnil(L); + } catch (const BaseException &e) { + auto err = std::string("Failed to initialize world: ") + e.what(); + lua_pushstring(L, err.c_str()); + } + + // Restore previous settings + for (auto it : use_settings) { + auto it2 = backup.find(it.first); + if (it2 == backup.end()) + g_settings->remove(it.first); // wasn't set before + else + g_settings->set(it.first, it2->second); // was set before + } + return 1; } @@ -687,6 +624,14 @@ int ModApiMainMenu::l_get_mapgen_names(lua_State *L) } +/******************************************************************************/ +int ModApiMainMenu::l_get_user_path(lua_State *L) +{ + std::string path = fs::RemoveRelativePathComponents(porting::path_user); + lua_pushstring(L, path.c_str()); + return 1; +} + /******************************************************************************/ int ModApiMainMenu::l_get_modpath(lua_State *L) { @@ -696,6 +641,21 @@ int ModApiMainMenu::l_get_modpath(lua_State *L) return 1; } +/******************************************************************************/ +int ModApiMainMenu::l_get_modpaths(lua_State *L) +{ + lua_newtable(L); + + ModApiMainMenu::l_get_modpath(L); + lua_setfield(L, -2, "mods"); + + for (const std::string &component : getEnvModPaths()) { + lua_pushstring(L, component.c_str()); + lua_setfield(L, -2, fs::AbsolutePath(component).c_str()); + } + return 1; +} + /******************************************************************************/ int ModApiMainMenu::l_get_clientmodpath(lua_State *L) { @@ -723,6 +683,7 @@ int ModApiMainMenu::l_get_texturepath(lua_State *L) return 1; } +/******************************************************************************/ int ModApiMainMenu::l_get_texturepath_share(lua_State *L) { std::string gamepath = fs::RemoveRelativePathComponents( @@ -731,12 +692,23 @@ int ModApiMainMenu::l_get_texturepath_share(lua_State *L) return 1; } +/******************************************************************************/ int ModApiMainMenu::l_get_cache_path(lua_State *L) { lua_pushstring(L, fs::RemoveRelativePathComponents(porting::path_cache).c_str()); return 1; } +/******************************************************************************/ +int ModApiMainMenu::l_get_temp_path(lua_State *L) +{ + if (lua_isnoneornil(L, 1) || !lua_toboolean(L, 1)) + lua_pushstring(L, fs::TempPath().c_str()); + else + lua_pushstring(L, fs::CreateTempFile().c_str()); + return 1; +} + /******************************************************************************/ int ModApiMainMenu::l_create_dir(lua_State *L) { const char *path = luaL_checkstring(L, 1); @@ -773,26 +745,33 @@ int ModApiMainMenu::l_copy_dir(lua_State *L) const char *destination = luaL_checkstring(L, 2); bool keep_source = true; + if (!lua_isnoneornil(L, 3)) + keep_source = readParam<bool>(L, 3); - if ((!lua_isnone(L,3)) && - (!lua_isnil(L,3))) { - keep_source = readParam<bool>(L,3); - } + std::string abs_destination = fs::RemoveRelativePathComponents(destination); + std::string abs_source = fs::RemoveRelativePathComponents(source); - std::string absolute_destination = fs::RemoveRelativePathComponents(destination); - std::string absolute_source = fs::RemoveRelativePathComponents(source); - - if ((ModApiMainMenu::mayModifyPath(absolute_destination))) { - bool retval = fs::CopyDir(absolute_source,absolute_destination); - - if (retval && (!keep_source)) { - - retval &= fs::RecursiveDelete(absolute_source); - } - lua_pushboolean(L,retval); + if (!ModApiMainMenu::mayModifyPath(abs_destination) || + (!keep_source && !ModApiMainMenu::mayModifyPath(abs_source))) { + lua_pushboolean(L, false); return 1; } - lua_pushboolean(L,false); + + bool retval; + if (keep_source) + retval = fs::CopyDir(abs_source, abs_destination); + else + retval = fs::MoveDir(abs_source, abs_destination); + lua_pushboolean(L, retval); + return 1; +} + +/******************************************************************************/ +int ModApiMainMenu::l_is_dir(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + + lua_pushboolean(L, fs::IsDir(path)); return 1; } @@ -805,75 +784,9 @@ int ModApiMainMenu::l_extract_zip(lua_State *L) std::string absolute_destination = fs::RemoveRelativePathComponents(destination); if (ModApiMainMenu::mayModifyPath(absolute_destination)) { - fs::CreateAllDirs(absolute_destination); - - io::IFileSystem *fs = RenderingEngine::get_filesystem(); - - if (!fs->addFileArchive(zipfile, false, false, io::EFAT_ZIP)) { - lua_pushboolean(L,false); - return 1; - } - - sanity_check(fs->getFileArchiveCount() > 0); - - /**********************************************************************/ - /* WARNING this is not threadsafe!! */ - /**********************************************************************/ - io::IFileArchive* opened_zip = - fs->getFileArchive(fs->getFileArchiveCount()-1); - - const io::IFileList* files_in_zip = opened_zip->getFileList(); - - unsigned int number_of_files = files_in_zip->getFileCount(); - - for (unsigned int i=0; i < number_of_files; i++) { - std::string fullpath = destination; - fullpath += DIR_DELIM; - fullpath += files_in_zip->getFullFileName(i).c_str(); - std::string fullpath_dir = fs::RemoveLastPathComponent(fullpath); - - if (!files_in_zip->isDirectory(i)) { - if (!fs::PathExists(fullpath_dir) && !fs::CreateAllDirs(fullpath_dir)) { - fs->removeFileArchive(fs->getFileArchiveCount()-1); - lua_pushboolean(L,false); - return 1; - } - - io::IReadFile* toread = opened_zip->createAndOpenFile(i); - - FILE *targetfile = fopen(fullpath.c_str(),"wb"); - - if (targetfile == NULL) { - fs->removeFileArchive(fs->getFileArchiveCount()-1); - lua_pushboolean(L,false); - return 1; - } - - char read_buffer[1024]; - long total_read = 0; - - while (total_read < toread->getSize()) { - - unsigned int bytes_read = - toread->read(read_buffer,sizeof(read_buffer)); - if ((bytes_read == 0 ) || - (fwrite(read_buffer, 1, bytes_read, targetfile) != bytes_read)) - { - fclose(targetfile); - fs->removeFileArchive(fs->getFileArchiveCount()-1); - lua_pushboolean(L,false); - return 1; - } - total_read += bytes_read; - } - - fclose(targetfile); - } - - } - - fs->removeFileArchive(fs->getFileArchiveCount()-1); - lua_pushboolean(L,true); + auto fs = RenderingEngine::get_raw_device()->getFileSystem(); + bool ok = fs::extractZipFile(fs, zipfile, destination); + lua_pushboolean(L, ok); return 1; } @@ -892,21 +805,24 @@ int ModApiMainMenu::l_get_mainmenu_path(lua_State *L) } /******************************************************************************/ -bool ModApiMainMenu::mayModifyPath(const std::string &path) +bool ModApiMainMenu::mayModifyPath(std::string path) { + path = fs::RemoveRelativePathComponents(path); + if (fs::PathStartsWith(path, fs::TempPath())) return true; - if (fs::PathStartsWith(path, fs::RemoveRelativePathComponents(porting::path_user + DIR_DELIM "games"))) - return true; + std::string path_user = fs::RemoveRelativePathComponents(porting::path_user); - if (fs::PathStartsWith(path, fs::RemoveRelativePathComponents(porting::path_user + DIR_DELIM "mods"))) + if (fs::PathStartsWith(path, path_user + DIR_DELIM "client")) return true; - - if (fs::PathStartsWith(path, fs::RemoveRelativePathComponents(porting::path_user + DIR_DELIM "textures"))) + if (fs::PathStartsWith(path, path_user + DIR_DELIM "games")) return true; - - if (fs::PathStartsWith(path, fs::RemoveRelativePathComponents(porting::path_user + DIR_DELIM "worlds"))) + if (fs::PathStartsWith(path, path_user + DIR_DELIM "mods")) + return true; + if (fs::PathStartsWith(path, path_user + DIR_DELIM "textures")) + return true; + if (fs::PathStartsWith(path, path_user + DIR_DELIM "worlds")) return true; if (fs::PathStartsWith(path, fs::RemoveRelativePathComponents(porting::path_cache))) @@ -936,7 +852,7 @@ int ModApiMainMenu::l_show_path_select_dialog(lua_State *L) bool is_file_select = readParam<bool>(L, 3); GUIFileSelectMenu* fileOpenMenu = - new GUIFileSelectMenu(RenderingEngine::get_gui_env(), + new GUIFileSelectMenu(engine->m_rendering_engine->get_gui_env(), engine->m_parent, -1, engine->m_menumanager, @@ -977,13 +893,12 @@ int ModApiMainMenu::l_get_video_drivers(lua_State *L) lua_newtable(L); for (u32 i = 0; i != drivers.size(); i++) { - const char *name = RenderingEngine::getVideoDriverName(drivers[i]); - const char *fname = RenderingEngine::getVideoDriverFriendlyName(drivers[i]); + auto &info = RenderingEngine::getVideoDriverInfo(drivers[i]); lua_newtable(L); - lua_pushstring(L, name); + lua_pushstring(L, info.name.c_str()); lua_setfield(L, -2, "name"); - lua_pushstring(L, fname); + lua_pushstring(L, info.friendly_name.c_str()); lua_setfield(L, -2, "friendly_name"); lua_rawseti(L, -2, i + 1); @@ -992,33 +907,12 @@ int ModApiMainMenu::l_get_video_drivers(lua_State *L) return 1; } -/******************************************************************************/ -int ModApiMainMenu::l_get_video_modes(lua_State *L) -{ - std::vector<core::vector3d<u32> > videomodes - = RenderingEngine::getSupportedVideoModes(); - - lua_newtable(L); - for (u32 i = 0; i != videomodes.size(); i++) { - lua_newtable(L); - lua_pushnumber(L, videomodes[i].X); - lua_setfield(L, -2, "w"); - lua_pushnumber(L, videomodes[i].Y); - lua_setfield(L, -2, "h"); - lua_pushnumber(L, videomodes[i].Z); - lua_setfield(L, -2, "depth"); - - lua_rawseti(L, -2, i + 1); - } - - return 1; -} - /******************************************************************************/ int ModApiMainMenu::l_gettext(lua_State *L) { - std::string text = strgettext(std::string(luaL_checkstring(L, 1))); - lua_pushstring(L, text.c_str()); + const char *srctext = luaL_checkstring(L, 1); + const char *text = *srctext ? gettext(srctext) : ""; + lua_pushstring(L, text); return 1; } @@ -1032,15 +926,7 @@ int ModApiMainMenu::l_get_screen_info(lua_State *L) lua_pushnumber(L,RenderingEngine::getDisplayDensity()); lua_settable(L, top); - lua_pushstring(L,"display_width"); - lua_pushnumber(L,RenderingEngine::getDisplaySize().X); - lua_settable(L, top); - - lua_pushstring(L,"display_height"); - lua_pushnumber(L,RenderingEngine::getDisplaySize().Y); - lua_settable(L, top); - - const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize(); + const v2u32 &window_size = RenderingEngine::getWindowSize(); lua_pushstring(L,"window_width"); lua_pushnumber(L, window_size.X); lua_settable(L, top); @@ -1048,6 +934,10 @@ int ModApiMainMenu::l_get_screen_info(lua_State *L) lua_pushstring(L,"window_height"); lua_pushnumber(L, window_size.Y); lua_settable(L, top); + + lua_pushstring(L, "render_info"); + lua_pushstring(L, wide_to_utf8(RenderingEngine::get_video_driver()->getName()).c_str()); + lua_settable(L, top); return 1; } @@ -1068,27 +958,48 @@ int ModApiMainMenu::l_get_max_supp_proto(lua_State *L) int ModApiMainMenu::l_open_url(lua_State *L) { std::string url = luaL_checkstring(L, 1); - lua_pushboolean(L, porting::openURL(url)); + lua_pushboolean(L, porting::open_url(url)); + return 1; +} + +/******************************************************************************/ +int ModApiMainMenu::l_open_dir(lua_State *L) +{ + std::string path = luaL_checkstring(L, 1); + lua_pushboolean(L, porting::open_directory(path)); + return 1; +} + +/******************************************************************************/ +int ModApiMainMenu::l_share_file(lua_State *L) +{ +#ifdef __ANDROID__ + std::string path = luaL_checkstring(L, 1); + porting::shareFileAndroid(path); + lua_pushboolean(L, true); +#else + lua_pushboolean(L, false); +#endif return 1; } /******************************************************************************/ int ModApiMainMenu::l_do_async_callback(lua_State *L) { - GUIEngine* engine = getGuiEngine(L); + MainMenuScripting *script = getScriptApi<MainMenuScripting>(L); size_t func_length, param_length; const char* serialized_func_raw = luaL_checklstring(L, 1, &func_length); - const char* serialized_param_raw = luaL_checklstring(L, 2, ¶m_length); sanity_check(serialized_func_raw != NULL); sanity_check(serialized_param_raw != NULL); - std::string serialized_func = std::string(serialized_func_raw, func_length); - std::string serialized_param = std::string(serialized_param_raw, param_length); + u32 jobId = script->queueAsync( + std::string(serialized_func_raw, func_length), + std::string(serialized_param_raw, param_length)); - lua_pushinteger(L, engine->queueAsync(serialized_func, serialized_param)); + lua_pushinteger(L, jobId); return 1; } @@ -1104,25 +1015,28 @@ void ModApiMainMenu::Initialize(lua_State *L, int top) API_FCT(get_worlds); API_FCT(get_games); API_FCT(get_content_info); + API_FCT(check_mod_configuration); API_FCT(start); API_FCT(close); - API_FCT(get_favorites); API_FCT(show_keys_menu); API_FCT(create_world); API_FCT(delete_world); - API_FCT(delete_favorite); API_FCT(set_background); API_FCT(set_topleft_text); API_FCT(get_mapgen_names); + API_FCT(get_user_path); API_FCT(get_modpath); + API_FCT(get_modpaths); API_FCT(get_clientmodpath); API_FCT(get_gamepath); API_FCT(get_texturepath); API_FCT(get_texturepath_share); API_FCT(get_cache_path); + API_FCT(get_temp_path); API_FCT(create_dir); API_FCT(delete_dir); API_FCT(copy_dir); + API_FCT(is_dir); API_FCT(extract_zip); API_FCT(may_modify_path); API_FCT(get_mainmenu_path); @@ -1130,11 +1044,12 @@ void ModApiMainMenu::Initialize(lua_State *L, int top) API_FCT(download_file); API_FCT(gettext); API_FCT(get_video_drivers); - API_FCT(get_video_modes); API_FCT(get_screen_info); API_FCT(get_min_supp_proto); API_FCT(get_max_supp_proto); API_FCT(open_url); + API_FCT(open_dir); + API_FCT(share_file); API_FCT(do_async_callback); } @@ -1143,19 +1058,24 @@ void ModApiMainMenu::InitializeAsync(lua_State *L, int top) { API_FCT(get_worlds); API_FCT(get_games); - API_FCT(get_favorites); API_FCT(get_mapgen_names); + API_FCT(get_user_path); API_FCT(get_modpath); + API_FCT(get_modpaths); API_FCT(get_clientmodpath); API_FCT(get_gamepath); API_FCT(get_texturepath); API_FCT(get_texturepath_share); API_FCT(get_cache_path); + API_FCT(get_temp_path); API_FCT(create_dir); API_FCT(delete_dir); API_FCT(copy_dir); - //API_FCT(extract_zip); //TODO remove dependency to GuiEngine + API_FCT(is_dir); + API_FCT(extract_zip); API_FCT(may_modify_path); API_FCT(download_file); - //API_FCT(gettext); (gettext lib isn't threadsafe) + API_FCT(get_min_supp_proto); + API_FCT(get_max_supp_proto); + API_FCT(gettext); } diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h index 5a16b3bfe..9dc40c7f4 100644 --- a/src/script/lua_api/l_mainmenu.h +++ b/src/script/lua_api/l_mainmenu.h @@ -58,7 +58,7 @@ private: * @param path path to check * @return true if the path may be modified */ - static bool mayModifyPath(const std::string &path); + static bool mayModifyPath(std::string path); //api calls @@ -74,10 +74,6 @@ private: static int l_get_mapgen_names(lua_State *L); - static int l_get_favorites(lua_State *L); - - static int l_delete_favorite(lua_State *L); - static int l_gettext(lua_State *L); //packages @@ -86,6 +82,8 @@ private: static int l_get_content_info(lua_State *L); + static int l_check_mod_configuration(lua_State *L); + //gui static int l_show_keys_menu(lua_State *L); @@ -112,8 +110,12 @@ private: static int l_get_mainmenu_path(lua_State *L); + static int l_get_user_path(lua_State *L); + static int l_get_modpath(lua_State *L); + static int l_get_modpaths(lua_State *L); + static int l_get_clientmodpath(lua_State *L); static int l_get_gamepath(lua_State *L); @@ -124,12 +126,16 @@ private: static int l_get_cache_path(lua_State *L); + static int l_get_temp_path(lua_State *L); + static int l_create_dir(lua_State *L); static int l_delete_dir(lua_State *L); static int l_copy_dir(lua_State *L); + static int l_is_dir(lua_State *L); + static int l_extract_zip(lua_State *L); static int l_may_modify_path(lua_State *L); @@ -138,8 +144,6 @@ private: static int l_get_video_drivers(lua_State *L); - static int l_get_video_modes(lua_State *L); - //version compatibility static int l_get_min_supp_proto(lua_State *L); @@ -148,6 +152,10 @@ private: // other static int l_open_url(lua_State *L); + static int l_open_dir(lua_State *L); + + static int l_share_file(lua_State *L); + // async static int l_do_async_callback(lua_State *L); diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp index 834938e56..f173bd162 100644 --- a/src/script/lua_api/l_mapgen.cpp +++ b/src/script/lua_api/l_mapgen.cpp @@ -482,9 +482,7 @@ int ModApiMapgen::l_get_biome_id(lua_State *L) { NO_MAP_LOCK_REQUIRED; - const char *biome_str = lua_tostring(L, 1); - if (!biome_str) - return 0; + const char *biome_str = luaL_checkstring(L, 1); const BiomeManager *bmgr = getServer(L)->getEmergeManager()->getBiomeManager(); if (!bmgr) @@ -527,30 +525,12 @@ int ModApiMapgen::l_get_heat(lua_State *L) v3s16 pos = read_v3s16(L, 1); - NoiseParams np_heat; - NoiseParams np_heat_blend; + const BiomeGen *biomegen = getServer(L)->getEmergeManager()->getBiomeGen(); - MapSettingsManager *settingsmgr = - getServer(L)->getEmergeManager()->map_settings_mgr; - - if (!settingsmgr->getMapSettingNoiseParams("mg_biome_np_heat", - &np_heat) || - !settingsmgr->getMapSettingNoiseParams("mg_biome_np_heat_blend", - &np_heat_blend)) + if (!biomegen || biomegen->getType() != BIOMEGEN_ORIGINAL) return 0; - std::string value; - if (!settingsmgr->getMapSetting("seed", &value)) - return 0; - std::istringstream ss(value); - u64 seed; - ss >> seed; - - const BiomeManager *bmgr = getServer(L)->getEmergeManager()->getBiomeManager(); - if (!bmgr) - return 0; - - float heat = bmgr->getHeatAtPosOriginal(pos, np_heat, np_heat_blend, seed); + float heat = ((BiomeGenOriginal*) biomegen)->calcHeatAtPoint(pos); lua_pushnumber(L, heat); @@ -566,31 +546,12 @@ int ModApiMapgen::l_get_humidity(lua_State *L) v3s16 pos = read_v3s16(L, 1); - NoiseParams np_humidity; - NoiseParams np_humidity_blend; + const BiomeGen *biomegen = getServer(L)->getEmergeManager()->getBiomeGen(); - MapSettingsManager *settingsmgr = - getServer(L)->getEmergeManager()->map_settings_mgr; - - if (!settingsmgr->getMapSettingNoiseParams("mg_biome_np_humidity", - &np_humidity) || - !settingsmgr->getMapSettingNoiseParams("mg_biome_np_humidity_blend", - &np_humidity_blend)) + if (!biomegen || biomegen->getType() != BIOMEGEN_ORIGINAL) return 0; - std::string value; - if (!settingsmgr->getMapSetting("seed", &value)) - return 0; - std::istringstream ss(value); - u64 seed; - ss >> seed; - - const BiomeManager *bmgr = getServer(L)->getEmergeManager()->getBiomeManager(); - if (!bmgr) - return 0; - - float humidity = bmgr->getHumidityAtPosOriginal(pos, np_humidity, - np_humidity_blend, seed); + float humidity = ((BiomeGenOriginal*) biomegen)->calcHumidityAtPoint(pos); lua_pushnumber(L, humidity); @@ -606,45 +567,11 @@ int ModApiMapgen::l_get_biome_data(lua_State *L) v3s16 pos = read_v3s16(L, 1); - NoiseParams np_heat; - NoiseParams np_heat_blend; - NoiseParams np_humidity; - NoiseParams np_humidity_blend; - - MapSettingsManager *settingsmgr = - getServer(L)->getEmergeManager()->map_settings_mgr; - - if (!settingsmgr->getMapSettingNoiseParams("mg_biome_np_heat", - &np_heat) || - !settingsmgr->getMapSettingNoiseParams("mg_biome_np_heat_blend", - &np_heat_blend) || - !settingsmgr->getMapSettingNoiseParams("mg_biome_np_humidity", - &np_humidity) || - !settingsmgr->getMapSettingNoiseParams("mg_biome_np_humidity_blend", - &np_humidity_blend)) + const BiomeGen *biomegen = getServer(L)->getEmergeManager()->getBiomeGen(); + if (!biomegen) return 0; - std::string value; - if (!settingsmgr->getMapSetting("seed", &value)) - return 0; - std::istringstream ss(value); - u64 seed; - ss >> seed; - - const BiomeManager *bmgr = getServer(L)->getEmergeManager()->getBiomeManager(); - if (!bmgr) - return 0; - - float heat = bmgr->getHeatAtPosOriginal(pos, np_heat, np_heat_blend, seed); - if (!heat) - return 0; - - float humidity = bmgr->getHumidityAtPosOriginal(pos, np_humidity, - np_humidity_blend, seed); - if (!humidity) - return 0; - - const Biome *biome = bmgr->getBiomeFromNoiseOriginal(heat, humidity, pos); + const Biome *biome = biomegen->calcBiomeAtPoint(pos); if (!biome || biome->index == OBJDEF_INVALID_INDEX) return 0; @@ -653,11 +580,16 @@ int ModApiMapgen::l_get_biome_data(lua_State *L) lua_pushinteger(L, biome->index); lua_setfield(L, -2, "biome"); - lua_pushnumber(L, heat); - lua_setfield(L, -2, "heat"); + if (biomegen->getType() == BIOMEGEN_ORIGINAL) { + float heat = ((BiomeGenOriginal*) biomegen)->calcHeatAtPoint(pos); + float humidity = ((BiomeGenOriginal*) biomegen)->calcHumidityAtPoint(pos); - lua_pushnumber(L, humidity); - lua_setfield(L, -2, "humidity"); + lua_pushnumber(L, heat); + lua_setfield(L, -2, "heat"); + + lua_pushnumber(L, humidity); + lua_setfield(L, -2, "humidity"); + } return 1; } @@ -820,9 +752,7 @@ int ModApiMapgen::l_get_mapgen_params(lua_State *L) lua_setfield(L, -2, "mgname"); settingsmgr->getMapSetting("seed", &value); - std::istringstream ss(value); - u64 seed; - ss >> seed; + u64 seed = from_string<u64>(value); lua_pushinteger(L, seed); lua_setfield(L, -2, "seed"); @@ -873,9 +803,6 @@ int ModApiMapgen::l_set_mapgen_params(lua_State *L) if (lua_isnumber(L, -1)) settingsmgr->setMapSetting("chunksize", readParam<std::string>(L, -1), true); - warn_if_field_exists(L, 1, "flagmask", - "Obsolete: flags field now includes unset flags."); - lua_getfield(L, 1, "flags"); if (lua_isstring(L, -1)) settingsmgr->setMapSetting("mg_flags", readParam<std::string>(L, -1), true); @@ -985,7 +912,7 @@ int ModApiMapgen::l_set_noiseparams(lua_State *L) bool set_default = !lua_isboolean(L, 3) || readParam<bool>(L, 3); - g_settings->setNoiseParams(name, np, set_default); + Settings::getLayer(set_default ? SL_DEFAULTS : SL_GLOBAL)->setNoiseParams(name, np); return 0; } @@ -1338,11 +1265,9 @@ int ModApiMapgen::l_register_ore(lua_State *L) lua_getfield(L, index, "noise_params"); if (read_noiseparams(L, -1, &ore->np)) { ore->flags |= OREFLAG_USE_NOISE; - } else if (ore->NEEDS_NOISE) { - errorstream << "register_ore: specified ore type requires valid " - "'noise_params' parameter" << std::endl; - delete ore; - return 0; + } else if (ore->needs_noise) { + log_deprecated(L, + "register_ore: ore type requires 'noise_params' but it is not specified, falling back to defaults"); } lua_pop(L, 1); @@ -1498,9 +1423,12 @@ int ModApiMapgen::l_generate_ores(lua_State *L) NO_MAP_LOCK_REQUIRED; EmergeManager *emerge = getServer(L)->getEmergeManager(); + if (!emerge || !emerge->mgparams) + return 0; Mapgen mg; - mg.seed = emerge->mgparams->seed; + // Intentionally truncates to s32, see Mapgen::Mapgen() + mg.seed = (s32)emerge->mgparams->seed; mg.vm = LuaVoxelManip::checkobject(L, 1)->vm; mg.ndef = getServer(L)->getNodeDefManager(); @@ -1524,9 +1452,12 @@ int ModApiMapgen::l_generate_decorations(lua_State *L) NO_MAP_LOCK_REQUIRED; EmergeManager *emerge = getServer(L)->getEmergeManager(); + if (!emerge || !emerge->mgparams) + return 0; Mapgen mg; - mg.seed = emerge->mgparams->seed; + // Intentionally truncates to s32, see Mapgen::Mapgen() + mg.seed = (s32)emerge->mgparams->seed; mg.vm = LuaVoxelManip::checkobject(L, 1)->vm; mg.ndef = getServer(L)->getNodeDefManager(); @@ -1739,11 +1670,10 @@ int ModApiMapgen::l_serialize_schematic(lua_State *L) std::ostringstream os(std::ios_base::binary); switch (schem_format) { case SCHEM_FMT_MTS: - schem->serializeToMts(&os, schem->m_nodenames); + schem->serializeToMts(&os); break; case SCHEM_FMT_LUA: - schem->serializeToLua(&os, schem->m_nodenames, - use_comments, indent_spaces); + schem->serializeToLua(&os, use_comments, indent_spaces); break; default: return 0; diff --git a/src/script/lua_api/l_metadata.cpp b/src/script/lua_api/l_metadata.cpp index 21002e6a7..d00cb4daa 100644 --- a/src/script/lua_api/l_metadata.cpp +++ b/src/script/lua_api/l_metadata.cpp @@ -82,9 +82,10 @@ int MetaDataRef::l_get(lua_State *L) std::string str; if (meta->getStringToRef(name, str)) { lua_pushlstring(L, str.c_str(), str.size()); - return 1; + } else { + lua_pushnil(L); } - return 0; + return 1; } // get_string(self, name) diff --git a/src/script/lua_api/l_minimap.cpp b/src/script/lua_api/l_minimap.cpp index 5fba76eb8..a135e0bd5 100644 --- a/src/script/lua_api/l_minimap.cpp +++ b/src/script/lua_api/l_minimap.cpp @@ -89,7 +89,7 @@ int LuaMinimap::l_get_mode(lua_State *L) LuaMinimap *ref = checkobject(L, 1); Minimap *m = getobject(ref); - lua_pushinteger(L, m->getMinimapMode()); + lua_pushinteger(L, m->getModeIndex()); return 1; } @@ -98,13 +98,11 @@ int LuaMinimap::l_set_mode(lua_State *L) LuaMinimap *ref = checkobject(L, 1); Minimap *m = getobject(ref); - s32 mode = lua_tointeger(L, 2); - if (mode < MINIMAP_MODE_OFF || - mode >= MINIMAP_MODE_COUNT) { + u32 mode = lua_tointeger(L, 2); + if (mode >= m->getMaxModeIndex()) return 0; - } - m->setMinimapMode((MinimapMode) mode); + m->setModeIndex(mode); return 1; } @@ -140,8 +138,11 @@ int LuaMinimap::l_show(lua_State *L) LuaMinimap *ref = checkobject(L, 1); Minimap *m = getobject(ref); - if (m->getMinimapMode() == MINIMAP_MODE_OFF) - m->setMinimapMode(MINIMAP_MODE_SURFACEx1); + // This is not very adapted to new minimap mode management. Btw, tried + // to do something compatible. + + if (m->getModeIndex() == 0 && m->getMaxModeIndex() > 0) + m->setModeIndex(1); client->showMinimap(true); return 1; @@ -155,8 +156,11 @@ int LuaMinimap::l_hide(lua_State *L) LuaMinimap *ref = checkobject(L, 1); Minimap *m = getobject(ref); - if (m->getMinimapMode() != MINIMAP_MODE_OFF) - m->setMinimapMode(MINIMAP_MODE_OFF); + // This is not very adapted to new minimap mode management. Btw, tried + // to do something compatible. + + if (m->getModeIndex() != 0) + m->setModeIndex(0); client->showMinimap(false); return 1; @@ -207,7 +211,7 @@ void LuaMinimap::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable } diff --git a/src/script/lua_api/l_modchannels.cpp b/src/script/lua_api/l_modchannels.cpp index 0485b276a..931c2749c 100644 --- a/src/script/lua_api/l_modchannels.cpp +++ b/src/script/lua_api/l_modchannels.cpp @@ -107,7 +107,7 @@ void ModChannelRef::Register(lua_State *L) lua_pop(L, 1); // Drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // Drop methodtable } diff --git a/src/script/lua_api/l_nodemeta.cpp b/src/script/lua_api/l_nodemeta.cpp index 57052cb42..bdc4844c0 100644 --- a/src/script/lua_api/l_nodemeta.cpp +++ b/src/script/lua_api/l_nodemeta.cpp @@ -40,7 +40,7 @@ NodeMetaRef* NodeMetaRef::checkobject(lua_State *L, int narg) Metadata* NodeMetaRef::getmeta(bool auto_create) { if (m_is_local) - return m_meta; + return m_local_meta; NodeMetadata *meta = m_env->getMap().getNodeMetadata(m_p); if (meta == NULL && auto_create) { @@ -62,9 +62,14 @@ void NodeMetaRef::clearMeta() void NodeMetaRef::reportMetadataChange(const std::string *name) { SANITY_CHECK(!m_is_local); - // NOTE: This same code is in rollback_interface.cpp // Inform other things that the metadata has changed - NodeMetadata *meta = dynamic_cast<NodeMetadata*>(m_meta); + NodeMetadata *meta = dynamic_cast<NodeMetadata*>(getmeta(false)); + + // If the metadata is now empty, get rid of it + if (meta && meta->empty()) { + clearMeta(); + meta = nullptr; + } MapEditEvent event; event.type = MEET_BLOCK_NODE_METADATA_CHANGED; @@ -89,7 +94,10 @@ int NodeMetaRef::l_get_inventory(lua_State *L) NodeMetaRef *ref = checkobject(L, 1); ref->getmeta(true); // try to ensure the metadata exists - InvRef::createNodeMeta(L, ref->m_p); + + InventoryLocation loc; + loc.setNodeMeta(ref->m_p); + InvRef::create(L, loc); return 1; } @@ -124,18 +132,14 @@ void NodeMetaRef::handleToTable(lua_State *L, Metadata *_meta) // fields MetaDataRef::handleToTable(L, _meta); - NodeMetadata *meta = (NodeMetadata*) _meta; + NodeMetadata *meta = (NodeMetadata *) _meta; // inventory - lua_newtable(L); Inventory *inv = meta->getInventory(); if (inv) { - std::vector<const InventoryList *> lists = inv->getLists(); - for(std::vector<const InventoryList *>::const_iterator - i = lists.begin(); i != lists.end(); ++i) { - push_inventory_list(L, inv, (*i)->getName().c_str()); - lua_setfield(L, -2, (*i)->getName().c_str()); - } + push_inventory_lists(L, *inv); + } else { + lua_newtable(L); } lua_setfield(L, -2, "inventory"); } @@ -175,8 +179,8 @@ NodeMetaRef::NodeMetaRef(v3s16 p, ServerEnvironment *env): } NodeMetaRef::NodeMetaRef(Metadata *meta): - m_meta(meta), - m_is_local(true) + m_is_local(true), + m_local_meta(meta) { } @@ -234,7 +238,7 @@ void NodeMetaRef::RegisterCommon(lua_State *L) void NodeMetaRef::Register(lua_State *L) { RegisterCommon(L); - luaL_openlib(L, 0, methodsServer, 0); // fill methodtable + luaL_register(L, nullptr, methodsServer); // fill methodtable lua_pop(L, 1); // drop methodtable } @@ -260,7 +264,7 @@ const luaL_Reg NodeMetaRef::methodsServer[] = { void NodeMetaRef::RegisterClient(lua_State *L) { RegisterCommon(L); - luaL_openlib(L, 0, methodsClient, 0); // fill methodtable + luaL_register(L, nullptr, methodsClient); // fill methodtable lua_pop(L, 1); // drop methodtable } diff --git a/src/script/lua_api/l_nodemeta.h b/src/script/lua_api/l_nodemeta.h index fdc1766ed..265ece3d0 100644 --- a/src/script/lua_api/l_nodemeta.h +++ b/src/script/lua_api/l_nodemeta.h @@ -33,10 +33,12 @@ class NodeMetadata; class NodeMetaRef : public MetaDataRef { private: + bool m_is_local = false; + // Set for server metadata v3s16 m_p; ServerEnvironment *m_env = nullptr; - Metadata *m_meta = nullptr; - bool m_is_local = false; + // Set for client metadata + Metadata *m_local_meta = nullptr; static const char className[]; static const luaL_Reg methodsServer[]; diff --git a/src/script/lua_api/l_nodetimer.cpp b/src/script/lua_api/l_nodetimer.cpp index c2df52c05..8a302149f 100644 --- a/src/script/lua_api/l_nodetimer.cpp +++ b/src/script/lua_api/l_nodetimer.cpp @@ -122,7 +122,7 @@ void NodeTimerRef::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable // Cannot be created from Lua diff --git a/src/script/lua_api/l_noise.cpp b/src/script/lua_api/l_noise.cpp index 9aeb15709..5561eaebf 100644 --- a/src/script/lua_api/l_noise.cpp +++ b/src/script/lua_api/l_noise.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_internal.h" #include "common/c_converter.h" #include "common/c_content.h" +#include "common/c_packer.h" #include "log.h" #include "porting.h" #include "util/numeric.h" @@ -30,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., LuaPerlinNoise */ -LuaPerlinNoise::LuaPerlinNoise(NoiseParams *params) : +LuaPerlinNoise::LuaPerlinNoise(const NoiseParams *params) : np(*params) { } @@ -101,6 +102,25 @@ LuaPerlinNoise *LuaPerlinNoise::checkobject(lua_State *L, int narg) } +void *LuaPerlinNoise::packIn(lua_State *L, int idx) +{ + LuaPerlinNoise *o = checkobject(L, idx); + return new NoiseParams(o->np); +} + +void LuaPerlinNoise::packOut(lua_State *L, void *ptr) +{ + NoiseParams *np = reinterpret_cast<NoiseParams*>(ptr); + if (L) { + LuaPerlinNoise *o = new LuaPerlinNoise(np); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); + } + delete np; +} + + void LuaPerlinNoise::Register(lua_State *L) { lua_newtable(L); @@ -122,11 +142,12 @@ void LuaPerlinNoise::Register(lua_State *L) lua_pop(L, 1); - markAliasDeprecated(methods); - luaL_openlib(L, 0, methods, 0); + luaL_register(L, nullptr, methods); lua_pop(L, 1); lua_register(L, className, create_object); + + script_register_packer(L, className, packIn, packOut); } @@ -142,12 +163,10 @@ luaL_Reg LuaPerlinNoise::methods[] = { LuaPerlinNoiseMap */ -LuaPerlinNoiseMap::LuaPerlinNoiseMap(NoiseParams *params, s32 seed, v3s16 size) +LuaPerlinNoiseMap::LuaPerlinNoiseMap(const NoiseParams *np, s32 seed, v3s16 size) { - m_is3d = size.Z > 1; - np = *params; try { - noise = new Noise(&np, seed, size.X, size.Y, size.Z); + noise = new Noise(np, seed, size.X, size.Y, size.Z); } catch (InvalidNoiseParamsException &e) { throw LuaError(e.what()); } @@ -218,7 +237,7 @@ int LuaPerlinNoiseMap::l_get_3d_map(lua_State *L) LuaPerlinNoiseMap *o = checkobject(L, 1); v3f p = check_v3f(L, 2); - if (!o->m_is3d) + if (!o->is3D()) return 0; Noise *n = o->noise; @@ -249,7 +268,7 @@ int LuaPerlinNoiseMap::l_get_3d_map_flat(lua_State *L) v3f p = check_v3f(L, 2); bool use_buffer = lua_istable(L, 3); - if (!o->m_is3d) + if (!o->is3D()) return 0; Noise *n = o->noise; @@ -290,7 +309,7 @@ int LuaPerlinNoiseMap::l_calc_3d_map(lua_State *L) LuaPerlinNoiseMap *o = checkobject(L, 1); v3f p = check_v3f(L, 2); - if (!o->m_is3d) + if (!o->is3D()) return 0; Noise *n = o->noise; @@ -360,6 +379,35 @@ LuaPerlinNoiseMap *LuaPerlinNoiseMap::checkobject(lua_State *L, int narg) } +struct NoiseMapParams { + NoiseParams np; + s32 seed; + v3s16 size; +}; + +void *LuaPerlinNoiseMap::packIn(lua_State *L, int idx) +{ + LuaPerlinNoiseMap *o = checkobject(L, idx); + NoiseMapParams *ret = new NoiseMapParams(); + ret->np = o->noise->np; + ret->seed = o->noise->seed; + ret->size = v3s16(o->noise->sx, o->noise->sy, o->noise->sz); + return ret; +} + +void LuaPerlinNoiseMap::packOut(lua_State *L, void *ptr) +{ + NoiseMapParams *p = reinterpret_cast<NoiseMapParams*>(ptr); + if (L) { + LuaPerlinNoiseMap *o = new LuaPerlinNoiseMap(&p->np, p->seed, p->size); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); + } + delete p; +} + + void LuaPerlinNoiseMap::Register(lua_State *L) { lua_newtable(L); @@ -381,11 +429,12 @@ void LuaPerlinNoiseMap::Register(lua_State *L) lua_pop(L, 1); - markAliasDeprecated(methods); - luaL_openlib(L, 0, methods, 0); + luaL_register(L, nullptr, methods); lua_pop(L, 1); lua_register(L, className, create_object); + + script_register_packer(L, className, packIn, packOut); } @@ -487,7 +536,7 @@ void LuaPseudoRandom::Register(lua_State *L) lua_pop(L, 1); - luaL_openlib(L, 0, methods, 0); + luaL_register(L, nullptr, methods); lua_pop(L, 1); lua_register(L, className, create_object); @@ -586,7 +635,7 @@ void LuaPcgRandom::Register(lua_State *L) lua_pop(L, 1); - luaL_openlib(L, 0, methods, 0); + luaL_register(L, nullptr, methods); lua_pop(L, 1); lua_register(L, className, create_object); @@ -701,7 +750,7 @@ void LuaSecureRandom::Register(lua_State *L) lua_pop(L, 1); - luaL_openlib(L, 0, methods, 0); + luaL_register(L, nullptr, methods); lua_pop(L, 1); lua_register(L, className, create_object); diff --git a/src/script/lua_api/l_noise.h b/src/script/lua_api/l_noise.h index 9f50dfd3f..5d34a479b 100644 --- a/src/script/lua_api/l_noise.h +++ b/src/script/lua_api/l_noise.h @@ -30,6 +30,7 @@ class LuaPerlinNoise : public ModApiBase { private: NoiseParams np; + static const char className[]; static luaL_Reg methods[]; @@ -42,7 +43,7 @@ private: static int l_get_3d(lua_State *L); public: - LuaPerlinNoise(NoiseParams *params); + LuaPerlinNoise(const NoiseParams *params); ~LuaPerlinNoise() = default; // LuaPerlinNoise(seed, octaves, persistence, scale) @@ -51,6 +52,9 @@ public: static LuaPerlinNoise *checkobject(lua_State *L, int narg); + static void *packIn(lua_State *L, int idx); + static void packOut(lua_State *L, void *ptr); + static void Register(lua_State *L); }; @@ -59,9 +63,8 @@ public: */ class LuaPerlinNoiseMap : public ModApiBase { - NoiseParams np; Noise *noise; - bool m_is3d; + static const char className[]; static luaL_Reg methods[]; @@ -80,16 +83,20 @@ class LuaPerlinNoiseMap : public ModApiBase static int l_get_map_slice(lua_State *L); public: - LuaPerlinNoiseMap(NoiseParams *np, s32 seed, v3s16 size); - + LuaPerlinNoiseMap(const NoiseParams *np, s32 seed, v3s16 size); ~LuaPerlinNoiseMap(); + inline bool is3D() const { return noise->sz > 1; } + // LuaPerlinNoiseMap(np, size) // Creates an LuaPerlinNoiseMap and leaves it on top of stack static int create_object(lua_State *L); static LuaPerlinNoiseMap *checkobject(lua_State *L, int narg); + static void *packIn(lua_State *L, int idx); + static void packOut(lua_State *L, void *ptr); + static void Register(lua_State *L); }; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 24667e769..a9d4920de 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -44,43 +44,44 @@ ObjectRef* ObjectRef::checkobject(lua_State *L, int narg) { luaL_checktype(L, narg, LUA_TUSERDATA); void *ud = luaL_checkudata(L, narg, className); - if (!ud) luaL_typerror(L, narg, className); + if (ud == nullptr) + luaL_typerror(L, narg, className); return *(ObjectRef**)ud; // unbox pointer } ServerActiveObject* ObjectRef::getobject(ObjectRef *ref) { - ServerActiveObject *co = ref->m_object; - if (co && co->isGone()) - return NULL; - return co; + ServerActiveObject *sao = ref->m_object; + if (sao && sao->isGone()) + return nullptr; + return sao; } LuaEntitySAO* ObjectRef::getluaobject(ObjectRef *ref) { - ServerActiveObject *obj = getobject(ref); - if (obj == NULL) - return NULL; - if (obj->getType() != ACTIVEOBJECT_TYPE_LUAENTITY) - return NULL; - return (LuaEntitySAO*)obj; + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return nullptr; + if (sao->getType() != ACTIVEOBJECT_TYPE_LUAENTITY) + return nullptr; + return (LuaEntitySAO*)sao; } PlayerSAO* ObjectRef::getplayersao(ObjectRef *ref) { - ServerActiveObject *obj = getobject(ref); - if (obj == NULL) - return NULL; - if (obj->getType() != ACTIVEOBJECT_TYPE_PLAYER) - return NULL; - return (PlayerSAO*)obj; + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return nullptr; + if (sao->getType() != ACTIVEOBJECT_TYPE_PLAYER) + return nullptr; + return (PlayerSAO*)sao; } RemotePlayer *ObjectRef::getplayer(ObjectRef *ref) { PlayerSAO *playersao = getplayersao(ref); - if (playersao == NULL) - return NULL; + if (playersao == nullptr) + return nullptr; return playersao->getPlayer(); } @@ -88,9 +89,8 @@ RemotePlayer *ObjectRef::getplayer(ObjectRef *ref) // garbage collector int ObjectRef::gc_object(lua_State *L) { - ObjectRef *o = *(ObjectRef **)(lua_touserdata(L, 1)); - //infostream<<"ObjectRef::gc_object: o="<<o<<std::endl; - delete o; + ObjectRef *obj = *(ObjectRef **)(lua_touserdata(L, 1)); + delete obj; return 0; } @@ -100,29 +100,30 @@ int ObjectRef::l_remove(lua_State *L) GET_ENV_PTR; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) + if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) return 0; - co->clearChildAttachments(); - co->clearParentAttachment(); + sao->clearChildAttachments(); + sao->clearParentAttachment(); - verbosestream << "ObjectRef::l_remove(): id=" << co->getId() << std::endl; - co->m_pending_removal = true; + verbosestream << "ObjectRef::l_remove(): id=" << sao->getId() << std::endl; + sao->markForRemoval(); return 0; } // get_pos(self) -// returns: {x=num, y=num, z=num} int ObjectRef::l_get_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - push_v3f(L, co->getBasePosition() / BS); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + push_v3f(L, sao->getBasePosition() / BS); return 1; } @@ -131,28 +132,29 @@ int ObjectRef::l_set_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // pos + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + v3f pos = checkFloatPos(L, 2); - // Do it - co->setPos(pos); + + sao->setPos(pos); return 0; } -// move_to(self, pos, continuous=false) +// move_to(self, pos, continuous) int ObjectRef::l_move_to(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // pos + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + v3f pos = checkFloatPos(L, 2); - // continuous bool continuous = readParam<bool>(L, 3); - // Do it - co->moveTo(pos, continuous); + + sao->moveTo(pos, continuous); return 0; } @@ -162,78 +164,49 @@ int ObjectRef::l_punch(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); ObjectRef *puncher_ref = checkobject(L, 2); - ServerActiveObject *co = getobject(ref); + ServerActiveObject *sao = getobject(ref); ServerActiveObject *puncher = getobject(puncher_ref); - if (!co || !puncher) + if (sao == nullptr || puncher == nullptr) return 0; - v3f dir; - if (lua_type(L, 5) != LUA_TTABLE) - dir = co->getBasePosition() - puncher->getBasePosition(); - else - dir = read_v3f(L, 5); - float time_from_last_punch = 1000000; - if (lua_isnumber(L, 3)) - time_from_last_punch = lua_tonumber(L, 3); + + float time_from_last_punch = readParam<float>(L, 3, 1000000.0f); ToolCapabilities toolcap = read_tool_capabilities(L, 4); + v3f dir = readParam<v3f>(L, 5, sao->getBasePosition() - puncher->getBasePosition()); dir.normalize(); - u16 src_original_hp = co->getHP(); - u16 dst_origin_hp = puncher->getHP(); - - // Do it - u16 wear = co->punch(dir, &toolcap, puncher, time_from_last_punch); + u32 wear = sao->punch(dir, &toolcap, puncher, time_from_last_punch); lua_pushnumber(L, wear); - // If the punched is a player, and its HP changed - if (src_original_hp != co->getHP() && - co->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, - PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, puncher)); - } - - // If the puncher is a player, and its HP changed - if (dst_origin_hp != puncher->getHP() && - puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - getServer(L)->SendPlayerHPOrDie((PlayerSAO *)puncher, - PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, co)); - } return 1; } -// right_click(self, clicker); clicker = an another ObjectRef +// right_click(self, clicker) int ObjectRef::l_right_click(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); ObjectRef *ref2 = checkobject(L, 2); - ServerActiveObject *co = getobject(ref); - ServerActiveObject *co2 = getobject(ref2); - if (co == NULL) return 0; - if (co2 == NULL) return 0; - // Do it - co->rightClick(co2); + ServerActiveObject *sao = getobject(ref); + ServerActiveObject *sao2 = getobject(ref2); + if (sao == nullptr || sao2 == nullptr) + return 0; + + sao->rightClick(sao2); return 0; } -// set_hp(self, hp) -// hp = number of hitpoints (2 * number of hearts) -// returns: nil +// set_hp(self, hp, reason) int ObjectRef::l_set_hp(lua_State *L) { NO_MAP_LOCK_REQUIRED; - - // Get Object ObjectRef *ref = checkobject(L, 1); - luaL_checknumber(L, 2); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Get HP - int hp = lua_tonumber(L, 2); - - // Get Reason + int hp = readParam<float>(L, 2); PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP); + reason.from_mod = true; if (lua_istable(L, 3)) { lua_pushvalue(L, 3); @@ -248,35 +221,26 @@ int ObjectRef::l_set_hp(lua_State *L) reason.lua_reference = luaL_ref(L, LUA_REGISTRYINDEX); } - // Do it - co->setHP(hp, reason); - if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) - getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, reason); - + sao->setHP(hp, reason); if (reason.hasLuaReference()) luaL_unref(L, LUA_REGISTRYINDEX, reason.lua_reference); - - // Return return 0; } // get_hp(self) -// returns: number of hitpoints (2 * number of hearts) -// 0 if not applicable to this type of object int ObjectRef::l_get_hp(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) { + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) { // Default hp is 1 lua_pushnumber(L, 1); return 1; } - int hp = co->getHP(); - /*infostream<<"ObjectRef::l_get_hp(): id="<<co->getId() - <<" hp="<<hp<<std::endl;*/ - // Return + + int hp = sao->getHP(); + lua_pushnumber(L, hp); return 1; } @@ -286,11 +250,12 @@ int ObjectRef::l_get_inventory(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it - InventoryLocation loc = co->getInventoryLocation(); - if (getServerInventoryMgr(L)->getInventory(loc) != NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + InventoryLocation loc = sao->getInventoryLocation(); + if (getServerInventoryMgr(L)->getInventory(loc) != nullptr) InvRef::create(L, loc); else lua_pushnil(L); // An object may have no inventory (nil) @@ -302,11 +267,11 @@ int ObjectRef::l_get_wield_list(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (!co) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - lua_pushstring(L, co->getWieldList().c_str()); + lua_pushstring(L, sao->getWieldList().c_str()); return 1; } @@ -315,11 +280,11 @@ int ObjectRef::l_get_wield_index(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (!co) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - lua_pushinteger(L, co->getWieldIndex() + 1); + lua_pushinteger(L, sao->getWieldIndex() + 1); return 1; } @@ -328,31 +293,33 @@ int ObjectRef::l_get_wielded_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (!co) { + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) { // Empty ItemStack LuaItemStack::create(L, ItemStack()); return 1; } ItemStack selected_item; - co->getWieldedItem(&selected_item, nullptr); + sao->getWieldedItem(&selected_item, nullptr); LuaItemStack::create(L, selected_item); return 1; } -// set_wielded_item(self, itemstack or itemstring or table or nil) +// set_wielded_item(self, item) int ObjectRef::l_set_wielded_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + ItemStack item = read_item(L, 2, getServer(L)->idef()); - bool success = co->setWieldedItem(item); - if (success && co->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - getServer(L)->SendInventory((PlayerSAO *)co, true); + + bool success = sao->setWieldedItem(item); + if (success && sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + getServer(L)->SendInventory((PlayerSAO *)sao, true); } lua_pushboolean(L, success); return 1; @@ -363,12 +330,23 @@ int ObjectRef::l_set_armor_groups(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + ItemGroupList groups; + read_groups(L, 2, groups); - co->setArmorGroups(groups); + if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + if (!g_settings->getBool("enable_damage") && !itemgroup_get(groups, "immortal")) { + warningstream << "Mod tried to enable damage for a player, but it's " + "disabled globally. Ignoring." << std::endl; + infostream << script_get_backtrace(L) << std::endl; + groups["immortal"] = 1; + } + } + + sao->setArmorGroups(groups); return 0; } @@ -377,77 +355,11 @@ int ObjectRef::l_get_armor_groups(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it - push_groups(L, co->getArmorGroups()); - return 1; -} -// set_physics_override(self, physics_override_speed, physics_override_jump, -// physics_override_gravity, sneak, sneak_glitch, new_move) -int ObjectRef::l_set_physics_override(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - ObjectRef *ref = checkobject(L, 1); - PlayerSAO *co = (PlayerSAO *) getobject(ref); - if (co == NULL) return 0; - // Do it - if (lua_istable(L, 2)) { - co->m_physics_override_speed = getfloatfield_default( - L, 2, "speed", co->m_physics_override_speed); - co->m_physics_override_jump = getfloatfield_default( - L, 2, "jump", co->m_physics_override_jump); - co->m_physics_override_gravity = getfloatfield_default( - L, 2, "gravity", co->m_physics_override_gravity); - co->m_physics_override_sneak = getboolfield_default( - L, 2, "sneak", co->m_physics_override_sneak); - co->m_physics_override_sneak_glitch = getboolfield_default( - L, 2, "sneak_glitch", co->m_physics_override_sneak_glitch); - co->m_physics_override_new_move = getboolfield_default( - L, 2, "new_move", co->m_physics_override_new_move); - co->m_physics_override_sent = false; - } else { - // old, non-table format - if (!lua_isnil(L, 2)) { - co->m_physics_override_speed = lua_tonumber(L, 2); - co->m_physics_override_sent = false; - } - if (!lua_isnil(L, 3)) { - co->m_physics_override_jump = lua_tonumber(L, 3); - co->m_physics_override_sent = false; - } - if (!lua_isnil(L, 4)) { - co->m_physics_override_gravity = lua_tonumber(L, 4); - co->m_physics_override_sent = false; - } - } - return 0; -} - -// get_physics_override(self) -int ObjectRef::l_get_physics_override(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - ObjectRef *ref = checkobject(L, 1); - PlayerSAO *co = (PlayerSAO *)getobject(ref); - if (co == NULL) - return 0; - // Do it - lua_newtable(L); - lua_pushnumber(L, co->m_physics_override_speed); - lua_setfield(L, -2, "speed"); - lua_pushnumber(L, co->m_physics_override_jump); - lua_setfield(L, -2, "jump"); - lua_pushnumber(L, co->m_physics_override_gravity); - lua_setfield(L, -2, "gravity"); - lua_pushboolean(L, co->m_physics_override_sneak); - lua_setfield(L, -2, "sneak"); - lua_pushboolean(L, co->m_physics_override_sneak_glitch); - lua_setfield(L, -2, "sneak_glitch"); - lua_pushboolean(L, co->m_physics_override_new_move); - lua_setfield(L, -2, "new_move"); + push_groups(L, sao->getArmorGroups()); return 1; } @@ -456,22 +368,16 @@ int ObjectRef::l_set_animation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it - v2f frames = v2f(1, 1); - if (!lua_isnil(L, 2)) - frames = readParam<v2f>(L, 2); - float frame_speed = 15; - if (!lua_isnil(L, 3)) - frame_speed = lua_tonumber(L, 3); - float frame_blend = 0; - if (!lua_isnil(L, 4)) - frame_blend = lua_tonumber(L, 4); - bool frame_loop = true; - if (lua_isboolean(L, 5)) - frame_loop = readParam<bool>(L, 5); - co->setAnimation(frames, frame_speed, frame_blend, frame_loop); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + v2f frame_range = readParam<v2f>(L, 2, v2f(1, 1)); + float frame_speed = readParam<float>(L, 3, 15.0f); + float frame_blend = readParam<float>(L, 4, 0.0f); + bool frame_loop = readParam<bool>(L, 5, true); + + sao->setAnimation(frame_range, frame_speed, frame_blend, frame_loop); return 0; } @@ -480,16 +386,16 @@ int ObjectRef::l_get_animation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it - v2f frames = v2f(1,1); + + v2f frames = v2f(1, 1); float frame_speed = 15; float frame_blend = 0; bool frame_loop = true; - co->getAnimation(&frames, &frame_speed, &frame_blend, &frame_loop); + sao->getAnimation(&frames, &frame_speed, &frame_blend, &frame_loop); push_v2f(L, frames); lua_pushnumber(L, frame_speed); lua_pushnumber(L, frame_blend); @@ -497,27 +403,24 @@ int ObjectRef::l_get_animation(lua_State *L) return 4; } -// set_local_animation(self, {stand/idle}, {walk}, {dig}, {walk+dig}, frame_speed) +// set_local_animation(self, idle, walk, dig, walk_while_dig, frame_speed) int ObjectRef::l_set_local_animation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - // Do it + v2s32 frames[4]; for (int i=0;i<4;i++) { if (!lua_isnil(L, 2+1)) frames[i] = read_v2s32(L, 2+i); } - float frame_speed = 30; - if (!lua_isnil(L, 6)) - frame_speed = lua_tonumber(L, 6); + float frame_speed = readParam<float>(L, 6, 30.0f); getServer(L)->setLocalPlayerAnimations(player, frames, frame_speed); - lua_pushboolean(L, true); - return 1; + return 0; } // get_local_animation(self) @@ -526,7 +429,7 @@ int ObjectRef::l_get_local_animation(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; v2s32 frames[4]; @@ -541,32 +444,26 @@ int ObjectRef::l_get_local_animation(lua_State *L) return 5; } -// set_eye_offset(self, v3f first pv, v3f third pv) +// set_eye_offset(self, firstperson, thirdperson) int ObjectRef::l_set_eye_offset(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - // Do it - v3f offset_first = v3f(0, 0, 0); - v3f offset_third = v3f(0, 0, 0); - if (!lua_isnil(L, 2)) - offset_first = read_v3f(L, 2); - if (!lua_isnil(L, 3)) - offset_third = read_v3f(L, 3); + v3f offset_first = readParam<v3f>(L, 2, v3f(0, 0, 0)); + v3f offset_third = readParam<v3f>(L, 3, v3f(0, 0, 0)); // Prevent abuse of offset values (keep player always visible) offset_third.X = rangelim(offset_third.X,-10,10); offset_third.Z = rangelim(offset_third.Z,-5,5); - /* TODO: if possible: improve the camera colision detetion to allow Y <= -1.5) */ + /* TODO: if possible: improve the camera collision detection to allow Y <= -1.5) */ offset_third.Y = rangelim(offset_third.Y,-10,15); //1.5*BS getServer(L)->setPlayerEyeOffset(player, offset_first, offset_third); - lua_pushboolean(L, true); - return 1; + return 0; } // get_eye_offset(self) @@ -575,9 +472,9 @@ int ObjectRef::l_get_eye_offset(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - // Do it + push_v3f(L, player->eye_offset_first); push_v3f(L, player->eye_offset_third); return 2; @@ -588,14 +485,14 @@ int ObjectRef::l_send_mapblock(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; - v3s16 p = read_v3s16(L, 2); + + v3s16 pos = read_v3s16(L, 2); session_t peer_id = player->getPeerId(); - bool r = getServer(L)->SendBlock(peer_id, p); + bool r = getServer(L)->SendBlock(peer_id, pos); lua_pushboolean(L, r); return 1; @@ -606,14 +503,13 @@ int ObjectRef::l_set_animation_frame_speed(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it if (!lua_isnil(L, 2)) { - float frame_speed = lua_tonumber(L, 2); - co->setAnimationSpeed(frame_speed); + float frame_speed = readParam<float>(L, 2); + sao->setAnimationSpeed(frame_speed); lua_pushboolean(L, true); } else { lua_pushboolean(L, false); @@ -621,24 +517,20 @@ int ObjectRef::l_set_animation_frame_speed(lua_State *L) return 1; } -// set_bone_position(self, std::string bone, v3f position, v3f rotation) +// set_bone_position(self, bone, position, rotation) int ObjectRef::l_set_bone_position(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it - std::string bone; - if (!lua_isnil(L, 2)) - bone = readParam<std::string>(L, 2); - v3f position = v3f(0, 0, 0); - if (!lua_isnil(L, 3)) - position = check_v3f(L, 3); - v3f rotation = v3f(0, 0, 0); - if (!lua_isnil(L, 4)) - rotation = check_v3f(L, 4); - co->setBonePosition(bone, position, rotation); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + std::string bone = readParam<std::string>(L, 2, ""); + v3f position = readParam<v3f>(L, 3, v3f(0, 0, 0)); + v3f rotation = readParam<v3f>(L, 4, v3f(0, 0, 0)); + + sao->setBonePosition(bone, position, rotation); return 0; } @@ -647,63 +539,53 @@ int ObjectRef::l_get_bone_position(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it - std::string bone; - if (!lua_isnil(L, 2)) - bone = readParam<std::string>(L, 2); + + std::string bone = readParam<std::string>(L, 2, ""); v3f position = v3f(0, 0, 0); v3f rotation = v3f(0, 0, 0); - co->getBonePosition(bone, &position, &rotation); + sao->getBonePosition(bone, &position, &rotation); push_v3f(L, position); push_v3f(L, rotation); return 2; } -// set_attach(self, parent, bone, position, rotation) +// set_attach(self, parent, bone, position, rotation, force_visible) int ObjectRef::l_set_attach(lua_State *L) { GET_ENV_PTR; - ObjectRef *ref = checkobject(L, 1); ObjectRef *parent_ref = checkobject(L, 2); - ServerActiveObject *co = getobject(ref); + ServerActiveObject *sao = getobject(ref); ServerActiveObject *parent = getobject(parent_ref); - if (co == NULL) + if (sao == nullptr || parent == nullptr) return 0; - - if (parent == NULL) - return 0; - - if (co == parent) + if (sao == parent) throw LuaError("ObjectRef::set_attach: attaching object to itself is not allowed."); - // Do it - int parent_id = 0; + int parent_id; std::string bone; - v3f position = v3f(0, 0, 0); - v3f rotation = v3f(0, 0, 0); - co->getAttachment(&parent_id, &bone, &position, &rotation); + v3f position; + v3f rotation; + bool force_visible; + + sao->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); if (parent_id) { ServerActiveObject *old_parent = env->getActiveObject(parent_id); - old_parent->removeAttachmentChild(co->getId()); + old_parent->removeAttachmentChild(sao->getId()); } - bone = ""; - if (!lua_isnil(L, 3)) - bone = readParam<std::string>(L, 3); - position = v3f(0, 0, 0); - if (!lua_isnil(L, 4)) - position = read_v3f(L, 4); - rotation = v3f(0, 0, 0); - if (!lua_isnil(L, 5)) - rotation = read_v3f(L, 5); - co->setAttachment(parent->getId(), bone, position, rotation); - parent->addAttachmentChild(co->getId()); + bone = readParam<std::string>(L, 3, ""); + position = readParam<v3f>(L, 4, v3f(0, 0, 0)); + rotation = readParam<v3f>(L, 5, v3f(0, 0, 0)); + force_visible = readParam<bool>(L, 6, false); + + sao->setAttachment(parent->getId(), bone, position, rotation, force_visible); + parent->addAttachmentChild(sao->getId()); return 0; } @@ -711,40 +593,61 @@ int ObjectRef::l_set_attach(lua_State *L) int ObjectRef::l_get_attach(lua_State *L) { GET_ENV_PTR; - ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it - int parent_id = 0; + int parent_id; std::string bone; - v3f position = v3f(0, 0, 0); - v3f rotation = v3f(0, 0, 0); - co->getAttachment(&parent_id, &bone, &position, &rotation); - if (!parent_id) - return 0; - ServerActiveObject *parent = env->getActiveObject(parent_id); + v3f position; + v3f rotation; + bool force_visible; + sao->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); + if (parent_id == 0) + return 0; + + ServerActiveObject *parent = env->getActiveObject(parent_id); getScriptApiBase(L)->objectrefGetOrCreate(L, parent); lua_pushlstring(L, bone.c_str(), bone.size()); push_v3f(L, position); push_v3f(L, rotation); - return 4; + lua_pushboolean(L, force_visible); + return 5; +} + +// get_children(self) +int ObjectRef::l_get_children(lua_State *L) +{ + GET_ENV_PTR; + ObjectRef *ref = checkobject(L, 1); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + const std::unordered_set<int> child_ids = sao->getAttachmentChildIds(); + int i = 0; + + lua_createtable(L, child_ids.size(), 0); + for (const int id : child_ids) { + ServerActiveObject *child = env->getActiveObject(id); + getScriptApiBase(L)->objectrefGetOrCreate(L, child); + lua_rawseti(L, -2, ++i); + } + return 1; } // set_detach(self) int ObjectRef::l_set_detach(lua_State *L) { GET_ENV_PTR; - ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - co->clearParentAttachment(); + sao->clearParentAttachment(); return 0; } @@ -753,16 +656,17 @@ int ObjectRef::l_set_properties(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (!co) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - ObjectProperties *prop = co->accessObjectProperties(); - if (!prop) + ObjectProperties *prop = sao->accessObjectProperties(); + if (prop == nullptr) return 0; - read_object_properties(L, 2, co, prop, getServer(L)->idef()); - co->notifyObjectPropertiesModified(); + read_object_properties(L, 2, sao, prop, getServer(L)->idef()); + prop->validate(); + sao->notifyObjectPropertiesModified(); return 0; } @@ -771,12 +675,14 @@ int ObjectRef::l_get_properties(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - ObjectProperties *prop = co->accessObjectProperties(); - if (!prop) + + ObjectProperties *prop = sao->accessObjectProperties(); + if (prop == nullptr) return 0; + push_object_properties(L, prop); return 1; } @@ -787,7 +693,7 @@ int ObjectRef::l_is_player(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - lua_pushboolean(L, (player != NULL)); + lua_pushboolean(L, (player != nullptr)); return 1; } @@ -796,12 +702,12 @@ int ObjectRef::l_set_nametag_attributes(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - ObjectProperties *prop = co->accessObjectProperties(); - if (!prop) + + ObjectProperties *prop = sao->accessObjectProperties(); + if (prop == nullptr) return 0; lua_getfield(L, 2, "color"); @@ -812,12 +718,24 @@ int ObjectRef::l_set_nametag_attributes(lua_State *L) } lua_pop(L, 1); + lua_getfield(L, -1, "bgcolor"); + if (!lua_isnil(L, -1)) { + if (lua_toboolean(L, -1)) { + video::SColor color; + if (read_color(L, -1, &color)) + prop->nametag_bgcolor = color; + } else { + prop->nametag_bgcolor = nullopt; + } + } + lua_pop(L, 1); + std::string nametag = getstringfield_default(L, 2, "text", ""); prop->nametag = nametag; - co->notifyObjectPropertiesModified(); - lua_pushboolean(L, true); - return 1; + prop->validate(); + sao->notifyObjectPropertiesModified(); + return 0; } // get_nametag_attributes(self) @@ -825,50 +743,72 @@ int ObjectRef::l_get_nametag_attributes(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - ObjectProperties *prop = co->accessObjectProperties(); + + ObjectProperties *prop = sao->accessObjectProperties(); if (!prop) return 0; - video::SColor color = prop->nametag_color; - lua_newtable(L); - push_ARGB8(L, color); + + push_ARGB8(L, prop->nametag_color); lua_setfield(L, -2, "color"); + + if (prop->nametag_bgcolor) { + push_ARGB8(L, prop->nametag_bgcolor.value()); + lua_setfield(L, -2, "bgcolor"); + } else { + lua_pushboolean(L, false); + lua_setfield(L, -2, "bgcolor"); + } + lua_pushstring(L, prop->nametag.c_str()); lua_setfield(L, -2, "text"); + + + return 1; } /* LuaEntitySAO-only */ -// set_velocity(self, {x=num, y=num, z=num}) +// set_velocity(self, velocity) int ObjectRef::l_set_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - v3f pos = checkFloatPos(L, 2); - // Do it - co->setVelocity(pos); + LuaEntitySAO *sao = getluaobject(ref); + if (sao == nullptr) + return 0; + + v3f vel = checkFloatPos(L, 2); + + sao->setVelocity(vel); return 0; } -// add_velocity(self, {x=num, y=num, z=num}) +// add_velocity(self, velocity) int ObjectRef::l_add_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (!co) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - v3f pos = checkFloatPos(L, 2); - // Do it - co->addVelocity(pos); + + v3f vel = checkFloatPos(L, 2); + + if (sao->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { + LuaEntitySAO *entitysao = dynamic_cast<LuaEntitySAO*>(sao); + entitysao->addVelocity(vel); + } else if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + PlayerSAO *playersao = dynamic_cast<PlayerSAO*>(sao); + playersao->setMaxSpeedOverride(vel); + getServer(L)->SendPlayerSpeed(playersao->getPeerID(), vel); + } + return 0; } @@ -877,25 +817,37 @@ int ObjectRef::l_get_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - v3f v = co->getVelocity(); - pushFloatPos(L, v); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + if (sao->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { + LuaEntitySAO *entitysao = dynamic_cast<LuaEntitySAO*>(sao); + v3f vel = entitysao->getVelocity(); + pushFloatPos(L, vel); + return 1; + } else if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + RemotePlayer *player = dynamic_cast<PlayerSAO*>(sao)->getPlayer(); + push_v3f(L, player->getSpeed() / BS); + return 1; + } + + lua_pushnil(L); return 1; } -// set_acceleration(self, {x=num, y=num, z=num}) +// set_acceleration(self, acceleration) int ObjectRef::l_set_acceleration(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // pos - v3f pos = checkFloatPos(L, 2); - // Do it - co->setAcceleration(pos); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + v3f acceleration = checkFloatPos(L, 2); + + entitysao->setAcceleration(acceleration); return 0; } @@ -904,59 +856,58 @@ int ObjectRef::l_get_acceleration(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - v3f v = co->getAcceleration(); - pushFloatPos(L, v); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + v3f acceleration = entitysao->getAcceleration(); + pushFloatPos(L, acceleration); return 1; } -// set_rotation(self, {x=num, y=num, z=num}) -// Each 'num' is in radians +// set_rotation(self, rotation) int ObjectRef::l_set_rotation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (!co) + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) return 0; v3f rotation = check_v3f(L, 2) * core::RADTODEG; - co->setRotation(rotation); + + entitysao->setRotation(rotation); return 0; } // get_rotation(self) -// returns: {x=num, y=num, z=num} -// Each 'num' is in radians int ObjectRef::l_get_rotation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (!co) + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) return 0; + v3f rotation = entitysao->getRotation() * core::DEGTORAD; + lua_newtable(L); - v3f rotation = co->getRotation() * core::DEGTORAD; push_v3f(L, rotation); return 1; } -// set_yaw(self, radians) +// set_yaw(self, yaw) int ObjectRef::l_set_yaw(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - - if (co == NULL) return 0; - if (isNaN(L, 2)) - throw LuaError("ObjectRef::set_yaw: NaN value is not allowed."); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; float yaw = readParam<float>(L, 2) * core::RADTODEG; - co->setRotation(v3f(0, yaw, 0)); + + entitysao->setRotation(v3f(0, yaw, 0)); return 0; } @@ -965,11 +916,12 @@ int ObjectRef::l_get_yaw(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (!co) + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) return 0; - float yaw = co->getRotation().Y * core::DEGTORAD; + float yaw = entitysao->getRotation().Y * core::DEGTORAD; + lua_pushnumber(L, yaw); return 1; } @@ -979,11 +931,13 @@ int ObjectRef::l_set_texture_mod(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - std::string mod = luaL_checkstring(L, 2); - co->setTextureMod(mod); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + std::string mod = readParam<std::string>(L, 2); + + entitysao->setTextureMod(mod); return 0; } @@ -992,36 +946,31 @@ int ObjectRef::l_get_texture_mod(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - std::string mod = co->getTextureMod(); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + std::string mod = entitysao->getTextureMod(); + lua_pushstring(L, mod.c_str()); return 1; } -// set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, -// select_horiz_by_yawpitch=false) +// set_sprite(self, start_frame, num_frames, framelength, select_x_by_camera) int ObjectRef::l_set_sprite(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - v2s16 p(0,0); - if (!lua_isnil(L, 2)) - p = readParam<v2s16>(L, 2); - int num_frames = 1; - if (!lua_isnil(L, 3)) - num_frames = lua_tonumber(L, 3); - float framelength = 0.2; - if (!lua_isnil(L, 4)) - framelength = lua_tonumber(L, 4); - bool select_horiz_by_yawpitch = false; - if (!lua_isnil(L, 5)) - select_horiz_by_yawpitch = readParam<bool>(L, 5); - co->setSprite(p, num_frames, framelength, select_horiz_by_yawpitch); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + v2s16 start_frame = readParam<v2s16>(L, 2, v2s16(0,0)); + int num_frames = readParam<int>(L, 3, 1); + float framelength = readParam<float>(L, 4, 0.2f); + bool select_x_by_camera = readParam<bool>(L, 5, false); + + entitysao->setSprite(start_frame, num_frames, framelength, select_x_by_camera); return 0; } @@ -1031,11 +980,13 @@ int ObjectRef::l_get_entity_name(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); + LuaEntitySAO *entitysao = getluaobject(ref); log_deprecated(L,"Deprecated call to \"get_entity_name"); - if (co == NULL) return 0; - // Do it - std::string name = co->getName(); + if (entitysao == nullptr) + return 0; + + std::string name = entitysao->getName(); + lua_pushstring(L, name.c_str()); return 1; } @@ -1045,87 +996,45 @@ int ObjectRef::l_get_luaentity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - luaentity_get(L, co->getId()); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + luaentity_get(L, entitysao->getId()); return 1; } /* Player-only */ -// is_player_connected(self) -int ObjectRef::l_is_player_connected(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - // This method was once added for a bugfix, but never documented - log_deprecated(L, "is_player_connected is undocumented and " - "will be removed in a future release"); - ObjectRef *ref = checkobject(L, 1); - RemotePlayer *player = getplayer(ref); - lua_pushboolean(L, (player != NULL && player->getPeerId() != PEER_ID_INEXISTENT)); - return 1; -} - // get_player_name(self) int ObjectRef::l_get_player_name(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) { + if (player == nullptr) { lua_pushlstring(L, "", 0); return 1; } - // Do it + lua_pushstring(L, player->getName()); return 1; } -// get_player_velocity(self) -int ObjectRef::l_get_player_velocity(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - ObjectRef *ref = checkobject(L, 1); - RemotePlayer *player = getplayer(ref); - if (player == NULL) { - lua_pushnil(L); - return 1; - } - // Do it - push_v3f(L, player->getSpeed() / BS); - return 1; -} - -// add_player_velocity(self, {x=num, y=num, z=num}) -int ObjectRef::l_add_player_velocity(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - ObjectRef *ref = checkobject(L, 1); - v3f vel = checkFloatPos(L, 2); - - PlayerSAO *co = getplayersao(ref); - if (!co) - return 0; - - // Do it - co->setMaxSpeedOverride(vel); - getServer(L)->SendPlayerSpeed(co->getPeerID(), vel); - return 0; -} - // get_look_dir(self) int ObjectRef::l_get_look_dir(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - float pitch = co->getRadLookPitchDep(); - float yaw = co->getRadYawDep(); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + float pitch = playersao->getRadLookPitchDep(); + float yaw = playersao->getRadYawDep(); v3f v(std::cos(pitch) * std::cos(yaw), std::sin(pitch), std::cos(pitch) * std::sin(yaw)); + push_v3f(L, v); return 1; } @@ -1140,10 +1049,11 @@ int ObjectRef::l_get_look_pitch(lua_State *L) "Deprecated call to get_look_pitch, use get_look_vertical instead"); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - lua_pushnumber(L, co->getRadLookPitchDep()); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + lua_pushnumber(L, playersao->getRadLookPitchDep()); return 1; } @@ -1157,34 +1067,37 @@ int ObjectRef::l_get_look_yaw(lua_State *L) "Deprecated call to get_look_yaw, use get_look_horizontal instead"); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - lua_pushnumber(L, co->getRadYawDep()); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + lua_pushnumber(L, playersao->getRadYawDep()); return 1; } -// get_look_pitch2(self) +// get_look_vertical(self) int ObjectRef::l_get_look_vertical(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - lua_pushnumber(L, co->getRadLookPitch()); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + lua_pushnumber(L, playersao->getRadLookPitch()); return 1; } -// get_look_yaw2(self) +// get_look_horizontal(self) int ObjectRef::l_get_look_horizontal(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - lua_pushnumber(L, co->getRadRotation().Y); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + lua_pushnumber(L, playersao->getRadRotation().Y); return 1; } @@ -1193,12 +1106,14 @@ int ObjectRef::l_set_look_vertical(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + float pitch = readParam<float>(L, 2) * core::RADTODEG; - // Do it - co->setLookPitchAndSend(pitch); - return 1; + + playersao->setLookPitchAndSend(pitch); + return 0; } // set_look_horizontal(self, radians) @@ -1206,12 +1121,14 @@ int ObjectRef::l_set_look_horizontal(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + float yaw = readParam<float>(L, 2) * core::RADTODEG; - // Do it - co->setPlayerYawAndSend(yaw); - return 1; + + playersao->setPlayerYawAndSend(yaw); + return 0; } // DEPRECATED @@ -1224,12 +1141,14 @@ int ObjectRef::l_set_look_pitch(lua_State *L) "Deprecated call to set_look_pitch, use set_look_vertical instead."); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + float pitch = readParam<float>(L, 2) * core::RADTODEG; - // Do it - co->setLookPitchAndSend(pitch); - return 1; + + playersao->setLookPitchAndSend(pitch); + return 0; } // DEPRECATED @@ -1242,30 +1161,32 @@ int ObjectRef::l_set_look_yaw(lua_State *L) "Deprecated call to set_look_yaw, use set_look_horizontal instead."); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + float yaw = readParam<float>(L, 2) * core::RADTODEG; - // Do it - co->setPlayerYawAndSend(yaw); - return 1; + + playersao->setPlayerYawAndSend(yaw); + return 0; } -// set_fov(self, degrees[, is_multiplier, transition_time]) +// set_fov(self, degrees, is_multiplier, transition_time) int ObjectRef::l_set_fov(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; - player->setFov({ - static_cast<f32>(luaL_checknumber(L, 2)), - readParam<bool>(L, 3, false), - lua_isnumber(L, 4) ? static_cast<f32>(luaL_checknumber(L, 4)) : 0.0f - }); - getServer(L)->SendPlayerFov(player->getPeerId()); + float degrees = static_cast<f32>(luaL_checknumber(L, 2)); + bool is_multiplier = readParam<bool>(L, 3, false); + float transition_time = lua_isnumber(L, 4) ? + static_cast<f32>(luaL_checknumber(L, 4)) : 0.0f; + player->setFov({degrees, is_multiplier, transition_time}); + getServer(L)->SendPlayerFov(player->getPeerId()); return 0; } @@ -1275,14 +1196,14 @@ int ObjectRef::l_get_fov(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; PlayerFovSpec fov_spec = player->getFov(); + lua_pushnumber(L, fov_spec.fov); lua_pushboolean(L, fov_spec.is_multiplier); lua_pushnumber(L, fov_spec.transition_time); - return 3; } @@ -1291,11 +1212,13 @@ int ObjectRef::l_set_breath(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - u16 breath = luaL_checknumber(L, 2); - co->setBreath(breath); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + u16 breath = luaL_checknumber(L, 2); + + playersao->setBreath(breath); return 0; } @@ -1304,11 +1227,13 @@ int ObjectRef::l_get_breath(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - u16 breath = co->getBreath(); - lua_pushinteger (L, breath); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + u16 breath = playersao->getBreath(); + + lua_pushinteger(L, breath); return 1; } @@ -1319,16 +1244,16 @@ int ObjectRef::l_set_attribute(lua_State *L) "Deprecated call to set_attribute, use MetaDataRef methods instead."); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) return 0; std::string attr = luaL_checkstring(L, 2); if (lua_isnil(L, 3)) { - co->getMeta().removeString(attr); + playersao->getMeta().removeString(attr); } else { std::string value = luaL_checkstring(L, 3); - co->getMeta().setString(attr, value); + playersao->getMeta().setString(attr, value); } return 1; } @@ -1340,14 +1265,14 @@ int ObjectRef::l_get_attribute(lua_State *L) "Deprecated call to get_attribute, use MetaDataRef methods instead."); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) return 0; std::string attr = luaL_checkstring(L, 2); std::string value; - if (co->getMeta().getStringToRef(attr, value)) { + if (playersao->getMeta().getStringToRef(attr, value)) { lua_pushstring(L, value.c_str()); return 1; } @@ -1360,11 +1285,11 @@ int ObjectRef::l_get_attribute(lua_State *L) int ObjectRef::l_get_meta(lua_State *L) { ObjectRef *ref = checkobject(L, 1); - PlayerSAO *co = getplayersao(ref); - if (co == NULL) + PlayerSAO *playersao = getplayersao(ref); + if (playersao == nullptr) return 0; - PlayerMetaRef::create(L, &co->getMeta()); + PlayerMetaRef::create(L, &playersao->getMeta()); return 1; } @@ -1375,13 +1300,14 @@ int ObjectRef::l_set_inventory_formspec(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) return 0; + if (player == nullptr) + return 0; + std::string formspec = luaL_checkstring(L, 2); player->inventory_formspec = formspec; getServer(L)->reportInventoryFormspecModified(player->getName()); - lua_pushboolean(L, true); - return 1; + return 0; } // get_inventory_formspec(self) -> formspec @@ -1390,9 +1316,11 @@ int ObjectRef::l_get_inventory_formspec(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) return 0; + if (player == nullptr) + return 0; std::string formspec = player->inventory_formspec; + lua_pushlstring(L, formspec.c_str(), formspec.size()); return 1; } @@ -1403,27 +1331,27 @@ int ObjectRef::l_set_formspec_prepend(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; std::string formspec = luaL_checkstring(L, 2); player->formspec_prepend = formspec; getServer(L)->reportFormspecPrependModified(player->getName()); - lua_pushboolean(L, true); - return 1; + return 0; } -// get_formspec_prepend(self) -> formspec +// get_formspec_prepend(self) int ObjectRef::l_get_formspec_prepend(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; std::string formspec = player->formspec_prepend; + lua_pushlstring(L, formspec.c_str(), formspec.size()); return 1; } @@ -1434,20 +1362,19 @@ int ObjectRef::l_get_player_control(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) { - lua_pushlstring(L, "", 0); + + lua_newtable(L); + if (player == nullptr) return 1; - } const PlayerControl &control = player->getPlayerControl(); - lua_newtable(L); - lua_pushboolean(L, control.up); + lua_pushboolean(L, control.direction_keys & (1 << 0)); lua_setfield(L, -2, "up"); - lua_pushboolean(L, control.down); + lua_pushboolean(L, control.direction_keys & (1 << 1)); lua_setfield(L, -2, "down"); - lua_pushboolean(L, control.left); + lua_pushboolean(L, control.direction_keys & (1 << 2)); lua_setfield(L, -2, "left"); - lua_pushboolean(L, control.right); + lua_pushboolean(L, control.direction_keys & (1 << 3)); lua_setfield(L, -2, "right"); lua_pushboolean(L, control.jump); lua_setfield(L, -2, "jump"); @@ -1475,22 +1402,105 @@ int ObjectRef::l_get_player_control_bits(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) { - lua_pushlstring(L, "", 0); + if (player == nullptr) { + lua_pushinteger(L, 0); return 1; } - // Do it - lua_pushnumber(L, player->keyPressed); + + const auto &c = player->getPlayerControl(); + + // This is very close to PlayerControl::getKeysPressed() but duplicated + // here so the encoding in the API is not inadvertedly changed. + u32 keypress_bits = + c.direction_keys | + ( (u32)(c.jump & 1) << 4) | + ( (u32)(c.aux1 & 1) << 5) | + ( (u32)(c.sneak & 1) << 6) | + ( (u32)(c.dig & 1) << 7) | + ( (u32)(c.place & 1) << 8) | + ( (u32)(c.zoom & 1) << 9) + ; + + lua_pushinteger(L, keypress_bits); return 1; } -// hud_add(self, form) +// set_physics_override(self, override_table) +int ObjectRef::l_set_physics_override(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + PlayerSAO *playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + RemotePlayer *player = playersao->getPlayer(); + auto &phys = player->physics_override; + + if (lua_istable(L, 2)) { + bool modified = false; + modified |= getfloatfield(L, 2, "speed", phys.speed); + modified |= getfloatfield(L, 2, "jump", phys.jump); + modified |= getfloatfield(L, 2, "gravity", phys.gravity); + modified |= getboolfield(L, 2, "sneak", phys.sneak); + modified |= getboolfield(L, 2, "sneak_glitch", phys.sneak_glitch); + modified |= getboolfield(L, 2, "new_move", phys.new_move); + if (modified) + playersao->m_physics_override_sent = false; + } else { + // old, non-table format + // TODO: Remove this code after version 5.4.0 + log_deprecated(L, "Deprecated use of set_physics_override(num, num, num)"); + + if (!lua_isnil(L, 2)) { + phys.speed = lua_tonumber(L, 2); + playersao->m_physics_override_sent = false; + } + if (!lua_isnil(L, 3)) { + phys.jump = lua_tonumber(L, 3); + playersao->m_physics_override_sent = false; + } + if (!lua_isnil(L, 4)) { + phys.gravity = lua_tonumber(L, 4); + playersao->m_physics_override_sent = false; + } + } + return 0; +} + +// get_physics_override(self) +int ObjectRef::l_get_physics_override(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + RemotePlayer *player = getplayer(ref); + if (player == nullptr) + return 0; + + const auto &phys = player->physics_override; + lua_newtable(L); + lua_pushnumber(L, phys.speed); + lua_setfield(L, -2, "speed"); + lua_pushnumber(L, phys.jump); + lua_setfield(L, -2, "jump"); + lua_pushnumber(L, phys.gravity); + lua_setfield(L, -2, "gravity"); + lua_pushboolean(L, phys.sneak); + lua_setfield(L, -2, "sneak"); + lua_pushboolean(L, phys.sneak_glitch); + lua_setfield(L, -2, "sneak_glitch"); + lua_pushboolean(L, phys.new_move); + lua_setfield(L, -2, "new_move"); + return 1; +} + +// hud_add(self, hud) int ObjectRef::l_hud_add(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; HudElement *elem = new HudElement; @@ -1512,12 +1522,10 @@ int ObjectRef::l_hud_remove(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - u32 id = -1; - if (!lua_isnil(L, 2)) - id = lua_tonumber(L, 2); + u32 id = luaL_checkint(L, 2); if (!getServer(L)->hudRemove(player, id)) return 0; @@ -1532,21 +1540,23 @@ int ObjectRef::l_hud_change(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - u32 id = lua_isnumber(L, 2) ? lua_tonumber(L, 2) : -1; + u32 id = luaL_checkint(L, 2); - HudElement *e = player->getHud(id); - if (!e) + HudElement *elem = player->getHud(id); + if (elem == nullptr) return 0; - void *value = NULL; - HudElementStat stat = read_hud_change(L, e, &value); + HudElementStat stat; + void *value = nullptr; + bool ok = read_hud_change(L, stat, elem, &value); - getServer(L)->hudChange(player, id, stat, value); + if (ok) + getServer(L)->hudChange(player, id, stat, value); - lua_pushboolean(L, true); + lua_pushboolean(L, ok); return 1; } @@ -1556,15 +1566,16 @@ int ObjectRef::l_hud_get(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - u32 id = lua_tonumber(L, -1); + u32 id = luaL_checkint(L, 2); - HudElement *e = player->getHud(id); - if (!e) + HudElement *elem = player->getHud(id); + if (elem == nullptr) return 0; - push_hud_element(L, e); + + push_hud_element(L, elem); return 1; } @@ -1574,7 +1585,7 @@ int ObjectRef::l_hud_set_flags(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; u32 flags = 0; @@ -1591,34 +1602,24 @@ int ObjectRef::l_hud_set_flags(lua_State *L) if (!getServer(L)->hudSetFlags(player, flags, mask)) return 0; - lua_pushboolean(L, true); - return 1; + return 0; } +// hud_get_flags(self) int ObjectRef::l_hud_get_flags(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; lua_newtable(L); - lua_pushboolean(L, player->hud_flags & HUD_FLAG_HOTBAR_VISIBLE); - lua_setfield(L, -2, "hotbar"); - lua_pushboolean(L, player->hud_flags & HUD_FLAG_HEALTHBAR_VISIBLE); - lua_setfield(L, -2, "healthbar"); - lua_pushboolean(L, player->hud_flags & HUD_FLAG_CROSSHAIR_VISIBLE); - lua_setfield(L, -2, "crosshair"); - lua_pushboolean(L, player->hud_flags & HUD_FLAG_WIELDITEM_VISIBLE); - lua_setfield(L, -2, "wielditem"); - lua_pushboolean(L, player->hud_flags & HUD_FLAG_BREATHBAR_VISIBLE); - lua_setfield(L, -2, "breathbar"); - lua_pushboolean(L, player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE); - lua_setfield(L, -2, "minimap"); - lua_pushboolean(L, player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE); - lua_setfield(L, -2, "minimap_radar"); - + const EnumString *esp = es_HudBuiltinElement; + for (int i = 0; esp[i].str; i++) { + lua_pushboolean(L, (player->hud_flags & esp[i].num) != 0); + lua_setfield(L, -2, esp[i].str); + } return 1; } @@ -1628,10 +1629,10 @@ int ObjectRef::l_hud_set_hotbar_itemcount(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - s32 hotbar_itemcount = lua_tonumber(L, 2); + s32 hotbar_itemcount = luaL_checkint(L, 2); if (!getServer(L)->hudSetHotbarItemcount(player, hotbar_itemcount)) return 0; @@ -1646,7 +1647,7 @@ int ObjectRef::l_hud_get_hotbar_itemcount(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; lua_pushnumber(L, player->getHotbarItemcount()); @@ -1659,7 +1660,7 @@ int ObjectRef::l_hud_set_hotbar_image(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; std::string name = readParam<std::string>(L, 2); @@ -1674,10 +1675,11 @@ int ObjectRef::l_hud_get_hotbar_image(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; const std::string &name = player->getHotbarImage(); + lua_pushlstring(L, name.c_str(), name.size()); return 1; } @@ -1688,7 +1690,7 @@ int ObjectRef::l_hud_set_hotbar_selected_image(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; std::string name = readParam<std::string>(L, 2); @@ -1703,109 +1705,106 @@ int ObjectRef::l_hud_get_hotbar_selected_image(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; const std::string &name = player->getHotbarSelectedImage(); + lua_pushlstring(L, name.c_str(), name.size()); return 1; } -// set_sky(self, {base_color=, type=, textures=, clouds=, sky_colors={}}) +// set_sky(self, sky_parameters) int ObjectRef::l_set_sky(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; - bool is_colorspec = is_color_table(L, 2); + SkyboxParams sky_params = player->getSkyParams(); - SkyboxParams skybox_params = player->getSkyParams(); - if (lua_istable(L, 2) && !is_colorspec) { + // reset if empty + if (lua_isnoneornil(L, 2) && lua_isnone(L, 3)) { + sky_params = SkyboxDefaults::getSkyDefaults(); + } else if (lua_istable(L, 2) && !is_color_table(L, 2)) { lua_getfield(L, 2, "base_color"); if (!lua_isnil(L, -1)) - read_color(L, -1, &skybox_params.bgcolor); + read_color(L, -1, &sky_params.bgcolor); lua_pop(L, 1); lua_getfield(L, 2, "type"); if (!lua_isnil(L, -1)) - skybox_params.type = luaL_checkstring(L, -1); + sky_params.type = luaL_checkstring(L, -1); lua_pop(L, 1); lua_getfield(L, 2, "textures"); - skybox_params.textures.clear(); - if (lua_istable(L, -1) && skybox_params.type == "skybox") { + sky_params.textures.clear(); + if (lua_istable(L, -1) && sky_params.type == "skybox") { lua_pushnil(L); while (lua_next(L, -2) != 0) { // Key is at index -2 and value at index -1 - skybox_params.textures.emplace_back(readParam<std::string>(L, -1)); + sky_params.textures.emplace_back(readParam<std::string>(L, -1)); // Removes the value, but keeps the key for iteration lua_pop(L, 1); } } lua_pop(L, 1); - /* - We want to avoid crashes, so we're checking even if we're not using them. - However, we want to ensure that the skybox can be set to nil when - using "regular" or "plain" skybox modes as textures aren't needed. - */ - - if (skybox_params.textures.size() != 6 && skybox_params.textures.size() > 0) + // Validate that we either have six or zero textures + if (sky_params.textures.size() != 6 && !sky_params.textures.empty()) throw LuaError("Skybox expects 6 textures!"); - skybox_params.clouds = getboolfield_default(L, 2, - "clouds", skybox_params.clouds); + sky_params.clouds = getboolfield_default(L, 2, "clouds", sky_params.clouds); lua_getfield(L, 2, "sky_color"); if (lua_istable(L, -1)) { lua_getfield(L, -1, "day_sky"); - read_color(L, -1, &skybox_params.sky_color.day_sky); + read_color(L, -1, &sky_params.sky_color.day_sky); lua_pop(L, 1); lua_getfield(L, -1, "day_horizon"); - read_color(L, -1, &skybox_params.sky_color.day_horizon); + read_color(L, -1, &sky_params.sky_color.day_horizon); lua_pop(L, 1); lua_getfield(L, -1, "dawn_sky"); - read_color(L, -1, &skybox_params.sky_color.dawn_sky); + read_color(L, -1, &sky_params.sky_color.dawn_sky); lua_pop(L, 1); lua_getfield(L, -1, "dawn_horizon"); - read_color(L, -1, &skybox_params.sky_color.dawn_horizon); + read_color(L, -1, &sky_params.sky_color.dawn_horizon); lua_pop(L, 1); lua_getfield(L, -1, "night_sky"); - read_color(L, -1, &skybox_params.sky_color.night_sky); + read_color(L, -1, &sky_params.sky_color.night_sky); lua_pop(L, 1); lua_getfield(L, -1, "night_horizon"); - read_color(L, -1, &skybox_params.sky_color.night_horizon); + read_color(L, -1, &sky_params.sky_color.night_horizon); lua_pop(L, 1); lua_getfield(L, -1, "indoors"); - read_color(L, -1, &skybox_params.sky_color.indoors); + read_color(L, -1, &sky_params.sky_color.indoors); lua_pop(L, 1); // Prevent flickering clouds at dawn/dusk: - skybox_params.fog_sun_tint = video::SColor(255, 255, 255, 255); + sky_params.fog_sun_tint = video::SColor(255, 255, 255, 255); lua_getfield(L, -1, "fog_sun_tint"); - read_color(L, -1, &skybox_params.fog_sun_tint); + read_color(L, -1, &sky_params.fog_sun_tint); lua_pop(L, 1); - skybox_params.fog_moon_tint = video::SColor(255, 255, 255, 255); + sky_params.fog_moon_tint = video::SColor(255, 255, 255, 255); lua_getfield(L, -1, "fog_moon_tint"); - read_color(L, -1, &skybox_params.fog_moon_tint); + read_color(L, -1, &sky_params.fog_moon_tint); lua_pop(L, 1); lua_getfield(L, -1, "fog_tint_type"); if (!lua_isnil(L, -1)) - skybox_params.fog_tint_type = luaL_checkstring(L, -1); + sky_params.fog_tint_type = luaL_checkstring(L, -1); lua_pop(L, 1); - // Because we need to leave the "sky_color" table. + // pop "sky_color" table lua_pop(L, 1); } } else { @@ -1818,14 +1817,14 @@ int ObjectRef::l_set_sky(lua_State *L) StarParams star_params = player->getStarParams(); // Prevent erroneous background colors - skybox_params.bgcolor = video::SColor(255, 255, 255, 255); - read_color(L, 2, &skybox_params.bgcolor); + sky_params.bgcolor = video::SColor(255, 255, 255, 255); + read_color(L, 2, &sky_params.bgcolor); - skybox_params.type = luaL_checkstring(L, 3); + sky_params.type = luaL_checkstring(L, 3); // Preserve old behaviour of the sun, moon and stars // when using the old set_sky call. - if (skybox_params.type == "regular") { + if (sky_params.type == "regular") { sun_params.visible = true; sun_params.sunrise_visible = true; moon_params.visible = true; @@ -1837,128 +1836,152 @@ int ObjectRef::l_set_sky(lua_State *L) star_params.visible = false; } - skybox_params.textures.clear(); + sky_params.textures.clear(); if (lua_istable(L, 4)) { lua_pushnil(L); while (lua_next(L, 4) != 0) { - // Key at index -2, and value at index -1 - if (lua_isstring(L, -1)) - skybox_params.textures.emplace_back(readParam<std::string>(L, -1)); - else - skybox_params.textures.emplace_back(""); + // Key at index -2, and value at index -1 + sky_params.textures.emplace_back(readParam<std::string>(L, -1)); // Remove the value, keep the key for the next iteration lua_pop(L, 1); } } - if (skybox_params.type == "skybox" && skybox_params.textures.size() != 6) + if (sky_params.type == "skybox" && sky_params.textures.size() != 6) throw LuaError("Skybox expects 6 textures."); - skybox_params.clouds = true; + sky_params.clouds = true; if (lua_isboolean(L, 5)) - skybox_params.clouds = readParam<bool>(L, 5); + sky_params.clouds = readParam<bool>(L, 5); getServer(L)->setSun(player, sun_params); getServer(L)->setMoon(player, moon_params); getServer(L)->setStars(player, star_params); } - getServer(L)->setSky(player, skybox_params); - lua_pushboolean(L, true); - return 1; + + getServer(L)->setSky(player, sky_params); + return 0; } -// get_sky(self) +static void push_sky_color(lua_State *L, const SkyboxParams ¶ms) +{ + lua_newtable(L); + if (params.type == "regular") { + push_ARGB8(L, params.sky_color.day_sky); + lua_setfield(L, -2, "day_sky"); + push_ARGB8(L, params.sky_color.day_horizon); + lua_setfield(L, -2, "day_horizon"); + push_ARGB8(L, params.sky_color.dawn_sky); + lua_setfield(L, -2, "dawn_sky"); + push_ARGB8(L, params.sky_color.dawn_horizon); + lua_setfield(L, -2, "dawn_horizon"); + push_ARGB8(L, params.sky_color.night_sky); + lua_setfield(L, -2, "night_sky"); + push_ARGB8(L, params.sky_color.night_horizon); + lua_setfield(L, -2, "night_horizon"); + push_ARGB8(L, params.sky_color.indoors); + lua_setfield(L, -2, "indoors"); + } + push_ARGB8(L, params.fog_sun_tint); + lua_setfield(L, -2, "fog_sun_tint"); + push_ARGB8(L, params.fog_moon_tint); + lua_setfield(L, -2, "fog_moon_tint"); + lua_pushstring(L, params.fog_tint_type.c_str()); + lua_setfield(L, -2, "fog_tint_type"); +} + +// get_sky(self, as_table) int ObjectRef::l_get_sky(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - - if (!player) + if (player == nullptr) return 0; - SkyboxParams skybox_params; - skybox_params = player->getSkyParams(); + const SkyboxParams &skybox_params = player->getSkyParams(); + + // handle the deprecated version + if (!readParam<bool>(L, 2, false)) { + log_deprecated(L, "Deprecated call to get_sky, please check lua_api.txt"); + + push_ARGB8(L, skybox_params.bgcolor); + lua_pushlstring(L, skybox_params.type.c_str(), skybox_params.type.size()); + + lua_newtable(L); + s16 i = 1; + for (const std::string &texture : skybox_params.textures) { + lua_pushlstring(L, texture.c_str(), texture.size()); + lua_rawseti(L, -2, i++); + } + lua_pushboolean(L, skybox_params.clouds); + return 4; + } + + lua_newtable(L); push_ARGB8(L, skybox_params.bgcolor); + lua_setfield(L, -2, "base_color"); lua_pushlstring(L, skybox_params.type.c_str(), skybox_params.type.size()); + lua_setfield(L, -2, "type"); lua_newtable(L); s16 i = 1; - for (const std::string& texture : skybox_params.textures) { + for (const std::string &texture : skybox_params.textures) { lua_pushlstring(L, texture.c_str(), texture.size()); lua_rawseti(L, -2, i++); } + lua_setfield(L, -2, "textures"); lua_pushboolean(L, skybox_params.clouds); - return 4; + lua_setfield(L, -2, "clouds"); + + push_sky_color(L, skybox_params); + lua_setfield(L, -2, "sky_color"); + return 1; } +// DEPRECATED // get_sky_color(self) int ObjectRef::l_get_sky_color(lua_State *L) { NO_MAP_LOCK_REQUIRED; + + log_deprecated(L, "Deprecated call to get_sky_color, use get_sky instead"); + ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - - if (!player) + if (player == nullptr) return 0; - const SkyboxParams& skybox_params = player->getSkyParams(); - - lua_newtable(L); - if (skybox_params.type == "regular") { - push_ARGB8(L, skybox_params.sky_color.day_sky); - lua_setfield(L, -2, "day_sky"); - push_ARGB8(L, skybox_params.sky_color.day_horizon); - lua_setfield(L, -2, "day_horizon"); - push_ARGB8(L, skybox_params.sky_color.dawn_sky); - lua_setfield(L, -2, "dawn_sky"); - push_ARGB8(L, skybox_params.sky_color.dawn_horizon); - lua_setfield(L, -2, "dawn_horizon"); - push_ARGB8(L, skybox_params.sky_color.night_sky); - lua_setfield(L, -2, "night_sky"); - push_ARGB8(L, skybox_params.sky_color.night_horizon); - lua_setfield(L, -2, "night_horizon"); - push_ARGB8(L, skybox_params.sky_color.indoors); - lua_setfield(L, -2, "indoors"); - } - push_ARGB8(L, skybox_params.fog_sun_tint); - lua_setfield(L, -2, "fog_sun_tint"); - push_ARGB8(L, skybox_params.fog_moon_tint); - lua_setfield(L, -2, "fog_moon_tint"); - lua_pushstring(L, skybox_params.fog_tint_type.c_str()); - lua_setfield(L, -2, "fog_tint_type"); + const SkyboxParams &skybox_params = player->getSkyParams(); + push_sky_color(L, skybox_params); return 1; } -// set_sun(self, {visible, texture=, tonemap=, sunrise=, rotation=, scale=}) +// set_sun(self, sun_parameters) int ObjectRef::l_set_sun(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) - return 0; - - if (!lua_istable(L, 2)) + if (player == nullptr) return 0; SunParams sun_params = player->getSunParams(); - sun_params.visible = getboolfield_default(L, 2, - "visible", sun_params.visible); - sun_params.texture = getstringfield_default(L, 2, - "texture", sun_params.texture); - sun_params.tonemap = getstringfield_default(L, 2, - "tonemap", sun_params.tonemap); - sun_params.sunrise = getstringfield_default(L, 2, - "sunrise", sun_params.sunrise); - sun_params.sunrise_visible = getboolfield_default(L, 2, - "sunrise_visible", sun_params.sunrise_visible); - sun_params.scale = getfloatfield_default(L, 2, - "scale", sun_params.scale); + // reset if empty + if (lua_isnoneornil(L, 2)) { + sun_params = SkyboxDefaults::getSunDefaults(); + } else { + luaL_checktype(L, 2, LUA_TTABLE); + sun_params.visible = getboolfield_default(L, 2, "visible", sun_params.visible); + sun_params.texture = getstringfield_default(L, 2, "texture", sun_params.texture); + sun_params.tonemap = getstringfield_default(L, 2, "tonemap", sun_params.tonemap); + sun_params.sunrise = getstringfield_default(L, 2, "sunrise", sun_params.sunrise); + sun_params.sunrise_visible = getboolfield_default(L, 2, "sunrise_visible", sun_params.sunrise_visible); + sun_params.scale = getfloatfield_default(L, 2, "scale", sun_params.scale); + } getServer(L)->setSun(player, sun_params); - lua_pushboolean(L, true); - return 1; + return 0; } //get_sun(self) @@ -1967,8 +1990,9 @@ int ObjectRef::l_get_sun(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + const SunParams &sun_params = player->getSunParams(); lua_newtable(L); @@ -1984,35 +2008,33 @@ int ObjectRef::l_get_sun(lua_State *L) lua_setfield(L, -2, "sunrise_visible"); lua_pushnumber(L, sun_params.scale); lua_setfield(L, -2, "scale"); - return 1; } -// set_moon(self, {visible, texture=, tonemap=, sunrise=, rotation=, scale=}) +// set_moon(self, moon_parameters) int ObjectRef::l_set_moon(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) - return 0; - if (!lua_istable(L, 2)) + if (player == nullptr) return 0; MoonParams moon_params = player->getMoonParams(); - moon_params.visible = getboolfield_default(L, 2, - "visible", moon_params.visible); - moon_params.texture = getstringfield_default(L, 2, - "texture", moon_params.texture); - moon_params.tonemap = getstringfield_default(L, 2, - "tonemap", moon_params.tonemap); - moon_params.scale = getfloatfield_default(L, 2, - "scale", moon_params.scale); + // reset if empty + if (lua_isnoneornil(L, 2)) { + moon_params = SkyboxDefaults::getMoonDefaults(); + } else { + luaL_checktype(L, 2, LUA_TTABLE); + moon_params.visible = getboolfield_default(L, 2, "visible", moon_params.visible); + moon_params.texture = getstringfield_default(L, 2, "texture", moon_params.texture); + moon_params.tonemap = getstringfield_default(L, 2, "tonemap", moon_params.tonemap); + moon_params.scale = getfloatfield_default(L, 2, "scale", moon_params.scale); + } getServer(L)->setMoon(player, moon_params); - lua_pushboolean(L, true); - return 1; + return 0; } // get_moon(self) @@ -2021,8 +2043,9 @@ int ObjectRef::l_get_moon(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + const MoonParams &moon_params = player->getMoonParams(); lua_newtable(L); @@ -2034,39 +2057,41 @@ int ObjectRef::l_get_moon(lua_State *L) lua_setfield(L, -2, "tonemap"); lua_pushnumber(L, moon_params.scale); lua_setfield(L, -2, "scale"); - return 1; } -// set_stars(self, {visible, count=, starcolor=, rotation=, scale=}) +// set_stars(self, star_parameters) int ObjectRef::l_set_stars(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) - return 0; - if (!lua_istable(L, 2)) + if (player == nullptr) return 0; StarParams star_params = player->getStarParams(); - star_params.visible = getboolfield_default(L, 2, - "visible", star_params.visible); - star_params.count = getintfield_default(L, 2, - "count", star_params.count); + // reset if empty + if (lua_isnoneornil(L, 2)) { + star_params = SkyboxDefaults::getStarDefaults(); + } else { + luaL_checktype(L, 2, LUA_TTABLE); + star_params.visible = getboolfield_default(L, 2, "visible", star_params.visible); + star_params.count = getintfield_default(L, 2, "count", star_params.count); - lua_getfield(L, 2, "star_color"); - if (!lua_isnil(L, -1)) - read_color(L, -1, &star_params.starcolor); - lua_pop(L, 1); + lua_getfield(L, 2, "star_color"); + if (!lua_isnil(L, -1)) + read_color(L, -1, &star_params.starcolor); + lua_pop(L, 1); - star_params.scale = getfloatfield_default(L, 2, - "scale", star_params.scale); + star_params.scale = getfloatfield_default(L, 2, + "scale", star_params.scale); + star_params.day_opacity = getfloatfield_default(L, 2, + "day_opacity", star_params.day_opacity); + } getServer(L)->setStars(player, star_params); - lua_pushboolean(L, true); - return 1; + return 0; } // get_stars(self) @@ -2075,8 +2100,9 @@ int ObjectRef::l_get_stars(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + const StarParams &star_params = player->getStarParams(); lua_newtable(L); @@ -2088,49 +2114,53 @@ int ObjectRef::l_get_stars(lua_State *L) lua_setfield(L, -2, "star_color"); lua_pushnumber(L, star_params.scale); lua_setfield(L, -2, "scale"); - + lua_pushnumber(L, star_params.day_opacity); + lua_setfield(L, -2, "day_opacity"); return 1; } -// set_clouds(self, {density=, color=, ambient=, height=, thickness=, speed=}) +// set_clouds(self, cloud_parameters) int ObjectRef::l_set_clouds(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) - return 0; - if (!lua_istable(L, 2)) + if (player == nullptr) return 0; CloudParams cloud_params = player->getCloudParams(); - cloud_params.density = getfloatfield_default(L, 2, "density", cloud_params.density); + // reset if empty + if (lua_isnoneornil(L, 2)) { + cloud_params = SkyboxDefaults::getCloudDefaults(); + } else { + luaL_checktype(L, 2, LUA_TTABLE); + cloud_params.density = getfloatfield_default(L, 2, "density", cloud_params.density); - lua_getfield(L, 2, "color"); - if (!lua_isnil(L, -1)) - read_color(L, -1, &cloud_params.color_bright); - lua_pop(L, 1); - lua_getfield(L, 2, "ambient"); - if (!lua_isnil(L, -1)) - read_color(L, -1, &cloud_params.color_ambient); - lua_pop(L, 1); + lua_getfield(L, 2, "color"); + if (!lua_isnil(L, -1)) + read_color(L, -1, &cloud_params.color_bright); + lua_pop(L, 1); + lua_getfield(L, 2, "ambient"); + if (!lua_isnil(L, -1)) + read_color(L, -1, &cloud_params.color_ambient); + lua_pop(L, 1); - cloud_params.height = getfloatfield_default(L, 2, "height", cloud_params.height ); - cloud_params.thickness = getfloatfield_default(L, 2, "thickness", cloud_params.thickness); + cloud_params.height = getfloatfield_default(L, 2, "height", cloud_params.height); + cloud_params.thickness = getfloatfield_default(L, 2, "thickness", cloud_params.thickness); - lua_getfield(L, 2, "speed"); - if (lua_istable(L, -1)) { - v2f new_speed; - new_speed.X = getfloatfield_default(L, -1, "x", 0); - new_speed.Y = getfloatfield_default(L, -1, "z", 0); - cloud_params.speed = new_speed; + lua_getfield(L, 2, "speed"); + if (lua_istable(L, -1)) { + v2f new_speed; + new_speed.X = getfloatfield_default(L, -1, "x", 0); + new_speed.Y = getfloatfield_default(L, -1, "z", 0); + cloud_params.speed = new_speed; + } + lua_pop(L, 1); } - lua_pop(L, 1); getServer(L)->setClouds(player, cloud_params); - lua_pushboolean(L, true); - return 1; + return 0; } int ObjectRef::l_get_clouds(lua_State *L) @@ -2138,8 +2168,9 @@ int ObjectRef::l_get_clouds(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + const CloudParams &cloud_params = player->getCloudParams(); lua_newtable(L); @@ -2159,30 +2190,31 @@ int ObjectRef::l_get_clouds(lua_State *L) lua_pushnumber(L, cloud_params.speed.Y); lua_setfield(L, -2, "y"); lua_setfield(L, -2, "speed"); - return 1; } -// override_day_night_ratio(self, brightness=0...1) +// override_day_night_ratio(self, ratio) int ObjectRef::l_override_day_night_ratio(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; bool do_override = false; float ratio = 0.0f; + if (!lua_isnil(L, 2)) { do_override = true; ratio = readParam<float>(L, 2); + luaL_argcheck(L, ratio >= 0.0f && ratio <= 1.0f, 1, + "value must be between 0 and 1"); } getServer(L)->overrideDayNightRatio(player, do_override, ratio); - lua_pushboolean(L, true); - return 1; + return 0; } // get_day_night_ratio(self) @@ -2191,7 +2223,7 @@ int ObjectRef::l_get_day_night_ratio(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; bool do_override; @@ -2206,27 +2238,132 @@ int ObjectRef::l_get_day_night_ratio(lua_State *L) return 1; } +// set_minimap_modes(self, modes, selected_mode) +int ObjectRef::l_set_minimap_modes(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + RemotePlayer *player = getplayer(ref); + if (player == nullptr) + return 0; + + luaL_checktype(L, 2, LUA_TTABLE); + std::vector<MinimapMode> modes; + s16 selected_mode = readParam<s16>(L, 3); + + lua_pushnil(L); + while (lua_next(L, 2) != 0) { + /* key is at index -2, value is at index -1 */ + if (lua_istable(L, -1)) { + bool ok = true; + MinimapMode mode; + std::string type = getstringfield_default(L, -1, "type", ""); + if (type == "off") + mode.type = MINIMAP_TYPE_OFF; + else if (type == "surface") + mode.type = MINIMAP_TYPE_SURFACE; + else if (type == "radar") + mode.type = MINIMAP_TYPE_RADAR; + else if (type == "texture") { + mode.type = MINIMAP_TYPE_TEXTURE; + mode.texture = getstringfield_default(L, -1, "texture", ""); + mode.scale = getintfield_default(L, -1, "scale", 1); + } else { + warningstream << "Minimap mode of unknown type \"" << type.c_str() + << "\" ignored.\n" << std::endl; + ok = false; + } + + if (ok) { + mode.label = getstringfield_default(L, -1, "label", ""); + // Size is limited to 512. Performance gets poor if size too large, and + // segfaults have been experienced. + mode.size = rangelim(getintfield_default(L, -1, "size", 0), 1, 512); + modes.push_back(mode); + } + } + /* removes 'value'; keeps 'key' for next iteration */ + lua_pop(L, 1); + } + lua_pop(L, 1); // Remove key + + getServer(L)->SendMinimapModes(player->getPeerId(), modes, selected_mode); + return 0; +} + +// set_lighting(self, lighting) +int ObjectRef::l_set_lighting(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + RemotePlayer *player = getplayer(ref); + if (player == nullptr) + return 0; + + luaL_checktype(L, 2, LUA_TTABLE); + Lighting lighting = player->getLighting(); + lua_getfield(L, 2, "shadows"); + if (lua_istable(L, -1)) { + lighting.shadow_intensity = getfloatfield_default(L, -1, "intensity", lighting.shadow_intensity); + } + lua_pop(L, -1); + + getServer(L)->setLighting(player, lighting); + return 0; +} + +// get_lighting(self) +int ObjectRef::l_get_lighting(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + RemotePlayer *player = getplayer(ref); + if (player == nullptr) + return 0; + + const Lighting &lighting = player->getLighting(); + + lua_newtable(L); // result + lua_newtable(L); // "shadows" + lua_pushnumber(L, lighting.shadow_intensity); + lua_setfield(L, -2, "intensity"); + lua_setfield(L, -2, "shadows"); + return 1; +} + +// respawn(self) +int ObjectRef::l_respawn(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + RemotePlayer *player = getplayer(ref); + if (player == nullptr) + return 0; + + getServer(L)->RespawnPlayer(player->getPeerId()); + lua_pushboolean(L, true); + return 1; +} + + ObjectRef::ObjectRef(ServerActiveObject *object): m_object(object) -{ - //infostream<<"ObjectRef created for id="<<m_object->getId()<<std::endl; -} +{} // Creates an ObjectRef and leaves it on top of stack // Not callable from Lua; all references are created on the C side. void ObjectRef::create(lua_State *L, ServerActiveObject *object) { - ObjectRef *o = new ObjectRef(object); - //infostream<<"ObjectRef::create: o="<<o<<std::endl; - *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + ObjectRef *obj = new ObjectRef(object); + *(void **)(lua_newuserdata(L, sizeof(void *))) = obj; luaL_getmetatable(L, className); lua_setmetatable(L, -2); } void ObjectRef::set_null(lua_State *L) { - ObjectRef *o = checkobject(L, -1); - o->m_object = NULL; + ObjectRef *obj = checkobject(L, -1); + obj->m_object = nullptr; } void ObjectRef::Register(lua_State *L) @@ -2250,12 +2387,8 @@ void ObjectRef::Register(lua_State *L) lua_pop(L, 1); // drop metatable - markAliasDeprecated(methods); - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable - - // Cannot be created from Lua - //lua_register(L, className, create_object); } const char ObjectRef::className[] = "ObjectRef"; @@ -2283,15 +2416,19 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, get_bone_position), luamethod(ObjectRef, set_attach), luamethod(ObjectRef, get_attach), + luamethod(ObjectRef, get_children), luamethod(ObjectRef, set_detach), luamethod(ObjectRef, set_properties), luamethod(ObjectRef, get_properties), luamethod(ObjectRef, set_nametag_attributes), luamethod(ObjectRef, get_nametag_attributes), - // LuaEntitySAO-only + luamethod_aliased(ObjectRef, set_velocity, setvelocity), - luamethod(ObjectRef, add_velocity), + luamethod_aliased(ObjectRef, add_velocity, add_player_velocity), luamethod_aliased(ObjectRef, get_velocity, getvelocity), + luamethod_dep(ObjectRef, get_velocity, get_player_velocity), + + // LuaEntitySAO-only luamethod_aliased(ObjectRef, set_acceleration, setacceleration), luamethod_aliased(ObjectRef, get_acceleration, getacceleration), luamethod_aliased(ObjectRef, set_yaw, setyaw), @@ -2303,12 +2440,10 @@ luaL_Reg ObjectRef::methods[] = { luamethod_aliased(ObjectRef, set_sprite, setsprite), luamethod(ObjectRef, get_entity_name), luamethod(ObjectRef, get_luaentity), + // Player-only luamethod(ObjectRef, is_player), - luamethod(ObjectRef, is_player_connected), luamethod(ObjectRef, get_player_name), - luamethod(ObjectRef, get_player_velocity), - luamethod(ObjectRef, add_player_velocity), luamethod(ObjectRef, get_look_dir), luamethod(ObjectRef, get_look_pitch), luamethod(ObjectRef, get_look_yaw), @@ -2363,5 +2498,10 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, set_eye_offset), luamethod(ObjectRef, get_eye_offset), luamethod(ObjectRef, send_mapblock), + luamethod(ObjectRef, set_minimap_modes), + luamethod(ObjectRef, set_lighting), + luamethod(ObjectRef, get_lighting), + luamethod(ObjectRef, respawn), + {0,0} }; diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index a75c59fd9..b36bab492 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -69,29 +69,24 @@ private: static int l_remove(lua_State *L); // get_pos(self) - // returns: {x=num, y=num, z=num} static int l_get_pos(lua_State *L); // set_pos(self, pos) static int l_set_pos(lua_State *L); - // move_to(self, pos, continuous=false) + // move_to(self, pos, continuous) static int l_move_to(lua_State *L); // punch(self, puncher, time_from_last_punch, tool_capabilities, dir) static int l_punch(lua_State *L); - // right_click(self, clicker); clicker = an another ObjectRef + // right_click(self, clicker) static int l_right_click(lua_State *L); - // set_hp(self, hp) - // hp = number of hitpoints (2 * number of hearts) - // returns: nil + // set_hp(self, hp, reason) static int l_set_hp(lua_State *L); // get_hp(self) - // returns: number of hitpoints (2 * number of hearts) - // 0 if not applicable to this type of object static int l_get_hp(lua_State *L); // get_inventory(self) @@ -106,7 +101,7 @@ private: // get_wielded_item(self) static int l_get_wielded_item(lua_State *L); - // set_wielded_item(self, itemstack or itemstring or table or nil) + // set_wielded_item(self, item) static int l_set_wielded_item(lua_State *L); // set_armor_groups(self, groups) @@ -115,8 +110,7 @@ private: // get_armor_groups(self) static int l_get_armor_groups(lua_State *L); - // set_physics_override(self, physics_override_speed, physics_override_jump, - // physics_override_gravity, sneak, sneak_glitch, new_move) + // set_physics_override(self, override_table) static int l_set_physics_override(lua_State *L); // get_physics_override(self) @@ -131,7 +125,7 @@ private: // get_animation(self) static int l_get_animation(lua_State *L); - // set_bone_position(self, std::string bone, v3f position, v3f rotation) + // set_bone_position(self, bone, position, rotation) static int l_set_bone_position(lua_State *L); // get_bone_position(self, bone) @@ -143,6 +137,9 @@ private: // get_attach(self) static int l_get_attach(lua_State *L); + // get_children(self) + static int l_get_children(lua_State *L); + // set_detach(self) static int l_set_detach(lua_State *L); @@ -157,28 +154,28 @@ private: /* LuaEntitySAO-only */ - // set_velocity(self, {x=num, y=num, z=num}) + // set_velocity(self, velocity) static int l_set_velocity(lua_State *L); - // add_velocity(self, {x=num, y=num, z=num}) + // add_velocity(self, velocity) static int l_add_velocity(lua_State *L); // get_velocity(self) static int l_get_velocity(lua_State *L); - // set_acceleration(self, {x=num, y=num, z=num}) + // set_acceleration(self, acceleration) static int l_set_acceleration(lua_State *L); // get_acceleration(self) static int l_get_acceleration(lua_State *L); - // set_rotation(self, {x=num, y=num, z=num}) + // set_rotation(self, rotation) static int l_set_rotation(lua_State *L); // get_rotation(self) static int l_get_rotation(lua_State *L); - // set_yaw(self, radians) + // set_yaw(self, yaw) static int l_set_yaw(lua_State *L); // get_yaw(self) @@ -190,8 +187,7 @@ private: // l_get_texture_mod(self) static int l_get_texture_mod(lua_State *L); - // set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, - // select_horiz_by_yawpitch=false) + // set_sprite(self, start_frame, num_frames, framelength, select_x_by_camera) static int l_set_sprite(lua_State *L); // DEPRECATED @@ -203,18 +199,9 @@ private: /* Player-only */ - // is_player_connected(self) - static int l_is_player_connected(lua_State *L); - // get_player_name(self) static int l_get_player_name(lua_State *L); - // get_player_velocity(self) - static int l_get_player_velocity(lua_State *L); - - // add_player_velocity(self, {x=num, y=num, z=num}) - static int l_add_player_velocity(lua_State *L); - // get_fov(self) static int l_get_fov(lua_State *L); @@ -235,7 +222,7 @@ private: // get_look_yaw2(self) static int l_get_look_horizontal(lua_State *L); - // set_fov(self, degrees, is_multiplier) + // set_fov(self, degrees, is_multiplier, transition_time) static int l_set_fov(lua_State *L); // set_look_vertical(self, radians) @@ -258,9 +245,11 @@ private: // get_breath(self, breath) static int l_get_breath(lua_State *L); + // DEPRECATED // set_attribute(self, attribute, value) static int l_set_attribute(lua_State *L); + // DEPRECATED // get_attribute(self, attribute) static int l_get_attribute(lua_State *L); @@ -270,13 +259,13 @@ private: // set_inventory_formspec(self, formspec) static int l_set_inventory_formspec(lua_State *L); - // get_inventory_formspec(self) -> formspec + // get_inventory_formspec(self) static int l_get_inventory_formspec(lua_State *L); // set_formspec_prepend(self, formspec) static int l_set_formspec_prepend(lua_State *L); - // get_formspec_prepend(self) -> formspec + // get_formspec_prepend(self) static int l_get_formspec_prepend(lua_State *L); // get_player_control(self) @@ -324,34 +313,35 @@ private: // hud_get_hotbar_selected_image(self) static int l_hud_get_hotbar_selected_image(lua_State *L); - // set_sky({base_color=, type=, textures=, clouds=, sky_colors={}}) + // set_sky(self, sky_parameters) static int l_set_sky(lua_State *L); - // get_sky(self) + // get_sky(self, as_table) static int l_get_sky(lua_State *L); + // DEPRECATED // get_sky_color(self) static int l_get_sky_color(lua_State* L); - // set_sun(self, {visible, texture=, tonemap=, sunrise=, rotation=, scale=}) + // set_sun(self, sun_parameters) static int l_set_sun(lua_State *L); // get_sun(self) static int l_get_sun(lua_State *L); - // set_moon(self, {visible, texture=, tonemap=, rotation, scale=}) + // set_moon(self, moon_parameters) static int l_set_moon(lua_State *L); // get_moon(self) static int l_get_moon(lua_State *L); - // set_stars(self, {visible, count=, starcolor=, rotation, scale=}) + // set_stars(self, star_parameters) static int l_set_stars(lua_State *L); // get_stars(self) static int l_get_stars(lua_State *L); - // set_clouds(self, {density=, color=, ambient=, height=, thickness=, speed=}) + // set_clouds(self, cloud_parameters) static int l_set_clouds(lua_State *L); // get_clouds(self) @@ -363,13 +353,13 @@ private: // get_day_night_ratio(self) static int l_get_day_night_ratio(lua_State *L); - // set_local_animation(self, {stand/idle}, {walk}, {dig}, {walk+dig}, frame_speed) + // set_local_animation(self, idle, walk, dig, walk_while_dig, frame_speed) static int l_set_local_animation(lua_State *L); // get_local_animation(self) static int l_get_local_animation(lua_State *L); - // set_eye_offset(self, v3f first pv, v3f third pv) + // set_eye_offset(self, firstperson, thirdperson) static int l_set_eye_offset(lua_State *L); // get_eye_offset(self) @@ -383,4 +373,16 @@ private: // send_mapblock(pos) static int l_send_mapblock(lua_State *L); + + // set_minimap_modes(self, modes, wanted_mode) + static int l_set_minimap_modes(lua_State *L); + + // set_lighting(self, lighting) + static int l_set_lighting(lua_State *L); + + // get_lighting(self) + static int l_get_lighting(lua_State *L); + + // respawn(self) + static int l_respawn(lua_State *L); }; diff --git a/src/script/lua_api/l_particleparams.h b/src/script/lua_api/l_particleparams.h new file mode 100644 index 000000000..03f11c07f --- /dev/null +++ b/src/script/lua_api/l_particleparams.h @@ -0,0 +1,282 @@ +/* +Minetest +Copyright (C) 2021 velartrill, Lexi Hale <lexi@hale.su> + +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. +*/ + +#pragma once +#include "lua_api/l_particles.h" +#include "lua_api/l_object.h" +#include "lua_api/l_internal.h" +#include "common/c_converter.h" +#include "common/c_content.h" +#include "server.h" +#include "particles.h" + +namespace LuaParticleParams +{ + using namespace ParticleParamTypes; + + template<typename T> + inline void readNumericLuaValue(lua_State* L, T& ret) + { + if (lua_isnil(L,-1)) + return; + + if (std::is_integral<T>()) + ret = lua_tointeger(L, -1); + else + ret = lua_tonumber(L, -1); + } + + template <typename T, size_t N> + inline void readNumericLuaValue(lua_State* L, Parameter<T,N>& ret) + { + readNumericLuaValue<T>(L, ret.val); + } + + // these are unfortunately necessary as C++ intentionally disallows function template + // specialization and there's no way to make template overloads reliably resolve correctly + inline void readLuaValue(lua_State* L, f32Parameter& ret) { readNumericLuaValue(L, ret); } + inline void readLuaValue(lua_State* L, f32& ret) { readNumericLuaValue(L, ret); } + inline void readLuaValue(lua_State* L, u16& ret) { readNumericLuaValue(L, ret); } + inline void readLuaValue(lua_State* L, u8& ret) { readNumericLuaValue(L, ret); } + + inline void readLuaValue(lua_State* L, v3fParameter& ret) + { + if (lua_isnil(L, -1)) + return; + + if (lua_isnumber(L, -1)) { // shortcut for uniform vectors + auto n = lua_tonumber(L, -1); + ret = v3fParameter(n,n,n); + } else { + ret = (v3fParameter)check_v3f(L, -1); + } + } + + inline void readLuaValue(lua_State* L, v2fParameter& ret) + { + if (lua_isnil(L, -1)) + return; + + if (lua_isnumber(L, -1)) { // shortcut for uniform vectors + auto n = lua_tonumber(L, -1); + ret = v2fParameter(n,n); + } else { + ret = (v2fParameter)check_v2f(L, -1); + } + } + + inline void readLuaValue(lua_State* L, TweenStyle& ret) + { + if (lua_isnil(L, -1)) + return; + + static const EnumString opts[] = { + {(int)TweenStyle::fwd, "fwd"}, + {(int)TweenStyle::rev, "rev"}, + {(int)TweenStyle::pulse, "pulse"}, + {(int)TweenStyle::flicker, "flicker"}, + {0, nullptr}, + }; + + luaL_checktype(L, -1, LUA_TSTRING); + int v = (int)TweenStyle::fwd; + if (!string_to_enum(opts, v, lua_tostring(L, -1))) { + throw LuaError("tween style must be one of ('fwd', 'rev', 'pulse', 'flicker')"); + } + ret = (TweenStyle)v; + } + + inline void readLuaValue(lua_State* L, AttractorKind& ret) + { + if (lua_isnil(L, -1)) + return; + + static const EnumString opts[] = { + {(int)AttractorKind::none, "none"}, + {(int)AttractorKind::point, "point"}, + {(int)AttractorKind::line, "line"}, + {(int)AttractorKind::plane, "plane"}, + {0, nullptr}, + }; + + luaL_checktype(L, -1, LUA_TSTRING); + int v = (int)AttractorKind::none; + if (!string_to_enum(opts, v, lua_tostring(L, -1))) { + throw LuaError("attractor kind must be one of ('none', 'point', 'line', 'plane')"); + } + ret = (AttractorKind)v; + } + + inline void readLuaValue(lua_State* L, BlendMode& ret) + { + if (lua_isnil(L, -1)) + return; + + static const EnumString opts[] = { + {(int)BlendMode::alpha, "alpha"}, + {(int)BlendMode::add, "add"}, + {(int)BlendMode::sub, "sub"}, + {(int)BlendMode::screen, "screen"}, + {0, nullptr}, + }; + + luaL_checktype(L, -1, LUA_TSTRING); + int v = (int)BlendMode::alpha; + if (!string_to_enum(opts, v, lua_tostring(L, -1))) { + throw LuaError("blend mode must be one of ('alpha', 'add', 'sub', 'screen')"); + } + ret = (BlendMode)v; + } + + template <typename T> void + readLuaValue(lua_State* L, RangedParameter<T>& field) + { + if (lua_isnil(L,-1)) + return; + if (!lua_istable(L,-1)) // is this is just a literal value? + goto set_uniform; + + lua_getfield(L, -1, "min"); + // handle convenience syntax for non-range values + if (lua_isnil(L,-1)) { + lua_pop(L, 1); + goto set_uniform; + } + readLuaValue(L,field.min); + lua_pop(L, 1); + + lua_getfield(L, -1, "max"); + readLuaValue(L,field.max); + lua_pop(L, 1); + + lua_getfield(L, -1, "bias"); + if (!lua_isnil(L,-1)) + readLuaValue(L,field.bias); + lua_pop(L, 1); + return; + + set_uniform: + readLuaValue(L, field.min); + readLuaValue(L, field.max); + } + + template <typename T> void + readLegacyValue(lua_State* L, const char* name, T& field) {} + + template <typename T> void + readLegacyValue(lua_State* L, const char* name, RangedParameter<T>& field) + { + int tbl = lua_gettop(L); + lua_pushliteral(L, "min"); + lua_pushstring(L, name); + lua_concat(L, 2); + lua_gettable(L, tbl); + if (!lua_isnil(L, -1)) { + readLuaValue(L, field.min); + } + lua_settop(L, tbl); + + lua_pushliteral(L, "max"); + lua_pushstring(L, name); + lua_concat(L, 2); + lua_gettable(L, tbl); + if (!lua_isnil(L, -1)) { + readLuaValue(L, field.max); + } + lua_settop(L, tbl); + } + + template <typename T> void + readTweenTable(lua_State* L, const char* name, TweenedParameter<T>& field) + { + int tbl = lua_gettop(L); + + lua_pushstring(L, name); + lua_pushliteral(L, "_tween"); + lua_concat(L, 2); + lua_gettable(L, tbl); + if(lua_istable(L, -1)) { + int tween = lua_gettop(L); + // get the starting value + lua_pushinteger(L, 1), lua_gettable(L, tween); + readLuaValue(L, field.start); + lua_pop(L, 1); + + // get the final value -- use len instead of 2 so that this + // gracefully degrades if keyframe support is later added + lua_pushinteger(L, (lua_Integer)lua_objlen(L, -1)), lua_gettable(L, tween); + readLuaValue(L, field.end); + lua_pop(L, 1); + + // get the effect settings + lua_getfield(L, -1, "style"); + if (!lua_isnil(L,-1)) + readLuaValue(L, field.style); + lua_pop(L, 1); + + lua_getfield(L, -1, "reps"); + if (!lua_isnil(L,-1)) + readLuaValue(L, field.reps); + lua_pop(L, 1); + + lua_getfield(L, -1, "start"); + if (!lua_isnil(L,-1)) + readLuaValue(L, field.beginning); + lua_pop(L, 1); + + goto done; + } else { + lua_pop(L,1); + } + // the table is not present; check for nonanimated values + + lua_getfield(L, tbl, name); + if(!lua_isnil(L, -1)) { + readLuaValue(L, field.start); + lua_settop(L, tbl); + goto set_uniform; + } else { + lua_pop(L,1); + } + + // the goto did not trigger, so this table is not present either + // check for pre-5.6.0 legacy values + readLegacyValue(L, name, field.start); + + set_uniform: + field.end = field.start; + done: + lua_settop(L, tbl); // clean up after ourselves + } + + inline u16 readAttachmentID(lua_State* L, const char* name) + { + u16 id = 0; + lua_getfield(L, -1, name); + if (!lua_isnil(L, -1)) { + ObjectRef *ref = ObjectRef::checkobject(L, -1); + if (auto obj = ObjectRef::getobject(ref)) + id = obj->getId(); + } + lua_pop(L, 1); + return id; + } + + void readTexValue(lua_State* L, ServerParticleTexture& tex); +} diff --git a/src/script/lua_api/l_particles.cpp b/src/script/lua_api/l_particles.cpp index a51c4fe20..586c7dc73 100644 --- a/src/script/lua_api/l_particles.cpp +++ b/src/script/lua_api/l_particles.cpp @@ -20,30 +20,50 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_particles.h" #include "lua_api/l_object.h" #include "lua_api/l_internal.h" +#include "lua_api/l_particleparams.h" #include "common/c_converter.h" #include "common/c_content.h" #include "server.h" #include "particles.h" -// add_particle({pos=, velocity=, acceleration=, expirationtime=, -// size=, collisiondetection=, collision_removal=, object_collision=, -// vertical=, texture=, player=}) -// pos/velocity/acceleration = {x=num, y=num, z=num} -// expirationtime = num (seconds) -// size = num -// collisiondetection = bool -// collision_removal = bool -// object_collision = bool -// vertical = bool -// texture = e.g."default_wood.png" -// animation = TileAnimation definition -// glow = num +void LuaParticleParams::readTexValue(lua_State* L, ServerParticleTexture& tex) +{ + StackUnroller unroll(L); + + tex.animated = false; + if (lua_isstring(L, -1)) { + tex.string = lua_tostring(L, -1); + return; + } + + luaL_checktype(L, -1, LUA_TTABLE); + lua_getfield(L, -1, "name"); + tex.string = luaL_checkstring(L, -1); + lua_pop(L, 1); + + lua_getfield(L, -1, "animation"); + if (! lua_isnil(L, -1)) { + tex.animated = true; + tex.animation = read_animation_definition(L, -1); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "blend"); + LuaParticleParams::readLuaValue(L, tex.blendmode); + lua_pop(L, 1); + + LuaParticleParams::readTweenTable(L, "alpha", tex.alpha); + LuaParticleParams::readTweenTable(L, "scale", tex.scale); + +} + +// add_particle({...}) int ModApiParticles::l_add_particle(lua_State *L) { NO_MAP_LOCK_REQUIRED; // Get parameters - struct ParticleParameters p; + ParticleParameters p; std::string playername; if (lua_gettop(L) > 1) // deprecated @@ -56,7 +76,7 @@ int ModApiParticles::l_add_particle(lua_State *L) p.expirationtime = luaL_checknumber(L, 4); p.size = luaL_checknumber(L, 5); p.collisiondetection = readParam<bool>(L, 6); - p.texture = luaL_checkstring(L, 7); + p.texture.string = luaL_checkstring(L, 7); if (lua_gettop(L) == 8) // only spawn for a single player playername = luaL_checkstring(L, 8); } @@ -108,7 +128,12 @@ int ModApiParticles::l_add_particle(lua_State *L) p.animation = read_animation_definition(L, -1); lua_pop(L, 1); - p.texture = getstringfield_default(L, 1, "texture", p.texture); + lua_getfield(L, 1, "texture"); + if (!lua_isnil(L, -1)) { + LuaParticleParams::readTexValue(L, p.texture); + } + lua_pop(L, 1); + p.glow = getintfield_default(L, 1, "glow", p.glow); lua_getfield(L, 1, "node"); @@ -119,34 +144,26 @@ int ModApiParticles::l_add_particle(lua_State *L) p.node_tile = getintfield_default(L, 1, "node_tile", p.node_tile); playername = getstringfield_default(L, 1, "playername", ""); + + lua_getfield(L, 1, "drag"); + if (lua_istable(L, -1)) + p.drag = check_v3f(L, -1); + lua_pop(L, 1); + + lua_getfield(L, 1, "jitter"); + LuaParticleParams::readLuaValue(L, p.jitter); + lua_pop(L, 1); + + lua_getfield(L, 1, "bounce"); + LuaParticleParams::readLuaValue(L, p.bounce); + lua_pop(L, 1); } getServer(L)->spawnParticle(playername, p); return 1; } -// add_particlespawner({amount=, time=, -// minpos=, maxpos=, -// minvel=, maxvel=, -// minacc=, maxacc=, -// minexptime=, maxexptime=, -// minsize=, maxsize=, -// collisiondetection=, -// collision_removal=, -// object_collision=, -// vertical=, -// texture=, -// player=}) -// minpos/maxpos/minvel/maxvel/minacc/maxacc = {x=num, y=num, z=num} -// minexptime/maxexptime = num (seconds) -// minsize/maxsize = num -// collisiondetection = bool -// collision_removal = bool -// object_collision = bool -// vertical = bool -// texture = e.g."default_wood.png" -// animation = TileAnimation definition -// glow = num +// add_particlespawner({...}) int ModApiParticles::l_add_particlespawner(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -156,24 +173,31 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) ServerActiveObject *attached = NULL; std::string playername; + using namespace ParticleParamTypes; if (lua_gettop(L) > 1) //deprecated { log_deprecated(L, "Deprecated add_particlespawner call with " "individual parameters instead of definition"); p.amount = luaL_checknumber(L, 1); p.time = luaL_checknumber(L, 2); - p.minpos = check_v3f(L, 3); - p.maxpos = check_v3f(L, 4); - p.minvel = check_v3f(L, 5); - p.maxvel = check_v3f(L, 6); - p.minacc = check_v3f(L, 7); - p.maxacc = check_v3f(L, 8); - p.minexptime = luaL_checknumber(L, 9); - p.maxexptime = luaL_checknumber(L, 10); - p.minsize = luaL_checknumber(L, 11); - p.maxsize = luaL_checknumber(L, 12); + auto minpos = check_v3f(L, 3); + auto maxpos = check_v3f(L, 4); + auto minvel = check_v3f(L, 5); + auto maxvel = check_v3f(L, 6); + auto minacc = check_v3f(L, 7); + auto maxacc = check_v3f(L, 8); + auto minexptime = luaL_checknumber(L, 9); + auto maxexptime = luaL_checknumber(L, 10); + auto minsize = luaL_checknumber(L, 11); + auto maxsize = luaL_checknumber(L, 12); + p.pos = v3fRange(minpos, maxpos); + p.vel = v3fRange(minvel, maxvel); + p.acc = v3fRange(minacc, maxacc); + p.exptime = f32Range(minexptime, maxexptime); + p.size = f32Range(minsize, maxsize); + p.collisiondetection = readParam<bool>(L, 13); - p.texture = luaL_checkstring(L, 14); + p.texture.string = luaL_checkstring(L, 14); if (lua_gettop(L) == 15) // only spawn for a single player playername = luaL_checkstring(L, 15); } @@ -182,40 +206,46 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) p.amount = getintfield_default(L, 1, "amount", p.amount); p.time = getfloatfield_default(L, 1, "time", p.time); - lua_getfield(L, 1, "minpos"); - if (lua_istable(L, -1)) - p.minpos = check_v3f(L, -1); - lua_pop(L, 1); + // set default values + p.exptime = 1; + p.size = 1; - lua_getfield(L, 1, "maxpos"); - if (lua_istable(L, -1)) - p.maxpos = check_v3f(L, -1); - lua_pop(L, 1); + // read spawner parameters from the table + LuaParticleParams::readTweenTable(L, "pos", p.pos); + LuaParticleParams::readTweenTable(L, "vel", p.vel); + LuaParticleParams::readTweenTable(L, "acc", p.acc); + LuaParticleParams::readTweenTable(L, "size", p.size); + LuaParticleParams::readTweenTable(L, "exptime", p.exptime); + LuaParticleParams::readTweenTable(L, "drag", p.drag); + LuaParticleParams::readTweenTable(L, "jitter", p.jitter); + LuaParticleParams::readTweenTable(L, "bounce", p.bounce); + lua_getfield(L, 1, "attract"); + if (!lua_isnil(L, -1)) { + luaL_checktype(L, -1, LUA_TTABLE); + lua_getfield(L, -1, "kind"); + LuaParticleParams::readLuaValue(L, p.attractor_kind); + lua_pop(L,1); - lua_getfield(L, 1, "minvel"); - if (lua_istable(L, -1)) - p.minvel = check_v3f(L, -1); - lua_pop(L, 1); + lua_getfield(L, -1, "die_on_contact"); + if (!lua_isnil(L, -1)) + p.attractor_kill = readParam<bool>(L, -1); + lua_pop(L,1); - lua_getfield(L, 1, "maxvel"); - if (lua_istable(L, -1)) - p.maxvel = check_v3f(L, -1); - lua_pop(L, 1); + if (p.attractor_kind != AttractorKind::none) { + LuaParticleParams::readTweenTable(L, "strength", p.attract); + LuaParticleParams::readTweenTable(L, "origin", p.attractor_origin); + p.attractor_attachment = LuaParticleParams::readAttachmentID(L, "origin_attached"); + if (p.attractor_kind != AttractorKind::point) { + LuaParticleParams::readTweenTable(L, "direction", p.attractor_direction); + p.attractor_direction_attachment = LuaParticleParams::readAttachmentID(L, "direction_attached"); + } + } + } else { + p.attractor_kind = AttractorKind::none; + } + lua_pop(L,1); + LuaParticleParams::readTweenTable(L, "radius", p.radius); - lua_getfield(L, 1, "minacc"); - if (lua_istable(L, -1)) - p.minacc = check_v3f(L, -1); - lua_pop(L, 1); - - lua_getfield(L, 1, "maxacc"); - if (lua_istable(L, -1)) - p.maxacc = check_v3f(L, -1); - lua_pop(L, 1); - - p.minexptime = getfloatfield_default(L, 1, "minexptime", p.minexptime); - p.maxexptime = getfloatfield_default(L, 1, "maxexptime", p.maxexptime); - p.minsize = getfloatfield_default(L, 1, "minsize", p.minsize); - p.maxsize = getfloatfield_default(L, 1, "maxsize", p.maxsize); p.collisiondetection = getboolfield_default(L, 1, "collisiondetection", p.collisiondetection); p.collision_removal = getboolfield_default(L, 1, @@ -234,11 +264,29 @@ int ModApiParticles::l_add_particlespawner(lua_State *L) attached = ObjectRef::getobject(ref); } + lua_getfield(L, 1, "texture"); + if (!lua_isnil(L, -1)) { + LuaParticleParams::readTexValue(L, p.texture); + } + lua_pop(L, 1); + p.vertical = getboolfield_default(L, 1, "vertical", p.vertical); - p.texture = getstringfield_default(L, 1, "texture", p.texture); playername = getstringfield_default(L, 1, "playername", ""); p.glow = getintfield_default(L, 1, "glow", p.glow); + lua_getfield(L, 1, "texpool"); + if (lua_istable(L, -1)) { + size_t tl = lua_objlen(L, -1); + p.texpool.reserve(tl); + for (size_t i = 0; i < tl; ++i) { + lua_pushinteger(L, i+1), lua_gettable(L, -2); + p.texpool.emplace_back(); + LuaParticleParams::readTexValue(L, p.texpool.back()); + lua_pop(L,1); + } + } + lua_pop(L, 1); + lua_getfield(L, 1, "node"); if (lua_istable(L, -1)) p.node = readnode(L, -1, getGameDef(L)->ndef()); diff --git a/src/script/lua_api/l_particles_local.cpp b/src/script/lua_api/l_particles_local.cpp index cc68b13a5..62cbab8e9 100644 --- a/src/script/lua_api/l_particles_local.cpp +++ b/src/script/lua_api/l_particles_local.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_converter.h" #include "lua_api/l_internal.h" #include "lua_api/l_object.h" +#include "lua_api/l_particleparams.h" #include "client/particles.h" #include "client/client.h" #include "client/clientevent.h" @@ -49,6 +50,19 @@ int ModApiParticlesLocal::l_add_particle(lua_State *L) p.acc = check_v3f(L, -1); lua_pop(L, 1); + lua_getfield(L, 1, "drag"); + if (lua_istable(L, -1)) + p.drag = check_v3f(L, -1); + lua_pop(L, 1); + + lua_getfield(L, 1, "jitter"); + LuaParticleParams::readLuaValue(L, p.jitter); + lua_pop(L, 1); + + lua_getfield(L, 1, "bounce"); + LuaParticleParams::readLuaValue(L, p.bounce); + lua_pop(L, 1); + p.expirationtime = getfloatfield_default(L, 1, "expirationtime", p.expirationtime); p.size = getfloatfield_default(L, 1, "size", p.size); @@ -64,7 +78,11 @@ int ModApiParticlesLocal::l_add_particle(lua_State *L) p.animation = read_animation_definition(L, -1); lua_pop(L, 1); - p.texture = getstringfield_default(L, 1, "texture", p.texture); + lua_getfield(L, 1, "texture"); + if (!lua_isnil(L, -1)) { + LuaParticleParams::readTexValue(L,p.texture); + } + lua_pop(L, 1); p.glow = getintfield_default(L, 1, "glow", p.glow); lua_getfield(L, 1, "node"); @@ -88,44 +106,50 @@ int ModApiParticlesLocal::l_add_particlespawner(lua_State *L) // Get parameters ParticleSpawnerParameters p; - p.amount = getintfield_default(L, 1, "amount", p.amount); p.time = getfloatfield_default(L, 1, "time", p.time); - lua_getfield(L, 1, "minpos"); - if (lua_istable(L, -1)) - p.minpos = check_v3f(L, -1); - lua_pop(L, 1); + // set default values + p.exptime = 1; + p.size = 1; - lua_getfield(L, 1, "maxpos"); - if (lua_istable(L, -1)) - p.maxpos = check_v3f(L, -1); - lua_pop(L, 1); + // read spawner parameters from the table + using namespace ParticleParamTypes; + LuaParticleParams::readTweenTable(L, "pos", p.pos); + LuaParticleParams::readTweenTable(L, "vel", p.vel); + LuaParticleParams::readTweenTable(L, "acc", p.acc); + LuaParticleParams::readTweenTable(L, "size", p.size); + LuaParticleParams::readTweenTable(L, "exptime", p.exptime); + LuaParticleParams::readTweenTable(L, "drag", p.drag); + LuaParticleParams::readTweenTable(L, "jitter", p.jitter); + LuaParticleParams::readTweenTable(L, "bounce", p.bounce); + lua_getfield(L, 1, "attract"); + if (!lua_isnil(L, -1)) { + luaL_checktype(L, -1, LUA_TTABLE); + lua_getfield(L, -1, "kind"); + LuaParticleParams::readLuaValue(L, p.attractor_kind); + lua_pop(L,1); - lua_getfield(L, 1, "minvel"); - if (lua_istable(L, -1)) - p.minvel = check_v3f(L, -1); - lua_pop(L, 1); + lua_getfield(L, -1, "die_on_contact"); + if (!lua_isnil(L, -1)) + p.attractor_kill = readParam<bool>(L, -1); + lua_pop(L,1); - lua_getfield(L, 1, "maxvel"); - if (lua_istable(L, -1)) - p.maxvel = check_v3f(L, -1); - lua_pop(L, 1); + if (p.attractor_kind != AttractorKind::none) { + LuaParticleParams::readTweenTable(L, "strength", p.attract); + LuaParticleParams::readTweenTable(L, "origin", p.attractor_origin); + p.attractor_attachment = LuaParticleParams::readAttachmentID(L, "origin_attached"); + if (p.attractor_kind != AttractorKind::point) { + LuaParticleParams::readTweenTable(L, "direction", p.attractor_direction); + p.attractor_direction_attachment = LuaParticleParams::readAttachmentID(L, "direction_attached"); + } + } + } else { + p.attractor_kind = AttractorKind::none; + } + lua_pop(L,1); + LuaParticleParams::readTweenTable(L, "radius", p.radius); - lua_getfield(L, 1, "minacc"); - if (lua_istable(L, -1)) - p.minacc = check_v3f(L, -1); - lua_pop(L, 1); - - lua_getfield(L, 1, "maxacc"); - if (lua_istable(L, -1)) - p.maxacc = check_v3f(L, -1); - lua_pop(L, 1); - - p.minexptime = getfloatfield_default(L, 1, "minexptime", p.minexptime); - p.maxexptime = getfloatfield_default(L, 1, "maxexptime", p.maxexptime); - p.minsize = getfloatfield_default(L, 1, "minsize", p.minsize); - p.maxsize = getfloatfield_default(L, 1, "maxsize", p.maxsize); p.collisiondetection = getboolfield_default(L, 1, "collisiondetection", p.collisiondetection); p.collision_removal = getboolfield_default(L, 1, @@ -137,10 +161,28 @@ int ModApiParticlesLocal::l_add_particlespawner(lua_State *L) p.animation = read_animation_definition(L, -1); lua_pop(L, 1); + lua_getfield(L, 1, "texture"); + if (!lua_isnil(L, -1)) { + LuaParticleParams::readTexValue(L, p.texture); + } + lua_pop(L, 1); + p.vertical = getboolfield_default(L, 1, "vertical", p.vertical); - p.texture = getstringfield_default(L, 1, "texture", p.texture); p.glow = getintfield_default(L, 1, "glow", p.glow); + lua_getfield(L, 1, "texpool"); + if (lua_istable(L, -1)) { + size_t tl = lua_objlen(L, -1); + p.texpool.reserve(tl); + for (size_t i = 0; i < tl; ++i) { + lua_pushinteger(L, i+1), lua_gettable(L, -2); + p.texpool.emplace_back(); + LuaParticleParams::readTexValue(L, p.texpool.back()); + lua_pop(L,1); + } + } + lua_pop(L, 1); + lua_getfield(L, 1, "node"); if (lua_istable(L, -1)) p.node = readnode(L, -1, getGameDef(L)->ndef()); diff --git a/src/script/lua_api/l_playermeta.cpp b/src/script/lua_api/l_playermeta.cpp index 558672e38..2706c99df 100644 --- a/src/script/lua_api/l_playermeta.cpp +++ b/src/script/lua_api/l_playermeta.cpp @@ -97,7 +97,7 @@ void PlayerMetaRef::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); + luaL_register(L, nullptr, methods); lua_pop(L, 1); // Cannot be created from Lua diff --git a/src/script/lua_api/l_server.cpp b/src/script/lua_api/l_server.cpp index 6f934bb9d..a5daae346 100644 --- a/src/script/lua_api/l_server.cpp +++ b/src/script/lua_api/l_server.cpp @@ -21,8 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_internal.h" #include "common/c_converter.h" #include "common/c_content.h" +#include "common/c_packer.h" #include "cpp_api/s_base.h" #include "cpp_api/s_security.h" +#include "scripting_server.h" #include "server.h" #include "environment.h" #include "remoteplayer.h" @@ -44,7 +46,7 @@ int ModApiServer::l_request_shutdown(lua_State *L) int ModApiServer::l_get_server_status(lua_State *L) { NO_MAP_LOCK_REQUIRED; - lua_pushstring(L, wide_to_narrow(getServer(L)->getStatusString()).c_str()); + lua_pushstring(L, getServer(L)->getStatusString().c_str()); return 1; } @@ -56,6 +58,14 @@ int ModApiServer::l_get_server_uptime(lua_State *L) return 1; } +// get_server_max_lag() +int ModApiServer::l_get_server_max_lag(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + GET_ENV_PTR; + lua_pushnumber(L, env->getMaxLagEstimate()); + return 1; +} // print(text) int ModApiServer::l_print(lua_State *L) @@ -116,24 +126,18 @@ int ModApiServer::l_get_player_privs(lua_State *L) int ModApiServer::l_get_player_ip(lua_State *L) { NO_MAP_LOCK_REQUIRED; - const char * name = luaL_checkstring(L, 1); - RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name); - if(player == NULL) - { + + Server *server = getServer(L); + + const char *name = luaL_checkstring(L, 1); + RemotePlayer *player = server->getEnv().getPlayer(name); + if (!player) { lua_pushnil(L); // no such player return 1; } - try - { - Address addr = getServer(L)->getPeerAddress(player->getPeerId()); - std::string ip_str = addr.serializeString(); - lua_pushstring(L, ip_str.c_str()); - return 1; - } catch (const con::PeerNotFoundException &) { - dstream << FUNCTION_NAME << ": peer was not found" << std::endl; - lua_pushnil(L); // error - return 1; - } + + lua_pushstring(L, server->getPeerAddress(player->getPeerId()).serializeString().c_str()); + return 1; } // get_player_information(name) @@ -150,26 +154,18 @@ int ModApiServer::l_get_player_information(lua_State *L) return 1; } - Address addr; - try { - addr = server->getPeerAddress(player->getPeerId()); - } catch (const con::PeerNotFoundException &) { - dstream << FUNCTION_NAME << ": peer was not found" << std::endl; - lua_pushnil(L); // error - return 1; - } - - float min_rtt, max_rtt, avg_rtt, min_jitter, max_jitter, avg_jitter; - ClientState state; - u32 uptime; - u16 prot_vers; - u8 ser_vers, major, minor, patch; - std::string vers_string, lang_code; + /* + Be careful not to introduce a depdendency on the connection to + the peer here. This function is >>REQUIRED<< to still be able to return + values even when the peer unexpectedly disappears. + Hence all the ConInfo values here are optional. + */ auto getConInfo = [&] (con::rtt_stat_type type, float *value) -> bool { return server->getClientConInfo(player->getPeerId(), type, value); }; + float min_rtt, max_rtt, avg_rtt, min_jitter, max_jitter, avg_jitter; bool have_con_info = getConInfo(con::MIN_RTT, &min_rtt) && getConInfo(con::MAX_RTT, &max_rtt) && @@ -178,11 +174,9 @@ int ModApiServer::l_get_player_information(lua_State *L) getConInfo(con::MAX_JITTER, &max_jitter) && getConInfo(con::AVG_JITTER, &avg_jitter); - bool r = server->getClientInfo(player->getPeerId(), &state, &uptime, - &ser_vers, &prot_vers, &major, &minor, &patch, &vers_string, - &lang_code); - if (!r) { - dstream << FUNCTION_NAME << ": peer was not found" << std::endl; + ClientInfo info; + if (!server->getClientInfo(player->getPeerId(), info)) { + warningstream << FUNCTION_NAME << ": no client info?!" << std::endl; lua_pushnil(L); // error return 1; } @@ -191,13 +185,13 @@ int ModApiServer::l_get_player_information(lua_State *L) int table = lua_gettop(L); lua_pushstring(L,"address"); - lua_pushstring(L, addr.serializeString().c_str()); + lua_pushstring(L, info.addr.serializeString().c_str()); lua_settable(L, table); lua_pushstring(L,"ip_version"); - if (addr.getFamily() == AF_INET) { + if (info.addr.getFamily() == AF_INET) { lua_pushnumber(L, 4); - } else if (addr.getFamily() == AF_INET6) { + } else if (info.addr.getFamily() == AF_INET6) { lua_pushnumber(L, 6); } else { lua_pushnumber(L, 0); @@ -231,11 +225,11 @@ int ModApiServer::l_get_player_information(lua_State *L) } lua_pushstring(L,"connection_uptime"); - lua_pushnumber(L, uptime); + lua_pushnumber(L, info.uptime); lua_settable(L, table); lua_pushstring(L,"protocol_version"); - lua_pushnumber(L, prot_vers); + lua_pushnumber(L, info.prot_vers); lua_settable(L, table); lua_pushstring(L, "formspec_version"); @@ -243,32 +237,32 @@ int ModApiServer::l_get_player_information(lua_State *L) lua_settable(L, table); lua_pushstring(L, "lang_code"); - lua_pushstring(L, lang_code.c_str()); + lua_pushstring(L, info.lang_code.c_str()); lua_settable(L, table); #ifndef NDEBUG lua_pushstring(L,"serialization_version"); - lua_pushnumber(L, ser_vers); + lua_pushnumber(L, info.ser_vers); lua_settable(L, table); lua_pushstring(L,"major"); - lua_pushnumber(L, major); + lua_pushnumber(L, info.major); lua_settable(L, table); lua_pushstring(L,"minor"); - lua_pushnumber(L, minor); + lua_pushnumber(L, info.minor); lua_settable(L, table); lua_pushstring(L,"patch"); - lua_pushnumber(L, patch); + lua_pushnumber(L, info.patch); lua_settable(L, table); lua_pushstring(L,"version_string"); - lua_pushstring(L, vers_string.c_str()); + lua_pushstring(L, info.vers_string.c_str()); lua_settable(L, table); lua_pushstring(L,"state"); - lua_pushstring(L,ClientInterface::state2Name(state).c_str()); + lua_pushstring(L, ClientInterface::state2Name(info.state).c_str()); lua_settable(L, table); #endif @@ -296,44 +290,48 @@ int ModApiServer::l_get_ban_description(lua_State *L) int ModApiServer::l_ban_player(lua_State *L) { NO_MAP_LOCK_REQUIRED; - const char * name = luaL_checkstring(L, 1); - RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name); - if (player == NULL) { + + if (!getEnv(L)) + throw LuaError("Can't ban player before server has started up"); + + Server *server = getServer(L); + const char *name = luaL_checkstring(L, 1); + RemotePlayer *player = server->getEnv().getPlayer(name); + if (!player) { lua_pushboolean(L, false); // no such player return 1; } - try - { - Address addr = getServer(L)->getPeerAddress( - dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name)->getPeerId()); - std::string ip_str = addr.serializeString(); - getServer(L)->setIpBanned(ip_str, name); - } catch(const con::PeerNotFoundException &) { - dstream << FUNCTION_NAME << ": peer was not found" << std::endl; - lua_pushboolean(L, false); // error - return 1; - } + + std::string ip_str = server->getPeerAddress(player->getPeerId()).serializeString(); + server->setIpBanned(ip_str, name); lua_pushboolean(L, true); return 1; } -// kick_player(name, [reason]) -> success -int ModApiServer::l_kick_player(lua_State *L) +// disconnect_player(name, [reason]) -> success +int ModApiServer::l_disconnect_player(lua_State *L) { NO_MAP_LOCK_REQUIRED; - const char *name = luaL_checkstring(L, 1); - std::string message("Kicked"); - if (lua_isstring(L, 2)) - message.append(": ").append(readParam<std::string>(L, 2)); - else - message.append("."); - RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name); - if (player == NULL) { + if (!getEnv(L)) + throw LuaError("Can't kick player before server has started up"); + + const char *name = luaL_checkstring(L, 1); + std::string message; + if (lua_isstring(L, 2)) + message.append(readParam<std::string>(L, 2)); + else + message.append("Disconnected."); + + Server *server = getServer(L); + + RemotePlayer *player = server->getEnv().getPlayer(name); + if (!player) { lua_pushboolean(L, false); // No such player return 1; } - getServer(L)->DenyAccess_Legacy(player->getPeerId(), utf8_to_wide(message)); + + server->DenyAccess(player->getPeerId(), SERVER_ACCESSDENIED_CUSTOM_STRING, message); lua_pushboolean(L, true); return 1; } @@ -343,7 +341,8 @@ int ModApiServer::l_remove_player(lua_State *L) NO_MAP_LOCK_REQUIRED; std::string name = luaL_checkstring(L, 1); ServerEnvironment *s_env = dynamic_cast<ServerEnvironment *>(getEnv(L)); - assert(s_env); + if (!s_env) + throw LuaError("Can't remove player before server has started up"); RemotePlayer *player = s_env->getPlayer(name.c_str()); if (!player) @@ -394,12 +393,11 @@ int ModApiServer::l_get_modpath(lua_State *L) { NO_MAP_LOCK_REQUIRED; std::string modname = luaL_checkstring(L, 1); - const ModSpec *mod = getServer(L)->getModSpec(modname); - if (!mod) { + const ModSpec *mod = getGameDef(L)->getModSpec(modname); + if (!mod) lua_pushnil(L); - return 1; - } - lua_pushstring(L, mod->path.c_str()); + else + lua_pushstring(L, mod->path.c_str()); return 1; } @@ -411,13 +409,14 @@ int ModApiServer::l_get_modnames(lua_State *L) // Get a list of mods std::vector<std::string> modlist; - getServer(L)->getModNames(modlist); + for (auto &it : getGameDef(L)->getMods()) + modlist.emplace_back(it.name); std::sort(modlist.begin(), modlist.end()); // Package them up for Lua lua_createtable(L, modlist.size(), 0); - std::vector<std::string>::iterator iter = modlist.begin(); + auto iter = modlist.begin(); for (u16 i = 0; iter != modlist.end(); ++iter) { lua_pushstring(L, iter->c_str()); lua_rawseti(L, -2, ++i); @@ -429,8 +428,8 @@ int ModApiServer::l_get_modnames(lua_State *L) int ModApiServer::l_get_worldpath(lua_State *L) { NO_MAP_LOCK_REQUIRED; - std::string worldpath = getServer(L)->getWorldPath(); - lua_pushstring(L, worldpath.c_str()); + const Server *srv = getServer(L); + lua_pushstring(L, srv->getWorldPath().c_str()); return 1; } @@ -438,16 +437,15 @@ int ModApiServer::l_get_worldpath(lua_State *L) int ModApiServer::l_sound_play(lua_State *L) { NO_MAP_LOCK_REQUIRED; - SimpleSoundSpec spec; - read_soundspec(L, 1, spec); - ServerSoundParams params; + ServerPlayingSound params; + read_soundspec(L, 1, params.spec); read_server_sound_params(L, 2, params); bool ephemeral = lua_gettop(L) > 2 && readParam<bool>(L, 3); if (ephemeral) { - getServer(L)->playSound(spec, params, true); + getServer(L)->playSound(params, true); lua_pushnil(L); } else { - s32 handle = getServer(L)->playSound(spec, params); + s32 handle = getServer(L)->playSound(params); lua_pushinteger(L, handle); } return 1; @@ -477,15 +475,34 @@ int ModApiServer::l_dynamic_add_media(lua_State *L) { NO_MAP_LOCK_REQUIRED; - // Reject adding media before the server has started up if (!getEnv(L)) throw LuaError("Dynamic media cannot be added before server has started up"); + Server *server = getServer(L); + + std::string filepath; + std::string to_player; + bool ephemeral = false; + + if (lua_istable(L, 1)) { + getstringfield(L, 1, "filepath", filepath); + getstringfield(L, 1, "to_player", to_player); + getboolfield(L, 1, "ephemeral", ephemeral); + } else { + filepath = readParam<std::string>(L, 1); + } + if (filepath.empty()) + luaL_typerror(L, 1, "non-empty string"); + luaL_checktype(L, 2, LUA_TFUNCTION); - std::string filepath = readParam<std::string>(L, 1); CHECK_SECURE_PATH(L, filepath.c_str(), false); - bool ok = getServer(L)->dynamicAddMedia(filepath); + u32 token = server->getScriptIface()->allocateDynamicMediaCallback(L, 2); + + bool ok = server->dynamicAddMedia(filepath, token, to_player, ephemeral); + if (!ok) + server->getScriptIface()->freeDynamicMediaCallback(token); lua_pushboolean(L, ok); + return 1; } @@ -493,7 +510,8 @@ int ModApiServer::l_dynamic_add_media(lua_State *L) int ModApiServer::l_is_singleplayer(lua_State *L) { NO_MAP_LOCK_REQUIRED; - lua_pushboolean(L, getServer(L)->isSingleplayer()); + const Server *srv = getServer(L); + lua_pushboolean(L, srv->isSingleplayer()); return 1; } @@ -508,29 +526,74 @@ int ModApiServer::l_notify_authentication_modified(lua_State *L) return 0; } -// get_last_run_mod() -int ModApiServer::l_get_last_run_mod(lua_State *L) +// do_async_callback(func, params, mod_origin) +int ModApiServer::l_do_async_callback(lua_State *L) { NO_MAP_LOCK_REQUIRED; - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); - std::string current_mod = readParam<std::string>(L, -1, ""); - if (current_mod.empty()) { - lua_pop(L, 1); - lua_pushstring(L, getScriptApiBase(L)->getOrigin().c_str()); - } + ServerScripting *script = getScriptApi<ServerScripting>(L); + + luaL_checktype(L, 1, LUA_TFUNCTION); + luaL_checktype(L, 2, LUA_TTABLE); + luaL_checktype(L, 3, LUA_TSTRING); + + call_string_dump(L, 1); + size_t func_length; + const char *serialized_func_raw = lua_tolstring(L, -1, &func_length); + + PackedValue *param = script_pack(L, 2); + + std::string mod_origin = readParam<std::string>(L, 3); + + u32 jobId = script->queueAsync( + std::string(serialized_func_raw, func_length), + param, mod_origin); + + lua_settop(L, 0); + lua_pushinteger(L, jobId); return 1; } -// set_last_run_mod(modname) -int ModApiServer::l_set_last_run_mod(lua_State *L) +// register_async_dofile(path) +int ModApiServer::l_register_async_dofile(lua_State *L) { NO_MAP_LOCK_REQUIRED; -#ifdef SCRIPTAPI_DEBUG - const char *mod = lua_tostring(L, 1); - getScriptApiBase(L)->setOriginDirect(mod); - //printf(">>>> last mod set from Lua: %s\n", mod); + + std::string path = readParam<std::string>(L, 1); + CHECK_SECURE_PATH(L, path.c_str(), false); + + // Find currently running mod name (only at init time) + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); + if (!lua_isstring(L, -1)) + return 0; + std::string modname = readParam<std::string>(L, -1); + + getServer(L)->m_async_init_files.emplace_back(modname, path); + lua_pushboolean(L, true); + return 1; +} + +// serialize_roundtrip(value) +// Meant for unit testing the packer from Lua +int ModApiServer::l_serialize_roundtrip(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + int top = lua_gettop(L); + auto *pv = script_pack(L, 1); + if (top != lua_gettop(L)) + throw LuaError("stack values leaked"); + +#ifndef NDEBUG + script_dump_packed(pv); #endif - return 0; + + top = lua_gettop(L); + script_unpack(L, pv); + delete pv; + if (top + 1 != lua_gettop(L)) + throw LuaError("stack values leaked"); + + return 1; } void ModApiServer::Initialize(lua_State *L, int top) @@ -538,6 +601,7 @@ void ModApiServer::Initialize(lua_State *L, int top) API_FCT(request_shutdown); API_FCT(get_server_status); API_FCT(get_server_uptime); + API_FCT(get_server_max_lag); API_FCT(get_worldpath); API_FCT(is_singleplayer); @@ -561,11 +625,22 @@ void ModApiServer::Initialize(lua_State *L, int top) API_FCT(get_ban_list); API_FCT(get_ban_description); API_FCT(ban_player); - API_FCT(kick_player); + API_FCT(disconnect_player); API_FCT(remove_player); API_FCT(unban_player_or_ip); API_FCT(notify_authentication_modified); - API_FCT(get_last_run_mod); - API_FCT(set_last_run_mod); + API_FCT(do_async_callback); + API_FCT(register_async_dofile); + API_FCT(serialize_roundtrip); +} + +void ModApiServer::InitializeAsync(lua_State *L, int top) +{ + API_FCT(get_worldpath); + API_FCT(is_singleplayer); + + API_FCT(get_current_modname); + API_FCT(get_modpath); + API_FCT(get_modnames); } diff --git a/src/script/lua_api/l_server.h b/src/script/lua_api/l_server.h index 938bfa8ef..a4f38c34e 100644 --- a/src/script/lua_api/l_server.h +++ b/src/script/lua_api/l_server.h @@ -33,6 +33,9 @@ private: // get_server_uptime() static int l_get_server_uptime(lua_State *L); + // get_server_max_lag() + static int l_get_server_max_lag(lua_State *L); + // get_worldpath() static int l_get_worldpath(lua_State *L); @@ -94,8 +97,8 @@ private: // unban_player_or_ip() static int l_unban_player_or_ip(lua_State *L); - // kick_player(name, [message]) -> success - static int l_kick_player(lua_State *L); + // disconnect_player(name, [reason]) -> success + static int l_disconnect_player(lua_State *L); // remove_player(name) static int l_remove_player(lua_State *L); @@ -103,12 +106,16 @@ private: // notify_authentication_modified(name) static int l_notify_authentication_modified(lua_State *L); - // get_last_run_mod() - static int l_get_last_run_mod(lua_State *L); + // do_async_callback(func, params, mod_origin) + static int l_do_async_callback(lua_State *L); - // set_last_run_mod(modname) - static int l_set_last_run_mod(lua_State *L); + // register_async_dofile(path) + static int l_register_async_dofile(lua_State *L); + + // serialize_roundtrip(obj) + static int l_serialize_roundtrip(lua_State *L); public: static void Initialize(lua_State *L, int top); + static void InitializeAsync(lua_State *L, int top); }; diff --git a/src/script/lua_api/l_settings.cpp b/src/script/lua_api/l_settings.cpp index 33eb02392..3f3fda56e 100644 --- a/src/script/lua_api/l_settings.cpp +++ b/src/script/lua_api/l_settings.cpp @@ -20,18 +20,56 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_settings.h" #include "lua_api/l_internal.h" #include "cpp_api/s_security.h" +#include "threading/mutex_auto_lock.h" #include "util/string.h" // FlagDesc #include "settings.h" #include "noise.h" #include "log.h" -#define SET_SECURITY_CHECK(L, name) \ - if (o->m_settings == g_settings && ScriptApiSecurity::isSecure(L) && \ - name.compare(0, 7, "secure.") == 0) { \ - throw LuaError("Attempt to set secure setting."); \ +/* This protects the following from being set: + * 'secure.*' settings + * some security-relevant settings + * (better solution pending) + * some mapgen settings + * (not security-criticial, just to avoid messing up user configs) + */ +#define CHECK_SETTING_SECURITY(L, name) \ + if (o->m_settings == g_settings) { \ + if (checkSettingSecurity(L, name) == -1) \ + return 0; \ } +static inline int checkSettingSecurity(lua_State* L, const std::string &name) +{ + if (ScriptApiSecurity::isSecure(L) && name.compare(0, 7, "secure.") == 0) + throw LuaError("Attempted to set secure setting."); + + bool is_mainmenu = false; +#ifndef SERVER + is_mainmenu = ModApiBase::getGuiEngine(L) != nullptr; +#endif + if (!is_mainmenu && (name == "mg_name" || name == "mg_flags")) { + errorstream << "Tried to set global setting " << name << ", ignoring. " + "minetest.set_mapgen_setting() should be used instead." << std::endl; + infostream << script_get_backtrace(L) << std::endl; + return -1; + } + + const char *disallowed[] = { + "main_menu_script", "shader_path", "texture_path", "screenshot_path", + "serverlist_file", "serverlist_url", "map-dir", "contentdb_url", + }; + if (!is_mainmenu) { + for (const char *name2 : disallowed) { + if (name == name2) + throw LuaError("Attempted to set disallowed setting."); + } + } + + return 0; +} + LuaSettings::LuaSettings(Settings *settings, const std::string &filename) : m_settings(settings), m_filename(filename) @@ -129,6 +167,7 @@ int LuaSettings::l_get_np_group(lua_State *L) return 1; } +// get_flags(self, key) -> table or nil int LuaSettings::l_get_flags(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -161,7 +200,7 @@ int LuaSettings::l_set(lua_State* L) std::string key = std::string(luaL_checkstring(L, 2)); const char* value = luaL_checkstring(L, 3); - SET_SECURITY_CHECK(L, key); + CHECK_SETTING_SECURITY(L, key); if (!o->m_settings->set(key, value)) throw LuaError("Invalid sequence found in setting parameters"); @@ -178,14 +217,14 @@ int LuaSettings::l_set_bool(lua_State* L) std::string key = std::string(luaL_checkstring(L, 2)); bool value = readParam<bool>(L, 3); - SET_SECURITY_CHECK(L, key); + CHECK_SETTING_SECURITY(L, key); o->m_settings->setBool(key, value); - return 1; + return 0; } -// set(self, key, value) +// set_np_group(self, key, value) int LuaSettings::l_set_np_group(lua_State *L) { NO_MAP_LOCK_REQUIRED; @@ -195,9 +234,9 @@ int LuaSettings::l_set_np_group(lua_State *L) NoiseParams value; read_noiseparams(L, 3, &value); - SET_SECURITY_CHECK(L, key); + CHECK_SETTING_SECURITY(L, key); - o->m_settings->setNoiseParams(key, value, false); + o->m_settings->setNoiseParams(key, value); return 0; } @@ -210,7 +249,7 @@ int LuaSettings::l_remove(lua_State* L) std::string key = std::string(luaL_checkstring(L, 2)); - SET_SECURITY_CHECK(L, key); + CHECK_SETTING_SECURITY(L, key); bool success = o->m_settings->remove(key); lua_pushboolean(L, success); @@ -253,20 +292,36 @@ int LuaSettings::l_write(lua_State* L) return 1; } +static void push_settings_table(lua_State *L, const Settings *settings) +{ + std::vector<std::string> keys = settings->getNames(); + lua_newtable(L); + for (const std::string &key : keys) { + std::string value; + Settings *group = nullptr; + + if (settings->getNoEx(key, value)) { + lua_pushstring(L, value.c_str()); + } else if (settings->getGroupNoEx(key, group)) { + // Recursively push tables + push_settings_table(L, group); + } else { + // Impossible case (multithreading) due to MutexAutoLock + continue; + } + + lua_setfield(L, -2, key.c_str()); + } +} + // to_table(self) -> {[key1]=value1,...} int LuaSettings::l_to_table(lua_State* L) { NO_MAP_LOCK_REQUIRED; LuaSettings* o = checkobject(L, 1); - std::vector<std::string> keys = o->m_settings->getNames(); - - lua_newtable(L); - for (const std::string &key : keys) { - lua_pushstring(L, o->m_settings->get(key).c_str()); - lua_setfield(L, -2, key.c_str()); - } - + MutexAutoLock(o->m_settings->m_mutex); + push_settings_table(L, o->m_settings); return 1; } @@ -292,7 +347,7 @@ void LuaSettings::Register(lua_State* L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable // Can be created from Lua (Settings(filename)) diff --git a/src/script/lua_api/l_sound.cpp b/src/script/lua_api/l_sound.cpp index b86eda53e..934b4a07e 100644 --- a/src/script/lua_api/l_sound.cpp +++ b/src/script/lua_api/l_sound.cpp @@ -28,9 +28,9 @@ int ModApiSound::l_sound_play(lua_State *L) { SimpleSoundSpec spec; read_soundspec(L, 1, spec); - bool looped = readParam<bool>(L, 2); + spec.loop = readParam<bool>(L, 2); - s32 handle = getGuiEngine(L)->playSound(spec, looped); + s32 handle = getGuiEngine(L)->playSound(spec); lua_pushinteger(L, handle); diff --git a/src/script/lua_api/l_storage.cpp b/src/script/lua_api/l_storage.cpp index cba34fb63..b6c53e353 100644 --- a/src/script/lua_api/l_storage.cpp +++ b/src/script/lua_api/l_storage.cpp @@ -25,26 +25,26 @@ with this program; if not, write to the Free Software Foundation, Inc., int ModApiStorage::l_get_mod_storage(lua_State *L) { - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); - if (!lua_isstring(L, -1)) { - return 0; - } + // Note that this is wrapped in Lua, see builtin/common/mod_storage.lua + std::string mod_name = readParam<std::string>(L, 1); - std::string mod_name = readParam<std::string>(L, -1); + ModMetadata *store = nullptr; - ModMetadata *store = new ModMetadata(mod_name); if (IGameDef *gamedef = getGameDef(L)) { - store->load(gamedef->getModStoragePath()); - gamedef->registerModStorage(store); + store = new ModMetadata(mod_name, gamedef->getModStorageDatabase()); + if (gamedef->registerModStorage(store)) { + StorageRef::create(L, store); + int object = lua_gettop(L); + lua_pushvalue(L, object); + return 1; + } } else { - delete store; assert(false); // this should not happen } - StorageRef::create(L, store); - int object = lua_gettop(L); + delete store; - lua_pushvalue(L, object); + lua_pushnil(L); return 1; } @@ -110,7 +110,7 @@ void StorageRef::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable } diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp index cd63e20c2..f602aed99 100644 --- a/src/script/lua_api/l_util.cpp +++ b/src/script/lua_api/l_util.cpp @@ -17,6 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "irrlichttypes_extrabloated.h" #include "lua_api/l_util.h" #include "lua_api/l_internal.h" #include "lua_api/l_settings.h" @@ -39,8 +40,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "version.h" #include "util/hex.h" #include "util/sha1.h" -#include <algorithm> - +#include "util/png.h" +#include <cstdio> // log([level,] text) // Writes a line to the logger. @@ -158,28 +159,44 @@ int ModApiUtil::l_write_json(lua_State *L) return 1; } -// get_dig_params(groups, tool_capabilities) +// get_tool_wear_after_use(uses[, initial_wear]) +int ModApiUtil::l_get_tool_wear_after_use(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + u32 uses = readParam<int>(L, 1); + u16 initial_wear = readParam<int>(L, 2, 0); + u16 wear = calculateResultWear(uses, initial_wear); + lua_pushnumber(L, wear); + return 1; +} + +// get_dig_params(groups, tool_capabilities[, wear]) int ModApiUtil::l_get_dig_params(lua_State *L) { NO_MAP_LOCK_REQUIRED; ItemGroupList groups; read_groups(L, 1, groups); ToolCapabilities tp = read_tool_capabilities(L, 2); - push_dig_params(L, getDigParams(groups, &tp)); + if (lua_isnoneornil(L, 3)) { + push_dig_params(L, getDigParams(groups, &tp)); + } else { + u16 wear = readParam<int>(L, 3); + push_dig_params(L, getDigParams(groups, &tp, wear)); + } return 1; } -// get_hit_params(groups, tool_capabilities[, time_from_last_punch]) +// get_hit_params(groups, tool_capabilities[, time_from_last_punch, [, wear]]) int ModApiUtil::l_get_hit_params(lua_State *L) { NO_MAP_LOCK_REQUIRED; std::unordered_map<std::string, int> groups; read_groups(L, 1, groups); ToolCapabilities tp = read_tool_capabilities(L, 2); - if(lua_isnoneornil(L, 3)) - push_hit_params(L, getHitParams(groups, &tp)); - else - push_hit_params(L, getHitParams(groups, &tp, readParam<float>(L, 3))); + float time_from_last_punch = readParam<float>(L, 3, 1000000); + int wear = readParam<int>(L, 4, 0); + push_hit_params(L, getHitParams(groups, &tp, + time_from_last_punch, wear)); return 1; } @@ -239,15 +256,6 @@ int ModApiUtil::l_is_yes(lua_State *L) return 1; } -// is_nan(arg) -int ModApiUtil::l_is_nan(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - - lua_pushboolean(L, isNaN(L, 1)); - return 1; -} - // get_builtin_path() int ModApiUtil::l_get_builtin_path(lua_State *L) { @@ -259,6 +267,17 @@ int ModApiUtil::l_get_builtin_path(lua_State *L) return 1; } +// get_user_path() +int ModApiUtil::l_get_user_path(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + std::string path = porting::path_user; + lua_pushstring(L, path.c_str()); + + return 1; +} + // compress(data, method, level) int ModApiUtil::l_compress(lua_State *L) { @@ -268,11 +287,11 @@ int ModApiUtil::l_compress(lua_State *L) const char *data = luaL_checklstring(L, 1, &size); int level = -1; - if (!lua_isnone(L, 3) && !lua_isnil(L, 3)) - level = readParam<float>(L, 3); + if (!lua_isnoneornil(L, 3)) + level = readParam<int>(L, 3); - std::ostringstream os; - compressZlib(std::string(data, size), os, level); + std::ostringstream os(std::ios_base::binary); + compressZlib(reinterpret_cast<const u8 *>(data), size, os, level); std::string out = os.str(); @@ -288,8 +307,8 @@ int ModApiUtil::l_decompress(lua_State *L) size_t size; const char *data = luaL_checklstring(L, 1, &size); - std::istringstream is(std::string(data, size)); - std::ostringstream os; + std::istringstream is(std::string(data, size), std::ios_base::binary); + std::ostringstream os(std::ios_base::binary); decompressZlib(is, os); std::string out = os.str(); @@ -340,6 +359,49 @@ int ModApiUtil::l_mkdir(lua_State *L) return 1; } +// rmdir(path, recursive) +int ModApiUtil::l_rmdir(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + const char *path = luaL_checkstring(L, 1); + CHECK_SECURE_PATH(L, path, true); + + bool recursive = readParam<bool>(L, 2, false); + + if (recursive) + lua_pushboolean(L, fs::RecursiveDelete(path)); + else + lua_pushboolean(L, fs::DeleteSingleFileOrEmptyDirectory(path)); + + return 1; +} + +// cpdir(source, destination) +int ModApiUtil::l_cpdir(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + const char *source = luaL_checkstring(L, 1); + const char *destination = luaL_checkstring(L, 2); + CHECK_SECURE_PATH(L, source, false); + CHECK_SECURE_PATH(L, destination, true); + + lua_pushboolean(L, fs::CopyDir(source, destination)); + return 1; +} + +// mpdir(source, destination) +int ModApiUtil::l_mvdir(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + const char *source = luaL_checkstring(L, 1); + const char *destination = luaL_checkstring(L, 2); + CHECK_SECURE_PATH(L, source, true); + CHECK_SECURE_PATH(L, destination, true); + + lua_pushboolean(L, fs::MoveDir(source, destination)); + return 1; +} + // get_dir_list(path, is_dir) int ModApiUtil::l_get_dir_list(lua_State *L) { @@ -392,36 +454,7 @@ int ModApiUtil::l_request_insecure_environment(lua_State *L) return 1; } - // We have to make sure that this function is being called directly by - // a mod, otherwise a malicious mod could override this function and - // steal its return value. - lua_Debug info; - // Make sure there's only one item below this function on the stack... - if (lua_getstack(L, 2, &info)) { - return 0; - } - FATAL_ERROR_IF(!lua_getstack(L, 1, &info), "lua_getstack() failed"); - FATAL_ERROR_IF(!lua_getinfo(L, "S", &info), "lua_getinfo() failed"); - // ...and that that item is the main file scope. - if (strcmp(info.what, "main") != 0) { - return 0; - } - - // Get mod name - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); - if (!lua_isstring(L, -1)) { - return 0; - } - - // Check secure.trusted_mods - std::string mod_name = readParam<std::string>(L, -1); - std::string trusted_mods = g_settings->get("secure.trusted_mods"); - trusted_mods.erase(std::remove_if(trusted_mods.begin(), - trusted_mods.end(), static_cast<int(*)(int)>(&std::isspace)), - trusted_mods.end()); - std::vector<std::string> mod_list = str_split(trusted_mods, ','); - if (std::find(mod_list.begin(), mod_list.end(), mod_name) == - mod_list.end()) { + if (!ScriptApiSecurity::checkWhitelisted(L, "secure.trusted_mods")) { return 0; } @@ -447,6 +480,8 @@ int ModApiUtil::l_get_version(lua_State *L) lua_setfield(L, table, "hash"); } + lua_pushboolean(L, DEVELOPMENT_BUILD); + lua_setfield(L, table, "is_dev"); return 1; } @@ -477,6 +512,84 @@ int ModApiUtil::l_sha1(lua_State *L) return 1; } +// colorspec_to_colorstring(colorspec) +int ModApiUtil::l_colorspec_to_colorstring(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + video::SColor color(0); + if (read_color(L, 1, &color)) { + char colorstring[10]; + snprintf(colorstring, 10, "#%02X%02X%02X%02X", + color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + lua_pushstring(L, colorstring); + return 1; + } + + return 0; +} + +// colorspec_to_bytes(colorspec) +int ModApiUtil::l_colorspec_to_bytes(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + video::SColor color(0); + if (read_color(L, 1, &color)) { + u8 colorbytes[4] = { + (u8) color.getRed(), + (u8) color.getGreen(), + (u8) color.getBlue(), + (u8) color.getAlpha(), + }; + lua_pushlstring(L, (const char*) colorbytes, 4); + return 1; + } + + return 0; +} + +// encode_png(w, h, data, level) +int ModApiUtil::l_encode_png(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + // The args are already pre-validated on the lua side. + u32 width = readParam<int>(L, 1); + u32 height = readParam<int>(L, 2); + const char *data = luaL_checklstring(L, 3, NULL); + s32 compression = readParam<int>(L, 4); + + std::string out = encodePNG((const u8*)data, width, height, compression); + + lua_pushlstring(L, out.data(), out.size()); + return 1; +} + +// get_last_run_mod() +int ModApiUtil::l_get_last_run_mod(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME); + std::string current_mod = readParam<std::string>(L, -1, ""); + if (current_mod.empty()) { + lua_pop(L, 1); + lua_pushstring(L, getScriptApiBase(L)->getOrigin().c_str()); + } + return 1; +} + +// set_last_run_mod(modname) +int ModApiUtil::l_set_last_run_mod(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + const char *mod = luaL_checkstring(L, 1); + getScriptApiBase(L)->setOriginDirect(mod); + return 0; +} + void ModApiUtil::Initialize(lua_State *L, int top) { API_FCT(log); @@ -486,6 +599,7 @@ void ModApiUtil::Initialize(lua_State *L, int top) API_FCT(parse_json); API_FCT(write_json); + API_FCT(get_tool_wear_after_use); API_FCT(get_dig_params); API_FCT(get_hit_params); @@ -493,14 +607,17 @@ void ModApiUtil::Initialize(lua_State *L, int top) API_FCT(get_password_hash); API_FCT(is_yes); - API_FCT(is_nan); API_FCT(get_builtin_path); + API_FCT(get_user_path); API_FCT(compress); API_FCT(decompress); API_FCT(mkdir); + API_FCT(rmdir); + API_FCT(cpdir); + API_FCT(mvdir); API_FCT(get_dir_list); API_FCT(safe_file_write); @@ -511,6 +628,13 @@ void ModApiUtil::Initialize(lua_State *L, int top) API_FCT(get_version); API_FCT(sha1); + API_FCT(colorspec_to_colorstring); + API_FCT(colorspec_to_bytes); + + API_FCT(encode_png); + + API_FCT(get_last_run_mod); + API_FCT(set_last_run_mod); LuaSettings::create(L, g_settings, g_settings_path); lua_setfield(L, top, "settings"); @@ -526,7 +650,6 @@ void ModApiUtil::InitializeClient(lua_State *L, int top) API_FCT(write_json); API_FCT(is_yes); - API_FCT(is_nan); API_FCT(compress); API_FCT(decompress); @@ -536,6 +659,11 @@ void ModApiUtil::InitializeClient(lua_State *L, int top) API_FCT(get_version); API_FCT(sha1); + API_FCT(colorspec_to_colorstring); + API_FCT(colorspec_to_bytes); + + LuaSettings::create(L, g_settings, g_settings_path); + lua_setfield(L, top, "settings"); } void ModApiUtil::InitializeAsync(lua_State *L, int top) @@ -550,20 +678,33 @@ void ModApiUtil::InitializeAsync(lua_State *L, int top) API_FCT(is_yes); API_FCT(get_builtin_path); + API_FCT(get_user_path); API_FCT(compress); API_FCT(decompress); API_FCT(mkdir); + API_FCT(rmdir); + API_FCT(cpdir); + API_FCT(mvdir); API_FCT(get_dir_list); + API_FCT(safe_file_write); + + API_FCT(request_insecure_environment); API_FCT(encode_base64); API_FCT(decode_base64); API_FCT(get_version); API_FCT(sha1); + API_FCT(colorspec_to_colorstring); + API_FCT(colorspec_to_bytes); + + API_FCT(encode_png); + + API_FCT(get_last_run_mod); + API_FCT(set_last_run_mod); LuaSettings::create(L, g_settings, g_settings_path); lua_setfield(L, top, "settings"); } - diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h index 9ff91bb53..ec86c6632 100644 --- a/src/script/lua_api/l_util.h +++ b/src/script/lua_api/l_util.h @@ -50,10 +50,13 @@ private: // write_json(data[, styled]) static int l_write_json(lua_State *L); - // get_dig_params(groups, tool_capabilities[, time_from_last_punch]) + // get_tool_wear_after_use(uses[, initial_wear]) + static int l_get_tool_wear_after_use(lua_State *L); + + // get_dig_params(groups, tool_capabilities[, wear]) static int l_get_dig_params(lua_State *L); - // get_hit_params(groups, tool_capabilities[, time_from_last_punch]) + // get_hit_params(groups, tool_capabilities[, time_from_last_punch[, wear]]) static int l_get_hit_params(lua_State *L); // check_password_entry(name, entry, password) @@ -65,12 +68,12 @@ private: // is_yes(arg) static int l_is_yes(lua_State *L); - // is_nan(arg) - static int l_is_nan(lua_State *L); - // get_builtin_path() static int l_get_builtin_path(lua_State *L); + // get_user_path() + static int l_get_user_path(lua_State *L); + // compress(data, method, ...) static int l_compress(lua_State *L); @@ -80,6 +83,15 @@ private: // mkdir(path) static int l_mkdir(lua_State *L); + // rmdir(path, recursive) + static int l_rmdir(lua_State *L); + + // cpdir(source, destination, remove_source) + static int l_cpdir(lua_State *L); + + // mvdir(source, destination) + static int l_mvdir(lua_State *L); + // get_dir_list(path, is_dir) static int l_get_dir_list(lua_State *L); @@ -101,10 +113,23 @@ private: // sha1(string, raw) static int l_sha1(lua_State *L); + // colorspec_to_colorstring(colorspec) + static int l_colorspec_to_colorstring(lua_State *L); + + // colorspec_to_bytes(colorspec) + static int l_colorspec_to_bytes(lua_State *L); + + // encode_png(w, h, data, level) + static int l_encode_png(lua_State *L); + + // get_last_run_mod() + static int l_get_last_run_mod(lua_State *L); + + // set_last_run_mod(modname) + static int l_set_last_run_mod(lua_State *L); + public: static void Initialize(lua_State *L, int top); static void InitializeAsync(lua_State *L, int top); static void InitializeClient(lua_State *L, int top); - - static void InitializeAsync(AsyncEngine &engine); }; diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp index b99b1d98c..f6426771f 100644 --- a/src/script/lua_api/l_vmanip.cpp +++ b/src/script/lua_api/l_vmanip.cpp @@ -17,11 +17,12 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#include <map> #include "lua_api/l_vmanip.h" #include "lua_api/l_internal.h" #include "common/c_content.h" #include "common/c_converter.h" +#include "common/c_packer.h" #include "emerge.h" #include "environment.h" #include "map.h" @@ -45,6 +46,8 @@ int LuaVoxelManip::l_read_from_map(lua_State *L) LuaVoxelManip *o = checkobject(L, 1); MMVManip *vm = o->vm; + if (vm->isOrphan()) + return 0; v3s16 bp1 = getNodeBlockPos(check_v3s16(L, 2)); v3s16 bp2 = getNodeBlockPos(check_v3s16(L, 3)); @@ -112,23 +115,23 @@ int LuaVoxelManip::l_write_to_map(lua_State *L) LuaVoxelManip *o = checkobject(L, 1); bool update_light = !lua_isboolean(L, 2) || readParam<bool>(L, 2); + GET_ENV_PTR; ServerMap *map = &(env->getServerMap()); + + std::map<v3s16, MapBlock*> modified_blocks; if (o->is_mapgen_vm || !update_light) { - o->vm->blitBackAll(&(o->modified_blocks)); + o->vm->blitBackAll(&modified_blocks); } else { - voxalgo::blit_back_with_light(map, o->vm, - &(o->modified_blocks)); + voxalgo::blit_back_with_light(map, o->vm, &modified_blocks); } MapEditEvent event; event.type = MEET_OTHER; - for (const auto &modified_block : o->modified_blocks) - event.modified_blocks.insert(modified_block.first); - + for (const auto &it : modified_blocks) + event.modified_blocks.insert(it.first); map->dispatchEvent(event); - o->modified_blocks.clear(); return 0; } @@ -166,7 +169,7 @@ int LuaVoxelManip::l_update_liquids(lua_State *L) LuaVoxelManip *o = checkobject(L, 1); - Map *map = &(env->getMap()); + ServerMap *map = &(env->getServerMap()); const NodeDefManager *ndef = getServer(L)->getNodeDefManager(); MMVManip *vm = o->vm; @@ -257,11 +260,17 @@ int LuaVoxelManip::l_get_light_data(lua_State *L) NO_MAP_LOCK_REQUIRED; LuaVoxelManip *o = checkobject(L, 1); + bool use_buffer = lua_istable(L, 2); + MMVManip *vm = o->vm; u32 volume = vm->m_area.getVolume(); - lua_createtable(L, volume, 0); + if (use_buffer) + lua_pushvalue(L, 2); + else + lua_createtable(L, volume, 0); + for (u32 i = 0; i != volume; i++) { lua_Integer light = vm->m_data[i].param1; lua_pushinteger(L, light); @@ -429,6 +438,34 @@ LuaVoxelManip *LuaVoxelManip::checkobject(lua_State *L, int narg) return *(LuaVoxelManip **)ud; // unbox pointer } +void *LuaVoxelManip::packIn(lua_State *L, int idx) +{ + LuaVoxelManip *o = checkobject(L, idx); + + if (o->is_mapgen_vm) + throw LuaError("nope"); + return o->vm->clone(); +} + +void LuaVoxelManip::packOut(lua_State *L, void *ptr) +{ + MMVManip *vm = reinterpret_cast<MMVManip*>(ptr); + if (!L) { + delete vm; + return; + } + + // Associate vmanip with map if the Lua env has one + Environment *env = getEnv(L); + if (env) + vm->reparent(&(env->getMap())); + + LuaVoxelManip *o = new LuaVoxelManip(vm, false); + *(void **)(lua_newuserdata(L, sizeof(void *))) = o; + luaL_getmetatable(L, className); + lua_setmetatable(L, -2); +} + void LuaVoxelManip::Register(lua_State *L) { lua_newtable(L); @@ -450,11 +487,13 @@ void LuaVoxelManip::Register(lua_State *L) lua_pop(L, 1); // drop metatable - luaL_openlib(L, 0, methods, 0); // fill methodtable + luaL_register(L, nullptr, methods); // fill methodtable lua_pop(L, 1); // drop methodtable // Can be created from Lua (VoxelManip()) lua_register(L, className, create_object); + + script_register_packer(L, className, packIn, packOut); } const char LuaVoxelManip::className[] = "VoxelManip"; diff --git a/src/script/lua_api/l_vmanip.h b/src/script/lua_api/l_vmanip.h index 15ab9eef8..005133335 100644 --- a/src/script/lua_api/l_vmanip.h +++ b/src/script/lua_api/l_vmanip.h @@ -19,7 +19,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -#include <map> #include "irr_v3d.h" #include "lua_api/l_base.h" @@ -33,7 +32,6 @@ class MMVManip; class LuaVoxelManip : public ModApiBase { private: - std::map<v3s16, MapBlock *> modified_blocks; bool is_mapgen_vm = false; static const char className[]; @@ -77,5 +75,8 @@ public: static LuaVoxelManip *checkobject(lua_State *L, int narg); + static void *packIn(lua_State *L, int idx); + static void packOut(lua_State *L, void *ptr); + static void Register(lua_State *L); }; diff --git a/src/script/scripting_client.cpp b/src/script/scripting_client.cpp index 6643a9509..377205379 100644 --- a/src/script/scripting_client.cpp +++ b/src/script/scripting_client.cpp @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_nodemeta.h" #include "lua_api/l_localplayer.h" #include "lua_api/l_camera.h" +#include "lua_api/l_settings.h" ClientScripting::ClientScripting(Client *client): ScriptApiBase(ScriptingType::Client) @@ -73,6 +74,7 @@ void ClientScripting::InitializeModApi(lua_State *L, int top) LuaLocalPlayer::Register(L); LuaCamera::Register(L); ModChannelRef::Register(L); + LuaSettings::Register(L); ModApiUtil::InitializeClient(L, top); ModApiClient::Initialize(L, top); diff --git a/src/script/scripting_mainmenu.cpp b/src/script/scripting_mainmenu.cpp index 0f672f917..2a0cadb23 100644 --- a/src/script/scripting_mainmenu.cpp +++ b/src/script/scripting_mainmenu.cpp @@ -31,7 +31,6 @@ with this program; if not, write to the Free Software Foundation, Inc., extern "C" { #include "lualib.h" } - #define MAINMENU_NUM_ASYNC_THREADS 4 @@ -93,9 +92,9 @@ void MainMenuScripting::step() } /******************************************************************************/ -unsigned int MainMenuScripting::queueAsync(const std::string &serialized_func, - const std::string &serialized_param) +u32 MainMenuScripting::queueAsync(std::string &&serialized_func, + std::string &&serialized_param) { - return asyncEngine.queueAsyncJob(serialized_func, serialized_param); + return asyncEngine.queueAsyncJob(std::move(serialized_func), std::move(serialized_param)); } diff --git a/src/script/scripting_mainmenu.h b/src/script/scripting_mainmenu.h index 9e23bdc1b..3c329654a 100644 --- a/src/script/scripting_mainmenu.h +++ b/src/script/scripting_mainmenu.h @@ -38,8 +38,9 @@ public: void step(); // Pass async events from engine to async threads - unsigned int queueAsync(const std::string &serialized_func, - const std::string &serialized_params); + u32 queueAsync(std::string &&serialized_func, + std::string &&serialized_param); + private: void initializeModApi(lua_State *L, int top); static void registerLuaClasses(lua_State *L, int top); diff --git a/src/script/scripting_server.cpp b/src/script/scripting_server.cpp index 85411ded4..b462141b0 100644 --- a/src/script/scripting_server.cpp +++ b/src/script/scripting_server.cpp @@ -47,11 +47,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_storage.h" extern "C" { -#include "lualib.h" +#include <lualib.h> } ServerScripting::ServerScripting(Server* server): - ScriptApiBase(ScriptingType::Server) + ScriptApiBase(ScriptingType::Server), + asyncEngine(server) { setGameDef(server); @@ -88,6 +89,48 @@ ServerScripting::ServerScripting(Server* server): infostream << "SCRIPTAPI: Initialized game modules" << std::endl; } +void ServerScripting::initAsync() +{ + // Save globals to transfer + { + lua_State *L = getStack(); + lua_getglobal(L, "core"); + luaL_checktype(L, -1, LUA_TTABLE); + lua_getfield(L, -1, "get_globals_to_transfer"); + lua_call(L, 0, 1); + auto *data = script_pack(L, -1); + assert(!data->contains_userdata); + getServer()->m_async_globals_data.reset(data); + lua_pushnil(L); + lua_setfield(L, -3, "get_globals_to_transfer"); // unset function too + lua_pop(L, 2); // pop 'core', return value + } + + infostream << "SCRIPTAPI: Initializing async engine" << std::endl; + asyncEngine.registerStateInitializer(InitializeAsync); + asyncEngine.registerStateInitializer(ModApiUtil::InitializeAsync); + asyncEngine.registerStateInitializer(ModApiCraft::InitializeAsync); + asyncEngine.registerStateInitializer(ModApiItemMod::InitializeAsync); + asyncEngine.registerStateInitializer(ModApiServer::InitializeAsync); + // not added: ModApiMapgen is a minefield for thread safety + // not added: ModApiHttp async api can't really work together with our jobs + // not added: ModApiStorage is probably not thread safe(?) + + asyncEngine.initialize(0); +} + +void ServerScripting::stepAsync() +{ + asyncEngine.step(getStack()); +} + +u32 ServerScripting::queueAsync(std::string &&serialized_func, + PackedValue *param, const std::string &mod_origin) +{ + return asyncEngine.queueAsyncJob(std::move(serialized_func), + param, mod_origin); +} + void ServerScripting::InitializeModApi(lua_State *L, int top) { // Register reference classes (userdata) @@ -125,3 +168,24 @@ void ServerScripting::InitializeModApi(lua_State *L, int top) ModApiStorage::Initialize(L, top); ModApiChannels::Initialize(L, top); } + +void ServerScripting::InitializeAsync(lua_State *L, int top) +{ + // classes + LuaItemStack::Register(L); + LuaPerlinNoise::Register(L); + LuaPerlinNoiseMap::Register(L); + LuaPseudoRandom::Register(L); + LuaPcgRandom::Register(L); + LuaSecureRandom::Register(L); + LuaVoxelManip::Register(L); + LuaSettings::Register(L); + + // globals data + lua_getglobal(L, "core"); + luaL_checktype(L, -1, LUA_TTABLE); + auto *data = ModApiBase::getServer(L)->m_async_globals_data.get(); + script_unpack(L, data); + lua_setfield(L, -2, "transferred_globals"); + lua_pop(L, 1); // pop 'core' +} diff --git a/src/script/scripting_server.h b/src/script/scripting_server.h index bf06ab197..9803397c5 100644 --- a/src/script/scripting_server.h +++ b/src/script/scripting_server.h @@ -27,6 +27,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "cpp_api/s_player.h" #include "cpp_api/s_server.h" #include "cpp_api/s_security.h" +#include "cpp_api/s_async.h" + +struct PackedValue; /*****************************************************************************/ /* Scripting <-> Server Game Interface */ @@ -48,6 +51,20 @@ public: // use ScriptApiBase::loadMod() to load mods + // Initialize async engine, call this AFTER loading all mods + void initAsync(); + + // Global step handler to collect async results + void stepAsync(); + + // Pass job to async threads + u32 queueAsync(std::string &&serialized_func, + PackedValue *param, const std::string &mod_origin); + private: void InitializeModApi(lua_State *L, int top); + + static void InitializeAsync(lua_State *L, int top); + + AsyncEngine asyncEngine; }; diff --git a/src/serialization.cpp b/src/serialization.cpp index 310604f54..dc34dd7b9 100644 --- a/src/serialization.cpp +++ b/src/serialization.cpp @@ -21,10 +21,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" -#include "zlib.h" +#include <zlib.h> +#include <zstd.h> /* report a zlib or i/o error */ -void zerr(int ret) +static void zerr(int ret) { dstream<<"zerr: "; switch (ret) { @@ -51,6 +52,17 @@ void zerr(int ret) } } +// Make sure that z is deleted in case of exception +template <int (*F)(z_stream*)> +class ZlibAutoDeleter { +public: + ZlibAutoDeleter(z_stream *ptr) : ptr_(ptr) {} + ~ZlibAutoDeleter() { F(ptr_); } + +private: + z_stream *ptr_; +}; + void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level) { z_stream z; @@ -67,6 +79,8 @@ void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level) if(ret != Z_OK) throw SerializationError("compressZlib: deflateInit failed"); + ZlibAutoDeleter<deflateEnd> deleter(&z); + // Point zlib to our input buffer z.next_in = (Bytef*)&data[0]; z.avail_in = data_size; @@ -90,8 +104,6 @@ void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level) if(status == Z_STREAM_END) break; } - - deflateEnd(&z); } void compressZlib(const std::string &data, std::ostream &os, int level) @@ -107,7 +119,6 @@ void decompressZlib(std::istream &is, std::ostream &os, size_t limit) char output_buffer[bufsize]; int status = 0; int ret; - int bytes_read = 0; int bytes_written = 0; int input_buffer_len = 0; @@ -119,9 +130,9 @@ void decompressZlib(std::istream &is, std::ostream &os, size_t limit) if(ret != Z_OK) throw SerializationError("dcompressZlib: inflateInit failed"); - z.avail_in = 0; + ZlibAutoDeleter<inflateEnd> deleter(&z); - //dstream<<"initial fail="<<is.fail()<<" bad="<<is.bad()<<std::endl; + z.avail_in = 0; for(;;) { @@ -146,19 +157,13 @@ void decompressZlib(std::istream &is, std::ostream &os, size_t limit) is.read(input_buffer, bufsize); input_buffer_len = is.gcount(); z.avail_in = input_buffer_len; - //dstream<<"read fail="<<is.fail()<<" bad="<<is.bad()<<std::endl; } if(z.avail_in == 0) { - //dstream<<"z.avail_in == 0"<<std::endl; break; } - //dstream<<"1 z.avail_in="<<z.avail_in<<std::endl; status = inflate(&z, Z_NO_FLUSH); - //dstream<<"2 z.avail_in="<<z.avail_in<<std::endl; - bytes_read += is.gcount() - z.avail_in; - //dstream<<"bytes_read="<<bytes_read<<std::endl; if(status == Z_NEED_DICT || status == Z_DATA_ERROR || status == Z_MEM_ERROR) @@ -167,16 +172,11 @@ void decompressZlib(std::istream &is, std::ostream &os, size_t limit) throw SerializationError("decompressZlib: inflate failed"); } int count = output_size - z.avail_out; - //dstream<<"count="<<count<<std::endl; if(count) os.write(output_buffer, count); bytes_written += count; if(status == Z_STREAM_END) { - //dstream<<"Z_STREAM_END"<<std::endl; - - //dstream<<"z.avail_in="<<z.avail_in<<std::endl; - //dstream<<"fail="<<is.fail()<<" bad="<<is.bad()<<std::endl; // Unget all the data that inflate didn't take is.clear(); // Just in case EOF is set for(u32 i=0; i < z.avail_in; i++) @@ -193,31 +193,136 @@ void decompressZlib(std::istream &is, std::ostream &os, size_t limit) break; } } - - inflateEnd(&z); } -void compress(const SharedBuffer<u8> &data, std::ostream &os, u8 version) +struct ZSTD_Deleter { + void operator() (ZSTD_CStream* cstream) { + ZSTD_freeCStream(cstream); + } + + void operator() (ZSTD_DStream* dstream) { + ZSTD_freeDStream(dstream); + } +}; + +void compressZstd(const u8 *data, size_t data_size, std::ostream &os, int level) { - if(version >= 11) + // reusing the context is recommended for performance + // it will be destroyed when the thread ends + thread_local std::unique_ptr<ZSTD_CStream, ZSTD_Deleter> stream(ZSTD_createCStream()); + + + ZSTD_initCStream(stream.get(), level); + + const size_t bufsize = 16384; + char output_buffer[bufsize]; + + ZSTD_inBuffer input = { data, data_size, 0 }; + ZSTD_outBuffer output = { output_buffer, bufsize, 0 }; + + while (input.pos < input.size) { + size_t ret = ZSTD_compressStream(stream.get(), &output, &input); + if (ZSTD_isError(ret)) { + dstream << ZSTD_getErrorName(ret) << std::endl; + throw SerializationError("compressZstd: failed"); + } + if (output.pos) { + os.write(output_buffer, output.pos); + output.pos = 0; + } + } + + size_t ret; + do { + ret = ZSTD_endStream(stream.get(), &output); + if (ZSTD_isError(ret)) { + dstream << ZSTD_getErrorName(ret) << std::endl; + throw SerializationError("compressZstd: failed"); + } + if (output.pos) { + os.write(output_buffer, output.pos); + output.pos = 0; + } + } while (ret != 0); + +} + +void compressZstd(const std::string &data, std::ostream &os, int level) +{ + compressZstd((u8*)data.c_str(), data.size(), os, level); +} + +void decompressZstd(std::istream &is, std::ostream &os) +{ + // reusing the context is recommended for performance + // it will be destroyed when the thread ends + thread_local std::unique_ptr<ZSTD_DStream, ZSTD_Deleter> stream(ZSTD_createDStream()); + + ZSTD_initDStream(stream.get()); + + const size_t bufsize = 16384; + char output_buffer[bufsize]; + char input_buffer[bufsize]; + + ZSTD_outBuffer output = { output_buffer, bufsize, 0 }; + ZSTD_inBuffer input = { input_buffer, 0, 0 }; + size_t ret; + do { - compressZlib(*data ,data.getSize(), os); + if (input.size == input.pos) { + is.read(input_buffer, bufsize); + input.size = is.gcount(); + input.pos = 0; + } + + ret = ZSTD_decompressStream(stream.get(), &output, &input); + if (ZSTD_isError(ret)) { + dstream << ZSTD_getErrorName(ret) << std::endl; + throw SerializationError("decompressZstd: failed"); + } + if (output.pos) { + os.write(output_buffer, output.pos); + output.pos = 0; + } + } while (ret != 0); + + // Unget all the data that ZSTD_decompressStream didn't take + is.clear(); // Just in case EOF is set + for (u32 i = 0; i < input.size - input.pos; i++) { + is.unget(); + if (is.fail() || is.bad()) + throw SerializationError("decompressZstd: unget failed"); + } +} + +void compress(u8 *data, u32 size, std::ostream &os, u8 version, int level) +{ + if(version >= 29) + { + // map the zlib levels [0,9] to [1,10]. -1 becomes 0 which indicates the default (currently 3) + compressZstd(data, size, os, level + 1); return; } - if(data.getSize() == 0) + if(version >= 11) + { + compressZlib(data, size, os, level); + return; + } + + if(size == 0) return; // Write length (u32) u8 tmp[4]; - writeU32(tmp, data.getSize()); + writeU32(tmp, size); os.write((char*)tmp, 4); // We will be writing 8-bit pairs of more_count and byte u8 more_count = 0; u8 current_byte = data[0]; - for(u32 i=1; i<data.getSize(); i++) + for(u32 i=1; i<size; i++) { if( data[i] != current_byte @@ -240,8 +345,24 @@ void compress(const SharedBuffer<u8> &data, std::ostream &os, u8 version) os.write((char*)¤t_byte, 1); } +void compress(const SharedBuffer<u8> &data, std::ostream &os, u8 version, int level) +{ + compress(*data, data.getSize(), os, version, level); +} + +void compress(const std::string &data, std::ostream &os, u8 version, int level) +{ + compress((u8*)data.c_str(), data.size(), os, version, level); +} + void decompress(std::istream &is, std::ostream &os, u8 version) { + if(version >= 29) + { + decompressZstd(is, os); + return; + } + if(version >= 11) { decompressZlib(is, os); diff --git a/src/serialization.h b/src/serialization.h index f399983c4..e83a8c179 100644 --- a/src/serialization.h +++ b/src/serialization.h @@ -63,13 +63,14 @@ with this program; if not, write to the Free Software Foundation, Inc., 26: Never written; read the same as 25 27: Added light spreading flags to blocks 28: Added "private" flag to NodeMetadata + 29: Switched compression to zstd, a bit of reorganization */ // This represents an uninitialized or invalid format #define SER_FMT_VER_INVALID 255 // Highest supported serialization version -#define SER_FMT_VER_HIGHEST_READ 28 +#define SER_FMT_VER_HIGHEST_READ 29 // Saved on disk version -#define SER_FMT_VER_HIGHEST_WRITE 28 +#define SER_FMT_VER_HIGHEST_WRITE 29 // Lowest supported serialization version #define SER_FMT_VER_LOWEST_READ 0 // Lowest serialization version for writing @@ -89,7 +90,12 @@ void compressZlib(const u8 *data, size_t data_size, std::ostream &os, int level void compressZlib(const std::string &data, std::ostream &os, int level = -1); void decompressZlib(std::istream &is, std::ostream &os, size_t limit = 0); +void compressZstd(const u8 *data, size_t data_size, std::ostream &os, int level = 0); +void compressZstd(const std::string &data, std::ostream &os, int level = 0); +void decompressZstd(std::istream &is, std::ostream &os); + // These choose between zlib and a self-made one according to version -void compress(const SharedBuffer<u8> &data, std::ostream &os, u8 version); -//void compress(const std::string &data, std::ostream &os, u8 version); +void compress(const SharedBuffer<u8> &data, std::ostream &os, u8 version, int level = -1); +void compress(const std::string &data, std::ostream &os, u8 version, int level = -1); +void compress(u8 *data, u32 size, std::ostream &os, u8 version, int level = -1); void decompress(std::istream &is, std::ostream &os, u8 version); diff --git a/src/server.cpp b/src/server.cpp index b8a99f6ae..06e7b9d50 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -66,6 +66,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server/player_sao.h" #include "server/serverinventorymgr.h" #include "translation.h" +#include "database/database-sqlite3.h" +#include "database/database-files.h" +#include "database/database-dummy.h" +#include "gameparams.h" class ClientNotFoundException : public BaseException { @@ -103,7 +107,13 @@ void *ServerThread::run() * doesn't busy wait) and will process any remaining packets. */ - m_server->AsyncRunStep(true); + try { + m_server->AsyncRunStep(true); + } catch (con::ConnectionBindFailed &e) { + m_server->setAsyncFatalError(e.what()); + } catch (LuaError &e) { + m_server->setAsyncFatalError(e); + } while (!stopRequested()) { try { @@ -117,8 +127,7 @@ void *ServerThread::run() } catch (con::ConnectionBindFailed &e) { m_server->setAsyncFatalError(e.what()); } catch (LuaError &e) { - m_server->setAsyncFatalError( - "ServerThread::run Lua: " + std::string(e.what())); + m_server->setAsyncFatalError(e); } } @@ -127,24 +136,31 @@ void *ServerThread::run() return nullptr; } -v3f ServerSoundParams::getPos(ServerEnvironment *env, bool *pos_exists) const +v3f ServerPlayingSound::getPos(ServerEnvironment *env, bool *pos_exists) const { - if(pos_exists) *pos_exists = false; - switch(type){ - case SSP_LOCAL: + if (pos_exists) + *pos_exists = false; + + switch (type ){ + case SoundLocation::Local: return v3f(0,0,0); - case SSP_POSITIONAL: - if(pos_exists) *pos_exists = true; + case SoundLocation::Position: + if (pos_exists) + *pos_exists = true; return pos; - case SSP_OBJECT: { - if(object == 0) - return v3f(0,0,0); - ServerActiveObject *sao = env->getActiveObject(object); - if(!sao) - return v3f(0,0,0); - if(pos_exists) *pos_exists = true; - return sao->getBasePosition(); } + case SoundLocation::Object: + { + if (object == 0) + return v3f(0,0,0); + ServerActiveObject *sao = env->getActiveObject(object); + if (!sao) + return v3f(0,0,0); + if (pos_exists) + *pos_exists = true; + return sao->getBasePosition(); + } } + return v3f(0,0,0); } @@ -245,7 +261,7 @@ Server::Server( #if USE_PROMETHEUS m_metrics_backend = std::unique_ptr<MetricsBackend>(createPrometheusMetricsBackend()); #else - m_metrics_backend = std::unique_ptr<MetricsBackend>(new MetricsBackend()); + m_metrics_backend = std::make_unique<MetricsBackend>(); #endif m_uptime_counter = m_metrics_backend->addCounter("minetest_core_server_uptime", "Server uptime (in seconds)"); @@ -259,9 +275,15 @@ Server::Server( "minetest_core_latency", "Latency value (in seconds)"); - m_aom_buffer_counter = m_metrics_backend->addCounter( - "minetest_core_aom_generated_count", - "Number of active object messages generated"); + + const std::string aom_types[] = {"reliable", "unreliable"}; + for (u32 i = 0; i < ARRLEN(aom_types); i++) { + std::string help_str("Number of active object messages generated ("); + help_str.append(aom_types[i]).append(")"); + m_aom_buffer_counter[i] = m_metrics_backend->addCounter( + "minetest_core_aom_generated_count", help_str, + {{"type", aom_types[i]}}); + } m_packet_recv_counter = m_metrics_backend->addCounter( "minetest_core_server_packet_recv", @@ -271,6 +293,10 @@ Server::Server( "minetest_core_server_packet_recv_processed", "Valid received packets processed"); + m_map_edit_event_counter = m_metrics_backend->addCounter( + "minetest_core_map_edit_events", + "Number of map edit events"); + m_lag_gauge->set(g_settings->getFloat("dedicated_server_step")); } @@ -339,10 +365,15 @@ Server::~Server() delete m_thread; } + // Write any changes before deletion. + if (m_mod_storage_database) + m_mod_storage_database->endSave(); + // Delete things in the reverse order of creation delete m_emerge; delete m_env; delete m_rollback; + delete m_mod_storage_database; delete m_banmanager; delete m_itemdef; delete m_nodedef; @@ -351,6 +382,8 @@ Server::~Server() // Deinitialize scripting infostream << "Server: Deinitializing scripting" << std::endl; delete m_script; + delete m_startup_server_map; // if available + delete m_game_settings; while (!m_unsent_map_edit_queue.empty()) { delete m_unsent_map_edit_queue.front(); @@ -368,6 +401,8 @@ void Server::init() infostream << "- world: " << m_path_world << std::endl; infostream << "- game: " << m_gamespec.path << std::endl; + m_game_settings = Settings::createLayer(SL_GAME); + // Create world if it doesn't exist try { loadGameConfAndInitWorld(m_path_world, @@ -378,17 +413,22 @@ void Server::init() } // Create emerge manager - m_emerge = new EmergeManager(this); + m_emerge = new EmergeManager(this, m_metrics_backend.get()); // Create ban manager std::string ban_path = m_path_world + DIR_DELIM "ipban.txt"; m_banmanager = new BanManager(ban_path); - m_modmgr = std::unique_ptr<ServerModManager>(new ServerModManager(m_path_world)); + // Create mod storage database and begin a save for later + m_mod_storage_database = openModStorageDatabase(m_path_world); + m_mod_storage_database->beginSave(); + + m_modmgr = std::make_unique<ServerModManager>(m_path_world); std::vector<ModSpec> unsatisfied_mods = m_modmgr->getUnsatisfiedMods(); // complain about mods with unsatisfied dependencies if (!m_modmgr->isConsistent()) { - m_modmgr->printUnsatisfiedModsError(); + std::string error = m_modmgr->getUnsatisfiedModsError(); + throw ServerError(error); } //lock environment @@ -396,6 +436,7 @@ void Server::init() // Create the Map (loads map_meta.txt, overriding configured mapgen params) ServerMap *servermap = new ServerMap(m_path_world, this, m_emerge, m_metrics_backend.get()); + m_startup_server_map = servermap; // Initialize scripting infostream << "Server: Initializing Lua" << std::endl; @@ -403,10 +444,11 @@ void Server::init() m_script = new ServerScripting(this); // Must be created before mod loading because we have some inventory creation - m_inventory_mgr = std::unique_ptr<ServerInventoryManager>(new ServerInventoryManager()); + m_inventory_mgr = std::make_unique<ServerInventoryManager>(); m_script->loadMod(getBuiltinLuaPath() + DIR_DELIM "init.lua", BUILTIN_MOD_NAME); + m_gamespec.checkAndLog(); m_modmgr->loadMods(m_script); // Read Textures and calculate sha1 sums @@ -437,7 +479,9 @@ void Server::init() m_craftdef->initHashes(this); // Initialize Environment - m_env = new ServerEnvironment(servermap, m_script, this, m_path_world); + m_startup_server_map = nullptr; // Ownership moved to ServerEnvironment + m_env = new ServerEnvironment(servermap, m_script, this, + m_path_world, m_metrics_backend.get()); m_inventory_mgr->setEnv(m_env); m_clients.setEnv(m_env); @@ -456,6 +500,9 @@ void Server::init() // Give environment reference to scripting api m_script->initializeEnvironment(m_env); + // Do this after regular script init is done + m_script->initAsync(); + // Register us to receive map edit events servermap->addEventReceiver(this); @@ -488,16 +535,17 @@ void Server::start() // ASCII art for the win! std::cerr - << " .__ __ __ " << std::endl - << " _____ |__| ____ _____/ |_ ____ _______/ |_ " << std::endl - << " / \\| |/ \\_/ __ \\ __\\/ __ \\ / ___/\\ __\\" << std::endl - << "| Y Y \\ | | \\ ___/| | \\ ___/ \\___ \\ | | " << std::endl - << "|__|_| /__|___| /\\___ >__| \\___ >____ > |__| " << std::endl - << " \\/ \\/ \\/ \\/ \\/ " << std::endl; + << " __. __. __. " << std::endl + << " _____ |__| ____ _____ / |_ _____ _____ / |_ " << std::endl + << " / \\| |/ \\ / __ \\ _\\/ __ \\/ __> _\\" << std::endl + << "| Y Y \\ | | \\ ___/| | | ___/\\___ \\| | " << std::endl + << "|__|_| / |___| /\\______> | \\______>_____/| | " << std::endl + << " \\/ \\/ \\/ \\/ \\/ " << std::endl; actionstream << "World at [" << m_path_world << "]" << std::endl; actionstream << "Server for gameid=\"" << m_gamespec.id - << "\" listening on " << m_bind_addr.serializeString() << ":" - << m_bind_addr.getPort() << "." << std::endl; + << "\" listening on "; + m_bind_addr.print(actionstream); + actionstream << "." << std::endl; } void Server::stop() @@ -506,9 +554,7 @@ void Server::stop() // Stop threads (set run=false first so both start stopping) m_thread->stop(); - //m_emergethread.setRun(false); m_thread->wait(); - //m_emergethread.stop(); infostream<<"Server: Threads stopped"<<std::endl; } @@ -596,6 +642,7 @@ void Server::AsyncRunStep(bool initial_step) max_lag = dtime; } m_env->reportMaxLagEstimate(max_lag); + // Step environment m_env->step(dtime); } @@ -607,8 +654,8 @@ void Server::AsyncRunStep(bool initial_step) // Run Map's timers and unload unused data ScopeProfiler sp(g_profiler, "Server: map timer and unload"); m_env->getMap().timerUpdate(map_timer_and_unload_dtime, - g_settings->getFloat("server_unload_unused_data_timeout"), - U32_MAX); + std::max(g_settings->getFloat("server_unload_unused_data_timeout"), 0.0f), + -1); } /* @@ -642,7 +689,7 @@ void Server::AsyncRunStep(bool initial_step) ScopeProfiler sp(g_profiler, "Server: liquid transform"); std::map<v3s16, MapBlock*> modified_blocks; - m_env->getMap().transformLiquids(modified_blocks, m_env); + m_env->getServerMap().transformLiquids(modified_blocks, m_env); /* Set the modified blocks unsent for all the clients @@ -653,7 +700,23 @@ void Server::AsyncRunStep(bool initial_step) } m_clients.step(dtime); - m_lag_gauge->increment((m_lag_gauge->get() > dtime ? -1 : 1) * dtime/100); + // increase/decrease lag gauge gradually + if (m_lag_gauge->get() > dtime) { + m_lag_gauge->decrement(dtime/100); + } else { + m_lag_gauge->increment(dtime/100); + } + + { + float &counter = m_step_pending_dyn_media_timer; + counter += dtime; + if (counter >= 5.0f) { + stepPendingDynMediaCallbacks(counter); + counter = 0; + } + } + + #if USE_CURL // send masterserver announce { @@ -684,43 +747,36 @@ void Server::AsyncRunStep(bool initial_step) //infostream<<"Server: Checking added and deleted active objects"<<std::endl; MutexAutoLock envlock(m_env_mutex); - m_clients.lock(); - const RemoteClientMap &clients = m_clients.getClientList(); - ScopeProfiler sp(g_profiler, "Server: update objects within range"); + { + ClientInterface::AutoLock clientlock(m_clients); + const RemoteClientMap &clients = m_clients.getClientList(); + ScopeProfiler sp(g_profiler, "Server: update objects within range"); - m_player_gauge->set(clients.size()); - for (const auto &client_it : clients) { - RemoteClient *client = client_it.second; + m_player_gauge->set(clients.size()); + for (const auto &client_it : clients) { + RemoteClient *client = client_it.second; - if (client->getState() < CS_DefinitionsSent) - continue; + if (client->getState() < CS_DefinitionsSent) + continue; - // This can happen if the client times out somehow - if (!m_env->getPlayer(client->peer_id)) - continue; + // This can happen if the client times out somehow + if (!m_env->getPlayer(client->peer_id)) + continue; - PlayerSAO *playersao = getPlayerSAO(client->peer_id); - if (!playersao) - continue; + PlayerSAO *playersao = getPlayerSAO(client->peer_id); + if (!playersao) + continue; - SendActiveObjectRemoveAdd(client, playersao); + SendActiveObjectRemoveAdd(client, playersao); + } } - m_clients.unlock(); - // Save mod storages if modified + // Write changes to the mod storage m_mod_storage_save_timer -= dtime; if (m_mod_storage_save_timer <= 0.0f) { m_mod_storage_save_timer = g_settings->getFloat("server_map_save_interval"); - int n = 0; - for (std::unordered_map<std::string, ModMetadata *>::const_iterator - it = m_mod_storages.begin(); it != m_mod_storages.end(); ++it) { - if (it->second->isModified()) { - it->second->save(getModStoragePath()); - n++; - } - } - if (n > 0) - infostream << "Saved " << n << " modified mod storages." << std::endl; + m_mod_storage_database->endSave(); + m_mod_storage_database->beginSave(); } } @@ -737,10 +793,14 @@ void Server::AsyncRunStep(bool initial_step) // Get active object messages from environment ActiveObjectMessage aom(0); - u32 aom_count = 0; + u32 count_reliable = 0, count_unreliable = 0; for(;;) { if (!m_env->getActiveObjectMessage(&aom)) break; + if (aom.reliable) + count_reliable++; + else + count_unreliable++; std::vector<ActiveObjectMessage>* message_list = nullptr; auto n = buffered_messages.find(aom.id); @@ -751,68 +811,69 @@ void Server::AsyncRunStep(bool initial_step) message_list = n->second; } message_list->push_back(std::move(aom)); - aom_count++; } - m_aom_buffer_counter->increment(aom_count); + m_aom_buffer_counter[0]->increment(count_reliable); + m_aom_buffer_counter[1]->increment(count_unreliable); - m_clients.lock(); - const RemoteClientMap &clients = m_clients.getClientList(); - // Route data to every client - std::string reliable_data, unreliable_data; - for (const auto &client_it : clients) { - reliable_data.clear(); - unreliable_data.clear(); - RemoteClient *client = client_it.second; - PlayerSAO *player = getPlayerSAO(client->peer_id); - // Go through all objects in message buffer - for (const auto &buffered_message : buffered_messages) { - // If object does not exist or is not known by client, skip it - u16 id = buffered_message.first; - ServerActiveObject *sao = m_env->getActiveObject(id); - if (!sao || client->m_known_objects.find(id) == client->m_known_objects.end()) - continue; + { + ClientInterface::AutoLock clientlock(m_clients); + const RemoteClientMap &clients = m_clients.getClientList(); + // Route data to every client + std::string reliable_data, unreliable_data; + for (const auto &client_it : clients) { + reliable_data.clear(); + unreliable_data.clear(); + RemoteClient *client = client_it.second; + PlayerSAO *player = getPlayerSAO(client->peer_id); + // Go through all objects in message buffer + for (const auto &buffered_message : buffered_messages) { + // If object does not exist or is not known by client, skip it + u16 id = buffered_message.first; + ServerActiveObject *sao = m_env->getActiveObject(id); + if (!sao || client->m_known_objects.find(id) == client->m_known_objects.end()) + continue; - // Get message list of object - std::vector<ActiveObjectMessage>* list = buffered_message.second; - // Go through every message - for (const ActiveObjectMessage &aom : *list) { - // Send position updates to players who do not see the attachment - if (aom.datastring[0] == AO_CMD_UPDATE_POSITION) { - if (sao->getId() == player->getId()) - continue; + // Get message list of object + std::vector<ActiveObjectMessage>* list = buffered_message.second; + // Go through every message + for (const ActiveObjectMessage &aom : *list) { + // Send position updates to players who do not see the attachment + if (aom.datastring[0] == AO_CMD_UPDATE_POSITION) { + if (sao->getId() == player->getId()) + continue; - // Do not send position updates for attached players - // as long the parent is known to the client - ServerActiveObject *parent = sao->getParent(); - if (parent && client->m_known_objects.find(parent->getId()) != - client->m_known_objects.end()) - continue; + // Do not send position updates for attached players + // as long the parent is known to the client + ServerActiveObject *parent = sao->getParent(); + if (parent && client->m_known_objects.find(parent->getId()) != + client->m_known_objects.end()) + continue; + } + + // Add full new data to appropriate buffer + std::string &buffer = aom.reliable ? reliable_data : unreliable_data; + char idbuf[2]; + writeU16((u8*) idbuf, aom.id); + // u16 id + // std::string data + buffer.append(idbuf, sizeof(idbuf)); + buffer.append(serializeString16(aom.datastring)); } + } + /* + reliable_data and unreliable_data are now ready. + Send them. + */ + if (!reliable_data.empty()) { + SendActiveObjectMessages(client->peer_id, reliable_data); + } - // Add full new data to appropriate buffer - std::string &buffer = aom.reliable ? reliable_data : unreliable_data; - char idbuf[2]; - writeU16((u8*) idbuf, aom.id); - // u16 id - // std::string data - buffer.append(idbuf, sizeof(idbuf)); - buffer.append(serializeString(aom.datastring)); + if (!unreliable_data.empty()) { + SendActiveObjectMessages(client->peer_id, unreliable_data, false); } } - /* - reliable_data and unreliable_data are now ready. - Send them. - */ - if (!reliable_data.empty()) { - SendActiveObjectMessages(client->peer_id, reliable_data); - } - - if (!unreliable_data.empty()) { - SendActiveObjectMessages(client->peer_id, unreliable_data, false); - } } - m_clients.unlock(); // Clear buffered_messages for (auto &buffered_message : buffered_messages) { @@ -827,20 +888,18 @@ void Server::AsyncRunStep(bool initial_step) // We will be accessing the environment MutexAutoLock lock(m_env_mutex); - // Don't send too many at a time - //u32 count = 0; - - // Single change sending is disabled if queue size is not small + // Single change sending is disabled if queue size is big bool disable_single_change_sending = false; if(m_unsent_map_edit_queue.size() >= 4) disable_single_change_sending = true; - int event_count = m_unsent_map_edit_queue.size(); + const auto event_count = m_unsent_map_edit_queue.size(); + m_map_edit_event_counter->increment(event_count); // We'll log the amount of each Profiler prof; - std::list<v3s16> node_meta_updates; + std::unordered_set<v3s16> node_meta_updates; while (!m_unsent_map_edit_queue.empty()) { MapEditEvent* event = m_unsent_map_edit_queue.front(); @@ -867,9 +926,7 @@ void Server::AsyncRunStep(bool initial_step) case MEET_BLOCK_NODE_METADATA_CHANGED: { prof.add("MEET_BLOCK_NODE_METADATA_CHANGED", 1); if (!event->is_private_change) { - // Don't send the change yet. Collect them to eliminate dupes. - node_meta_updates.remove(event->p); - node_meta_updates.push_back(event->p); + node_meta_updates.emplace(event->p); } if (MapBlock *block = m_env->getMap().getBlockNoCreateNoEx( @@ -922,19 +979,19 @@ void Server::AsyncRunStep(bool initial_step) } // Send all metadata updates - if (node_meta_updates.size()) + if (!node_meta_updates.empty()) sendMetadataChanged(node_meta_updates); } /* - Trigger emergethread (it somehow gets to a non-triggered but - bysy state sometimes) + Trigger emerge thread + Doing this every 2s is left over from old code, unclear if this is still needed. */ { float &counter = m_emergethread_trigger_timer; - counter += dtime; - if (counter >= 2.0) { - counter = 0.0; + counter -= dtime; + if (counter <= 0.0f) { + counter = 2.0f; m_emerge->startThreads(); } @@ -1005,8 +1062,7 @@ void Server::Receive() } catch (const ClientStateError &e) { errorstream << "ProcessData: peer=" << peer_id << " what()=" << e.what() << std::endl; - DenyAccess_Legacy(peer_id, L"Your client sent something server didn't expect." - L"Try reconnecting or updating your client"); + DenyAccess(peer_id, SERVER_ACCESSDENIED_UNEXPECTED_DATA); } catch (const con::PeerNotFoundException &e) { // Do nothing } catch (const con::NoIncomingDataException &e) { @@ -1019,18 +1075,14 @@ PlayerSAO* Server::StageTwoClientInit(session_t peer_id) { std::string playername; PlayerSAO *playersao = NULL; - m_clients.lock(); - try { + { + ClientInterface::AutoLock clientlock(m_clients); RemoteClient* client = m_clients.lockedGetClientNoEx(peer_id, CS_InitDone); if (client) { playername = client->getName(); playersao = emergePlayer(playername.c_str(), peer_id, client->net_proto_version); } - } catch (std::exception &e) { - m_clients.unlock(); - throw; } - m_clients.unlock(); RemotePlayer *player = m_env->getPlayer(playername.c_str()); @@ -1039,15 +1091,13 @@ PlayerSAO* Server::StageTwoClientInit(session_t peer_id) if (player && player->getPeerId() != PEER_ID_INEXISTENT) { actionstream << "Server: Failed to emerge player \"" << playername << "\" (player allocated to an another client)" << std::endl; - DenyAccess_Legacy(peer_id, L"Another client is connected with this " - L"name. If your client closed unexpectedly, try again in " - L"a minute."); + DenyAccess(peer_id, SERVER_ACCESSDENIED_ALREADY_CONNECTED); } else { errorstream << "Server: " << playername << ": Failed to emerge player" << std::endl; - DenyAccess_Legacy(peer_id, L"Could not allocate player."); + DenyAccess(peer_id, SERVER_ACCESSDENIED_SERVER_FAIL); } - return NULL; + return nullptr; } /* @@ -1064,31 +1114,32 @@ PlayerSAO* Server::StageTwoClientInit(session_t peer_id) // Send inventory SendInventory(playersao, false); - // Send HP or death screen + // Send HP + SendPlayerHP(playersao, false); + + // Send death screen if (playersao->isDead()) SendDeathscreen(peer_id, false, v3f(0,0,0)); - else - SendPlayerHPOrDie(playersao, - PlayerHPChangeReason(PlayerHPChangeReason::SET_HP)); // Send Breath SendPlayerBreath(playersao); /* - Print out action + Update player list and print action */ { - Address addr = getPeerAddress(player->getPeerId()); - std::string ip_str = addr.serializeString(); - const std::vector<std::string> &names = m_clients.getPlayerNames(); + NetworkPacket notice_pkt(TOCLIENT_UPDATE_PLAYER_LIST, 0, PEER_ID_INEXISTENT); + notice_pkt << (u8) PLAYER_LIST_ADD << (u16) 1 << std::string(player->getName()); + m_clients.sendToAll(¬ice_pkt); + } + { + std::string ip_str = getPeerAddress(player->getPeerId()).serializeString(); + const auto &names = m_clients.getPlayerNames(); actionstream << player->getName() << " [" << ip_str << "] joins game. List of players: "; - - for (const std::string &name : names) { + for (const std::string &name : names) actionstream << name << " "; - } - - actionstream << player->getName() <<std::endl; + actionstream << player->getName() << std::endl; } return playersao; } @@ -1111,18 +1162,16 @@ void Server::ProcessData(NetworkPacket *pkt) Address address = getPeerAddress(peer_id); std::string addr_s = address.serializeString(); - if(m_banmanager->isIpBanned(addr_s)) { + // FIXME: Isn't it a bit excessive to check this for every packet? + if (m_banmanager->isIpBanned(addr_s)) { std::string ban_name = m_banmanager->getBanName(addr_s); infostream << "Server: A banned client tried to connect from " - << addr_s << "; banned name was " - << ban_name << std::endl; - // This actually doesn't seem to transfer to the client - DenyAccess_Legacy(peer_id, L"Your ip is banned. Banned name was " - + utf8_to_wide(ban_name)); + << addr_s << "; banned name was " << ban_name << std::endl; + DenyAccess(peer_id, SERVER_ACCESSDENIED_CUSTOM_STRING, + "Your IP is banned. Banned name was " + ban_name); return; } - } - catch(con::PeerNotFoundException &e) { + } catch (con::PeerNotFoundException &e) { /* * no peer for this packet found * most common reason is peer timeout, e.g. peer didn't @@ -1202,13 +1251,12 @@ void Server::onMapEditEvent(const MapEditEvent &event) void Server::SetBlocksNotSent(std::map<v3s16, MapBlock *>& block) { std::vector<session_t> clients = m_clients.getClientIDs(); - m_clients.lock(); + ClientInterface::AutoLock clientlock(m_clients); // Set the modified blocks unsent for all the clients for (const session_t client_id : clients) { if (RemoteClient *client = m_clients.lockedGetClientNoEx(client_id)) client->SetBlocksNotSent(block); } - m_clients.unlock(); } void Server::peerAdded(con::Peer *peer) @@ -1234,39 +1282,26 @@ bool Server::getClientConInfo(session_t peer_id, con::rtt_stat_type type, float* return *retval != -1; } -bool Server::getClientInfo( - session_t peer_id, - ClientState* state, - u32* uptime, - u8* ser_vers, - u16* prot_vers, - u8* major, - u8* minor, - u8* patch, - std::string* vers_string, - std::string* lang_code - ) +bool Server::getClientInfo(session_t peer_id, ClientInfo &ret) { - *state = m_clients.getClientState(peer_id); - m_clients.lock(); + ClientInterface::AutoLock clientlock(m_clients); RemoteClient* client = m_clients.lockedGetClientNoEx(peer_id, CS_Invalid); - if (!client) { - m_clients.unlock(); + if (!client) return false; - } - *uptime = client->uptime(); - *ser_vers = client->serialization_version; - *prot_vers = client->net_proto_version; + ret.state = client->getState(); + ret.addr = client->getAddress(); + ret.uptime = client->uptime(); + ret.ser_vers = client->serialization_version; + ret.prot_vers = client->net_proto_version; - *major = client->getMajor(); - *minor = client->getMinor(); - *patch = client->getPatch(); - *vers_string = client->getFull(); - *lang_code = client->getLangCode(); + ret.major = client->getMajor(); + ret.minor = client->getMinor(); + ret.patch = client->getPatch(); + ret.vers_string = client->getFullVer(); - m_clients.unlock(); + ret.lang_code = client->getLangCode(); return true; } @@ -1344,24 +1379,27 @@ void Server::SendMovement(session_t peer_id) Send(&pkt); } -void Server::SendPlayerHPOrDie(PlayerSAO *playersao, const PlayerHPChangeReason &reason) +void Server::HandlePlayerHPChange(PlayerSAO *playersao, const PlayerHPChangeReason &reason) { - if (playersao->isImmortal()) - return; + m_script->player_event(playersao, "health_changed"); + SendPlayerHP(playersao, reason.type != PlayerHPChangeReason::SET_HP_MAX); - session_t peer_id = playersao->getPeerID(); - bool is_alive = playersao->getHP() > 0; + // Send to other clients + playersao->sendPunchCommand(); - if (is_alive) - SendPlayerHP(peer_id); - else - DiePlayer(peer_id, reason); + if (playersao->isDead()) + HandlePlayerDeath(playersao, reason); } -void Server::SendHP(session_t peer_id, u16 hp) +void Server::SendPlayerHP(PlayerSAO *playersao, bool effect) { - NetworkPacket pkt(TOCLIENT_HP, 1, peer_id); - pkt << hp; + SendHP(playersao->getPeerID(), playersao->getHP(), effect); +} + +void Server::SendHP(session_t peer_id, u16 hp, bool effect) +{ + NetworkPacket pkt(TOCLIENT_HP, 3, peer_id); + pkt << hp << effect; Send(&pkt); } @@ -1387,13 +1425,6 @@ void Server::SendAccessDenied(session_t peer_id, AccessDeniedCode reason, Send(&pkt); } -void Server::SendAccessDenied_Legacy(session_t peer_id,const std::wstring &reason) -{ - NetworkPacket pkt(TOCLIENT_ACCESS_DENIED_LEGACY, 0, peer_id); - pkt << reason; - Send(&pkt); -} - void Server::SendDeathscreen(session_t peer_id, bool set_camera_point_target, v3f camera_point_target) { @@ -1483,7 +1514,8 @@ void Server::SendChatMessage(session_t peer_id, const ChatMessage &message) NetworkPacket pkt(TOCLIENT_CHAT_MESSAGE, 0, peer_id); u8 version = 1; u8 type = message.type; - pkt << version << type << std::wstring(L"") << message.message << (u64)message.timestamp; + pkt << version << type << message.sender << message.message + << static_cast<u64>(message.timestamp); if (peer_id != PEER_ID_INEXISTENT) { RemotePlayer *player = m_env->getPlayer(peer_id); @@ -1569,7 +1601,12 @@ void Server::SendAddParticleSpawner(session_t peer_id, u16 protocol_version, if (peer_id == PEER_ID_INEXISTENT) { std::vector<session_t> clients = m_clients.getClientIDs(); - const v3f pos = (p.minpos + p.maxpos) / 2.0f * BS; + const v3f pos = ( + p.pos.start.min.val + + p.pos.start.max.val + + p.pos.end.min.val + + p.pos.end.max.val + ) / 4.0f * BS; const float radius_sq = radius * radius; /* Don't send short-lived spawners to distant players. * This could be replaced with proper tracking at some point. */ @@ -1597,11 +1634,19 @@ void Server::SendAddParticleSpawner(session_t peer_id, u16 protocol_version, NetworkPacket pkt(TOCLIENT_ADD_PARTICLESPAWNER, 100, peer_id); - pkt << p.amount << p.time << p.minpos << p.maxpos << p.minvel - << p.maxvel << p.minacc << p.maxacc << p.minexptime << p.maxexptime - << p.minsize << p.maxsize << p.collisiondetection; + pkt << p.amount << p.time; + { // serialize legacy fields + std::ostringstream os(std::ios_base::binary); + p.pos.start.legacySerialize(os); + p.vel.start.legacySerialize(os); + p.acc.start.legacySerialize(os); + p.exptime.start.legacySerialize(os); + p.size.start.legacySerialize(os); + pkt.putRawString(os.str()); + } + pkt << p.collisiondetection; - pkt.putLongString(p.texture); + pkt.putLongString(p.texture.string); pkt << id << p.vertical << p.collision_removal << attached_id; { @@ -1612,6 +1657,51 @@ void Server::SendAddParticleSpawner(session_t peer_id, u16 protocol_version, pkt << p.glow << p.object_collision; pkt << p.node.param0 << p.node.param2 << p.node_tile; + { // serialize new fields + // initial bias for older properties + pkt << p.pos.start.bias + << p.vel.start.bias + << p.acc.start.bias + << p.exptime.start.bias + << p.size.start.bias; + + std::ostringstream os(std::ios_base::binary); + + // final tween frames of older properties + p.pos.end.serialize(os); + p.vel.end.serialize(os); + p.acc.end.serialize(os); + p.exptime.end.serialize(os); + p.size.end.serialize(os); + + // properties for legacy texture field + p.texture.serialize(os, protocol_version, true); + + // new properties + p.drag.serialize(os); + p.jitter.serialize(os); + p.bounce.serialize(os); + ParticleParamTypes::serializeParameterValue(os, p.attractor_kind); + if (p.attractor_kind != ParticleParamTypes::AttractorKind::none) { + p.attract.serialize(os); + p.attractor_origin.serialize(os); + writeU16(os, p.attractor_attachment); /* object ID */ + writeU8(os, p.attractor_kill); + if (p.attractor_kind != ParticleParamTypes::AttractorKind::point) { + p.attractor_direction.serialize(os); + writeU16(os, p.attractor_direction_attachment); + } + } + p.radius.serialize(os); + + ParticleParamTypes::serializeParameterValue(os, (u16)p.texpool.size()); + for (const auto& tex : p.texpool) { + tex.serialize(os, protocol_version); + } + + pkt.putRawString(os.str()); + } + Send(&pkt); } @@ -1635,7 +1725,7 @@ void Server::SendHUDAdd(session_t peer_id, u32 id, HudElement *form) pkt << id << (u8) form->type << form->pos << form->name << form->scale << form->text << form->number << form->item << form->dir << form->align << form->offset << form->world_pos << form->size - << form->z_index << form->text2; + << form->z_index << form->text2 << form->style; Send(&pkt); } @@ -1670,10 +1760,7 @@ void Server::SendHUDChange(session_t peer_id, u32 id, HudElementStat stat, void case HUD_STAT_SIZE: pkt << *(v2s32 *) value; break; - case HUD_STAT_NUMBER: - case HUD_STAT_ITEM: - case HUD_STAT_DIR: - default: + default: // all other types pkt << *(u32 *) value; break; } @@ -1754,7 +1841,8 @@ void Server::SendSetStars(session_t peer_id, const StarParams ¶ms) NetworkPacket pkt(TOCLIENT_SET_STARS, 0, peer_id); pkt << params.visible << params.count - << params.starcolor << params.scale; + << params.starcolor << params.scale + << params.day_opacity; Send(&pkt); } @@ -1778,6 +1866,16 @@ void Server::SendOverrideDayNightRatio(session_t peer_id, bool do_override, Send(&pkt); } +void Server::SendSetLighting(session_t peer_id, const Lighting &lighting) +{ + NetworkPacket pkt(TOCLIENT_SET_LIGHTING, + 4, peer_id); + + pkt << lighting.shadow_intensity; + + Send(&pkt); +} + void Server::SendTimeOfDay(session_t peer_id, u16 time, f32 time_speed) { NetworkPacket pkt(TOCLIENT_TIME_OF_DAY, 0, peer_id); @@ -1791,18 +1889,6 @@ void Server::SendTimeOfDay(session_t peer_id, u16 time, f32 time_speed) } } -void Server::SendPlayerHP(session_t peer_id) -{ - PlayerSAO *playersao = getPlayerSAO(peer_id); - assert(playersao); - - SendHP(peer_id, playersao->getHP()); - m_script->player_event(playersao,"health_changed"); - - // Send to other clients - playersao->sendPunchCommand(); -} - void Server::SendPlayerBreath(PlayerSAO *sao) { assert(sao); @@ -1818,6 +1904,9 @@ void Server::SendMovePlayer(session_t peer_id) PlayerSAO *sao = player->getPlayerSAO(); assert(sao); + // Send attachment updates instantly to the client prior updating position + sao->sendOutdatedData(); + NetworkPacket pkt(TOCLIENT_MOVE_PLAYER, sizeof(v3f) + sizeof(f32) * 2, peer_id); pkt << sao->getBasePosition() << sao->getLookPitch() << sao->getRotation().Y; @@ -1988,7 +2077,7 @@ void Server::SendActiveObjectRemoveAdd(RemoteClient *client, PlayerSAO *playersa writeU8((u8*)buf, type); data.append(buf, 1); - data.append(serializeLongString( + data.append(serializeString32( obj->getClientInitializationData(client->net_proto_version))); // Add to known objects @@ -2044,14 +2133,13 @@ inline s32 Server::nextSoundId() return ret; } -s32 Server::playSound(const SimpleSoundSpec &spec, - const ServerSoundParams ¶ms, bool ephemeral) +s32 Server::playSound(ServerPlayingSound ¶ms, bool ephemeral) { // Find out initial position of sound bool pos_exists = false; - v3f pos = params.getPos(m_env, &pos_exists); + const v3f pos = params.getPos(m_env, &pos_exists); // If position is not found while it should be, cancel sound - if(pos_exists != (params.type != ServerSoundParams::SSP_LOCAL)) + if(pos_exists != (params.type != SoundLocation::Local)) return -1; // Filter destination clients @@ -2096,101 +2184,68 @@ s32 Server::playSound(const SimpleSoundSpec &spec, if(dst_clients.empty()) return -1; - // Create the sound - s32 id; - ServerPlayingSound *psound = nullptr; - if (ephemeral) { - id = -1; // old clients will still use this, so pick a reserved ID - } else { - id = nextSoundId(); - // The sound will exist as a reference in m_playing_sounds - m_playing_sounds[id] = ServerPlayingSound(); - psound = &m_playing_sounds[id]; - psound->params = params; - psound->spec = spec; - } + // old clients will still use this, so pick a reserved ID (-1) + const s32 id = ephemeral ? -1 : nextSoundId(); - float gain = params.gain * spec.gain; + float gain = params.gain * params.spec.gain; NetworkPacket pkt(TOCLIENT_PLAY_SOUND, 0); - pkt << id << spec.name << gain + pkt << id << params.spec.name << gain << (u8) params.type << pos << params.object - << params.loop << params.fade << params.pitch + << params.spec.loop << params.spec.fade << params.spec.pitch << ephemeral; bool as_reliable = !ephemeral; - for (const u16 dst_client : dst_clients) { - if (psound) - psound->clients.insert(dst_client); - m_clients.send(dst_client, 0, &pkt, as_reliable); + for (const session_t peer_id : dst_clients) { + if (!ephemeral) + params.clients.insert(peer_id); + m_clients.send(peer_id, 0, &pkt, as_reliable); } + + if (!ephemeral) + m_playing_sounds[id] = std::move(params); return id; } void Server::stopSound(s32 handle) { - // Get sound reference - std::unordered_map<s32, ServerPlayingSound>::iterator i = - m_playing_sounds.find(handle); - if (i == m_playing_sounds.end()) + auto it = m_playing_sounds.find(handle); + if (it == m_playing_sounds.end()) return; - ServerPlayingSound &psound = i->second; + + ServerPlayingSound &psound = it->second; NetworkPacket pkt(TOCLIENT_STOP_SOUND, 4); pkt << handle; - for (std::unordered_set<session_t>::const_iterator si = psound.clients.begin(); - si != psound.clients.end(); ++si) { + for (session_t peer_id : psound.clients) { // Send as reliable - m_clients.send(*si, 0, &pkt, true); + m_clients.send(peer_id, 0, &pkt, true); } + // Remove sound reference - m_playing_sounds.erase(i); + m_playing_sounds.erase(it); } void Server::fadeSound(s32 handle, float step, float gain) { - // Get sound reference - std::unordered_map<s32, ServerPlayingSound>::iterator i = - m_playing_sounds.find(handle); - if (i == m_playing_sounds.end()) + auto it = m_playing_sounds.find(handle); + if (it == m_playing_sounds.end()) return; - ServerPlayingSound &psound = i->second; - psound.params.gain = gain; + ServerPlayingSound &psound = it->second; + psound.gain = gain; // destination gain NetworkPacket pkt(TOCLIENT_FADE_SOUND, 4); pkt << handle << step << gain; - // Backwards compability - bool play_sound = gain > 0; - ServerPlayingSound compat_psound = psound; - compat_psound.clients.clear(); - - NetworkPacket compat_pkt(TOCLIENT_STOP_SOUND, 4); - compat_pkt << handle; - - for (std::unordered_set<u16>::iterator it = psound.clients.begin(); - it != psound.clients.end();) { - if (m_clients.getProtocolVersion(*it) >= 32) { - // Send as reliable - m_clients.send(*it, 0, &pkt, true); - ++it; - } else { - compat_psound.clients.insert(*it); - // Stop old sound - m_clients.send(*it, 0, &compat_pkt, true); - psound.clients.erase(it++); - } + for (session_t peer_id : psound.clients) { + // Send as reliable + m_clients.send(peer_id, 0, &pkt, true); } // Remove sound reference - if (!play_sound || psound.clients.empty()) - m_playing_sounds.erase(i); - - if (play_sound && !compat_psound.clients.empty()) { - // Play new sound volume on older clients - playSound(compat_psound.spec, compat_psound.params); - } + if (gain <= 0 || psound.clients.empty()) + m_playing_sounds.erase(it); } void Server::sendRemoveNode(v3s16 p, std::unordered_set<u16> *far_players, @@ -2204,7 +2259,7 @@ void Server::sendRemoveNode(v3s16 p, std::unordered_set<u16> *far_players, pkt << p; std::vector<session_t> clients = m_clients.getClientIDs(); - m_clients.lock(); + ClientInterface::AutoLock clientlock(m_clients); for (session_t client_id : clients) { RemoteClient *client = m_clients.lockedGetClientNoEx(client_id); @@ -2227,8 +2282,6 @@ void Server::sendRemoveNode(v3s16 p, std::unordered_set<u16> *far_players, // Send as reliable m_clients.send(client_id, 0, &pkt, true); } - - m_clients.unlock(); } void Server::sendAddNode(v3s16 p, MapNode n, std::unordered_set<u16> *far_players, @@ -2243,7 +2296,7 @@ void Server::sendAddNode(v3s16 p, MapNode n, std::unordered_set<u16> *far_player << (u8) (remove_metadata ? 0 : 1); std::vector<session_t> clients = m_clients.getClientIDs(); - m_clients.lock(); + ClientInterface::AutoLock clientlock(m_clients); for (session_t client_id : clients) { RemoteClient *client = m_clients.lockedGetClientNoEx(client_id); @@ -2266,35 +2319,35 @@ void Server::sendAddNode(v3s16 p, MapNode n, std::unordered_set<u16> *far_player // Send as reliable m_clients.send(client_id, 0, &pkt, true); } - - m_clients.unlock(); } -void Server::sendMetadataChanged(const std::list<v3s16> &meta_updates, float far_d_nodes) +void Server::sendMetadataChanged(const std::unordered_set<v3s16> &positions, float far_d_nodes) { - float maxd = far_d_nodes * BS; NodeMetadataList meta_updates_list(false); - std::vector<session_t> clients = m_clients.getClientIDs(); + std::ostringstream os(std::ios::binary); - m_clients.lock(); + std::vector<session_t> clients = m_clients.getClientIDs(); + ClientInterface::AutoLock clientlock(m_clients); for (session_t i : clients) { RemoteClient *client = m_clients.lockedGetClientNoEx(i); if (!client) continue; - ServerActiveObject *player = m_env->getActiveObject(i); - v3f player_pos = player ? player->getBasePosition() : v3f(); + ServerActiveObject *player = getPlayerSAO(i); + v3s16 player_pos; + if (player) + player_pos = floatToInt(player->getBasePosition(), BS); - for (const v3s16 &pos : meta_updates) { + for (const v3s16 pos : positions) { NodeMetadata *meta = m_env->getMap().getNodeMetadata(pos); if (!meta) continue; v3s16 block_pos = getNodeBlockPos(pos); - if (!client->isBlockSent(block_pos) || (player && - player_pos.getDistanceFrom(intToFloat(pos, BS)) > maxd)) { + if (!client->isBlockSent(block_pos) || + player_pos.getDistanceFrom(pos) > far_d_nodes) { client->SetBlockNotSent(block_pos); continue; } @@ -2306,38 +2359,49 @@ void Server::sendMetadataChanged(const std::list<v3s16> &meta_updates, float far continue; // Send the meta changes - std::ostringstream os(std::ios::binary); - meta_updates_list.serialize(os, client->net_proto_version, false, true); - std::ostringstream oss(std::ios::binary); - compressZlib(os.str(), oss); + os.str(""); + meta_updates_list.serialize(os, client->serialization_version, false, true, true); + std::string raw = os.str(); + os.str(""); + compressZlib(raw, os); - NetworkPacket pkt(TOCLIENT_NODEMETA_CHANGED, 0); - pkt.putLongString(oss.str()); - m_clients.send(i, 0, &pkt, true); + NetworkPacket pkt(TOCLIENT_NODEMETA_CHANGED, 0, i); + pkt.putLongString(os.str()); + Send(&pkt); meta_updates_list.clear(); } - - m_clients.unlock(); } void Server::SendBlockNoLock(session_t peer_id, MapBlock *block, u8 ver, - u16 net_proto_version) + u16 net_proto_version, SerializedBlockCache *cache) { - /* - Create a packet with the block in the right format - */ + thread_local const int net_compression_level = rangelim(g_settings->getS16("map_compression_level_net"), -1, 9); + std::string s, *sptr = nullptr; - std::ostringstream os(std::ios_base::binary); - block->serialize(os, ver, false); - block->serializeNetworkSpecific(os); - std::string s = os.str(); + if (cache) { + auto it = cache->find({block->getPos(), ver}); + if (it != cache->end()) + sptr = &it->second; + } - NetworkPacket pkt(TOCLIENT_BLOCKDATA, 2 + 2 + 2 + 2 + s.size(), peer_id); + // Serialize the block in the right format + if (!sptr) { + std::ostringstream os(std::ios_base::binary); + block->serialize(os, ver, false, net_compression_level); + block->serializeNetworkSpecific(os); + s = os.str(); + sptr = &s; + } + NetworkPacket pkt(TOCLIENT_BLOCKDATA, 2 + 2 + 2 + sptr->size(), peer_id); pkt << block->getPos(); - pkt.putRawString(s.c_str(), s.size()); + pkt.putRawString(*sptr); Send(&pkt); + + // Store away in cache + if (cache && sptr == &s) + (*cache)[{block->getPos(), ver}] = std::move(s); } void Server::SendBlocks(float dtime) @@ -2347,14 +2411,14 @@ void Server::SendBlocks(float dtime) std::vector<PrioritySortedBlockTransfer> queue; - u32 total_sending = 0; + u32 total_sending = 0, unique_clients = 0; { ScopeProfiler sp2(g_profiler, "Server::SendBlocks(): Collect list"); std::vector<session_t> clients = m_clients.getClientIDs(); - m_clients.lock(); + ClientInterface::AutoLock clientlock(m_clients); for (const session_t client_id : clients) { RemoteClient *client = m_clients.lockedGetClientNoEx(client_id, CS_Active); @@ -2362,9 +2426,10 @@ void Server::SendBlocks(float dtime) continue; total_sending += client->getSendingCount(); + const auto old_count = queue.size(); client->GetNextBlocks(m_env,m_emerge, dtime, queue); + unique_clients += queue.size() > old_count ? 1 : 0; } - m_clients.unlock(); } // Sort. @@ -2372,7 +2437,7 @@ void Server::SendBlocks(float dtime) // Lowest is most important. std::sort(queue.begin(), queue.end()); - m_clients.lock(); + ClientInterface::AutoLock clientlock(m_clients); // Maximal total count calculation // The per-client block sends is halved with the maximal online users @@ -2382,6 +2447,12 @@ void Server::SendBlocks(float dtime) ScopeProfiler sp(g_profiler, "Server::SendBlocks(): Send to clients"); Map &map = m_env->getMap(); + SerializedBlockCache cache, *cache_ptr = nullptr; + if (unique_clients > 1) { + // caching is pointless with a single client + cache_ptr = &cache; + } + for (const PrioritySortedBlockTransfer &block_to_send : queue) { if (total_sending >= max_blocks_to_send) break; @@ -2396,12 +2467,11 @@ void Server::SendBlocks(float dtime) continue; SendBlockNoLock(block_to_send.peer_id, block, client->serialization_version, - client->net_proto_version); + client->net_proto_version, cache_ptr); client->SentBlock(block_to_send.pos); total_sending++; } - m_clients.unlock(); } bool Server::SendBlock(session_t peer_id, const v3s16 &blockpos) @@ -2410,15 +2480,12 @@ bool Server::SendBlock(session_t peer_id, const v3s16 &blockpos) if (!block) return false; - m_clients.lock(); + ClientInterface::AutoLock clientlock(m_clients); RemoteClient *client = m_clients.lockedGetClientNoEx(peer_id, CS_Active); - if (!client || client->isBlockSent(blockpos)) { - m_clients.unlock(); + if (!client || client->isBlockSent(blockpos)) return false; - } SendBlockNoLock(peer_id, block, client->serialization_version, client->net_proto_version); - m_clients.unlock(); return true; } @@ -2436,9 +2503,8 @@ bool Server::addMediaFile(const std::string &filename, // If name is not in a supported format, ignore it const char *supported_ext[] = { ".png", ".jpg", ".bmp", ".tga", - ".pcx", ".ppm", ".psd", ".wal", ".rgb", ".ogg", - ".x", ".b3d", ".md2", ".obj", + ".x", ".b3d", ".obj", // Custom translation file format ".tr", NULL @@ -2490,7 +2556,9 @@ void Server::fillMediaCache() // Collect all media file paths std::vector<std::string> paths; - // The paths are ordered in descending priority + + // ordered in descending priority + paths.push_back(getBuiltinLuaPath() + DIR_DELIM + "locale"); fs::GetRecursiveDirs(paths, porting::path_user + DIR_DELIM + "textures" + DIR_DELIM + "server"); fs::GetRecursiveDirs(paths, m_gamespec.path + DIR_DELIM + "textures"); m_modmgr->getModsMediaPaths(paths); @@ -2524,6 +2592,8 @@ void Server::sendMediaAnnouncement(session_t peer_id, const std::string &lang_co std::string lang_suffix; lang_suffix.append(".").append(lang_code).append(".tr"); for (const auto &i : m_media) { + if (i.second.no_announce) + continue; if (str_ends_with(i.first, ".tr") && !str_ends_with(i.first, lang_suffix)) continue; media_sent++; @@ -2532,6 +2602,8 @@ void Server::sendMediaAnnouncement(session_t peer_id, const std::string &lang_co pkt << media_sent; for (const auto &i : m_media) { + if (i.second.no_announce) + continue; if (str_ends_with(i.first, ".tr") && !str_ends_with(i.first, lang_suffix)) continue; pkt << i.first << i.second.sha1_digest; @@ -2550,11 +2622,9 @@ struct SendableMedia std::string path; std::string data; - SendableMedia(const std::string &name_="", const std::string &path_="", - const std::string &data_=""): - name(name_), - path(path_), - data(data_) + SendableMedia(const std::string &name, const std::string &path, + std::string &&data): + name(name), path(path), data(std::move(data)) {} }; @@ -2581,40 +2651,19 @@ void Server::sendRequestedMedia(session_t peer_id, continue; } - //TODO get path + name - std::string tpath = m_media[name].path; + const auto &m = m_media[name]; // Read data - std::ifstream fis(tpath.c_str(), std::ios_base::binary); - if(!fis.good()){ - errorstream<<"Server::sendRequestedMedia(): Could not open \"" - <<tpath<<"\" for reading"<<std::endl; + std::string data; + if (!fs::ReadFile(m.path, data)) { + errorstream << "Server::sendRequestedMedia(): Failed to read \"" + << name << "\"" << std::endl; continue; } - std::ostringstream tmp_os(std::ios_base::binary); - bool bad = false; - for(;;) { - char buf[1024]; - fis.read(buf, 1024); - std::streamsize len = fis.gcount(); - tmp_os.write(buf, len); - file_size_bunch_total += len; - if(fis.eof()) - break; - if(!fis.good()) { - bad = true; - break; - } - } - if (bad) { - errorstream<<"Server::sendRequestedMedia(): Failed to read \"" - <<name<<"\""<<std::endl; - continue; - } - /*infostream<<"Server::sendRequestedMedia(): Loaded \"" - <<tname<<"\""<<std::endl;*/ + file_size_bunch_total += data.size(); + // Put in list - file_bunches[file_bunches.size()-1].emplace_back(name, tpath, tmp_os.str()); + file_bunches.back().emplace_back(name, m.path, std::move(data)); // Start next bunch if got enough data if(file_size_bunch_total >= bytes_per_bunch) { @@ -2657,6 +2706,50 @@ void Server::sendRequestedMedia(session_t peer_id, } } +void Server::stepPendingDynMediaCallbacks(float dtime) +{ + MutexAutoLock lock(m_env_mutex); + + for (auto it = m_pending_dyn_media.begin(); it != m_pending_dyn_media.end();) { + it->second.expiry_timer -= dtime; + bool del = it->second.waiting_players.empty() || it->second.expiry_timer < 0; + + if (!del) { + it++; + continue; + } + + const auto &name = it->second.filename; + if (!name.empty()) { + assert(m_media.count(name)); + // if no_announce isn't set we're definitely deleting the wrong file! + sanity_check(m_media[name].no_announce); + + fs::DeleteSingleFileOrEmptyDirectory(m_media[name].path); + m_media.erase(name); + } + getScriptIface()->freeDynamicMediaCallback(it->first); + it = m_pending_dyn_media.erase(it); + } +} + +void Server::SendMinimapModes(session_t peer_id, + std::vector<MinimapMode> &modes, size_t wanted_mode) +{ + RemotePlayer *player = m_env->getPlayer(peer_id); + assert(player); + if (player->getPeerId() == PEER_ID_INEXISTENT) + return; + + NetworkPacket pkt(TOCLIENT_MINIMAP_MODES, 0, peer_id); + pkt << (u16)modes.size() << (u16)wanted_mode; + + for (auto &mode : modes) + pkt << (u16)mode.type << mode.label << mode.size << mode.texture << mode.scale; + + Send(&pkt); +} + void Server::sendDetachedInventory(Inventory *inventory, const std::string &name, session_t peer_id) { NetworkPacket pkt(TOCLIENT_DETACHED_INVENTORY, 0, peer_id); @@ -2702,23 +2795,18 @@ void Server::sendDetachedInventories(session_t peer_id, bool incremental) Something random */ -void Server::DiePlayer(session_t peer_id, const PlayerHPChangeReason &reason) +void Server::HandlePlayerDeath(PlayerSAO *playersao, const PlayerHPChangeReason &reason) { - PlayerSAO *playersao = getPlayerSAO(peer_id); - assert(playersao); - infostream << "Server::DiePlayer(): Player " << playersao->getPlayer()->getName() << " dies" << std::endl; - playersao->setHP(0, reason); playersao->clearParentAttachment(); // Trigger scripted stuff m_script->on_dieplayer(playersao, reason); - SendPlayerHP(peer_id); - SendDeathscreen(peer_id, false, v3f(0,0,0)); + SendDeathscreen(playersao->getPeerID(), false, v3f(0,0,0)); } void Server::RespawnPlayer(session_t peer_id) @@ -2730,17 +2818,16 @@ void Server::RespawnPlayer(session_t peer_id) << playersao->getPlayer()->getName() << " respawns" << std::endl; - playersao->setHP(playersao->accessObjectProperties()->hp_max, + const auto *prop = playersao->accessObjectProperties(); + playersao->setHP(prop->hp_max, PlayerHPChangeReason(PlayerHPChangeReason::RESPAWN)); - playersao->setBreath(playersao->accessObjectProperties()->breath_max); + playersao->setBreath(prop->breath_max); bool repositioned = m_script->on_respawnplayer(playersao); if (!repositioned) { // setPos will send the new position to client playersao->setPos(findSpawnPos()); } - - SendPlayerHP(peer_id); } @@ -2751,29 +2838,10 @@ void Server::DenySudoAccess(session_t peer_id) } -void Server::DenyAccessVerCompliant(session_t peer_id, u16 proto_ver, AccessDeniedCode reason, - const std::string &str_reason, bool reconnect) -{ - SendAccessDenied(peer_id, reason, str_reason, reconnect); - - m_clients.event(peer_id, CSE_SetDenied); - DisconnectPeer(peer_id); -} - - void Server::DenyAccess(session_t peer_id, AccessDeniedCode reason, - const std::string &custom_reason) + const std::string &custom_reason, bool reconnect) { - SendAccessDenied(peer_id, reason, custom_reason); - m_clients.event(peer_id, CSE_SetDenied); - DisconnectPeer(peer_id); -} - -// 13/03/15: remove this function when protocol version 25 will become -// the minimum version for MT users, maybe in 1 year -void Server::DenyAccess_Legacy(session_t peer_id, const std::wstring &reason) -{ - SendAccessDenied_Legacy(peer_id, reason); + SendAccessDenied(peer_id, reason, custom_reason, reconnect); m_clients.event(peer_id, CSE_SetDenied); DisconnectPeer(peer_id); } @@ -2939,7 +3007,7 @@ void Server::handleChatInterfaceEvent(ChatEvent *evt) } } -std::wstring Server::handleChat(const std::string &name, const std::wstring &wname, +std::wstring Server::handleChat(const std::string &name, std::wstring wmessage, bool check_shout_priv, RemotePlayer *player) { // If something goes wrong, this player is to blame @@ -2959,8 +3027,8 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna return ws.str(); } case RPLAYER_CHATRESULT_KICK: - DenyAccess_Legacy(player->getPeerId(), - L"You have been kicked due to message flooding."); + DenyAccess(player->getPeerId(), SERVER_ACCESSDENIED_CUSTOM_STRING, + "You have been kicked due to message flooding."); return L""; case RPLAYER_CHATRESULT_OK: break; @@ -2976,8 +3044,11 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna } auto message = trim(wide_to_utf8(wmessage)); + if (message.empty()) + return L""; + if (message.find_first_of("\n\r") != std::wstring::npos) { - return L"New lines are not permitted in chat messages"; + return L"Newlines are not permitted in chat messages"; } // Run script hook, exit if script ate the chat message @@ -2998,10 +3069,10 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna the Cyrillic alphabet and some characters on older Android devices */ #ifdef __ANDROID__ - line += L"<" + wname + L"> " + wmessage; + line += L"<" + utf8_to_wide(name) + L"> " + wmessage; #else - line += narrow_to_wide(m_script->formatChatMessage(name, - wide_to_narrow(wmessage))); + line += utf8_to_wide(m_script->formatChatMessage(name, + wide_to_utf8(wmessage))); #endif } @@ -3014,35 +3085,23 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna /* Send the message to others */ - actionstream << "CHAT: " << wide_to_narrow(unescape_enriched(line)) << std::endl; + actionstream << "CHAT: " << wide_to_utf8(unescape_enriched(line)) << std::endl; + + ChatMessage chatmsg(line); std::vector<session_t> clients = m_clients.getClientIDs(); + for (u16 cid : clients) + SendChatMessage(cid, chatmsg); - /* - Send the message back to the inital sender - if they are using protocol version >= 29 - */ - - session_t peer_id_to_avoid_sending = - (player ? player->getPeerId() : PEER_ID_INEXISTENT); - - if (player && player->protocol_version >= 29) - peer_id_to_avoid_sending = PEER_ID_INEXISTENT; - - for (u16 cid : clients) { - if (cid != peer_id_to_avoid_sending) - SendChatMessage(cid, ChatMessage(line)); - } return L""; } void Server::handleAdminChat(const ChatEventChat *evt) { std::string name = evt->nick; - std::wstring wname = utf8_to_wide(name); std::wstring wmessage = evt->evt_msg; - std::wstring answer = handleChat(name, wname, wmessage); + std::wstring answer = handleChat(name, wmessage); // If asked to send answer to sender if (!answer.empty()) { @@ -3079,46 +3138,45 @@ PlayerSAO *Server::getPlayerSAO(session_t peer_id) return player->getPlayerSAO(); } -std::wstring Server::getStatusString() +std::string Server::getStatusString() { - std::wostringstream os(std::ios_base::binary); - os << L"# Server: "; + std::ostringstream os(std::ios_base::binary); + os << "# Server: "; // Version - os << L"version=" << narrow_to_wide(g_version_string); + os << "version: " << g_version_string; + // Game + os << " | game: " << (m_gamespec.title.empty() ? m_gamespec.id : m_gamespec.title); // Uptime - os << L", uptime=" << m_uptime_counter->get(); + os << " | uptime: " << duration_to_string((int) m_uptime_counter->get()); // Max lag estimate - os << L", max_lag=" << (m_env ? m_env->getMaxLagEstimate() : 0); + os << " | max lag: " << std::setprecision(3); + os << (m_env ? m_env->getMaxLagEstimate() : 0) << "s"; // Information about clients bool first = true; - os << L", clients={"; + os << " | clients: "; if (m_env) { std::vector<session_t> clients = m_clients.getClientIDs(); for (session_t client_id : clients) { RemotePlayer *player = m_env->getPlayer(client_id); // Get name of player - std::wstring name = L"unknown"; - if (player) - name = narrow_to_wide(player->getName()); + const char *name = player ? player->getName() : "<unknown>"; // Add name to information string if (!first) - os << L", "; + os << ", "; else first = false; - os << name; } } - os << L"}"; if (m_env && !((ServerMap*)(&m_env->getMap()))->isSavingEnabled()) - os << std::endl << L"# Server: " << " WARNING: Map saving is disabled."; + os << std::endl << "# Server: " << " WARNING: Map saving is disabled."; if (!g_settings->get("motd").empty()) - os << std::endl << L"# Server: " << narrow_to_wide(g_settings->get("motd")); + os << std::endl << "# Server: " << g_settings->get("motd"); return os.str(); } @@ -3266,9 +3324,12 @@ bool Server::hudSetFlags(RemotePlayer *player, u32 flags, u32 mask) if (!player) return false; + u32 new_hud_flags = (player->hud_flags & ~mask) | flags; + if (new_hud_flags == player->hud_flags) // no change + return true; + SendHUDSetFlags(player->getPeerId(), flags, mask); - player->hud_flags &= ~mask; - player->hud_flags |= flags; + player->hud_flags = new_hud_flags; PlayerSAO* playersao = player->getPlayerSAO(); @@ -3314,7 +3375,8 @@ void Server::hudSetHotbarSelectedImage(RemotePlayer *player, const std::string & Address Server::getPeerAddress(session_t peer_id) { - return m_con->GetPeerAddress(peer_id); + // Note that this is only set after Init was received in Server::handleCommand_Init + return getClient(peer_id, CS_Invalid)->getAddress(); } void Server::setLocalPlayerAnimations(RemotePlayer *player, @@ -3376,6 +3438,13 @@ void Server::overrideDayNightRatio(RemotePlayer *player, bool do_override, SendOverrideDayNightRatio(player->getPeerId(), do_override, ratio); } +void Server::setLighting(RemotePlayer *player, const Lighting &lighting) +{ + sanity_check(player); + player->setLighting(lighting); + SendSetLighting(player->getPeerId(), lighting); +} + void Server::notifyPlayers(const std::wstring &msg) { SendChatMessage(PEER_ID_INEXISTENT, ChatMessage(msg)); @@ -3448,13 +3517,18 @@ void Server::deleteParticleSpawner(const std::string &playername, u32 id) SendDeleteParticleSpawner(peer_id, id); } -bool Server::dynamicAddMedia(const std::string &filepath) +bool Server::dynamicAddMedia(std::string filepath, + const u32 token, const std::string &to_player, bool ephemeral) { std::string filename = fs::GetFilenameFromPath(filepath.c_str()); - if (m_media.find(filename) != m_media.end()) { - errorstream << "Server::dynamicAddMedia(): file \"" << filename - << "\" already exists in media cache" << std::endl; - return false; + auto it = m_media.find(filename); + if (it != m_media.end()) { + // Allow the same path to be "added" again in certain conditions + if (ephemeral || it->second.path != filepath) { + errorstream << "Server::dynamicAddMedia(): file \"" << filename + << "\" already exists in media cache" << std::endl; + return false; + } } // Load the file and add it to our media cache @@ -3463,26 +3537,106 @@ bool Server::dynamicAddMedia(const std::string &filepath) if (!ok) return false; + if (ephemeral) { + // Create a copy of the file and swap out the path, this removes the + // requirement that mods keep the file accessible at the original path. + filepath = fs::CreateTempFile(); + bool ok = ([&] () -> bool { + if (filepath.empty()) + return false; + std::ofstream os(filepath.c_str(), std::ios::binary); + if (!os.good()) + return false; + os << filedata; + os.close(); + return !os.fail(); + })(); + if (!ok) { + errorstream << "Server: failed to create a copy of media file " + << "\"" << filename << "\"" << std::endl; + m_media.erase(filename); + return false; + } + verbosestream << "Server: \"" << filename << "\" temporarily copied to " + << filepath << std::endl; + + m_media[filename].path = filepath; + m_media[filename].no_announce = true; + // stepPendingDynMediaCallbacks will clean this up later. + } else if (!to_player.empty()) { + m_media[filename].no_announce = true; + } + // Push file to existing clients NetworkPacket pkt(TOCLIENT_MEDIA_PUSH, 0); - pkt << raw_hash << filename << (bool) true; - pkt.putLongString(filedata); + pkt << raw_hash << filename << (bool)ephemeral; - auto client_ids = m_clients.getClientIDs(CS_DefinitionsSent); - for (session_t client_id : client_ids) { - /* - The network layer only guarantees ordered delivery inside a channel. - Since the very next packet could be one that uses the media, we have - to push the media over ALL channels to ensure it is processed before - it is used. - In practice this means we have to send it twice: - - channel 1 (HUD) - - channel 0 (everything else: e.g. play_sound, object messages) - */ - m_clients.send(client_id, 1, &pkt, true); - m_clients.send(client_id, 0, &pkt, true); + NetworkPacket legacy_pkt = pkt; + + // Newer clients get asked to fetch the file (asynchronous) + pkt << token; + // Older clients have an awful hack that just throws the data at them + legacy_pkt.putLongString(filedata); + + std::unordered_set<session_t> delivered, waiting; + { + ClientInterface::AutoLock clientlock(m_clients); + for (auto &pair : m_clients.getClientList()) { + if (pair.second->getState() == CS_DefinitionsSent && !ephemeral) { + /* + If a client is in the DefinitionsSent state it is too late to + transfer the file via sendMediaAnnouncement() but at the same + time the client cannot accept a media push yet. + Short of artificially delaying the joining process there is no + way for the server to resolve this so we (currently) opt not to. + */ + warningstream << "The media \"" << filename << "\" (dynamic) could " + "not be delivered to " << pair.second->getName() + << " due to a race condition." << std::endl; + continue; + } + if (pair.second->getState() < CS_Active) + continue; + + const auto proto_ver = pair.second->net_proto_version; + if (proto_ver < 39) + continue; + + const session_t peer_id = pair.second->peer_id; + if (!to_player.empty() && getPlayerName(peer_id) != to_player) + continue; + + if (proto_ver < 40) { + delivered.emplace(peer_id); + /* + The network layer only guarantees ordered delivery inside a channel. + Since the very next packet could be one that uses the media, we have + to push the media over ALL channels to ensure it is processed before + it is used. In practice this means channels 1 and 0. + */ + m_clients.send(peer_id, 1, &legacy_pkt, true); + m_clients.send(peer_id, 0, &legacy_pkt, true); + } else { + waiting.emplace(peer_id); + Send(peer_id, &pkt); + } + } } + // Run callback for players that already had the file delivered (legacy-only) + for (session_t peer_id : delivered) { + if (auto player = m_env->getPlayer(peer_id)) + getScriptIface()->on_dynamic_media_added(token, player->getName()); + } + + // Save all others in our pending state + auto &state = m_pending_dyn_media[token]; + state.waiting_players = std::move(waiting); + // regardless of success throw away the callback after a while + state.expiry_timer = 60.0f; + if (ephemeral) + state.filename = filename; + return true; } @@ -3577,21 +3731,11 @@ const ModSpec *Server::getModSpec(const std::string &modname) const return m_modmgr->getModSpec(modname); } -void Server::getModNames(std::vector<std::string> &modlist) -{ - m_modmgr->getModNames(modlist); -} - std::string Server::getBuiltinLuaPath() { return porting::path_share + DIR_DELIM + "builtin"; } -std::string Server::getModStoragePath() const -{ - return m_path_world + DIR_DELIM + "mod_storage"; -} - v3f Server::findSpawnPos() { ServerMap &map = m_env->getServerMap(); @@ -3608,8 +3752,8 @@ v3f Server::findSpawnPos() s32 range = MYMIN(1 + i, range_max); // We're going to try to throw the player to this position v2s16 nodepos2d = v2s16( - -range + (myrand() % (range * 2)), - -range + (myrand() % (range * 2))); + -range + myrand_range(0, range*2), + -range + myrand_range(0, range*2)); // Get spawn level at point s16 spawn_level = m_emerge->getSpawnLevelAtPoint(nodepos2d); // Continue if MAX_MAP_GENERATION_LIMIT was returned by the mapgen to @@ -3755,11 +3899,8 @@ bool Server::registerModStorage(ModMetadata *storage) void Server::unregisterModStorage(const std::string &name) { std::unordered_map<std::string, ModMetadata *>::const_iterator it = m_mod_storages.find(name); - if (it != m_mod_storages.end()) { - // Save unconditionaly on unregistration - it->second->save(getModStoragePath()); + if (it != m_mod_storages.end()) m_mod_storages.erase(name); - } } void dedicated_server_loop(Server &server, bool &kill) @@ -3897,3 +4038,106 @@ Translations *Server::getTranslationLanguage(const std::string &lang_code) return translations; } + +ModMetadataDatabase *Server::openModStorageDatabase(const std::string &world_path) +{ + std::string world_mt_path = world_path + DIR_DELIM + "world.mt"; + Settings world_mt; + if (!world_mt.readConfigFile(world_mt_path.c_str())) + throw BaseException("Cannot read world.mt!"); + + std::string backend = world_mt.exists("mod_storage_backend") ? + world_mt.get("mod_storage_backend") : "files"; + if (backend == "files") + warningstream << "/!\\ You are using the old mod storage files backend. " + << "This backend is deprecated and may be removed in a future release /!\\" + << std::endl << "Switching to SQLite3 is advised, " + << "please read http://wiki.minetest.net/Database_backends." << std::endl; + + return openModStorageDatabase(backend, world_path, world_mt); +} + +ModMetadataDatabase *Server::openModStorageDatabase(const std::string &backend, + const std::string &world_path, const Settings &world_mt) +{ + if (backend == "sqlite3") + return new ModMetadataDatabaseSQLite3(world_path); + + if (backend == "files") + return new ModMetadataDatabaseFiles(world_path); + + if (backend == "dummy") + return new Database_Dummy(); + + throw BaseException("Mod storage database backend " + backend + " not supported"); +} + +bool Server::migrateModStorageDatabase(const GameParams &game_params, const Settings &cmd_args) +{ + std::string migrate_to = cmd_args.get("migrate-mod-storage"); + Settings world_mt; + std::string world_mt_path = game_params.world_path + DIR_DELIM + "world.mt"; + if (!world_mt.readConfigFile(world_mt_path.c_str())) { + errorstream << "Cannot read world.mt!" << std::endl; + return false; + } + + std::string backend = world_mt.exists("mod_storage_backend") ? + world_mt.get("mod_storage_backend") : "files"; + if (backend == migrate_to) { + errorstream << "Cannot migrate: new backend is same" + << " as the old one" << std::endl; + return false; + } + + ModMetadataDatabase *srcdb = nullptr; + ModMetadataDatabase *dstdb = nullptr; + + bool succeeded = false; + + try { + srcdb = Server::openModStorageDatabase(backend, game_params.world_path, world_mt); + dstdb = Server::openModStorageDatabase(migrate_to, game_params.world_path, world_mt); + + dstdb->beginSave(); + + std::vector<std::string> mod_list; + srcdb->listMods(&mod_list); + for (const std::string &modname : mod_list) { + StringMap meta; + srcdb->getModEntries(modname, &meta); + for (const auto &pair : meta) { + dstdb->setModEntry(modname, pair.first, pair.second); + } + } + + dstdb->endSave(); + + succeeded = true; + + actionstream << "Successfully migrated the metadata of " + << mod_list.size() << " mods" << std::endl; + world_mt.set("mod_storage_backend", migrate_to); + if (!world_mt.updateConfigFile(world_mt_path.c_str())) + errorstream << "Failed to update world.mt!" << std::endl; + else + actionstream << "world.mt updated" << std::endl; + + } catch (BaseException &e) { + errorstream << "An error occurred during migration: " << e.what() << std::endl; + } + + delete srcdb; + delete dstdb; + + if (succeeded && backend == "files") { + // Back up files + const std::string storage_path = game_params.world_path + DIR_DELIM + "mod_storage"; + const std::string backup_path = game_params.world_path + DIR_DELIM + "mod_storage.bak"; + if (!fs::Rename(storage_path, backup_path)) + warningstream << "After migration, " << storage_path + << " could not be renamed to " << backup_path << std::endl; + } + + return succeeded; +} diff --git a/src/server.h b/src/server.h index 258d75eaf..cb7d77067 100644 --- a/src/server.h +++ b/src/server.h @@ -43,6 +43,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <list> #include <map> #include <vector> +#include <unordered_set> class ChatEvent; struct ChatEventChat; @@ -68,9 +69,11 @@ struct SkyboxParams; struct SunParams; struct MoonParams; struct StarParams; +struct Lighting; class ServerThread; class ServerModManager; class ServerInventoryManager; +struct PackedValue; enum ClientDeletionReason { CDR_LEAVE, @@ -81,41 +84,54 @@ enum ClientDeletionReason { struct MediaInfo { std::string path; - std::string sha1_digest; + std::string sha1_digest; // base64-encoded + bool no_announce; // true: not announced in TOCLIENT_ANNOUNCE_MEDIA (at player join) MediaInfo(const std::string &path_="", const std::string &sha1_digest_=""): path(path_), - sha1_digest(sha1_digest_) + sha1_digest(sha1_digest_), + no_announce(false) { } }; -struct ServerSoundParams +// Combines the pure sound (SimpleSoundSpec) with positional information +struct ServerPlayingSound { - enum Type { - SSP_LOCAL, - SSP_POSITIONAL, - SSP_OBJECT - } type = SSP_LOCAL; - float gain = 1.0f; - float fade = 0.0f; - float pitch = 1.0f; - bool loop = false; + SoundLocation type = SoundLocation::Local; + + float gain = 1.0f; // for amplification of the base sound float max_hear_distance = 32 * BS; v3f pos; u16 object = 0; - std::string to_player = ""; - std::string exclude_player = ""; + std::string to_player; + std::string exclude_player; v3f getPos(ServerEnvironment *env, bool *pos_exists) const; + + SimpleSoundSpec spec; + + std::unordered_set<session_t> clients; // peer ids }; -struct ServerPlayingSound -{ - ServerSoundParams params; - SimpleSoundSpec spec; - std::unordered_set<session_t> clients; // peer ids +struct MinimapMode { + MinimapType type = MINIMAP_TYPE_OFF; + std::string label; + u16 size = 0; + std::string texture; + u16 scale = 1; +}; + +// structure for everything getClientInfo returns, for convenience +struct ClientInfo { + ClientState state; + Address addr; + u32 uptime; + u8 ser_vers; + u16 prot_vers; + u8 major, minor, patch; + std::string vers_string, lang_code; }; class Server : public con::PeerHandler, public MapEventReceiver, @@ -178,6 +194,7 @@ public: void handleCommand_FirstSrp(NetworkPacket* pkt); void handleCommand_SrpBytesA(NetworkPacket* pkt); void handleCommand_SrpBytesM(NetworkPacket* pkt); + void handleCommand_HaveMedia(NetworkPacket *pkt); void ProcessData(NetworkPacket *pkt); @@ -200,7 +217,7 @@ public: void onMapEditEvent(const MapEditEvent &event); // Connection must be locked when called - std::wstring getStatusString(); + std::string getStatusString(); inline double getUptime() const { return m_uptime_counter->get(); } // read shutdown state @@ -211,8 +228,7 @@ public: // Returns -1 if failed, sound handle on success // Envlock - s32 playSound(const SimpleSoundSpec &spec, const ServerSoundParams ¶ms, - bool ephemeral=false); + s32 playSound(ServerPlayingSound ¶ms, bool ephemeral=false); void stopSound(s32 handle); void fadeSound(s32 handle, float step, float gain); @@ -238,7 +254,8 @@ public: void deleteParticleSpawner(const std::string &playername, u32 id); - bool dynamicAddMedia(const std::string &filepath); + bool dynamicAddMedia(std::string filepath, u32 token, + const std::string &to_player, bool ephemeral); ServerInventoryManager *getInventoryMgr() const { return m_inventory_mgr.get(); } void sendDetachedInventory(Inventory *inventory, const std::string &name, session_t peer_id); @@ -259,6 +276,7 @@ public: virtual u16 allocateUnknownNodeId(const std::string &name); IRollbackManager *getRollbackManager() { return m_rollback; } virtual EmergeManager *getEmergeManager() { return m_emerge; } + virtual ModMetadataDatabase *getModStorageDatabase() { return m_mod_storage_database; } IWritableItemDefManager* getWritableItemDefManager(); NodeDefManager* getWritableNodeDefManager(); @@ -266,16 +284,18 @@ public: virtual const std::vector<ModSpec> &getMods() const; virtual const ModSpec* getModSpec(const std::string &modname) const; - void getModNames(std::vector<std::string> &modlist); - std::string getBuiltinLuaPath(); + static std::string getBuiltinLuaPath(); virtual std::string getWorldPath() const { return m_path_world; } - virtual std::string getModStoragePath() const; - inline bool isSingleplayer() + inline bool isSingleplayer() const { return m_simple_singleplayer_mode; } inline void setAsyncFatalError(const std::string &error) { m_async_fatal_error.set(error); } + inline void setAsyncFatalError(const LuaError &e) + { + setAsyncFatalError(std::string("Lua: ") + e.what()); + } bool showFormspec(const char *name, const std::string &formspec, const std::string &formname); Map & getMap() { return m_env->getMap(); } @@ -305,32 +325,36 @@ public: void overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness); + void setLighting(RemotePlayer *player, const Lighting &lighting); + + void RespawnPlayer(session_t peer_id); + /* con::PeerHandler implementation. */ void peerAdded(con::Peer *peer); void deletingPeer(con::Peer *peer, bool timeout); void DenySudoAccess(session_t peer_id); - void DenyAccessVerCompliant(session_t peer_id, u16 proto_ver, AccessDeniedCode reason, - const std::string &str_reason = "", bool reconnect = false); void DenyAccess(session_t peer_id, AccessDeniedCode reason, - const std::string &custom_reason = ""); + const std::string &custom_reason = "", bool reconnect = false); void acceptAuth(session_t peer_id, bool forSudoMode); - void DenyAccess_Legacy(session_t peer_id, const std::wstring &reason); void DisconnectPeer(session_t peer_id); bool getClientConInfo(session_t peer_id, con::rtt_stat_type type, float *retval); - bool getClientInfo(session_t peer_id, ClientState *state, u32 *uptime, - u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch, - std::string* vers_string, std::string* lang_code); + bool getClientInfo(session_t peer_id, ClientInfo &ret); void printToConsoleOnly(const std::string &text); - void SendPlayerHPOrDie(PlayerSAO *player, const PlayerHPChangeReason &reason); + void HandlePlayerHPChange(PlayerSAO *sao, const PlayerHPChangeReason &reason); + void SendPlayerHP(PlayerSAO *sao, bool effect); void SendPlayerBreath(PlayerSAO *sao); void SendInventory(PlayerSAO *playerSAO, bool incremental); void SendMovePlayer(session_t peer_id); void SendPlayerSpeed(session_t peer_id, const v3f &added_vel); void SendPlayerFov(session_t peer_id); + void SendMinimapModes(session_t peer_id, + std::vector<MinimapMode> &modes, + size_t wanted_mode); + void sendDetachedInventories(session_t peer_id, bool incremental); virtual bool registerModStorage(ModMetadata *storage); @@ -347,6 +371,20 @@ public: // Get or load translations for a language Translations *getTranslationLanguage(const std::string &lang_code); + static ModMetadataDatabase *openModStorageDatabase(const std::string &world_path); + + static ModMetadataDatabase *openModStorageDatabase(const std::string &backend, + const std::string &world_path, const Settings &world_mt); + + static bool migrateModStorageDatabase(const GameParams &game_params, + const Settings &cmd_args); + + // Lua files registered for init of async env, pair of modname + path + std::vector<std::pair<std::string, std::string>> m_async_init_files; + + // Data transferred into async envs at init time + std::unique_ptr<PackedValue> m_async_globals_data; + // Bind address Address m_bind_addr; @@ -374,10 +412,25 @@ private: float m_timer = 0.0f; }; + struct PendingDynamicMediaCallback { + std::string filename; // only set if media entry and file is to be deleted + float expiry_timer; + std::unordered_set<session_t> waiting_players; + }; + + // The standard library does not implement std::hash for pairs so we have this: + struct SBCHash { + size_t operator() (const std::pair<v3s16, u16> &p) const { + return std::hash<v3s16>()(p.first) ^ p.second; + } + }; + + typedef std::unordered_map<std::pair<v3s16, u16>, std::string, SBCHash> SerializedBlockCache; + void init(); void SendMovement(session_t peer_id); - void SendHP(session_t peer_id, u16 hp); + void SendHP(session_t peer_id, u16 hp, bool effect); void SendBreath(session_t peer_id, u16 breath); void SendAccessDenied(session_t peer_id, AccessDeniedCode reason, const std::string &custom_reason, bool reconnect = false); @@ -394,7 +447,6 @@ private: virtual void SendChatMessage(session_t peer_id, const ChatMessage &message); void SendTimeOfDay(session_t peer_id, u16 time, f32 time_speed); - void SendPlayerHP(session_t peer_id); void SendLocalPlayerAnimations(session_t peer_id, v2s32 animation_frames[4], f32 animation_speed); @@ -415,6 +467,7 @@ private: void SendSetStars(session_t peer_id, const StarParams ¶ms); void SendCloudParams(session_t peer_id, const CloudParams ¶ms); void SendOverrideDayNightRatio(session_t peer_id, bool do_override, float ratio); + void SendSetLighting(session_t peer_id, const Lighting &lighting); void broadcastModChannelMessage(const std::string &channel, const std::string &message, session_t from_peer); @@ -430,11 +483,13 @@ private: std::unordered_set<u16> *far_players = nullptr, float far_d_nodes = 100, bool remove_metadata = true); - void sendMetadataChanged(const std::list<v3s16> &meta_updates, + void sendMetadataChanged(const std::unordered_set<v3s16> &positions, float far_d_nodes = 100); // Environment and Connection must be locked when called - void SendBlockNoLock(session_t peer_id, MapBlock *block, u8 ver, u16 net_proto_version); + // `cache` may only be very short lived! (invalidation not handeled) + void SendBlockNoLock(session_t peer_id, MapBlock *block, u8 ver, + u16 net_proto_version, SerializedBlockCache *cache = nullptr); // Sends blocks to clients (locks env and con on its own) void SendBlocks(float dtime); @@ -445,6 +500,7 @@ private: void sendMediaAnnouncement(session_t peer_id, const std::string &lang_code); void sendRequestedMedia(session_t peer_id, const std::vector<std::string> &tosend); + void stepPendingDynMediaCallbacks(float dtime); // Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all) void SendAddParticleSpawner(session_t peer_id, u16 protocol_version, @@ -465,8 +521,7 @@ private: Something random */ - void DiePlayer(session_t peer_id, const PlayerHPChangeReason &reason); - void RespawnPlayer(session_t peer_id); + void HandlePlayerDeath(PlayerSAO* sao, const PlayerHPChangeReason &reason); void DeleteClient(session_t peer_id, ClientDeletionReason reason); void UpdateCrafting(RemotePlayer *player); bool checkInteractDistance(RemotePlayer *player, const f32 d, const std::string &what); @@ -474,10 +529,8 @@ private: void handleChatInterfaceEvent(ChatEvent *evt); // This returns the answer to the sender of wmessage, or "" if there is none - std::wstring handleChat(const std::string &name, const std::wstring &wname, - std::wstring wmessage_input, - bool check_shout_priv = false, - RemotePlayer *player = NULL); + std::wstring handleChat(const std::string &name, std::wstring wmessage_input, + bool check_shout_priv = false, RemotePlayer *player = nullptr); void handleAdminChat(const ChatEventChat *evt); // When called, connection mutex should be locked @@ -512,6 +565,7 @@ private: u16 m_max_chatmessage_length; // For "dedicated" server list flag bool m_dedicated; + Settings *m_game_settings = nullptr; // Thread can set; step() will throw as ServerError MutexedVariable<std::string> m_async_fatal_error; @@ -527,6 +581,10 @@ private: // Environment ServerEnvironment *m_env = nullptr; + // Reference to the server map until ServerEnvironment is initialized + // after that this variable must be a nullptr + ServerMap *m_startup_server_map = nullptr; + // server connection std::shared_ptr<con::Connection> m_con; @@ -552,9 +610,6 @@ private: // Craft definition manager IWritableCraftDefManager *m_craftdef; - // Event manager - EventManager *m_event; - // Mods std::unique_ptr<ServerModManager> m_modmgr; @@ -629,6 +684,10 @@ private: // media files known to server std::unordered_map<std::string, MediaInfo> m_media; + // pending dynamic media callbacks, clients inform the server when they have a file fetched + std::unordered_map<u32, PendingDynamicMediaCallback> m_pending_dyn_media; + float m_step_pending_dyn_media_timer = 0.0f; + /* Sounds */ @@ -637,6 +696,7 @@ private: s32 nextSoundId(); std::unordered_map<std::string, ModMetadata *> m_mod_storages; + ModMetadataDatabase *m_mod_storage_database = nullptr; float m_mod_storage_save_timer = 10.0f; // CSM restrictions byteflag @@ -656,11 +716,11 @@ private: MetricCounterPtr m_uptime_counter; MetricGaugePtr m_player_gauge; MetricGaugePtr m_timeofday_gauge; - // current server step lag MetricGaugePtr m_lag_gauge; - MetricCounterPtr m_aom_buffer_counter; + MetricCounterPtr m_aom_buffer_counter[2]; // [0] = rel, [1] = unrel MetricCounterPtr m_packet_recv_counter; MetricCounterPtr m_packet_recv_processed_counter; + MetricCounterPtr m_map_edit_event_counter; }; /* diff --git a/src/server/activeobjectmgr.cpp b/src/server/activeobjectmgr.cpp index 1b8e31409..acd6611f4 100644 --- a/src/server/activeobjectmgr.cpp +++ b/src/server/activeobjectmgr.cpp @@ -127,6 +127,21 @@ void ActiveObjectMgr::getObjectsInsideRadius(const v3f &pos, float radius, } } +void ActiveObjectMgr::getObjectsInArea(const aabb3f &box, + std::vector<ServerActiveObject *> &result, + std::function<bool(ServerActiveObject *obj)> include_obj_cb) +{ + for (auto &activeObject : m_active_objects) { + ServerActiveObject *obj = activeObject.second; + const v3f &objectpos = obj->getBasePosition(); + if (!box.isPointInside(objectpos)) + continue; + + if (!include_obj_cb || include_obj_cb(obj)) + result.push_back(obj); + } +} + void ActiveObjectMgr::getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius, f32 player_radius, std::set<u16> ¤t_objects, std::queue<u16> &added_objects) diff --git a/src/server/activeobjectmgr.h b/src/server/activeobjectmgr.h index bc2085499..d43f5643c 100644 --- a/src/server/activeobjectmgr.h +++ b/src/server/activeobjectmgr.h @@ -38,6 +38,9 @@ public: void getObjectsInsideRadius(const v3f &pos, float radius, std::vector<ServerActiveObject *> &result, std::function<bool(ServerActiveObject *obj)> include_obj_cb); + void getObjectsInArea(const aabb3f &box, + std::vector<ServerActiveObject *> &result, + std::function<bool(ServerActiveObject *obj)> include_obj_cb); void getAddedActiveObjectsAroundPos(const v3f &player_pos, f32 radius, f32 player_radius, std::set<u16> ¤t_objects, diff --git a/src/server/luaentity_sao.cpp b/src/server/luaentity_sao.cpp index d504c42ca..ab4a9e3f2 100644 --- a/src/server/luaentity_sao.cpp +++ b/src/server/luaentity_sao.cpp @@ -42,8 +42,8 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos, const std::string &d u8 version2 = 0; u8 version = readU8(is); - name = deSerializeString(is); - state = deSerializeLongString(is); + name = deSerializeString16(is); + state = deSerializeString32(is); if (version < 1) break; @@ -108,10 +108,24 @@ void LuaEntitySAO::addedToEnvironment(u32 dtime_s) m_env->getScriptIface()-> luaentity_Activate(m_id, m_init_state, dtime_s); } else { + // It's an unknown object + // Use entitystring as infotext for debugging m_prop.infotext = m_init_name; + // Set unknown object texture + m_prop.textures.clear(); + m_prop.textures.emplace_back("unknown_object.png"); } } +void LuaEntitySAO::dispatchScriptDeactivate(bool removal) +{ + // Ensure that this is in fact a registered entity, + // and that it isn't already gone. + // The latter also prevents this from ever being called twice. + if (m_registered && !isGone()) + m_env->getScriptIface()->luaentity_Deactivate(m_id, removal); +} + void LuaEntitySAO::step(float dtime, bool send_recommended) { if(!m_properties_sent) @@ -137,15 +151,11 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) // Each frame, parent position is copied if the object is attached, otherwise it's calculated normally // If the object gets detached this comes into effect automatically from the last known origin - if(isAttached()) - { - v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition(); - m_base_position = pos; + if (auto *parent = getParent()) { + m_base_position = parent->getBasePosition(); m_velocity = v3f(0,0,0); m_acceleration = v3f(0,0,0); - } - else - { + } else { if(m_prop.physical){ aabb3f box = m_prop.collisionbox; box.MinEdge *= BS; @@ -225,7 +235,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) // PROTOCOL_VERSION >= 37 writeU8(os, 1); // version - os << serializeString(""); // name + os << serializeString16(""); // name writeU8(os, 0); // is_player writeU16(os, getId()); //id writeV3F32(os, m_base_position); @@ -233,26 +243,26 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) writeU16(os, m_hp); std::ostringstream msg_os(std::ios::binary); - msg_os << serializeLongString(getPropertyPacket()); // message 1 - msg_os << serializeLongString(generateUpdateArmorGroupsCommand()); // 2 - msg_os << serializeLongString(generateUpdateAnimationCommand()); // 3 + msg_os << serializeString32(getPropertyPacket()); // message 1 + msg_os << serializeString32(generateUpdateArmorGroupsCommand()); // 2 + msg_os << serializeString32(generateUpdateAnimationCommand()); // 3 for (const auto &bone_pos : m_bone_position) { - msg_os << serializeLongString(generateUpdateBonePositionCommand( - bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size + msg_os << serializeString32(generateUpdateBonePositionCommand( + bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // 3 + N } - msg_os << serializeLongString(generateUpdateAttachmentCommand()); // 4 + msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 + m_bone_position.size int message_count = 4 + m_bone_position.size(); for (const auto &id : getAttachmentChildIds()) { if (ServerActiveObject *obj = m_env->getActiveObject(id)) { message_count++; - msg_os << serializeLongString(obj->generateUpdateInfantCommand( + msg_os << serializeString32(obj->generateUpdateInfantCommand( id, protocol_version)); } } - msg_os << serializeLongString(generateSetTextureModCommand()); + msg_os << serializeString32(generateSetTextureModCommand()); message_count++; writeU8(os, message_count); @@ -270,17 +280,17 @@ void LuaEntitySAO::getStaticData(std::string *result) const // version must be 1 to keep backwards-compatibility. See version2 writeU8(os, 1); // name - os<<serializeString(m_init_name); + os<<serializeString16(m_init_name); // state if(m_registered){ std::string state = m_env->getScriptIface()-> luaentity_GetStaticdata(m_id); - os<<serializeLongString(state); + os<<serializeString32(state); } else { - os<<serializeLongString(m_init_state); + os<<serializeString32(m_init_state); } writeU16(os, m_hp); - writeV3F1000(os, m_velocity); + writeV3F1000(os, clampToF1000(m_velocity)); // yaw writeF1000(os, m_rotation.Y); @@ -295,14 +305,15 @@ void LuaEntitySAO::getStaticData(std::string *result) const *result = os.str(); } -u16 LuaEntitySAO::punch(v3f dir, +u32 LuaEntitySAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, - float time_from_last_punch) + float time_from_last_punch, + u16 initial_wear) { if (!m_registered) { // Delete unknown LuaEntities when punched - m_pending_removal = true; + markForRemoval(); return 0; } @@ -316,7 +327,8 @@ u16 LuaEntitySAO::punch(v3f dir, m_armor_groups, toolcap, &tool_item, - time_from_last_punch); + time_from_last_punch, + initial_wear); bool damage_handled = m_env->getScriptIface()->luaentity_Punch(m_id, puncher, time_from_last_punch, toolcap, dir, result.did_punch ? result.damage : 0); @@ -325,19 +337,9 @@ u16 LuaEntitySAO::punch(v3f dir, if (result.did_punch) { setHP((s32)getHP() - result.damage, PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, puncher)); - - // create message and add to list - sendPunchCommand(); } } - if (getHP() == 0 && !isGone()) { - clearParentAttachment(); - clearChildAttachments(); - m_env->getScriptIface()->luaentity_on_death(m_id, puncher); - m_pending_removal = true; - } - actionstream << puncher->getDescription() << " (id=" << puncher->getId() << ", hp=" << puncher->getHP() << ") punched " << getDescription() << " (id=" << m_id << ", hp=" << m_hp << @@ -390,6 +392,20 @@ std::string LuaEntitySAO::getDescription() void LuaEntitySAO::setHP(s32 hp, const PlayerHPChangeReason &reason) { m_hp = rangelim(hp, 0, U16_MAX); + + sendPunchCommand(); + + if (m_hp == 0 && !isGone()) { + clearParentAttachment(); + clearChildAttachments(); + if (m_registered) { + ServerActiveObject *killer = nullptr; + if (reason.type == PlayerHPChangeReason::PLAYER_PUNCH) + killer = reason.object; + m_env->getScriptIface()->luaentity_on_death(m_id, killer); + } + markForRemoval(); + } } u16 LuaEntitySAO::getHP() const @@ -436,7 +452,7 @@ std::string LuaEntitySAO::generateSetTextureModCommand() const // command writeU8(os, AO_CMD_SET_TEXTURE_MOD); // parameters - os << serializeString(m_current_texture_modifier); + os << serializeString16(m_current_texture_modifier); return os.str(); } @@ -483,6 +499,9 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end) if(isAttached()) return; + // Send attachment updates instantly to the client prior updating position + sendOutdatedData(); + m_last_sent_move_precision = m_base_position.getDistanceFrom( m_last_sent_position); m_last_sent_position_timer = 0; diff --git a/src/server/luaentity_sao.h b/src/server/luaentity_sao.h index 2520c8f5d..1dc72b150 100644 --- a/src/server/luaentity_sao.h +++ b/src/server/luaentity_sao.h @@ -36,21 +36,30 @@ public: { } ~LuaEntitySAO(); + ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_LUAENTITY; } ActiveObjectType getSendType() const { return ACTIVEOBJECT_TYPE_GENERIC; } virtual void addedToEnvironment(u32 dtime_s); void step(float dtime, bool send_recommended); std::string getClientInitializationData(u16 protocol_version); + bool isStaticAllowed() const { return m_prop.static_save; } + bool shouldUnload() const { return true; } void getStaticData(std::string *result) const; - u16 punch(v3f dir, const ToolCapabilities *toolcap = nullptr, + + u32 punch(v3f dir, const ToolCapabilities *toolcap = nullptr, ServerActiveObject *puncher = nullptr, - float time_from_last_punch = 1000000.0f); + float time_from_last_punch = 1000000.0f, + u16 initial_wear = 0); + void rightClick(ServerActiveObject *clicker); + void setPos(const v3f &pos); void moveTo(v3f pos, bool continuous); float getMinimumSavedMovement(); + std::string getDescription(); + void setHP(s32 hp, const PlayerHPChangeReason &reason); u16 getHP() const; @@ -70,6 +79,11 @@ public: bool getSelectionBox(aabb3f *toset) const; bool collideWithObjects() const; +protected: + void dispatchScriptDeactivate(bool removal); + virtual void onMarkedForDeactivation() { dispatchScriptDeactivate(false); } + virtual void onMarkedForRemoval() { dispatchScriptDeactivate(true); } + private: std::string getPropertyPacket(); void sendPosition(bool do_interpolate, bool is_movement_end); diff --git a/src/server/mods.cpp b/src/server/mods.cpp index cf1467648..f302d4240 100644 --- a/src/server/mods.cpp +++ b/src/server/mods.cpp @@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "scripting_server.h" #include "content/subgames.h" #include "porting.h" -#include "util/metricsbackend.h" /** * Manage server mods @@ -35,18 +34,19 @@ with this program; if not, write to the Free Software Foundation, Inc., * Creates a ServerModManager which targets worldpath * @param worldpath */ -ServerModManager::ServerModManager(const std::string &worldpath) : - ModConfiguration(worldpath) +ServerModManager::ServerModManager(const std::string &worldpath): + configuration() { SubgameSpec gamespec = findWorldSubgame(worldpath); // Add all game mods and all world mods - addModsInPath(gamespec.gamemods_path); - addModsInPath(worldpath + DIR_DELIM + "worldmods"); + configuration.addGameMods(gamespec); + configuration.addModsInPath(worldpath + DIR_DELIM + "worldmods", "worldmods"); // Load normal mods std::string worldmt = worldpath + DIR_DELIM + "world.mt"; - addModsFromConfig(worldmt, gamespec.addon_mods_paths); + configuration.addModsFromConfig(worldmt, gamespec.addon_mods_paths); + configuration.checkConflictsAndDeps(); } // clang-format off @@ -55,18 +55,15 @@ void ServerModManager::loadMods(ServerScripting *script) { // Print mods infostream << "Server: Loading mods: "; - for (const ModSpec &mod : m_sorted_mods) { + for (const ModSpec &mod : configuration.getMods()) { infostream << mod.name << " "; } + infostream << std::endl; // Load and run "mod" scripts - for (const ModSpec &mod : m_sorted_mods) { - if (!string_allowed(mod.name, MODNAME_ALLOWED_CHARS)) { - throw ModError("Error loading mod \"" + mod.name + - "\": Mod name does not follow naming " - "conventions: " - "Only characters [a-z0-9_] are allowed."); - } + for (const ModSpec &mod : configuration.getMods()) { + mod.checkAndLog(); + std::string script_path = mod.path + DIR_DELIM + "init.lua"; auto t = porting::getTimeMs(); script->loadMod(script_path, mod.name); @@ -81,24 +78,27 @@ void ServerModManager::loadMods(ServerScripting *script) // clang-format on const ModSpec *ServerModManager::getModSpec(const std::string &modname) const { - std::vector<ModSpec>::const_iterator it; - for (it = m_sorted_mods.begin(); it != m_sorted_mods.end(); ++it) { - const ModSpec &mod = *it; + for (const auto &mod : configuration.getMods()) { if (mod.name == modname) return &mod; } - return NULL; + + return nullptr; } void ServerModManager::getModNames(std::vector<std::string> &modlist) const { - for (const ModSpec &spec : m_sorted_mods) + for (const ModSpec &spec : configuration.getMods()) modlist.push_back(spec.name); } void ServerModManager::getModsMediaPaths(std::vector<std::string> &paths) const { - for (const ModSpec &spec : m_sorted_mods) { + // Iterate mods in reverse load order: Media loading expects higher priority media files first + // and mods loading later should be able to override media of already loaded mods + const auto &mods = configuration.getMods(); + for (auto it = mods.crbegin(); it != mods.crend(); it++) { + const ModSpec &spec = *it; fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "textures"); fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "sounds"); fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "media"); diff --git a/src/server/mods.h b/src/server/mods.h index 54774bd86..70edeb2c6 100644 --- a/src/server/mods.h +++ b/src/server/mods.h @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -#include "content/mods.h" +#include "content/mod_configuration.h" #include <memory> class MetricsBackend; @@ -31,8 +31,10 @@ class ServerScripting; * * All new calls to this class must be tested in test_servermodmanager.cpp */ -class ServerModManager : public ModConfiguration +class ServerModManager { + ModConfiguration configuration; + public: /** * Creates a ServerModManager which targets worldpath @@ -42,5 +44,30 @@ public: void loadMods(ServerScripting *script); const ModSpec *getModSpec(const std::string &modname) const; void getModNames(std::vector<std::string> &modlist) const; + + inline const std::vector<ModSpec> &getMods() const { + return configuration.getMods(); + } + + inline const std::vector<ModSpec> &getUnsatisfiedMods() const { + return configuration.getUnsatisfiedMods(); + } + + inline bool isConsistent() const { + return configuration.isConsistent(); + } + + inline std::string getUnsatisfiedModsError() const { + return configuration.getUnsatisfiedModsError(); + } + + /** + * Recursively gets all paths of mod folders that can contain media files. + * + * Result is ordered in descending priority, ie. files from an earlier path + * should not be replaced by files from a latter one. + * + * @param paths result vector + */ void getModsMediaPaths(std::vector<std::string> &paths) const; }; diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp index 67efed210..9aa7ce39f 100644 --- a/src/server/player_sao.cpp +++ b/src/server/player_sao.cpp @@ -55,6 +55,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p m_prop.backface_culling = false; m_prop.makes_footstep_sound = true; m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT * BS; + m_prop.show_on_minimap = true; m_hp = m_prop.hp_max; m_breath = m_prop.breath_max; // Disable zoom in survival mode using a value of 0 @@ -109,7 +110,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version) // Protocol >= 15 writeU8(os, 1); // version - os << serializeString(m_player->getName()); // name + os << serializeString16(m_player->getName()); // name writeU8(os, 1); // is_player writeS16(os, getId()); // id writeV3F32(os, m_base_position); @@ -117,22 +118,22 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version) writeU16(os, getHP()); std::ostringstream msg_os(std::ios::binary); - msg_os << serializeLongString(getPropertyPacket()); // message 1 - msg_os << serializeLongString(generateUpdateArmorGroupsCommand()); // 2 - msg_os << serializeLongString(generateUpdateAnimationCommand()); // 3 + msg_os << serializeString32(getPropertyPacket()); // message 1 + msg_os << serializeString32(generateUpdateArmorGroupsCommand()); // 2 + msg_os << serializeString32(generateUpdateAnimationCommand()); // 3 for (const auto &bone_pos : m_bone_position) { - msg_os << serializeLongString(generateUpdateBonePositionCommand( - bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size + msg_os << serializeString32(generateUpdateBonePositionCommand( + bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // 3 + N } - msg_os << serializeLongString(generateUpdateAttachmentCommand()); // 4 - msg_os << serializeLongString(generateUpdatePhysicsOverrideCommand()); // 5 + msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 + m_bone_position.size + msg_os << serializeString32(generateUpdatePhysicsOverrideCommand()); // 5 + m_bone_position.size int message_count = 5 + m_bone_position.size(); for (const auto &id : getAttachmentChildIds()) { if (ServerActiveObject *obj = m_env->getActiveObject(id)) { message_count++; - msg_os << serializeLongString(obj->generateUpdateInfantCommand( + msg_os << serializeString32(obj->generateUpdateInfantCommand( id, protocol_version)); } } @@ -147,7 +148,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version) void PlayerSAO::getStaticData(std::string * result) const { - FATAL_ERROR("Obsolete function"); + FATAL_ERROR("This function shall not be called for PlayerSAO"); } void PlayerSAO::step(float dtime, bool send_recommended) @@ -166,7 +167,6 @@ void PlayerSAO::step(float dtime, bool send_recommended) if (m_breath == 0) { PlayerHPChangeReason reason(PlayerHPChangeReason::DROWNING); setHP(m_hp - c.drowning, reason); - m_env->getGameDef()->SendPlayerHPOrDie(this, reason); } } } @@ -215,7 +215,6 @@ void PlayerSAO::step(float dtime, bool send_recommended) s32 newhp = (s32)m_hp - (s32)damage_per_second; PlayerHPChangeReason reason(PlayerHPChangeReason::NODE_DAMAGE, nodename); setHP(newhp, reason); - m_env->getGameDef()->SendPlayerHPOrDie(this, reason); } } @@ -259,10 +258,13 @@ void PlayerSAO::step(float dtime, bool send_recommended) // otherwise it's calculated normally. // If the object gets detached this comes into effect automatically from // the last known origin. - if (isAttached()) { - v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition(); + if (auto *parent = getParent()) { + v3f pos = parent->getBasePosition(); m_last_good_position = pos; setBasePosition(pos); + + if (m_player) + m_player->setSpeed(v3f()); } if (!send_recommended) @@ -303,21 +305,27 @@ void PlayerSAO::step(float dtime, bool send_recommended) std::string PlayerSAO::generateUpdatePhysicsOverrideCommand() const { + if (!m_player) { + // Will output a format warning client-side + return ""; + } + + const auto &phys = m_player->physics_override; std::ostringstream os(std::ios::binary); // command writeU8(os, AO_CMD_SET_PHYSICS_OVERRIDE); // parameters - writeF32(os, m_physics_override_speed); - writeF32(os, m_physics_override_jump); - writeF32(os, m_physics_override_gravity); - // these are sent inverted so we get true when the server sends nothing - writeU8(os, !m_physics_override_sneak); - writeU8(os, !m_physics_override_sneak_glitch); - writeU8(os, !m_physics_override_new_move); + writeF32(os, phys.speed); + writeF32(os, phys.jump); + writeF32(os, phys.gravity); + // MT 0.4.10 legacy: send inverted for detault `true` if the server sends nothing + writeU8(os, !phys.sneak); + writeU8(os, !phys.sneak_glitch); + writeU8(os, !phys.new_move); return os.str(); } -void PlayerSAO::setBasePosition(const v3f &position) +void PlayerSAO::setBasePosition(v3f position) { if (m_player && position != m_base_position) m_player->setDirty(true); @@ -342,7 +350,7 @@ void PlayerSAO::setPos(const v3f &pos) setBasePosition(pos); // Movement caused by this command is always valid - m_last_good_position = pos; + m_last_good_position = getBasePosition(); m_move_pool.empty(); m_time_from_last_teleport = 0.0; m_env->getGameDef()->SendMovePlayer(m_peer_id); @@ -355,7 +363,7 @@ void PlayerSAO::moveTo(v3f pos, bool continuous) setBasePosition(pos); // Movement caused by this command is always valid - m_last_good_position = pos; + m_last_good_position = getBasePosition(); m_move_pool.empty(); m_time_from_last_teleport = 0.0; m_env->getGameDef()->SendMovePlayer(m_peer_id); @@ -407,10 +415,11 @@ void PlayerSAO::setLookPitchAndSend(const float pitch) m_env->getGameDef()->SendMovePlayer(m_peer_id); } -u16 PlayerSAO::punch(v3f dir, +u32 PlayerSAO::punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, - float time_from_last_punch) + float time_from_last_punch, + u16 initial_wear) { if (!toolcap) return 0; @@ -428,7 +437,7 @@ u16 PlayerSAO::punch(v3f dir, s32 old_hp = getHP(); HitParams hitparams = getHitParams(m_armor_groups, toolcap, - time_from_last_punch); + time_from_last_punch, initial_wear); PlayerSAO *playersao = m_player->getPlayerSAO(); @@ -455,28 +464,38 @@ u16 PlayerSAO::punch(v3f dir, return hitparams.wear; } -void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason) +void PlayerSAO::rightClick(ServerActiveObject *clicker) { - s32 oldhp = m_hp; + m_env->getScriptIface()->on_rightclickplayer(this, clicker); +} - hp = rangelim(hp, 0, m_prop.hp_max); +void PlayerSAO::setHP(s32 target_hp, const PlayerHPChangeReason &reason, bool from_client) +{ + target_hp = rangelim(target_hp, 0, U16_MAX); - if (oldhp != hp) { - s32 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - oldhp, reason); - if (hp_change == 0) - return; + if (target_hp == m_hp) + return; // Nothing to do - hp = rangelim(oldhp + hp_change, 0, m_prop.hp_max); - } + s32 hp_change = m_env->getScriptIface()->on_player_hpchange(this, target_hp - (s32)m_hp, reason); - if (hp < oldhp && isImmortal()) - return; + s32 hp = (s32)m_hp + std::min(hp_change, U16_MAX); // Protection against s32 overflow + hp = rangelim(hp, 0, U16_MAX); - m_hp = hp; + if (hp > m_prop.hp_max) + hp = m_prop.hp_max; + + if (hp < m_hp && isImmortal()) + hp = m_hp; // Do not allow immortal players to be damaged // Update properties on death - if ((hp == 0) != (oldhp == 0)) + if ((hp == 0) != (m_hp == 0)) m_properties_sent = false; + + if (hp != m_hp) { + m_hp = hp; + m_env->getGameDef()->HandlePlayerHPChange(this, reason); + } else if (from_client) + m_env->getGameDef()->SendPlayerHP(this, true); } void PlayerSAO::setBreath(const u16 breath, bool send) @@ -525,7 +544,7 @@ bool PlayerSAO::setWieldedItem(const ItemStack &item) void PlayerSAO::disconnected() { m_peer_id = PEER_ID_INEXISTENT; - m_pending_removal = true; + markForRemoval(); } void PlayerSAO::unlinkPlayerSessionAndSave() @@ -558,7 +577,8 @@ void PlayerSAO::setMaxSpeedOverride(const v3f &vel) bool PlayerSAO::checkMovementCheat() { - if (isAttached() || m_is_singleplayer || + if (m_is_singleplayer || + isAttached() || g_settings->getBool("disable_anticheat")) { m_last_good_position = m_base_position; return false; @@ -590,10 +610,10 @@ bool PlayerSAO::checkMovementCheat() player_max_walk = m_player->movement_speed_fast; // Fast speed else player_max_walk = m_player->movement_speed_walk; // Normal speed - player_max_walk *= m_physics_override_speed; + player_max_walk *= m_player->physics_override.speed; player_max_walk = MYMAX(player_max_walk, override_max_H); - player_max_jump = m_player->movement_speed_jump * m_physics_override_jump; + player_max_jump = m_player->movement_speed_jump * m_player->physics_override.jump; // FIXME: Bouncy nodes cause practically unbound increase in Y speed, // until this can be verified correctly, tolerate higher jumping speeds player_max_jump *= 2.0; diff --git a/src/server/player_sao.h b/src/server/player_sao.h index 8571bd4f9..049e92cda 100644 --- a/src/server/player_sao.h +++ b/src/server/player_sao.h @@ -72,23 +72,24 @@ public: PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t peer_id_, bool is_singleplayer); - ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_PLAYER; } - ActiveObjectType getSendType() const { return ACTIVEOBJECT_TYPE_GENERIC; } - std::string getDescription(); + ActiveObjectType getType() const override { return ACTIVEOBJECT_TYPE_PLAYER; } + ActiveObjectType getSendType() const override { return ACTIVEOBJECT_TYPE_GENERIC; } + std::string getDescription() override; /* Active object <-> environment interface */ - void addedToEnvironment(u32 dtime_s); - void removingFromEnvironment(); - bool isStaticAllowed() const { return false; } - std::string getClientInitializationData(u16 protocol_version); - void getStaticData(std::string *result) const; - void step(float dtime, bool send_recommended); - void setBasePosition(const v3f &position); - void setPos(const v3f &pos); - void moveTo(v3f pos, bool continuous); + void addedToEnvironment(u32 dtime_s) override; + void removingFromEnvironment() override; + bool isStaticAllowed() const override { return false; } + bool shouldUnload() const override { return false; } + std::string getClientInitializationData(u16 protocol_version) override; + void getStaticData(std::string *result) const override; + void step(float dtime, bool send_recommended) override; + void setBasePosition(v3f position); + void setPos(const v3f &pos) override; + void moveTo(v3f pos, bool continuous) override; void setPlayerYaw(const float yaw); // Data should not be sent at player initialization void setPlayerYawAndSend(const float yaw); @@ -108,25 +109,28 @@ public: Interaction interface */ - u16 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, - float time_from_last_punch); - void rightClick(ServerActiveObject *clicker) {} - void setHP(s32 hp, const PlayerHPChangeReason &reason); + u32 punch(v3f dir, const ToolCapabilities *toolcap, ServerActiveObject *puncher, + float time_from_last_punch, u16 initial_wear = 0) override; + void rightClick(ServerActiveObject *clicker) override; + void setHP(s32 hp, const PlayerHPChangeReason &reason) override + { + return setHP(hp, reason, false); + } + void setHP(s32 hp, const PlayerHPChangeReason &reason, bool from_client); void setHPRaw(u16 hp) { m_hp = hp; } - s16 readDamage(); u16 getBreath() const { return m_breath; } void setBreath(const u16 breath, bool send = true); /* Inventory interface */ - Inventory *getInventory() const; - InventoryLocation getInventoryLocation() const; - void setInventoryModified() {} - std::string getWieldList() const { return "main"; } - u16 getWieldIndex() const; - ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand = nullptr) const; - bool setWieldedItem(const ItemStack &item); + Inventory *getInventory() const override; + InventoryLocation getInventoryLocation() const override; + void setInventoryModified() override {} + std::string getWieldList() const override { return "main"; } + u16 getWieldIndex() const override; + ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand = nullptr) const override; + bool setWieldedItem(const ItemStack &item) override; /* PlayerSAO-specific @@ -167,9 +171,9 @@ public: m_is_singleplayer = is_singleplayer; } - bool getCollisionBox(aabb3f *toset) const; - bool getSelectionBox(aabb3f *toset) const; - bool collideWithObjects() const { return true; } + bool getCollisionBox(aabb3f *toset) const override; + bool getSelectionBox(aabb3f *toset) const override; + bool collideWithObjects() const override { return true; } void finalize(RemotePlayer *player, const std::set<std::string> &privs); @@ -217,12 +221,6 @@ private: Metadata m_meta; public: - float m_physics_override_speed = 1.0f; - float m_physics_override_jump = 1.0f; - float m_physics_override_gravity = 1.0f; - bool m_physics_override_sneak = true; - bool m_physics_override_sneak_glitch = false; - bool m_physics_override_new_move = true; bool m_physics_override_sent = false; }; @@ -231,6 +229,7 @@ struct PlayerHPChangeReason enum Type : u8 { SET_HP, + SET_HP_MAX, // internal type to allow distinguishing hp reset and damage (for effects) PLAYER_PUNCH, FALL, NODE_DAMAGE, @@ -273,6 +272,7 @@ struct PlayerHPChangeReason { switch (type) { case PlayerHPChangeReason::SET_HP: + case PlayerHPChangeReason::SET_HP_MAX: return "set_hp"; case PlayerHPChangeReason::PLAYER_PUNCH: return "punch"; diff --git a/src/server/serveractiveobject.cpp b/src/server/serveractiveobject.cpp index 3341dc008..96b433d1d 100644 --- a/src/server/serveractiveobject.cpp +++ b/src/server/serveractiveobject.cpp @@ -61,7 +61,7 @@ std::string ServerActiveObject::generateUpdateInfantCommand(u16 infant_id, u16 p // Clients since 4aa9a66 so no longer need this data // Version 38 is the first bump after that commit. // See also: ClientEnvironment::addActiveObject - os << serializeLongString(getClientInitializationData(protocol_version)); + os << serializeString32(getClientInitializationData(protocol_version)); } return os.str(); } @@ -73,3 +73,19 @@ void ServerActiveObject::dumpAOMessagesToQueue(std::queue<ActiveObjectMessage> & m_messages_out.pop(); } } + +void ServerActiveObject::markForRemoval() +{ + if (!m_pending_removal) { + onMarkedForRemoval(); + m_pending_removal = true; + } +} + +void ServerActiveObject::markForDeactivation() +{ + if (!m_pending_deactivation) { + onMarkedForDeactivation(); + m_pending_deactivation = true; + } +} diff --git a/src/server/serveractiveobject.h b/src/server/serveractiveobject.h index 927009aef..5b0ee2d9b 100644 --- a/src/server/serveractiveobject.h +++ b/src/server/serveractiveobject.h @@ -70,6 +70,10 @@ public: virtual bool environmentDeletes() const { return true; } + // Safely mark the object for removal or deactivation + void markForRemoval(); + void markForDeactivation(); + // Create a certain type of ServerActiveObject static ServerActiveObject* create(ActiveObjectType type, ServerEnvironment *env, u16 id, v3f pos, @@ -125,6 +129,7 @@ public: assert(isStaticAllowed()); *result = ""; } + /* Return false in here to never save and instead remove object on unload. getStaticData() will not be called in that case. @@ -132,11 +137,20 @@ public: virtual bool isStaticAllowed() const {return true;} - // Returns tool wear - virtual u16 punch(v3f dir, + /* + Return false here to never unload the object. + isStaticAllowed && shouldUnload -> unload when out of active block range + !isStaticAllowed && shouldUnload -> unload when block is unloaded + */ + virtual bool shouldUnload() const + { return true; } + + // Returns added tool wear + virtual u32 punch(v3f dir, const ToolCapabilities *toolcap = nullptr, ServerActiveObject *puncher = nullptr, - float time_from_last_punch = 1000000.0f) + float time_from_last_punch = 1000000.0f, + u16 initial_wear = 0) { return 0; } virtual void rightClick(ServerActiveObject *clicker) {} @@ -149,8 +163,6 @@ public: {} virtual const ItemGroupList &getArmorGroups() const { static ItemGroupList rv; return rv; } - virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity) - {} virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop) {} virtual void getAnimation(v2f *frames, float *frame_speed, float *frame_blend, bool *frame_loop) @@ -193,7 +205,6 @@ public: } std::string generateUpdateInfantCommand(u16 infant_id, u16 protocol_version); - std::string generateUpdateNametagAttributesCommand(const video::SColor &color) const; void dumpAOMessagesToQueue(std::queue<ActiveObjectMessage> &queue); @@ -204,25 +215,6 @@ public: */ u16 m_known_by_count = 0; - /* - - Whether this object is to be removed when nobody knows about - it anymore. - - Removal is delayed to preserve the id for the time during which - it could be confused to some other object by some client. - - This is usually set to true by the step() method when the object wants - to be deleted but can be set by anything else too. - */ - bool m_pending_removal = false; - - /* - Same purpose as m_pending_removal but for deactivation. - deactvation = save static data in block, remove active object - - If this is set alongside with m_pending_removal, removal takes - priority. - */ - bool m_pending_deactivation = false; - /* A getter that unifies the above to answer the question: "Can the environment still interact with this object?" @@ -230,6 +222,9 @@ public: inline bool isGone() const { return m_pending_removal || m_pending_deactivation; } + inline bool isPendingRemoval() const + { return m_pending_removal; } + /* Whether the object's static data has been stored to a block */ @@ -241,6 +236,9 @@ public: v3s16 m_static_block = v3s16(1337,1337,1337); protected: + virtual void onMarkedForDeactivation() {} + virtual void onMarkedForRemoval() {} + virtual void onAttach(int parent_id) {} virtual void onDetach(int parent_id) {} @@ -248,6 +246,27 @@ protected: v3f m_base_position; std::unordered_set<u32> m_attached_particle_spawners; + /* + Same purpose as m_pending_removal but for deactivation. + deactvation = save static data in block, remove active object + + If this is set alongside with m_pending_removal, removal takes + priority. + Note: Do not assign this directly, use markForDeactivation() instead. + */ + bool m_pending_deactivation = false; + + /* + - Whether this object is to be removed when nobody knows about + it anymore. + - Removal is delayed to preserve the id for the time during which + it could be confused to some other object by some client. + - This is usually set to true by the step() method when the object wants + to be deleted but can be set by anything else too. + Note: Do not assign this directly, use markForRemoval() instead. + */ + bool m_pending_removal = false; + /* Queue of messages to be sent to the client */ diff --git a/src/server/serverinventorymgr.cpp b/src/server/serverinventorymgr.cpp index 555e01ec6..63d1645cb 100644 --- a/src/server/serverinventorymgr.cpp +++ b/src/server/serverinventorymgr.cpp @@ -39,24 +39,29 @@ ServerInventoryManager::~ServerInventoryManager() Inventory *ServerInventoryManager::getInventory(const InventoryLocation &loc) { + // No m_env check here: allow creation and modification of detached inventories + switch (loc.type) { case InventoryLocation::UNDEFINED: case InventoryLocation::CURRENT_PLAYER: break; case InventoryLocation::PLAYER: { + if (!m_env) + return nullptr; + RemotePlayer *player = m_env->getPlayer(loc.name.c_str()); if (!player) return NULL; + PlayerSAO *playersao = player->getPlayerSAO(); - if (!playersao) - return NULL; - return playersao->getInventory(); + return playersao ? playersao->getInventory() : nullptr; } break; case InventoryLocation::NODEMETA: { + if (!m_env) + return nullptr; + NodeMetadata *meta = m_env->getMap().getNodeMetadata(loc.p); - if (!meta) - return NULL; - return meta->getInventory(); + return meta ? meta->getInventory() : nullptr; } break; case InventoryLocation::DETACHED: { auto it = m_detached_inventories.find(loc.name); @@ -151,14 +156,15 @@ bool ServerInventoryManager::removeDetachedInventory(const std::string &name) const std::string &owner = inv_it->second.owner; if (!owner.empty()) { - RemotePlayer *player = m_env->getPlayer(owner.c_str()); + if (m_env) { + RemotePlayer *player = m_env->getPlayer(owner.c_str()); - if (player && player->getPeerId() != PEER_ID_INEXISTENT) - m_env->getGameDef()->sendDetachedInventory( - nullptr, name, player->getPeerId()); - - } else { - // Notify all players about the change + if (player && player->getPeerId() != PEER_ID_INEXISTENT) + m_env->getGameDef()->sendDetachedInventory( + nullptr, name, player->getPeerId()); + } + } else if (m_env) { + // Notify all players about the change as soon ServerEnv exists m_env->getGameDef()->sendDetachedInventory( nullptr, name, PEER_ID_INEXISTENT); } @@ -168,6 +174,18 @@ bool ServerInventoryManager::removeDetachedInventory(const std::string &name) return true; } +bool ServerInventoryManager::checkDetachedInventoryAccess( + const InventoryLocation &loc, const std::string &player) const +{ + SANITY_CHECK(loc.type == InventoryLocation::DETACHED); + + const auto &inv_it = m_detached_inventories.find(loc.name); + if (inv_it == m_detached_inventories.end()) + return false; + + return inv_it->second.owner.empty() || inv_it->second.owner == player; +} + void ServerInventoryManager::sendDetachedInventories(const std::string &peer_name, bool incremental, std::function<void(const std::string &, Inventory *)> apply_cb) diff --git a/src/server/serverinventorymgr.h b/src/server/serverinventorymgr.h index ccf6d3b2e..0e4b72415 100644 --- a/src/server/serverinventorymgr.h +++ b/src/server/serverinventorymgr.h @@ -43,6 +43,7 @@ public: Inventory *createDetachedInventory(const std::string &name, IItemDefManager *idef, const std::string &player = ""); bool removeDetachedInventory(const std::string &name); + bool checkDetachedInventoryAccess(const InventoryLocation &loc, const std::string &player) const; void sendDetachedInventories(const std::string &peer_name, bool incremental, std::function<void(const std::string &, Inventory *)> apply_cb); diff --git a/src/server/unit_sao.cpp b/src/server/unit_sao.cpp index ef0e87f2c..9a49b0f43 100644 --- a/src/server/unit_sao.cpp +++ b/src/server/unit_sao.cpp @@ -84,8 +84,11 @@ void UnitSAO::setBonePosition(const std::string &bone, v3f position, v3f rotatio void UnitSAO::getBonePosition(const std::string &bone, v3f *position, v3f *rotation) { - *position = m_bone_position[bone].X; - *rotation = m_bone_position[bone].Y; + auto it = m_bone_position.find(bone); + if (it != m_bone_position.end()) { + *position = it->second.X; + *rotation = it->second.Y; + } } // clang-format off @@ -121,9 +124,22 @@ void UnitSAO::sendOutdatedData() } // clang-format on -void UnitSAO::setAttachment( - int parent_id, const std::string &bone, v3f position, v3f rotation) +void UnitSAO::setAttachment(int parent_id, const std::string &bone, v3f position, + v3f rotation, bool force_visible) { + auto *obj = parent_id ? m_env->getActiveObject(parent_id) : nullptr; + if (obj) { + // Do checks to avoid circular references + // The chain of wanted parent must not refer or contain "this" + for (obj = obj->getParent(); obj; obj = obj->getParent()) { + if (obj == this) { + warningstream << "Mod bug: Attempted to attach object " << m_id << " to parent " + << parent_id << " but former is an (in)direct parent of latter." << std::endl; + return; + } + } + } + // Attachments need to be handled on both the server and client. // If we just attach on the server, we can only copy the position of the parent. // Attachments are still sent to clients at an interval so players might see them @@ -134,24 +150,31 @@ void UnitSAO::setAttachment( int old_parent = m_attachment_parent_id; m_attachment_parent_id = parent_id; + + // The detach callbacks might call to setAttachment() again. + // Ensure the attachment params are applied after this callback is run. + if (parent_id != old_parent) + onDetach(old_parent); + + m_attachment_parent_id = parent_id; m_attachment_bone = bone; m_attachment_position = position; m_attachment_rotation = rotation; + m_force_visible = force_visible; m_attachment_sent = false; - if (parent_id != old_parent) { - onDetach(old_parent); + if (parent_id != old_parent) onAttach(parent_id); - } } -void UnitSAO::getAttachment( - int *parent_id, std::string *bone, v3f *position, v3f *rotation) const +void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, + v3f *rotation, bool *force_visible) const { *parent_id = m_attachment_parent_id; *bone = m_attachment_bone; *position = m_attachment_position; *rotation = m_attachment_rotation; + *force_visible = m_force_visible; } void UnitSAO::clearChildAttachments() @@ -159,7 +182,7 @@ void UnitSAO::clearChildAttachments() for (int child_id : m_attachment_child_ids) { // Child can be NULL if it was deleted earlier if (ServerActiveObject *child = m_env->getActiveObject(child_id)) - child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0)); + child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0), false); } m_attachment_child_ids.clear(); } @@ -169,9 +192,9 @@ void UnitSAO::clearParentAttachment() ServerActiveObject *parent = nullptr; if (m_attachment_parent_id) { parent = m_env->getActiveObject(m_attachment_parent_id); - setAttachment(0, "", m_attachment_position, m_attachment_rotation); + setAttachment(0, "", m_attachment_position, m_attachment_rotation, false); } else { - setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0)); + setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0), false); } // Do it if (parent) @@ -242,9 +265,10 @@ std::string UnitSAO::generateUpdateAttachmentCommand() const writeU8(os, AO_CMD_ATTACH_TO); // parameters writeS16(os, m_attachment_parent_id); - os << serializeString(m_attachment_bone); + os << serializeString16(m_attachment_bone); writeV3F32(os, m_attachment_position); writeV3F32(os, m_attachment_rotation); + writeU8(os, m_force_visible); return os.str(); } @@ -255,7 +279,7 @@ std::string UnitSAO::generateUpdateBonePositionCommand( // command writeU8(os, AO_CMD_SET_BONE_POSITION); // parameters - os << serializeString(bone); + os << serializeString16(bone); writeV3F32(os, position); writeV3F32(os, rotation); return os.str(); @@ -291,7 +315,7 @@ std::string UnitSAO::generateUpdateArmorGroupsCommand() const writeU8(os, AO_CMD_UPDATE_ARMOR_GROUPS); writeU16(os, m_armor_groups.size()); for (const auto &armor_group : m_armor_groups) { - os << serializeString(armor_group.first); + os << serializeString16(armor_group.first); writeS16(os, armor_group.second); } return os.str(); diff --git a/src/server/unit_sao.h b/src/server/unit_sao.h index 3cb7f0ad5..a21e055c5 100644 --- a/src/server/unit_sao.h +++ b/src/server/unit_sao.h @@ -64,9 +64,9 @@ public: ServerActiveObject *getParent() const; inline bool isAttached() const { return getParent(); } void setAttachment(int parent_id, const std::string &bone, v3f position, - v3f rotation); + v3f rotation, bool force_visible); void getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) const; + v3f *rotation, bool *force_visible) const; void clearChildAttachments(); void clearParentAttachment(); void addAttachmentChild(int child_id); @@ -133,4 +133,5 @@ private: v3f m_attachment_position; v3f m_attachment_rotation; bool m_attachment_sent = false; + bool m_force_visible = false; }; diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 320042e19..8989fb05f 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -258,23 +258,23 @@ void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp) v3s16 pos; MapNode n; content_t c; - lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp); + bool pos_valid; // dummy, we know it's valid + auto it = getLBMsIntroducedAfter(stamp); for (; it != m_lbm_lookup.end(); ++it) { // Cache previous version to speedup lookup which has a very high performance // penalty on each call - content_t previous_c{}; - std::vector<LoadingBlockModifierDef *> *lbm_list = nullptr; + content_t previous_c = CONTENT_IGNORE; + const std::vector<LoadingBlockModifierDef *> *lbm_list = nullptr; for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++) for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++) for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++) { - n = block->getNodeNoEx(pos); + n = block->getNodeNoCheck(pos, &pos_valid); c = n.getContent(); // If content_t are not matching perform an LBM lookup if (previous_c != c) { - lbm_list = (std::vector<LoadingBlockModifierDef *> *) - it->second.lookup(c); + lbm_list = it->second.lookup(c); previous_c = c; } @@ -378,10 +378,7 @@ void ActiveBlockList::update(std::vector<PlayerSAO*> &active_players, /* Update m_list */ - m_list.clear(); - for (v3s16 p : newlist) { - m_list.insert(p); - } + m_list = std::move(newlist); } /* @@ -393,7 +390,7 @@ static std::random_device seed; ServerEnvironment::ServerEnvironment(ServerMap *map, ServerScripting *scriptIface, Server *server, - const std::string &path_world): + const std::string &path_world, MetricsBackend *mb): Environment(server), m_map(map), m_script(scriptIface), @@ -460,6 +457,15 @@ ServerEnvironment::ServerEnvironment(ServerMap *map, m_player_database = openPlayerDatabase(player_backend_name, path_world, conf); m_auth_database = openAuthDatabase(auth_backend_name, path_world, conf); + + m_step_time_counter = mb->addCounter( + "minetest_env_step_time", "Time spent in environment step (in microseconds)"); + + m_active_block_gauge = mb->addGauge( + "minetest_env_active_blocks", "Number of active blocks"); + + m_active_object_gauge = mb->addGauge( + "minetest_env_active_objects", "Number of active objects"); } ServerEnvironment::~ServerEnvironment() @@ -552,10 +558,8 @@ bool ServerEnvironment::removePlayerFromDatabase(const std::string &name) void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason, const std::string &str_reason, bool reconnect) { - for (RemotePlayer *player : m_players) { - m_server->DenyAccessVerCompliant(player->getPeerId(), - player->protocol_version, reason, str_reason, reconnect); - } + for (RemotePlayer *player : m_players) + m_server->DenyAccess(player->getPeerId(), reason, str_reason, reconnect); } void ServerEnvironment::saveLoadedPlayers(bool force) @@ -619,6 +623,9 @@ PlayerSAO *ServerEnvironment::loadPlayer(RemotePlayer *player, bool *new_player, /* Add object to environment */ addActiveObject(playersao); + // Update active blocks asap so objects in those blocks appear on the client + m_force_update_active_blocks = true; + return playersao; } @@ -632,7 +639,7 @@ void ServerEnvironment::saveMeta() // Open file and serialize std::ostringstream ss(std::ios_base::binary); - Settings args; + Settings args("EnvArgsEnd"); args.setU64("game_time", m_game_time); args.setU64("time_of_day", getTimeOfDay()); args.setU64("last_clear_objects_time", m_last_clear_objects_time); @@ -641,7 +648,6 @@ void ServerEnvironment::saveMeta() m_lbm_mgr.createIntroductionTimesString()); args.setU64("day_count", m_day_count); args.writeLines(ss); - ss<<"EnvArgsEnd\n"; if(!fs::safeWriteToFile(path, ss.str())) { @@ -676,9 +682,9 @@ void ServerEnvironment::loadMeta() throw SerializationError("Couldn't load env meta"); } - Settings args; + Settings args("EnvArgsEnd"); - if (!args.parseConfigLines(is, "EnvArgsEnd")) { + if (!args.parseConfigLines(is)) { throw SerializationError("ServerEnvironment::loadMeta(): " "EnvArgsEnd not found!"); } @@ -730,6 +736,8 @@ struct ActiveABM int chance; std::vector<content_t> required_neighbors; bool check_required_neighbors; // false if required_neighbors is known to be empty + s16 min_y; + s16 max_y; }; class ABMHandler @@ -774,6 +782,9 @@ public: } else { aabm.chance = chance; } + // y limits + aabm.min_y = abm->getMinY(); + aabm.max_y = abm->getMaxY(); // Trigger neighbors const std::vector<std::string> &required_neighbors_s = @@ -886,6 +897,9 @@ public: v3s16 p = p0 + block->getPosRelative(); for (ActiveABM &aabm : *m_aabms[c]) { + if ((p.Y < aabm.min_y) || (p.Y > aabm.max_y)) + continue; + if (myrand() % aabm.chance != 0) continue; @@ -1066,6 +1080,91 @@ bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n) return true; } +u8 ServerEnvironment::findSunlight(v3s16 pos) const +{ + // Directions for neighbouring nodes with specified order + static const v3s16 dirs[] = { + v3s16(-1, 0, 0), v3s16(1, 0, 0), v3s16(0, 0, -1), v3s16(0, 0, 1), + v3s16(0, -1, 0), v3s16(0, 1, 0) + }; + + const NodeDefManager *ndef = m_server->ndef(); + + // found_light remembers the highest known sunlight value at pos + u8 found_light = 0; + + struct stack_entry { + v3s16 pos; + s16 dist; + }; + std::stack<stack_entry> stack; + stack.push({pos, 0}); + + std::unordered_map<s64, s8> dists; + dists[MapDatabase::getBlockAsInteger(pos)] = 0; + + while (!stack.empty()) { + struct stack_entry e = stack.top(); + stack.pop(); + + v3s16 currentPos = e.pos; + s8 dist = e.dist + 1; + + for (const v3s16& off : dirs) { + v3s16 neighborPos = currentPos + off; + s64 neighborHash = MapDatabase::getBlockAsInteger(neighborPos); + + // Do not walk neighborPos multiple times unless the distance to the start + // position is shorter + auto it = dists.find(neighborHash); + if (it != dists.end() && dist >= it->second) + continue; + + // Position to walk + bool is_position_ok; + MapNode node = m_map->getNode(neighborPos, &is_position_ok); + if (!is_position_ok) { + // This happens very rarely because the map at currentPos is loaded + m_map->emergeBlock(neighborPos, false); + node = m_map->getNode(neighborPos, &is_position_ok); + if (!is_position_ok) + continue; // not generated + } + + const ContentFeatures &def = ndef->get(node); + if (!def.sunlight_propagates) { + // Do not test propagation here again + dists[neighborHash] = -1; + continue; + } + + // Sunlight could have come from here + dists[neighborHash] = dist; + u8 daylight = node.param1 & 0x0f; + + // In the special case where sunlight shines from above and thus + // does not decrease with upwards distance, daylight is always + // bigger than nightlight, which never reaches 15 + int possible_finlight = daylight - dist; + if (possible_finlight <= found_light) { + // Light from here cannot make a brighter light at currentPos than + // found_light + continue; + } + + u8 nightlight = node.param1 >> 4; + if (daylight > nightlight) { + // Found a valid daylight + found_light = possible_finlight; + } else { + // Sunlight may be darker, so walk the neighbours + stack.push({neighborPos, dist}); + } + } + } + return found_light; +} + void ServerEnvironment::clearObjects(ClearObjectsMode mode) { infostream << "ServerEnvironment::clearObjects(): " @@ -1079,7 +1178,7 @@ void ServerEnvironment::clearObjects(ClearObjectsMode mode) // If known by some client, don't delete immediately if (obj->m_known_by_count > 0) { - obj->m_pending_removal = true; + obj->markForRemoval(); return false; } @@ -1193,6 +1292,8 @@ void ServerEnvironment::clearObjects(ClearObjectsMode mode) void ServerEnvironment::step(float dtime) { ScopeProfiler sp2(g_profiler, "ServerEnv::step()", SPT_AVG); + const auto start_time = porting::getTimeUs(); + /* Step time of day */ stepTimeOfDay(dtime); @@ -1231,13 +1332,16 @@ void ServerEnvironment::step(float dtime) /* Manage active block list */ - if (m_active_blocks_management_interval.step(dtime, m_cache_active_block_mgmt_interval)) { + if (m_active_blocks_mgmt_interval.step(dtime, m_cache_active_block_mgmt_interval) || + m_force_update_active_blocks) { ScopeProfiler sp(g_profiler, "ServerEnv: update active blocks", SPT_AVG); + /* Get player block positions */ std::vector<PlayerSAO*> players; - for (RemotePlayer *player: m_players) { + players.reserve(m_players.size()); + for (RemotePlayer *player : m_players) { // Ignore disconnected players if (player->getPeerId() == PEER_ID_INEXISTENT) continue; @@ -1285,14 +1389,21 @@ void ServerEnvironment::step(float dtime) for (const v3s16 &p: blocks_added) { MapBlock *block = m_map->getBlockOrEmerge(p); if (!block) { - m_active_blocks.m_list.erase(p); - m_active_blocks.m_abm_list.erase(p); + // TODO: The blocks removed here will only be picked up again + // on the next cycle. To minimize the latency of objects being + // activated we could remember the blocks pending activating + // and activate them instantly as soon as they're loaded. + m_active_blocks.remove(p); continue; } activateBlock(block); } + + // Some blocks may be removed again by the code above so do this here + m_active_block_gauge->set(m_active_blocks.size()); } + m_force_update_active_blocks = false; /* Mess around in active blocks @@ -1391,6 +1502,8 @@ void ServerEnvironment::step(float dtime) */ m_script->environment_Step(dtime); + m_script->stepAsync(); + /* Step active objects */ @@ -1405,9 +1518,12 @@ void ServerEnvironment::step(float dtime) send_recommended = true; } - auto cb_state = [this, dtime, send_recommended] (ServerActiveObject *obj) { + u32 object_count = 0; + + auto cb_state = [&] (ServerActiveObject *obj) { if (obj->isGone()) return; + object_count++; // Step object obj->step(dtime, send_recommended); @@ -1415,6 +1531,8 @@ void ServerEnvironment::step(float dtime) obj->dumpAOMessagesToQueue(m_active_object_messages); }; m_ao_manager.step(dtime, cb_state); + + m_active_object_gauge->set(object_count); } /* @@ -1456,6 +1574,24 @@ void ServerEnvironment::step(float dtime) // Send outdated detached inventories m_server->sendDetachedInventories(PEER_ID_INEXISTENT, true); + + const auto end_time = porting::getTimeUs(); + m_step_time_counter->increment(end_time - start_time); +} + +ServerEnvironment::BlockStatus ServerEnvironment::getBlockStatus(v3s16 blockpos) +{ + if (m_active_blocks.contains(blockpos)) + return BS_ACTIVE; + + const MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); + if (block && !block->isDummy()) + return BS_LOADED; + + if (m_map->isBlockInQueue(blockpos)) + return BS_EMERGING; + + return BS_UNKNOWN; } u32 ServerEnvironment::addParticleSpawner(float exptime) @@ -1707,7 +1843,7 @@ void ServerEnvironment::removeRemovedObjects() /* Delete static data from block if removed */ - if (obj->m_pending_removal) + if (obj->isPendingRemoval()) deleteStaticFromBlock(obj, id, MOD_REASON_REMOVE_OBJECTS_REMOVE, false); // If still known by clients, don't actually remove. On some future @@ -1718,7 +1854,7 @@ void ServerEnvironment::removeRemovedObjects() /* Move static data from active to stored if deactivated */ - if (!obj->m_pending_removal && obj->m_static_exists) { + if (!obj->isPendingRemoval() && obj->m_static_exists) { MapBlock *block = m_map->emergeBlock(obj->m_static_block, false); if (block) { const auto i = block->m_static_objects.m_active.find(id); @@ -1887,8 +2023,8 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete) // force_delete might be overriden per object bool force_delete = _force_delete; - // Do not deactivate if static data creation not allowed - if (!force_delete && !obj->isStaticAllowed()) + // Do not deactivate if disallowed + if (!force_delete && !obj->shouldUnload()) return false; // removeRemovedObjects() is responsible for these @@ -1906,6 +2042,7 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete) if (!force_delete && obj->m_static_exists && !m_active_blocks.contains(obj->m_static_block) && m_active_blocks.contains(blockpos_o)) { + // Delete from block where object was located deleteStaticFromBlock(obj, id, MOD_REASON_STATIC_DATA_REMOVED, false); @@ -1917,7 +2054,10 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete) } // If block is still active, don't remove - if (!force_delete && m_active_blocks.contains(blockpos_o)) + bool still_active = obj->isStaticAllowed() ? + m_active_blocks.contains(blockpos_o) : + getMap().getBlockNoCreateNoEx(blockpos_o) != nullptr; + if (!force_delete && still_active) return false; verbosestream << "ServerEnvironment::deactivateFarObjects(): " @@ -1980,6 +2120,10 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete) force_delete = true; } + // Regardless of what happens to the object at this point, deactivate it first. + // This ensures that LuaEntity on_deactivate is always called. + obj->markForDeactivation(); + /* If known by some client, set pending deactivation. Otherwise delete it immediately. @@ -1989,7 +2133,6 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete) << "object id=" << id << " is known by clients" << "; not deleting yet" << std::endl; - obj->m_pending_deactivation = true; return false; } diff --git a/src/serverenvironment.h b/src/serverenvironment.h index af742e290..00184421e 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "server/activeobjectmgr.h" #include "util/numeric.h" +#include "util/metricsbackend.h" #include <set> #include <random> @@ -67,6 +68,10 @@ public: virtual u32 getTriggerChance() = 0; // Whether to modify chance to simulate time lost by an unnattended block virtual bool getSimpleCatchUp() = 0; + // get min Y for apply abm + virtual s16 getMinY() = 0; + // get max Y for apply abm + virtual s16 getMaxY() = 0; // This is called usually at interval for 1/chance of the nodes virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, @@ -163,19 +168,27 @@ public: std::set<v3s16> &blocks_removed, std::set<v3s16> &blocks_added); - bool contains(v3s16 p){ + bool contains(v3s16 p) const { return (m_list.find(p) != m_list.end()); } - void clear(){ + auto size() const { + return m_list.size(); + } + + void clear() { m_list.clear(); } + void remove(v3s16 p) { + m_list.erase(p); + m_abm_list.erase(p); + } + std::set<v3s16> m_list; std::set<v3s16> m_abm_list; + // list of blocks that are always active, not modified by this class std::set<v3s16> m_forceloaded_list; - -private: }; /* @@ -190,19 +203,11 @@ enum ClearObjectsMode { CLEAR_OBJECTS_MODE_QUICK, }; -/* - The server-side environment. - - This is not thread-safe. Server uses an environment mutex. -*/ - -typedef std::unordered_map<u16, ServerActiveObject *> ServerActiveObjectMap; - class ServerEnvironment : public Environment { public: ServerEnvironment(ServerMap *map, ServerScripting *scriptIface, - Server *server, const std::string &path_world); + Server *server, const std::string &path_world, MetricsBackend *mb); ~ServerEnvironment(); Map & getMap(); @@ -322,6 +327,9 @@ public: bool removeNode(v3s16 p); bool swapNode(v3s16 p, const MapNode &n); + // Find the daylight value at pos with a Depth First Search + u8 findSunlight(v3s16 pos) const; + // Find all active objects inside a radius around a point void getObjectsInsideRadius(std::vector<ServerActiveObject *> &objects, const v3f &pos, float radius, std::function<bool(ServerActiveObject *obj)> include_obj_cb) @@ -329,6 +337,13 @@ public: return m_ao_manager.getObjectsInsideRadius(pos, radius, objects, include_obj_cb); } + // Find all active objects inside a box + void getObjectsInArea(std::vector<ServerActiveObject *> &objects, const aabb3f &box, + std::function<bool(ServerActiveObject *obj)> include_obj_cb) + { + return m_ao_manager.getObjectsInArea(box, objects, include_obj_cb); + } + // Clear objects, loading and going through every MapBlock void clearObjects(ClearObjectsMode mode); @@ -340,7 +355,16 @@ public: void reportMaxLagEstimate(float f) { m_max_lag_estimate = f; } float getMaxLagEstimate() { return m_max_lag_estimate; } - std::set<v3s16>* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; }; + std::set<v3s16>* getForceloadedBlocks() { return &m_active_blocks.m_forceloaded_list; } + + // Sorted by how ready a mapblock is + enum BlockStatus { + BS_UNKNOWN, + BS_EMERGING, + BS_LOADED, + BS_ACTIVE // always highest value + }; + BlockStatus getBlockStatus(v3s16 blockpos); // Sets the static object status all the active objects in the specified block // This is only really needed for deleting blocks from the map @@ -436,7 +460,8 @@ private: IntervalLimiter m_object_management_interval; // List of active blocks ActiveBlockList m_active_blocks; - IntervalLimiter m_active_blocks_management_interval; + bool m_force_update_active_blocks = false; + IntervalLimiter m_active_blocks_mgmt_interval; IntervalLimiter m_active_block_modifier_interval; IntervalLimiter m_active_blocks_nodemetadata_interval; // Whether the variables below have been read from file yet @@ -472,5 +497,10 @@ private: std::unordered_map<u32, float> m_particle_spawners; std::unordered_map<u32, u16> m_particle_spawner_attachments; + // Environment metrics + MetricCounterPtr m_step_time_counter; + MetricGaugePtr m_active_block_gauge; + MetricGaugePtr m_active_object_gauge; + ServerActiveObject* createSAO(ActiveObjectType type, v3f pos, const std::string &data); }; diff --git a/src/serverlist.cpp b/src/serverlist.cpp index c7fe2d888..29e3ac9a6 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -17,181 +17,19 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include <fstream> #include <iostream> -#include <sstream> -#include <algorithm> - #include "version.h" #include "settings.h" #include "serverlist.h" #include "filesys.h" -#include "porting.h" #include "log.h" #include "network/networkprotocol.h" #include <json/json.h> #include "convert_json.h" #include "httpfetch.h" -#include "util/string.h" namespace ServerList { - -std::string getFilePath() -{ - std::string serverlist_file = g_settings->get("serverlist_file"); - - std::string dir_path = "client" DIR_DELIM "serverlist" DIR_DELIM; - fs::CreateDir(porting::path_user + DIR_DELIM "client"); - fs::CreateDir(porting::path_user + DIR_DELIM + dir_path); - return porting::path_user + DIR_DELIM + dir_path + serverlist_file; -} - - -std::vector<ServerListSpec> getLocal() -{ - std::string path = ServerList::getFilePath(); - std::string liststring; - fs::ReadFile(path, liststring); - - return deSerialize(liststring); -} - - -std::vector<ServerListSpec> getOnline() -{ - std::ostringstream geturl; - - u16 proto_version_min = CLIENT_PROTOCOL_VERSION_MIN; - - geturl << g_settings->get("serverlist_url") << - "/list?proto_version_min=" << proto_version_min << - "&proto_version_max=" << CLIENT_PROTOCOL_VERSION_MAX; - Json::Value root = fetchJsonValue(geturl.str(), NULL); - - std::vector<ServerListSpec> server_list; - - if (!root.isObject()) { - return server_list; - } - - root = root["list"]; - if (!root.isArray()) { - return server_list; - } - - for (const Json::Value &i : root) { - if (i.isObject()) { - server_list.push_back(i); - } - } - - return server_list; -} - - -// Delete a server from the local favorites list -bool deleteEntry(const ServerListSpec &server) -{ - std::vector<ServerListSpec> serverlist = ServerList::getLocal(); - for (std::vector<ServerListSpec>::iterator it = serverlist.begin(); - it != serverlist.end();) { - if ((*it)["address"] == server["address"] && - (*it)["port"] == server["port"]) { - it = serverlist.erase(it); - } else { - ++it; - } - } - - std::string path = ServerList::getFilePath(); - std::ostringstream ss(std::ios_base::binary); - ss << ServerList::serialize(serverlist); - if (!fs::safeWriteToFile(path, ss.str())) - return false; - return true; -} - -// Insert a server to the local favorites list -bool insert(const ServerListSpec &server) -{ - // Remove duplicates - ServerList::deleteEntry(server); - - std::vector<ServerListSpec> serverlist = ServerList::getLocal(); - - // Insert new server at the top of the list - serverlist.insert(serverlist.begin(), server); - - std::string path = ServerList::getFilePath(); - std::ostringstream ss(std::ios_base::binary); - ss << ServerList::serialize(serverlist); - if (!fs::safeWriteToFile(path, ss.str())) - return false; - - return true; -} - -std::vector<ServerListSpec> deSerialize(const std::string &liststring) -{ - std::vector<ServerListSpec> serverlist; - std::istringstream stream(liststring); - std::string line, tmp; - while (std::getline(stream, line)) { - std::transform(line.begin(), line.end(), line.begin(), ::toupper); - if (line == "[SERVER]") { - ServerListSpec server; - std::getline(stream, tmp); - server["name"] = tmp; - std::getline(stream, tmp); - server["address"] = tmp; - std::getline(stream, tmp); - server["port"] = tmp; - bool unique = true; - for (const ServerListSpec &added : serverlist) { - if (server["name"] == added["name"] - && server["port"] == added["port"]) { - unique = false; - break; - } - } - if (!unique) - continue; - std::getline(stream, tmp); - server["description"] = tmp; - serverlist.push_back(server); - } - } - return serverlist; -} - -const std::string serialize(const std::vector<ServerListSpec> &serverlist) -{ - std::string liststring; - for (const ServerListSpec &it : serverlist) { - liststring += "[server]\n"; - liststring += it["name"].asString() + '\n'; - liststring += it["address"].asString() + '\n'; - liststring += it["port"].asString() + '\n'; - liststring += it["description"].asString() + '\n'; - liststring += '\n'; - } - return liststring; -} - -const std::string serializeJson(const std::vector<ServerListSpec> &serverlist) -{ - Json::Value root; - Json::Value list(Json::arrayValue); - for (const ServerListSpec &it : serverlist) { - list.append(it); - } - root["list"] = list; - - return fastWriteJson(root); -} - - #if USE_CURL void sendAnnounce(AnnounceAction action, const u16 port, @@ -245,13 +83,21 @@ void sendAnnounce(AnnounceAction action, for (const ModSpec &mod : mods) { server["mods"].append(mod.name); } - actionstream << "Announcing to " << g_settings->get("serverlist_url") << std::endl; } else if (action == AA_UPDATE) { if (lag) server["lag"] = lag; } + if (action == AA_START) { + actionstream << "Announcing " << aa_names[action] << " to " << + g_settings->get("serverlist_url") << std::endl; + } else { + infostream << "Announcing " << aa_names[action] << " to " << + g_settings->get("serverlist_url") << std::endl; + } + HTTPFetchRequest fetch_request; + fetch_request.caller = HTTPFETCH_PRINT_ERR; fetch_request.url = g_settings->get("serverlist_url") + std::string("/announce"); fetch_request.method = HTTP_POST; fetch_request.fields["json"] = fastWriteJson(server); diff --git a/src/serverlist.h b/src/serverlist.h index 2b82b7431..4a0bd5efa 100644 --- a/src/serverlist.h +++ b/src/serverlist.h @@ -24,21 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -typedef Json::Value ServerListSpec; - namespace ServerList { -std::vector<ServerListSpec> getLocal(); -std::vector<ServerListSpec> getOnline(); - -bool deleteEntry(const ServerListSpec &server); -bool insert(const ServerListSpec &server); - -std::vector<ServerListSpec> deSerialize(const std::string &liststring); -const std::string serialize(const std::vector<ServerListSpec> &serverlist); -std::vector<ServerListSpec> deSerializeJson(const std::string &liststring); -const std::string serializeJson(const std::vector<ServerListSpec> &serverlist); - #if USE_CURL enum AnnounceAction {AA_START, AA_UPDATE, AA_DELETE}; void sendAnnounce(AnnounceAction, u16 port, diff --git a/src/settings.cpp b/src/settings.cpp index 28b72c4e3..a0225bc2c 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include "exceptions.h" #include "threading/mutex_auto_lock.h" +#include "util/numeric.h" // rangelim #include "util/strfnd.h" #include <iostream> #include <fstream> @@ -33,21 +34,100 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <cctype> #include <algorithm> -static Settings main_settings; -Settings *g_settings = &main_settings; +Settings *g_settings = nullptr; +static SettingsHierarchy g_hierarchy; std::string g_settings_path; -Settings::~Settings() +std::unordered_map<std::string, const FlagDesc *> Settings::s_flags; + +/* Settings hierarchy implementation */ + +SettingsHierarchy::SettingsHierarchy(Settings *fallback) { - clear(); + layers.push_back(fallback); } -Settings & Settings::operator += (const Settings &other) +Settings *SettingsHierarchy::getLayer(int layer) const { - update(other); + if (layer < 0 || layer >= (int)layers.size()) + throw BaseException("Invalid settings layer"); + return layers[layer]; +} - return *this; + +Settings *SettingsHierarchy::getParent(int layer) const +{ + assert(layer >= 0 && layer < (int)layers.size()); + // iterate towards the origin (0) to find the next fallback layer + for (int i = layer - 1; i >= 0; --i) { + if (layers[i]) + return layers[i]; + } + + return nullptr; +} + + +void SettingsHierarchy::onLayerCreated(int layer, Settings *obj) +{ + if (layer < 0) + throw BaseException("Invalid settings layer"); + if ((int)layers.size() < layer + 1) + layers.resize(layer + 1); + + Settings *&pos = layers[layer]; + if (pos) + throw BaseException("Setting layer " + itos(layer) + " already exists"); + + pos = obj; + // This feels bad + if (this == &g_hierarchy && layer == (int)SL_GLOBAL) + g_settings = obj; +} + + +void SettingsHierarchy::onLayerRemoved(int layer) +{ + assert(layer >= 0 && layer < (int)layers.size()); + layers[layer] = nullptr; + if (this == &g_hierarchy && layer == (int)SL_GLOBAL) + g_settings = nullptr; +} + +/* Settings implementation */ + +Settings *Settings::createLayer(SettingsLayer sl, const std::string &end_tag) +{ + return new Settings(end_tag, &g_hierarchy, (int)sl); +} + + +Settings *Settings::getLayer(SettingsLayer sl) +{ + return g_hierarchy.getLayer(sl); +} + + +Settings::Settings(const std::string &end_tag, SettingsHierarchy *h, + int settings_layer) : + m_end_tag(end_tag), + m_hierarchy(h), + m_settingslayer(settings_layer) +{ + if (m_hierarchy) + m_hierarchy->onLayerCreated(m_settingslayer, this); +} + + +Settings::~Settings() +{ + MutexAutoLock lock(m_mutex); + + if (m_hierarchy) + m_hierarchy->onLayerRemoved(m_settingslayer); + + clearNoLock(); } @@ -56,11 +136,16 @@ Settings & Settings::operator = (const Settings &other) if (&other == this) return *this; + // TODO: Avoid copying Settings objects. Make this private. + FATAL_ERROR_IF(m_hierarchy || other.m_hierarchy, + "Cannot copy or overwrite Settings object that belongs to a hierarchy"); + MutexAutoLock lock(m_mutex); MutexAutoLock lock2(other.m_mutex); clearNoLock(); - updateNoLock(other); + m_settings = other.m_settings; + m_callbacks = other.m_callbacks; return *this; } @@ -124,11 +209,11 @@ bool Settings::readConfigFile(const char *filename) if (!is.good()) return false; - return parseConfigLines(is, ""); + return parseConfigLines(is); } -bool Settings::parseConfigLines(std::istream &is, const std::string &end) +bool Settings::parseConfigLines(std::istream &is) { MutexAutoLock lock(m_mutex); @@ -136,7 +221,7 @@ bool Settings::parseConfigLines(std::istream &is, const std::string &end) while (is.good()) { std::getline(is, line); - SettingsParseEvent event = parseConfigObject(line, end, name, value); + SettingsParseEvent event = parseConfigObject(line, name, value); switch (event) { case SPE_NONE: @@ -149,8 +234,8 @@ bool Settings::parseConfigLines(std::istream &is, const std::string &end) case SPE_END: return true; case SPE_GROUP: { - Settings *group = new Settings; - if (!group->parseConfigLines(is, "}")) { + Settings *group = new Settings("}"); + if (!group->parseConfigLines(is)) { delete group; return false; } @@ -163,7 +248,8 @@ bool Settings::parseConfigLines(std::istream &is, const std::string &end) } } - return end.empty(); + // false (failure) if end tag not found + return m_end_tag.empty(); } @@ -173,6 +259,14 @@ void Settings::writeLines(std::ostream &os, u32 tab_depth) const for (const auto &setting_it : m_settings) printEntry(os, setting_it.first, setting_it.second, tab_depth); + + // For groups this must be "}" ! + if (!m_end_tag.empty()) { + for (u32 i = 0; i < tab_depth; i++) + os << "\t"; + + os << m_end_tag << "\n"; + } } @@ -187,9 +281,7 @@ void Settings::printEntry(std::ostream &os, const std::string &name, entry.group->writeLines(os, tab_depth + 1); - for (u32 i = 0; i != tab_depth; i++) - os << "\t"; - os << "}\n"; + // Closing bracket handled by writeLines } else { os << name << " = "; @@ -201,8 +293,7 @@ void Settings::printEntry(std::ostream &os, const std::string &name, } -bool Settings::updateConfigObject(std::istream &is, std::ostream &os, - const std::string &end, u32 tab_depth) +bool Settings::updateConfigObject(std::istream &is, std::ostream &os, u32 tab_depth) { SettingEntries::const_iterator it; std::set<std::string> present_entries; @@ -214,11 +305,11 @@ bool Settings::updateConfigObject(std::istream &is, std::ostream &os, // in the object if existing while (is.good() && !end_found) { std::getline(is, line); - SettingsParseEvent event = parseConfigObject(line, end, name, value); + SettingsParseEvent event = parseConfigObject(line, name, value); switch (event) { case SPE_END: - os << line << (is.eof() ? "" : "\n"); + // Skip end tag. Append later. end_found = true; break; case SPE_MULTILINE: @@ -246,14 +337,13 @@ bool Settings::updateConfigObject(std::istream &is, std::ostream &os, if (it != m_settings.end() && it->second.is_group) { os << line << "\n"; sanity_check(it->second.group != NULL); - was_modified |= it->second.group->updateConfigObject(is, os, - "}", tab_depth + 1); + was_modified |= it->second.group->updateConfigObject(is, os, tab_depth + 1); } else if (it == m_settings.end()) { // Remove by skipping was_modified = true; - Settings removed_group; // Move 'is' to group end + Settings removed_group("}"); // Move 'is' to group end std::stringstream ss; - removed_group.updateConfigObject(is, ss, "}", tab_depth + 1); + removed_group.updateConfigObject(is, ss, tab_depth + 1); break; } else { printEntry(os, name, it->second, tab_depth); @@ -267,6 +357,9 @@ bool Settings::updateConfigObject(std::istream &is, std::ostream &os, } } + if (!line.empty() && is.eof()) + os << "\n"; + // Add any settings in the object that don't exist in the config file yet for (it = m_settings.begin(); it != m_settings.end(); ++it) { if (present_entries.find(it->first) != present_entries.end()) @@ -276,6 +369,12 @@ bool Settings::updateConfigObject(std::istream &is, std::ostream &os, was_modified = true; } + // Append ending tag + if (!m_end_tag.empty()) { + os << m_end_tag << "\n"; + was_modified |= !end_found; + } + return was_modified; } @@ -287,7 +386,7 @@ bool Settings::updateConfigFile(const char *filename) std::ifstream is(filename); std::ostringstream os(std::ios_base::binary); - bool was_modified = updateConfigObject(is, os, ""); + bool was_modified = updateConfigObject(is, os); is.close(); if (!was_modified) @@ -360,29 +459,26 @@ bool Settings::parseCommandLine(int argc, char *argv[], * Getters * ***********/ - -const SettingsEntry &Settings::getEntry(const std::string &name) const +Settings *Settings::getParent() const { - MutexAutoLock lock(m_mutex); - - SettingEntries::const_iterator n; - if ((n = m_settings.find(name)) == m_settings.end()) { - if ((n = m_defaults.find(name)) == m_defaults.end()) - throw SettingNotFoundException("Setting [" + name + "] not found."); - } - return n->second; + return m_hierarchy ? m_hierarchy->getParent(m_settingslayer) : nullptr; } -const SettingsEntry &Settings::getEntryDefault(const std::string &name) const +const SettingsEntry &Settings::getEntry(const std::string &name) const { - MutexAutoLock lock(m_mutex); + { + MutexAutoLock lock(m_mutex); - SettingEntries::const_iterator n; - if ((n = m_defaults.find(name)) == m_defaults.end()) { - throw SettingNotFoundException("Setting [" + name + "] not found."); + SettingEntries::const_iterator n; + if ((n = m_settings.find(name)) != m_settings.end()) + return n->second; } - return n->second; + + if (auto parent = getParent()) + return parent->getEntry(name); + + throw SettingNotFoundException("Setting [" + name + "] not found."); } @@ -404,15 +500,6 @@ const std::string &Settings::get(const std::string &name) const } -const std::string &Settings::getDefault(const std::string &name) const -{ - const SettingsEntry &entry = getEntryDefault(name); - if (entry.is_group) - throw SettingNotFoundException("Setting [" + name + "] is a group."); - return entry.value; -} - - bool Settings::getBool(const std::string &name) const { return is_yes(get(name)); @@ -448,13 +535,17 @@ float Settings::getFloat(const std::string &name) const } +float Settings::getFloat(const std::string &name, float min, float max) const +{ + float val = stof(get(name)); + return rangelim(val, min, max); +} + + u64 Settings::getU64(const std::string &name) const { - u64 value = 0; std::string s = get(name); - std::istringstream ss(s); - ss >> value; - return value; + return from_string<u64>(s); } @@ -485,56 +576,38 @@ u32 Settings::getFlagStr(const std::string &name, const FlagDesc *flagdesc, u32 *flagmask) const { u32 flags = 0; - u32 mask_default = 0; - std::string value; // Read default value (if there is any) - if (getDefaultNoEx(name, value)) { - flags = std::isdigit(value[0]) - ? stoi(value) - : readFlagString(value, flagdesc, &mask_default); - } + if (auto parent = getParent()) + flags = parent->getFlagStr(name, flagdesc, flagmask); // Apply custom flags "on top" - value = get(name); - u32 flags_user; - u32 mask_user = U32_MAX; - flags_user = std::isdigit(value[0]) - ? stoi(value) // Override default - : readFlagString(value, flagdesc, &mask_user); + if (m_settings.find(name) != m_settings.end()) { + std::string value = get(name); + u32 flags_user; + u32 mask_user = U32_MAX; + flags_user = std::isdigit(value[0]) + ? stoi(value) // Override default + : readFlagString(value, flagdesc, &mask_user); - flags &= ~mask_user; - flags |= flags_user; - - if (flagmask) - *flagmask = mask_default | mask_user; - - return flags; -} - -// N.B. if getStruct() is used to read a non-POD aggregate type, -// the behavior is undefined. -bool Settings::getStruct(const std::string &name, const std::string &format, - void *out, size_t olen) const -{ - std::string valstr; - - try { - valstr = get(name); - } catch (SettingNotFoundException &e) { - return false; + flags &= ~mask_user; + flags |= flags_user; + if (flagmask) + *flagmask |= mask_user; } - if (!deSerializeStringToStruct(valstr, format, out, olen)) - return false; - - return true; + return flags; } bool Settings::getNoiseParams(const std::string &name, NoiseParams &np) const { - return getNoiseParamsFromGroup(name, np) || getNoiseParamsFromValue(name, np); + if (getNoiseParamsFromGroup(name, np) || getNoiseParamsFromValue(name, np)) + return true; + if (auto parent = getParent()) + return parent->getNoiseParams(name, np); + + return false; } @@ -546,6 +619,7 @@ bool Settings::getNoiseParamsFromValue(const std::string &name, if (!getNoEx(name, value)) return false; + // Format: f32,f32,(f32,f32,f32),s32,s32,f32[,f32] Strfnd f(value); np.offset = stof(f.next(",")); @@ -592,17 +666,29 @@ bool Settings::getNoiseParamsFromGroup(const std::string &name, bool Settings::exists(const std::string &name) const +{ + if (existsLocal(name)) + return true; + if (auto parent = getParent()) + return parent->exists(name); + return false; +} + + +bool Settings::existsLocal(const std::string &name) const { MutexAutoLock lock(m_mutex); - return (m_settings.find(name) != m_settings.end() || - m_defaults.find(name) != m_defaults.end()); + return m_settings.find(name) != m_settings.end(); } std::vector<std::string> Settings::getNames() const { + MutexAutoLock lock(m_mutex); + std::vector<std::string> names; + names.reserve(m_settings.size()); for (const auto &settings_it : m_settings) { names.push_back(settings_it.first); } @@ -615,28 +701,6 @@ std::vector<std::string> Settings::getNames() const * Getters that don't throw exceptions * ***************************************/ -bool Settings::getEntryNoEx(const std::string &name, SettingsEntry &val) const -{ - try { - val = getEntry(name); - return true; - } catch (SettingNotFoundException &e) { - return false; - } -} - - -bool Settings::getEntryDefaultNoEx(const std::string &name, SettingsEntry &val) const -{ - try { - val = getEntryDefault(name); - return true; - } catch (SettingNotFoundException &e) { - return false; - } -} - - bool Settings::getGroupNoEx(const std::string &name, Settings *&val) const { try { @@ -659,17 +723,6 @@ bool Settings::getNoEx(const std::string &name, std::string &val) const } -bool Settings::getDefaultNoEx(const std::string &name, std::string &val) const -{ - try { - val = getDefault(name); - return true; - } catch (SettingNotFoundException &e) { - return false; - } -} - - bool Settings::getFlag(const std::string &name) const { try { @@ -712,6 +765,15 @@ bool Settings::getS16NoEx(const std::string &name, s16 &val) const } } +bool Settings::getU32NoEx(const std::string &name, u32 &val) const +{ + try { + val = getU32(name); + return true; + } catch (SettingNotFoundException &e) { + return false; + } +} bool Settings::getS32NoEx(const std::string &name, s32 &val) const { @@ -780,24 +842,25 @@ bool Settings::getFlagStrNoEx(const std::string &name, u32 &val, ***********/ bool Settings::setEntry(const std::string &name, const void *data, - bool set_group, bool set_default) + bool set_group) { - Settings *old_group = NULL; - if (!checkNameValid(name)) return false; if (!set_group && !checkValueValid(*(const std::string *)data)) return false; + Settings *old_group = NULL; { MutexAutoLock lock(m_mutex); - SettingsEntry &entry = set_default ? m_defaults[name] : m_settings[name]; + SettingsEntry &entry = m_settings[name]; old_group = entry.group; entry.value = set_group ? "" : *(const std::string *)data; entry.group = set_group ? *(Settings **)data : NULL; entry.is_group = set_group; + if (set_group) + entry.group->m_end_tag = "}"; } delete old_group; @@ -808,7 +871,7 @@ bool Settings::setEntry(const std::string &name, const void *data, bool Settings::set(const std::string &name, const std::string &value) { - if (!setEntry(name, &value, false, false)) + if (!setEntry(name, &value, false)) return false; doCallbacks(name); @@ -816,9 +879,12 @@ bool Settings::set(const std::string &name, const std::string &value) } +// TODO: Remove this function bool Settings::setDefault(const std::string &name, const std::string &value) { - return setEntry(name, &value, false, true); + FATAL_ERROR_IF(m_hierarchy != &g_hierarchy, "setDefault is only valid on " + "global settings"); + return getLayer(SL_DEFAULTS)->set(name, value); } @@ -828,17 +894,7 @@ bool Settings::setGroup(const std::string &name, const Settings &group) // avoid double-free by copying the source Settings *copy = new Settings(); *copy = group; - return setEntry(name, ©, true, false); -} - - -bool Settings::setGroupDefault(const std::string &name, const Settings &group) -{ - // Settings must own the group pointer - // avoid double-free by copying the source - Settings *copy = new Settings(); - *copy = group; - return setEntry(name, ©, true, true); + return setEntry(name, ©, true); } @@ -908,19 +964,7 @@ bool Settings::setFlagStr(const std::string &name, u32 flags, } -bool Settings::setStruct(const std::string &name, const std::string &format, - void *value) -{ - std::string structstr; - if (!serializeStructToString(&structstr, format, value)) - return false; - - return set(name, structstr); -} - - -bool Settings::setNoiseParams(const std::string &name, - const NoiseParams &np, bool set_default) +bool Settings::setNoiseParams(const std::string &name, const NoiseParams &np) { Settings *group = new Settings; @@ -933,7 +977,7 @@ bool Settings::setNoiseParams(const std::string &name, group->setFloat("lacunarity", np.lacunarity); group->setFlagStr("flags", np.flags, flagdesc_noiseparams, np.flags); - return setEntry(name, &group, true, set_default); + return setEntry(name, &group, true); } @@ -957,46 +1001,8 @@ bool Settings::remove(const std::string &name) } -void Settings::clear() -{ - MutexAutoLock lock(m_mutex); - clearNoLock(); -} - -void Settings::clearDefaults() -{ - MutexAutoLock lock(m_mutex); - clearDefaultsNoLock(); -} - -void Settings::updateValue(const Settings &other, const std::string &name) -{ - if (&other == this) - return; - - MutexAutoLock lock(m_mutex); - - try { - m_settings[name] = other.get(name); - } catch (SettingNotFoundException &e) { - } -} - - -void Settings::update(const Settings &other) -{ - if (&other == this) - return; - - MutexAutoLock lock(m_mutex); - MutexAutoLock lock2(other.m_mutex); - - updateNoLock(other); -} - - SettingsParseEvent Settings::parseConfigObject(const std::string &line, - const std::string &end, std::string &name, std::string &value) + std::string &name, std::string &value) { std::string trimmed_line = trim(line); @@ -1004,7 +1010,7 @@ SettingsParseEvent Settings::parseConfigObject(const std::string &line, return SPE_NONE; if (trimmed_line[0] == '#') return SPE_COMMENT; - if (trimmed_line == end) + if (trimmed_line == m_end_tag) return SPE_END; size_t pos = trimmed_line.find('='); @@ -1023,67 +1029,26 @@ SettingsParseEvent Settings::parseConfigObject(const std::string &line, } -void Settings::updateNoLock(const Settings &other) -{ - m_settings.insert(other.m_settings.begin(), other.m_settings.end()); - m_defaults.insert(other.m_defaults.begin(), other.m_defaults.end()); -} - - void Settings::clearNoLock() { - for (SettingEntries::const_iterator it = m_settings.begin(); it != m_settings.end(); ++it) delete it->second.group; m_settings.clear(); - - clearDefaultsNoLock(); } -void Settings::clearDefaultsNoLock() -{ - for (SettingEntries::const_iterator it = m_defaults.begin(); - it != m_defaults.end(); ++it) - delete it->second.group; - m_defaults.clear(); -} void Settings::setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags) { - m_flags[name] = flagdesc; + s_flags[name] = flagdesc; setDefault(name, writeFlagString(flags, flagdesc, U32_MAX)); } -void Settings::overrideDefaults(Settings *other) -{ - for (const auto &setting : other->m_settings) { - if (setting.second.is_group) { - setGroupDefault(setting.first, *setting.second.group); - continue; - } - const FlagDesc *flagdesc = getFlagDescFallback(setting.first); - if (flagdesc) { - // Flags cannot be copied directly. - // 1) Get the current set flags - u32 flags = getFlagStr(setting.first, flagdesc, nullptr); - // 2) Set the flags as defaults - other->setDefault(setting.first, flagdesc, flags); - // 3) Get the newly set flags and override the default setting value - setDefault(setting.first, flagdesc, - other->getFlagStr(setting.first, flagdesc, nullptr)); - continue; - } - // Also covers FlagDesc settings - setDefault(setting.first, setting.second.value); - } -} - const FlagDesc *Settings::getFlagDescFallback(const std::string &name) const { - auto it = m_flags.find(name); - return it == m_flags.end() ? nullptr : it->second; + auto it = s_flags.find(name); + return it == s_flags.end() ? nullptr : it->second; } void Settings::registerChangedCallback(const std::string &name, @@ -1110,6 +1075,19 @@ void Settings::deregisterChangedCallback(const std::string &name, } } +void Settings::removeSecureSettings() +{ + for (const auto &name : getNames()) { + if (name.compare(0, 7, "secure.") != 0) + continue; + + errorstream << "Secure setting " << name + << " isn't allowed, so was ignored." + << std::endl; + remove(name); + } +} + void Settings::doCallbacks(const std::string &name) const { MutexAutoLock lock(m_callback_mutex); diff --git a/src/settings.h b/src/settings.h index ccc252049..4b0787343 100644 --- a/src/settings.h +++ b/src/settings.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_bloated.h" #include "util/string.h" +#include "util/basic_macros.h" #include <string> #include <list> #include <set> @@ -30,7 +31,7 @@ class Settings; struct NoiseParams; // Global objects -extern Settings *g_settings; +extern Settings *g_settings; // Same as Settings::getLayer(SL_GLOBAL); extern std::string g_settings_path; // Type for a settings changed callback function @@ -60,6 +61,36 @@ enum SettingsParseEvent { SPE_MULTILINE, }; +// Describes the global setting layers, SL_GLOBAL is where settings are read from +enum SettingsLayer { + SL_DEFAULTS, + SL_GAME, + SL_GLOBAL, + SL_TOTAL_COUNT +}; + +// Implements the hierarchy a settings object may be part of +class SettingsHierarchy { +public: + /* + * A settings object that may be part of another hierarchy can + * occupy the index 0 as a fallback. If not set you can use 0 on your own. + */ + SettingsHierarchy(Settings *fallback = nullptr); + + DISABLE_CLASS_COPY(SettingsHierarchy) + + Settings *getLayer(int layer) const; + +private: + friend class Settings; + Settings *getParent(int layer) const; + void onLayerCreated(int layer, Settings *obj); + void onLayerRemoved(int layer); + + std::vector<Settings*> layers; +}; + struct ValueSpec { ValueSpec(ValueType a_type, const char *a_help=NULL) { @@ -92,8 +123,15 @@ typedef std::unordered_map<std::string, SettingsEntry> SettingEntries; class Settings { public: - Settings() = default; + /* These functions operate on the global hierarchy! */ + static Settings *createLayer(SettingsLayer sl, const std::string &end_tag = ""); + static Settings *getLayer(SettingsLayer sl); + /**/ + Settings(const std::string &end_tag = "") : + m_end_tag(end_tag) + {} + Settings(const std::string &end_tag, SettingsHierarchy *h, int settings_layer); ~Settings(); Settings & operator += (const Settings &other); @@ -110,29 +148,15 @@ public: // NOTE: Types of allowed_options are ignored. Returns success. bool parseCommandLine(int argc, char *argv[], std::map<std::string, ValueSpec> &allowed_options); - bool parseConfigLines(std::istream &is, const std::string &end = ""); + bool parseConfigLines(std::istream &is); void writeLines(std::ostream &os, u32 tab_depth=0) const; - SettingsParseEvent parseConfigObject(const std::string &line, - const std::string &end, std::string &name, std::string &value); - bool updateConfigObject(std::istream &is, std::ostream &os, - const std::string &end, u32 tab_depth=0); - - static bool checkNameValid(const std::string &name); - static bool checkValueValid(const std::string &value); - static std::string getMultiline(std::istream &is, size_t *num_lines=NULL); - static void printEntry(std::ostream &os, const std::string &name, - const SettingsEntry &entry, u32 tab_depth=0); - /*********** * Getters * ***********/ - const SettingsEntry &getEntry(const std::string &name) const; - const SettingsEntry &getEntryDefault(const std::string &name) const; Settings *getGroup(const std::string &name) const; const std::string &get(const std::string &name) const; - const std::string &getDefault(const std::string &name) const; bool getBool(const std::string &name) const; u16 getU16(const std::string &name) const; s16 getS16(const std::string &name) const; @@ -140,35 +164,33 @@ public: s32 getS32(const std::string &name) const; u64 getU64(const std::string &name) const; float getFloat(const std::string &name) const; + float getFloat(const std::string &name, float min, float max) const; v2f getV2F(const std::string &name) const; v3f getV3F(const std::string &name) const; u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc, u32 *flagmask) const; - // N.B. if getStruct() is used to read a non-POD aggregate type, - // the behavior is undefined. - bool getStruct(const std::string &name, const std::string &format, - void *out, size_t olen) const; bool getNoiseParams(const std::string &name, NoiseParams &np) const; bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const; bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const; - // return all keys used + // return all keys used in this object std::vector<std::string> getNames() const; + // check if setting exists anywhere in the hierarchy bool exists(const std::string &name) const; + // check if setting exists in this object ("locally") + bool existsLocal(const std::string &name) const; /*************************************** * Getters that don't throw exceptions * ***************************************/ - bool getEntryNoEx(const std::string &name, SettingsEntry &val) const; - bool getEntryDefaultNoEx(const std::string &name, SettingsEntry &val) const; bool getGroupNoEx(const std::string &name, Settings *&val) const; bool getNoEx(const std::string &name, std::string &val) const; - bool getDefaultNoEx(const std::string &name, std::string &val) const; bool getFlag(const std::string &name) const; bool getU16NoEx(const std::string &name, u16 &val) const; bool getS16NoEx(const std::string &name, s16 &val) const; + bool getU32NoEx(const std::string &name, u32 &val) const; bool getS32NoEx(const std::string &name, s32 &val) const; bool getU64NoEx(const std::string &name, u64 &val) const; bool getFloatNoEx(const std::string &name, float &val) const; @@ -189,11 +211,10 @@ public: // N.B. Groups not allocated with new must be set to NULL in the settings // tree before object destruction. bool setEntry(const std::string &name, const void *entry, - bool set_group, bool set_default); + bool set_group); bool set(const std::string &name, const std::string &value); bool setDefault(const std::string &name, const std::string &value); bool setGroup(const std::string &name, const Settings &group); - bool setGroupDefault(const std::string &name, const Settings &group); bool setBool(const std::string &name, bool value); bool setS16(const std::string &name, s16 value); bool setU16(const std::string &name, u16 value); @@ -204,26 +225,16 @@ public: bool setV3F(const std::string &name, v3f value); bool setFlagStr(const std::string &name, u32 flags, const FlagDesc *flagdesc = nullptr, u32 flagmask = U32_MAX); - bool setNoiseParams(const std::string &name, const NoiseParams &np, - bool set_default=false); - // N.B. if setStruct() is used to write a non-POD aggregate type, - // the behavior is undefined. - bool setStruct(const std::string &name, const std::string &format, void *value); + bool setNoiseParams(const std::string &name, const NoiseParams &np); // remove a setting bool remove(const std::string &name); - void clear(); - void clearDefaults(); - void updateValue(const Settings &other, const std::string &name); - void update(const Settings &other); - /************** - * Miscellany * - **************/ + /***************** + * Miscellaneous * + *****************/ void setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags); - // Takes the provided setting values and uses them as new defaults - void overrideDefaults(Settings *other); const FlagDesc *getFlagDescFallback(const std::string &name) const; void registerChangedCallback(const std::string &name, @@ -231,7 +242,40 @@ public: void deregisterChangedCallback(const std::string &name, SettingsChangedCallback cbf, void *userdata = NULL); + void removeSecureSettings(); + + // Returns the settings layer this object is. + // If within the global hierarchy you can cast this to enum SettingsLayer + inline int getLayer() const { return m_settingslayer; } + private: + /*********************** + * Reading and writing * + ***********************/ + + SettingsParseEvent parseConfigObject(const std::string &line, + std::string &name, std::string &value); + bool updateConfigObject(std::istream &is, std::ostream &os, + u32 tab_depth=0); + + static bool checkNameValid(const std::string &name); + static bool checkValueValid(const std::string &value); + static std::string getMultiline(std::istream &is, size_t *num_lines=NULL); + static void printEntry(std::ostream &os, const std::string &name, + const SettingsEntry &entry, u32 tab_depth=0); + + /*********** + * Getters * + ***********/ + Settings *getParent() const; + + const SettingsEntry &getEntry(const std::string &name) const; + + // Allow TestSettings to run sanity checks using private functions. + friend class TestSettings; + // For sane mutex locking when iterating + friend class LuaSettings; + void updateNoLock(const Settings &other); void clearNoLock(); void clearDefaultsNoLock(); @@ -239,14 +283,16 @@ private: void doCallbacks(const std::string &name) const; SettingEntries m_settings; - SettingEntries m_defaults; - std::unordered_map<std::string, const FlagDesc *> m_flags; - SettingsCallbackMap m_callbacks; + std::string m_end_tag; mutable std::mutex m_callback_mutex; // All methods that access m_settings/m_defaults directly should lock this. mutable std::mutex m_mutex; + SettingsHierarchy *m_hierarchy = nullptr; + int m_settingslayer = -1; + + static std::unordered_map<std::string, const FlagDesc *> s_flags; }; diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp index 0cd772337..03bb564fb 100644 --- a/src/settings_translation_file.cpp +++ b/src/settings_translation_file.cpp @@ -1,223 +1,135 @@ // 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() { gettext("Controls"); + gettext("General"); gettext("Build inside player"); gettext("If enabled, you can place blocks at the position (feet + eye level) where you stand.\nThis is helpful when working with nodeboxes in small areas."); - gettext("Flying"); - gettext("Player is able to fly without being affected by gravity.\nThis requires the \"fly\" privilege on the server."); - gettext("Pitch move mode"); - gettext("If enabled, makes move directions relative to the player's pitch when flying or swimming."); - gettext("Fast movement"); - gettext("Fast movement (via the \"special\" key).\nThis requires the \"fast\" privilege on the server."); - gettext("Noclip"); - gettext("If enabled together with fly mode, player is able to fly through solid nodes.\nThis requires the \"noclip\" privilege on the server."); gettext("Cinematic mode"); gettext("Smooths camera when looking around. Also called look or mouse smoothing.\nUseful for recording videos."); gettext("Camera smoothing"); gettext("Smooths rotation of camera. 0 to disable."); gettext("Camera smoothing in cinematic mode"); gettext("Smooths rotation of camera in cinematic mode. 0 to disable."); - gettext("Invert mouse"); - gettext("Invert vertical mouse movement."); - gettext("Mouse sensitivity"); - gettext("Mouse sensitivity multiplier."); - gettext("Special key for climbing/descending"); - gettext("If enabled, \"special\" key instead of \"sneak\" key is used for climbing down and\ndescending."); + gettext("Aux1 key for climbing/descending"); + gettext("If enabled, \"Aux1\" key instead of \"Sneak\" key is used for climbing down and\ndescending."); gettext("Double tap jump for fly"); gettext("Double-tapping the jump key toggles fly mode."); - gettext("Always fly and fast"); - gettext("If disabled, \"special\" key is used to fly fast if both fly and fast mode are\nenabled."); - gettext("Rightclick repetition interval"); - gettext("The time in seconds it takes between repeated right clicks when holding the right\nmouse button."); + gettext("Always fly fast"); + gettext("If disabled, \"Aux1\" key is used to fly fast if both fly and fast mode are\nenabled."); + gettext("Place repetition interval"); + gettext("The time in seconds it takes between repeated node placements when holding\nthe place button."); gettext("Automatic jumping"); gettext("Automatically jump up single-node obstacles."); gettext("Safe digging and placing"); gettext("Prevent digging and placing from repeating when holding the mouse buttons.\nEnable this when you dig or place too often by accident."); - gettext("Random input"); - gettext("Enable random user input (only used for testing)."); - gettext("Continuous forward"); - gettext("Continuous forward movement, toggled by autoforward key.\nPress the autoforward key again or the backwards movement to disable."); + gettext("Keyboard and Mouse"); + gettext("Invert mouse"); + gettext("Invert vertical mouse movement."); + gettext("Mouse sensitivity"); + gettext("Mouse sensitivity multiplier."); + gettext("Touchscreen"); gettext("Touch screen threshold"); gettext("The length in pixels it takes for touch screen interaction to start."); gettext("Fixed virtual joystick"); gettext("(Android) Fixes the position of virtual joystick.\nIf disabled, virtual joystick will center to first-touch's position."); - gettext("Virtual joystick triggers aux button"); - gettext("(Android) Use virtual joystick to trigger \"aux\" button.\nIf enabled, virtual joystick will also tap \"aux\" button when out of main circle."); - gettext("Enable joysticks"); - gettext("Enable joysticks"); - gettext("Joystick ID"); - gettext("The identifier of the joystick to use"); - gettext("Joystick type"); - gettext("The type of joystick"); - gettext("Joystick button repetition interval"); - gettext("The time in seconds it takes between repeated events\nwhen holding down a joystick button combination."); - gettext("Joystick frustum sensitivity"); - gettext("The sensitivity of the joystick axes for moving the\ningame view frustum around."); - gettext("Forward key"); - gettext("Key for moving the player forward.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Backward key"); - gettext("Key for moving the player backward.\nWill also disable autoforward, when active.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Left key"); - gettext("Key for moving the player left.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Right key"); - gettext("Key for moving the player right.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Jump key"); - gettext("Key for jumping.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Sneak key"); - gettext("Key for sneaking.\nAlso used for climbing down and descending in water if aux1_descends is disabled.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Inventory key"); - gettext("Key for opening the inventory.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Special key"); - gettext("Key for moving fast in fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Chat key"); - gettext("Key for opening the chat window.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Command key"); - gettext("Key for opening the chat window to type commands.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Command key"); - gettext("Key for opening the chat window to type local commands.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Range select key"); - gettext("Key for toggling unlimited view range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Fly key"); - gettext("Key for toggling flying.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Pitch move key"); - gettext("Key for toggling pitch move mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Fast key"); - gettext("Key for toggling fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Noclip key"); - gettext("Key for toggling noclip mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar next key"); - gettext("Key for selecting the next item in the hotbar.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar previous key"); - gettext("Key for selecting the previous item in the hotbar.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Mute key"); - gettext("Key for muting the game.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Inc. volume key"); - gettext("Key for increasing the volume.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Dec. volume key"); - gettext("Key for decreasing the volume.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Automatic forward key"); - gettext("Key for toggling autoforward.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Cinematic mode key"); - gettext("Key for toggling cinematic mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Minimap key"); - gettext("Key for toggling display of minimap.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Screenshot"); - gettext("Key for taking screenshots.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Drop item key"); - gettext("Key for dropping the currently selected item.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("View zoom key"); - gettext("Key to use view zoom when possible.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 1 key"); - gettext("Key for selecting the first hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 2 key"); - gettext("Key for selecting the second hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 3 key"); - gettext("Key for selecting the third hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 4 key"); - gettext("Key for selecting the fourth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 5 key"); - gettext("Key for selecting the fifth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 6 key"); - gettext("Key for selecting the sixth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 7 key"); - gettext("Key for selecting the seventh hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 8 key"); - gettext("Key for selecting the eighth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 9 key"); - gettext("Key for selecting the ninth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 10 key"); - gettext("Key for selecting the tenth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 11 key"); - gettext("Key for selecting the 11th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 12 key"); - gettext("Key for selecting the 12th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 13 key"); - gettext("Key for selecting the 13th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 14 key"); - gettext("Key for selecting the 14th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 15 key"); - gettext("Key for selecting the 15th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 16 key"); - gettext("Key for selecting the 16th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 17 key"); - gettext("Key for selecting the 17th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 18 key"); - gettext("Key for selecting the 18th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 19 key"); - gettext("Key for selecting the 19th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 20 key"); - gettext("Key for selecting the 20th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 21 key"); - gettext("Key for selecting the 21st hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 22 key"); - gettext("Key for selecting the 22nd hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 23 key"); - gettext("Key for selecting the 23rd hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 24 key"); - gettext("Key for selecting the 24th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 25 key"); - gettext("Key for selecting the 25th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 26 key"); - gettext("Key for selecting the 26th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 27 key"); - gettext("Key for selecting the 27th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 28 key"); - gettext("Key for selecting the 28th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 29 key"); - gettext("Key for selecting the 29th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 30 key"); - gettext("Key for selecting the 30th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 31 key"); - gettext("Key for selecting the 31st hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Hotbar slot 32 key"); - gettext("Key for selecting the 32nd hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("HUD toggle key"); - gettext("Key for toggling the display of the HUD.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Chat toggle key"); - gettext("Key for toggling the display of chat.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Large chat console key"); - gettext("Key for toggling the display of the large chat console.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Fog toggle key"); - gettext("Key for toggling the display of fog.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Camera update toggle key"); - gettext("Key for toggling the camera update. Only used for development\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Debug info toggle key"); - gettext("Key for toggling the display of debug info.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Profiler toggle key"); - gettext("Key for toggling the display of the profiler. Used for development.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("Toggle camera mode key"); - gettext("Key for switching between first- and third-person camera.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("View range increase key"); - gettext("Key for increasing the viewing range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); - gettext("View range decrease key"); - gettext("Key for decreasing the viewing range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Virtual joystick triggers Aux1 button"); + gettext("(Android) Use virtual joystick to trigger \"Aux1\" button.\nIf enabled, virtual joystick will also tap \"Aux1\" button when out of main circle."); + gettext("Graphics and Audio"); gettext("Graphics"); - gettext("In-Game"); - gettext("Basic"); - gettext("VBO"); - gettext("Enable vertex buffer objects.\nThis should greatly improve graphics performance."); - gettext("Fog"); - gettext("Whether to fog out the end of the visible area."); + gettext("Screen"); + gettext("Screen width"); + gettext("Width component of the initial window size. Ignored in fullscreen mode."); + gettext("Screen height"); + gettext("Height component of the initial window size. Ignored in fullscreen mode."); + gettext("Autosave screen size"); + gettext("Save window size automatically when modified."); + gettext("Full screen"); + gettext("Fullscreen mode."); + gettext("Pause on lost window focus"); + gettext("Open the pause menu when the window's focus is lost. Does not pause if a formspec is\nopen."); + gettext("FPS"); + gettext("Maximum FPS"); + gettext("If FPS would go higher than this, limit it by sleeping\nto not waste CPU power for no benefit."); + gettext("VSync"); + gettext("Vertical screen synchronization."); + gettext("FPS when unfocused or paused"); + gettext("Maximum FPS when the window is not focused, or when the game is paused."); + gettext("Viewing range"); + gettext("View distance in nodes."); + gettext("Undersampling"); + gettext("Undersampling is similar to using a lower screen resolution, but it applies\nto the game world only, keeping the GUI intact.\nIt should give a significant performance boost at the cost of less detailed image.\nHigher values result in a less detailed image."); + gettext("Graphics Effects"); + gettext("Opaque liquids"); + gettext("Makes all liquids opaque"); gettext("Leaves style"); gettext("Leaves style:\n- Fancy: all faces visible\n- Simple: only outer faces, if defined special_tiles are used\n- Opaque: disable transparency"); gettext("Connect glass"); gettext("Connects glass if supported by node."); gettext("Smooth lighting"); gettext("Enable smooth lighting with simple ambient occlusion.\nDisable for speed or for different looks."); + gettext("Tradeoffs for performance"); + gettext("Enables tradeoffs that reduce CPU load or increase rendering performance\nat the expense of minor visual glitches that do not impact game playability."); + gettext("Digging particles"); + gettext("Adds particles when digging a node."); + gettext("3d"); + gettext("3D mode"); + gettext("3D support.\nCurrently supported:\n- none: no 3d output.\n- anaglyph: cyan/magenta color 3d.\n- interlaced: odd/even line based polarisation screen support.\n- topbottom: split screen top/bottom.\n- sidebyside: split screen side by side.\n- crossview: Cross-eyed 3d\n- pageflip: quadbuffer based 3d.\nNote that the interlaced mode requires shaders to be enabled."); + gettext("3D mode parallax strength"); + gettext("Strength of 3D mode parallax."); + gettext("Bobbing"); + gettext("Arm inertia"); + gettext("Arm inertia, gives a more realistic movement of\nthe arm when the camera moves."); + gettext("View bobbing factor"); + gettext("Enable view bobbing and amount of view bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."); + gettext("Fall bobbing factor"); + gettext("Multiplier for fall bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."); + gettext("Camera"); + gettext("Near plane"); + gettext("Camera 'near clipping plane' distance in nodes, between 0 and 0.25\nOnly works on GLES platforms. Most users will not need to change this.\nIncreasing can reduce artifacting on weaker GPUs.\n0.1 = Default, 0.25 = Good value for weaker tablets."); + gettext("Field of view"); + gettext("Field of view in degrees."); + gettext("Light curve gamma"); + gettext("Alters the light curve by applying 'gamma correction' to it.\nHigher values make middle and lower light levels brighter.\nValue '1.0' leaves the light curve unaltered.\nThis only has significant effect on daylight and artificial\nlight, it has very little effect on natural night light."); + gettext("Ambient occlusion gamma"); + gettext("The strength (darkness) of node ambient-occlusion shading.\nLower is darker, Higher is lighter. The valid range of values for this\nsetting is 0.25 to 4.0 inclusive. If the value is out of range it will be\nset to the nearest valid value."); + gettext("Screenshots"); + gettext("Screenshot folder"); + gettext("Path to save screenshots at. Can be an absolute or relative path.\nThe folder will be created if it doesn't already exist."); + gettext("Screenshot format"); + gettext("Format of screenshots."); + gettext("Screenshot quality"); + gettext("Screenshot quality. Only used for JPEG format.\n1 means worst quality; 100 means best quality.\nUse 0 for default quality."); + gettext("Node and Entity Highlighting"); + gettext("Node highlighting"); + gettext("Method used to highlight selected object."); + gettext("Show entity selection boxes"); + gettext("Show entity selection boxes\nA restart is required after changing this."); + gettext("Selection box color"); + gettext("Selection box border color (R,G,B)."); + gettext("Selection box width"); + gettext("Width of the selection box lines around nodes."); + gettext("Crosshair color"); + gettext("Crosshair color (R,G,B).\nAlso controls the object crosshair color"); + gettext("Crosshair alpha"); + gettext("Crosshair alpha (opaqueness, between 0 and 255).\nThis also applies to the object crosshair."); + gettext("Fog"); + gettext("Fog"); + gettext("Whether to fog out the end of the visible area."); + gettext("Colored fog"); + gettext("Make fog and sky colors depend on daytime (dawn/sunset) and view direction."); + gettext("Fog start"); + gettext("Fraction of the visible distance at which fog starts to be rendered"); + gettext("Clouds"); gettext("Clouds"); gettext("Clouds are a client side effect."); gettext("3D clouds"); gettext("Use 3D cloud look instead of flat."); - gettext("Node highlighting"); - gettext("Method used to highlight selected object."); - gettext("Digging particles"); - gettext("Adds particles when digging a node."); - gettext("Filtering"); + gettext("Filtering and Antialiasing"); gettext("Mipmapping"); - gettext("Use mip mapping to scale textures. May slightly increase performance,\nespecially when using a high resolution texture pack.\nGamma correct downscaling is not supported."); + gettext("Use mipmapping to scale textures. May slightly increase performance,\nespecially when using a high resolution texture pack.\nGamma correct downscaling is not supported."); gettext("Anisotropic filtering"); gettext("Use anisotropic filtering when viewing at textures from an angle."); gettext("Bilinear filtering"); @@ -225,36 +137,22 @@ fake_function() { gettext("Trilinear filtering"); gettext("Use trilinear filtering when scaling textures."); gettext("Clean transparent textures"); - gettext("Filtered textures can blend RGB values with fully-transparent neighbors,\nwhich PNG optimizers usually discard, sometimes resulting in a dark or\nlight edge to transparent textures. Apply this filter to clean that up\nat texture load time."); + gettext("Filtered textures can blend RGB values with fully-transparent neighbors,\nwhich PNG optimizers usually discard, often resulting in dark or\nlight edges to transparent textures. Apply a filter to clean that up\nat texture load time. This is automatically enabled if mipmapping is enabled."); gettext("Minimum texture size"); - gettext("When using bilinear/trilinear/anisotropic filters, low-resolution textures\ncan be blurred, so automatically upscale them with nearest-neighbor\ninterpolation to preserve crisp pixels. This sets the minimum texture size\nfor the upscaled textures; higher values look sharper, but require more\nmemory. Powers of 2 are recommended. Setting this higher than 1 may not\nhave a visible effect unless bilinear/trilinear/anisotropic filtering is\nenabled.\nThis is also used as the base node texture size for world-aligned\ntexture autoscaling."); + gettext("When using bilinear/trilinear/anisotropic filters, low-resolution textures\ncan be blurred, so automatically upscale them with nearest-neighbor\ninterpolation to preserve crisp pixels. This sets the minimum texture size\nfor the upscaled textures; higher values look sharper, but require more\nmemory. Powers of 2 are recommended. This setting is ONLY applied if\nbilinear/trilinear/anisotropic filtering is enabled.\nThis is also used as the base node texture size for world-aligned\ntexture autoscaling."); gettext("FSAA"); - gettext("Experimental option, might cause visible spaces between blocks\nwhen set to higher number than 0."); - gettext("Undersampling"); - gettext("Undersampling is similar to using a lower screen resolution, but it applies\nto the game world only, keeping the GUI intact.\nIt should give a significant performance boost at the cost of less detailed image.\nHigher values result in a less detailed image."); + gettext("Use multi-sample antialiasing (MSAA) to smooth out block edges.\nThis algorithm smooths out the 3D viewport while keeping the image sharp,\nbut it doesn't affect the insides of textures\n(which is especially noticeable with transparent textures).\nVisible spaces appear between nodes when shaders are disabled.\nIf set to 0, MSAA is disabled.\nA restart is required after changing this option."); gettext("Shaders"); gettext("Shaders"); gettext("Shaders allow advanced visual effects and may increase performance on some video\ncards.\nThis only works with the OpenGL video backend."); - gettext("Shader path"); - gettext("Path to shader directory. If no path is defined, default location will be used."); gettext("Tone Mapping"); gettext("Filmic tone mapping"); gettext("Enables Hable's 'Uncharted 2' filmic tone mapping.\nSimulates the tone curve of photographic film and how this approximates the\nappearance of high dynamic range images. Mid-range contrast is slightly\nenhanced, highlights and shadows are gradually compressed."); - gettext("Bumpmapping"); - gettext("Bumpmapping"); - gettext("Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack.\nRequires shaders to be enabled."); - gettext("Parallax Occlusion"); - gettext("Parallax occlusion"); - gettext("Enables parallax occlusion mapping.\nRequires shaders to be enabled."); - gettext("Parallax occlusion mode"); - gettext("0 = parallax occlusion with slope information (faster).\n1 = relief mapping (slower, more accurate)."); - gettext("Parallax occlusion iterations"); - gettext("Number of parallax occlusion iterations."); - gettext("Parallax occlusion scale"); - gettext("Overall scale of parallax occlusion effect."); - gettext("Parallax occlusion bias"); - gettext("Overall bias of parallax occlusion effect, usually scale/2."); gettext("Waving Nodes"); + gettext("Waving leaves"); + gettext("Set to true to enable waving leaves.\nRequires shaders to be enabled."); + gettext("Waving plants"); + gettext("Set to true to enable waving plants.\nRequires shaders to be enabled."); gettext("Waving liquids"); gettext("Set to true to enable waving liquids (like water).\nRequires shaders to be enabled."); gettext("Waving liquids wave height"); @@ -263,126 +161,46 @@ fake_function() { gettext("Length of liquid waves.\nRequires waving liquids to be enabled."); gettext("Waving liquids wave speed"); gettext("How fast liquid waves will move. Higher = faster.\nIf negative, liquid waves will move backwards.\nRequires waving liquids to be enabled."); - gettext("Waving leaves"); - gettext("Set to true to enable waving leaves.\nRequires shaders to be enabled."); - gettext("Waving plants"); - gettext("Set to true to enable waving plants.\nRequires shaders to be enabled."); - gettext("Advanced"); - gettext("Arm inertia"); - gettext("Arm inertia, gives a more realistic movement of\nthe arm when the camera moves."); - gettext("Maximum FPS"); - gettext("If FPS would go higher than this, limit it by sleeping\nto not waste CPU power for no benefit."); - gettext("FPS in pause menu"); - gettext("Maximum FPS when game is paused."); - gettext("Pause on lost window focus"); - gettext("Open the pause menu when the window's focus is lost. Does not pause if a formspec is\nopen."); - gettext("Viewing range"); - gettext("View distance in nodes."); - gettext("Near plane"); - gettext("Camera 'near clipping plane' distance in nodes, between 0 and 0.25\nOnly works on GLES platforms. Most users will not need to change this.\nIncreasing can reduce artifacting on weaker GPUs.\n0.1 = Default, 0.25 = Good value for weaker tablets."); - gettext("Screen width"); - gettext("Width component of the initial window size."); - gettext("Screen height"); - gettext("Height component of the initial window size."); - gettext("Autosave screen size"); - gettext("Save window size automatically when modified."); - gettext("Full screen"); - gettext("Fullscreen mode."); - gettext("Full screen BPP"); - gettext("Bits per pixel (aka color depth) in fullscreen mode."); - gettext("VSync"); - gettext("Vertical screen synchronization."); - gettext("Field of view"); - gettext("Field of view in degrees."); - gettext("Light curve gamma"); - gettext("Alters the light curve by applying 'gamma correction' to it.\nHigher values make middle and lower light levels brighter.\nValue '1.0' leaves the light curve unaltered.\nThis only has significant effect on daylight and artificial\nlight, it has very little effect on natural night light."); - gettext("Light curve low gradient"); - gettext("Gradient of light curve at minimum light level.\nControls the contrast of the lowest light levels."); - gettext("Light curve high gradient"); - gettext("Gradient of light curve at maximum light level.\nControls the contrast of the highest light levels."); - gettext("Light curve boost"); - gettext("Strength of light curve boost.\nThe 3 'boost' parameters define a range of the light\ncurve that is boosted in brightness."); - gettext("Light curve boost center"); - gettext("Center of light curve boost range.\nWhere 0.0 is minimum light level, 1.0 is maximum light level."); - gettext("Light curve boost spread"); - gettext("Spread of light curve boost range.\nControls the width of the range to be boosted.\nStandard deviation of the light curve boost Gaussian."); - gettext("Texture path"); - gettext("Path to texture directory. All textures are first searched from here."); - gettext("Video driver"); - gettext("The rendering back-end for Irrlicht.\nA restart is required after changing this.\nNote: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.\nOn other platforms, OpenGL is recommended, and it’s the only driver with\nshader support currently."); - gettext("Cloud radius"); - gettext("Radius of cloud area stated in number of 64 node cloud squares.\nValues larger than 26 will start to produce sharp cutoffs at cloud area corners."); - gettext("View bobbing factor"); - gettext("Enable view bobbing and amount of view bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."); - gettext("Fall bobbing factor"); - gettext("Multiplier for fall bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."); - gettext("3D mode"); - gettext("3D support.\nCurrently supported:\n- none: no 3d output.\n- anaglyph: cyan/magenta color 3d.\n- interlaced: odd/even line based polarisation screen support.\n- topbottom: split screen top/bottom.\n- sidebyside: split screen side by side.\n- crossview: Cross-eyed 3d\n- pageflip: quadbuffer based 3d.\nNote that the interlaced mode requires shaders to be enabled."); - gettext("3D mode parallax strength"); - gettext("Strength of 3D mode parallax."); - gettext("Console height"); - gettext("In-game chat console height, between 0.1 (10%) and 1.0 (100%)."); - gettext("Console color"); - gettext("In-game chat console background color (R,G,B)."); - gettext("Console alpha"); - gettext("In-game chat console background alpha (opaqueness, between 0 and 255)."); + gettext("Dynamic shadows"); + gettext("Dynamic shadows"); + gettext("Set to true to enable Shadow Mapping.\nRequires shaders to be enabled."); + gettext("Shadow strength gamma"); + gettext("Set the shadow strength gamma.\nAdjusts the intensity of in-game dynamic shadows.\nLower value means lighter shadows, higher value means darker shadows."); + gettext("Shadow map max distance in nodes to render shadows"); + gettext("Maximum distance to render shadows."); + gettext("Shadow map texture size"); + gettext("Texture size to render the shadow map on.\nThis must be a power of two.\nBigger numbers create better shadows but it is also more expensive."); + gettext("Shadow map texture in 32 bits"); + gettext("Sets shadow texture quality to 32 bits.\nOn false, 16 bits texture will be used.\nThis can cause much more artifacts in the shadow."); + gettext("Poisson filtering"); + gettext("Enable Poisson disk filtering.\nOn true uses Poisson disk to make \"soft shadows\". Otherwise uses PCF filtering."); + gettext("Shadow filter quality"); + gettext("Define shadow filtering quality.\nThis simulates the soft shadows effect by applying a PCF or Poisson disk\nbut also uses more resources."); + gettext("Colored shadows"); + gettext("Enable colored shadows.\nOn true translucent nodes cast colored shadows. This is expensive."); + gettext("Map shadows update frames"); + gettext("Spread a complete update of shadow map over given amount of frames.\nHigher values might make shadows laggy, lower values\nwill consume more resources.\nMinimum value: 1; maximum value: 16"); + gettext("Soft shadow radius"); + gettext("Set the soft shadow radius size.\nLower values mean sharper shadows, bigger values mean softer shadows.\nMinimum value: 1.0; maximum value: 15.0"); + gettext("Sky Body Orbit Tilt"); + gettext("Set the tilt of Sun/Moon orbit in degrees.\nValue of 0 means no tilt / vertical orbit.\nMinimum value: 0.0; maximum value: 60.0"); + gettext("Audio"); + gettext("Volume"); + gettext("Volume of all sounds.\nRequires the sound system to be enabled."); + gettext("Mute sound"); + gettext("Whether to mute sounds. You can unmute sounds at any time, unless the\nsound system is disabled (enable_sound=false).\nIn-game, you can toggle the mute state with the mute key or by using the\npause menu."); + gettext("User Interfaces"); + gettext("Language"); + gettext("Set the language. Leave empty to use the system language.\nA restart is required after changing this."); + gettext("GUIs"); + gettext("GUI scaling"); + gettext("Scale GUI by a user specified value.\nUse a nearest-neighbor-anti-alias filter to scale the GUI.\nThis will smooth over some of the rough edges, and blend\npixels when scaling down, at the cost of blurring some\nedge pixels when images are scaled by non-integer sizes."); + gettext("Inventory items animations"); + gettext("Enables animation of inventory items."); gettext("Formspec Full-Screen Background Opacity"); gettext("Formspec full-screen background opacity (between 0 and 255)."); gettext("Formspec Full-Screen Background Color"); gettext("Formspec full-screen background color (R,G,B)."); - gettext("Formspec Default Background Opacity"); - gettext("Formspec default background opacity (between 0 and 255)."); - gettext("Formspec Default Background Color"); - gettext("Formspec default background color (R,G,B)."); - gettext("Selection box color"); - gettext("Selection box border color (R,G,B)."); - gettext("Selection box width"); - gettext("Width of the selection box lines around nodes."); - gettext("Crosshair color"); - gettext("Crosshair color (R,G,B)."); - gettext("Crosshair alpha"); - gettext("Crosshair alpha (opaqueness, between 0 and 255)."); - gettext("Recent Chat Messages"); - gettext("Maximum number of recent chat messages to show"); - gettext("Desynchronize block animation"); - gettext("Whether node texture animations should be desynchronized per mapblock."); - gettext("Maximum hotbar width"); - gettext("Maximum proportion of current window to be used for hotbar.\nUseful if there's something to be displayed right or left of hotbar."); - gettext("HUD scale factor"); - gettext("Modifies the size of the hudbar elements."); - gettext("Mesh cache"); - gettext("Enables caching of facedir rotated meshes."); - gettext("Mapblock mesh generation delay"); - gettext("Delay between mesh updates on the client in ms. Increasing this will slow\ndown the rate of mesh updates, thus reducing jitter on slower clients."); - gettext("Mapblock mesh generator's MapBlock cache size in MB"); - gettext("Size of the MapBlock cache of the mesh generator. Increasing this will\nincrease the cache hit %, reducing the data being copied from the main\nthread, thus reducing jitter."); - gettext("Minimap"); - gettext("Enables minimap."); - gettext("Round minimap"); - gettext("Shape of the minimap. Enabled = round, disabled = square."); - gettext("Minimap scan height"); - gettext("True = 256\nFalse = 128\nUsable to make minimap smoother on slower machines."); - gettext("Colored fog"); - gettext("Make fog and sky colors depend on daytime (dawn/sunset) and view direction."); - gettext("Ambient occlusion gamma"); - gettext("The strength (darkness) of node ambient-occlusion shading.\nLower is darker, Higher is lighter. The valid range of values for this\nsetting is 0.25 to 4.0 inclusive. If the value is out of range it will be\nset to the nearest valid value."); - gettext("Inventory items animations"); - gettext("Enables animation of inventory items."); - gettext("Fog start"); - gettext("Fraction of the visible distance at which fog starts to be rendered"); - gettext("Opaque liquids"); - gettext("Makes all liquids opaque"); - gettext("World-aligned textures mode"); - gettext("Textures on a node may be aligned either to the node or to the world.\nThe former mode suits better things like machines, furniture, etc., while\nthe latter makes stairs and microblocks fit surroundings better.\nHowever, as this possibility is new, thus may not be used by older servers,\nthis option allows enforcing it for certain node types. Note though that\nthat is considered EXPERIMENTAL and may not work properly."); - gettext("Autoscaling mode"); - gettext("World-aligned textures may be scaled to span several nodes. However,\nthe server may not send the scale you want, especially if you use\na specially-designed texture pack; with this option, the client tries\nto determine the scale automatically basing on the texture size.\nSee also texture_min_size.\nWarning: This option is EXPERIMENTAL!"); - gettext("Show entity selection boxes"); - gettext("Show entity selection boxes"); - gettext("Menus"); - gettext("Clouds in menu"); - gettext("Use a cloud animation for the main menu background."); - gettext("GUI scaling"); - gettext("Scale GUI by a user specified value.\nUse a nearest-neighbor-anti-alias filter to scale the GUI.\nThis will smooth over some of the rough edges, and blend\npixels when scaling down, at the cost of blurring some\nedge pixels when images are scaled by non-integer sizes."); gettext("GUI scaling filter"); gettext("When gui_scaling_filter is true, all GUI images need to be\nfiltered in software, but some images are generated directly\nto hardware (e.g. render-to-texture for nodes in inventory)."); gettext("GUI scaling filter txr2img"); @@ -391,86 +209,49 @@ fake_function() { gettext("Delay showing tooltips, stated in milliseconds."); gettext("Append item name"); gettext("Append item name to tooltip."); - gettext("FreeType fonts"); - gettext("Whether FreeType fonts are used, requires FreeType support to be compiled in.\nIf disabled, bitmap and XML vectors fonts are used instead."); - gettext("Font bold by default"); - gettext("Font italic by default"); - gettext("Font shadow"); - gettext("Shadow offset (in pixels) of the default font. If 0, then shadow will not be drawn."); - gettext("Font shadow alpha"); - gettext("Opaqueness (alpha) of the shadow behind the default font, between 0 and 255."); - gettext("Font size"); - gettext("Font size of the default font in point (pt)."); - gettext("Regular font path"); - gettext("Path to the default font.\nIf “freetype” setting is enabled: Must be a TrueType font.\nIf “freetype” setting is disabled: Must be a bitmap or XML vectors font.\nThe fallback font will be used if the font cannot be loaded."); - gettext("Bold font path"); - gettext("Italic font path"); - gettext("Bold and italic font path"); - gettext("Monospace font size"); - gettext("Font size of the monospace font in point (pt)."); - gettext("Monospace font path"); - gettext("Path to the monospace font.\nIf “freetype” setting is enabled: Must be a TrueType font.\nIf “freetype” setting is disabled: Must be a bitmap or XML vectors font.\nThis font is used for e.g. the console and profiler screen."); - gettext("Bold monospace font path"); - gettext("Italic monospace font path"); - gettext("Bold and italic monospace font path"); - gettext("Fallback font size"); - gettext("Font size of the fallback font in point (pt)."); - gettext("Fallback font shadow"); - gettext("Shadow offset (in pixels) of the fallback font. If 0, then shadow will not be drawn."); - gettext("Fallback font shadow alpha"); - gettext("Opaqueness (alpha) of the shadow behind the fallback font, between 0 and 255."); - gettext("Fallback font path"); - gettext("Path of the fallback font.\nIf “freetype” setting is enabled: Must be a TrueType font.\nIf “freetype” setting is disabled: Must be a bitmap or XML vectors font.\nThis font will be used for certain languages or if the default font is unavailable."); + gettext("Clouds in menu"); + gettext("Use a cloud animation for the main menu background."); + gettext("HUD"); + gettext("HUD scaling"); + gettext("Modifies the size of the HUD elements."); + gettext("Show name tag backgrounds by default"); + gettext("Whether name tag backgrounds should be shown by default.\nMods may still set a background."); + gettext("Chat"); + gettext("Recent Chat Messages"); + gettext("Maximum number of recent chat messages to show"); + gettext("Console height"); + gettext("In-game chat console height, between 0.1 (10%) and 1.0 (100%)."); + gettext("Console color"); + gettext("In-game chat console background color (R,G,B)."); + gettext("Console alpha"); + gettext("In-game chat console background alpha (opaqueness, between 0 and 255)."); + gettext("Maximum hotbar width"); + gettext("Maximum proportion of current window to be used for hotbar.\nUseful if there's something to be displayed right or left of hotbar."); + gettext("Chat weblinks"); + gettext("Clickable weblinks (middle-click or Ctrl+left-click) enabled in chat console output."); + gettext("Weblink color"); + gettext("Optional override for chat weblink color."); gettext("Chat font size"); gettext("Font size of the recent chat text and chat prompt in point (pt).\nValue 0 will use the default font size."); - gettext("Screenshot folder"); - gettext("Path to save screenshots at. Can be an absolute or relative path.\nThe folder will be created if it doesn't already exist."); - gettext("Screenshot format"); - gettext("Format of screenshots."); - gettext("Screenshot quality"); - gettext("Screenshot quality. Only used for JPEG format.\n1 means worst quality; 100 means best quality.\nUse 0 for default quality."); - gettext("Advanced"); - gettext("DPI"); - gettext("Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens."); - gettext("Enable console window"); - gettext("Windows systems only: Start Minetest with the command line window in the background.\nContains the same information as the file debug.txt (default name)."); - gettext("Sound"); - gettext("Sound"); - gettext("Enables the sound system.\nIf disabled, this completely disables all sounds everywhere and the in-game\nsound controls will be non-functional.\nChanging this setting requires a restart."); - gettext("Volume"); - gettext("Volume of all sounds.\nRequires the sound system to be enabled."); - gettext("Mute sound"); - gettext("Whether to mute sounds. You can unmute sounds at any time, unless the\nsound system is disabled (enable_sound=false).\nIn-game, you can toggle the mute state with the mute key or by using the\npause menu."); + gettext("Content Repository"); + gettext("ContentDB URL"); + gettext("The URL for the content repository"); + gettext("ContentDB Flag Blacklist"); + gettext("Comma-separated list of flags to hide in the content repository.\n\"nonfree\" can be used to hide packages which do not qualify as 'free software',\nas defined by the Free Software Foundation.\nYou can also specify content ratings.\nThese flags are independent from Minetest versions,\nso see a full list at https://content.minetest.net/help/content_flags/"); + gettext("ContentDB Max Concurrent Downloads"); + gettext("Maximum number of concurrent downloads. Downloads exceeding this limit will be queued.\nThis should be lower than curl_parallel_limit."); + gettext("Client and Server"); gettext("Client"); - gettext("Network"); - gettext("Server address"); - gettext("Address to connect to.\nLeave this blank to start a local server.\nNote that the address field in the main menu overrides this setting."); - gettext("Remote port"); - gettext("Port to connect to (UDP).\nNote that the port field in the main menu overrides this setting."); - gettext("Prometheus listener address"); - gettext("Prometheus listener address.\nIf minetest is compiled with ENABLE_PROMETHEUS option enabled,\nenable metrics listener for Prometheus on that address.\nMetrics can be fetch on http://127.0.0.1:30000/metrics"); gettext("Saving map received from server"); gettext("Save the map received by the client on disk."); - gettext("Connect to external media server"); - gettext("Enable usage of remote media server (if provided by server).\nRemote servers offer a significantly faster way to download media (e.g. textures)\nwhen connecting to the server."); - gettext("Client modding"); - gettext("Enable Lua modding support on client.\nThis support is experimental and API can change."); gettext("Serverlist URL"); gettext("URL to the server list displayed in the Multiplayer Tab."); - gettext("Serverlist file"); - gettext("File in client/serverlist/ that contains your favorite servers displayed in the\nMultiplayer Tab."); - gettext("Maximum size of the out chat queue"); - gettext("Maximum size of the out chat queue.\n0 to disable queueing and -1 to make the queue size unlimited."); - gettext("Enable register confirmation"); - gettext("Enable register confirmation when connecting to server.\nIf disabled, new account will be registered automatically."); - gettext("Advanced"); - gettext("Mapblock unload timeout"); - gettext("Timeout for client to remove unused map data from memory."); - gettext("Mapblock limit"); - gettext("Maximum number of mapblocks for client to be kept in memory.\nSet to -1 for unlimited amount."); - gettext("Show debug info"); - gettext("Whether to show the client debug info (has the same effect as hitting F5)."); - gettext("Server / Singleplayer"); + gettext("Enable split login/register"); + gettext("If enabled, account registration is separate from login in the UI.\nIf disabled, new accounts will be registered automatically when logging in."); + gettext("Server"); + gettext("Admin name"); + gettext("Name of the player.\nWhen running a server, clients connecting with this name are admins.\nWhen starting from the main menu, this is overridden."); + gettext("Serverlist and MOTD"); gettext("Server name"); gettext("Name of the server, to be displayed when players join and in the serverlist."); gettext("Server description"); @@ -483,9 +264,13 @@ fake_function() { gettext("Automatically report to the serverlist."); gettext("Serverlist URL"); gettext("Announce to this serverlist."); - gettext("Strip color codes"); - gettext("Remove color codes from incoming chat messages\nUse this to stop players from being able to use color in their messages"); - gettext("Network"); + gettext("Message of the day"); + gettext("Message of the day displayed to players connecting."); + gettext("Maximum users"); + gettext("Maximum number of players that can be connected simultaneously."); + gettext("Static spawnpoint"); + gettext("If this is set, players will always (re)spawn at the given position."); + gettext("Networking"); gettext("Server port"); gettext("Network port to listen (UDP).\nThis value will be overridden when starting from the main menu."); gettext("Bind address"); @@ -496,84 +281,42 @@ fake_function() { gettext("Specifies URL from which client fetches media instead of using UDP.\n$filename should be accessible from $remote_media$filename via cURL\n(obviously, remote_media should end with a slash).\nFiles that are not present will be fetched the usual way."); gettext("IPv6 server"); gettext("Enable/disable running an IPv6 server.\nIgnored if bind_address is set.\nNeeds enable_ipv6 to be enabled."); - gettext("Advanced"); - gettext("Maximum simultaneous block sends per client"); - gettext("Maximum number of blocks that are simultaneously sent per client.\nThe maximum total count is calculated dynamically:\nmax_total = ceil((#clients + max_users) * per_client / 4)"); - gettext("Delay in sending blocks after building"); - gettext("To reduce lag, block transfers are slowed down when a player is building something.\nThis determines how long they are slowed down after placing or removing a node."); - gettext("Max. packets per iteration"); - gettext("Maximum number of packets sent per send step, if you have a slow connection\ntry reducing it, but don't reduce it to a number below double of targeted\nclient number."); - gettext("Game"); - gettext("Default game"); - gettext("Default game when creating a new world.\nThis will be overridden when creating a world from the main menu."); - gettext("Message of the day"); - gettext("Message of the day displayed to players connecting."); - gettext("Maximum users"); - gettext("Maximum number of players that can be connected simultaneously."); - gettext("Map directory"); - gettext("World directory (everything in the world is stored here).\nNot needed if starting from the main menu."); - gettext("Item entity TTL"); - gettext("Time in seconds for item entity (dropped items) to live.\nSetting it to -1 disables the feature."); - gettext("Default stack size"); - gettext("Specifies the default stack size of nodes, items and tools.\nNote that mods or games may explicitly set a stack for certain (or all) items."); - gettext("Damage"); - gettext("Enable players getting damage and dying."); - gettext("Creative"); - gettext("Enable creative mode for new created maps."); - gettext("Fixed map seed"); - gettext("A chosen map seed for a new map, leave empty for random.\nWill be overridden when creating a new world in the main menu."); + gettext("Server Security"); gettext("Default password"); gettext("New users need to input this password."); + gettext("Disallow empty passwords"); + gettext("If enabled, players cannot join without a password or change theirs to an empty password."); gettext("Default privileges"); gettext("The privileges that new users automatically get.\nSee /privs in game for a full list on your server and mod configuration."); gettext("Basic privileges"); gettext("Privileges that players with basic_privs can grant"); - gettext("Unlimited player transfer distance"); - gettext("Whether players are shown to clients without any range limit.\nDeprecated, use the setting player_transfer_distance instead."); - gettext("Player transfer distance"); - gettext("Defines the maximal player transfer distance in blocks (0 = unlimited)."); - gettext("Player versus player"); - gettext("Whether to allow players to damage and kill each other."); - gettext("Mod channels"); - gettext("Enable mod channels support."); - gettext("Static spawnpoint"); - gettext("If this is set, players will always (re)spawn at the given position."); - gettext("Disallow empty passwords"); - gettext("If enabled, new players cannot join with an empty password."); gettext("Disable anticheat"); gettext("If enabled, disable cheat prevention in multiplayer."); gettext("Rollback recording"); gettext("If enabled, actions are recorded for rollback.\nThis option is only read when server starts."); - gettext("Chat message format"); - gettext("Format of player chat messages. The following strings are valid placeholders:\n@name, @message, @timestamp (optional)"); - gettext("Shutdown message"); - gettext("A message to be displayed to all clients when the server shuts down."); - gettext("Crash message"); - gettext("A message to be displayed to all clients when the server crashes."); - gettext("Ask to reconnect after crash"); - gettext("Whether to ask clients to reconnect after a (Lua) crash.\nSet this to true if your server is set up to restart automatically."); - gettext("Active object send range"); - gettext("From how far clients know about objects, stated in mapblocks (16 nodes).\n\nSetting this larger than active_block_range will also cause the server\nto maintain active objects up to this distance in the direction the\nplayer is looking. (This can avoid mobs suddenly disappearing from view)"); - gettext("Active block range"); - gettext("The radius of the volume of blocks around every player that is subject to the\nactive block stuff, stated in mapblocks (16 nodes).\nIn active blocks objects are loaded and ABMs run.\nThis is also the minimum range in which active objects (mobs) are maintained.\nThis should be configured together with active_object_send_range_blocks."); - gettext("Max block send distance"); - gettext("From how far blocks are sent to clients, stated in mapblocks (16 nodes)."); - gettext("Maximum forceloaded blocks"); - gettext("Maximum number of forceloaded mapblocks."); - gettext("Time send interval"); - gettext("Interval of sending time of day to clients."); - gettext("Time speed"); - gettext("Controls length of day/night cycle.\nExamples:\n72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged."); - gettext("World start time"); - gettext("Time of day when a new world is started, in millihours (0-23999)."); - gettext("Map save interval"); - gettext("Interval of saving important changes in the world, stated in seconds."); + gettext("Client-side Modding"); + gettext("Client side modding restrictions"); + gettext("Restricts the access of certain client-side functions on servers.\nCombine the byteflags below to restrict client-side features, or set to 0\nfor no restrictions:\nLOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\nCHAT_MESSAGES: 2 (disable send_chat_message call client-side)\nREAD_ITEMDEFS: 4 (disable get_item_def call client-side)\nREAD_NODEDEFS: 8 (disable get_node_def call client-side)\nLOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\ncsm_restriction_noderange)\nREAD_PLAYERINFO: 32 (disable get_player_names call client-side)"); + gettext("Client side node lookup range restriction"); + gettext("If the CSM restriction for node range is enabled, get_node calls are limited\nto this distance from the player to the node."); + gettext("Chat"); + gettext("Strip color codes"); + gettext("Remove color codes from incoming chat messages\nUse this to stop players from being able to use color in their messages"); gettext("Chat message max length"); - gettext("Set the maximum character length of a chat message sent by clients."); + gettext("Set the maximum length of a chat message (in characters) sent by clients."); gettext("Chat message count limit"); gettext("Amount of messages a player may send per 10 seconds."); gettext("Chat message kick threshold"); gettext("Kick players who sent more than X messages per 10 seconds."); + gettext("Server Gameplay"); + gettext("Time speed"); + gettext("Controls length of day/night cycle.\nExamples:\n72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays unchanged."); + gettext("World start time"); + gettext("Time of day when a new world is started, in millihours (0-23999)."); + gettext("Item entity TTL"); + gettext("Time in seconds for item entity (dropped items) to live.\nSetting it to -1 disables the feature."); + gettext("Default stack size"); + gettext("Specifies the default stack size of nodes, items and tools.\nNote that mods or games may explicitly set a stack for certain (or all) items."); gettext("Physics"); gettext("Default acceleration"); gettext("Horizontal and vertical acceleration on ground or when climbing,\nin nodes per second per second."); @@ -592,108 +335,16 @@ fake_function() { gettext("Jumping speed"); gettext("Initial vertical speed when jumping, in nodes per second."); gettext("Liquid fluidity"); - gettext("Decrease this to increase liquid resistance to movement."); + gettext("How much you are slowed down when moving inside a liquid.\nDecrease this to increase liquid resistance to movement."); gettext("Liquid fluidity smoothing"); gettext("Maximum liquid resistance. Controls deceleration when entering liquid at\nhigh speed."); gettext("Liquid sinking"); - gettext("Controls sinking speed in liquid."); + gettext("Controls sinking speed in liquid when idling. Negative values will cause\nyou to rise instead."); gettext("Gravity"); gettext("Acceleration of gravity, in nodes per second per second."); - gettext("Advanced"); - gettext("Deprecated Lua API handling"); - gettext("Handling for deprecated Lua API calls:\n- legacy: (try to) mimic old behaviour (default for release).\n- log: mimic and log backtrace of deprecated call (default for debug).\n- error: abort on usage of deprecated call (suggested for mod developers)."); - gettext("Max. clearobjects extra blocks"); - gettext("Number of extra blocks that can be loaded by /clearobjects at once.\nThis is a trade-off between sqlite transaction overhead and\nmemory consumption (4096=100MB, as a rule of thumb)."); - gettext("Unload unused server data"); - gettext("How much the server will wait before unloading unused mapblocks.\nHigher value is smoother, but will use more RAM."); - gettext("Maximum objects per block"); - gettext("Maximum number of statically stored objects in a block."); - gettext("Synchronous SQLite"); - gettext("See https://www.sqlite.org/pragma.html#pragma_synchronous"); - gettext("Dedicated server step"); - gettext("Length of a server tick and the interval at which objects are generally updated over\nnetwork."); - gettext("Active block management interval"); - gettext("Length of time between active block management cycles"); - gettext("ABM interval"); - gettext("Length of time between Active Block Modifier (ABM) execution cycles"); - gettext("NodeTimer interval"); - gettext("Length of time between NodeTimer execution cycles"); - gettext("Ignore world errors"); - gettext("If enabled, invalid world data won't cause the server to shut down.\nOnly enable this if you know what you are doing."); - gettext("Liquid loop max"); - gettext("Max liquids processed per step."); - gettext("Liquid queue purge time"); - gettext("The time (in seconds) that the liquids queue may grow beyond processing\ncapacity until an attempt is made to decrease its size by dumping old queue\nitems. A value of 0 disables the functionality."); - gettext("Liquid update tick"); - gettext("Liquid update interval in seconds."); - gettext("Block send optimize distance"); - gettext("At this distance the server will aggressively optimize which blocks are sent to\nclients.\nSmall values potentially improve performance a lot, at the expense of visible\nrendering glitches (some blocks will not be rendered under water and in caves,\nas well as sometimes on land).\nSetting this to a value greater than max_block_send_distance disables this\noptimization.\nStated in mapblocks (16 nodes)."); - gettext("Server side occlusion culling"); - gettext("If enabled the server will perform map block occlusion culling based on\non the eye position of the player. This can reduce the number of blocks\nsent to the client 50-80%. The client will not longer receive most invisible\nso that the utility of noclip mode is reduced."); - gettext("Client side modding restrictions"); - gettext("Restricts the access of certain client-side functions on servers.\nCombine the byteflags below to restrict client-side features, or set to 0\nfor no restrictions:\nLOAD_CLIENT_MODS: 1 (disable loading client-provided mods)\nCHAT_MESSAGES: 2 (disable send_chat_message call client-side)\nREAD_ITEMDEFS: 4 (disable get_item_def call client-side)\nREAD_NODEDEFS: 8 (disable get_node_def call client-side)\nLOOKUP_NODES_LIMIT: 16 (limits get_node call client-side to\ncsm_restriction_noderange)\nREAD_PLAYERINFO: 32 (disable get_player_names call client-side)"); - gettext("Client side node lookup range restriction"); - gettext("If the CSM restriction for node range is enabled, get_node calls are limited\nto this distance from the player to the node."); - gettext("Security"); - gettext("Enable mod security"); - gettext("Prevent mods from doing insecure things like running shell commands."); - gettext("Trusted mods"); - gettext("Comma-separated list of trusted mods that are allowed to access insecure\nfunctions even when mod security is on (via request_insecure_environment())."); - gettext("HTTP mods"); - gettext("Comma-separated list of mods that are allowed to access HTTP APIs, which\nallow them to upload and download data to/from the internet."); - gettext("Advanced"); - gettext("Profiling"); - gettext("Load the game profiler"); - gettext("Load the game profiler to collect game profiling data.\nProvides a /profiler command to access the compiled profile.\nUseful for mod developers and server operators."); - gettext("Default report format"); - gettext("The default format in which profiles are being saved,\nwhen calling `/profiler save [format]` without format."); - gettext("Report path"); - gettext("The file path relative to your worldpath in which profiles will be saved to."); - gettext("Instrumentation"); - gettext("Entity methods"); - gettext("Instrument the methods of entities on registration."); - gettext("Active Block Modifiers"); - gettext("Instrument the action function of Active Block Modifiers on registration."); - gettext("Loading Block Modifiers"); - gettext("Instrument the action function of Loading Block Modifiers on registration."); - gettext("Chatcommands"); - gettext("Instrument chatcommands on registration."); - gettext("Global callbacks"); - gettext("Instrument global callback functions on registration.\n(anything you pass to a minetest.register_*() function)"); - gettext("Advanced"); - gettext("Builtin"); - gettext("Instrument builtin.\nThis is usually only needed by core/builtin contributors"); - gettext("Profiler"); - gettext("Have the profiler instrument itself:\n* Instrument an empty function.\nThis estimates the overhead, that instrumentation is adding (+1 function call).\n* Instrument the sampler being used to update the statistics."); - gettext("Client and Server"); - gettext("Player name"); - gettext("Name of the player.\nWhen running a server, clients connecting with this name are admins.\nWhen starting from the main menu, this is overridden."); - gettext("Language"); - gettext("Set the language. Leave empty to use the system language.\nA restart is required after changing this."); - gettext("Debug log level"); - gettext("Level of logging to be written to debug.txt:\n- <nothing> (no logging)\n- none (messages with no level)\n- error\n- warning\n- action\n- info\n- verbose"); - gettext("Debug log file size threshold"); - gettext("If the file size of debug.txt exceeds the number of megabytes specified in\nthis setting when it is opened, the file is moved to debug.txt.1,\ndeleting an older debug.txt.1 if it exists.\ndebug.txt is only moved if this setting is positive."); - gettext("Chat log level"); - gettext("Minimal level of logging to be written to chat."); - gettext("IPv6"); - gettext("Enable IPv6 support (for both client and server).\nRequired for IPv6 connections to work at all."); - gettext("Advanced"); - gettext("cURL timeout"); - gettext("Default timeout for cURL, stated in milliseconds.\nOnly has an effect if compiled with cURL."); - gettext("cURL parallel limit"); - gettext("Limits number of parallel HTTP requests. Affects:\n- Media fetch if server uses remote_media setting.\n- Serverlist download and server announcement.\n- Downloads performed by main menu (e.g. mod manager).\nOnly has an effect if compiled with cURL."); - gettext("cURL file download timeout"); - gettext("Maximum time in ms a file download (e.g. a mod download) may take."); - gettext("High-precision FPU"); - gettext("Makes DirectX work with LuaJIT. Disable if it causes troubles."); - gettext("Main menu style"); - gettext("Changes the main menu UI:\n- Full: Multiple singleplayer worlds, game choice, texture pack chooser, etc.\n- Simple: One singleplayer world, no game or texture pack choosers. May be\nnecessary for smaller screens."); - gettext("Main menu script"); - gettext("Replaces the default main menu with a custom one."); - gettext("Engine profiling data print interval"); - gettext("Print the engine's profiling data in regular intervals (in seconds).\n0 = disable. Useful for developers."); gettext("Mapgen"); + gettext("Fixed map seed"); + gettext("A chosen map seed for a new map, leave empty for random.\nWill be overridden when creating a new world in the main menu."); gettext("Mapgen name"); gettext("Name of map generator to be used when creating a new world.\nCreating a world in the main menu will override this.\nCurrent mapgens in a highly unstable state:\n- The optional floatlands of v7 (disabled by default)."); gettext("Water level"); @@ -703,8 +354,8 @@ fake_function() { gettext("Map generation limit"); gettext("Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).\nOnly mapchunks completely within the mapgen limit are generated.\nValue is stored per-world."); gettext("Mapgen flags"); - gettext("Global map generation attributes.\nIn Mapgen v6 the 'decorations' flag controls all decorations except trees\nand junglegrass, in all other mapgens this flag controls all decorations."); - gettext("Biome API temperature and humidity noise parameters"); + gettext("Global map generation attributes.\nIn Mapgen v6 the 'decorations' flag controls all decorations except trees\nand jungle grass, in all other mapgens this flag controls all decorations."); + gettext("Biome API noise parameters"); gettext("Heat noise"); gettext("Temperature variation for biomes."); gettext("Heat blend noise"); @@ -958,6 +609,12 @@ fake_function() { gettext("Terrain noise threshold for hills.\nControls proportion of world area covered by hills.\nAdjust towards 0.0 for a larger proportion."); gettext("Hill steepness"); gettext("Controls steepness/height of hills."); + gettext("Cavern limit"); + gettext("Y-level of cavern upper limit."); + gettext("Cavern taper"); + gettext("Y-distance over which caverns expand to full size."); + gettext("Cavern threshold"); + gettext("Defines full size of caverns, smaller values create larger caverns."); gettext("Dungeon minimum Y"); gettext("Lower Y limit of dungeons."); gettext("Dungeon maximum Y"); @@ -971,6 +628,8 @@ fake_function() { gettext("First of two 3D noises that together define tunnels."); gettext("Cave2 noise"); gettext("Second of two 3D noises that together define tunnels."); + gettext("Cavern noise"); + gettext("3D noise defining giant caverns."); gettext("Dungeon noise"); gettext("3D noise that determines number of dungeons per mapchunk."); gettext("Mapgen Fractal"); @@ -1080,6 +739,195 @@ fake_function() { gettext("Dungeon noise"); gettext("3D noise that determines number of dungeons per mapchunk."); gettext("Advanced"); + gettext("Developer Options"); + gettext("Client modding"); + gettext("Enable Lua modding support on client.\nThis support is experimental and API can change."); + gettext("Main menu script"); + gettext("Replaces the default main menu with a custom one."); + gettext("Mod Security"); + gettext("Enable mod security"); + gettext("Prevent mods from doing insecure things like running shell commands."); + gettext("Trusted mods"); + gettext("Comma-separated list of trusted mods that are allowed to access insecure\nfunctions even when mod security is on (via request_insecure_environment())."); + gettext("HTTP mods"); + gettext("Comma-separated list of mods that are allowed to access HTTP APIs, which\nallow them to upload and download data to/from the internet."); + gettext("Debugging"); + gettext("Debug log level"); + gettext("Level of logging to be written to debug.txt:\n- <nothing> (no logging)\n- none (messages with no level)\n- error\n- warning\n- action\n- info\n- verbose\n- trace"); + gettext("Debug log file size threshold"); + gettext("If the file size of debug.txt exceeds the number of megabytes specified in\nthis setting when it is opened, the file is moved to debug.txt.1,\ndeleting an older debug.txt.1 if it exists.\ndebug.txt is only moved if this setting is positive."); + gettext("Chat log level"); + gettext("Minimal level of logging to be written to chat."); + gettext("Deprecated Lua API handling"); + gettext("Handling for deprecated Lua API calls:\n- none: Do not log deprecated calls\n- log: mimic and log backtrace of deprecated call (default).\n- error: abort on usage of deprecated call (suggested for mod developers)."); + gettext("Random input"); + gettext("Enable random user input (only used for testing)."); + gettext("Mod channels"); + gettext("Enable mod channels support."); + gettext("Mod Profiler"); + gettext("Load the game profiler"); + gettext("Load the game profiler to collect game profiling data.\nProvides a /profiler command to access the compiled profile.\nUseful for mod developers and server operators."); + gettext("Default report format"); + gettext("The default format in which profiles are being saved,\nwhen calling `/profiler save [format]` without format."); + gettext("Report path"); + gettext("The file path relative to your worldpath in which profiles will be saved to."); + gettext("Entity methods"); + gettext("Instrument the methods of entities on registration."); + gettext("Active Block Modifiers"); + gettext("Instrument the action function of Active Block Modifiers on registration."); + gettext("Loading Block Modifiers"); + gettext("Instrument the action function of Loading Block Modifiers on registration."); + gettext("Chat commands"); + gettext("Instrument chat commands on registration."); + gettext("Global callbacks"); + gettext("Instrument global callback functions on registration.\n(anything you pass to a minetest.register_*() function)"); + gettext("Builtin"); + gettext("Instrument builtin.\nThis is usually only needed by core/builtin contributors"); + gettext("Profiler"); + gettext("Have the profiler instrument itself:\n* Instrument an empty function.\nThis estimates the overhead, that instrumentation is adding (+1 function call).\n* Instrument the sampler being used to update the statistics."); + gettext("Engine profiler"); + gettext("Engine profiling data print interval"); + gettext("Print the engine's profiling data in regular intervals (in seconds).\n0 = disable. Useful for developers."); + gettext("Advanced"); + gettext("IPv6"); + gettext("Enable IPv6 support (for both client and server).\nRequired for IPv6 connections to work at all."); + gettext("Ignore world errors"); + gettext("If enabled, invalid world data won't cause the server to shut down.\nOnly enable this if you know what you are doing."); + gettext("Graphics"); + gettext("Shader path"); + gettext("Path to shader directory. If no path is defined, default location will be used."); + gettext("Video driver"); + gettext("The rendering back-end.\nA restart is required after changing this.\nNote: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.\nOn other platforms, OpenGL is recommended.\nShaders are supported by OpenGL (desktop only) and OGLES2 (experimental)"); + gettext("Transparency Sorting Distance"); + gettext("Distance in nodes at which transparency depth sorting is enabled\nUse this to limit the performance impact of transparency depth sorting"); + gettext("VBO"); + gettext("Enable vertex buffer objects.\nThis should greatly improve graphics performance."); + gettext("Cloud radius"); + gettext("Radius of cloud area stated in number of 64 node cloud squares.\nValues larger than 26 will start to produce sharp cutoffs at cloud area corners."); + gettext("Desynchronize block animation"); + gettext("Whether node texture animations should be desynchronized per mapblock."); + gettext("Mesh cache"); + gettext("Enables caching of facedir rotated meshes."); + gettext("Mapblock mesh generation delay"); + gettext("Delay between mesh updates on the client in ms. Increasing this will slow\ndown the rate of mesh updates, thus reducing jitter on slower clients."); + gettext("Mapblock mesh generator's MapBlock cache size in MB"); + gettext("Size of the MapBlock cache of the mesh generator. Increasing this will\nincrease the cache hit %, reducing the data being copied from the main\nthread, thus reducing jitter."); + gettext("Minimap scan height"); + gettext("True = 256\nFalse = 128\nUsable to make minimap smoother on slower machines."); + gettext("World-aligned textures mode"); + gettext("Textures on a node may be aligned either to the node or to the world.\nThe former mode suits better things like machines, furniture, etc., while\nthe latter makes stairs and microblocks fit surroundings better.\nHowever, as this possibility is new, thus may not be used by older servers,\nthis option allows enforcing it for certain node types. Note though that\nthat is considered EXPERIMENTAL and may not work properly."); + gettext("Autoscaling mode"); + gettext("World-aligned textures may be scaled to span several nodes. However,\nthe server may not send the scale you want, especially if you use\na specially-designed texture pack; with this option, the client tries\nto determine the scale automatically basing on the texture size.\nSee also texture_min_size.\nWarning: This option is EXPERIMENTAL!"); + gettext("Font"); + gettext("Font bold by default"); + gettext("Font italic by default"); + gettext("Font shadow"); + gettext("Shadow offset (in pixels) of the default font. If 0, then shadow will not be drawn."); + gettext("Font shadow alpha"); + gettext("Opaqueness (alpha) of the shadow behind the default font, between 0 and 255."); + gettext("Font size"); + gettext("Font size of the default font where 1 unit = 1 pixel at 96 DPI"); + gettext("Font size divisible by"); + gettext("For pixel-style fonts that do not scale well, this ensures that font sizes used\nwith this font will always be divisible by this value, in pixels. For instance,\na pixel font 16 pixels tall should have this set to 16, so it will only ever be\nsized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."); + gettext("Regular font path"); + gettext("Path to the default font. Must be a TrueType font.\nThe fallback font will be used if the font cannot be loaded."); + gettext("Bold font path"); + gettext("Italic font path"); + gettext("Bold and italic font path"); + gettext("Monospace font size"); + gettext("Font size of the monospace font where 1 unit = 1 pixel at 96 DPI"); + gettext("Monospace font size divisible by"); + gettext("For pixel-style fonts that do not scale well, this ensures that font sizes used\nwith this font will always be divisible by this value, in pixels. For instance,\na pixel font 16 pixels tall should have this set to 16, so it will only ever be\nsized 16, 32, 48, etc., so a mod requesting a size of 25 will get 32."); + gettext("Monospace font path"); + gettext("Path to the monospace font. Must be a TrueType font.\nThis font is used for e.g. the console and profiler screen."); + gettext("Bold monospace font path"); + gettext("Italic monospace font path"); + gettext("Bold and italic monospace font path"); + gettext("Fallback font path"); + gettext("Path of the fallback font. Must be a TrueType font.\nThis font will be used for certain languages or if the default font is unavailable."); + gettext("Lighting"); + gettext("Light curve low gradient"); + gettext("Gradient of light curve at minimum light level.\nControls the contrast of the lowest light levels."); + gettext("Light curve high gradient"); + gettext("Gradient of light curve at maximum light level.\nControls the contrast of the highest light levels."); + gettext("Light curve boost"); + gettext("Strength of light curve boost.\nThe 3 'boost' parameters define a range of the light\ncurve that is boosted in brightness."); + gettext("Light curve boost center"); + gettext("Center of light curve boost range.\nWhere 0.0 is minimum light level, 1.0 is maximum light level."); + gettext("Light curve boost spread"); + gettext("Spread of light curve boost range.\nControls the width of the range to be boosted.\nStandard deviation of the light curve boost Gaussian."); + gettext("Networking"); + gettext("Prometheus listener address"); + gettext("Prometheus listener address.\nIf Minetest is compiled with ENABLE_PROMETHEUS option enabled,\nenable metrics listener for Prometheus on that address.\nMetrics can be fetched on http://127.0.0.1:30000/metrics"); + gettext("Maximum size of the out chat queue"); + gettext("Maximum size of the out chat queue.\n0 to disable queueing and -1 to make the queue size unlimited."); + gettext("Mapblock unload timeout"); + gettext("Timeout for client to remove unused map data from memory, in seconds."); + gettext("Mapblock limit"); + gettext("Maximum number of mapblocks for client to be kept in memory.\nSet to -1 for unlimited amount."); + gettext("Show debug info"); + gettext("Whether to show the client debug info (has the same effect as hitting F5)."); + gettext("Maximum simultaneous block sends per client"); + gettext("Maximum number of blocks that are simultaneously sent per client.\nThe maximum total count is calculated dynamically:\nmax_total = ceil((#clients + max_users) * per_client / 4)"); + gettext("Delay in sending blocks after building"); + gettext("To reduce lag, block transfers are slowed down when a player is building something.\nThis determines how long they are slowed down after placing or removing a node."); + gettext("Max. packets per iteration"); + gettext("Maximum number of packets sent per send step, if you have a slow connection\ntry reducing it, but don't reduce it to a number below double of targeted\nclient number."); + gettext("Map Compression Level for Network Transfer"); + gettext("Compression level to use when sending mapblocks to the client.\n-1 - use default compression level\n0 - least compression, fastest\n9 - best compression, slowest"); + gettext("Server"); + gettext("Chat message format"); + gettext("Format of player chat messages. The following strings are valid placeholders:\n@name, @message, @timestamp (optional)"); + gettext("Chat command time message threshold"); + gettext("If the execution of a chat command takes longer than this specified time in\nseconds, add the time information to the chat command message"); + gettext("Shutdown message"); + gettext("A message to be displayed to all clients when the server shuts down."); + gettext("Crash message"); + gettext("A message to be displayed to all clients when the server crashes."); + gettext("Ask to reconnect after crash"); + gettext("Whether to ask clients to reconnect after a (Lua) crash.\nSet this to true if your server is set up to restart automatically."); + gettext("Server/Env Performance"); + gettext("Dedicated server step"); + gettext("Length of a server tick and the interval at which objects are generally updated over\nnetwork, stated in seconds."); + gettext("Unlimited player transfer distance"); + gettext("Whether players are shown to clients without any range limit.\nDeprecated, use the setting player_transfer_distance instead."); + gettext("Player transfer distance"); + gettext("Defines the maximal player transfer distance in blocks (0 = unlimited)."); + gettext("Active object send range"); + gettext("From how far clients know about objects, stated in mapblocks (16 nodes).\n\nSetting this larger than active_block_range will also cause the server\nto maintain active objects up to this distance in the direction the\nplayer is looking. (This can avoid mobs suddenly disappearing from view)"); + gettext("Active block range"); + gettext("The radius of the volume of blocks around every player that is subject to the\nactive block stuff, stated in mapblocks (16 nodes).\nIn active blocks objects are loaded and ABMs run.\nThis is also the minimum range in which active objects (mobs) are maintained.\nThis should be configured together with active_object_send_range_blocks."); + gettext("Max block send distance"); + gettext("From how far blocks are sent to clients, stated in mapblocks (16 nodes)."); + gettext("Maximum forceloaded blocks"); + gettext("Maximum number of forceloaded mapblocks."); + gettext("Time send interval"); + gettext("Interval of sending time of day to clients, stated in seconds."); + gettext("Map save interval"); + gettext("Interval of saving important changes in the world, stated in seconds."); + gettext("Unload unused server data"); + gettext("How long the server will wait before unloading unused mapblocks, stated in seconds.\nHigher value is smoother, but will use more RAM."); + gettext("Maximum objects per block"); + gettext("Maximum number of statically stored objects in a block."); + gettext("Active block management interval"); + gettext("Length of time between active block management cycles, stated in seconds."); + gettext("ABM interval"); + gettext("Length of time between Active Block Modifier (ABM) execution cycles, stated in seconds."); + gettext("ABM time budget"); + gettext("The time budget allowed for ABMs to execute on each step\n(as a fraction of the ABM Interval)"); + gettext("NodeTimer interval"); + gettext("Length of time between NodeTimer execution cycles, stated in seconds."); + gettext("Liquid loop max"); + gettext("Max liquids processed per step."); + gettext("Liquid queue purge time"); + gettext("The time (in seconds) that the liquids queue may grow beyond processing\ncapacity until an attempt is made to decrease its size by dumping old queue\nitems. A value of 0 disables the functionality."); + gettext("Liquid update tick"); + gettext("Liquid update interval in seconds."); + gettext("Block send optimize distance"); + gettext("At this distance the server will aggressively optimize which blocks are sent to\nclients.\nSmall values potentially improve performance a lot, at the expense of visible\nrendering glitches (some blocks will not be rendered under water and in caves,\nas well as sometimes on land).\nSetting this to a value greater than max_block_send_distance disables this\noptimization.\nStated in mapblocks (16 nodes)."); + gettext("Server side occlusion culling"); + gettext("If enabled the server will perform map block occlusion culling based on\non the eye position of the player. This can reduce the number of blocks\nsent to the client 50-80%. The client will not longer receive most invisible\nso that the utility of noclip mode is reduced."); + gettext("Mapgen"); gettext("Chunk size"); gettext("Size of mapchunks generated by mapgen, stated in mapblocks (16 nodes).\nWARNING!: There is no benefit, and there are several dangers, in\nincreasing this value above 5.\nReducing this value increases cave and dungeon density.\nAltering this value is for special usage, leaving it unchanged is\nrecommended."); gettext("Mapgen debug"); @@ -1092,9 +940,222 @@ fake_function() { gettext("Maximum number of blocks to be queued that are to be generated.\nThis limit is enforced per player."); gettext("Number of emerge threads"); gettext("Number of emerge threads to use.\nValue 0:\n- Automatic selection. The number of emerge threads will be\n- 'number of processors - 2', with a lower limit of 1.\nAny other value:\n- Specifies the number of emerge threads, with a lower limit of 1.\nWARNING: Increasing the number of emerge threads increases engine mapgen\nspeed, but this may harm game performance by interfering with other\nprocesses, especially in singleplayer and/or when running Lua code in\n'on_generated'. For many users the optimum setting may be '1'."); - gettext("Online Content Repository"); - gettext("ContentDB URL"); - gettext("The URL for the content repository"); - gettext("ContentDB Flag Blacklist"); - gettext("Comma-separated list of flags to hide in the content repository.\n\"nonfree\" can be used to hide packages which do not qualify as 'free software',\nas defined by the Free Software Foundation.\nYou can also specify content ratings.\nThese flags are independent from Minetest versions,\nso see a full list at https://content.minetest.net/help/content_flags/"); + gettext("cURL"); + gettext("cURL interactive timeout"); + gettext("Maximum time an interactive request (e.g. server list fetch) may take, stated in milliseconds."); + gettext("cURL parallel limit"); + gettext("Limits number of parallel HTTP requests. Affects:\n- Media fetch if server uses remote_media setting.\n- Serverlist download and server announcement.\n- Downloads performed by main menu (e.g. mod manager).\nOnly has an effect if compiled with cURL."); + gettext("cURL file download timeout"); + gettext("Maximum time a file download (e.g. a mod download) may take, stated in milliseconds."); + gettext("Misc"); + gettext("DPI"); + gettext("Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k screens."); + gettext("Display Density Scaling Factor"); + gettext("Adjust the detected display density, used for scaling UI elements."); + gettext("Enable console window"); + gettext("Windows systems only: Start Minetest with the command line window in the background.\nContains the same information as the file debug.txt (default name)."); + gettext("Max. clearobjects extra blocks"); + gettext("Number of extra blocks that can be loaded by /clearobjects at once.\nThis is a trade-off between SQLite transaction overhead and\nmemory consumption (4096=100MB, as a rule of thumb)."); + gettext("Map directory"); + gettext("World directory (everything in the world is stored here).\nNot needed if starting from the main menu."); + gettext("Synchronous SQLite"); + gettext("See https://www.sqlite.org/pragma.html#pragma_synchronous"); + gettext("Map Compression Level for Disk Storage"); + gettext("Compression level to use when saving mapblocks to disk.\n-1 - use default compression level\n0 - least compression, fastest\n9 - best compression, slowest"); + gettext("Connect to external media server"); + gettext("Enable usage of remote media server (if provided by server).\nRemote servers offer a significantly faster way to download media (e.g. textures)\nwhen connecting to the server."); + gettext("Serverlist file"); + gettext("File in client/serverlist/ that contains your favorite servers displayed in the\nMultiplayer Tab."); + gettext("Gamepads"); + gettext("Enable joysticks"); + gettext("Enable joysticks. Requires a restart to take effect"); + gettext("Joystick ID"); + gettext("The identifier of the joystick to use"); + gettext("Joystick type"); + gettext("The type of joystick"); + gettext("Joystick button repetition interval"); + gettext("The time in seconds it takes between repeated events\nwhen holding down a joystick button combination."); + gettext("Joystick dead zone"); + gettext("The dead zone of the joystick"); + gettext("Joystick frustum sensitivity"); + gettext("The sensitivity of the joystick axes for moving the\nin-game view frustum around."); + gettext("Temporary Settings"); + gettext("Texture path"); + gettext("Path to texture directory. All textures are first searched from here."); + gettext("Minimap"); + gettext("Enables minimap."); + gettext("Round minimap"); + gettext("Shape of the minimap. Enabled = round, disabled = square."); + gettext("Server address"); + gettext("Address to connect to.\nLeave this blank to start a local server.\nNote that the address field in the main menu overrides this setting."); + gettext("Remote port"); + gettext("Port to connect to (UDP).\nNote that the port field in the main menu overrides this setting."); + gettext("Default game"); + gettext("Default game when creating a new world.\nThis will be overridden when creating a world from the main menu."); + gettext("Damage"); + gettext("Enable players getting damage and dying."); + gettext("Creative"); + gettext("Enable creative mode for all players"); + gettext("Player versus player"); + gettext("Whether to allow players to damage and kill each other."); + gettext("Flying"); + gettext("Player is able to fly without being affected by gravity.\nThis requires the \"fly\" privilege on the server."); + gettext("Pitch move mode"); + gettext("If enabled, makes move directions relative to the player's pitch when flying or swimming."); + gettext("Fast movement"); + gettext("Fast movement (via the \"Aux1\" key).\nThis requires the \"fast\" privilege on the server."); + gettext("Noclip"); + gettext("If enabled together with fly mode, player is able to fly through solid nodes.\nThis requires the \"noclip\" privilege on the server."); + gettext("Continuous forward"); + gettext("Continuous forward movement, toggled by autoforward key.\nPress the autoforward key again or the backwards movement to disable."); + gettext("Formspec Default Background Opacity"); + gettext("Formspec default background opacity (between 0 and 255)."); + gettext("Formspec Default Background Color"); + gettext("Formspec default background color (R,G,B)."); + gettext("Show technical names"); + gettext("Whether to show technical names.\nAffects mods and texture packs in the Content and Select Mods menus, as well as\nsetting names in All Settings.\nControlled by the checkbox in the \"All settings\" menu."); + gettext("Sound"); + gettext("Enables the sound system.\nIf disabled, this completely disables all sounds everywhere and the in-game\nsound controls will be non-functional.\nChanging this setting requires a restart."); + gettext("Forward key"); + gettext("Key for moving the player forward.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Backward key"); + gettext("Key for moving the player backward.\nWill also disable autoforward, when active.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Left key"); + gettext("Key for moving the player left.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Right key"); + gettext("Key for moving the player right.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Jump key"); + gettext("Key for jumping.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Sneak key"); + gettext("Key for sneaking.\nAlso used for climbing down and descending in water if aux1_descends is disabled.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Dig key"); + gettext("Key for digging.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Place key"); + gettext("Key for placing.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Inventory key"); + gettext("Key for opening the inventory.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Aux1 key"); + gettext("Key for moving fast in fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Chat key"); + gettext("Key for opening the chat window.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Command key"); + gettext("Key for opening the chat window to type commands.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Command key"); + gettext("Key for opening the chat window to type local commands.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Range select key"); + gettext("Key for toggling unlimited view range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Fly key"); + gettext("Key for toggling flying.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Pitch move key"); + gettext("Key for toggling pitch move mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Fast key"); + gettext("Key for toggling fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Noclip key"); + gettext("Key for toggling noclip mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar next key"); + gettext("Key for selecting the next item in the hotbar.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar previous key"); + gettext("Key for selecting the previous item in the hotbar.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Mute key"); + gettext("Key for muting the game.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Inc. volume key"); + gettext("Key for increasing the volume.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Dec. volume key"); + gettext("Key for decreasing the volume.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Automatic forward key"); + gettext("Key for toggling autoforward.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Cinematic mode key"); + gettext("Key for toggling cinematic mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Minimap key"); + gettext("Key for toggling display of minimap.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Screenshot"); + gettext("Key for taking screenshots.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Drop item key"); + gettext("Key for dropping the currently selected item.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("View zoom key"); + gettext("Key to use view zoom when possible.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 1 key"); + gettext("Key for selecting the first hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 2 key"); + gettext("Key for selecting the second hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 3 key"); + gettext("Key for selecting the third hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 4 key"); + gettext("Key for selecting the fourth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 5 key"); + gettext("Key for selecting the fifth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 6 key"); + gettext("Key for selecting the sixth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 7 key"); + gettext("Key for selecting the seventh hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 8 key"); + gettext("Key for selecting the eighth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 9 key"); + gettext("Key for selecting the ninth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 10 key"); + gettext("Key for selecting the tenth hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 11 key"); + gettext("Key for selecting the 11th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 12 key"); + gettext("Key for selecting the 12th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 13 key"); + gettext("Key for selecting the 13th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 14 key"); + gettext("Key for selecting the 14th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 15 key"); + gettext("Key for selecting the 15th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 16 key"); + gettext("Key for selecting the 16th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 17 key"); + gettext("Key for selecting the 17th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 18 key"); + gettext("Key for selecting the 18th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 19 key"); + gettext("Key for selecting the 19th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 20 key"); + gettext("Key for selecting the 20th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 21 key"); + gettext("Key for selecting the 21st hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 22 key"); + gettext("Key for selecting the 22nd hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 23 key"); + gettext("Key for selecting the 23rd hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 24 key"); + gettext("Key for selecting the 24th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 25 key"); + gettext("Key for selecting the 25th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 26 key"); + gettext("Key for selecting the 26th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 27 key"); + gettext("Key for selecting the 27th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 28 key"); + gettext("Key for selecting the 28th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 29 key"); + gettext("Key for selecting the 29th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 30 key"); + gettext("Key for selecting the 30th hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 31 key"); + gettext("Key for selecting the 31st hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Hotbar slot 32 key"); + gettext("Key for selecting the 32nd hotbar slot.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("HUD toggle key"); + gettext("Key for toggling the display of the HUD.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Chat toggle key"); + gettext("Key for toggling the display of chat.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Large chat console key"); + gettext("Key for toggling the display of the large chat console.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Fog toggle key"); + gettext("Key for toggling the display of fog.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Camera update toggle key"); + gettext("Key for toggling the camera update. Only used for development\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Debug info toggle key"); + gettext("Key for toggling the display of debug info.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Profiler toggle key"); + gettext("Key for toggling the display of the profiler. Used for development.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("Toggle camera mode key"); + gettext("Key for switching between first- and third-person camera.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("View range increase key"); + gettext("Key for increasing the viewing range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); + gettext("View range decrease key"); + gettext("Key for decreasing the viewing range.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3"); } diff --git a/src/skyparams.h b/src/skyparams.h index 1de494d69..07068634b 100644 --- a/src/skyparams.h +++ b/src/skyparams.h @@ -66,13 +66,39 @@ struct StarParams u32 count; video::SColor starcolor; f32 scale; + f32 day_opacity; +}; + +struct CloudParams +{ + float density; + video::SColor color_bright; + video::SColor color_ambient; + float thickness; + float height; + v2f speed; }; // Utility class for setting default sky, sun, moon, stars values: class SkyboxDefaults { public: - const SkyColor getSkyColorDefaults() + SkyboxDefaults() = delete; + + static const SkyboxParams getSkyDefaults() + { + SkyboxParams sky; + sky.bgcolor = video::SColor(255, 255, 255, 255); + sky.type = "regular"; + sky.clouds = true; + sky.sky_color = getSkyColorDefaults(); + sky.fog_sun_tint = video::SColor(255, 244, 125, 29); + sky.fog_moon_tint = video::SColorf(0.5, 0.6, 0.8, 1).toSColor(); + sky.fog_tint_type = "default"; + return sky; + } + + static const SkyColor getSkyColorDefaults() { SkyColor sky; // Horizon colors @@ -87,7 +113,7 @@ public: return sky; } - const SunParams getSunDefaults() + static const SunParams getSunDefaults() { SunParams sun; sun.visible = true; @@ -99,7 +125,7 @@ public: return sun; } - const MoonParams getMoonDefaults() + static const MoonParams getMoonDefaults() { MoonParams moon; moon.visible = true; @@ -109,13 +135,26 @@ public: return moon; } - const StarParams getStarDefaults() + static const StarParams getStarDefaults() { StarParams stars; stars.visible = true; stars.count = 1000; stars.starcolor = video::SColor(105, 235, 235, 255); stars.scale = 1; + stars.day_opacity = 0; return stars; } + + static const CloudParams getCloudDefaults() + { + CloudParams clouds; + clouds.density = 0.4f; + clouds.color_bright = video::SColor(229, 240, 240, 255); + clouds.color_ambient = video::SColor(255, 0, 0, 0); + clouds.thickness = 16.0f; + clouds.height = 120; + clouds.speed = v2f(0.0f, -2.0f); + return clouds; + } }; diff --git a/src/sound.h b/src/sound.h index 6cbd55e8f..801c552a9 100644 --- a/src/sound.h +++ b/src/sound.h @@ -24,32 +24,30 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" #include "irrlichttypes_bloated.h" +// This class describes the basic sound information for playback. +// Positional handling is done separately. + struct SimpleSoundSpec { SimpleSoundSpec(const std::string &name = "", float gain = 1.0f, - float fade = 0.0f, float pitch = 1.0f) : - name(name), - gain(gain), fade(fade), pitch(pitch) + bool loop = false, float fade = 0.0f, float pitch = 1.0f) : + name(name), gain(gain), fade(fade), pitch(pitch), loop(loop) { } bool exists() const { return !name.empty(); } - // Take cf_version from ContentFeatures::serialize to - // keep in sync with item definitions - void serialize(std::ostream &os, u8 cf_version) const + void serialize(std::ostream &os, u16 protocol_version) const { - os << serializeString(name); + os << serializeString16(name); writeF32(os, gain); writeF32(os, pitch); writeF32(os, fade); - // if (cf_version < ?) - // return; } - void deSerialize(std::istream &is, u8 cf_version) + void deSerialize(std::istream &is, u16 protocol_version) { - name = deSerializeString(is); + name = deSerializeString16(is); gain = readF32(is); pitch = readF32(is); fade = readF32(is); @@ -59,4 +57,13 @@ struct SimpleSoundSpec float gain = 1.0f; float fade = 0.0f; float pitch = 1.0f; + bool loop = false; +}; + + +// The order must not be changed. This is sent over the network. +enum class SoundLocation : u8 { + Local, + Position, + Object }; diff --git a/src/staticobject.cpp b/src/staticobject.cpp index 5ccb7baf5..f92995d0b 100644 --- a/src/staticobject.cpp +++ b/src/staticobject.cpp @@ -28,15 +28,16 @@ StaticObject::StaticObject(const ServerActiveObject *s_obj, const v3f &pos_): s_obj->getStaticData(&data); } -void StaticObject::serialize(std::ostream &os) +void StaticObject::serialize(std::ostream &os) const { // type writeU8(os, type); // pos - writeV3F1000(os, pos); + writeV3F1000(os, clampToF1000(pos)); // data - os<<serializeString(data); + os<<serializeString16(data); } + void StaticObject::deSerialize(std::istream &is, u8 version) { // type @@ -44,11 +45,34 @@ void StaticObject::deSerialize(std::istream &is, u8 version) // pos pos = readV3F1000(is); // data - data = deSerializeString(is); + data = deSerializeString16(is); } void StaticObjectList::serialize(std::ostream &os) { + // Check for problems first + auto problematic = [] (StaticObject &obj) -> bool { + if (obj.data.size() > U16_MAX) { + errorstream << "StaticObjectList::serialize(): " + "object has excessive static data (" << obj.data.size() << + "), deleting it." << std::endl; + return true; + } + return false; + }; + for (auto it = m_stored.begin(); it != m_stored.end(); ) { + if (problematic(*it)) + it = m_stored.erase(it); + else + it++; + } + for (auto it = m_active.begin(); it != m_active.end(); ) { + if (problematic(it->second)) + it = m_active.erase(it); + else + it++; + } + // version u8 version = 0; writeU8(os, version); diff --git a/src/staticobject.h b/src/staticobject.h index 6fb486193..03cd23cc8 100644 --- a/src/staticobject.h +++ b/src/staticobject.h @@ -37,7 +37,7 @@ struct StaticObject StaticObject() = default; StaticObject(const ServerActiveObject *s_obj, const v3f &pos_); - void serialize(std::ostream &os); + void serialize(std::ostream &os) const; void deSerialize(std::istream &is, u8 version); }; diff --git a/src/terminal_chat_console.cpp b/src/terminal_chat_console.cpp index 9e3d33736..b12261c3b 100644 --- a/src/terminal_chat_console.cpp +++ b/src/terminal_chat_console.cpp @@ -17,6 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include <inttypes.h> #include "config.h" #if USE_CURSES #include "version.h" @@ -398,7 +399,7 @@ void TerminalChatConsole::step(int ch) minutes = (float)minutes / 1000 * 60; if (m_game_time) - printw(" | Game %d Time of day %02d:%02d ", + printw(" | Game %" PRIu64 " Time of day %02d:%02d ", m_game_time, hours, minutes); // draw text diff --git a/src/texture_override.cpp b/src/texture_override.cpp index effdb0efd..81c986ccf 100644 --- a/src/texture_override.cpp +++ b/src/texture_override.cpp @@ -26,6 +26,26 @@ with this program; if not, write to the Free Software Foundation, Inc., #define override_cast static_cast<override_t> +static const std::map<std::string, OverrideTarget> override_LUT = { + { "top", OverrideTarget::TOP }, + { "bottom", OverrideTarget::BOTTOM }, + { "left", OverrideTarget::LEFT }, + { "right", OverrideTarget::RIGHT }, + { "front", OverrideTarget::FRONT }, + { "back", OverrideTarget::BACK }, + { "inventory", OverrideTarget::INVENTORY }, + { "wield", OverrideTarget::WIELD }, + { "special1", OverrideTarget::SPECIAL_1 }, + { "special2", OverrideTarget::SPECIAL_2 }, + { "special3", OverrideTarget::SPECIAL_3 }, + { "special4", OverrideTarget::SPECIAL_4 }, + { "special5", OverrideTarget::SPECIAL_5 }, + { "special6", OverrideTarget::SPECIAL_6 }, + { "sides", OverrideTarget::SIDES }, + { "all", OverrideTarget::ALL_FACES }, + { "*", OverrideTarget::ALL_FACES } +}; + TextureOverrideSource::TextureOverrideSource(std::string filepath) { std::ifstream infile(filepath.c_str()); @@ -41,8 +61,9 @@ TextureOverrideSource::TextureOverrideSource(std::string filepath) if (line.empty() || line[0] == '#') continue; + // Format: mod_name:item_name target1[,...] texture_name.png std::vector<std::string> splitted = str_split(line, ' '); - if (splitted.size() != 3) { + if (splitted.size() < 3) { warningstream << filepath << ":" << line_index << " Syntax error in texture override \"" << line << "\": Expected 3 arguments, got " << splitted.size() @@ -57,45 +78,31 @@ TextureOverrideSource::TextureOverrideSource(std::string filepath) // Parse the target mask std::vector<std::string> targets = str_split(splitted[1], ','); for (const std::string &target : targets) { - if (target == "top") - texture_override.target |= override_cast(OverrideTarget::TOP); - else if (target == "bottom") - texture_override.target |= override_cast(OverrideTarget::BOTTOM); - else if (target == "left") - texture_override.target |= override_cast(OverrideTarget::LEFT); - else if (target == "right") - texture_override.target |= override_cast(OverrideTarget::RIGHT); - else if (target == "front") - texture_override.target |= override_cast(OverrideTarget::FRONT); - else if (target == "back") - texture_override.target |= override_cast(OverrideTarget::BACK); - else if (target == "inventory") - texture_override.target |= override_cast(OverrideTarget::INVENTORY); - else if (target == "wield") - texture_override.target |= override_cast(OverrideTarget::WIELD); - else if (target == "special1") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_1); - else if (target == "special2") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_2); - else if (target == "special3") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_3); - else if (target == "special4") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_4); - else if (target == "special5") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_5); - else if (target == "special6") - texture_override.target |= override_cast(OverrideTarget::SPECIAL_6); - else if (target == "sides") - texture_override.target |= override_cast(OverrideTarget::SIDES); - else if (target == "all" || target == "*") - texture_override.target |= override_cast(OverrideTarget::ALL_FACES); - else { - // Report invalid target - warningstream << filepath << ":" << line_index - << " Syntax error in texture override \"" << line - << "\": Unknown target \"" << target << "\"" - << std::endl; + std::vector<std::string> kvpair = str_split(target, '='); + if (kvpair.size() == 2) { + // Key-value pairs + if (kvpair[0] == "align_world") { + // Global textures + texture_override.world_scale = stoi(kvpair[1], 0, U8_MAX); + continue; + } } + if (kvpair.size() == 1) { + // Regular override flags + auto pair = override_LUT.find(target); + + if (pair != override_LUT.end()) { + texture_override.target |= override_cast(pair->second); + continue; + } + } + + // Report invalid target + warningstream << filepath << ":" << line_index + << " Syntax error in texture override \"" << line + << "\": Unknown target \"" << target << "\"" + << std::endl; + } // If there are no valid targets, skip adding this override diff --git a/src/texture_override.h b/src/texture_override.h index bdc95e732..4c09fa540 100644 --- a/src/texture_override.h +++ b/src/texture_override.h @@ -57,7 +57,8 @@ struct TextureOverride { std::string id; std::string texture; - override_t target; + override_t target = 0; + u8 world_scale = 0; // Helper function for checking if an OverrideTarget is found in // a TextureOverride without casting diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index 5cfc60995..ef025ac1d 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -121,12 +121,12 @@ bool Thread::start() return false; } - // Allow spawned thread to continue - m_start_finished_mutex.unlock(); - while (!m_running) sleep_ms(1); + // Allow spawned thread to continue + m_start_finished_mutex.unlock(); + m_joinable = true; return true; diff --git a/src/tileanimation.cpp b/src/tileanimation.cpp index 930fd9473..a79a36e57 100644 --- a/src/tileanimation.cpp +++ b/src/tileanimation.cpp @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "tileanimation.h" #include "util/serialize.h" -void TileAnimationParams::serialize(std::ostream &os, u8 tiledef_version) const +void TileAnimationParams::serialize(std::ostream &os, u16 protocol_version) const { writeU8(os, type); if (type == TAT_VERTICAL_FRAMES) { @@ -33,7 +33,7 @@ void TileAnimationParams::serialize(std::ostream &os, u8 tiledef_version) const } } -void TileAnimationParams::deSerialize(std::istream &is, u8 tiledef_version) +void TileAnimationParams::deSerialize(std::istream &is, u16 protocol_version) { type = (TileAnimationType) readU8(is); diff --git a/src/tileanimation.h b/src/tileanimation.h index 7e3285ed7..0449de0b8 100644 --- a/src/tileanimation.h +++ b/src/tileanimation.h @@ -50,8 +50,8 @@ struct TileAnimationParams } sheet_2d; }; - void serialize(std::ostream &os, u8 tiledef_version) const; - void deSerialize(std::istream &is, u8 tiledef_version); + void serialize(std::ostream &os, u16 protocol_version) const; + void deSerialize(std::istream &is, u16 protocol_version); void determineParams(v2u32 texture_size, int *frame_count, int *frame_length_ms, v2u32 *frame_size) const; void getTextureModifer(std::ostream &os, v2u32 texture_size, int frame) const; diff --git a/src/tool.cpp b/src/tool.cpp index 22e41d28e..821ddf07d 100644 --- a/src/tool.cpp +++ b/src/tool.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "inventory.h" #include "exceptions.h" +#include "convert_json.h" #include "util/serialize.h" #include "util/numeric.h" @@ -66,7 +67,7 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const for (const auto &groupcap : groupcaps) { const std::string *name = &groupcap.first; const ToolGroupCap *cap = &groupcap.second; - os << serializeString(*name); + os << serializeString16(*name); writeS16(os, cap->uses); writeS16(os, cap->maxlevel); writeU32(os, cap->times.size()); @@ -79,7 +80,7 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const writeU32(os, damageGroups.size()); for (const auto &damageGroup : damageGroups) { - os << serializeString(damageGroup.first); + os << serializeString16(damageGroup.first); writeS16(os, damageGroup.second); } @@ -98,7 +99,7 @@ void ToolCapabilities::deSerialize(std::istream &is) groupcaps.clear(); u32 groupcaps_size = readU32(is); for (u32 i = 0; i < groupcaps_size; i++) { - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); ToolGroupCap cap; cap.uses = readS16(is); cap.maxlevel = readS16(is); @@ -113,7 +114,7 @@ void ToolCapabilities::deSerialize(std::istream &is) u32 damage_groups_size = readU32(is); for (u32 i = 0; i < damage_groups_size; i++) { - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); s16 rating = readS16(is); damageGroups[name] = rating; } @@ -142,7 +143,7 @@ void ToolCapabilities::serializeJson(std::ostream &os) const } root["damage_groups"] = damage_groups_object; - os << root; + fastWriteJson(root, os); } void ToolCapabilities::deserializeJson(std::istream &is) @@ -182,9 +183,74 @@ void ToolCapabilities::deserializeJson(std::istream &is) } } -DigParams getDigParams(const ItemGroupList &groups, - const ToolCapabilities *tp) +u32 calculateResultWear(const u32 uses, const u16 initial_wear) { + if (uses == 0) { + // Trivial case: Infinite uses + return 0; + } + /* Finite uses. This is not trivial, + as the maximum wear is not neatly evenly divisible by + most possible uses numbers. For example, for 128 + uses, the calculation of wear is trivial, as + 65536 / 128 uses = 512 wear, + so the tool will get 512 wear 128 times in its lifetime. + But for a number like 130, this does not work: + 65536 / 130 uses = 504.123... wear. + Since wear must be an integer, we will get + 504*130 = 65520, which would lead to the wrong number + of uses. + + Instead, we partition the "wear range" into blocks: + A block represents a single use and can be + of two possible sizes: normal and oversized. + A normal block is equal to floor(65536 / uses). + An oversized block is a normal block plus 1. + Then we determine how many oversized and normal + blocks we need and finally, whether we add + the normal wear or the oversized wear. + + Example for 130 uses: + * Normal wear = 504 + * Number of normal blocks = 114 + * Oversized wear = 505 + * Number of oversized blocks = 16 + + If we add everything together, we get: + 114*504 + 16*505 = 65536 + */ + u32 result_wear; + u32 wear_normal = ((U16_MAX+1) / uses); + // Will be non-zero if its not evenly divisible + u16 blocks_oversize = (U16_MAX+1) % uses; + // Whether to add one extra wear point in case + // of oversized wear. + u16 wear_extra = 0; + if (blocks_oversize > 0) { + u16 blocks_normal = uses - blocks_oversize; + /* When the wear has reached this value, we + know that wear_normal has been applied + for blocks_normal times, therefore, + only oversized blocks remain. + This also implies the raw tool wear number + increases a bit faster after this point, + but this should be barely noticable by the + player. + */ + u16 wear_extra_at = blocks_normal * wear_normal; + if (initial_wear >= wear_extra_at) { + wear_extra = 1; + } + } + result_wear = wear_normal + wear_extra; + return result_wear; +} + +DigParams getDigParams(const ItemGroupList &groups, + const ToolCapabilities *tp, + const u16 initial_wear) +{ + // Group dig_immediate defaults to fixed time and no wear if (tp->groupcaps.find("dig_immediate") == tp->groupcaps.cend()) { switch (itemgroup_get(groups, "dig_immediate")) { @@ -200,7 +266,7 @@ DigParams getDigParams(const ItemGroupList &groups, // Values to be returned (with a bit of conversion) bool result_diggable = false; float result_time = 0.0; - float result_wear = 0.0; + u32 result_wear = 0; std::string result_main_group; int level = itemgroup_get(groups, "level"); @@ -223,22 +289,24 @@ DigParams getDigParams(const ItemGroupList &groups, if (!result_diggable || time < result_time) { result_time = time; result_diggable = true; - if (cap.uses != 0) - result_wear = 1.0 / cap.uses / pow(3.0, leveldiff); - else - result_wear = 0; + // The actual number of uses increases + // exponentially with leveldiff. + // If the levels are equal, real_uses equals cap.uses. + u32 real_uses = cap.uses * pow(3.0, leveldiff); + real_uses = MYMIN(real_uses, U16_MAX); + result_wear = calculateResultWear(real_uses, initial_wear); result_main_group = groupname; } } - u16 wear_i = U16_MAX * result_wear; - return DigParams(result_diggable, result_time, wear_i, result_main_group); + return DigParams(result_diggable, result_time, result_wear, result_main_group); } HitParams getHitParams(const ItemGroupList &armor_groups, - const ToolCapabilities *tp, float time_from_last_punch) + const ToolCapabilities *tp, float time_from_last_punch, + u16 initial_wear) { - s16 damage = 0; + s32 damage = 0; float result_wear = 0.0f; float punch_interval_multiplier = rangelim(time_from_last_punch / tp->full_punch_interval, 0.0f, 1.0f); @@ -248,10 +316,14 @@ HitParams getHitParams(const ItemGroupList &armor_groups, damage += damageGroup.second * punch_interval_multiplier * armor / 100.0; } - if (tp->punch_attack_uses > 0) - result_wear = 1.0f / tp->punch_attack_uses * punch_interval_multiplier; + if (tp->punch_attack_uses > 0) { + result_wear = calculateResultWear(tp->punch_attack_uses, initial_wear); + result_wear *= punch_interval_multiplier; + } + // Keep damage in sane bounds for simplicity + damage = rangelim(damage, -U16_MAX, U16_MAX); - u16 wear_i = U16_MAX * result_wear; + u32 wear_i = (u32) result_wear; return {damage, wear_i}; } @@ -265,7 +337,8 @@ PunchDamageResult getPunchDamage( const ItemGroupList &armor_groups, const ToolCapabilities *toolcap, const ItemStack *punchitem, - float time_from_last_punch + float time_from_last_punch, + u16 initial_wear ){ bool do_hit = true; { @@ -285,7 +358,8 @@ PunchDamageResult getPunchDamage( if(do_hit) { HitParams hitparams = getHitParams(armor_groups, toolcap, - time_from_last_punch); + time_from_last_punch, + punchitem->wear); result.did_punch = true; result.wear = hitparams.wear; result.damage = hitparams.hp; diff --git a/src/tool.h b/src/tool.h index 59dd501f5..c2444a834 100644 --- a/src/tool.h +++ b/src/tool.h @@ -88,10 +88,10 @@ struct DigParams // Digging time in seconds float time; // Caused wear - u16 wear; + u32 wear; // u32 because wear could be 65536 (single-use tool) std::string main_group; - DigParams(bool a_diggable = false, float a_time = 0.0f, u16 a_wear = 0, + DigParams(bool a_diggable = false, float a_time = 0.0f, u32 a_wear = 0, const std::string &a_main_group = ""): diggable(a_diggable), time(a_time), @@ -101,21 +101,24 @@ struct DigParams }; DigParams getDigParams(const ItemGroupList &groups, - const ToolCapabilities *tp); + const ToolCapabilities *tp, + const u16 initial_wear = 0); struct HitParams { - s16 hp; - u16 wear; + s32 hp; + // Caused wear + u32 wear; // u32 because wear could be 65536 (single-use weapon) - HitParams(s16 hp_ = 0, u16 wear_ = 0): + HitParams(s32 hp_ = 0, u32 wear_ = 0): hp(hp_), wear(wear_) {} }; HitParams getHitParams(const ItemGroupList &armor_groups, - const ToolCapabilities *tp, float time_from_last_punch); + const ToolCapabilities *tp, float time_from_last_punch, + u16 initial_wear = 0); HitParams getHitParams(const ItemGroupList &armor_groups, const ToolCapabilities *tp); @@ -135,7 +138,9 @@ PunchDamageResult getPunchDamage( const ItemGroupList &armor_groups, const ToolCapabilities *toolcap, const ItemStack *punchitem, - float time_from_last_punch + float time_from_last_punch, + u16 initial_wear = 0 ); +u32 calculateResultWear(const u32 uses, const u16 initial_wear); f32 getToolRange(const ItemDefinition &def_selected, const ItemDefinition &def_hand); diff --git a/src/translation.cpp b/src/translation.cpp index 82e813a5d..eabd0ec0a 100644 --- a/src/translation.cpp +++ b/src/translation.cpp @@ -1,6 +1,6 @@ /* Minetest -Copyright (C) 2017 Nore, Nathanaël Courant <nore@mesecons.net> +Copyright (C) 2017 Nore, Nathanaëlle Courant <nore@mesecons.net> 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 @@ -64,7 +64,13 @@ void Translations::loadTranslation(const std::string &data) line.resize(line.length() - 1); if (str_starts_with(line, "# textdomain:")) { - textdomain = utf8_to_wide(trim(str_split(line, ':')[1])); + auto parts = str_split(line, ':'); + if (parts.size() < 2) { + errorstream << "Invalid textdomain translation line \"" << line + << "\"" << std::endl; + continue; + } + textdomain = utf8_to_wide(trim(parts[1])); } if (line.empty() || line[0] == '#') continue; @@ -144,14 +150,13 @@ void Translations::loadTranslation(const std::string &data) } std::wstring oword1 = word1.str(), oword2 = word2.str(); - if (oword2.empty()) { - oword2 = oword1; - errorstream << "Ignoring empty translation for \"" - << wide_to_utf8(oword1) << "\"" << std::endl; + if (!oword2.empty()) { + std::wstring translation_index = textdomain + L"|"; + translation_index.append(oword1); + m_translations[translation_index] = oword2; + } else { + infostream << "Ignoring empty translation for \"" + << wide_to_utf8(oword1) << "\"" << std::endl; } - - std::wstring translation_index = textdomain + L"|"; - translation_index.append(oword1); - m_translations[translation_index] = oword2; } } diff --git a/src/translation.h b/src/translation.h index f1a336fca..e3f5b21ea 100644 --- a/src/translation.h +++ b/src/translation.h @@ -1,6 +1,6 @@ /* Minetest -Copyright (C) 2017 Nore, Nathanaël Courant <nore@mesecons.net> +Copyright (C) 2017 Nore, Nathanaëlle Courant <nore@mesecons.net> 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 diff --git a/src/unittest/CMakeLists.txt b/src/unittest/CMakeLists.txt index 5703b8906..84f769e87 100644 --- a/src/unittest/CMakeLists.txt +++ b/src/unittest/CMakeLists.txt @@ -11,14 +11,16 @@ set (UNITTEST_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/test_filepath.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_inventory.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_irrptr.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test_lua.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test_map.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_map_settings_manager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_mapnode.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_modchannels.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test_modmetadatadatabase.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_nodedef.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_noderesolver.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_noise.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_objdef.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test_player.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_profiler.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_random.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_schematic.cpp @@ -33,6 +35,7 @@ set (UNITTEST_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/test_voxelarea.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_voxelalgorithms.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_voxelmanipulator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test_gettext.cpp PARENT_SCOPE) set (UNITTEST_CLIENT_SRCS @@ -44,6 +47,7 @@ set (UNITTEST_CLIENT_SRCS set (TEST_WORLDDIR ${CMAKE_CURRENT_SOURCE_DIR}/test_world) set (TEST_SUBGAME_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../games/devtest) +set (TEST_MOD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/test_mod) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/test_config.h.in" diff --git a/src/unittest/test.cpp b/src/unittest/test.cpp index a783ccd32..af30c209d 100644 --- a/src/unittest/test.cpp +++ b/src/unittest/test.cpp @@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "modchannels.h" #include "content/mods.h" +#include "database/database-dummy.h" #include "util/numeric.h" #include "porting.h" @@ -55,6 +56,7 @@ public: scene::ISceneManager *getSceneManager() { return m_scenemgr; } IRollbackManager *getRollbackManager() { return m_rollbackmgr; } EmergeManager *getEmergeManager() { return m_emergemgr; } + ModMetadataDatabase *getModStorageDatabase() { return m_mod_storage_database; } scene::IAnimatedMesh *getMesh(const std::string &filename) { return NULL; } bool checkLocalPrivilege(const std::string &priv) { return false; } @@ -68,7 +70,6 @@ public: return testmodspec; } virtual const ModSpec* getModSpec(const std::string &modname) const { return NULL; } - virtual std::string getModStoragePath() const { return "."; } virtual bool registerModStorage(ModMetadata *meta) { return true; } virtual void unregisterModStorage(const std::string &name) {} bool joinModChannel(const std::string &channel); @@ -89,11 +90,13 @@ private: scene::ISceneManager *m_scenemgr = nullptr; IRollbackManager *m_rollbackmgr = nullptr; EmergeManager *m_emergemgr = nullptr; + ModMetadataDatabase *m_mod_storage_database = nullptr; std::unique_ptr<ModChannelMgr> m_modchannel_mgr; }; TestGameDef::TestGameDef() : + m_mod_storage_database(new Database_Dummy()), m_modchannel_mgr(new ModChannelMgr()) { m_itemdef = createItemDefManager(); @@ -107,6 +110,7 @@ TestGameDef::~TestGameDef() { delete m_itemdef; delete m_nodedef; + delete m_mod_storage_database; } @@ -180,7 +184,7 @@ void TestGameDef::defineSomeNodes() "{default_water.png"; f = ContentFeatures(); f.name = itemdef.name; - f.alpha = 128; + f.alpha = ALPHAMODE_BLEND; f.liquid_type = LIQUID_SOURCE; f.liquid_viscosity = 4; f.is_ground_content = true; @@ -201,7 +205,7 @@ void TestGameDef::defineSomeNodes() "{default_lava.png"; f = ContentFeatures(); f.name = itemdef.name; - f.alpha = 128; + f.alpha = ALPHAMODE_OPAQUE; f.liquid_type = LIQUID_SOURCE; f.liquid_viscosity = 7; f.light_source = LIGHT_MAX-1; @@ -356,7 +360,7 @@ struct TestMapBlock: public TestBase MapNode node; bool position_valid; - core::list<v3s16> validity_exceptions; + std::list<v3s16> validity_exceptions; TC() { @@ -367,7 +371,7 @@ struct TestMapBlock: public TestBase { //return position_valid ^ (p==position_valid_exception); bool exception = false; - for(core::list<v3s16>::Iterator i=validity_exceptions.begin(); + for(std::list<v3s16>::iterator i=validity_exceptions.begin(); i != validity_exceptions.end(); i++) { if(p == *i) @@ -529,7 +533,7 @@ struct TestMapBlock: public TestBase parent.node.setContent(CONTENT_AIR); parent.node.setLight(LIGHTBANK_DAY, LIGHT_SUN); parent.node.setLight(LIGHTBANK_NIGHT, 0); - core::map<v3s16, bool> light_sources; + std::map<v3s16, bool> light_sources; // The bottom block is invalid, because we have a shadowing node UASSERT(b.propagateSunlight(light_sources) == false); UASSERT(b.getNode(v3s16(1,4,0)).getLight(LIGHTBANK_DAY) == LIGHT_SUN); @@ -556,7 +560,7 @@ struct TestMapBlock: public TestBase parent.position_valid = true; b.setIsUnderground(true); parent.node.setLight(LIGHTBANK_DAY, LIGHT_MAX/2); - core::map<v3s16, bool> light_sources; + std::map<v3s16, bool> light_sources; // The block below should be valid because there shouldn't be // sunlight in there either UASSERT(b.propagateSunlight(light_sources, true) == true); @@ -597,7 +601,7 @@ struct TestMapBlock: public TestBase } // Lighting value for the valid nodes parent.node.setLight(LIGHTBANK_DAY, LIGHT_MAX/2); - core::map<v3s16, bool> light_sources; + std::map<v3s16, bool> light_sources; // Bottom block is not valid UASSERT(b.propagateSunlight(light_sources) == false); } diff --git a/src/unittest/test.h b/src/unittest/test.h index 1102f6d33..79ea09471 100644 --- a/src/unittest/test.h +++ b/src/unittest/test.h @@ -80,7 +80,7 @@ class TestFailedException : public std::exception { << #expected << std::endl \ << " at " << fs::GetFilenameFromPath(__FILE__) << ":" \ << __LINE__ << std::endl \ - << " actual: " << a << std::endl << " expected: " \ + << " actual : " << a << std::endl << " expected: " \ << e << std::endl; \ throw TestFailedException(); \ } \ diff --git a/src/unittest/test_address.cpp b/src/unittest/test_address.cpp index 35d4effb6..f46135577 100644 --- a/src/unittest/test_address.cpp +++ b/src/unittest/test_address.cpp @@ -56,7 +56,7 @@ void TestAddress::testIsLocalhost() UASSERT(!Address(172, 45, 37, 68, 0).isLocalhost()); // v6 - std::unique_ptr<IPv6AddressBytes> ipv6Bytes(new IPv6AddressBytes()); + auto ipv6Bytes = std::make_unique<IPv6AddressBytes>(); std::vector<u8> ipv6RawAddr = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; memcpy(ipv6Bytes->bytes, &ipv6RawAddr[0], 16); UASSERT(Address(ipv6Bytes.get(), 0).isLocalhost()) diff --git a/src/unittest/test_areastore.cpp b/src/unittest/test_areastore.cpp index 691cd69d2..2af3ca90c 100644 --- a/src/unittest/test_areastore.cpp +++ b/src/unittest/test_areastore.cpp @@ -135,7 +135,7 @@ void TestAreaStore::testSerialization() b.data = "Area BB"; store.insertArea(&b); - std::ostringstream os; + std::ostringstream os(std::ios_base::binary); store.serialize(os); std::string str = os.str(); @@ -157,7 +157,7 @@ void TestAreaStore::testSerialization() UASSERTEQ(const std::string &, str, str_wanted); - std::istringstream is(str); + std::istringstream is(str, std::ios_base::binary); store.deserialize(is); // deserialize() doesn't clear the store diff --git a/src/unittest/test_clientactiveobjectmgr.cpp b/src/unittest/test_clientactiveobjectmgr.cpp index 4d2846c8d..2d508cf32 100644 --- a/src/unittest/test_clientactiveobjectmgr.cpp +++ b/src/unittest/test_clientactiveobjectmgr.cpp @@ -29,6 +29,7 @@ public: TestClientActiveObject() : ClientActiveObject(0, nullptr, nullptr) {} ~TestClientActiveObject() = default; ActiveObjectType getType() const { return ACTIVEOBJECT_TYPE_TEST; } + virtual void addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr) {} }; class TestClientActiveObjectMgr : public TestBase diff --git a/src/unittest/test_compression.cpp b/src/unittest/test_compression.cpp index dfcadd4b2..a96282f58 100644 --- a/src/unittest/test_compression.cpp +++ b/src/unittest/test_compression.cpp @@ -37,6 +37,7 @@ public: void testRLECompression(); void testZlibCompression(); void testZlibLargeData(); + void testZstdLargeData(); void testZlibLimit(); void _testZlibLimit(u32 size, u32 limit); }; @@ -48,6 +49,7 @@ void TestCompression::runTests(IGameDef *gamedef) TEST(testRLECompression); TEST(testZlibCompression); TEST(testZlibLargeData); + TEST(testZstdLargeData); TEST(testZlibLimit); } @@ -111,7 +113,7 @@ void TestCompression::testZlibCompression() fromdata[3]=1; std::ostringstream os(std::ios_base::binary); - compress(fromdata, os, SER_FMT_VER_HIGHEST_READ); + compressZlib(*fromdata, fromdata.getSize(), os); std::string str_out = os.str(); @@ -124,7 +126,7 @@ void TestCompression::testZlibCompression() std::istringstream is(str_out, std::ios_base::binary); std::ostringstream os2(std::ios_base::binary); - decompress(is, os2, SER_FMT_VER_HIGHEST_READ); + decompressZlib(is, os2); std::string str_out2 = os2.str(); infostream << "decompress: "; @@ -174,6 +176,42 @@ void TestCompression::testZlibLargeData() } } +void TestCompression::testZstdLargeData() +{ + infostream << "Test: Testing zstd wrappers with a large amount " + "of pseudorandom data" << std::endl; + + u32 size = 500000; + infostream << "Test: Input size of large compressZstd is " + << size << std::endl; + + std::string data_in; + data_in.resize(size); + PseudoRandom pseudorandom(9420); + for (u32 i = 0; i < size; i++) + data_in[i] = pseudorandom.range(0, 255); + + std::ostringstream os_compressed(std::ios::binary); + compressZstd(data_in, os_compressed, 0); + infostream << "Test: Output size of large compressZstd is " + << os_compressed.str().size()<<std::endl; + + std::istringstream is_compressed(os_compressed.str(), std::ios::binary); + std::ostringstream os_decompressed(std::ios::binary); + decompressZstd(is_compressed, os_decompressed); + infostream << "Test: Output size of large decompressZstd is " + << os_decompressed.str().size() << std::endl; + + std::string str_decompressed = os_decompressed.str(); + UASSERTEQ(size_t, str_decompressed.size(), data_in.size()); + + for (u32 i = 0; i < size && i < str_decompressed.size(); i++) { + UTEST(str_decompressed[i] == data_in[i], + "index out[%i]=%i differs from in[%i]=%i", + i, str_decompressed[i], i, data_in[i]); + } +} + void TestCompression::testZlibLimit() { // edge cases diff --git a/src/unittest/test_config.h.in b/src/unittest/test_config.h.in index 36850b00d..50d2398e4 100644 --- a/src/unittest/test_config.h.in +++ b/src/unittest/test_config.h.in @@ -4,3 +4,4 @@ #define TEST_WORLDDIR "@TEST_WORLDDIR@" #define TEST_SUBGAME_PATH "@TEST_SUBGAME_PATH@" +#define TEST_MOD_PATH "@TEST_MOD_PATH@" diff --git a/src/unittest/test_connection.cpp b/src/unittest/test_connection.cpp index c5e4085e1..04fea90d6 100644 --- a/src/unittest/test_connection.cpp +++ b/src/unittest/test_connection.cpp @@ -39,6 +39,7 @@ public: void runTests(IGameDef *gamedef); + void testNetworkPacketSerialize(); void testHelpers(); void testConnectSendReceive(); }; @@ -47,6 +48,7 @@ static TestConnection g_test_instance; void TestConnection::runTests(IGameDef *gamedef) { + TEST(testNetworkPacketSerialize); TEST(testHelpers); TEST(testConnectSendReceive); } @@ -78,6 +80,39 @@ struct Handler : public con::PeerHandler const char *name; }; +void TestConnection::testNetworkPacketSerialize() +{ + const static u8 expected[] = { + 0x00, 0x7b, + 0x00, 0x02, 0xd8, 0x42, 0xdf, 0x9a + }; + + if (sizeof(wchar_t) == 2) + warningstream << __FUNCTION__ << " may fail on this platform." << std::endl; + + { + NetworkPacket pkt(123, 0); + + // serializing wide strings should do surrogate encoding, we test that here + pkt << std::wstring(L"\U00020b9a"); + + auto buf = pkt.oldForgePacket(); + UASSERTEQ(int, buf.getSize(), sizeof(expected)); + UASSERT(!memcmp(expected, &buf[0], buf.getSize())); + } + + { + NetworkPacket pkt; + pkt.putRawPacket(expected, sizeof(expected), 0); + + // same for decoding + std::wstring pkt_s; + pkt >> pkt_s; + + UASSERT(pkt_s == L"\U00020b9a"); + } +} + void TestConnection::testHelpers() { // Some constants for testing @@ -89,7 +124,7 @@ void TestConnection::testHelpers() Address a(127,0,0,1, 10); const u16 seqnum = 34352; - con::BufferedPacket p1 = con::makePacket(a, data1, + con::BufferedPacketPtr p1 = con::makePacket(a, data1, proto_id, peer_id, channel); /* We should now have a packet with this data: @@ -100,10 +135,10 @@ void TestConnection::testHelpers() Data: [7] u8 data1[0] */ - UASSERT(readU32(&p1.data[0]) == proto_id); - UASSERT(readU16(&p1.data[4]) == peer_id); - UASSERT(readU8(&p1.data[6]) == channel); - UASSERT(readU8(&p1.data[7]) == data1[0]); + UASSERT(readU32(&p1->data[0]) == proto_id); + UASSERT(readU16(&p1->data[4]) == peer_id); + UASSERT(readU8(&p1->data[6]) == channel); + UASSERT(readU8(&p1->data[7]) == data1[0]); //infostream<<"initial data1[0]="<<((u32)data1[0]&0xff)<<std::endl; @@ -245,7 +280,7 @@ void TestConnection::testConnectSendReceive() NetworkPacket pkt; pkt.putRawPacket((u8*) "Hello World !", 14, 0); - SharedBuffer<u8> sentdata = pkt.oldForgePacket(); + auto sentdata = pkt.oldForgePacket(); infostream<<"** running client.Send()"<<std::endl; client.Send(PEER_ID_SERVER, 0, &pkt, true); @@ -260,7 +295,7 @@ void TestConnection::testConnectSendReceive() << ", data=" << (const char*)pkt.getU8Ptr(0) << std::endl; - SharedBuffer<u8> recvdata = pkt.oldForgePacket(); + auto recvdata = pkt.oldForgePacket(); UASSERT(memcmp(*sentdata, *recvdata, recvdata.getSize()) == 0); } @@ -289,13 +324,13 @@ void TestConnection::testConnectSendReceive() infostream << "..."; infostream << std::endl; - SharedBuffer<u8> sentdata = pkt.oldForgePacket(); + auto sentdata = pkt.oldForgePacket(); server.Send(peer_id_client, 0, &pkt, true); //sleep_ms(3000); - SharedBuffer<u8> recvdata; + Buffer<u8> recvdata; infostream << "** running client.Receive()" << std::endl; session_t peer_id = 132; u16 size = 0; diff --git a/src/unittest/test_eventmanager.cpp b/src/unittest/test_eventmanager.cpp index bb0e59336..fec57f9fe 100644 --- a/src/unittest/test_eventmanager.cpp +++ b/src/unittest/test_eventmanager.cpp @@ -82,7 +82,7 @@ void TestEventManager::testDeregister() void TestEventManager::testRealEvent() { EventManager ev; - std::unique_ptr<EventManagerTest> emt(new EventManagerTest()); + auto emt = std::make_unique<EventManagerTest>(); ev.reg(MtEvent::PLAYER_REGAIN_GROUND, EventManagerTest::eventTest, emt.get()); // Put event & verify event value @@ -93,7 +93,7 @@ void TestEventManager::testRealEvent() void TestEventManager::testRealEventAfterDereg() { EventManager ev; - std::unique_ptr<EventManagerTest> emt(new EventManagerTest()); + auto emt = std::make_unique<EventManagerTest>(); ev.reg(MtEvent::PLAYER_REGAIN_GROUND, EventManagerTest::eventTest, emt.get()); // Put event & verify event value diff --git a/src/unittest/test_gettext.cpp b/src/unittest/test_gettext.cpp new file mode 100644 index 000000000..338a416d7 --- /dev/null +++ b/src/unittest/test_gettext.cpp @@ -0,0 +1,43 @@ +#include "test.h" +#include "porting.h" +#include "gettext.h" + +class TestGettext : public TestBase +{ +public: + TestGettext() { + TestManager::registerTestModule(this); + } + + const char *getName() { return "TestGettext"; } + + void runTests(IGameDef *gamedef); + + void testFmtgettext(); +}; + +static TestGettext g_test_instance; + +void TestGettext::runTests(IGameDef *gamedef) +{ + TEST(testFmtgettext); +} + +// Make sure updatepo.sh does not pick up the strings +#define dummyname fmtgettext + +void TestGettext::testFmtgettext() +{ + std::string buf = dummyname("sample text %d", 12); + UASSERTEQ(std::string, buf, "sample text 12"); + + std::string src, expect; + src = "You are about to join this server with the name \"%s\".\n"; + expect = "You are about to join this server with the name \"foo\".\n"; + for (int i = 0; i < 20; i++) { + src.append("loooong text"); + expect.append("loooong text"); + } + buf = dummyname(src.c_str(), "foo"); + UASSERTEQ(const std::string &, buf, expect); +} diff --git a/src/unittest/test_irrptr.cpp b/src/unittest/test_irrptr.cpp index aa857ff46..2fb7cfcd6 100644 --- a/src/unittest/test_irrptr.cpp +++ b/src/unittest/test_irrptr.cpp @@ -91,6 +91,14 @@ void TestIrrPtr::testRefCounting() obj->getReferenceCount()); } +#if defined(__clang__) + #pragma GCC diagnostic push + #if __clang_major__ >= 7 + #pragma GCC diagnostic ignored "-Wself-assign-overloaded" + #endif + #pragma GCC diagnostic ignored "-Wself-move" +#endif + void TestIrrPtr::testSelfAssignment() { irr_ptr<IReferenceCounted> p1{new IReferenceCounted()}; @@ -129,3 +137,7 @@ void TestIrrPtr::testNullHandling() UASSERT(!p2); UASSERT(!p3); } + +#if defined(__clang__) + #pragma GCC diagnostic pop +#endif diff --git a/src/unittest/test_lua.cpp b/src/unittest/test_lua.cpp new file mode 100644 index 000000000..fc8f895af --- /dev/null +++ b/src/unittest/test_lua.cpp @@ -0,0 +1,79 @@ +/* +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2021 TurkeyMcMac, Jude Melton-Houghton <jwmhjwmh@gmail.com> + +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. +*/ + +#include "test.h" + +extern "C" { +#include <lua.h> +#include <lauxlib.h> +} + +class TestLua : public TestBase +{ +public: + TestLua() { TestManager::registerTestModule(this); } + const char *getName() { return "TestLua"; } + + void runTests(IGameDef *gamedef); + + void testLuaDestructors(); +}; + +static TestLua g_test_instance; + +void TestLua::runTests(IGameDef *gamedef) +{ + TEST(testLuaDestructors); +} + +//////////////////////////////////////////////////////////////////////////////// + +namespace +{ + + class DestructorDetector { + bool *did_destruct; + public: + DestructorDetector(bool *did_destruct) : did_destruct(did_destruct) + { + *did_destruct = false; + } + ~DestructorDetector() + { + *did_destruct = true; + } + }; + +} + +void TestLua::testLuaDestructors() +{ + bool did_destruct = false; + + lua_State *L = luaL_newstate(); + lua_cpcall(L, [](lua_State *L) -> int { + DestructorDetector d(reinterpret_cast<bool*>(lua_touserdata(L, 1))); + luaL_error(L, "error"); + return 0; + }, &did_destruct); + lua_close(L); + + UASSERT(did_destruct); +} diff --git a/src/unittest/test_map.cpp b/src/unittest/test_map.cpp new file mode 100644 index 000000000..82e55e1aa --- /dev/null +++ b/src/unittest/test_map.cpp @@ -0,0 +1,68 @@ +/* +Minetest + +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. +*/ + +#include "test.h" + +#include <cstdio> +#include "mapblock.h" + +class TestMap : public TestBase +{ +public: + TestMap() { TestManager::registerTestModule(this); } + const char *getName() { return "TestMap"; } + + void runTests(IGameDef *gamedef); + + void testMaxMapgenLimit(); +}; + +static TestMap g_test_instance; + +void TestMap::runTests(IGameDef *gamedef) +{ + TEST(testMaxMapgenLimit); +} + +//////////////////////////////////////////////////////////////////////////////// + +void TestMap::testMaxMapgenLimit() +{ + // limit must end on a mapblock boundary + UASSERTEQ(int, MAX_MAP_GENERATION_LIMIT % MAP_BLOCKSIZE, MAP_BLOCKSIZE - 1); + + // objectpos_over_limit should do exactly this except the last node + // actually spans from LIMIT-0.5 to LIMIT+0.5 + float limit_times_bs = MAX_MAP_GENERATION_LIMIT * BS; + UASSERT(objectpos_over_limit(v3f(limit_times_bs-BS/2)) == false); + UASSERT(objectpos_over_limit(v3f(limit_times_bs)) == false); + UASSERT(objectpos_over_limit(v3f(limit_times_bs+BS/2)) == false); + UASSERT(objectpos_over_limit(v3f(limit_times_bs+BS)) == true); + + UASSERT(objectpos_over_limit(v3f(-limit_times_bs+BS/2)) == false); + UASSERT(objectpos_over_limit(v3f(-limit_times_bs)) == false); + UASSERT(objectpos_over_limit(v3f(-limit_times_bs-BS/2)) == false); + UASSERT(objectpos_over_limit(v3f(-limit_times_bs-BS)) == true); + + // blockpos_over_max_limit + s16 limit_block = MAX_MAP_GENERATION_LIMIT / MAP_BLOCKSIZE; + UASSERT(blockpos_over_max_limit(v3s16(limit_block)) == false); + UASSERT(blockpos_over_max_limit(v3s16(limit_block+1)) == true); + UASSERT(blockpos_over_max_limit(v3s16(-limit_block)) == false); + UASSERT(blockpos_over_max_limit(v3s16(-limit_block-1)) == true); +} diff --git a/src/unittest/test_map_settings_manager.cpp b/src/unittest/test_map_settings_manager.cpp index 0a5c971b9..17c31fe79 100644 --- a/src/unittest/test_map_settings_manager.cpp +++ b/src/unittest/test_map_settings_manager.cpp @@ -30,7 +30,7 @@ public: TestMapSettingsManager() { TestManager::registerTestModule(this); } const char *getName() { return "TestMapSettingsManager"; } - void makeUserConfig(Settings *conf); + void makeUserConfig(); std::string makeMetaFile(bool make_corrupt); void runTests(IGameDef *gamedef); @@ -65,33 +65,11 @@ void check_noise_params(const NoiseParams *np1, const NoiseParams *np2) } -std::string read_file_to_string(const std::string &filepath) +void TestMapSettingsManager::makeUserConfig() { - std::string buf; - FILE *f = fopen(filepath.c_str(), "rb"); - if (!f) - return ""; + delete Settings::getLayer(SL_GLOBAL); + Settings *conf = Settings::createLayer(SL_GLOBAL); - fseek(f, 0, SEEK_END); - - long filesize = ftell(f); - if (filesize == -1) { - fclose(f); - return ""; - } - rewind(f); - - buf.resize(filesize); - - UASSERTEQ(size_t, fread(&buf[0], 1, filesize, f), 1); - - fclose(f); - return buf; -} - - -void TestMapSettingsManager::makeUserConfig(Settings *conf) -{ conf->set("mg_name", "v7"); conf->set("seed", "5678"); conf->set("water_level", "20"); @@ -128,12 +106,11 @@ std::string TestMapSettingsManager::makeMetaFile(bool make_corrupt) void TestMapSettingsManager::testMapSettingsManager() { - Settings user_settings; - makeUserConfig(&user_settings); + makeUserConfig(); std::string test_mapmeta_path = makeMetaFile(false); - MapSettingsManager mgr(&user_settings, test_mapmeta_path); + MapSettingsManager mgr(test_mapmeta_path); std::string value; UASSERT(mgr.getMapSetting("mg_name", &value)); @@ -165,6 +142,17 @@ void TestMapSettingsManager::testMapSettingsManager() mgr.setMapSettingNoiseParams("mgv5_np_height", &script_np_height); mgr.setMapSettingNoiseParams("mgv5_np_factor", &script_np_factor); + { + NoiseParams dummy; + mgr.getMapSettingNoiseParams("mgv5_np_factor", &dummy); + check_noise_params(&dummy, &script_np_factor); + } + + // The settings manager MUST leave user settings alone + mgr.setMapSetting("testname", "1"); + mgr.setMapSetting("testname", "1", true); + UASSERT(!Settings::getLayer(SL_GLOBAL)->exists("testname")); + // Now make our Params and see if the values are correctly sourced MapgenParams *params = mgr.makeMapgenParams(); UASSERT(params->mgtype == MAPGEN_V5); @@ -199,7 +187,8 @@ void TestMapSettingsManager::testMapSettingsManager() }; SHA1 ctx; - std::string metafile_contents = read_file_to_string(test_mapmeta_path); + std::string metafile_contents; + UASSERT(fs::ReadFile(test_mapmeta_path, metafile_contents)); ctx.addBytes(&metafile_contents[0], metafile_contents.size()); unsigned char *sha1_result = ctx.getDigest(); int resultdiff = memcmp(sha1_result, expected_contents_hash, 20); @@ -212,50 +201,66 @@ void TestMapSettingsManager::testMapSettingsManager() void TestMapSettingsManager::testMapMetaSaveLoad() { - Settings conf; std::string path = getTestTempDirectory() + DIR_DELIM + "foobar" + DIR_DELIM + "map_meta.txt"; + makeUserConfig(); + Settings &conf = *Settings::getLayer(SL_GLOBAL); + + // There cannot be two MapSettingsManager + // copy the mapgen params to compare them + MapgenParams params1, params2; // Create a set of mapgen params and save them to map meta - conf.set("seed", "12345"); - conf.set("water_level", "5"); - MapSettingsManager mgr1(&conf, path); - MapgenParams *params1 = mgr1.makeMapgenParams(); - UASSERT(params1); - UASSERT(mgr1.saveMapMeta()); + { + conf.set("seed", "12345"); + conf.set("water_level", "5"); + MapSettingsManager mgr(path); + MapgenParams *params = mgr.makeMapgenParams(); + UASSERT(params); + params1 = *params; + params1.bparams = nullptr; // No double-free + UASSERT(mgr.saveMapMeta()); + } // Now try loading the map meta to mapgen params - conf.set("seed", "67890"); - conf.set("water_level", "32"); - MapSettingsManager mgr2(&conf, path); - UASSERT(mgr2.loadMapMeta()); - MapgenParams *params2 = mgr2.makeMapgenParams(); - UASSERT(params2); + { + conf.set("seed", "67890"); + conf.set("water_level", "32"); + MapSettingsManager mgr(path); + UASSERT(mgr.loadMapMeta()); + MapgenParams *params = mgr.makeMapgenParams(); + UASSERT(params); + params2 = *params; + params2.bparams = nullptr; // No double-free + } // Check that both results are correct - UASSERTEQ(u64, params1->seed, 12345); - UASSERTEQ(s16, params1->water_level, 5); - UASSERTEQ(u64, params2->seed, 12345); - UASSERTEQ(s16, params2->water_level, 5); + UASSERTEQ(u64, params1.seed, 12345); + UASSERTEQ(s16, params1.water_level, 5); + UASSERTEQ(u64, params2.seed, 12345); + UASSERTEQ(s16, params2.water_level, 5); } void TestMapSettingsManager::testMapMetaFailures() { std::string test_mapmeta_path; - Settings conf; // Check to see if it'll fail on a non-existent map meta file - test_mapmeta_path = "woobawooba/fgdfg/map_meta.txt"; - UASSERT(!fs::PathExists(test_mapmeta_path)); + { + test_mapmeta_path = "woobawooba/fgdfg/map_meta.txt"; + UASSERT(!fs::PathExists(test_mapmeta_path)); - MapSettingsManager mgr1(&conf, test_mapmeta_path); - UASSERT(!mgr1.loadMapMeta()); + MapSettingsManager mgr1(test_mapmeta_path); + UASSERT(!mgr1.loadMapMeta()); + } // Check to see if it'll fail on a corrupt map meta file - test_mapmeta_path = makeMetaFile(true); - UASSERT(fs::PathExists(test_mapmeta_path)); + { + test_mapmeta_path = makeMetaFile(true); + UASSERT(fs::PathExists(test_mapmeta_path)); - MapSettingsManager mgr2(&conf, test_mapmeta_path); - UASSERT(!mgr2.loadMapMeta()); + MapSettingsManager mgr2(test_mapmeta_path); + UASSERT(!mgr2.loadMapMeta()); + } } diff --git a/src/unittest/test_mod/test_mod/init.lua b/src/unittest/test_mod/test_mod/init.lua new file mode 100644 index 000000000..724a863f5 --- /dev/null +++ b/src/unittest/test_mod/test_mod/init.lua @@ -0,0 +1 @@ +-- deliberately empty diff --git a/src/unittest/test_mod/test_mod/mod.conf b/src/unittest/test_mod/test_mod/mod.conf new file mode 100644 index 000000000..56c64b2d8 --- /dev/null +++ b/src/unittest/test_mod/test_mod/mod.conf @@ -0,0 +1,2 @@ +name = test_mod +description = A mod doing nothing, to test if MINETEST_MOD_PATH is recognised diff --git a/src/unittest/test_modmetadatadatabase.cpp b/src/unittest/test_modmetadatadatabase.cpp new file mode 100644 index 000000000..be97fae5e --- /dev/null +++ b/src/unittest/test_modmetadatadatabase.cpp @@ -0,0 +1,253 @@ +/* +Minetest +Copyright (C) 2018 bendeutsch, Ben Deutsch <ben@bendeutsch.de> +Copyright (C) 2021 TurkeyMcMac, Jude Melton-Houghton <jwmhjwmh@gmail.com> + +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. +*/ + +// This file is an edited copy of test_authdatabase.cpp + +#include "test.h" + +#include <algorithm> +#include "database/database-files.h" +#include "database/database-sqlite3.h" +#include "filesys.h" + +namespace +{ +// Anonymous namespace to create classes that are only +// visible to this file +// +// These are helpers that return a *ModMetadataDatabase and +// allow us to run the same tests on different databases and +// database acquisition strategies. + +class ModMetadataDatabaseProvider +{ +public: + virtual ~ModMetadataDatabaseProvider() = default; + virtual ModMetadataDatabase *getModMetadataDatabase() = 0; +}; + +class FixedProvider : public ModMetadataDatabaseProvider +{ +public: + FixedProvider(ModMetadataDatabase *mod_meta_db) : mod_meta_db(mod_meta_db){}; + virtual ~FixedProvider(){}; + virtual ModMetadataDatabase *getModMetadataDatabase() { return mod_meta_db; }; + +private: + ModMetadataDatabase *mod_meta_db; +}; + +class FilesProvider : public ModMetadataDatabaseProvider +{ +public: + FilesProvider(const std::string &dir) : dir(dir){}; + virtual ~FilesProvider() + { + if (mod_meta_db) + mod_meta_db->endSave(); + delete mod_meta_db; + } + virtual ModMetadataDatabase *getModMetadataDatabase() + { + if (mod_meta_db) + mod_meta_db->endSave(); + delete mod_meta_db; + mod_meta_db = new ModMetadataDatabaseFiles(dir); + mod_meta_db->beginSave(); + return mod_meta_db; + }; + +private: + std::string dir; + ModMetadataDatabase *mod_meta_db = nullptr; +}; + +class SQLite3Provider : public ModMetadataDatabaseProvider +{ +public: + SQLite3Provider(const std::string &dir) : dir(dir){}; + virtual ~SQLite3Provider() + { + if (mod_meta_db) + mod_meta_db->endSave(); + delete mod_meta_db; + } + virtual ModMetadataDatabase *getModMetadataDatabase() + { + if (mod_meta_db) + mod_meta_db->endSave(); + delete mod_meta_db; + mod_meta_db = new ModMetadataDatabaseSQLite3(dir); + mod_meta_db->beginSave(); + return mod_meta_db; + }; + +private: + std::string dir; + ModMetadataDatabase *mod_meta_db = nullptr; +}; +} + +class TestModMetadataDatabase : public TestBase +{ +public: + TestModMetadataDatabase() { TestManager::registerTestModule(this); } + const char *getName() { return "TestModMetadataDatabase"; } + + void runTests(IGameDef *gamedef); + void runTestsForCurrentDB(); + + void testRecallFail(); + void testCreate(); + void testRecall(); + void testChange(); + void testRecallChanged(); + void testListMods(); + void testRemove(); + +private: + ModMetadataDatabaseProvider *mod_meta_provider; +}; + +static TestModMetadataDatabase g_test_instance; + +void TestModMetadataDatabase::runTests(IGameDef *gamedef) +{ + // fixed directory, for persistence + thread_local const std::string test_dir = getTestTempDirectory(); + + // Each set of tests is run twice for each database type: + // one where we reuse the same ModMetadataDatabase object (to test local caching), + // and one where we create a new ModMetadataDatabase object for each call + // (to test actual persistence). + + rawstream << "-------- Files database (same object)" << std::endl; + + ModMetadataDatabase *mod_meta_db = new ModMetadataDatabaseFiles(test_dir); + mod_meta_provider = new FixedProvider(mod_meta_db); + + runTestsForCurrentDB(); + + delete mod_meta_db; + delete mod_meta_provider; + + // reset database + fs::RecursiveDelete(test_dir + DIR_DELIM + "mod_storage"); + + rawstream << "-------- Files database (new objects)" << std::endl; + + mod_meta_provider = new FilesProvider(test_dir); + + runTestsForCurrentDB(); + + delete mod_meta_provider; + + rawstream << "-------- SQLite3 database (same object)" << std::endl; + + mod_meta_db = new ModMetadataDatabaseSQLite3(test_dir); + mod_meta_provider = new FixedProvider(mod_meta_db); + + runTestsForCurrentDB(); + + delete mod_meta_db; + delete mod_meta_provider; + + // reset database + fs::DeleteSingleFileOrEmptyDirectory(test_dir + DIR_DELIM + "mod_storage.sqlite"); + + rawstream << "-------- SQLite3 database (new objects)" << std::endl; + + mod_meta_provider = new SQLite3Provider(test_dir); + + runTestsForCurrentDB(); + + delete mod_meta_provider; +} + +//////////////////////////////////////////////////////////////////////////////// + +void TestModMetadataDatabase::runTestsForCurrentDB() +{ + TEST(testRecallFail); + TEST(testCreate); + TEST(testRecall); + TEST(testChange); + TEST(testRecallChanged); + TEST(testListMods); + TEST(testRemove); + TEST(testRecallFail); +} + +void TestModMetadataDatabase::testRecallFail() +{ + ModMetadataDatabase *mod_meta_db = mod_meta_provider->getModMetadataDatabase(); + StringMap recalled; + mod_meta_db->getModEntries("mod1", &recalled); + UASSERT(recalled.empty()); +} + +void TestModMetadataDatabase::testCreate() +{ + ModMetadataDatabase *mod_meta_db = mod_meta_provider->getModMetadataDatabase(); + StringMap recalled; + UASSERT(mod_meta_db->setModEntry("mod1", "key1", "value1")); +} + +void TestModMetadataDatabase::testRecall() +{ + ModMetadataDatabase *mod_meta_db = mod_meta_provider->getModMetadataDatabase(); + StringMap recalled; + mod_meta_db->getModEntries("mod1", &recalled); + UASSERT(recalled.size() == 1); + UASSERT(recalled["key1"] == "value1"); +} + +void TestModMetadataDatabase::testChange() +{ + ModMetadataDatabase *mod_meta_db = mod_meta_provider->getModMetadataDatabase(); + StringMap recalled; + UASSERT(mod_meta_db->setModEntry("mod1", "key1", "value2")); +} + +void TestModMetadataDatabase::testRecallChanged() +{ + ModMetadataDatabase *mod_meta_db = mod_meta_provider->getModMetadataDatabase(); + StringMap recalled; + mod_meta_db->getModEntries("mod1", &recalled); + UASSERT(recalled.size() == 1); + UASSERT(recalled["key1"] == "value2"); +} + +void TestModMetadataDatabase::testListMods() +{ + ModMetadataDatabase *mod_meta_db = mod_meta_provider->getModMetadataDatabase(); + UASSERT(mod_meta_db->setModEntry("mod2", "key1", "value1")); + std::vector<std::string> mod_list; + mod_meta_db->listMods(&mod_list); + UASSERT(mod_list.size() == 2); + UASSERT(std::find(mod_list.cbegin(), mod_list.cend(), "mod1") != mod_list.cend()); + UASSERT(std::find(mod_list.cbegin(), mod_list.cend(), "mod2") != mod_list.cend()); +} + +void TestModMetadataDatabase::testRemove() +{ + ModMetadataDatabase *mod_meta_db = mod_meta_provider->getModMetadataDatabase(); + UASSERT(mod_meta_db->removeModEntry("mod1", "key1")); +} diff --git a/src/unittest/test_nodedef.cpp b/src/unittest/test_nodedef.cpp index 66ca0ccbc..acf669783 100644 --- a/src/unittest/test_nodedef.cpp +++ b/src/unittest/test_nodedef.cpp @@ -60,7 +60,7 @@ void TestNodeDef::testContentFeaturesSerialization() std::istringstream is(os.str(), std::ios::binary); ContentFeatures f2; - f2.deSerialize(is); + f2.deSerialize(is, LATEST_PROTOCOL_VERSION); UASSERT(f.walkable == f2.walkable); UASSERT(f.node_box.type == f2.node_box.type); diff --git a/src/unittest/test_noderesolver.cpp b/src/unittest/test_noderesolver.cpp index 28da43620..ed66093a9 100644 --- a/src/unittest/test_noderesolver.cpp +++ b/src/unittest/test_noderesolver.cpp @@ -56,6 +56,8 @@ void TestNodeResolver::runTests(IGameDef *gamedef) class Foobar : public NodeResolver { public: + friend class TestNodeResolver; // m_ndef + void resolveNodeNames(); content_t test_nr_node1; diff --git a/src/unittest/test_noise.cpp b/src/unittest/test_noise.cpp index 421f3b66e..12b155f46 100644 --- a/src/unittest/test_noise.cpp +++ b/src/unittest/test_noise.cpp @@ -30,8 +30,14 @@ public: void runTests(IGameDef *gamedef); + void testNoise2dAtOriginWithZeroSeed(); + void testNoise2dWithMaxSeed(); + void testNoise2dWithFunPrimes(); void testNoise2dPoint(); void testNoise2dBulk(); + void testNoise3dAtOriginWithZeroSeed(); + void testNoise3dWithMaxSeed(); + void testNoise3dWithFunPrimes(); void testNoise3dPoint(); void testNoise3dBulk(); void testNoiseInvalidParams(); @@ -44,8 +50,14 @@ static TestNoise g_test_instance; void TestNoise::runTests(IGameDef *gamedef) { + TEST(testNoise2dAtOriginWithZeroSeed); + TEST(testNoise2dWithMaxSeed); + TEST(testNoise2dWithFunPrimes); TEST(testNoise2dPoint); TEST(testNoise2dBulk); + TEST(testNoise3dAtOriginWithZeroSeed); + TEST(testNoise3dWithMaxSeed); + TEST(testNoise3dWithFunPrimes); TEST(testNoise3dPoint); TEST(testNoise3dBulk); TEST(testNoiseInvalidParams); @@ -53,6 +65,27 @@ void TestNoise::runTests(IGameDef *gamedef) //////////////////////////////////////////////////////////////////////////////// +void TestNoise::testNoise2dAtOriginWithZeroSeed() +{ + float actual{ noise2d(0, 0, 0) }; + constexpr float expected{ -0.281791f }; + UASSERT(std::fabs(actual - expected) <= 0.00001); +} + +void TestNoise::testNoise2dWithMaxSeed() +{ + float actual{ noise2d(4096, 4096, 2147483647) }; + constexpr float expected{ 0.950606f }; + UASSERT(std::fabs(actual - expected) <= 0.00001); +} + +void TestNoise::testNoise2dWithFunPrimes() +{ + float actual{ noise2d(-3947, -2333, 7027) }; + constexpr float expected{ -0.294907f }; + UASSERT(std::fabs(actual - expected) <= 0.00001); +} + void TestNoise::testNoise2dPoint() { NoiseParams np_normal(20, 40, v3f(50, 50, 50), 9, 5, 0.6, 2.0); @@ -79,6 +112,27 @@ void TestNoise::testNoise2dBulk() } } +void TestNoise::testNoise3dAtOriginWithZeroSeed() +{ + float actual{ noise2d(0, 0, 0) }; + constexpr float expected{ -0.281791f }; + UASSERT(std::fabs(actual - expected) <= 0.00001); +} + +void TestNoise::testNoise3dWithMaxSeed() +{ + float actual{ noise3d(4096, 4096, 4096, 2147483647) }; + constexpr float expected{ -0.775243f }; + UASSERT(std::fabs(actual - expected) <= 0.00001); +} + +void TestNoise::testNoise3dWithFunPrimes() +{ + float actual{ noise2d(3903, -1723, 7411) }; + constexpr float expected{ 0.989124f }; + UASSERT(std::fabs(actual - expected) <= 0.00001); +} + void TestNoise::testNoise3dPoint() { NoiseParams np_normal(20, 40, v3f(50, 50, 50), 9, 5, 0.6, 2.0); diff --git a/src/unittest/test_schematic.cpp b/src/unittest/test_schematic.cpp index da4ce50d2..d2f027eb4 100644 --- a/src/unittest/test_schematic.cpp +++ b/src/unittest/test_schematic.cpp @@ -66,13 +66,14 @@ void TestSchematic::testMtsSerializeDeserialize(const NodeDefManager *ndef) std::stringstream ss(std::ios_base::binary | std::ios_base::in | std::ios_base::out); - std::vector<std::string> names; - names.emplace_back("foo"); - names.emplace_back("bar"); - names.emplace_back("baz"); - names.emplace_back("qux"); - - Schematic schem, schem2; + Schematic schem; + { + std::vector<std::string> &names = schem.m_nodenames; + names.emplace_back("foo"); + names.emplace_back("bar"); + names.emplace_back("baz"); + names.emplace_back("qux"); + } schem.flags = 0; schem.size = size; @@ -83,18 +84,21 @@ void TestSchematic::testMtsSerializeDeserialize(const NodeDefManager *ndef) for (s16 y = 0; y != size.Y; y++) schem.slice_probs[y] = MTSCHEM_PROB_ALWAYS; - UASSERT(schem.serializeToMts(&ss, names)); + UASSERT(schem.serializeToMts(&ss)); ss.seekg(0); - names.clear(); - UASSERT(schem2.deserializeFromMts(&ss, &names)); + Schematic schem2; + UASSERT(schem2.deserializeFromMts(&ss)); - UASSERTEQ(size_t, names.size(), 4); - UASSERTEQ(std::string, names[0], "foo"); - UASSERTEQ(std::string, names[1], "bar"); - UASSERTEQ(std::string, names[2], "baz"); - UASSERTEQ(std::string, names[3], "qux"); + { + std::vector<std::string> &names = schem2.m_nodenames; + UASSERTEQ(size_t, names.size(), 4); + UASSERTEQ(std::string, names[0], "foo"); + UASSERTEQ(std::string, names[1], "bar"); + UASSERTEQ(std::string, names[2], "baz"); + UASSERTEQ(std::string, names[3], "qux"); + } UASSERT(schem2.size == size); for (size_t i = 0; i != volume; i++) @@ -120,14 +124,14 @@ void TestSchematic::testLuaTableSerialize(const NodeDefManager *ndef) for (s16 y = 0; y != size.Y; y++) schem.slice_probs[y] = MTSCHEM_PROB_ALWAYS; - std::vector<std::string> names; + std::vector<std::string> &names = schem.m_nodenames; names.emplace_back("air"); names.emplace_back("default:lava_source"); names.emplace_back("default:glass"); std::ostringstream ss(std::ios_base::binary); - UASSERT(schem.serializeToLua(&ss, names, false, 0)); + UASSERT(schem.serializeToLua(&ss, false, 0)); UASSERTEQ(std::string, ss.str(), expected_lua_output); } @@ -159,6 +163,8 @@ void TestSchematic::testFileSerializeDeserialize(const NodeDefManager *ndef) schem1.slice_probs[0] = 80; schem1.slice_probs[1] = 160; schem1.slice_probs[2] = 240; + // Node resolving happened manually. + schem1.m_resolve_done = true; for (size_t i = 0; i != volume; i++) { content_t c = content_map[test_schem2_data[i]]; diff --git a/src/unittest/test_serialization.cpp b/src/unittest/test_serialization.cpp index 51e28f144..ff6b57507 100644 --- a/src/unittest/test_serialization.cpp +++ b/src/unittest/test_serialization.cpp @@ -32,25 +32,19 @@ public: void buildTestStrings(); void testSerializeString(); - void testSerializeWideString(); void testSerializeLongString(); void testSerializeJsonString(); - void testSerializeHex(); void testDeSerializeString(); - void testDeSerializeWideString(); void testDeSerializeLongString(); void testStreamRead(); void testStreamWrite(); - void testVecPut(); - void testStringLengthLimits(); - void testBufReader(); void testFloatFormat(); std::string teststring2; std::wstring teststring2_w; std::string teststring2_w_encoded; - static const u8 test_serialized_data[12 * 13 - 8]; + static const u8 test_serialized_data[12 * 11 - 2]; }; static TestSerialization g_test_instance; @@ -61,17 +55,11 @@ void TestSerialization::runTests(IGameDef *gamedef) TEST(testSerializeString); TEST(testDeSerializeString); - TEST(testSerializeWideString); - TEST(testDeSerializeWideString); TEST(testSerializeLongString); TEST(testDeSerializeLongString); TEST(testSerializeJsonString); - TEST(testSerializeHex); TEST(testStreamRead); TEST(testStreamWrite); - TEST(testVecPut); - TEST(testStringLengthLimits); - TEST(testBufReader); TEST(testFloatFormat); } @@ -103,21 +91,21 @@ void TestSerialization::buildTestStrings() void TestSerialization::testSerializeString() { // Test blank string - UASSERT(serializeString("") == mkstr("\0\0")); + UASSERT(serializeString16("") == mkstr("\0\0")); // Test basic string - UASSERT(serializeString("Hello world!") == mkstr("\0\14Hello world!")); + UASSERT(serializeString16("Hello world!") == mkstr("\0\14Hello world!")); // Test character range - UASSERT(serializeString(teststring2) == mkstr("\1\0") + teststring2); + UASSERT(serializeString16(teststring2) == mkstr("\1\0") + teststring2); } void TestSerialization::testDeSerializeString() { // Test deserialize { - std::istringstream is(serializeString(teststring2), std::ios::binary); - UASSERT(deSerializeString(is) == teststring2); + std::istringstream is(serializeString16(teststring2), std::ios::binary); + UASSERT(deSerializeString16(is) == teststring2); UASSERT(!is.eof()); is.get(); UASSERT(is.eof()); @@ -126,78 +114,34 @@ void TestSerialization::testDeSerializeString() // Test deserialize an incomplete length specifier { std::istringstream is(mkstr("\x53"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString16(is)); } // Test deserialize a string with incomplete data { std::istringstream is(mkstr("\x00\x55 abcdefg"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeString(is)); - } -} - -void TestSerialization::testSerializeWideString() -{ - // Test blank string - UASSERT(serializeWideString(L"") == mkstr("\0\0")); - - // Test basic string - UASSERT(serializeWideString(utf8_to_wide("Hello world!")) == - mkstr("\0\14\0H\0e\0l\0l\0o\0 \0w\0o\0r\0l\0d\0!")); - - // Test character range - UASSERT(serializeWideString(teststring2_w) == - mkstr("\1\0") + teststring2_w_encoded); -} - -void TestSerialization::testDeSerializeWideString() -{ - // Test deserialize - { - std::istringstream is(serializeWideString(teststring2_w), std::ios::binary); - UASSERT(deSerializeWideString(is) == teststring2_w); - UASSERT(!is.eof()); - is.get(); - UASSERT(is.eof()); - } - - // Test deserialize an incomplete length specifier - { - std::istringstream is(mkstr("\x53"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeWideString(is)); - } - - // Test deserialize a string with an incomplete character - { - std::istringstream is(mkstr("\x00\x07\0a\0b\0c\0d\0e\0f\0"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeWideString(is)); - } - - // Test deserialize a string with incomplete data - { - std::istringstream is(mkstr("\x00\x08\0a\0b\0c\0d\0e\0f"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeWideString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString16(is)); } } void TestSerialization::testSerializeLongString() { // Test blank string - UASSERT(serializeLongString("") == mkstr("\0\0\0\0")); + UASSERT(serializeString32("") == mkstr("\0\0\0\0")); // Test basic string - UASSERT(serializeLongString("Hello world!") == mkstr("\0\0\0\14Hello world!")); + UASSERT(serializeString32("Hello world!") == mkstr("\0\0\0\14Hello world!")); // Test character range - UASSERT(serializeLongString(teststring2) == mkstr("\0\0\1\0") + teststring2); + UASSERT(serializeString32(teststring2) == mkstr("\0\0\1\0") + teststring2); } void TestSerialization::testDeSerializeLongString() { // Test deserialize { - std::istringstream is(serializeLongString(teststring2), std::ios::binary); - UASSERT(deSerializeLongString(is) == teststring2); + std::istringstream is(serializeString32(teststring2), std::ios::binary); + UASSERT(deSerializeString32(is) == teststring2); UASSERT(!is.eof()); is.get(); UASSERT(is.eof()); @@ -206,42 +150,69 @@ void TestSerialization::testDeSerializeLongString() // Test deserialize an incomplete length specifier { std::istringstream is(mkstr("\x53"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeLongString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString32(is)); } // Test deserialize a string with incomplete data { std::istringstream is(mkstr("\x00\x00\x00\x05 abc"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeLongString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString32(is)); } // Test deserialize a string with a length too large { std::istringstream is(mkstr("\xFF\xFF\xFF\xFF blah"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeLongString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString32(is)); } } void TestSerialization::testSerializeJsonString() { + std::istringstream is(std::ios::binary); + const auto reset_is = [&] (const std::string &s) { + is.clear(); + is.str(s); + }; + const auto assert_at_eof = [] (std::istream &is) { + is.get(); + UASSERT(is.eof()); + }; + // Test blank string - UASSERT(serializeJsonString("") == "\"\""); + UASSERTEQ(std::string, serializeJsonString(""), "\"\""); + reset_is("\"\""); + UASSERTEQ(std::string, deSerializeJsonString(is), ""); + assert_at_eof(is); // Test basic string - UASSERT(serializeJsonString("Hello world!") == "\"Hello world!\""); + UASSERTEQ(std::string, serializeJsonString("Hello world!"), "\"Hello world!\""); + reset_is("\"Hello world!\""); + UASSERTEQ(std::string, deSerializeJsonString(is), "Hello world!"); + assert_at_eof(is); - // MSVC fails when directly using "\\\\" - std::string backslash = "\\"; - UASSERT(serializeJsonString(teststring2) == - mkstr("\"") + + // Test optional serialization + const std::pair<const char*, const char*> test_pairs[] = { + { "abc", "abc" }, + { "x y z", "\"x y z\"" }, + { "\"", "\"\\\"\"" }, + }; + for (auto it : test_pairs) { + UASSERTEQ(std::string, serializeJsonStringIfNeeded(it.first), it.second); + reset_is(it.second); + UASSERTEQ(std::string, deSerializeJsonStringIfNeeded(is), it.first); + assert_at_eof(is); + } + + // Test all byte values + const std::string bs = "\\"; // MSVC fails when directly using "\\\\" + const std::string expected = mkstr("\"") + "\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007" + "\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f" + "\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017" + "\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f" + - " !\\\"" + teststring2.substr(0x23, 0x2f-0x23) + - "\\/" + teststring2.substr(0x30, 0x5c-0x30) + - backslash + backslash + teststring2.substr(0x5d, 0x7f-0x5d) + "\\u007f" + + " !\\\"" + teststring2.substr(0x23, 0x5c-0x23) + + bs + bs + teststring2.substr(0x5d, 0x7f-0x5d) + "\\u007f" + "\\u0080\\u0081\\u0082\\u0083\\u0084\\u0085\\u0086\\u0087" + "\\u0088\\u0089\\u008a\\u008b\\u008c\\u008d\\u008e\\u008f" + "\\u0090\\u0091\\u0092\\u0093\\u0094\\u0095\\u0096\\u0097" + @@ -258,33 +229,31 @@ void TestSerialization::testSerializeJsonString() "\\u00e8\\u00e9\\u00ea\\u00eb\\u00ec\\u00ed\\u00ee\\u00ef" + "\\u00f0\\u00f1\\u00f2\\u00f3\\u00f4\\u00f5\\u00f6\\u00f7" + "\\u00f8\\u00f9\\u00fa\\u00fb\\u00fc\\u00fd\\u00fe\\u00ff" + - "\""); + "\""; + std::string serialized = serializeJsonString(teststring2); + UASSERTEQ(std::string, serialized, expected); - // Test deserialize - std::istringstream is(serializeJsonString(teststring2), std::ios::binary); - UASSERT(deSerializeJsonString(is) == teststring2); - UASSERT(!is.eof()); - is.get(); - UASSERT(is.eof()); -} + reset_is(serialized); + UASSERTEQ(std::string, deSerializeJsonString(is), teststring2); + UASSERT(!is.eof()); // should have stopped at " so eof must not be set yet + assert_at_eof(is); -void TestSerialization::testSerializeHex() -{ - // Test blank string - UASSERT(serializeHexString("") == ""); - UASSERT(serializeHexString("", true) == ""); + // Test that deserialization leaves rest of stream alone + std::string tmp; + reset_is("\"foo\"bar"); + UASSERTEQ(std::string, deSerializeJsonString(is), "foo"); + std::getline(is, tmp, '\0'); + UASSERTEQ(std::string, tmp, "bar"); - // Test basic string - UASSERT(serializeHexString("Hello world!") == - "48656c6c6f20776f726c6421"); - UASSERT(serializeHexString("Hello world!", true) == - "48 65 6c 6c 6f 20 77 6f 72 6c 64 21"); + reset_is("\"x y z\"bar"); + UASSERTEQ(std::string, deSerializeJsonStringIfNeeded(is), "x y z"); + std::getline(is, tmp, '\0'); + UASSERTEQ(std::string, tmp, "bar"); - // Test binary string - UASSERT(serializeHexString(mkstr("\x00\x0a\xb0\x63\x1f\x00\xff")) == - "000ab0631f00ff"); - UASSERT(serializeHexString(mkstr("\x00\x0a\xb0\x63\x1f\x00\xff"), true) == - "00 0a b0 63 1f 00 ff"); + reset_is("foo bar"); + UASSERTEQ(std::string, deSerializeJsonStringIfNeeded(is), "foo"); + std::getline(is, tmp, '\0'); + UASSERTEQ(std::string, tmp, " bar"); } @@ -310,19 +279,17 @@ void TestSerialization::testStreamRead() UASSERT(readF1000(is) == F1000_MIN); UASSERT(readF1000(is) == F1000_MAX); - UASSERT(deSerializeString(is) == "foobar!"); + UASSERT(deSerializeString16(is) == "foobar!"); UASSERT(readV2S16(is) == v2s16(500, 500)); UASSERT(readV3S16(is) == v3s16(4207, 604, -30)); UASSERT(readV2S32(is) == v2s32(1920, 1080)); UASSERT(readV3S32(is) == v3s32(-400, 6400054, 290549855)); - UASSERT(deSerializeWideString(is) == L"\x02~woof~\x5455"); - UASSERT(readV3F1000(is) == v3f(500, 10024.2f, -192.54f)); UASSERT(readARGB8(is) == video::SColor(255, 128, 50, 128)); - UASSERT(deSerializeLongString(is) == "some longer string here"); + UASSERT(deSerializeString32(is) == "some longer string here"); UASSERT(is.rdbuf()->in_avail() == 2); UASSERT(readU16(is) == 0xF00D); @@ -350,7 +317,7 @@ void TestSerialization::testStreamWrite() writeF1000(os, F1000_MIN); writeF1000(os, F1000_MAX); - os << serializeString("foobar!"); + os << serializeString16("foobar!"); data = os.str(); UASSERT(data.size() < sizeof(test_serialized_data)); @@ -361,12 +328,10 @@ void TestSerialization::testStreamWrite() writeV2S32(os, v2s32(1920, 1080)); writeV3S32(os, v3s32(-400, 6400054, 290549855)); - os << serializeWideString(L"\x02~woof~\x5455"); - writeV3F1000(os, v3f(500, 10024.2f, -192.54f)); writeARGB8(os, video::SColor(255, 128, 50, 128)); - os << serializeLongString("some longer string here"); + os << serializeString32("some longer string here"); writeU16(os, 0xF00D); @@ -376,255 +341,6 @@ void TestSerialization::testStreamWrite() } -void TestSerialization::testVecPut() -{ - std::vector<u8> buf; - - putU8(&buf, 0x11); - putU16(&buf, 0x2233); - putU32(&buf, 0x44556677); - putU64(&buf, 0x8899AABBCCDDEEFFLL); - - putS8(&buf, -128); - putS16(&buf, 30000); - putS32(&buf, -6); - putS64(&buf, -43); - - putF1000(&buf, 53.53467f); - putF1000(&buf, -300000.32f); - putF1000(&buf, F1000_MIN); - putF1000(&buf, F1000_MAX); - - putString(&buf, "foobar!"); - - putV2S16(&buf, v2s16(500, 500)); - putV3S16(&buf, v3s16(4207, 604, -30)); - putV2S32(&buf, v2s32(1920, 1080)); - putV3S32(&buf, v3s32(-400, 6400054, 290549855)); - - putWideString(&buf, L"\x02~woof~\x5455"); - - putV3F1000(&buf, v3f(500, 10024.2f, -192.54f)); - putARGB8(&buf, video::SColor(255, 128, 50, 128)); - - putLongString(&buf, "some longer string here"); - - putU16(&buf, 0xF00D); - - UASSERT(buf.size() == sizeof(test_serialized_data)); - UASSERT(!memcmp(&buf[0], test_serialized_data, sizeof(test_serialized_data))); -} - - -void TestSerialization::testStringLengthLimits() -{ - std::vector<u8> buf; - std::string too_long(STRING_MAX_LEN + 1, 'A'); - std::string way_too_large(LONG_STRING_MAX_LEN + 1, 'B'); - std::wstring too_long_wide(WIDE_STRING_MAX_LEN + 1, L'C'); - - EXCEPTION_CHECK(SerializationError, putString(&buf, too_long)); - - putLongString(&buf, too_long); - too_long.resize(too_long.size() - 1); - putString(&buf, too_long); - - EXCEPTION_CHECK(SerializationError, putWideString(&buf, too_long_wide)); - too_long_wide.resize(too_long_wide.size() - 1); - putWideString(&buf, too_long_wide); -} - - -void TestSerialization::testBufReader() -{ - u8 u8_data; - u16 u16_data; - u32 u32_data; - u64 u64_data; - s8 s8_data; - s16 s16_data; - s32 s32_data; - s64 s64_data; - f32 f32_data, f32_data2, f32_data3, f32_data4; - video::SColor scolor_data; - v2s16 v2s16_data; - v3s16 v3s16_data; - v2s32 v2s32_data; - v3s32 v3s32_data; - v3f v3f_data; - std::string string_data; - std::wstring widestring_data; - std::string longstring_data; - u8 raw_data[10] = {0}; - - BufReader buf(test_serialized_data, sizeof(test_serialized_data)); - - // Try reading data like normal - UASSERT(buf.getU8() == 0x11); - UASSERT(buf.getU16() == 0x2233); - UASSERT(buf.getU32() == 0x44556677); - UASSERT(buf.getU64() == 0x8899AABBCCDDEEFFLL); - UASSERT(buf.getS8() == -128); - UASSERT(buf.getS16() == 30000); - UASSERT(buf.getS32() == -6); - UASSERT(buf.getS64() == -43); - UASSERT(buf.getF1000() == 53.534f); - UASSERT(buf.getF1000() == -300000.32f); - UASSERT(buf.getF1000() == F1000_MIN); - UASSERT(buf.getF1000() == F1000_MAX); - UASSERT(buf.getString() == "foobar!"); - UASSERT(buf.getV2S16() == v2s16(500, 500)); - UASSERT(buf.getV3S16() == v3s16(4207, 604, -30)); - UASSERT(buf.getV2S32() == v2s32(1920, 1080)); - UASSERT(buf.getV3S32() == v3s32(-400, 6400054, 290549855)); - UASSERT(buf.getWideString() == L"\x02~woof~\x5455"); - UASSERT(buf.getV3F1000() == v3f(500, 10024.2f, -192.54f)); - UASSERT(buf.getARGB8() == video::SColor(255, 128, 50, 128)); - UASSERT(buf.getLongString() == "some longer string here"); - - // Verify the offset and data is unchanged after a failed read - size_t orig_pos = buf.pos; - u32_data = 0; - UASSERT(buf.getU32NoEx(&u32_data) == false); - UASSERT(buf.pos == orig_pos); - UASSERT(u32_data == 0); - - // Now try the same for a failed string read - UASSERT(buf.getStringNoEx(&string_data) == false); - UASSERT(buf.pos == orig_pos); - UASSERT(string_data == ""); - - // Now try the same for a failed string read - UASSERT(buf.getWideStringNoEx(&widestring_data) == false); - UASSERT(buf.pos == orig_pos); - UASSERT(widestring_data == L""); - - UASSERT(buf.getU16() == 0xF00D); - - UASSERT(buf.remaining() == 0); - - // Check to make sure these each blow exceptions as they're supposed to - EXCEPTION_CHECK(SerializationError, buf.getU8()); - EXCEPTION_CHECK(SerializationError, buf.getU16()); - EXCEPTION_CHECK(SerializationError, buf.getU32()); - EXCEPTION_CHECK(SerializationError, buf.getU64()); - - EXCEPTION_CHECK(SerializationError, buf.getS8()); - EXCEPTION_CHECK(SerializationError, buf.getS16()); - EXCEPTION_CHECK(SerializationError, buf.getS32()); - EXCEPTION_CHECK(SerializationError, buf.getS64()); - - EXCEPTION_CHECK(SerializationError, buf.getF1000()); - EXCEPTION_CHECK(SerializationError, buf.getARGB8()); - - EXCEPTION_CHECK(SerializationError, buf.getV2S16()); - EXCEPTION_CHECK(SerializationError, buf.getV3S16()); - EXCEPTION_CHECK(SerializationError, buf.getV2S32()); - EXCEPTION_CHECK(SerializationError, buf.getV3S32()); - EXCEPTION_CHECK(SerializationError, buf.getV3F1000()); - - EXCEPTION_CHECK(SerializationError, buf.getString()); - EXCEPTION_CHECK(SerializationError, buf.getWideString()); - EXCEPTION_CHECK(SerializationError, buf.getLongString()); - EXCEPTION_CHECK(SerializationError, - buf.getRawData(raw_data, sizeof(raw_data))); - - // See if we can skip backwards - buf.pos = 5; - UASSERT(buf.getRawDataNoEx(raw_data, 3) == true); - UASSERT(raw_data[0] == 0x66); - UASSERT(raw_data[1] == 0x77); - UASSERT(raw_data[2] == 0x88); - - UASSERT(buf.getU32() == 0x99AABBCC); - UASSERT(buf.pos == 12); - - // Now let's try it all over again using the NoEx variants - buf.pos = 0; - - UASSERT(buf.getU8NoEx(&u8_data)); - UASSERT(buf.getU16NoEx(&u16_data)); - UASSERT(buf.getU32NoEx(&u32_data)); - UASSERT(buf.getU64NoEx(&u64_data)); - - UASSERT(buf.getS8NoEx(&s8_data)); - UASSERT(buf.getS16NoEx(&s16_data)); - UASSERT(buf.getS32NoEx(&s32_data)); - UASSERT(buf.getS64NoEx(&s64_data)); - - UASSERT(buf.getF1000NoEx(&f32_data)); - UASSERT(buf.getF1000NoEx(&f32_data2)); - UASSERT(buf.getF1000NoEx(&f32_data3)); - UASSERT(buf.getF1000NoEx(&f32_data4)); - - UASSERT(buf.getStringNoEx(&string_data)); - UASSERT(buf.getV2S16NoEx(&v2s16_data)); - UASSERT(buf.getV3S16NoEx(&v3s16_data)); - UASSERT(buf.getV2S32NoEx(&v2s32_data)); - UASSERT(buf.getV3S32NoEx(&v3s32_data)); - UASSERT(buf.getWideStringNoEx(&widestring_data)); - UASSERT(buf.getV3F1000NoEx(&v3f_data)); - UASSERT(buf.getARGB8NoEx(&scolor_data)); - - UASSERT(buf.getLongStringNoEx(&longstring_data)); - - // and make sure we got the correct data - UASSERT(u8_data == 0x11); - UASSERT(u16_data == 0x2233); - UASSERT(u32_data == 0x44556677); - UASSERT(u64_data == 0x8899AABBCCDDEEFFLL); - UASSERT(s8_data == -128); - UASSERT(s16_data == 30000); - UASSERT(s32_data == -6); - UASSERT(s64_data == -43); - UASSERT(f32_data == 53.534f); - UASSERT(f32_data2 == -300000.32f); - UASSERT(f32_data3 == F1000_MIN); - UASSERT(f32_data4 == F1000_MAX); - UASSERT(string_data == "foobar!"); - UASSERT(v2s16_data == v2s16(500, 500)); - UASSERT(v3s16_data == v3s16(4207, 604, -30)); - UASSERT(v2s32_data == v2s32(1920, 1080)); - UASSERT(v3s32_data == v3s32(-400, 6400054, 290549855)); - UASSERT(widestring_data == L"\x02~woof~\x5455"); - UASSERT(v3f_data == v3f(500, 10024.2f, -192.54f)); - UASSERT(scolor_data == video::SColor(255, 128, 50, 128)); - UASSERT(longstring_data == "some longer string here"); - - UASSERT(buf.remaining() == 2); - UASSERT(buf.getRawDataNoEx(raw_data, 3) == false); - UASSERT(buf.remaining() == 2); - UASSERT(buf.getRawDataNoEx(raw_data, 2) == true); - UASSERT(raw_data[0] == 0xF0); - UASSERT(raw_data[1] == 0x0D); - UASSERT(buf.remaining() == 0); - - // Make sure no more available data causes a failure - UASSERT(!buf.getU8NoEx(&u8_data)); - UASSERT(!buf.getU16NoEx(&u16_data)); - UASSERT(!buf.getU32NoEx(&u32_data)); - UASSERT(!buf.getU64NoEx(&u64_data)); - - UASSERT(!buf.getS8NoEx(&s8_data)); - UASSERT(!buf.getS16NoEx(&s16_data)); - UASSERT(!buf.getS32NoEx(&s32_data)); - UASSERT(!buf.getS64NoEx(&s64_data)); - - UASSERT(!buf.getF1000NoEx(&f32_data)); - UASSERT(!buf.getARGB8NoEx(&scolor_data)); - - UASSERT(!buf.getV2S16NoEx(&v2s16_data)); - UASSERT(!buf.getV3S16NoEx(&v3s16_data)); - UASSERT(!buf.getV2S32NoEx(&v2s32_data)); - UASSERT(!buf.getV3S32NoEx(&v3s32_data)); - UASSERT(!buf.getV3F1000NoEx(&v3f_data)); - - UASSERT(!buf.getStringNoEx(&string_data)); - UASSERT(!buf.getWideStringNoEx(&widestring_data)); - UASSERT(!buf.getLongStringNoEx(&longstring_data)); - UASSERT(!buf.getRawDataNoEx(raw_data, sizeof(raw_data))); -} - void TestSerialization::testFloatFormat() { FloatType type = getFloatSerializationType(); @@ -708,7 +424,7 @@ void TestSerialization::testFloatFormat() UASSERT(test_single(i)); } -const u8 TestSerialization::test_serialized_data[12 * 13 - 8] = { +const u8 TestSerialization::test_serialized_data[12 * 11 - 2] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x80, 0x75, 0x30, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x00, 0x00, 0xd1, 0x1e, 0xee, 0x1e, @@ -716,9 +432,7 @@ const u8 TestSerialization::test_serialized_data[12 * 13 - 8] = { 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x21, 0x01, 0xf4, 0x01, 0xf4, 0x10, 0x6f, 0x02, 0x5c, 0xff, 0xe2, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x04, 0x38, 0xff, 0xff, 0xfe, 0x70, 0x00, 0x61, 0xa8, 0x36, 0x11, 0x51, 0x70, - 0x5f, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x7e, 0x00, 'w', 0x00, 'o', 0x00, 'o', 0x00, 'f', 0x00, // \x02~woof~\x5455 - 0x7e, 0x54, 0x55, 0x00, 0x07, 0xa1, 0x20, 0x00, 0x98, 0xf5, 0x08, 0xff, + 0x5f, 0x00, 0x07, 0xa1, 0x20, 0x00, 0x98, 0xf5, 0x08, 0xff, 0xfd, 0x0f, 0xe4, 0xff, 0x80, 0x32, 0x80, 0x00, 0x00, 0x00, 0x17, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x65, 0x72, 0x65, 0xF0, 0x0D, diff --git a/src/unittest/test_server_shutdown_state.cpp b/src/unittest/test_server_shutdown_state.cpp index fbb76ff6a..50305e725 100644 --- a/src/unittest/test_server_shutdown_state.cpp +++ b/src/unittest/test_server_shutdown_state.cpp @@ -26,12 +26,10 @@ with this program; if not, write to the Free Software Foundation, Inc., class FakeServer : public Server { public: - // clang-format off FakeServer() : Server("fakeworld", SubgameSpec("fakespec", "fakespec"), true, Address(), true, nullptr) { } - // clang-format on private: void SendChatMessage(session_t peer_id, const ChatMessage &message) @@ -95,7 +93,7 @@ void TestServerShutdownState::testTrigger() void TestServerShutdownState::testTick() { - std::unique_ptr<FakeServer> fakeServer(new FakeServer()); + auto fakeServer = std::make_unique<FakeServer>(); Server::ShutdownState ss; ss.trigger(28.0f, "testtrigger", true); ss.tick(0.0f, fakeServer.get()); diff --git a/src/unittest/test_servermodmanager.cpp b/src/unittest/test_servermodmanager.cpp index e3edb0c32..91bf5d3a4 100644 --- a/src/unittest/test_servermodmanager.cpp +++ b/src/unittest/test_servermodmanager.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server/mods.h" #include "settings.h" #include "test_config.h" +#include "util/string.h" class TestServerModManager : public TestBase { @@ -48,14 +49,20 @@ static TestServerModManager g_test_instance; void TestServerModManager::runTests(IGameDef *gamedef) { const char *saved_env_mt_subgame_path = getenv("MINETEST_SUBGAME_PATH"); + const char *saved_env_mt_mod_path = getenv("MINETEST_MOD_PATH"); #ifdef WIN32 { std::string subgame_path("MINETEST_SUBGAME_PATH="); subgame_path.append(TEST_SUBGAME_PATH); _putenv(subgame_path.c_str()); + + std::string mod_path("MINETEST_MOD_PATH="); + mod_path.append(TEST_MOD_PATH); + _putenv(mod_path.c_str()); } #else setenv("MINETEST_SUBGAME_PATH", TEST_SUBGAME_PATH, 1); + setenv("MINETEST_MOD_PATH", TEST_MOD_PATH, 1); #endif TEST(testCreation); @@ -75,12 +82,21 @@ void TestServerModManager::runTests(IGameDef *gamedef) if (saved_env_mt_subgame_path) subgame_path.append(saved_env_mt_subgame_path); _putenv(subgame_path.c_str()); + + std::string mod_path("MINETEST_MOD_PATH="); + if (saved_env_mt_mod_path) + mod_path.append(saved_env_mt_mod_path); + _putenv(mod_path.c_str()); } #else if (saved_env_mt_subgame_path) setenv("MINETEST_SUBGAME_PATH", saved_env_mt_subgame_path, 1); else unsetenv("MINETEST_SUBGAME_PATH"); + if (saved_env_mt_mod_path) + setenv("MINETEST_MOD_PATH", saved_env_mt_mod_path, 1); + else + unsetenv("MINETEST_MOD_PATH"); #endif } @@ -89,6 +105,7 @@ void TestServerModManager::testCreation() std::string path = std::string(TEST_WORLDDIR) + DIR_DELIM + "world.mt"; Settings world_config; world_config.set("gameid", "devtest"); + world_config.set("load_mod_test_mod", "true"); UASSERTEQ(bool, world_config.updateConfigFile(path.c_str()), true); ServerModManager sm(TEST_WORLDDIR); } @@ -119,16 +136,21 @@ void TestServerModManager::testGetMods() UASSERTEQ(bool, mods.empty(), false); // Ensure we found basenodes mod (part of devtest) + // and test_mod (for testing MINETEST_MOD_PATH). bool default_found = false; + bool test_mod_found = false; for (const auto &m : mods) { if (m.name == "basenodes") default_found = true; + if (m.name == "test_mod") + test_mod_found = true; // Verify if paths are not empty UASSERTEQ(bool, m.path.empty(), false); } UASSERTEQ(bool, default_found, true); + UASSERTEQ(bool, test_mod_found, true); } void TestServerModManager::testGetModspec() @@ -169,4 +191,11 @@ void TestServerModManager::testGetModMediaPaths() std::vector<std::string> result; sm.getModsMediaPaths(result); UASSERTEQ(bool, result.empty(), false); + + // Test media overriding: + // unittests depends on basenodes to override default_dirt.png, + // thus the unittests texture path must come first in the returned media paths to take priority + auto it = std::find(result.begin(), result.end(), sm.getModSpec("unittests")->path + DIR_DELIM + "textures"); + UASSERT(it != result.end()); + UASSERT(std::find(++it, result.end(), sm.getModSpec("basenodes")->path + DIR_DELIM + "textures") != result.end()); } diff --git a/src/unittest/test_settings.cpp b/src/unittest/test_settings.cpp index f91ba5b67..6b493c9e4 100644 --- a/src/unittest/test_settings.cpp +++ b/src/unittest/test_settings.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <cmath> #include "settings.h" +#include "defaultsettings.h" #include "noise.h" class TestSettings : public TestBase { @@ -31,6 +32,7 @@ public: void runTests(IGameDef *gamedef); void testAllSettings(); + void testDefaults(); void testFlagDesc(); static const char *config_text_before; @@ -42,6 +44,7 @@ static TestSettings g_test_instance; void TestSettings::runTests(IGameDef *gamedef) { TEST(testAllSettings); + TEST(testDefaults); TEST(testFlagDesc); } @@ -70,7 +73,8 @@ const char *TestSettings::config_text_before = " with leading whitespace!\n" "\"\"\"\n" "np_terrain = 5, 40, (250, 250, 250), 12341, 5, 0.7, 2.4\n" - "zoop = true"; + "zoop = true\n" + "[dummy_eof_end_tag]\n"; const std::string TestSettings::config_text_after = "leet = 1337\n" @@ -111,12 +115,34 @@ const std::string TestSettings::config_text_after = " animals = cute\n" " num_apples = 4\n" " num_oranges = 53\n" - "}\n"; + "}\n" + "[dummy_eof_end_tag]"; + +void compare_settings(const std::string &name, Settings *a, Settings *b) +{ + auto keys = a->getNames(); + Settings *group1, *group2; + std::string value1, value2; + for (auto &key : keys) { + if (a->getGroupNoEx(key, group1)) { + UASSERT(b->getGroupNoEx(key, group2)); + + compare_settings(name + "->" + key, group1, group2); + continue; + } + + UASSERT(b->getNoEx(key, value1)); + // For identification + value1 = name + "->" + key + "=" + value1; + value2 = name + "->" + key + "=" + a->get(key); + UASSERTCMP(std::string, ==, value2, value1); + } +} void TestSettings::testAllSettings() { try { - Settings s; + Settings s("[dummy_eof_end_tag]"); // Test reading of settings std::istringstream is(config_text_before); @@ -197,21 +223,44 @@ void TestSettings::testAllSettings() is.clear(); is.seekg(0); - UASSERT(s.updateConfigObject(is, os, "", 0) == true); - //printf(">>>> expected config:\n%s\n", TEST_CONFIG_TEXT_AFTER); - //printf(">>>> actual config:\n%s\n", os.str().c_str()); -#if __cplusplus < 201103L - // This test only works in older C++ versions than C++11 because we use unordered_map - UASSERT(os.str() == config_text_after); -#endif + UASSERT(s.updateConfigObject(is, os, 0) == true); + + { + // Confirm settings + Settings s2("[dummy_eof_end_tag]"); + std::istringstream is(config_text_after, std::ios_base::binary); + UASSERT(s2.parseConfigLines(is) == true); + + compare_settings("(main)", &s, &s2); + } + } catch (SettingNotFoundException &e) { UASSERT(!"Setting not found!"); } } +void TestSettings::testDefaults() +{ + Settings *game = Settings::createLayer(SL_GAME); + Settings *def = Settings::getLayer(SL_DEFAULTS); + + def->set("name", "FooBar"); + UASSERT(def->get("name") == "FooBar"); + UASSERT(game->get("name") == "FooBar"); + + game->set("name", "Baz"); + UASSERT(game->get("name") == "Baz"); + + delete game; + + // Restore default settings + delete Settings::getLayer(SL_DEFAULTS); + set_default_settings(); +} + void TestSettings::testFlagDesc() { - Settings s; + Settings &s = *Settings::createLayer(SL_GAME); FlagDesc flagdesc[] = { { "biomes", 0x01 }, { "trees", 0x02 }, @@ -242,4 +291,6 @@ void TestSettings::testFlagDesc() // Enabled: tables s.set("test_flags", "16"); UASSERT(s.getFlagStr("test_flags", flagdesc, nullptr) == 0x10); + + delete &s; } diff --git a/src/unittest/test_socket.cpp b/src/unittest/test_socket.cpp index 6d5cf334d..620021b59 100644 --- a/src/unittest/test_socket.cpp +++ b/src/unittest/test_socket.cpp @@ -97,11 +97,11 @@ void TestSocket::testIPv4Socket() UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer)) == 0); if (address != Address(0, 0, 0, 0, port)) { - UASSERT(sender.getAddress().sin_addr.s_addr == - address.getAddress().sin_addr.s_addr); + UASSERT(sender.getAddress().s_addr == + address.getAddress().s_addr); } else { - UASSERT(sender.getAddress().sin_addr.s_addr == - Address(127, 0, 0, 1, 0).getAddress().sin_addr.s_addr); + UASSERT(sender.getAddress().s_addr == + Address(127, 0, 0, 1, 0).getAddress().s_addr); } } @@ -128,7 +128,7 @@ void TestSocket::testIPv6Socket() socket6.Bind(address6); - try { + { socket6.Send(Address(&bytes, port), sendbuffer, sizeof(sendbuffer)); sleep_ms(50); @@ -142,10 +142,8 @@ void TestSocket::testIPv6Socket() } //FIXME: This fails on some systems UASSERT(strncmp(sendbuffer, rcvbuffer, sizeof(sendbuffer)) == 0); - UASSERT(memcmp(sender.getAddress6().sin6_addr.s6_addr, - Address(&bytes, 0).getAddress6().sin6_addr.s6_addr, 16) == 0); - } catch (SendFailedException &e) { - errorstream << "IPv6 support enabled but not available!" - << std::endl; + + UASSERT(memcmp(sender.getAddress6().s6_addr, + Address(&bytes, 0).getAddress6().s6_addr, 16) == 0); } } diff --git a/src/unittest/test_utilities.cpp b/src/unittest/test_utilities.cpp index 447b591e1..98a143d1f 100644 --- a/src/unittest/test_utilities.cpp +++ b/src/unittest/test_utilities.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/enriched_string.h" #include "util/numeric.h" #include "util/string.h" +#include "util/base64.h" class TestUtilities : public TestBase { public: @@ -42,7 +43,6 @@ public: void testPadString(); void testStartsWith(); void testStrEqual(); - void testStringTrim(); void testStrToIntConversion(); void testStringReplace(); void testStringAllowed(); @@ -56,6 +56,8 @@ public: void testMyround(); void testStringJoin(); void testEulerConversion(); + void testBase64(); + void testSanitizeDirName(); }; static TestUtilities g_test_instance; @@ -73,7 +75,6 @@ void TestUtilities::runTests(IGameDef *gamedef) TEST(testPadString); TEST(testStartsWith); TEST(testStrEqual); - TEST(testStringTrim); TEST(testStrToIntConversion); TEST(testStringReplace); TEST(testStringAllowed); @@ -87,6 +88,8 @@ void TestUtilities::runTests(IGameDef *gamedef) TEST(testMyround); TEST(testStringJoin); TEST(testEulerConversion); + TEST(testBase64); + TEST(testSanitizeDirName); } //////////////////////////////////////////////////////////////////////////////// @@ -187,6 +190,8 @@ void TestUtilities::testTrim() UASSERT(trim("dirt_with_grass") == "dirt_with_grass"); UASSERT(trim("\n \t\r Foo bAR \r\n\t\t ") == "Foo bAR"); UASSERT(trim("\n \t\r \r\n\t\t ") == ""); + UASSERT(trim(" a") == "a"); + UASSERT(trim("a ") == "a"); } @@ -247,17 +252,8 @@ void TestUtilities::testStartsWith() void TestUtilities::testStrEqual() { - UASSERT(str_equal(narrow_to_wide("abc"), narrow_to_wide("abc"))); - UASSERT(str_equal(narrow_to_wide("ABC"), narrow_to_wide("abc"), true)); -} - - -void TestUtilities::testStringTrim() -{ - UASSERT(trim(" a") == "a"); - UASSERT(trim(" a ") == "a"); - UASSERT(trim("a ") == "a"); - UASSERT(trim("") == ""); + UASSERT(str_equal(utf8_to_wide("abc"), utf8_to_wide("abc"))); + UASSERT(str_equal(utf8_to_wide("ABC"), utf8_to_wide("abc"), true)); } @@ -302,9 +298,18 @@ void TestUtilities::testAsciiPrintableHelper() void TestUtilities::testUTF8() { - UASSERT(wide_to_utf8(utf8_to_wide("")) == ""); - UASSERT(wide_to_utf8(utf8_to_wide("the shovel dug a crumbly node!")) - == "the shovel dug a crumbly node!"); + UASSERT(utf8_to_wide("¤") == L"¤"); + + UASSERT(wide_to_utf8(L"¤") == "¤"); + + UASSERTEQ(std::string, wide_to_utf8(utf8_to_wide("")), ""); + UASSERTEQ(std::string, wide_to_utf8(utf8_to_wide("the shovel dug a crumbly node!")), + "the shovel dug a crumbly node!"); + UASSERTEQ(std::string, wide_to_utf8(utf8_to_wide("-ä-")), + "-ä-"); + UASSERTEQ(std::string, wide_to_utf8(utf8_to_wide("-\xF0\xA0\x80\x8B-")), + "-\xF0\xA0\x80\x8B-"); + } void TestUtilities::testRemoveEscapes() @@ -380,9 +385,9 @@ void TestUtilities::testIsPowerOfTwo() UASSERT(is_power_of_two(2) == true); UASSERT(is_power_of_two(3) == false); for (int exponent = 2; exponent <= 31; ++exponent) { - UASSERT(is_power_of_two((1 << exponent) - 1) == false); - UASSERT(is_power_of_two((1 << exponent)) == true); - UASSERT(is_power_of_two((1 << exponent) + 1) == false); + UASSERT(is_power_of_two((1U << exponent) - 1) == false); + UASSERT(is_power_of_two((1U << exponent)) == true); + UASSERT(is_power_of_two((1U << exponent) + 1) == false); } UASSERT(is_power_of_two(U32_MAX) == false); } @@ -528,3 +533,106 @@ void TestUtilities::testEulerConversion() setPitchYawRoll(m2, v2); UASSERT(within(m1, m2, tolL)); } + +void TestUtilities::testBase64() +{ + // Test character set + UASSERT(base64_is_valid("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/") == true); + UASSERT(base64_is_valid("/+9876543210" + "zyxwvutsrqponmlkjihgfedcba" + "ZYXWVUTSRQPONMLKJIHGFEDCBA") == true); + UASSERT(base64_is_valid("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+.") == false); + UASSERT(base64_is_valid("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789 /") == false); + + // Test empty string + UASSERT(base64_is_valid("") == true); + + // Test different lengths, with and without padding, + // with correct and incorrect padding + UASSERT(base64_is_valid("A") == false); + UASSERT(base64_is_valid("AA") == true); + UASSERT(base64_is_valid("AAA") == true); + UASSERT(base64_is_valid("AAAA") == true); + UASSERT(base64_is_valid("AAAAA") == false); + UASSERT(base64_is_valid("AAAAAA") == true); + UASSERT(base64_is_valid("AAAAAAA") == true); + UASSERT(base64_is_valid("AAAAAAAA") == true); + UASSERT(base64_is_valid("A===") == false); + UASSERT(base64_is_valid("AA==") == true); + UASSERT(base64_is_valid("AAA=") == true); + UASSERT(base64_is_valid("AAAA") == true); + UASSERT(base64_is_valid("AAAA====") == false); + UASSERT(base64_is_valid("AAAAA===") == false); + UASSERT(base64_is_valid("AAAAAA==") == true); + UASSERT(base64_is_valid("AAAAAAA=") == true); + UASSERT(base64_is_valid("AAAAAAA==") == false); + UASSERT(base64_is_valid("AAAAAAA===") == false); + UASSERT(base64_is_valid("AAAAAAA====") == false); + UASSERT(base64_is_valid("AAAAAAAA") == true); + UASSERT(base64_is_valid("AAAAAAAA=") == false); + UASSERT(base64_is_valid("AAAAAAAA==") == false); + UASSERT(base64_is_valid("AAAAAAAA===") == false); + UASSERT(base64_is_valid("AAAAAAAA====") == false); + + // Test if canonical encoding + // Last character limitations, length % 4 == 3 + UASSERT(base64_is_valid("AAB") == false); + UASSERT(base64_is_valid("AAE") == true); + UASSERT(base64_is_valid("AAQ") == true); + UASSERT(base64_is_valid("AAB=") == false); + UASSERT(base64_is_valid("AAE=") == true); + UASSERT(base64_is_valid("AAQ=") == true); + UASSERT(base64_is_valid("AAAAAAB=") == false); + UASSERT(base64_is_valid("AAAAAAE=") == true); + UASSERT(base64_is_valid("AAAAAAQ=") == true); + // Last character limitations, length % 4 == 2 + UASSERT(base64_is_valid("AB") == false); + UASSERT(base64_is_valid("AE") == false); + UASSERT(base64_is_valid("AQ") == true); + UASSERT(base64_is_valid("AB==") == false); + UASSERT(base64_is_valid("AE==") == false); + UASSERT(base64_is_valid("AQ==") == true); + UASSERT(base64_is_valid("AAAAAB==") == false); + UASSERT(base64_is_valid("AAAAAE==") == false); + UASSERT(base64_is_valid("AAAAAQ==") == true); + + // Extraneous character present + UASSERT(base64_is_valid(".") == false); + UASSERT(base64_is_valid("A.") == false); + UASSERT(base64_is_valid("AA.") == false); + UASSERT(base64_is_valid("AAA.") == false); + UASSERT(base64_is_valid("AAAA.") == false); + UASSERT(base64_is_valid("AAAAA.") == false); + UASSERT(base64_is_valid("A.A") == false); + UASSERT(base64_is_valid("AA.A") == false); + UASSERT(base64_is_valid("AAA.A") == false); + UASSERT(base64_is_valid("AAAA.A") == false); + UASSERT(base64_is_valid("AAAAA.A") == false); + UASSERT(base64_is_valid("\xE1""AAA") == false); + + // Padding in wrong position + UASSERT(base64_is_valid("A=A") == false); + UASSERT(base64_is_valid("AA=A") == false); + UASSERT(base64_is_valid("AAA=A") == false); + UASSERT(base64_is_valid("AAAA=A") == false); + UASSERT(base64_is_valid("AAAAA=A") == false); +} + + +void TestUtilities::testSanitizeDirName() +{ + UASSERT(sanitizeDirName("a", "~") == "a"); + UASSERT(sanitizeDirName(" ", "~") == "__"); + UASSERT(sanitizeDirName(" a ", "~") == "_a_"); + UASSERT(sanitizeDirName("COM1", "~") == "~COM1"); + UASSERT(sanitizeDirName("COM1", ":") == "_COM1"); + UASSERT(sanitizeDirName("cOm\u00B2", "~") == "~cOm\u00B2"); + UASSERT(sanitizeDirName("cOnIn$", "~") == "~cOnIn$"); + UASSERT(sanitizeDirName(" cOnIn$ ", "~") == "_cOnIn$_"); +} diff --git a/src/unittest/test_voxelarea.cpp b/src/unittest/test_voxelarea.cpp index 6ec0412d5..a79c9778e 100644 --- a/src/unittest/test_voxelarea.cpp +++ b/src/unittest/test_voxelarea.cpp @@ -30,6 +30,7 @@ public: void test_addarea(); void test_pad(); + void test_extent(); void test_volume(); void test_contains_voxelarea(); void test_contains_point(); @@ -65,6 +66,7 @@ void TestVoxelArea::runTests(IGameDef *gamedef) { TEST(test_addarea); TEST(test_pad); + TEST(test_extent); TEST(test_volume); TEST(test_contains_voxelarea); TEST(test_contains_point); @@ -113,10 +115,22 @@ void TestVoxelArea::test_pad() UASSERT(v1.MaxEdge == v3s16(-47, -9347, 969)); } +void TestVoxelArea::test_extent() +{ + VoxelArea v1(v3s16(-1337, -547, -789), v3s16(-147, 447, 669)); + UASSERT(v1.getExtent() == v3s16(1191, 995, 1459)); + + VoxelArea v2(v3s16(32493, -32507, 32752), v3s16(32508, -32492, 32767)); + UASSERT(v2.getExtent() == v3s16(16, 16, 16)); +} + void TestVoxelArea::test_volume() { - VoxelArea v1(v3s16(-1337, 447, -789), v3s16(-147, -9547, 669)); - UASSERTEQ(s32, v1.getVolume(), -184657133); + VoxelArea v1(v3s16(-1337, -547, -789), v3s16(-147, 447, 669)); + UASSERTEQ(s32, v1.getVolume(), 1728980655); + + VoxelArea v2(v3s16(32493, -32507, 32752), v3s16(32508, -32492, 32767)); + UASSERTEQ(s32, v2.getVolume(), 4096); } void TestVoxelArea::test_contains_voxelarea() diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index cd2e468d1..6bc97915f 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -15,4 +15,5 @@ set(UTIL_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/string.cpp ${CMAKE_CURRENT_SOURCE_DIR}/srp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/timetaker.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/png.cpp PARENT_SCOPE) diff --git a/src/util/Optional.h b/src/util/Optional.h new file mode 100644 index 000000000..eda7fff89 --- /dev/null +++ b/src/util/Optional.h @@ -0,0 +1,105 @@ +/* +Minetest +Copyright (C) 2021 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. +*/ + +#pragma once + +#include <utility> +#include "debug.h" + +struct nullopt_t +{ +}; +constexpr nullopt_t nullopt{}; + +/** + * An implementation of optional for C++11, which aims to be + * compatible with a subset of std::optional features. + * + * Unfortunately, Minetest doesn't use C++17 yet. + * + * @tparam T The type to be stored + */ +template <typename T> +class Optional +{ + bool m_has_value = false; + T m_value; + +public: + Optional() noexcept {} + Optional(nullopt_t) noexcept {} + + Optional(const T &value) noexcept : m_has_value(true), m_value(value) {} + Optional(T &&value) noexcept : m_has_value(true), m_value(std::move(value)) {} + + Optional(const Optional<T> &other) noexcept : + m_has_value(other.m_has_value), m_value(other.m_value) + {} + Optional(Optional<T> &&other) noexcept : + m_has_value(other.m_has_value), m_value(std::move(other.m_value)) + { + other.m_has_value = false; + } + + Optional<T> &operator=(nullopt_t) noexcept { m_has_value = false; return *this; } + + Optional<T> &operator=(const Optional<T> &other) noexcept + { + if (&other == this) + return *this; + m_has_value = other.m_has_value; + m_value = other.m_value; + return *this; + } + + Optional<T> &operator=(Optional<T> &&other) noexcept + { + if (&other == this) + return *this; + m_has_value = other.m_has_value; + m_value = std::move(other.m_value); + other.m_has_value = false; + return *this; + } + + T &value() + { + FATAL_ERROR_IF(!m_has_value, "optional doesn't have value"); + return m_value; + } + + const T &value() const + { + FATAL_ERROR_IF(!m_has_value, "optional doesn't have value"); + return m_value; + } + + const T &value_or(const T &def) const { return m_has_value ? m_value : def; } + + // Unchecked access consistent with std::optional + T* operator->() { return &m_value; } + const T* operator->() const { return &m_value; } + + T& operator*() { return m_value; } + const T& operator*() const { return m_value; } + + bool has_value() const noexcept { return m_has_value; } + + explicit operator bool() const { return m_has_value; } +}; diff --git a/src/util/areastore.cpp b/src/util/areastore.cpp index cea526336..bf751476f 100644 --- a/src/util/areastore.cpp +++ b/src/util/areastore.cpp @@ -96,16 +96,15 @@ void AreaStore::deserialize(std::istream &is) u16 num_areas = readU16(is); std::vector<Area> areas; + areas.reserve(num_areas); for (u32 i = 0; i < num_areas; ++i) { Area a(U32_MAX); a.minedge = readV3S16(is); a.maxedge = readV3S16(is); u16 data_len = readU16(is); - char *data = new char[data_len]; - is.read(data, data_len); - a.data = std::string(data, data_len); - areas.emplace_back(a); - delete [] data; + a.data = std::string(data_len, '\0'); + is.read(&a.data[0], data_len); + areas.emplace_back(std::move(a)); } bool read_ids = is.good(); // EOF for old formats @@ -309,6 +308,7 @@ void SpatialAreaStore::getAreasInArea(std::vector<Area *> *result, SpatialAreaStore::~SpatialAreaStore() { delete m_tree; + delete m_storagemanager; } SpatialAreaStore::SpatialAreaStore() diff --git a/src/util/base64.cpp b/src/util/base64.cpp index 6e1584410..0c2455222 100644 --- a/src/util/base64.cpp +++ b/src/util/base64.cpp @@ -33,18 +33,39 @@ static const std::string base64_chars = "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; +static const std::string base64_chars_padding_1 = "AEIMQUYcgkosw048"; +static const std::string base64_chars_padding_2 = "AQgw"; static inline bool is_base64(unsigned char c) { - return isalnum(c) || c == '+' || c == '/' || c == '='; + return (c >= '0' && c <= '9') + || (c >= 'A' && c <= 'Z') + || (c >= 'a' && c <= 'z') + || c == '+' || c == '/'; } bool base64_is_valid(std::string const& s) { - for (char i : s) - if (!is_base64(i)) + size_t i = 0; + for (; i < s.size(); ++i) + if (!is_base64(s[i])) + break; + unsigned char padding = 3 - ((i + 3) % 4); + if ((padding == 1 && base64_chars_padding_1.find(s[i - 1]) == std::string::npos) + || (padding == 2 && base64_chars_padding_2.find(s[i - 1]) == std::string::npos) + || padding == 3) + return false; + int actual_padding = s.size() - i; + // omission of padding characters is allowed + if (actual_padding == 0) + return true; + + // remaining characters (max. 2) may only be padding + for (; i < s.size(); ++i) + if (s[i] != '=') return false; - return true; + // number of padding characters needs to match + return padding == actual_padding; } std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { diff --git a/src/util/basic_macros.h b/src/util/basic_macros.h index 334e342e0..3910c6185 100644 --- a/src/util/basic_macros.h +++ b/src/util/basic_macros.h @@ -29,13 +29,19 @@ with this program; if not, write to the Free Software Foundation, Inc., #define CONTAINS(c, v) (std::find((c).begin(), (c).end(), (v)) != (c).end()) // To disable copy constructors and assignment operations for some class -// 'Foobar', add the macro DISABLE_CLASS_COPY(Foobar) as a private member. +// 'Foobar', add the macro DISABLE_CLASS_COPY(Foobar) in the class definition. // Note this also disables copying for any classes derived from 'Foobar' as well // as classes having a 'Foobar' member. #define DISABLE_CLASS_COPY(C) \ C(const C &) = delete; \ C &operator=(const C &) = delete; +// If you have used DISABLE_CLASS_COPY with a class but still want to permit moving +// use this macro to add the default move constructors back. +#define ALLOW_CLASS_MOVE(C) \ + C(C &&other) = default; \ + C &operator=(C &&) = default; + #ifndef _MSC_VER #define UNUSED_ATTRIBUTE __attribute__ ((unused)) #else diff --git a/src/util/container.h b/src/util/container.h index 2ad2bbfc7..001066563 100644 --- a/src/util/container.h +++ b/src/util/container.h @@ -90,8 +90,7 @@ public: bool get(const Key &name, Value *result) const { MutexAutoLock lock(m_mutex); - typename std::map<Key, Value>::const_iterator n = - m_values.find(name); + auto n = m_values.find(name); if (n == m_values.end()) return false; if (result) @@ -103,11 +102,9 @@ public: { MutexAutoLock lock(m_mutex); std::vector<Value> result; - for (typename std::map<Key, Value>::const_iterator - it = m_values.begin(); - it != m_values.end(); ++it){ + result.reserve(m_values.size()); + for (auto it = m_values.begin(); it != m_values.end(); ++it) result.push_back(it->second); - } return result; } @@ -136,13 +133,20 @@ public: return m_queue.empty(); } - void push_back(T t) + void push_back(const T &t) { MutexAutoLock lock(m_mutex); m_queue.push_back(t); m_signal.post(); } + void push_back(T &&t) + { + MutexAutoLock lock(m_mutex); + m_queue.push_back(std::move(t)); + m_signal.post(); + } + /* this version of pop_front returns a empty element of T on timeout. * Make sure default constructor of T creates a recognizable "empty" element */ @@ -151,7 +155,7 @@ public: if (m_signal.wait(wait_time_max_ms)) { MutexAutoLock lock(m_mutex); - T t = m_queue.front(); + T t = std::move(m_queue.front()); m_queue.pop_front(); return t; } @@ -164,7 +168,7 @@ public: if (m_signal.wait(wait_time_max_ms)) { MutexAutoLock lock(m_mutex); - T t = m_queue.front(); + T t = std::move(m_queue.front()); m_queue.pop_front(); return t; } @@ -178,7 +182,7 @@ public: MutexAutoLock lock(m_mutex); - T t = m_queue.front(); + T t = std::move(m_queue.front()); m_queue.pop_front(); return t; } @@ -188,7 +192,7 @@ public: if (m_signal.wait(wait_time_max_ms)) { MutexAutoLock lock(m_mutex); - T t = m_queue.back(); + T t = std::move(m_queue.back()); m_queue.pop_back(); return t; } @@ -204,7 +208,7 @@ public: if (m_signal.wait(wait_time_max_ms)) { MutexAutoLock lock(m_mutex); - T t = m_queue.back(); + T t = std::move(m_queue.back()); m_queue.pop_back(); return t; } @@ -218,7 +222,7 @@ public: MutexAutoLock lock(m_mutex); - T t = m_queue.back(); + T t = std::move(m_queue.back()); m_queue.pop_back(); return t; } diff --git a/src/util/enriched_string.cpp b/src/util/enriched_string.cpp index 762d094eb..941f8b08d 100644 --- a/src/util/enriched_string.cpp +++ b/src/util/enriched_string.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2013 xyz, Ilya Zhuravlev <whatever@xyz.is> -Copyright (C) 2016 Nore, Nathanaël Courant <nore@mesecons.net> +Copyright (C) 2016 Nore, Nathanaëlle Courant <nore@mesecons.net> 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 @@ -65,12 +65,14 @@ void EnrichedString::operator=(const wchar_t *str) addAtEnd(translate_string(std::wstring(str)), m_default_color); } -void EnrichedString::addAtEnd(const std::wstring &s, const SColor &initial_color) +void EnrichedString::addAtEnd(const std::wstring &s, SColor initial_color) { SColor color(initial_color); bool use_default = (m_default_length == m_string.size() && color == m_default_color); + m_colors.reserve(m_colors.size() + s.size()); + size_t i = 0; while (i < s.length()) { if (s[i] != L'\x1b') { @@ -200,12 +202,6 @@ const std::wstring &EnrichedString::getString() const return m_string; } -void EnrichedString::setDefaultColor(const irr::video::SColor &color) -{ - m_default_color = color; - updateDefaultColor(); -} - void EnrichedString::updateDefaultColor() { sanity_check(m_default_length <= m_colors.size()); diff --git a/src/util/enriched_string.h b/src/util/enriched_string.h index c8a095887..4e249eac5 100644 --- a/src/util/enriched_string.h +++ b/src/util/enriched_string.h @@ -1,6 +1,6 @@ /* Copyright (C) 2013 xyz, Ilya Zhuravlev <whatever@xyz.is> -Copyright (C) 2016 Nore, Nathanaël Courant <nore@mesecons.net> +Copyright (C) 2016 Nore, Nathanaëlle Courant <nore@mesecons.net> 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 @@ -23,18 +23,22 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <vector> #include <SColor.h> +using namespace irr; + class EnrichedString { public: EnrichedString(); EnrichedString(const std::wstring &s, - const irr::video::SColor &color = irr::video::SColor(255, 255, 255, 255)); + const video::SColor &color = video::SColor(255, 255, 255, 255)); EnrichedString(const wchar_t *str, - const irr::video::SColor &color = irr::video::SColor(255, 255, 255, 255)); + const video::SColor &color = video::SColor(255, 255, 255, 255)); EnrichedString(const std::wstring &string, - const std::vector<irr::video::SColor> &colors); - void clear(); + const std::vector<video::SColor> &colors); void operator=(const wchar_t *str); - void addAtEnd(const std::wstring &s, const irr::video::SColor &color); + + void clear(); + + void addAtEnd(const std::wstring &s, video::SColor color); // Adds the character source[i] at the end. // An EnrichedString should always be able to be copied @@ -49,12 +53,16 @@ public: EnrichedString operator+(const EnrichedString &other) const; void operator+=(const EnrichedString &other); const wchar_t *c_str() const; - const std::vector<irr::video::SColor> &getColors() const; + const std::vector<video::SColor> &getColors() const; const std::wstring &getString() const; - void setDefaultColor(const irr::video::SColor &color); + inline void setDefaultColor(video::SColor color) + { + m_default_color = color; + updateDefaultColor(); + } void updateDefaultColor(); - inline const irr::video::SColor &getDefaultColor() const + inline const video::SColor &getDefaultColor() const { return m_default_color; } @@ -80,11 +88,11 @@ public: { return m_has_background; } - inline irr::video::SColor getBackground() const + inline video::SColor getBackground() const { return m_background; } - inline void setBackground(const irr::video::SColor &color) + inline void setBackground(video::SColor color) { m_background = color; m_has_background = true; @@ -92,10 +100,10 @@ public: private: std::wstring m_string; - std::vector<irr::video::SColor> m_colors; + std::vector<video::SColor> m_colors; bool m_has_background; - irr::video::SColor m_default_color; - irr::video::SColor m_background; + video::SColor m_default_color; + video::SColor m_background; // This variable defines the length of the default-colored text. // Change this to a std::vector if an "end coloring" tag is wanted. size_t m_default_length = 0; diff --git a/src/util/ieee_float.cpp b/src/util/ieee_float.cpp index 887258921..b73763c55 100644 --- a/src/util/ieee_float.cpp +++ b/src/util/ieee_float.cpp @@ -39,7 +39,7 @@ f32 u32Tof32Slow(u32 i) if (exp == 0xFF) { // Inf/NaN if (imant == 0) { - if (std::numeric_limits<f32>::has_infinity) + if (std::numeric_limits<f32>::has_infinity) return sign ? -std::numeric_limits<f32>::infinity() : std::numeric_limits<f32>::infinity(); return sign ? std::numeric_limits<f32>::max() : diff --git a/src/util/metricsbackend.cpp b/src/util/metricsbackend.cpp index 4454557a3..63b49ac0a 100644 --- a/src/util/metricsbackend.cpp +++ b/src/util/metricsbackend.cpp @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "metricsbackend.h" +#include "util/thread.h" #if USE_PROMETHEUS #include <prometheus/exposer.h> #include <prometheus/registry.h> @@ -27,18 +28,78 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #endif -MetricCounterPtr MetricsBackend::addCounter( - const std::string &name, const std::string &help_str) +/* Plain implementation */ + +class SimpleMetricCounter : public MetricCounter { - return std::make_shared<SimpleMetricCounter>(name, help_str); +public: + SimpleMetricCounter() : MetricCounter(), m_counter(0.0) {} + + virtual ~SimpleMetricCounter() {} + + void increment(double number) override + { + MutexAutoLock lock(m_mutex); + m_counter += number; + } + double get() const override + { + MutexAutoLock lock(m_mutex); + return m_counter; + } + +private: + mutable std::mutex m_mutex; + double m_counter; +}; + +class SimpleMetricGauge : public MetricGauge +{ +public: + SimpleMetricGauge() : MetricGauge(), m_gauge(0.0) {} + + virtual ~SimpleMetricGauge() {} + + void increment(double number) override + { + MutexAutoLock lock(m_mutex); + m_gauge += number; + } + void decrement(double number) override + { + MutexAutoLock lock(m_mutex); + m_gauge -= number; + } + void set(double number) override + { + MutexAutoLock lock(m_mutex); + m_gauge = number; + } + double get() const override + { + MutexAutoLock lock(m_mutex); + return m_gauge; + } + +private: + mutable std::mutex m_mutex; + double m_gauge; +}; + +MetricCounterPtr MetricsBackend::addCounter( + const std::string &name, const std::string &help_str, Labels labels) +{ + return std::make_shared<SimpleMetricCounter>(); } MetricGaugePtr MetricsBackend::addGauge( - const std::string &name, const std::string &help_str) + const std::string &name, const std::string &help_str, Labels labels) { - return std::make_shared<SimpleMetricGauge>(name, help_str); + return std::make_shared<SimpleMetricGauge>(); } +/* Prometheus backend */ + #if USE_PROMETHEUS class PrometheusMetricCounter : public MetricCounter @@ -47,13 +108,14 @@ public: PrometheusMetricCounter() = delete; PrometheusMetricCounter(const std::string &name, const std::string &help_str, + MetricsBackend::Labels labels, std::shared_ptr<prometheus::Registry> registry) : MetricCounter(), m_family(prometheus::BuildCounter() .Name(name) .Help(help_str) .Register(*registry)), - m_counter(m_family.Add({})) + m_counter(m_family.Add(labels)) { } @@ -73,13 +135,14 @@ public: PrometheusMetricGauge() = delete; PrometheusMetricGauge(const std::string &name, const std::string &help_str, + MetricsBackend::Labels labels, std::shared_ptr<prometheus::Registry> registry) : MetricGauge(), m_family(prometheus::BuildGauge() .Name(name) .Help(help_str) .Register(*registry)), - m_gauge(m_family.Add({})) + m_gauge(m_family.Add(labels)) { } @@ -99,8 +162,7 @@ class PrometheusMetricsBackend : public MetricsBackend { public: PrometheusMetricsBackend(const std::string &addr) : - MetricsBackend(), m_exposer(std::unique_ptr<prometheus::Exposer>( - new prometheus::Exposer(addr))), + MetricsBackend(), m_exposer(std::make_unique<prometheus::Exposer>(addr)), m_registry(std::make_shared<prometheus::Registry>()) { m_exposer->RegisterCollectable(m_registry); @@ -108,10 +170,12 @@ public: virtual ~PrometheusMetricsBackend() {} - virtual MetricCounterPtr addCounter( - const std::string &name, const std::string &help_str); - virtual MetricGaugePtr addGauge( - const std::string &name, const std::string &help_str); + MetricCounterPtr addCounter( + const std::string &name, const std::string &help_str, + Labels labels = {}) override; + MetricGaugePtr addGauge( + const std::string &name, const std::string &help_str, + Labels labels = {}) override; private: std::unique_ptr<prometheus::Exposer> m_exposer; @@ -119,15 +183,15 @@ private: }; MetricCounterPtr PrometheusMetricsBackend::addCounter( - const std::string &name, const std::string &help_str) + const std::string &name, const std::string &help_str, Labels labels) { - return std::make_shared<PrometheusMetricCounter>(name, help_str, m_registry); + return std::make_shared<PrometheusMetricCounter>(name, help_str, labels, m_registry); } MetricGaugePtr PrometheusMetricsBackend::addGauge( - const std::string &name, const std::string &help_str) + const std::string &name, const std::string &help_str, Labels labels) { - return std::make_shared<PrometheusMetricGauge>(name, help_str, m_registry); + return std::make_shared<PrometheusMetricGauge>(name, help_str, labels, m_registry); } MetricsBackend *createPrometheusMetricsBackend() diff --git a/src/util/metricsbackend.h b/src/util/metricsbackend.h index c37306392..644c73325 100644 --- a/src/util/metricsbackend.h +++ b/src/util/metricsbackend.h @@ -19,8 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include <memory> +#include <string> +#include <utility> #include "config.h" -#include "util/thread.h" class MetricCounter { @@ -35,38 +36,6 @@ public: typedef std::shared_ptr<MetricCounter> MetricCounterPtr; -class SimpleMetricCounter : public MetricCounter -{ -public: - SimpleMetricCounter() = delete; - - virtual ~SimpleMetricCounter() {} - - SimpleMetricCounter(const std::string &name, const std::string &help_str) : - MetricCounter(), m_name(name), m_help_str(help_str), - m_counter(0.0) - { - } - - virtual void increment(double number) - { - MutexAutoLock lock(m_mutex); - m_counter += number; - } - virtual double get() const - { - MutexAutoLock lock(m_mutex); - return m_counter; - } - -private: - std::string m_name; - std::string m_help_str; - - mutable std::mutex m_mutex; - double m_counter; -}; - class MetricGauge { public: @@ -81,47 +50,6 @@ public: typedef std::shared_ptr<MetricGauge> MetricGaugePtr; -class SimpleMetricGauge : public MetricGauge -{ -public: - SimpleMetricGauge() = delete; - - SimpleMetricGauge(const std::string &name, const std::string &help_str) : - MetricGauge(), m_name(name), m_help_str(help_str), m_gauge(0.0) - { - } - - virtual ~SimpleMetricGauge() {} - - virtual void increment(double number) - { - MutexAutoLock lock(m_mutex); - m_gauge += number; - } - virtual void decrement(double number) - { - MutexAutoLock lock(m_mutex); - m_gauge -= number; - } - virtual void set(double number) - { - MutexAutoLock lock(m_mutex); - m_gauge = number; - } - virtual double get() const - { - MutexAutoLock lock(m_mutex); - return m_gauge; - } - -private: - std::string m_name; - std::string m_help_str; - - mutable std::mutex m_mutex; - double m_gauge; -}; - class MetricsBackend { public: @@ -129,10 +57,14 @@ public: virtual ~MetricsBackend() {} + typedef std::initializer_list<std::pair<const std::string, std::string>> Labels; + virtual MetricCounterPtr addCounter( - const std::string &name, const std::string &help_str); + const std::string &name, const std::string &help_str, + Labels labels = {}); virtual MetricGaugePtr addGauge( - const std::string &name, const std::string &help_str); + const std::string &name, const std::string &help_str, + Labels labels = {}); }; #if USE_PROMETHEUS diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp index 1af3f66be..aa3bb843d 100644 --- a/src/util/numeric.cpp +++ b/src/util/numeric.cpp @@ -46,11 +46,22 @@ void myrand_bytes(void *out, size_t len) g_pcgrand.bytes(out, len); } +float myrand_float() +{ + u32 uv = g_pcgrand.next(); + return (float)uv / (float)U32_MAX; +} + int myrand_range(int min, int max) { return g_pcgrand.range(min, max); } +float myrand_range(float min, float max) +{ + return (max-min) * myrand_float() + min; +} + /* 64-bit unaligned version of MurmurHash @@ -106,10 +117,6 @@ u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed) bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, f32 camera_fov, f32 range, f32 *distance_ptr) { - // Maximum radius of a block. The magic number is - // sqrt(3.0) / 2.0 in literal form. - static constexpr const f32 block_max_radius = 0.866025403784f * MAP_BLOCKSIZE * BS; - v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE; // Block center position @@ -123,7 +130,7 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, v3f blockpos_relative = blockpos - camera_pos; // Total distance - f32 d = MYMAX(0, blockpos_relative.getLength() - block_max_radius); + f32 d = MYMAX(0, blockpos_relative.getLength() - BLOCK_MAX_RADIUS); if (distance_ptr) *distance_ptr = d; @@ -141,7 +148,7 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, // such that a block that has any portion visible with the // current camera position will have the center visible at the // adjusted postion - f32 adjdist = block_max_radius / cos((M_PI - camera_fov) / 2); + f32 adjdist = BLOCK_MAX_RADIUS / cos((M_PI - camera_fov) / 2); // Block position relative to adjusted camera v3f blockpos_adj = blockpos - (camera_pos - camera_dir * adjdist); @@ -163,7 +170,7 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, return true; } -s16 adjustDist(s16 dist, float zoom_fov) +inline float adjustDist(float dist, float zoom_fov) { // 1.775 ~= 72 * PI / 180 * 1.4, the default FOV on the client. // The heuristic threshold for zooming is half of that. @@ -171,8 +178,13 @@ s16 adjustDist(s16 dist, float zoom_fov) if (zoom_fov < 0.001f || zoom_fov > threshold_fov) return dist; - return std::round(dist * std::cbrt((1.0f - std::cos(threshold_fov)) / - (1.0f - std::cos(zoom_fov / 2.0f)))); + return dist * std::cbrt((1.0f - std::cos(threshold_fov)) / + (1.0f - std::cos(zoom_fov / 2.0f))); +} + +s16 adjustDist(s16 dist, float zoom_fov) +{ + return std::round(adjustDist((float)dist, zoom_fov)); } void setPitchYawRollRad(core::matrix4 &m, const v3f &rot) diff --git a/src/util/numeric.h b/src/util/numeric.h index 864ab7543..265046a63 100644 --- a/src/util/numeric.h +++ b/src/util/numeric.h @@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once #include "basic_macros.h" +#include "constants.h" #include "irrlichttypes.h" #include "irr_v2d.h" #include "irr_v3d.h" @@ -36,6 +37,9 @@ with this program; if not, write to the Free Software Foundation, Inc., y = temp; \ } while (0) +// Maximum radius of a block. The magic number is +// sqrt(3.0) / 2.0 in literal form. +static constexpr const f32 BLOCK_MAX_RADIUS = 0.866025403784f * MAP_BLOCKSIZE * BS; inline s16 getContainerPos(s16 p, s16 d) { @@ -219,6 +223,8 @@ u32 myrand(); void mysrand(unsigned int seed); void myrand_bytes(void *out, size_t len); int myrand_range(int min, int max); +float myrand_range(float min, float max); +float myrand_float(); /* Miscellaneous functions @@ -442,3 +448,24 @@ inline irr::video::SColor multiplyColorValue(const irr::video::SColor &color, fl core::clamp<u32>(color.getGreen() * mod, 0, 255), core::clamp<u32>(color.getBlue() * mod, 0, 255)); } + +template <typename T> inline T numericAbsolute(T v) { return v < 0 ? T(-v) : v; } +template <typename T> inline T numericSign(T v) { return T(v < 0 ? -1 : (v == 0 ? 0 : 1)); } + +inline v3f vecAbsolute(v3f v) +{ + return v3f( + numericAbsolute(v.X), + numericAbsolute(v.Y), + numericAbsolute(v.Z) + ); +} + +inline v3f vecSign(v3f v) +{ + return v3f( + numericSign(v.X), + numericSign(v.Y), + numericSign(v.Z) + ); +} diff --git a/src/util/png.cpp b/src/util/png.cpp new file mode 100755 index 000000000..698cbc9a5 --- /dev/null +++ b/src/util/png.cpp @@ -0,0 +1,68 @@ +/* +Minetest +Copyright (C) 2021 hecks + +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. +*/ + +#include "png.h" +#include <string> +#include <sstream> +#include <zlib.h> +#include <cassert> +#include "util/serialize.h" +#include "serialization.h" +#include "irrlichttypes.h" + +static void writeChunk(std::ostringstream &target, const std::string &chunk_str) +{ + assert(chunk_str.size() >= 4); + assert(chunk_str.size() - 4 < U32_MAX); + writeU32(target, chunk_str.size() - 4); // Write length minus the identifier + target << chunk_str; + writeU32(target, crc32(0,(const u8*)chunk_str.data(), chunk_str.size())); +} + +std::string encodePNG(const u8 *data, u32 width, u32 height, s32 compression) +{ + std::ostringstream file(std::ios::binary); + file << "\x89PNG\r\n\x1a\n"; + + { + std::ostringstream IHDR(std::ios::binary); + IHDR << "IHDR"; + writeU32(IHDR, width); + writeU32(IHDR, height); + // 8 bpp, color type 6 (RGBA) + IHDR.write("\x08\x06\x00\x00\x00", 5); + writeChunk(file, IHDR.str()); + } + + { + std::ostringstream IDAT(std::ios::binary); + IDAT << "IDAT"; + std::ostringstream scanlines(std::ios::binary); + for(u32 i = 0; i < height; i++) { + scanlines.write("\x00", 1); // Null predictor + scanlines.write((const char*) data + width * 4 * i, width * 4); + } + compressZlib(scanlines.str(), IDAT, compression); + writeChunk(file, IDAT.str()); + } + + file.write("\x00\x00\x00\x00IEND\xae\x42\x60\x82", 12); + + return file.str(); +} diff --git a/src/content/packages.h b/src/util/png.h old mode 100644 new mode 100755 similarity index 52% rename from src/content/packages.h rename to src/util/png.h index 9029475ef..92387aef0 --- a/src/content/packages.h +++ b/src/util/png.h @@ -1,6 +1,6 @@ /* Minetest -Copyright (C) 2018 rubenwardy <rw@rubenwardy.com> +Copyright (C) 2021 hecks 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 @@ -18,35 +18,10 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #pragma once -#include "config.h" -#include "convert_json.h" + +#include <string> #include "irrlichttypes.h" -struct Package -{ - std::string author; - std::string name; // Technical name - std::string title; - std::string type; // One of "mod", "game", or "txp" - - std::string shortDesc; - u32 release; - std::string thumbnail; - - bool valid() const - { - return !(author.empty() || name.empty() || title.empty() || - type.empty() || release <= 0); - } - - std::string getDownloadURL(const std::string &baseURL) const; -}; - -#if USE_CURL -std::vector<Package> getPackagesFromURL(const std::string &url); -#else -inline std::vector<Package> getPackagesFromURL(const std::string &url) -{ - return std::vector<Package>(); -} -#endif +/* Simple PNG encoder. Encodes an RGBA image with no predictors. + Returns a binary string. */ +std::string encodePNG(const u8 *data, u32 width, u32 height, s32 compression); diff --git a/src/util/pointer.h b/src/util/pointer.h index d29ec8739..b659cea0e 100644 --- a/src/util/pointer.h +++ b/src/util/pointer.h @@ -22,6 +22,21 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes.h" #include "debug.h" // For assert() #include <cstring> +#include <memory> // std::shared_ptr + + +template<typename T> class ConstSharedPtr { +public: + ConstSharedPtr(T *ptr) : ptr(ptr) {} + ConstSharedPtr(const std::shared_ptr<T> &ptr) : ptr(ptr) {} + + const T* get() const noexcept { return ptr.get(); } + const T& operator*() const noexcept { return *ptr.get(); } + const T* operator->() const noexcept { return ptr.get(); } + +private: + std::shared_ptr<T> ptr; +}; template <typename T> class Buffer @@ -30,7 +45,7 @@ public: Buffer() { m_size = 0; - data = NULL; + data = nullptr; } Buffer(unsigned int size) { @@ -38,19 +53,26 @@ public: if(size != 0) data = new T[size]; else - data = NULL; + data = nullptr; } - Buffer(const Buffer &buffer) + + // Disable class copy + Buffer(const Buffer &) = delete; + Buffer &operator=(const Buffer &) = delete; + + Buffer(Buffer &&buffer) { m_size = buffer.m_size; if(m_size != 0) { - data = new T[buffer.m_size]; - memcpy(data, buffer.data, buffer.m_size); + data = buffer.data; + buffer.data = nullptr; + buffer.m_size = 0; } else - data = NULL; + data = nullptr; } + // Copies whole buffer Buffer(const T *t, unsigned int size) { m_size = size; @@ -60,13 +82,15 @@ public: memcpy(data, t, size); } else - data = NULL; + data = nullptr; } + ~Buffer() { drop(); } - Buffer& operator=(const Buffer &buffer) + + Buffer& operator=(Buffer &&buffer) { if(this == &buffer) return *this; @@ -74,13 +98,27 @@ public: m_size = buffer.m_size; if(m_size != 0) { - data = new T[buffer.m_size]; - memcpy(data, buffer.data, buffer.m_size); + data = buffer.data; + buffer.data = nullptr; + buffer.m_size = 0; } else - data = NULL; + data = nullptr; return *this; } + + void copyTo(Buffer &buffer) const + { + buffer.drop(); + buffer.m_size = m_size; + if (m_size != 0) { + buffer.data = new T[m_size]; + memcpy(buffer.data, data, m_size); + } else { + buffer.data = nullptr; + } + } + T & operator[](unsigned int i) const { return data[i]; @@ -89,10 +127,12 @@ public: { return data; } + unsigned int getSize() const { return m_size; } + private: void drop() { @@ -126,7 +166,7 @@ public: if(m_size != 0) data = new T[m_size]; else - data = NULL; + data = nullptr; refcount = new unsigned int; memset(data,0,sizeof(T)*m_size); (*refcount) = 1; @@ -161,7 +201,7 @@ public: memcpy(data, t, m_size); } else - data = NULL; + data = nullptr; refcount = new unsigned int; (*refcount) = 1; } @@ -176,7 +216,7 @@ public: memcpy(data, *buffer, buffer.getSize()); } else - data = NULL; + data = nullptr; refcount = new unsigned int; (*refcount) = 1; } @@ -216,3 +256,4 @@ private: unsigned int m_size; unsigned int *refcount; }; + diff --git a/src/util/serialize.cpp b/src/util/serialize.cpp index 5b276668d..ee46fd941 100644 --- a/src/util/serialize.cpp +++ b/src/util/serialize.cpp @@ -18,98 +18,29 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "serialize.h" -#include "pointer.h" #include "porting.h" #include "util/string.h" +#include "util/hex.h" #include "exceptions.h" #include "irrlichttypes.h" -#include <sstream> -#include <iomanip> -#include <vector> +#include <iostream> +#include <cassert> FloatType g_serialize_f32_type = FLOATTYPE_UNKNOWN; -//// -//// BufReader -//// - -bool BufReader::getStringNoEx(std::string *val) -{ - u16 num_chars; - if (!getU16NoEx(&num_chars)) - return false; - - if (pos + num_chars > size) { - pos -= sizeof(num_chars); - return false; - } - - val->assign((const char *)data + pos, num_chars); - pos += num_chars; - - return true; -} - -bool BufReader::getWideStringNoEx(std::wstring *val) -{ - u16 num_chars; - if (!getU16NoEx(&num_chars)) - return false; - - if (pos + num_chars * 2 > size) { - pos -= sizeof(num_chars); - return false; - } - - for (size_t i = 0; i != num_chars; i++) { - val->push_back(readU16(data + pos)); - pos += 2; - } - - return true; -} - -bool BufReader::getLongStringNoEx(std::string *val) -{ - u32 num_chars; - if (!getU32NoEx(&num_chars)) - return false; - - if (pos + num_chars > size) { - pos -= sizeof(num_chars); - return false; - } - - val->assign((const char *)data + pos, num_chars); - pos += num_chars; - - return true; -} - -bool BufReader::getRawDataNoEx(void *val, size_t len) -{ - if (pos + len > size) - return false; - - memcpy(val, data + pos, len); - pos += len; - - return true; -} - //// //// String //// -std::string serializeString(const std::string &plain) +std::string serializeString16(const std::string &plain) { std::string s; char buf[2]; if (plain.size() > STRING_MAX_LEN) - throw SerializationError("String too long for serializeString"); + throw SerializationError("String too long for serializeString16"); s.reserve(2 + plain.size()); writeU16((u8 *)&buf[0], plain.size()); @@ -119,14 +50,14 @@ std::string serializeString(const std::string &plain) return s; } -std::string deSerializeString(std::istream &is) +std::string deSerializeString16(std::istream &is) { std::string s; char buf[2]; is.read(buf, 2); if (is.gcount() != 2) - throw SerializationError("deSerializeString: size not read"); + throw SerializationError("deSerializeString16: size not read"); u16 s_size = readU16((u8 *)buf); if (s_size == 0) @@ -135,66 +66,17 @@ std::string deSerializeString(std::istream &is) s.resize(s_size); is.read(&s[0], s_size); if (is.gcount() != s_size) - throw SerializationError("deSerializeString: couldn't read all chars"); + throw SerializationError("deSerializeString16: couldn't read all chars"); return s; } -//// -//// Wide String -//// - -std::string serializeWideString(const std::wstring &plain) -{ - std::string s; - char buf[2]; - - if (plain.size() > WIDE_STRING_MAX_LEN) - throw SerializationError("String too long for serializeWideString"); - s.reserve(2 + 2 * plain.size()); - - writeU16((u8 *)buf, plain.size()); - s.append(buf, 2); - - for (wchar_t i : plain) { - writeU16((u8 *)buf, i); - s.append(buf, 2); - } - return s; -} - -std::wstring deSerializeWideString(std::istream &is) -{ - std::wstring s; - char buf[2]; - - is.read(buf, 2); - if (is.gcount() != 2) - throw SerializationError("deSerializeWideString: size not read"); - - u16 s_size = readU16((u8 *)buf); - if (s_size == 0) - return s; - - s.reserve(s_size); - for (u32 i = 0; i < s_size; i++) { - is.read(&buf[0], 2); - if (is.gcount() != 2) { - throw SerializationError( - "deSerializeWideString: couldn't read all chars"); - } - - wchar_t c16 = readU16((u8 *)buf); - s.append(&c16, 1); - } - return s; -} //// //// Long String //// -std::string serializeLongString(const std::string &plain) +std::string serializeString32(const std::string &plain) { std::string s; char buf[4]; @@ -209,7 +91,7 @@ std::string serializeLongString(const std::string &plain) return s; } -std::string deSerializeLongString(std::istream &is) +std::string deSerializeString32(std::istream &is) { std::string s; char buf[4]; @@ -237,121 +119,148 @@ std::string deSerializeLongString(std::istream &is) } //// -//// JSON +//// JSON-like strings //// std::string serializeJsonString(const std::string &plain) { - std::ostringstream os(std::ios::binary); - os << "\""; + std::string tmp; + + tmp.reserve(plain.size() + 2); + tmp.push_back('"'); for (char c : plain) { switch (c) { case '"': - os << "\\\""; + tmp.append("\\\""); break; case '\\': - os << "\\\\"; - break; - case '/': - os << "\\/"; + tmp.append("\\\\"); break; case '\b': - os << "\\b"; + tmp.append("\\b"); break; case '\f': - os << "\\f"; + tmp.append("\\f"); break; case '\n': - os << "\\n"; + tmp.append("\\n"); break; case '\r': - os << "\\r"; + tmp.append("\\r"); break; case '\t': - os << "\\t"; + tmp.append("\\t"); break; default: { if (c >= 32 && c <= 126) { - os << c; + tmp.push_back(c); } else { - u32 cnum = (u8)c; - os << "\\u" << std::hex << std::setw(4) - << std::setfill('0') << cnum; + // We pretend that Unicode codepoints map to bytes (they don't) + u8 cnum = static_cast<u8>(c); + tmp.append("\\u00"); + tmp.push_back(hex_chars[cnum >> 4]); + tmp.push_back(hex_chars[cnum & 0xf]); } break; } } } - os << "\""; - return os.str(); + tmp.push_back('"'); + return tmp; +} + +static void deSerializeJsonString(std::string &s) +{ + assert(s.size() >= 2); + assert(s.front() == '"' && s.back() == '"'); + + size_t w = 0; // write index + size_t i = 1; // read index + const size_t len = s.size() - 1; // string length with trailing quote removed + + while (i < len) { + char c = s[i++]; + assert(c != '"'); + + if (c != '\\') { + s[w++] = c; + continue; + } + + if (i >= len) + throw SerializationError("JSON string ended prematurely"); + char c2 = s[i++]; + switch (c2) { + case 'b': + s[w++] = '\b'; + break; + case 'f': + s[w++] = '\f'; + break; + case 'n': + s[w++] = '\n'; + break; + case 'r': + s[w++] = '\r'; + break; + case 't': + s[w++] = '\t'; + break; + case 'u': { + if (i + 3 >= len) + throw SerializationError("JSON string ended prematurely"); + unsigned char v[4] = {}; + for (int j = 0; j < 4; j++) + hex_digit_decode(s[i+j], v[j]); + i += 4; + u32 hexnumber = (v[0] << 12) | (v[1] << 8) | (v[2] << 4) | v[3]; + // Note that this does not work for anything other than ASCII + // but these functions do not actually interact with real JSON input. + s[w++] = (int) hexnumber; + break; + } + default: + s[w++] = c2; + break; + } + } + + assert(w <= i && i <= len); + // Truncate string to current write index + s.resize(w); } std::string deSerializeJsonString(std::istream &is) { - std::ostringstream os(std::ios::binary); - char c, c2; + std::string tmp; + char c; + bool was_backslash = false; // Parse initial doublequote - is >> c; + c = is.get(); if (c != '"') throw SerializationError("JSON string must start with doublequote"); + tmp.push_back(c); - // Parse characters + // Grab the entire json string for (;;) { c = is.get(); if (is.eof()) throw SerializationError("JSON string ended prematurely"); - if (c == '"') { - return os.str(); - } - - if (c == '\\') { - c2 = is.get(); - if (is.eof()) - throw SerializationError("JSON string ended prematurely"); - switch (c2) { - case 'b': - os << '\b'; - break; - case 'f': - os << '\f'; - break; - case 'n': - os << '\n'; - break; - case 'r': - os << '\r'; - break; - case 't': - os << '\t'; - break; - case 'u': { - int hexnumber; - char hexdigits[4 + 1]; - - is.read(hexdigits, 4); - if (is.eof()) - throw SerializationError("JSON string ended prematurely"); - hexdigits[4] = 0; - - std::istringstream tmp_is(hexdigits, std::ios::binary); - tmp_is >> std::hex >> hexnumber; - os << (char)hexnumber; - break; - } - default: - os << c2; - break; - } - } else { - os << c; - } + tmp.push_back(c); + if (was_backslash) + was_backslash = false; + else if (c == '\\') + was_backslash = true; + else if (c == '"') + break; // found end of string } - return os.str(); + deSerializeJsonString(tmp); + return tmp; } std::string serializeJsonStringIfNeeded(const std::string &s) @@ -365,323 +274,21 @@ std::string serializeJsonStringIfNeeded(const std::string &s) std::string deSerializeJsonStringIfNeeded(std::istream &is) { - std::ostringstream tmp_os; - bool expect_initial_quote = true; - bool is_json = false; - bool was_backslash = false; - for (;;) { - char c = is.get(); - if (is.eof()) - break; + // Check for initial quote + char c = is.peek(); + if (is.eof()) + return ""; - if (expect_initial_quote && c == '"') { - tmp_os << c; - is_json = true; - } else if(is_json) { - tmp_os << c; - if (was_backslash) - was_backslash = false; - else if (c == '\\') - was_backslash = true; - else if (c == '"') - break; // Found end of string - } else { - if (c == ' ') { - // Found end of word - is.unget(); - break; - } - - tmp_os << c; - } - expect_initial_quote = false; - } - if (is_json) { - std::istringstream tmp_is(tmp_os.str(), std::ios::binary); - return deSerializeJsonString(tmp_is); + if (c == '"') { + // json string: defer to the right implementation + return deSerializeJsonString(is); } - return tmp_os.str(); + // not a json string: + std::string tmp; + std::getline(is, tmp, ' '); + if (!is.eof()) + is.unget(); // we hit a space, put it back + return tmp; } -//// -//// String/Struct conversions -//// - -bool deSerializeStringToStruct(std::string valstr, - std::string format, void *out, size_t olen) -{ - size_t len = olen; - std::vector<std::string *> strs_alloced; - std::string *str; - char *f, *snext; - size_t pos; - - char *s = &valstr[0]; - char *buf = new char[len]; - char *bufpos = buf; - - char *fmtpos, *fmt = &format[0]; - while ((f = strtok_r(fmt, ",", &fmtpos)) && s) { - fmt = nullptr; - - bool is_unsigned = false; - int width = 0; - char valtype = *f; - - width = (int)strtol(f + 1, &f, 10); - if (width && valtype == 's') - valtype = 'i'; - - switch (valtype) { - case 'u': - is_unsigned = true; - /* FALLTHROUGH */ - case 'i': - if (width == 16) { - bufpos += PADDING(bufpos, u16); - if ((bufpos - buf) + sizeof(u16) <= len) { - if (is_unsigned) - *(u16 *)bufpos = (u16)strtoul(s, &s, 10); - else - *(s16 *)bufpos = (s16)strtol(s, &s, 10); - } - bufpos += sizeof(u16); - } else if (width == 32) { - bufpos += PADDING(bufpos, u32); - if ((bufpos - buf) + sizeof(u32) <= len) { - if (is_unsigned) - *(u32 *)bufpos = (u32)strtoul(s, &s, 10); - else - *(s32 *)bufpos = (s32)strtol(s, &s, 10); - } - bufpos += sizeof(u32); - } else if (width == 64) { - bufpos += PADDING(bufpos, u64); - if ((bufpos - buf) + sizeof(u64) <= len) { - if (is_unsigned) - *(u64 *)bufpos = (u64)strtoull(s, &s, 10); - else - *(s64 *)bufpos = (s64)strtoll(s, &s, 10); - } - bufpos += sizeof(u64); - } - s = strchr(s, ','); - break; - case 'b': - snext = strchr(s, ','); - if (snext) - *snext++ = 0; - - bufpos += PADDING(bufpos, bool); - if ((bufpos - buf) + sizeof(bool) <= len) - *(bool *)bufpos = is_yes(std::string(s)); - bufpos += sizeof(bool); - - s = snext; - break; - case 'f': - bufpos += PADDING(bufpos, float); - if ((bufpos - buf) + sizeof(float) <= len) - *(float *)bufpos = strtof(s, &s); - bufpos += sizeof(float); - - s = strchr(s, ','); - break; - case 's': - while (*s == ' ' || *s == '\t') - s++; - if (*s++ != '"') //error, expected string - goto fail; - snext = s; - - while (snext[0] && !(snext[-1] != '\\' && snext[0] == '"')) - snext++; - *snext++ = 0; - - bufpos += PADDING(bufpos, std::string *); - - str = new std::string(s); - pos = 0; - while ((pos = str->find("\\\"", pos)) != std::string::npos) - str->erase(pos, 1); - - if ((bufpos - buf) + sizeof(std::string *) <= len) - *(std::string **)bufpos = str; - bufpos += sizeof(std::string *); - strs_alloced.push_back(str); - - s = *snext ? snext + 1 : nullptr; - break; - case 'v': - while (*s == ' ' || *s == '\t') - s++; - if (*s++ != '(') //error, expected vector - goto fail; - - if (width == 2) { - bufpos += PADDING(bufpos, v2f); - - if ((bufpos - buf) + sizeof(v2f) <= len) { - v2f *v = (v2f *)bufpos; - v->X = strtof(s, &s); - s++; - v->Y = strtof(s, &s); - } - - bufpos += sizeof(v2f); - } else if (width == 3) { - bufpos += PADDING(bufpos, v3f); - if ((bufpos - buf) + sizeof(v3f) <= len) { - v3f *v = (v3f *)bufpos; - v->X = strtof(s, &s); - s++; - v->Y = strtof(s, &s); - s++; - v->Z = strtof(s, &s); - } - - bufpos += sizeof(v3f); - } - s = strchr(s, ','); - break; - default: //error, invalid format specifier - goto fail; - } - - if (s && *s == ',') - s++; - - if ((size_t)(bufpos - buf) > len) //error, buffer too small - goto fail; - } - - if (f && *f) { //error, mismatched number of fields and values -fail: - for (size_t i = 0; i != strs_alloced.size(); i++) - delete strs_alloced[i]; - delete[] buf; - return false; - } - - memcpy(out, buf, olen); - delete[] buf; - return true; -} - -// Casts *buf to a signed or unsigned fixed-width integer of 'w' width -#define SIGN_CAST(w, buf) (is_unsigned ? *((u##w *) buf) : *((s##w *) buf)) - -bool serializeStructToString(std::string *out, - std::string format, void *value) -{ - std::ostringstream os; - std::string str; - char *f; - size_t strpos; - - char *bufpos = (char *) value; - char *fmtpos, *fmt = &format[0]; - while ((f = strtok_r(fmt, ",", &fmtpos))) { - fmt = nullptr; - bool is_unsigned = false; - int width = 0; - char valtype = *f; - - width = (int)strtol(f + 1, &f, 10); - if (width && valtype == 's') - valtype = 'i'; - - switch (valtype) { - case 'u': - is_unsigned = true; - /* FALLTHROUGH */ - case 'i': - if (width == 16) { - bufpos += PADDING(bufpos, u16); - os << SIGN_CAST(16, bufpos); - bufpos += sizeof(u16); - } else if (width == 32) { - bufpos += PADDING(bufpos, u32); - os << SIGN_CAST(32, bufpos); - bufpos += sizeof(u32); - } else if (width == 64) { - bufpos += PADDING(bufpos, u64); - os << SIGN_CAST(64, bufpos); - bufpos += sizeof(u64); - } - break; - case 'b': - bufpos += PADDING(bufpos, bool); - os << std::boolalpha << *((bool *) bufpos); - bufpos += sizeof(bool); - break; - case 'f': - bufpos += PADDING(bufpos, float); - os << *((float *) bufpos); - bufpos += sizeof(float); - break; - case 's': - bufpos += PADDING(bufpos, std::string *); - str = **((std::string **) bufpos); - - strpos = 0; - while ((strpos = str.find('"', strpos)) != std::string::npos) { - str.insert(strpos, 1, '\\'); - strpos += 2; - } - - os << str; - bufpos += sizeof(std::string *); - break; - case 'v': - if (width == 2) { - bufpos += PADDING(bufpos, v2f); - v2f *v = (v2f *) bufpos; - os << '(' << v->X << ", " << v->Y << ')'; - bufpos += sizeof(v2f); - } else { - bufpos += PADDING(bufpos, v3f); - v3f *v = (v3f *) bufpos; - os << '(' << v->X << ", " << v->Y << ", " << v->Z << ')'; - bufpos += sizeof(v3f); - } - break; - default: - return false; - } - os << ", "; - } - *out = os.str(); - - // Trim off the trailing comma and space - if (out->size() >= 2) - out->resize(out->size() - 2); - - return true; -} - -#undef SIGN_CAST - -//// -//// Other -//// - -std::string serializeHexString(const std::string &data, bool insert_spaces) -{ - std::string result; - result.reserve(data.size() * (2 + insert_spaces)); - - static const char hex_chars[] = "0123456789abcdef"; - - const size_t len = data.size(); - for (size_t i = 0; i != len; i++) { - u8 byte = data[i]; - result.push_back(hex_chars[(byte >> 4) & 0x0F]); - result.push_back(hex_chars[(byte >> 0) & 0x0F]); - if (insert_spaces && i != len - 1) - result.push_back(' '); - } - - return result; -} diff --git a/src/util/serialize.h b/src/util/serialize.h index a4b5a234a..4dc1a54c6 100644 --- a/src/util/serialize.h +++ b/src/util/serialize.h @@ -290,7 +290,7 @@ inline void writeS8(u8 *data, s8 i) inline void writeS16(u8 *data, s16 i) { - writeU16(data, (u16)i); + writeU16(data, (u16)i); } inline void writeS32(u8 *data, s32 i) @@ -439,23 +439,27 @@ MAKE_STREAM_WRITE_FXN(video::SColor, ARGB8, 4); //// More serialization stuff //// -// Creates a string with the length as the first two bytes -std::string serializeString(const std::string &plain); +inline float clampToF1000(float v) +{ + return core::clamp(v, F1000_MIN, F1000_MAX); +} -// Creates a string with the length as the first two bytes from wide string -std::string serializeWideString(const std::wstring &plain); +inline v3f clampToF1000(v3f v) +{ + return {clampToF1000(v.X), clampToF1000(v.Y), clampToF1000(v.Z)}; +} + +// Creates a string with the length as the first two bytes +std::string serializeString16(const std::string &plain); // Reads a string with the length as the first two bytes -std::string deSerializeString(std::istream &is); - -// Reads a wide string with the length as the first two bytes -std::wstring deSerializeWideString(std::istream &is); +std::string deSerializeString16(std::istream &is); // Creates a string with the length as the first four bytes -std::string serializeLongString(const std::string &plain); +std::string serializeString32(const std::string &plain); // Reads a string with the length as the first four bytes -std::string deSerializeLongString(std::istream &is); +std::string deSerializeString32(std::istream &is); // Creates a string encoded in JSON format (almost equivalent to a C string literal) std::string serializeJsonString(const std::string &plain); @@ -469,239 +473,3 @@ std::string serializeJsonStringIfNeeded(const std::string &s); // Parses a string serialized by serializeJsonStringIfNeeded. std::string deSerializeJsonStringIfNeeded(std::istream &is); - -// Creates a string consisting of the hexadecimal representation of `data` -std::string serializeHexString(const std::string &data, bool insert_spaces=false); - -// Creates a string containing comma delimited values of a struct whose layout is -// described by the parameter format -bool serializeStructToString(std::string *out, - std::string format, void *value); - -// Reads a comma delimited string of values into a struct whose layout is -// decribed by the parameter format -bool deSerializeStringToStruct(std::string valstr, - std::string format, void *out, size_t olen); - -//// -//// BufReader -//// - -#define MAKE_BUFREADER_GETNOEX_FXN(T, N, S) \ - inline bool get ## N ## NoEx(T *val) \ - { \ - if (pos + S > size) \ - return false; \ - *val = read ## N(data + pos); \ - pos += S; \ - return true; \ - } - -#define MAKE_BUFREADER_GET_FXN(T, N) \ - inline T get ## N() \ - { \ - T val; \ - if (!get ## N ## NoEx(&val)) \ - throw SerializationError("Attempted read past end of data"); \ - return val; \ - } - -class BufReader { -public: - BufReader(const u8 *data_, size_t size_) : - data(data_), - size(size_) - { - } - - MAKE_BUFREADER_GETNOEX_FXN(u8, U8, 1); - MAKE_BUFREADER_GETNOEX_FXN(u16, U16, 2); - MAKE_BUFREADER_GETNOEX_FXN(u32, U32, 4); - MAKE_BUFREADER_GETNOEX_FXN(u64, U64, 8); - MAKE_BUFREADER_GETNOEX_FXN(s8, S8, 1); - MAKE_BUFREADER_GETNOEX_FXN(s16, S16, 2); - MAKE_BUFREADER_GETNOEX_FXN(s32, S32, 4); - MAKE_BUFREADER_GETNOEX_FXN(s64, S64, 8); - MAKE_BUFREADER_GETNOEX_FXN(f32, F1000, 4); - MAKE_BUFREADER_GETNOEX_FXN(v2s16, V2S16, 4); - MAKE_BUFREADER_GETNOEX_FXN(v3s16, V3S16, 6); - MAKE_BUFREADER_GETNOEX_FXN(v2s32, V2S32, 8); - MAKE_BUFREADER_GETNOEX_FXN(v3s32, V3S32, 12); - MAKE_BUFREADER_GETNOEX_FXN(v3f, V3F1000, 12); - MAKE_BUFREADER_GETNOEX_FXN(video::SColor, ARGB8, 4); - - bool getStringNoEx(std::string *val); - bool getWideStringNoEx(std::wstring *val); - bool getLongStringNoEx(std::string *val); - bool getRawDataNoEx(void *data, size_t len); - - MAKE_BUFREADER_GET_FXN(u8, U8); - MAKE_BUFREADER_GET_FXN(u16, U16); - MAKE_BUFREADER_GET_FXN(u32, U32); - MAKE_BUFREADER_GET_FXN(u64, U64); - MAKE_BUFREADER_GET_FXN(s8, S8); - MAKE_BUFREADER_GET_FXN(s16, S16); - MAKE_BUFREADER_GET_FXN(s32, S32); - MAKE_BUFREADER_GET_FXN(s64, S64); - MAKE_BUFREADER_GET_FXN(f32, F1000); - MAKE_BUFREADER_GET_FXN(v2s16, V2S16); - MAKE_BUFREADER_GET_FXN(v3s16, V3S16); - MAKE_BUFREADER_GET_FXN(v2s32, V2S32); - MAKE_BUFREADER_GET_FXN(v3s32, V3S32); - MAKE_BUFREADER_GET_FXN(v3f, V3F1000); - MAKE_BUFREADER_GET_FXN(video::SColor, ARGB8); - MAKE_BUFREADER_GET_FXN(std::string, String); - MAKE_BUFREADER_GET_FXN(std::wstring, WideString); - MAKE_BUFREADER_GET_FXN(std::string, LongString); - - inline void getRawData(void *val, size_t len) - { - if (!getRawDataNoEx(val, len)) - throw SerializationError("Attempted read past end of data"); - } - - inline size_t remaining() - { - assert(pos <= size); - return size - pos; - } - - const u8 *data; - size_t size; - size_t pos = 0; -}; - -#undef MAKE_BUFREADER_GET_FXN -#undef MAKE_BUFREADER_GETNOEX_FXN - - -//// -//// Vector-based write routines -//// - -inline void putU8(std::vector<u8> *dest, u8 val) -{ - dest->push_back((val >> 0) & 0xFF); -} - -inline void putU16(std::vector<u8> *dest, u16 val) -{ - dest->push_back((val >> 8) & 0xFF); - dest->push_back((val >> 0) & 0xFF); -} - -inline void putU32(std::vector<u8> *dest, u32 val) -{ - dest->push_back((val >> 24) & 0xFF); - dest->push_back((val >> 16) & 0xFF); - dest->push_back((val >> 8) & 0xFF); - dest->push_back((val >> 0) & 0xFF); -} - -inline void putU64(std::vector<u8> *dest, u64 val) -{ - dest->push_back((val >> 56) & 0xFF); - dest->push_back((val >> 48) & 0xFF); - dest->push_back((val >> 40) & 0xFF); - dest->push_back((val >> 32) & 0xFF); - dest->push_back((val >> 24) & 0xFF); - dest->push_back((val >> 16) & 0xFF); - dest->push_back((val >> 8) & 0xFF); - dest->push_back((val >> 0) & 0xFF); -} - -inline void putS8(std::vector<u8> *dest, s8 val) -{ - putU8(dest, val); -} - -inline void putS16(std::vector<u8> *dest, s16 val) -{ - putU16(dest, val); -} - -inline void putS32(std::vector<u8> *dest, s32 val) -{ - putU32(dest, val); -} - -inline void putS64(std::vector<u8> *dest, s64 val) -{ - putU64(dest, val); -} - -inline void putF1000(std::vector<u8> *dest, f32 val) -{ - putS32(dest, val * FIXEDPOINT_FACTOR); -} - -inline void putV2S16(std::vector<u8> *dest, v2s16 val) -{ - putS16(dest, val.X); - putS16(dest, val.Y); -} - -inline void putV3S16(std::vector<u8> *dest, v3s16 val) -{ - putS16(dest, val.X); - putS16(dest, val.Y); - putS16(dest, val.Z); -} - -inline void putV2S32(std::vector<u8> *dest, v2s32 val) -{ - putS32(dest, val.X); - putS32(dest, val.Y); -} - -inline void putV3S32(std::vector<u8> *dest, v3s32 val) -{ - putS32(dest, val.X); - putS32(dest, val.Y); - putS32(dest, val.Z); -} - -inline void putV3F1000(std::vector<u8> *dest, v3f val) -{ - putF1000(dest, val.X); - putF1000(dest, val.Y); - putF1000(dest, val.Z); -} - -inline void putARGB8(std::vector<u8> *dest, video::SColor val) -{ - putU32(dest, val.color); -} - -inline void putString(std::vector<u8> *dest, const std::string &val) -{ - if (val.size() > STRING_MAX_LEN) - throw SerializationError("String too long"); - - putU16(dest, val.size()); - dest->insert(dest->end(), val.begin(), val.end()); -} - -inline void putWideString(std::vector<u8> *dest, const std::wstring &val) -{ - if (val.size() > WIDE_STRING_MAX_LEN) - throw SerializationError("String too long"); - - putU16(dest, val.size()); - for (size_t i = 0; i != val.size(); i++) - putU16(dest, val[i]); -} - -inline void putLongString(std::vector<u8> *dest, const std::string &val) -{ - if (val.size() > LONG_STRING_MAX_LEN) - throw SerializationError("String too long"); - - putU32(dest, val.size()); - dest->insert(dest->end(), val.begin(), val.end()); -} - -inline void putRawData(std::vector<u8> *dest, const void *src, size_t len) -{ - dest->insert(dest->end(), (u8 *)src, (u8 *)src + len); -} diff --git a/src/util/srp.cpp b/src/util/srp.cpp index f4d369d68..daa7f332b 100644 --- a/src/util/srp.cpp +++ b/src/util/srp.cpp @@ -354,7 +354,7 @@ static size_t hash_length(SRP_HashAlgorithm alg) case SRP_SHA384: return SHA384_DIGEST_LENGTH; case SRP_SHA512: return SHA512_DIGEST_LENGTH; */ - default: return -1; + default: return 0; }; } // clang-format on @@ -422,7 +422,7 @@ static SRP_Result H_nn( } static SRP_Result H_ns(mpz_t result, SRP_HashAlgorithm alg, const unsigned char *n, - size_t len_n, const unsigned char *bytes, uint32_t len_bytes) + size_t len_n, const unsigned char *bytes, size_t len_bytes) { unsigned char buff[SHA512_DIGEST_LENGTH]; size_t nbytes = len_n + len_bytes; @@ -1015,10 +1015,10 @@ void srp_user_process_challenge(struct SRPUser *usr, goto cleanup_and_exit; *bytes_M = usr->M; - if (len_M) *len_M = hash_length(usr->hash_alg); + *len_M = hash_length(usr->hash_alg); } else { *bytes_M = NULL; - if (len_M) *len_M = 0; + *len_M = 0; } cleanup_and_exit: diff --git a/src/util/stream.h b/src/util/stream.h new file mode 100644 index 000000000..2e61b46d2 --- /dev/null +++ b/src/util/stream.h @@ -0,0 +1,70 @@ +/* +Minetest +Copyright (C) 2022 Minetest Authors + +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. +*/ + +#pragma once + +#include <iostream> +#include <string> +#include <functional> + +template<int BufferLength, typename Emitter = std::function<void(const std::string &)> > +class StringStreamBuffer : public std::streambuf { +public: + StringStreamBuffer(Emitter emitter) : m_emitter(emitter) { + buffer_index = 0; + } + + int overflow(int c) { + push_back(c); + return c; + } + + void push_back(char c) { + if (c == '\n' || c == '\r') { + if (buffer_index) + m_emitter(std::string(buffer, buffer_index)); + buffer_index = 0; + } else { + buffer[buffer_index++] = c; + if (buffer_index >= BufferLength) { + m_emitter(std::string(buffer, buffer_index)); + buffer_index = 0; + } + } + } + + std::streamsize xsputn(const char *s, std::streamsize n) { + for (int i = 0; i < n; ++i) + push_back(s[i]); + return n; + } +private: + Emitter m_emitter; + char buffer[BufferLength]; + int buffer_index; +}; + +class DummyStreamBuffer : public std::streambuf { + int overflow(int c) { + return c; + } + std::streamsize xsputn(const char *s, std::streamsize n) { + return n; + } +}; diff --git a/src/util/string.cpp b/src/util/string.cpp index 8381a29c5..778e4d1e1 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <array> #include <sstream> #include <iomanip> -#include <map> +#include <unordered_map> #ifndef _WIN32 #include <iconv.h> @@ -39,36 +39,22 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <windows.h> #endif -#if defined(_ICONV_H_) && (defined(__FreeBSD__) || defined(__NetBSD__) || \ - defined(__OpenBSD__) || defined(__DragonFly__)) - #define BSD_ICONV_USED -#endif - -static bool parseHexColorString(const std::string &value, video::SColor &color, - unsigned char default_alpha = 0xff); -static bool parseNamedColorString(const std::string &value, video::SColor &color); - #ifndef _WIN32 -bool convert(const char *to, const char *from, char *outbuf, - size_t outbuf_size, char *inbuf, size_t inbuf_size) +static bool convert(const char *to, const char *from, char *outbuf, + size_t *outbuf_size, char *inbuf, size_t inbuf_size) { iconv_t cd = iconv_open(to, from); -#ifdef BSD_ICONV_USED - const char *inbuf_ptr = inbuf; -#else char *inbuf_ptr = inbuf; -#endif - char *outbuf_ptr = outbuf; size_t *inbuf_left_ptr = &inbuf_size; - size_t *outbuf_left_ptr = &outbuf_size; + const size_t old_outbuf_size = *outbuf_size; size_t old_size = inbuf_size; while (inbuf_size > 0) { - iconv(cd, &inbuf_ptr, inbuf_left_ptr, &outbuf_ptr, outbuf_left_ptr); + iconv(cd, &inbuf_ptr, inbuf_left_ptr, &outbuf_ptr, outbuf_size); if (inbuf_size == old_size) { iconv_close(cd); return false; @@ -77,70 +63,73 @@ bool convert(const char *to, const char *from, char *outbuf, } iconv_close(cd); + *outbuf_size = old_outbuf_size - *outbuf_size; return true; } #ifdef __ANDROID__ -// Android need manual caring to support the full character set possible with wchar_t +// On Android iconv disagrees how big a wchar_t is for whatever reason const char *DEFAULT_ENCODING = "UTF-32LE"; +#elif defined(__NetBSD__) || defined(__OpenBSD__) + // NetBSD does not allow "WCHAR_T" as a charset input to iconv. + #include <sys/endian.h> + #if BYTE_ORDER == BIG_ENDIAN + const char *DEFAULT_ENCODING = "UTF-32BE"; + #else + const char *DEFAULT_ENCODING = "UTF-32LE"; + #endif #else const char *DEFAULT_ENCODING = "WCHAR_T"; #endif std::wstring utf8_to_wide(const std::string &input) { - size_t inbuf_size = input.length() + 1; + const size_t inbuf_size = input.length(); // maximum possible size, every character is sizeof(wchar_t) bytes - size_t outbuf_size = (input.length() + 1) * sizeof(wchar_t); + size_t outbuf_size = input.length() * sizeof(wchar_t); - char *inbuf = new char[inbuf_size]; + char *inbuf = new char[inbuf_size]; // intentionally NOT null-terminated memcpy(inbuf, input.c_str(), inbuf_size); - char *outbuf = new char[outbuf_size]; - memset(outbuf, 0, outbuf_size); + std::wstring out; + out.resize(outbuf_size / sizeof(wchar_t)); -#ifdef __ANDROID__ - // Android need manual caring to support the full character set possible with wchar_t - SANITY_CHECK(sizeof(wchar_t) == 4); +#if defined(__ANDROID__) || defined(__NetBSD__) || defined(__OpenBSD__) + static_assert(sizeof(wchar_t) == 4, "Unexpected wide char size"); #endif - if (!convert(DEFAULT_ENCODING, "UTF-8", outbuf, outbuf_size, inbuf, inbuf_size)) { + char *outbuf = reinterpret_cast<char*>(&out[0]); + if (!convert(DEFAULT_ENCODING, "UTF-8", outbuf, &outbuf_size, inbuf, inbuf_size)) { infostream << "Couldn't convert UTF-8 string 0x" << hex_encode(input) << " into wstring" << std::endl; delete[] inbuf; - delete[] outbuf; return L"<invalid UTF-8 string>"; } - std::wstring out((wchar_t *)outbuf); - delete[] inbuf; - delete[] outbuf; + out.resize(outbuf_size / sizeof(wchar_t)); return out; } std::string wide_to_utf8(const std::wstring &input) { - size_t inbuf_size = (input.length() + 1) * sizeof(wchar_t); - // maximum possible size: utf-8 encodes codepoints using 1 up to 6 bytes - size_t outbuf_size = (input.length() + 1) * 6; + const size_t inbuf_size = input.length() * sizeof(wchar_t); + // maximum possible size: utf-8 encodes codepoints using 1 up to 4 bytes + size_t outbuf_size = input.length() * 4; - char *inbuf = new char[inbuf_size]; + char *inbuf = new char[inbuf_size]; // intentionally NOT null-terminated memcpy(inbuf, input.c_str(), inbuf_size); - char *outbuf = new char[outbuf_size]; - memset(outbuf, 0, outbuf_size); + std::string out; + out.resize(outbuf_size); - if (!convert("UTF-8", DEFAULT_ENCODING, outbuf, outbuf_size, inbuf, inbuf_size)) { + if (!convert("UTF-8", DEFAULT_ENCODING, &out[0], &outbuf_size, inbuf, inbuf_size)) { infostream << "Couldn't convert wstring 0x" << hex_encode(inbuf, inbuf_size) << " into UTF-8 string" << std::endl; delete[] inbuf; - delete[] outbuf; - return "<invalid wstring>"; + return "<invalid wide string>"; } - std::string out(outbuf); - delete[] inbuf; - delete[] outbuf; + out.resize(outbuf_size); return out; } @@ -172,74 +161,15 @@ std::string wide_to_utf8(const std::wstring &input) #endif // _WIN32 -// You must free the returned string! -// The returned string is allocated using new wchar_t *utf8_to_wide_c(const char *str) { std::wstring ret = utf8_to_wide(std::string(str)); size_t len = ret.length(); wchar_t *ret_c = new wchar_t[len + 1]; - memset(ret_c, 0, (len + 1) * sizeof(wchar_t)); - memcpy(ret_c, ret.c_str(), len * sizeof(wchar_t)); + memcpy(ret_c, ret.c_str(), (len + 1) * sizeof(wchar_t)); return ret_c; } -// You must free the returned string! -// The returned string is allocated using new -wchar_t *narrow_to_wide_c(const char *str) -{ - wchar_t *nstr = nullptr; -#if defined(_WIN32) - int nResult = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) str, -1, 0, 0); - if (nResult == 0) { - errorstream<<"gettext: MultiByteToWideChar returned null"<<std::endl; - } else { - nstr = new wchar_t[nResult]; - MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) str, -1, (WCHAR *) nstr, nResult); - } -#else - size_t len = strlen(str); - nstr = new wchar_t[len + 1]; - - std::wstring intermediate = narrow_to_wide(str); - memset(nstr, 0, (len + 1) * sizeof(wchar_t)); - memcpy(nstr, intermediate.c_str(), len * sizeof(wchar_t)); -#endif - - return nstr; -} - -std::wstring narrow_to_wide(const std::string &mbs) { -#ifdef __ANDROID__ - return utf8_to_wide(mbs); -#else - size_t wcl = mbs.size(); - Buffer<wchar_t> wcs(wcl + 1); - size_t len = mbstowcs(*wcs, mbs.c_str(), wcl); - if (len == (size_t)(-1)) - return L"<invalid multibyte string>"; - wcs[len] = 0; - return *wcs; -#endif -} - - -std::string wide_to_narrow(const std::wstring &wcs) -{ -#ifdef __ANDROID__ - return wide_to_utf8(wcs); -#else - size_t mbl = wcs.size() * 4; - SharedBuffer<char> mbs(mbl+1); - size_t len = wcstombs(*mbs, wcs.c_str(), mbl); - if (len == (size_t)(-1)) - return "Character conversion failed!"; - - mbs[len] = 0; - return *mbs; -#endif -} - std::string urlencode(const std::string &str) { @@ -389,29 +319,10 @@ u64 read_seed(const char *str) return num; } -bool parseColorString(const std::string &value, video::SColor &color, bool quiet, - unsigned char default_alpha) -{ - bool success; - - if (value[0] == '#') - success = parseHexColorString(value, color, default_alpha); - else - success = parseNamedColorString(value, color); - - if (!success && !quiet) - errorstream << "Invalid color: \"" << value << "\"" << std::endl; - - return success; -} - static bool parseHexColorString(const std::string &value, video::SColor &color, unsigned char default_alpha) { - unsigned char components[] = { 0x00, 0x00, 0x00, default_alpha }; // R,G,B,A - - if (value[0] != '#') - return false; + u8 components[] = {0x00, 0x00, 0x00, default_alpha}; // R,G,B,A size_t len = value.size(); bool short_form; @@ -423,198 +334,183 @@ static bool parseHexColorString(const std::string &value, video::SColor &color, else return false; - bool success = true; - for (size_t pos = 1, cc = 0; pos < len; pos++, cc++) { - assert(cc < sizeof components / sizeof components[0]); if (short_form) { - unsigned char d; - if (!hex_digit_decode(value[pos], d)) { - success = false; - break; - } + u8 d; + if (!hex_digit_decode(value[pos], d)) + return false; + components[cc] = (d & 0xf) << 4 | (d & 0xf); } else { - unsigned char d1, d2; + u8 d1, d2; if (!hex_digit_decode(value[pos], d1) || - !hex_digit_decode(value[pos+1], d2)) { - success = false; - break; - } + !hex_digit_decode(value[pos+1], d2)) + return false; + components[cc] = (d1 & 0xf) << 4 | (d2 & 0xf); - pos++; // skip the second digit -- it's already used + pos++; // skip the second digit -- it's already used } } - if (success) { - color.setRed(components[0]); - color.setGreen(components[1]); - color.setBlue(components[2]); - color.setAlpha(components[3]); - } + color.setRed(components[0]); + color.setGreen(components[1]); + color.setBlue(components[2]); + color.setAlpha(components[3]); - return success; + return true; } -struct ColorContainer { - ColorContainer(); - std::map<const std::string, u32> colors; +const static std::unordered_map<std::string, u32> s_named_colors = { + {"aliceblue", 0xf0f8ff}, + {"antiquewhite", 0xfaebd7}, + {"aqua", 0x00ffff}, + {"aquamarine", 0x7fffd4}, + {"azure", 0xf0ffff}, + {"beige", 0xf5f5dc}, + {"bisque", 0xffe4c4}, + {"black", 00000000}, + {"blanchedalmond", 0xffebcd}, + {"blue", 0x0000ff}, + {"blueviolet", 0x8a2be2}, + {"brown", 0xa52a2a}, + {"burlywood", 0xdeb887}, + {"cadetblue", 0x5f9ea0}, + {"chartreuse", 0x7fff00}, + {"chocolate", 0xd2691e}, + {"coral", 0xff7f50}, + {"cornflowerblue", 0x6495ed}, + {"cornsilk", 0xfff8dc}, + {"crimson", 0xdc143c}, + {"cyan", 0x00ffff}, + {"darkblue", 0x00008b}, + {"darkcyan", 0x008b8b}, + {"darkgoldenrod", 0xb8860b}, + {"darkgray", 0xa9a9a9}, + {"darkgreen", 0x006400}, + {"darkgrey", 0xa9a9a9}, + {"darkkhaki", 0xbdb76b}, + {"darkmagenta", 0x8b008b}, + {"darkolivegreen", 0x556b2f}, + {"darkorange", 0xff8c00}, + {"darkorchid", 0x9932cc}, + {"darkred", 0x8b0000}, + {"darksalmon", 0xe9967a}, + {"darkseagreen", 0x8fbc8f}, + {"darkslateblue", 0x483d8b}, + {"darkslategray", 0x2f4f4f}, + {"darkslategrey", 0x2f4f4f}, + {"darkturquoise", 0x00ced1}, + {"darkviolet", 0x9400d3}, + {"deeppink", 0xff1493}, + {"deepskyblue", 0x00bfff}, + {"dimgray", 0x696969}, + {"dimgrey", 0x696969}, + {"dodgerblue", 0x1e90ff}, + {"firebrick", 0xb22222}, + {"floralwhite", 0xfffaf0}, + {"forestgreen", 0x228b22}, + {"fuchsia", 0xff00ff}, + {"gainsboro", 0xdcdcdc}, + {"ghostwhite", 0xf8f8ff}, + {"gold", 0xffd700}, + {"goldenrod", 0xdaa520}, + {"gray", 0x808080}, + {"green", 0x008000}, + {"greenyellow", 0xadff2f}, + {"grey", 0x808080}, + {"honeydew", 0xf0fff0}, + {"hotpink", 0xff69b4}, + {"indianred", 0xcd5c5c}, + {"indigo", 0x4b0082}, + {"ivory", 0xfffff0}, + {"khaki", 0xf0e68c}, + {"lavender", 0xe6e6fa}, + {"lavenderblush", 0xfff0f5}, + {"lawngreen", 0x7cfc00}, + {"lemonchiffon", 0xfffacd}, + {"lightblue", 0xadd8e6}, + {"lightcoral", 0xf08080}, + {"lightcyan", 0xe0ffff}, + {"lightgoldenrodyellow", 0xfafad2}, + {"lightgray", 0xd3d3d3}, + {"lightgreen", 0x90ee90}, + {"lightgrey", 0xd3d3d3}, + {"lightpink", 0xffb6c1}, + {"lightsalmon", 0xffa07a}, + {"lightseagreen", 0x20b2aa}, + {"lightskyblue", 0x87cefa}, + {"lightslategray", 0x778899}, + {"lightslategrey", 0x778899}, + {"lightsteelblue", 0xb0c4de}, + {"lightyellow", 0xffffe0}, + {"lime", 0x00ff00}, + {"limegreen", 0x32cd32}, + {"linen", 0xfaf0e6}, + {"magenta", 0xff00ff}, + {"maroon", 0x800000}, + {"mediumaquamarine", 0x66cdaa}, + {"mediumblue", 0x0000cd}, + {"mediumorchid", 0xba55d3}, + {"mediumpurple", 0x9370db}, + {"mediumseagreen", 0x3cb371}, + {"mediumslateblue", 0x7b68ee}, + {"mediumspringgreen", 0x00fa9a}, + {"mediumturquoise", 0x48d1cc}, + {"mediumvioletred", 0xc71585}, + {"midnightblue", 0x191970}, + {"mintcream", 0xf5fffa}, + {"mistyrose", 0xffe4e1}, + {"moccasin", 0xffe4b5}, + {"navajowhite", 0xffdead}, + {"navy", 0x000080}, + {"oldlace", 0xfdf5e6}, + {"olive", 0x808000}, + {"olivedrab", 0x6b8e23}, + {"orange", 0xffa500}, + {"orangered", 0xff4500}, + {"orchid", 0xda70d6}, + {"palegoldenrod", 0xeee8aa}, + {"palegreen", 0x98fb98}, + {"paleturquoise", 0xafeeee}, + {"palevioletred", 0xdb7093}, + {"papayawhip", 0xffefd5}, + {"peachpuff", 0xffdab9}, + {"peru", 0xcd853f}, + {"pink", 0xffc0cb}, + {"plum", 0xdda0dd}, + {"powderblue", 0xb0e0e6}, + {"purple", 0x800080}, + {"rebeccapurple", 0x663399}, + {"red", 0xff0000}, + {"rosybrown", 0xbc8f8f}, + {"royalblue", 0x4169e1}, + {"saddlebrown", 0x8b4513}, + {"salmon", 0xfa8072}, + {"sandybrown", 0xf4a460}, + {"seagreen", 0x2e8b57}, + {"seashell", 0xfff5ee}, + {"sienna", 0xa0522d}, + {"silver", 0xc0c0c0}, + {"skyblue", 0x87ceeb}, + {"slateblue", 0x6a5acd}, + {"slategray", 0x708090}, + {"slategrey", 0x708090}, + {"snow", 0xfffafa}, + {"springgreen", 0x00ff7f}, + {"steelblue", 0x4682b4}, + {"tan", 0xd2b48c}, + {"teal", 0x008080}, + {"thistle", 0xd8bfd8}, + {"tomato", 0xff6347}, + {"turquoise", 0x40e0d0}, + {"violet", 0xee82ee}, + {"wheat", 0xf5deb3}, + {"white", 0xffffff}, + {"whitesmoke", 0xf5f5f5}, + {"yellow", 0xffff00}, + {"yellowgreen", 0x9acd32} }; -ColorContainer::ColorContainer() -{ - colors["aliceblue"] = 0xf0f8ff; - colors["antiquewhite"] = 0xfaebd7; - colors["aqua"] = 0x00ffff; - colors["aquamarine"] = 0x7fffd4; - colors["azure"] = 0xf0ffff; - colors["beige"] = 0xf5f5dc; - colors["bisque"] = 0xffe4c4; - colors["black"] = 00000000; - colors["blanchedalmond"] = 0xffebcd; - colors["blue"] = 0x0000ff; - colors["blueviolet"] = 0x8a2be2; - colors["brown"] = 0xa52a2a; - colors["burlywood"] = 0xdeb887; - colors["cadetblue"] = 0x5f9ea0; - colors["chartreuse"] = 0x7fff00; - colors["chocolate"] = 0xd2691e; - colors["coral"] = 0xff7f50; - colors["cornflowerblue"] = 0x6495ed; - colors["cornsilk"] = 0xfff8dc; - colors["crimson"] = 0xdc143c; - colors["cyan"] = 0x00ffff; - colors["darkblue"] = 0x00008b; - colors["darkcyan"] = 0x008b8b; - colors["darkgoldenrod"] = 0xb8860b; - colors["darkgray"] = 0xa9a9a9; - colors["darkgreen"] = 0x006400; - colors["darkgrey"] = 0xa9a9a9; - colors["darkkhaki"] = 0xbdb76b; - colors["darkmagenta"] = 0x8b008b; - colors["darkolivegreen"] = 0x556b2f; - colors["darkorange"] = 0xff8c00; - colors["darkorchid"] = 0x9932cc; - colors["darkred"] = 0x8b0000; - colors["darksalmon"] = 0xe9967a; - colors["darkseagreen"] = 0x8fbc8f; - colors["darkslateblue"] = 0x483d8b; - colors["darkslategray"] = 0x2f4f4f; - colors["darkslategrey"] = 0x2f4f4f; - colors["darkturquoise"] = 0x00ced1; - colors["darkviolet"] = 0x9400d3; - colors["deeppink"] = 0xff1493; - colors["deepskyblue"] = 0x00bfff; - colors["dimgray"] = 0x696969; - colors["dimgrey"] = 0x696969; - colors["dodgerblue"] = 0x1e90ff; - colors["firebrick"] = 0xb22222; - colors["floralwhite"] = 0xfffaf0; - colors["forestgreen"] = 0x228b22; - colors["fuchsia"] = 0xff00ff; - colors["gainsboro"] = 0xdcdcdc; - colors["ghostwhite"] = 0xf8f8ff; - colors["gold"] = 0xffd700; - colors["goldenrod"] = 0xdaa520; - colors["gray"] = 0x808080; - colors["green"] = 0x008000; - colors["greenyellow"] = 0xadff2f; - colors["grey"] = 0x808080; - colors["honeydew"] = 0xf0fff0; - colors["hotpink"] = 0xff69b4; - colors["indianred"] = 0xcd5c5c; - colors["indigo"] = 0x4b0082; - colors["ivory"] = 0xfffff0; - colors["khaki"] = 0xf0e68c; - colors["lavender"] = 0xe6e6fa; - colors["lavenderblush"] = 0xfff0f5; - colors["lawngreen"] = 0x7cfc00; - colors["lemonchiffon"] = 0xfffacd; - colors["lightblue"] = 0xadd8e6; - colors["lightcoral"] = 0xf08080; - colors["lightcyan"] = 0xe0ffff; - colors["lightgoldenrodyellow"] = 0xfafad2; - colors["lightgray"] = 0xd3d3d3; - colors["lightgreen"] = 0x90ee90; - colors["lightgrey"] = 0xd3d3d3; - colors["lightpink"] = 0xffb6c1; - colors["lightsalmon"] = 0xffa07a; - colors["lightseagreen"] = 0x20b2aa; - colors["lightskyblue"] = 0x87cefa; - colors["lightslategray"] = 0x778899; - colors["lightslategrey"] = 0x778899; - colors["lightsteelblue"] = 0xb0c4de; - colors["lightyellow"] = 0xffffe0; - colors["lime"] = 0x00ff00; - colors["limegreen"] = 0x32cd32; - colors["linen"] = 0xfaf0e6; - colors["magenta"] = 0xff00ff; - colors["maroon"] = 0x800000; - colors["mediumaquamarine"] = 0x66cdaa; - colors["mediumblue"] = 0x0000cd; - colors["mediumorchid"] = 0xba55d3; - colors["mediumpurple"] = 0x9370db; - colors["mediumseagreen"] = 0x3cb371; - colors["mediumslateblue"] = 0x7b68ee; - colors["mediumspringgreen"] = 0x00fa9a; - colors["mediumturquoise"] = 0x48d1cc; - colors["mediumvioletred"] = 0xc71585; - colors["midnightblue"] = 0x191970; - colors["mintcream"] = 0xf5fffa; - colors["mistyrose"] = 0xffe4e1; - colors["moccasin"] = 0xffe4b5; - colors["navajowhite"] = 0xffdead; - colors["navy"] = 0x000080; - colors["oldlace"] = 0xfdf5e6; - colors["olive"] = 0x808000; - colors["olivedrab"] = 0x6b8e23; - colors["orange"] = 0xffa500; - colors["orangered"] = 0xff4500; - colors["orchid"] = 0xda70d6; - colors["palegoldenrod"] = 0xeee8aa; - colors["palegreen"] = 0x98fb98; - colors["paleturquoise"] = 0xafeeee; - colors["palevioletred"] = 0xdb7093; - colors["papayawhip"] = 0xffefd5; - colors["peachpuff"] = 0xffdab9; - colors["peru"] = 0xcd853f; - colors["pink"] = 0xffc0cb; - colors["plum"] = 0xdda0dd; - colors["powderblue"] = 0xb0e0e6; - colors["purple"] = 0x800080; - colors["red"] = 0xff0000; - colors["rosybrown"] = 0xbc8f8f; - colors["royalblue"] = 0x4169e1; - colors["saddlebrown"] = 0x8b4513; - colors["salmon"] = 0xfa8072; - colors["sandybrown"] = 0xf4a460; - colors["seagreen"] = 0x2e8b57; - colors["seashell"] = 0xfff5ee; - colors["sienna"] = 0xa0522d; - colors["silver"] = 0xc0c0c0; - colors["skyblue"] = 0x87ceeb; - colors["slateblue"] = 0x6a5acd; - colors["slategray"] = 0x708090; - colors["slategrey"] = 0x708090; - colors["snow"] = 0xfffafa; - colors["springgreen"] = 0x00ff7f; - colors["steelblue"] = 0x4682b4; - colors["tan"] = 0xd2b48c; - colors["teal"] = 0x008080; - colors["thistle"] = 0xd8bfd8; - colors["tomato"] = 0xff6347; - colors["turquoise"] = 0x40e0d0; - colors["violet"] = 0xee82ee; - colors["wheat"] = 0xf5deb3; - colors["white"] = 0xffffff; - colors["whitesmoke"] = 0xf5f5f5; - colors["yellow"] = 0xffff00; - colors["yellowgreen"] = 0x9acd32; - -} - -static const ColorContainer named_colors; - static bool parseNamedColorString(const std::string &value, video::SColor &color) { std::string color_name; @@ -633,11 +529,10 @@ static bool parseNamedColorString(const std::string &value, video::SColor &color color_name = value; } - color_name = lowercase(value); + color_name = lowercase(color_name); - std::map<const std::string, unsigned>::const_iterator it; - it = named_colors.colors.find(color_name); - if (it == named_colors.colors.end()) + auto it = s_named_colors.find(color_name); + if (it == s_named_colors.end()) return false; u32 color_temp = it->second; @@ -645,21 +540,26 @@ static bool parseNamedColorString(const std::string &value, video::SColor &color /* An empty string for alpha is ok (none of the color table entries * have an alpha value either). Color strings without an alpha specified * are interpreted as fully opaque - * - * For named colors the supplied alpha string (representing a hex value) - * must be exactly two digits. For example: colorname#08 */ if (!alpha_string.empty()) { - if (alpha_string.length() != 2) - return false; + if (alpha_string.size() == 1) { + u8 d; + if (!hex_digit_decode(alpha_string[0], d)) + return false; - unsigned char d1, d2; - if (!hex_digit_decode(alpha_string.at(0), d1) - || !hex_digit_decode(alpha_string.at(1), d2)) + color_temp |= ((d & 0xf) << 4 | (d & 0xf)) << 24; + } else if (alpha_string.size() == 2) { + u8 d1, d2; + if (!hex_digit_decode(alpha_string[0], d1) + || !hex_digit_decode(alpha_string[1], d2)) + return false; + + color_temp |= ((d1 & 0xf) << 4 | (d2 & 0xf)) << 24; + } else { return false; - color_temp |= ((d1 & 0xf) << 4 | (d2 & 0xf)) << 24; + } } else { - color_temp |= 0xff << 24; // Fully opaque + color_temp |= 0xff << 24; // Fully opaque } color = video::SColor(color_temp); @@ -667,6 +567,22 @@ static bool parseNamedColorString(const std::string &value, video::SColor &color return true; } +bool parseColorString(const std::string &value, video::SColor &color, bool quiet, + unsigned char default_alpha) +{ + bool success; + + if (value[0] == '#') + success = parseHexColorString(value, color, default_alpha); + else + success = parseNamedColorString(value, color); + + if (!success && !quiet) + errorstream << "Invalid color: \"" << value << "\"" << std::endl; + + return success; +} + void str_replace(std::string &str, char from, char to) { std::replace(str.begin(), str.end(), from, to); @@ -766,7 +682,8 @@ void translate_string(const std::wstring &s, Translations *translations, } else { // This is an escape sequence *inside* the template string to translate itself. // This should not happen, show an error message. - errorstream << "Ignoring escape sequence '" << wide_to_narrow(escape_sequence) << "' in translation" << std::endl; + errorstream << "Ignoring escape sequence '" + << wide_to_utf8(escape_sequence) << "' in translation" << std::endl; } } @@ -891,9 +808,11 @@ std::wstring translate_string(const std::wstring &s) #endif } -static const std::array<std::wstring, 22> disallowed_dir_names = { +static const std::array<std::wstring, 30> disallowed_dir_names = { // Problematic filenames from here: // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#file-and-directory-names + // Plus undocumented values from here: + // https://googleprojectzero.blogspot.com/2016/02/the-definitive-guide-on-win32-to-nt.html L"CON", L"PRN", L"AUX", @@ -907,6 +826,9 @@ static const std::array<std::wstring, 22> disallowed_dir_names = { L"COM7", L"COM8", L"COM9", + L"COM\u00B2", + L"COM\u00B3", + L"COM\u00B9", L"LPT1", L"LPT2", L"LPT3", @@ -916,6 +838,11 @@ static const std::array<std::wstring, 22> disallowed_dir_names = { L"LPT7", L"LPT8", L"LPT9", + L"LPT\u00B2", + L"LPT\u00B3", + L"LPT\u00B9", + L"CONIN$", + L"CONOUT$", }; /** @@ -923,12 +850,7 @@ static const std::array<std::wstring, 22> disallowed_dir_names = { */ static const std::wstring disallowed_path_chars = L"<>:\"/\\|?*."; -/** - * Sanitize the name of a new directory. This consists of two stages: - * 1. Check for 'reserved filenames' that can't be used on some filesystems - * and add a prefix to them - * 2. Remove 'unsafe' characters from the name by replacing them with '_' - */ + std::string sanitizeDirName(const std::string &str, const std::string &optional_prefix) { std::wstring safe_name = utf8_to_wide(str); @@ -940,7 +862,18 @@ std::string sanitizeDirName(const std::string &str, const std::string &optional_ } } - for (unsigned long i = 0; i < safe_name.length(); i++) { + // Replace leading and trailing spaces with underscores. + size_t start = safe_name.find_first_not_of(L' '); + size_t end = safe_name.find_last_not_of(L' '); + if (start == std::wstring::npos || end == std::wstring::npos) + start = end = safe_name.size(); + for (size_t i = 0; i < start; i++) + safe_name[i] = L'_'; + for (size_t i = end + 1; i < safe_name.size(); i++) + safe_name[i] = L'_'; + + // Replace other disallowed characters with underscores + for (size_t i = 0; i < safe_name.length(); i++) { bool is_valid = true; // Unlikely, but control characters should always be blacklisted @@ -952,8 +885,24 @@ std::string sanitizeDirName(const std::string &str, const std::string &optional_ } if (!is_valid) - safe_name[i] = '_'; + safe_name[i] = L'_'; } return wide_to_utf8(safe_name); } + + +void safe_print_string(std::ostream &os, const std::string &str) +{ + std::ostream::fmtflags flags = os.flags(); + os << std::hex; + for (const char c : str) { + if (IS_ASCII_PRINTABLE_CHAR(c) || IS_UTF8_MULTB_START(c) || + IS_UTF8_MULTB_INNER(c) || c == '\n' || c == '\t') { + os << c; + } else { + os << '<' << std::setw(2) << (int)c << '>'; + } + } + os.setf(flags); +} diff --git a/src/util/string.h b/src/util/string.h index 6fd11fadc..aa4329f2f 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -64,22 +64,14 @@ struct FlagDesc { u32 flag; }; -// try not to convert between wide/utf8 encodings; this can result in data loss -// try to only convert between them when you need to input/output stuff via Irrlicht +// Try to avoid converting between wide and UTF-8 unless you need to +// input/output stuff via Irrlicht std::wstring utf8_to_wide(const std::string &input); std::string wide_to_utf8(const std::wstring &input); -wchar_t *utf8_to_wide_c(const char *str); - -// NEVER use those two functions unless you have a VERY GOOD reason to -// they just convert between wide and multibyte encoding -// multibyte encoding depends on current locale, this is no good, especially on Windows - // You must free the returned string! -// The returned string is allocated using new -wchar_t *narrow_to_wide_c(const char *str); -std::wstring narrow_to_wide(const std::string &mbs); -std::string wide_to_narrow(const std::wstring &wcs); +// The returned string is allocated using new[] +wchar_t *utf8_to_wide_c(const char *str); std::string urlencode(const std::string &str); std::string urldecode(const std::string &str); @@ -303,11 +295,11 @@ inline std::string lowercase(const std::string &str) inline std::string trim(const std::string &str) { size_t front = 0; + size_t back = str.size(); - while (std::isspace(str[front])) + while (front < back && std::isspace(str[front])) ++front; - size_t back = str.size(); while (back > front && std::isspace(str[back - 1])) --back; @@ -353,11 +345,6 @@ inline s32 mystoi(const std::string &str, s32 min, s32 max) return i; } - -// MSVC2010 includes it's own versions of these -//#if !defined(_MSC_VER) || _MSC_VER < 1600 - - /** * Returns a 32-bit value reprensented by the string \p str (decimal). * @see atoi(3) for further limitations @@ -367,17 +354,6 @@ inline s32 mystoi(const std::string &str) return atoi(str.c_str()); } - -/** - * Returns s 32-bit value represented by the wide string \p str (decimal). - * @see atoi(3) for further limitations - */ -inline s32 mystoi(const std::wstring &str) -{ - return mystoi(wide_to_narrow(str)); -} - - /** * Returns a float reprensented by the string \p str (decimal). * @see atof(3) @@ -387,8 +363,6 @@ inline float mystof(const std::string &str) return atof(str.c_str()); } -//#endif - #define stoi mystoi #define stof mystof @@ -436,7 +410,7 @@ DEFINE_STD_TOSTRING_FLOATINGPOINT(long double) template <typename T> inline wstring to_wstring(T val) { - return utf8_to_wide(to_string(val)); + return utf8_to_wide(to_string(val)); } } #endif @@ -687,24 +661,49 @@ inline const char *bool_to_cstr(bool val) return val ? "true" : "false"; } +/** + * Converts a duration in seconds to a pretty-printed duration in + * days, hours, minutes and seconds. + * + * @param sec duration in seconds + * @return pretty-printed duration + */ inline const std::string duration_to_string(int sec) { + std::ostringstream ss; + const char *neg = ""; + if (sec < 0) { + sec = -sec; + neg = "-"; + } + int total_sec = sec; int min = sec / 60; sec %= 60; int hour = min / 60; min %= 60; + int day = hour / 24; + hour %= 24; + + if (day > 0) { + ss << neg << day << "d"; + if (hour > 0 || min > 0 || sec > 0) + ss << " "; + } - std::stringstream ss; if (hour > 0) { - ss << hour << "h "; + ss << neg << hour << "h"; + if (min > 0 || sec > 0) + ss << " "; } if (min > 0) { - ss << min << "m "; + ss << neg << min << "min"; + if (sec > 0) + ss << " "; } - if (sec > 0) { - ss << sec << "s "; + if (sec > 0 || total_sec == 0) { + ss << neg << sec << "s"; } return ss.str(); @@ -750,7 +749,15 @@ inline irr::core::stringw utf8_to_stringw(const std::string &input) /** * Sanitize the name of a new directory. This consists of two stages: * 1. Check for 'reserved filenames' that can't be used on some filesystems - * and prefix them + * and add a prefix to them * 2. Remove 'unsafe' characters from the name by replacing them with '_' */ std::string sanitizeDirName(const std::string &str, const std::string &optional_prefix); + +/** + * Prints a sanitized version of a string without control characters. + * '\t' and '\n' are allowed, as are UTF-8 control characters (e.g. RTL). + * ASCII control characters are replaced with their hex encoding in angle + * brackets (e.g. "a\x1eb" -> "a<1e>b"). + */ +void safe_print_string(std::ostream &os, const std::string &str); diff --git a/src/version.cpp b/src/version.cpp index 241228a6a..f2aac37df 100644 --- a/src/version.cpp +++ b/src/version.cpp @@ -33,11 +33,11 @@ const char *g_version_hash = VERSION_GITHASH; const char *g_build_info = "BUILD_TYPE=" BUILD_TYPE "\n" "RUN_IN_PLACE=" STR(RUN_IN_PLACE) "\n" + "USE_CURL=" STR(USE_CURL) "\n" +#ifndef SERVER "USE_GETTEXT=" STR(USE_GETTEXT) "\n" "USE_SOUND=" STR(USE_SOUND) "\n" - "USE_CURL=" STR(USE_CURL) "\n" - "USE_FREETYPE=" STR(USE_FREETYPE) "\n" - "USE_LUAJIT=" STR(USE_LUAJIT) "\n" +#endif "STATIC_SHAREDIR=" STR(STATIC_SHAREDIR) #if USE_GETTEXT && defined(STATIC_LOCALEDIR) "\n" "STATIC_LOCALEDIR=" STR(STATIC_LOCALEDIR) diff --git a/src/voxelalgorithms.cpp b/src/voxelalgorithms.cpp index 62fd68890..ffb70aa71 100644 --- a/src/voxelalgorithms.cpp +++ b/src/voxelalgorithms.cpp @@ -65,7 +65,7 @@ struct ChangingLight { ChangingLight() = default; - ChangingLight(const relative_v3 &rel_pos, const mapblock_v3 &block_pos, + ChangingLight(relative_v3 rel_pos, mapblock_v3 block_pos, MapBlock *b, direction source_dir) : rel_position(rel_pos), block_position(block_pos), @@ -125,8 +125,8 @@ struct LightQueue { * The parameters are the same as in ChangingLight's constructor. * \param light light level of the ChangingLight */ - inline void push(u8 light, const relative_v3 &rel_pos, - const mapblock_v3 &block_pos, MapBlock *block, + inline void push(u8 light, relative_v3 rel_pos, + mapblock_v3 block_pos, MapBlock *block, direction source_dir) { assert(light <= LIGHT_SUN); @@ -467,7 +467,7 @@ bool is_sunlight_above(Map *map, v3s16 pos, const NodeDefManager *ndef) static const LightBank banks[] = { LIGHTBANK_DAY, LIGHTBANK_NIGHT }; void update_lighting_nodes(Map *map, - std::vector<std::pair<v3s16, MapNode> > &oldnodes, + const std::vector<std::pair<v3s16, MapNode>> &oldnodes, std::map<v3s16, MapBlock*> &modified_blocks) { const NodeDefManager *ndef = map->getNodeDefManager(); @@ -482,8 +482,7 @@ void update_lighting_nodes(Map *map, // won't change, since they didn't get their light from a // modified node. u8 min_safe_light = 0; - for (std::vector<std::pair<v3s16, MapNode> >::iterator it = - oldnodes.begin(); it < oldnodes.end(); ++it) { + for (auto it = oldnodes.cbegin(); it < oldnodes.cend(); ++it) { u8 old_light = it->second.getLight(bank, ndef); if (old_light > min_safe_light) { min_safe_light = old_light; @@ -495,8 +494,7 @@ void update_lighting_nodes(Map *map, min_safe_light++; } // For each changed node process sunlight and initialize - for (std::vector<std::pair<v3s16, MapNode> >::iterator it = - oldnodes.begin(); it < oldnodes.end(); ++it) { + for (auto it = oldnodes.cbegin(); it < oldnodes.cend(); ++it) { // Get position and block of the changed node v3s16 p = it->first; relative_v3 rel_pos; diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h index 1452f30f4..bcbd3b586 100644 --- a/src/voxelalgorithms.h +++ b/src/voxelalgorithms.h @@ -45,7 +45,7 @@ namespace voxalgo */ void update_lighting_nodes( Map *map, - std::vector<std::pair<v3s16, MapNode> > &oldnodes, + const std::vector<std::pair<v3s16, MapNode>> &oldnodes, std::map<v3s16, MapBlock*> &modified_blocks); /*! diff --git a/textures/base/pack/aux1_btn.png b/textures/base/pack/aux1_btn.png new file mode 100644 index 000000000..8ceb09542 Binary files /dev/null and b/textures/base/pack/aux1_btn.png differ diff --git a/textures/base/pack/aux_btn.png b/textures/base/pack/aux_btn.png deleted file mode 100644 index f589910e8..000000000 Binary files a/textures/base/pack/aux_btn.png and /dev/null differ diff --git a/textures/base/pack/cdb_add.png b/textures/base/pack/cdb_add.png new file mode 100644 index 000000000..3e3d067e3 Binary files /dev/null and b/textures/base/pack/cdb_add.png differ diff --git a/textures/base/pack/cdb_clear.png b/textures/base/pack/cdb_clear.png new file mode 100644 index 000000000..4490d41cb Binary files /dev/null and b/textures/base/pack/cdb_clear.png differ diff --git a/textures/base/pack/cdb_downloading.png b/textures/base/pack/cdb_downloading.png new file mode 100644 index 000000000..8cba383cc Binary files /dev/null and b/textures/base/pack/cdb_downloading.png differ diff --git a/textures/base/pack/cdb_queued.png b/textures/base/pack/cdb_queued.png new file mode 100644 index 000000000..6972f7fb8 Binary files /dev/null and b/textures/base/pack/cdb_queued.png differ diff --git a/textures/base/pack/cdb_update.png b/textures/base/pack/cdb_update.png new file mode 100644 index 000000000..262e42d3b Binary files /dev/null and b/textures/base/pack/cdb_update.png differ diff --git a/textures/base/pack/cdb_viewonline.png b/textures/base/pack/cdb_viewonline.png new file mode 100644 index 000000000..ae2a146b8 Binary files /dev/null and b/textures/base/pack/cdb_viewonline.png differ diff --git a/textures/base/pack/checkbox_16_white.png b/textures/base/pack/checkbox_16_white.png new file mode 100644 index 000000000..0cf0f3e65 Binary files /dev/null and b/textures/base/pack/checkbox_16_white.png differ diff --git a/textures/base/pack/clear.png b/textures/base/pack/clear.png new file mode 100644 index 000000000..9244264ad Binary files /dev/null and b/textures/base/pack/clear.png differ diff --git a/textures/base/pack/error_icon_orange.png b/textures/base/pack/error_icon_orange.png new file mode 100644 index 000000000..1f1586f21 Binary files /dev/null and b/textures/base/pack/error_icon_orange.png differ diff --git a/textures/base/pack/error_icon_red.png b/textures/base/pack/error_icon_red.png new file mode 100644 index 000000000..1f5bafbf4 Binary files /dev/null and b/textures/base/pack/error_icon_red.png differ diff --git a/textures/base/pack/no_screenshot.png b/textures/base/pack/no_screenshot.png index 8c7089897..14df091a2 100644 Binary files a/textures/base/pack/no_screenshot.png and b/textures/base/pack/no_screenshot.png differ diff --git a/textures/base/pack/no_texture.png b/textures/base/pack/no_texture.png new file mode 100644 index 000000000..681b81082 Binary files /dev/null and b/textures/base/pack/no_texture.png differ diff --git a/textures/base/pack/search.png b/textures/base/pack/search.png new file mode 100644 index 000000000..aace8044a Binary files /dev/null and b/textures/base/pack/search.png differ diff --git a/textures/base/pack/server_flags_favorite.png b/textures/base/pack/server_favorite.png similarity index 100% rename from textures/base/pack/server_flags_favorite.png rename to textures/base/pack/server_favorite.png diff --git a/textures/base/pack/server_favorite_delete.png b/textures/base/pack/server_favorite_delete.png new file mode 100644 index 000000000..e35c6aaf0 Binary files /dev/null and b/textures/base/pack/server_favorite_delete.png differ diff --git a/textures/base/pack/server_incompatible.png b/textures/base/pack/server_incompatible.png new file mode 100644 index 000000000..9076ab58f Binary files /dev/null and b/textures/base/pack/server_incompatible.png differ diff --git a/textures/base/pack/server_public.png b/textures/base/pack/server_public.png new file mode 100644 index 000000000..46a48fac8 Binary files /dev/null and b/textures/base/pack/server_public.png differ diff --git a/util/buildbot/buildwin32.sh b/util/buildbot/buildwin32.sh index e62d32969..3df48f178 100755 --- a/util/buildbot/buildwin32.sh +++ b/util/buildbot/buildwin32.sh @@ -8,7 +8,7 @@ GAME_GIT=https://github.com/minetest/minetest_game GAME_BRANCH=master GAME_NAME=minetest_game -dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +topdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" if [ $# -ne 1 ]; then echo "Usage: $0 <build directory>" exit 1 @@ -16,114 +16,134 @@ fi builddir=$1 mkdir -p $builddir builddir="$( cd "$builddir" && pwd )" -packagedir=$builddir/packages libdir=$builddir/libs # Test which win32 compiler is present -which i586-mingw32msvc-windres &>/dev/null && toolchain_file=$dir/toolchain_i586-mingw32msvc.cmake -which i686-w64-mingw32-windres &>/dev/null && toolchain_file=$dir/toolchain_i646-w64-mingw32.cmake +command -v i686-w64-mingw32-gcc >/dev/null && + compiler=i686-w64-mingw32-gcc +command -v i686-w64-mingw32-gcc-posix >/dev/null && + compiler=i686-w64-mingw32-gcc-posix -if [ -z "$toolchain_file" ]; then - echo "Unable to determine which mingw32 compiler to use" +if [ -z "$compiler" ]; then + echo "Unable to determine which MinGW compiler to use" exit 1 fi +toolchain_file=$topdir/toolchain_${compiler/-gcc/}.cmake echo "Using $toolchain_file" -irrlicht_version=1.8.4 -ogg_version=1.3.2 -vorbis_version=1.3.5 -curl_version=7.65.3 -gettext_version=0.20.1 -freetype_version=2.10.1 -sqlite3_version=3.27.2 -luajit_version=2.1.0-beta3 -leveldb_version=1.22 -zlib_version=1.2.11 - -mkdir -p $packagedir -mkdir -p $libdir - -cd $builddir +# Try to find runtime DLLs in various paths (varies by distribution, sigh) +tmp=$(dirname "$(command -v $compiler)")/.. +runtime_dlls= +for name in lib{gcc_,stdc++-,winpthread-}'*'.dll; do + for dir in $tmp/i686-w64-mingw32/{bin,lib} $tmp/lib/gcc/i686-w64-mingw32/*; do + [ -d "$dir" ] || continue + file=$(echo $dir/$name) + [ -f "$file" ] && { runtime_dlls+="$file;"; break; } + done +done +[ -z "$runtime_dlls" ] && + echo "The compiler runtime DLLs could not be found, they might be missing in the final package." # Get stuff -[ -e $packagedir/irrlicht-$irrlicht_version.zip ] || wget http://minetest.kitsunemimi.pw/irrlicht-$irrlicht_version-win32.zip \ - -c -O $packagedir/irrlicht-$irrlicht_version.zip -[ -e $packagedir/zlib-$zlib_version.zip ] || wget http://minetest.kitsunemimi.pw/zlib-$zlib_version-win32.zip \ - -c -O $packagedir/zlib-$zlib_version.zip -[ -e $packagedir/libogg-$ogg_version.zip ] || wget http://minetest.kitsunemimi.pw/libogg-$ogg_version-win32.zip \ - -c -O $packagedir/libogg-$ogg_version.zip -[ -e $packagedir/libvorbis-$vorbis_version.zip ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-win32.zip \ - -c -O $packagedir/libvorbis-$vorbis_version.zip -[ -e $packagedir/curl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/curl-$curl_version-win32.zip \ - -c -O $packagedir/curl-$curl_version.zip -[ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version-win32.zip \ - -c -O $packagedir/gettext-$gettext_version.zip -[ -e $packagedir/freetype2-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win32.zip \ - -c -O $packagedir/freetype2-$freetype_version.zip -[ -e $packagedir/sqlite3-$sqlite3_version.zip ] || wget http://minetest.kitsunemimi.pw/sqlite3-$sqlite3_version-win32.zip \ - -c -O $packagedir/sqlite3-$sqlite3_version.zip -[ -e $packagedir/luajit-$luajit_version.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-win32.zip \ - -c -O $packagedir/luajit-$luajit_version.zip -[ -e $packagedir/libleveldb-$leveldb_version.zip ] || wget http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win32.zip \ - -c -O $packagedir/libleveldb-$leveldb_version.zip -[ -e $packagedir/openal_stripped.zip ] || wget http://minetest.kitsunemimi.pw/openal_stripped.zip \ - -c -O $packagedir/openal_stripped.zip +irrlicht_version=$(cat $topdir/../../misc/irrlichtmt_tag.txt) +ogg_version=1.3.5 +openal_version=1.21.1 +vorbis_version=1.3.7 +curl_version=7.81.0 +gettext_version=0.20.1 +freetype_version=2.11.1 +sqlite3_version=3.37.2 +luajit_version=2.1.0-beta3 +leveldb_version=1.23 +zlib_version=1.2.11 +zstd_version=1.5.2 + +mkdir -p $libdir + +download () { + local url=$1 + local filename=$2 + [ -z "$filename" ] && filename=${url##*/} + local foldername=${filename%%[.-]*} + local extract=$3 + [ -z "$extract" ] && extract=unzip + + [ -d "./$foldername" ] && return 0 + wget "$url" -c -O "./$filename" + if [ "$extract" = "unzip" ]; then + unzip -o "$filename" -d "$foldername" + elif [ "$extract" = "unzip_nofolder" ]; then + unzip -o "$filename" + else + return 1 + fi +} + +# 'dw2' just points to rebuilt versions after a toolchain change +# this distinction should be gotten rid of next time -# Extract stuff cd $libdir -[ -d irrlicht ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip -d irrlicht -[ -d zlib ] || unzip -o $packagedir/zlib-$zlib_version.zip -d zlib -[ -d libogg ] || unzip -o $packagedir/libogg-$ogg_version.zip -d libogg -[ -d libvorbis ] || unzip -o $packagedir/libvorbis-$vorbis_version.zip -d libvorbis -[ -d libcurl ] || unzip -o $packagedir/curl-$curl_version.zip -d libcurl -[ -d gettext ] || unzip -o $packagedir/gettext-$gettext_version.zip -d gettext -[ -d freetype ] || unzip -o $packagedir/freetype2-$freetype_version.zip -d freetype -[ -d sqlite3 ] || unzip -o $packagedir/sqlite3-$sqlite3_version.zip -d sqlite3 -[ -d openal_stripped ] || unzip -o $packagedir/openal_stripped.zip -[ -d luajit ] || unzip -o $packagedir/luajit-$luajit_version.zip -d luajit -[ -d leveldb ] || unzip -o $packagedir/libleveldb-$leveldb_version.zip -d leveldb +download "https://github.com/minetest/irrlicht/releases/download/$irrlicht_version/win32.zip" irrlicht-$irrlicht_version.zip +download "http://minetest.kitsunemimi.pw/dw2/zlib-$zlib_version-win32.zip" +download "http://minetest.kitsunemimi.pw/zstd-$zstd_version-win32.zip" +download "http://minetest.kitsunemimi.pw/libogg-$ogg_version-win32.zip" +download "http://minetest.kitsunemimi.pw/dw2/libvorbis-$vorbis_version-win32.zip" +download "http://minetest.kitsunemimi.pw/curl-$curl_version-win32.zip" +download "http://minetest.kitsunemimi.pw/dw2/gettext-$gettext_version-win32.zip" +download "http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win32.zip" freetype-$freetype_version.zip +download "http://minetest.kitsunemimi.pw/sqlite3-$sqlite3_version-win32.zip" +download "http://minetest.kitsunemimi.pw/dw2/luajit-$luajit_version-win32.zip" +download "http://minetest.kitsunemimi.pw/dw2/libleveldb-$leveldb_version-win32.zip" leveldb-$leveldb_version.zip +download "http://minetest.kitsunemimi.pw/openal-soft-$openal_version-win32.zip" -# Get minetest -cd $builddir -if [ ! "x$EXISTING_MINETEST_DIR" = "x" ]; then - cd /$EXISTING_MINETEST_DIR # must be absolute path +# Set source dir, downloading Minetest as needed +if [ -n "$EXISTING_MINETEST_DIR" ]; then + sourcedir="$( cd "$EXISTING_MINETEST_DIR" && pwd )" else - [ -d $CORE_NAME ] && (cd $CORE_NAME && git pull) || (git clone -b $CORE_BRANCH $CORE_GIT) - cd $CORE_NAME + cd $builddir + sourcedir=$PWD/$CORE_NAME + [ -d $CORE_NAME ] && { pushd $CORE_NAME; git pull; popd; } || \ + git clone -b $CORE_BRANCH $CORE_GIT $CORE_NAME + if [ -z "$NO_MINETEST_GAME" ]; then + cd $sourcedir + [ -d games/$GAME_NAME ] && { pushd games/$GAME_NAME; git pull; popd; } || \ + git clone -b $GAME_BRANCH $GAME_GIT games/$GAME_NAME + fi fi -git_hash=$(git rev-parse --short HEAD) -# Get minetest_game -if [ "x$NO_MINETEST_GAME" = "x" ]; then - cd games - [ -d $GAME_NAME ] && (cd $GAME_NAME && git pull) || (git clone -b $GAME_BRANCH $GAME_GIT) - cd .. -fi +git_hash=$(cd $sourcedir && git rev-parse --short HEAD) # Build the thing -[ -d _build ] && rm -Rf _build/ -mkdir _build -cd _build -cmake .. \ +cd $builddir +[ -d build ] && rm -rf build + +irr_dlls=$(echo $libdir/irrlicht/lib/*.dll | tr ' ' ';') +vorbis_dlls=$(echo $libdir/libvorbis/bin/libvorbis{,file}-*.dll | tr ' ' ';') +gettext_dlls=$(echo $libdir/gettext/bin/lib{intl,iconv}-*.dll | tr ' ' ';') + +cmake -S $sourcedir -B build \ + -DCMAKE_TOOLCHAIN_FILE=$toolchain_file \ -DCMAKE_INSTALL_PREFIX=/tmp \ -DVERSION_EXTRA=$git_hash \ -DBUILD_CLIENT=1 -DBUILD_SERVER=0 \ - -DCMAKE_TOOLCHAIN_FILE=$toolchain_file \ + -DEXTRA_DLL="$runtime_dlls" \ \ -DENABLE_SOUND=1 \ -DENABLE_CURL=1 \ -DENABLE_GETTEXT=1 \ - -DENABLE_FREETYPE=1 \ -DENABLE_LEVELDB=1 \ \ - -DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include \ - -DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/Win32-gcc/libIrrlicht.dll.a \ - -DIRRLICHT_DLL=$libdir/irrlicht/bin/Win32-gcc/Irrlicht.dll \ + -DCMAKE_PREFIX_PATH=$libdir/irrlicht \ + -DIRRLICHT_DLL="$irr_dlls" \ \ -DZLIB_INCLUDE_DIR=$libdir/zlib/include \ - -DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \ + -DZLIB_LIBRARY=$libdir/zlib/lib/libz.dll.a \ -DZLIB_DLL=$libdir/zlib/bin/zlib1.dll \ \ + -DZSTD_INCLUDE_DIR=$libdir/zstd/include \ + -DZSTD_LIBRARY=$libdir/zstd/lib/libzstd.dll.a \ + -DZSTD_DLL=$libdir/zstd/bin/libzstd.dll \ + \ -DLUA_INCLUDE_DIR=$libdir/luajit/include \ -DLUA_LIBRARY=$libdir/luajit/libluajit.a \ \ @@ -133,21 +153,19 @@ cmake .. \ \ -DVORBIS_INCLUDE_DIR=$libdir/libvorbis/include \ -DVORBIS_LIBRARY=$libdir/libvorbis/lib/libvorbis.dll.a \ - -DVORBIS_DLL=$libdir/libvorbis/bin/libvorbis-0.dll \ + -DVORBIS_DLL="$vorbis_dlls" \ -DVORBISFILE_LIBRARY=$libdir/libvorbis/lib/libvorbisfile.dll.a \ - -DVORBISFILE_DLL=$libdir/libvorbis/bin/libvorbisfile-3.dll \ \ - -DOPENAL_INCLUDE_DIR=$libdir/openal_stripped/include/AL \ - -DOPENAL_LIBRARY=$libdir/openal_stripped/lib/libOpenAL32.dll.a \ - -DOPENAL_DLL=$libdir/openal_stripped/bin/OpenAL32.dll \ + -DOPENAL_INCLUDE_DIR=$libdir/openal/include/AL \ + -DOPENAL_LIBRARY=$libdir/openal/lib/libOpenAL32.dll.a \ + -DOPENAL_DLL=$libdir/openal/bin/OpenAL32.dll \ \ - -DCURL_DLL=$libdir/libcurl/bin/libcurl-4.dll \ - -DCURL_INCLUDE_DIR=$libdir/libcurl/include \ - -DCURL_LIBRARY=$libdir/libcurl/lib/libcurl.dll.a \ + -DCURL_DLL=$libdir/curl/bin/libcurl-4.dll \ + -DCURL_INCLUDE_DIR=$libdir/curl/include \ + -DCURL_LIBRARY=$libdir/curl/lib/libcurl.dll.a \ \ - -DGETTEXT_MSGFMT=`which msgfmt` \ - -DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \ - -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \ + -DGETTEXT_MSGFMT=`command -v msgfmt` \ + -DGETTEXT_DLL="$gettext_dlls" \ -DGETTEXT_INCLUDE_DIR=$libdir/gettext/include \ -DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a \ \ @@ -164,9 +182,9 @@ cmake .. \ -DLEVELDB_LIBRARY=$libdir/leveldb/lib/libleveldb.dll.a \ -DLEVELDB_DLL=$libdir/leveldb/bin/libleveldb.dll -make -j$(nproc) +cmake --build build -j$(nproc) -[ "x$NO_PACKAGE" = "x" ] && make package +[ -z "$NO_PACKAGE" ] && cmake --build build --target package exit 0 # EOF diff --git a/util/buildbot/buildwin64.sh b/util/buildbot/buildwin64.sh index 94e009c29..9d222ab42 100755 --- a/util/buildbot/buildwin64.sh +++ b/util/buildbot/buildwin64.sh @@ -8,7 +8,7 @@ GAME_GIT=https://github.com/minetest/minetest_game GAME_BRANCH=master GAME_NAME=minetest_game -dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +topdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" if [ $# -ne 1 ]; then echo "Usage: $0 <build directory>" exit 1 @@ -16,106 +16,131 @@ fi builddir=$1 mkdir -p $builddir builddir="$( cd "$builddir" && pwd )" -packagedir=$builddir/packages libdir=$builddir/libs -toolchain_file=$dir/toolchain_x86_64-w64-mingw32.cmake -irrlicht_version=1.8.4 -ogg_version=1.3.2 -vorbis_version=1.3.5 -curl_version=7.65.3 -gettext_version=0.20.1 -freetype_version=2.10.1 -sqlite3_version=3.27.2 -luajit_version=2.1.0-beta3 -leveldb_version=1.22 -zlib_version=1.2.11 +# Test which win64 compiler is present +command -v x86_64-w64-mingw32-gcc >/dev/null && + compiler=x86_64-w64-mingw32-gcc +command -v x86_64-w64-mingw32-gcc-posix >/dev/null && + compiler=x86_64-w64-mingw32-gcc-posix -mkdir -p $packagedir -mkdir -p $libdir +if [ -z "$compiler" ]; then + echo "Unable to determine which MinGW compiler to use" + exit 1 +fi +toolchain_file=$topdir/toolchain_${compiler/-gcc/}.cmake +echo "Using $toolchain_file" -cd $builddir +# Try to find runtime DLLs in various paths (varies by distribution, sigh) +tmp=$(dirname "$(command -v $compiler)")/.. +runtime_dlls= +for name in lib{gcc_,stdc++-,winpthread-}'*'.dll; do + for dir in $tmp/x86_64-w64-mingw32/{bin,lib} $tmp/lib/gcc/x86_64-w64-mingw32/*; do + [ -d "$dir" ] || continue + file=$(echo $dir/$name) + [ -f "$file" ] && { runtime_dlls+="$file;"; break; } + done +done +[ -z "$runtime_dlls" ] && + echo "The compiler runtime DLLs could not be found, they might be missing in the final package." # Get stuff -[ -e $packagedir/irrlicht-$irrlicht_version.zip ] || wget http://minetest.kitsunemimi.pw/irrlicht-$irrlicht_version-win64.zip \ - -c -O $packagedir/irrlicht-$irrlicht_version.zip -[ -e $packagedir/zlib-$zlib_version.zip ] || wget http://minetest.kitsunemimi.pw/zlib-$zlib_version-win64.zip \ - -c -O $packagedir/zlib-$zlib_version.zip -[ -e $packagedir/libogg-$ogg_version.zip ] || wget http://minetest.kitsunemimi.pw/libogg-$ogg_version-win64.zip \ - -c -O $packagedir/libogg-$ogg_version.zip -[ -e $packagedir/libvorbis-$vorbis_version.zip ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-win64.zip \ - -c -O $packagedir/libvorbis-$vorbis_version.zip -[ -e $packagedir/curl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/curl-$curl_version-win64.zip \ - -c -O $packagedir/curl-$curl_version.zip -[ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version-win64.zip \ - -c -O $packagedir/gettext-$gettext_version.zip -[ -e $packagedir/freetype2-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win64.zip \ - -c -O $packagedir/freetype2-$freetype_version.zip -[ -e $packagedir/sqlite3-$sqlite3_version.zip ] || wget http://minetest.kitsunemimi.pw/sqlite3-$sqlite3_version-win64.zip \ - -c -O $packagedir/sqlite3-$sqlite3_version.zip -[ -e $packagedir/luajit-$luajit_version.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-win64.zip \ - -c -O $packagedir/luajit-$luajit_version.zip -[ -e $packagedir/libleveldb-$leveldb_version.zip ] || wget http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win64.zip \ - -c -O $packagedir/libleveldb-$leveldb_version.zip -[ -e $packagedir/openal_stripped.zip ] || wget http://minetest.kitsunemimi.pw/openal_stripped64.zip \ - -c -O $packagedir/openal_stripped.zip +irrlicht_version=$(cat $topdir/../../misc/irrlichtmt_tag.txt) +ogg_version=1.3.5 +openal_version=1.21.1 +vorbis_version=1.3.7 +curl_version=7.81.0 +gettext_version=0.20.1 +freetype_version=2.11.1 +sqlite3_version=3.37.2 +luajit_version=2.1.0-beta3 +leveldb_version=1.23 +zlib_version=1.2.11 +zstd_version=1.5.2 +mkdir -p $libdir + +download () { + local url=$1 + local filename=$2 + [ -z "$filename" ] && filename=${url##*/} + local foldername=${filename%%[.-]*} + local extract=$3 + [ -z "$extract" ] && extract=unzip + + [ -d "./$foldername" ] && return 0 + wget "$url" -c -O "./$filename" + if [ "$extract" = "unzip" ]; then + unzip -o "$filename" -d "$foldername" + elif [ "$extract" = "unzip_nofolder" ]; then + unzip -o "$filename" + else + return 1 + fi +} -# Extract stuff cd $libdir -[ -d irrlicht ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip -d irrlicht -[ -d zlib ] || unzip -o $packagedir/zlib-$zlib_version.zip -d zlib -[ -d libogg ] || unzip -o $packagedir/libogg-$ogg_version.zip -d libogg -[ -d libvorbis ] || unzip -o $packagedir/libvorbis-$vorbis_version.zip -d libvorbis -[ -d libcurl ] || unzip -o $packagedir/curl-$curl_version.zip -d libcurl -[ -d gettext ] || unzip -o $packagedir/gettext-$gettext_version.zip -d gettext -[ -d freetype ] || unzip -o $packagedir/freetype2-$freetype_version.zip -d freetype -[ -d sqlite3 ] || unzip -o $packagedir/sqlite3-$sqlite3_version.zip -d sqlite3 -[ -d openal_stripped ] || unzip -o $packagedir/openal_stripped.zip -[ -d luajit ] || unzip -o $packagedir/luajit-$luajit_version.zip -d luajit -[ -d leveldb ] || unzip -o $packagedir/libleveldb-$leveldb_version.zip -d leveldb +download "https://github.com/minetest/irrlicht/releases/download/$irrlicht_version/win64.zip" irrlicht-$irrlicht_version.zip +download "http://minetest.kitsunemimi.pw/zlib-$zlib_version-win64.zip" +download "http://minetest.kitsunemimi.pw/zstd-$zstd_version-win64.zip" +download "http://minetest.kitsunemimi.pw/libogg-$ogg_version-win64.zip" +download "http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-win64.zip" +download "http://minetest.kitsunemimi.pw/curl-$curl_version-win64.zip" +download "http://minetest.kitsunemimi.pw/gettext-$gettext_version-win64.zip" +download "http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win64.zip" freetype-$freetype_version.zip +download "http://minetest.kitsunemimi.pw/sqlite3-$sqlite3_version-win64.zip" +download "http://minetest.kitsunemimi.pw/luajit-$luajit_version-win64.zip" +download "http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win64.zip" leveldb-$leveldb_version.zip +download "http://minetest.kitsunemimi.pw/openal-soft-$openal_version-win64.zip" -# Get minetest -cd $builddir -if [ ! "x$EXISTING_MINETEST_DIR" = "x" ]; then - cd /$EXISTING_MINETEST_DIR # must be absolute path +# Set source dir, downloading Minetest as needed +if [ -n "$EXISTING_MINETEST_DIR" ]; then + sourcedir="$( cd "$EXISTING_MINETEST_DIR" && pwd )" else - [ -d $CORE_NAME ] && (cd $CORE_NAME && git pull) || (git clone -b $CORE_BRANCH $CORE_GIT) - cd $CORE_NAME + cd $builddir + sourcedir=$PWD/$CORE_NAME + [ -d $CORE_NAME ] && { pushd $CORE_NAME; git pull; popd; } || \ + git clone -b $CORE_BRANCH $CORE_GIT $CORE_NAME + if [ -z "$NO_MINETEST_GAME" ]; then + cd $sourcedir + [ -d games/$GAME_NAME ] && { pushd games/$GAME_NAME; git pull; popd; } || \ + git clone -b $GAME_BRANCH $GAME_GIT games/$GAME_NAME + fi fi -git_hash=$(git rev-parse --short HEAD) -# Get minetest_game -if [ "x$NO_MINETEST_GAME" = "x" ]; then - cd games - [ -d $GAME_NAME ] && (cd $GAME_NAME && git pull) || (git clone -b $GAME_BRANCH $GAME_GIT) - cd .. -fi +git_hash=$(cd $sourcedir && git rev-parse --short HEAD) # Build the thing -[ -d _build ] && rm -Rf _build/ -mkdir _build -cd _build -cmake .. \ +cd $builddir +[ -d build ] && rm -rf build + +irr_dlls=$(echo $libdir/irrlicht/lib/*.dll | tr ' ' ';') +vorbis_dlls=$(echo $libdir/libvorbis/bin/libvorbis{,file}-*.dll | tr ' ' ';') +gettext_dlls=$(echo $libdir/gettext/bin/lib{intl,iconv}-*.dll | tr ' ' ';') + +cmake -S $sourcedir -B build \ -DCMAKE_TOOLCHAIN_FILE=$toolchain_file \ -DCMAKE_INSTALL_PREFIX=/tmp \ -DVERSION_EXTRA=$git_hash \ -DBUILD_CLIENT=1 -DBUILD_SERVER=0 \ + -DEXTRA_DLL="$runtime_dlls" \ \ -DENABLE_SOUND=1 \ -DENABLE_CURL=1 \ -DENABLE_GETTEXT=1 \ - -DENABLE_FREETYPE=1 \ -DENABLE_LEVELDB=1 \ \ - -DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include \ - -DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/Win64-gcc/libIrrlicht.dll.a \ - -DIRRLICHT_DLL=$libdir/irrlicht/bin/Win64-gcc/Irrlicht.dll \ + -DCMAKE_PREFIX_PATH=$libdir/irrlicht \ + -DIRRLICHT_DLL="$irr_dlls" \ \ -DZLIB_INCLUDE_DIR=$libdir/zlib/include \ - -DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \ + -DZLIB_LIBRARY=$libdir/zlib/lib/libz.dll.a \ -DZLIB_DLL=$libdir/zlib/bin/zlib1.dll \ \ + -DZSTD_INCLUDE_DIR=$libdir/zstd/include \ + -DZSTD_LIBRARY=$libdir/zstd/lib/libzstd.dll.a \ + -DZSTD_DLL=$libdir/zstd/bin/libzstd.dll \ + \ -DLUA_INCLUDE_DIR=$libdir/luajit/include \ -DLUA_LIBRARY=$libdir/luajit/libluajit.a \ \ @@ -125,21 +150,19 @@ cmake .. \ \ -DVORBIS_INCLUDE_DIR=$libdir/libvorbis/include \ -DVORBIS_LIBRARY=$libdir/libvorbis/lib/libvorbis.dll.a \ - -DVORBIS_DLL=$libdir/libvorbis/bin/libvorbis-0.dll \ + -DVORBIS_DLL="$vorbis_dlls" \ -DVORBISFILE_LIBRARY=$libdir/libvorbis/lib/libvorbisfile.dll.a \ - -DVORBISFILE_DLL=$libdir/libvorbis/bin/libvorbisfile-3.dll \ \ - -DOPENAL_INCLUDE_DIR=$libdir/openal_stripped/include/AL \ - -DOPENAL_LIBRARY=$libdir/openal_stripped/lib/libOpenAL32.dll.a \ - -DOPENAL_DLL=$libdir/openal_stripped/bin/OpenAL32.dll \ + -DOPENAL_INCLUDE_DIR=$libdir/openal/include/AL \ + -DOPENAL_LIBRARY=$libdir/openal/lib/libOpenAL32.dll.a \ + -DOPENAL_DLL=$libdir/openal/bin/OpenAL32.dll \ \ - -DCURL_DLL=$libdir/libcurl/bin/libcurl-4.dll \ - -DCURL_INCLUDE_DIR=$libdir/libcurl/include \ - -DCURL_LIBRARY=$libdir/libcurl/lib/libcurl.dll.a \ + -DCURL_DLL=$libdir/curl/bin/libcurl-4.dll \ + -DCURL_INCLUDE_DIR=$libdir/curl/include \ + -DCURL_LIBRARY=$libdir/curl/lib/libcurl.dll.a \ \ - -DGETTEXT_MSGFMT=`which msgfmt` \ - -DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \ - -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \ + -DGETTEXT_MSGFMT=`command -v msgfmt` \ + -DGETTEXT_DLL="$gettext_dlls" \ -DGETTEXT_INCLUDE_DIR=$libdir/gettext/include \ -DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a \ \ @@ -156,9 +179,9 @@ cmake .. \ -DLEVELDB_LIBRARY=$libdir/leveldb/lib/libleveldb.dll.a \ -DLEVELDB_DLL=$libdir/leveldb/bin/libleveldb.dll -make -j$(nproc) +cmake --build build -j$(nproc) -[ "x$NO_PACKAGE" = "x" ] && make package +[ -z "$NO_PACKAGE" ] && cmake --build build --target package exit 0 # EOF diff --git a/util/buildbot/toolchain_i586-mingw32msvc.cmake b/util/buildbot/toolchain_i686-w64-mingw32-posix.cmake similarity index 58% rename from util/buildbot/toolchain_i586-mingw32msvc.cmake rename to util/buildbot/toolchain_i686-w64-mingw32-posix.cmake index 0eeefb84d..b5d9ba5c4 100644 --- a/util/buildbot/toolchain_i586-mingw32msvc.cmake +++ b/util/buildbot/toolchain_i686-w64-mingw32-posix.cmake @@ -2,12 +2,14 @@ SET(CMAKE_SYSTEM_NAME Windows) # which compilers to use for C and C++ -SET(CMAKE_C_COMPILER i586-mingw32msvc-gcc) -SET(CMAKE_CXX_COMPILER i586-mingw32msvc-g++) -SET(CMAKE_RC_COMPILER i586-mingw32msvc-windres) +# *-posix is Ubuntu's naming for the MinGW variant that comes with support +# for pthreads / std::thread (required by MT) +SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc-posix) +SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-posix) +SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres) # here is the target environment located -SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc) +SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) # adjust the default behaviour of the FIND_XXX() commands: # search headers and libraries in the target environment, search diff --git a/util/buildbot/toolchain_i646-w64-mingw32.cmake b/util/buildbot/toolchain_i686-w64-mingw32.cmake similarity index 100% rename from util/buildbot/toolchain_i646-w64-mingw32.cmake rename to util/buildbot/toolchain_i686-w64-mingw32.cmake diff --git a/util/buildbot/toolchain_x86_64-w64-mingw32-posix.cmake b/util/buildbot/toolchain_x86_64-w64-mingw32-posix.cmake new file mode 100644 index 000000000..b6b237657 --- /dev/null +++ b/util/buildbot/toolchain_x86_64-w64-mingw32-posix.cmake @@ -0,0 +1,19 @@ +# name of the target operating system +SET(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +# *-posix is Ubuntu's naming for the MinGW variant that comes with support +# for pthreads / std::thread (required by MT) +SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc-posix) +SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++-posix) +SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + +# here is the target environment located +SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/util/bump_version.sh b/util/bump_version.sh index 996962199..271886d68 100755 --- a/util/bump_version.sh +++ b/util/bump_version.sh @@ -21,17 +21,18 @@ prompt_for_number() { # * Commit the changes # * Tag with current version perform_release() { + RELEASE_DATE=$(date +%Y-%m-%d) + sed -i -re "s/^set\(DEVELOPMENT_BUILD TRUE\)$/set(DEVELOPMENT_BUILD FALSE)/" CMakeLists.txt - sed -i -re "s/\"versionCode\", [0-9]+/\"versionCode\", $NEW_ANDROID_VERSION_CODE/" build/android/build.gradle + sed -i 's/project.ext.set("versionExtra", "-dev")/project.ext.set("versionExtra", "")/' android/build.gradle + sed -i 's/project.ext.set("developmentBuild", 1)/project.ext.set("developmentBuild", 0)/' android/build.gradle + sed -i -re "s/\"versionCode\", [0-9]+/\"versionCode\", $NEW_ANDROID_VERSION_CODE/" android/build.gradle sed -i '/\<release/s/\(version\)="[^"]*"/\1="'"$RELEASE_VERSION"'"/' misc/net.minetest.minetest.appdata.xml - - RELEASE_DATE=`date +%Y-%m-%d` - sed -i 's/\(<release date\)="[^"]*"/\1="'"$RELEASE_DATE"'"/' misc/net.minetest.minetest.appdata.xml - git add -f CMakeLists.txt build/android/build.gradle misc/net.minetest.minetest.appdata.xml + git add -f CMakeLists.txt android/build.gradle misc/net.minetest.minetest.appdata.xml git commit -m "Bump version to $RELEASE_VERSION" @@ -47,20 +48,25 @@ perform_release() { back_to_devel() { echo 'Creating "return back to development" commit' + # Update CMakeList.txt versions sed -i -re 's/^set\(DEVELOPMENT_BUILD FALSE\)$/set(DEVELOPMENT_BUILD TRUE)/' CMakeLists.txt - sed -i -re "s/^set\(VERSION_MAJOR [0-9]+\)$/set(VERSION_MAJOR $NEXT_VERSION_MAJOR)/" CMakeLists.txt - sed -i -re "s/^set\(VERSION_MINOR [0-9]+\)$/set(VERSION_MINOR $NEXT_VERSION_MINOR)/" CMakeLists.txt - sed -i -re "s/^set\(VERSION_PATCH [0-9]+\)$/set(VERSION_PATCH $NEXT_VERSION_PATCH)/" CMakeLists.txt - sed -i -re "1s/[0-9]+\.[0-9]+\.[0-9]+/$NEXT_VERSION/g" doc/menu_lua_api.txt + # Update Android versions + sed -i 's/set("versionExtra", "")/set("versionExtra", "-dev")/' android/build.gradle + sed -i 's/project.ext.set("developmentBuild", 0)/project.ext.set("developmentBuild", 1)/' android/build.gradle + sed -i -re "s/set\(\"versionMajor\", [0-9]+\)/set(\"versionMajor\", $NEXT_VERSION_MAJOR)/" android/build.gradle + sed -i -re "s/set\(\"versionMinor\", [0-9]+\)/set(\"versionMinor\", $NEXT_VERSION_MINOR)/" android/build.gradle + sed -i -re "s/set\(\"versionPatch\", [0-9]+\)/set(\"versionPatch\", $NEXT_VERSION_PATCH)/" android/build.gradle + # Update doc versions + sed -i -re "1s/[0-9]+\.[0-9]+\.[0-9]+/$NEXT_VERSION/g" doc/menu_lua_api.txt sed -i -re "1s/[0-9]+\.[0-9]+\.[0-9]+/$NEXT_VERSION/g" doc/client_lua_api.txt - git add -f CMakeLists.txt doc/menu_lua_api.txt doc/client_lua_api.txt - + # Commit + git add -f CMakeLists.txt android/build.gradle doc/menu_lua_api.txt doc/client_lua_api.txt git commit -m "Continue with $NEXT_VERSION-dev" } ################################## @@ -78,12 +84,12 @@ cd ${0%/*}/.. grep -q -E '^set\(VERSION_MAJOR [0-9]+\)$' CMakeLists.txt grep -q -E '^set\(VERSION_MINOR [0-9]+\)$' CMakeLists.txt grep -q -E '^set\(VERSION_PATCH [0-9]+\)$' CMakeLists.txt -grep -q -E '\("versionCode", [0-9]+\)' build/android/build.gradle +grep -q -E '\("versionCode", [0-9]+\)' android/build.gradle VERSION_MAJOR=$(grep -E '^set\(VERSION_MAJOR [0-9]+\)$' CMakeLists.txt | tr -dC 0-9) VERSION_MINOR=$(grep -E '^set\(VERSION_MINOR [0-9]+\)$' CMakeLists.txt | tr -dC 0-9) VERSION_PATCH=$(grep -E '^set\(VERSION_PATCH [0-9]+\)$' CMakeLists.txt | tr -dC 0-9) -ANDROID_VERSION_CODE=$(grep -E '"versionCode", [0-9]+' build/android/build.gradle | tr -dC 0-9) +ANDROID_VERSION_CODE=$(grep -E '"versionCode", [0-9]+' android/build.gradle | tr -dC 0-9) RELEASE_VERSION="$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH" diff --git a/util/ci/build.sh b/util/ci/build.sh index ba77cd645..88349b852 100755 --- a/util/ci/build.sh +++ b/util/ci/build.sh @@ -1,8 +1,10 @@ #! /bin/bash -e -mkdir cmakebuild -cd cmakebuild -cmake -DCMAKE_BUILD_TYPE=Debug \ - -DRUN_IN_PLACE=TRUE -DENABLE_GETTEXT=TRUE \ - -DBUILD_SERVER=TRUE ${CMAKE_FLAGS} .. -make -j2 +cmake -B build \ + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE:-Debug} \ + -DRUN_IN_PLACE=TRUE \ + -DENABLE_GETTEXT=${CMAKE_ENABLE_GETTEXT:-TRUE} \ + -DBUILD_SERVER=${CMAKE_BUILD_SERVER:-TRUE} \ + ${CMAKE_FLAGS} + +cmake --build build --parallel $(($(nproc) + 1)) diff --git a/util/ci/build_prometheus_cpp.sh b/util/ci/build_prometheus_cpp.sh index edfd574cd..f3e4a5559 100755 --- a/util/ci/build_prometheus_cpp.sh +++ b/util/ci/build_prometheus_cpp.sh @@ -8,6 +8,6 @@ cmake .. \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_BUILD_TYPE=Release \ -DENABLE_TESTING=0 -make -j2 +make -j$(nproc) sudo make install diff --git a/util/ci/clang-format-whitelist.txt b/util/ci/clang-format-whitelist.txt index 3334257ae..5cbc262ef 100644 --- a/util/ci/clang-format-whitelist.txt +++ b/util/ci/clang-format-whitelist.txt @@ -183,6 +183,8 @@ src/gui/guiMainMenu.h src/gui/guiPasswordChange.cpp src/gui/guiPathSelectMenu.cpp src/gui/guiPathSelectMenu.h +src/gui/guiScene.cpp +src/gui/guiScene.h src/gui/guiScrollBar.cpp src/gui/guiSkin.cpp src/gui/guiSkin.h @@ -190,8 +192,6 @@ src/gui/guiTable.cpp src/gui/guiTable.h src/gui/guiVolumeChange.cpp src/gui/guiVolumeChange.h -src/gui/intlGUIEditBox.cpp -src/gui/intlGUIEditBox.h src/gui/mainmenumanager.h src/gui/modalMenu.h src/guiscalingfilter.cpp diff --git a/util/ci/lint.sh b/util/ci/clang-format.sh similarity index 71% rename from util/ci/lint.sh rename to util/ci/clang-format.sh index 395445ca7..89576c656 100755 --- a/util/ci/lint.sh +++ b/util/ci/clang-format.sh @@ -1,6 +1,6 @@ #! /bin/bash -function perform_lint() { - echo "Performing LINT..." + +function setup_for_format() { if [ -z "${CLANG_FORMAT}" ]; then CLANG_FORMAT=clang-format fi @@ -8,6 +8,12 @@ function perform_lint() { CLANG_FORMAT_WHITELIST="util/ci/clang-format-whitelist.txt" files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')" +} + +function check_format() { + echo "Checking format..." + + setup_for_format local errorcount=0 local fail=0 @@ -41,3 +47,18 @@ function perform_lint() { echo "LINT OK" } + + +function fix_format() { + echo "Fixing format..." + + setup_for_format + + for f in ${files_to_lint}; do + whitelisted=$(awk '$1 == "'$f'" { print 1 }' "$CLANG_FORMAT_WHITELIST") + if [ -z "${whitelisted}" ]; then + echo "$f" + $CLANG_FORMAT -i "$f" + fi + done +} diff --git a/util/ci/clang-tidy.sh b/util/ci/clang-tidy.sh index bb4e99fef..e678cf3b9 100755 --- a/util/ci/clang-tidy.sh +++ b/util/ci/clang-tidy.sh @@ -1,17 +1,13 @@ #! /bin/bash -eu -mkdir -p cmakebuild -cd cmakebuild -cmake -DCMAKE_BUILD_TYPE=Debug \ +cmake -B build -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ -DRUN_IN_PLACE=TRUE \ -DENABLE_{GETTEXT,SOUND}=FALSE \ - -DBUILD_SERVER=TRUE .. -make GenerateVersion - -cd .. + -DBUILD_SERVER=TRUE +cmake --build build --target GenerateVersion ./util/ci/run-clang-tidy.py \ - -clang-tidy-binary=clang-tidy-9 -p cmakebuild \ + -clang-tidy-binary=clang-tidy-9 -p build \ -quiet -config="$(cat .clang-tidy)" \ 'src/.*' diff --git a/util/ci/common.sh b/util/ci/common.sh index a2e4beac9..c9271e813 100644 --- a/util/ci/common.sh +++ b/util/ci/common.sh @@ -2,28 +2,33 @@ # Linux build only install_linux_deps() { - local pkgs=(libirrlicht-dev cmake libbz2-dev libpng-dev \ - libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev \ - libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev \ - gettext libpq-dev postgresql-server-dev-all libleveldb-dev \ - libcurl4-openssl-dev) - # for better coverage, build some jobs with luajit - if [ -n "$WITH_LUAJIT" ]; then - pkgs+=(libluajit-5.1-dev) + local pkgs=( + cmake gettext + libpng-dev libjpeg-dev libxi-dev libgl1-mesa-dev + libsqlite3-dev libhiredis-dev libogg-dev libgmp-dev libvorbis-dev + libopenal-dev libpq-dev libleveldb-dev libcurl4-openssl-dev libzstd-dev + ) + + if [[ "$1" == "--no-irr" ]]; then + shift + else + local ver=$(cat misc/irrlichtmt_tag.txt) + wget "https://github.com/minetest/irrlicht/releases/download/$ver/ubuntu-bionic.tar.gz" + sudo tar -xaf ubuntu-bionic.tar.gz -C /usr/local fi sudo apt-get update - sudo apt-get install -y --no-install-recommends ${pkgs[@]} + sudo apt-get install -y --no-install-recommends "${pkgs[@]}" "$@" } -# Mac OSX build only -install_macosx_deps() { +# macOS build only +install_macos_deps() { + local pkgs=( + cmake gettext freetype gmp jpeg-turbo jsoncpp leveldb + libogg libpng libvorbis luajit zstd + ) brew update - brew install freetype gettext hiredis irrlicht leveldb libogg libvorbis luajit - if brew ls | grep -q jpeg; then - brew upgrade jpeg - else - brew install jpeg - fi - #brew upgrade postgresql + brew install "${pkgs[@]}" + brew unlink $(brew ls --formula) + brew link "${pkgs[@]}" } diff --git a/util/ci/docker.sh b/util/ci/docker.sh new file mode 100755 index 000000000..dd671a007 --- /dev/null +++ b/util/ci/docker.sh @@ -0,0 +1,15 @@ +#!/bin/sh -e +name=${CONTAINER_IMAGE}/server + +# build and publish Docker image (gitlab-ci) + +docker build . \ + -t ${name}:${CI_COMMIT_SHA} \ + -t ${name}:${CI_COMMIT_REF_NAME} \ + -t ${name}:latest + +docker push ${name}:${CI_COMMIT_SHA} +docker push ${name}:${CI_COMMIT_REF_NAME} +[ "$CI_COMMIT_BRANCH" = master ] && docker push ${name}:latest + +exit 0 diff --git a/util/fix_format.sh b/util/fix_format.sh new file mode 100755 index 000000000..3cef6f58d --- /dev/null +++ b/util/fix_format.sh @@ -0,0 +1,5 @@ +#!/bin/bash -e + +. ./util/ci/clang-format.sh + +fix_format diff --git a/util/gather_git_credits.py b/util/gather_git_credits.py new file mode 100755 index 000000000..1b2865182 --- /dev/null +++ b/util/gather_git_credits.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +import subprocess +import re +from collections import defaultdict + +codefiles = r"(\.[ch](pp)?|\.lua|\.md|\.cmake|\.java|\.gradle|Makefile|CMakeLists\.txt)$" + +# two minor versions back, for "Active Contributors" +REVS_ACTIVE = "5.2.0..HEAD" +# all time, for "Previous Contributors" +REVS_PREVIOUS = "HEAD" + +CUTOFF_ACTIVE = 3 +CUTOFF_PREVIOUS = 21 + +# For a description of the points system see: +# https://github.com/minetest/minetest/pull/9593#issue-398677198 + +def load(revs): + points = defaultdict(int) + p = subprocess.Popen(["git", "log", "--mailmap", "--pretty=format:%h %aN <%aE>", revs], + stdout=subprocess.PIPE, universal_newlines=True) + for line in p.stdout: + hash, author = line.strip().split(" ", 1) + n = 0 + + p2 = subprocess.Popen(["git", "show", "--numstat", "--pretty=format:", hash], + stdout=subprocess.PIPE, universal_newlines=True) + for line in p2.stdout: + added, deleted, filename = re.split(r"\s+", line.strip(), 2) + if re.search(codefiles, filename) and added != "-": + n += int(added) + p2.wait() + + if n == 0: + continue + if n > 1200: + n = 8 + elif n > 700: + n = 4 + elif n > 100: + n = 2 + else: + n = 1 + points[author] += n + p.wait() + + # Some authors duplicate? Don't add manual workarounds here, edit the .mailmap! + for author in ("updatepo.sh <script@mt>", "Weblate <42@minetest.ru>"): + points.pop(author, None) + return points + +points_active = load(REVS_ACTIVE) +points_prev = load(REVS_PREVIOUS) + +with open("results.txt", "w") as f: + for author, points in sorted(points_active.items(), key=(lambda e: e[1]), reverse=True): + if points < CUTOFF_ACTIVE: break + points_prev.pop(author, None) # active authors don't appear in previous + f.write("%d\t%s\n" % (points, author)) + f.write('\n---------\n\n') + once = True + for author, points in sorted(points_prev.items(), key=(lambda e: e[1]), reverse=True): + if points < CUTOFF_PREVIOUS and once: + f.write('\n---------\n\n') + once = False + f.write("%d\t%s\n" % (points, author)) diff --git a/util/generate-texture-normals.sh b/util/generate-texture-normals.sh deleted file mode 100755 index 6279dfa69..000000000 --- a/util/generate-texture-normals.sh +++ /dev/null @@ -1,255 +0,0 @@ -#!/bin/bash - -# This script generates normalmaps using The GIMP to do the heavy lifting. -# give any unrecognized switch (say, -h) for usage info. - -rm /tmp/normals_filelist.txt - -numprocs=6 - -skiptools=false -skipinventory=false -invresolution=64 -dryrun=false -pattern="*.png *.jpg" - -filter=0 -scale=8 -wrap=0 -heightsource=0 -conversion=0 -invertx=0 -inverty=0 - -while test -n "$1"; do - case "$1" in - --scale|-s) - if [ -z "$2" ] ; then echo "Missing scale parameter"; exit 1; fi - scale=$2 - shift - shift - ;; - --pattern|-p) - if [ -z "$2" ] ; then echo "Missing pattern parameter"; exit 1; fi - pattern=$2 - shift - shift - ;; - --skiptools|-t) - skiptools=true - shift - ;; - --skipinventory|-i) - if [[ $2 =~ ^[0-9]+$ ]]; then - invresolution=$2 - shift - fi - skipinventory=true - shift - ;; - --filter|-f) - if [ -z "$2" ] ; then echo "Missing filter parameter"; exit 1; fi - - case "$2" in - sobel3|1) - filter=1 - ;; - sobel5|2) - filter=2 - ;; - prewitt3|3) - filter=3 - ;; - prewitt5|4) - filter=4 - ;; - 3x3|5) - filter=5 - ;; - 5x5|6) - filter=6 - ;; - 7x7|7) - filter=7 - ;; - 9x9|8) - filter=8 - ;; - *) - filter=0 - ;; - esac - - shift - shift - ;; - --heightalpha|-a) - heightsource=1 - shift - ;; - --conversion|-c) - if [ -z "$2" ] ; then echo "Missing conversion parameter"; exit 1; fi - - case "$2" in - biased|1) - conversion=1 - ;; - red|2) - conversion=2 - ;; - green|3) - conversion=3 - ;; - blue|4) - conversion=4 - ;; - maxrgb|5) - conversion=5 - ;; - minrgb|6) - conversion=6 - ;; - colorspace|7) - conversion=7 - ;; - normalize-only|8) - conversion=8 - ;; - heightmap|9) - conversion=9 - ;; - *) - conversion=0 - ;; - esac - - shift - shift - ;; - --wrap|-w) - wrap=1 - shift - ;; - --invertx|-x) - invertx=1 - shift - ;; - --inverty|-y) - inverty=1 - shift - ;; - --dryrun|-d) - dryrun=true - shift - ;; - *) - echo -e "\nUsage:\n" - echo "`basename $0` [--scale|-s <value>] [--filter|-f <string>]" - echo " [--wrap|-w] [--heightalpha|-a] [--invertx|-x] [--inverty|-y]" - echo " [--conversion|-c <string>] [--skiptools|-t] [--skipinventory|-i [<value>]]" - echo " [--dryrun|-d] [--pattern|-p <pattern>]" - echo -e "\nDefaults to a scale of 8, checking all files in the current directory, and not" - echo "skipping apparent tools or inventory images. Filter, if specified, may be one" - echo "of: sobel3, sobel5, prewitt3, prewitt5, 3x3, 5x5, 7x7, or 9x9, or a value 1" - echo "through 8 (1=sobel3, 2=sobel5, etc.). Defaults to 0 (four-sample). The height" - echo "source is taken from the image's alpha channel if heightalpha is specified.\n" - echo "" - echo "If inventory skip is specified, an optional resolution may also be included" - echo "(default is 64). Conversion can be one of: biased, red, green, blue, maxrgb," - echo "minrgb, colorspace, normalize-only, heightmap or a value from 1 to 9" - echo "corresponding respectively to those keywords. Defaults to 0 (simple" - echo "normalize) if not specified. Wrap, if specified, enables wrapping of the" - echo "normalmap around the edges of the texture (defaults to no). Invert X/Y" - echo "reverses the calculated gradients for the X and/or Y dimensions represented" - echo "by the normalmap (both default to non-inverted)." - echo "" - echo "The pattern, can be an escaped pattern string such as \*apple\* or" - echo "default_\*.png or similar (defaults to all PNG and JPG images in the current" - echo "directory that do not contain \"_normal\" or \"_specular\" in their filenames)." - echo "" - echo "If set for dry-run, the actions this script will take will be printed, but no" - echo "images will be generated. Passing an invalid value to a switch will generally" - echo "cause that switch to revert to its default value." - echo "" - exit 1 - ;; - esac -done - -echo -e "\nProcessing files based on pattern \"$pattern\" ..." - -normalMap() -{ - out=`echo "$1" | sed 's/.png/_normal.png/' | sed 's/.jpg/_normal.png/'` - - echo "Launched process to generate normalmap: \"$1\" --> \"$out\"" >&2 - - gimp -i -b " - (define - (normalMap-fbx-conversion fileName newFileName filter nscale wrap heightsource conversion invertx inverty) - (let* - ( - (image (car (gimp-file-load RUN-NONINTERACTIVE fileName fileName))) - (drawable (car (gimp-image-get-active-layer image))) - (drawable (car (gimp-image-flatten image))) - ) - (if (> (car (gimp-drawable-type drawable)) 1) - (gimp-convert-rgb image) () - ) - - (plug-in-normalmap - RUN-NONINTERACTIVE - image - drawable - filter - 0.0 - nscale - wrap - heightsource - 0 - conversion - 0 - invertx - inverty - 0 - 0.0 - drawable) - (gimp-file-save RUN-NONINTERACTIVE image drawable newFileName newFileName) - (gimp-image-delete image) - ) - ) - (normalMap-fbx-conversion \"$1\" \"$out\" $2 $3 $4 $5 $6 $7 $8)" -b '(gimp-quit 0)' -} - -export -f normalMap - -for file in `ls $pattern |grep -v "_normal.png"|grep -v "_specular"` ; do - - invtest=`file "$file" |grep "$invresolution x $invresolution"` - if $skipinventory && [ -n "$invtest" ] ; then - echo "Skipped presumed "$invresolution"px inventory image: $file" >&2 - continue - fi - - tooltest=`echo "$file" \ - | grep -v "_tool" \ - | grep -v "_shovel" \ - | grep -v "_pick" \ - | grep -v "_axe" \ - | grep -v "_sword" \ - | grep -v "_hoe" \ - | grep -v "bucket_"` - - if $skiptools && [ -z "$tooltest" ] ; then - echo "Skipped presumed tool image: $file" >&2 - continue - fi - - if $dryrun ; then - echo "Would have generated a normalmap for $file" >&2 - continue - else - echo \"$file\" $filter $scale $wrap $heightsource $conversion $invertx $inverty - fi -done | xargs -P $numprocs -n 8 -I{} bash -c normalMap\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\} - diff --git a/util/helper_mod/init.lua b/util/helper_mod/init.lua new file mode 100644 index 000000000..4da832ed7 --- /dev/null +++ b/util/helper_mod/init.lua @@ -0,0 +1,51 @@ +local mode = core.settings:get("helper_mode") + +if mode == "devtest" then + + -- Provide feedback to script by creating files in world path + core.after(0, function() + io.close(io.open(core.get_worldpath() .. "/startup", "w")) + end) + local function callback(test_ok) + if not test_ok then + io.close(io.open(core.get_worldpath() .. "/test_failure", "w")) + end + io.close(io.open(core.get_worldpath() .. "/done", "w")) + core.request_shutdown("", false, 2) + end + -- If tests are enabled exit when they're done, otherwise exit on player join + if core.settings:get_bool("devtest_unittests_autostart") and core.global_exists("unittests") then + unittests.on_finished = callback + else + core.register_on_joinplayer(function() callback(true) end) + end + +elseif mode == "mapgen" then + + -- Stress-test mapgen by constantly generating new area + local csize = tonumber(core.settings:get("chunksize")) * core.MAP_BLOCKSIZE + local MINP, MAXP = vector.new(0, -csize, 0), vector.new(csize*3, csize*2, csize) + local DIR = "x" + local pstart = vector.new(0, 0, 0) + local next_, callback + next_ = function(arg) + print("emerging " .. core.pos_to_string(pstart)) + core.emerge_area( + vector.add(pstart, MINP), vector.add(pstart, MAXP), + callback, arg + ) + end + local trig = {} + callback = function(blockpos, action, calls_rem, n) + if action == core.EMERGE_CANCELLED or action == core.EMERGE_ERRORED then + return + end + if calls_rem <= 20 and not trig[n] then + trig[n] = true + pstart[DIR] = pstart[DIR] + (MAXP[DIR] - MINP[DIR]) + next_(n + 1) + end + end + core.after(0, next_, 1) + +end diff --git a/util/helper_mod/mod.conf b/util/helper_mod/mod.conf new file mode 100644 index 000000000..efdd9eaf3 --- /dev/null +++ b/util/helper_mod/mod.conf @@ -0,0 +1,3 @@ +name = helper_mod +description = Helper used by various test scripts +optional_depends = unittests diff --git a/util/stress_mapgen.sh b/util/stress_mapgen.sh new file mode 100755 index 000000000..6bbe57483 --- /dev/null +++ b/util/stress_mapgen.sh @@ -0,0 +1,30 @@ +#!/bin/bash +dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +gameid=${gameid:-devtest} +minetest=$dir/../bin/minetest +testspath=$dir/../tests +conf_server=$testspath/server.conf +worldpath=$testspath/world + +run () { + if [ -n "$PERF" ]; then + perf record -z --call-graph dwarf -- "$@" + else + "$@" + fi +} + +[ -e "$minetest" ] || { echo "executable $minetest missing"; exit 1; } + +rm -rf "$worldpath" +mkdir -p "$worldpath/worldmods" + +settings=(sqlite_synchronous=0 helper_mode=mapgen) +[ -n "$PROFILER" ] && settings+=(profiler_print_interval=15) +printf '%s\n' "${settings[@]}" >"$testspath/server.conf" \ + +ln -s "$dir/helper_mod" "$worldpath/worldmods/" + +args=(--config "$conf_server" --world "$worldpath" --gameid $gameid) +[ -n "$PROFILER" ] && args+=(--verbose) +run "$minetest" --server "${args[@]}" diff --git a/util/test_multiplayer.sh b/util/test_multiplayer.sh index 176cf11d9..1fcf298e8 100755 --- a/util/test_multiplayer.sh +++ b/util/test_multiplayer.sh @@ -1,43 +1,57 @@ #!/bin/bash dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -gameid=devtest +gameid=${gameid:-devtest} minetest=$dir/../bin/minetest testspath=$dir/../tests -worldpath=$testspath/testworld_$gameid -configpath=$testspath/configs -logpath=$testspath/log -conf_server=$configpath/minetest.conf.multi.server -conf_client1=$configpath/minetest.conf.multi.client1 -conf_client2=$configpath/minetest.conf.multi.client2 -log_server=$logpath/server.log -log_client1=$logpath/client1.log -log_client2=$logpath/client2.log +conf_client1=$testspath/client1.conf +conf_server=$testspath/server.conf +worldpath=$testspath/world -mkdir -p $worldpath -mkdir -p $configpath -mkdir -p $logpath +waitfor () { + n=30 + while [ $n -gt 0 ]; do + [ -f "$1" ] && return 0 + sleep 0.5 + ((n-=1)) + done + echo "Waiting for ${1##*/} timed out" + pkill -P $$ + exit 1 +} -echo -ne 'client1::shout,interact,settime,teleport,give -client2::shout,interact,settime,teleport,give -' > $worldpath/auth.txt +gdbrun () { + gdb -q -batch -ex 'set confirm off' -ex 'r' -ex 'bt' --args "$@" +} -echo -ne '' > $conf_server +[ -e "$minetest" ] || { echo "executable $minetest missing"; exit 1; } -echo -ne '# client 1 config -screenW=500 -screenH=380 -name=client1 -viewing_range_nodes_min=10 -' > $conf_client1 +rm -rf "$worldpath" +mkdir -p "$worldpath/worldmods" -echo -ne '# client 2 config -screenW=500 -screenH=380 -name=client2 -viewing_range_nodes_min=10 -' > $conf_client2 +printf '%s\n' >"$testspath/client1.conf" \ + video_driver=null name=client1 viewing_range=10 \ + enable_{sound,minimap,shaders}=false -echo $(sleep 1; $minetest --disable-unittests --logfile $log_client1 --config $conf_client1 --go --address localhost) & -echo $(sleep 2; $minetest --disable-unittests --logfile $log_client2 --config $conf_client2 --go --address localhost) & -$minetest --disable-unittests --server --logfile $log_server --config $conf_server --world $worldpath --gameid $gameid +printf '%s\n' >"$testspath/server.conf" \ + max_block_send_distance=1 devtest_unittests_autostart=true \ + helper_mode=devtest +ln -s "$dir/helper_mod" "$worldpath/worldmods/" + +echo "Starting server" +gdbrun "$minetest" --server --config "$conf_server" --world "$worldpath" --gameid $gameid 2>&1 | sed -u 's/^/(server) /' & +waitfor "$worldpath/startup" + +echo "Starting client" +gdbrun "$minetest" --config "$conf_client1" --go --address 127.0.0.1 2>&1 | sed -u 's/^/(client) /' & +waitfor "$worldpath/done" + +echo "Waiting for client and server to exit" +wait + +if [ -f "$worldpath/test_failure" ]; then + echo "There were test failures." + exit 1 +fi +echo "Success" +exit 0 diff --git a/util/updatepo.sh b/util/updatepo.sh index 168483bd4..23e2c61e9 100755 --- a/util/updatepo.sh +++ b/util/updatepo.sh @@ -13,7 +13,7 @@ abort() { # this script is. Relative paths are fine for us so we can just # use the following trick (works both for manual invocations and for # script found from PATH) -scriptisin="$(dirname "$(which "$0")")" +scriptisin="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # The script is executed from the parent of po/, which is also the # parent of the script directory and of the src/ directory. @@ -54,11 +54,14 @@ xgettext --package-name=minetest \ --add-location=file \ --keyword=N_ \ --keyword=wgettext \ + --keyword=fwgettext \ --keyword=fgettext \ --keyword=fgettext_ne \ --keyword=strgettext \ --keyword=wstrgettext \ + --keyword=core.gettext \ --keyword=showTranslatedStatusText \ + --keyword=fmtgettext \ --output $potfile \ --from-code=utf-8 \ `find src/ -name '*.cpp' -o -name '*.h'` \ diff --git a/util/wireshark/minetest.lua b/util/wireshark/minetest.lua index 13cd6d482..40e1956f3 100644 --- a/util/wireshark/minetest.lua +++ b/util/wireshark/minetest.lua @@ -299,7 +299,7 @@ do t:add(f_length, buffer(2,2)) local textlen = buffer(2,2):uint() if minetest_check_length(buffer, 4 + textlen*2, t) then - t:add(f_message, minetest_convert_utf16(buffer(4, textlen*2), "Converted chat message")) + t:add(f_message, buffer(4, textlen*2), buffer(4, textlen*2):ustring()) end end } @@ -422,8 +422,8 @@ do t:add(f_pointed_under_y, buffer(13,2)) t:add(f_pointed_under_z, buffer(15,2)) t:add(f_pointed_above_x, buffer(17,2)) - t:add(f_pointed_above_x, buffer(19,2)) - t:add(f_pointed_above_x, buffer(21,2)) + t:add(f_pointed_above_y, buffer(19,2)) + t:add(f_pointed_above_z, buffer(21,2)) elseif ptype == 2 then -- Object t:add(f_pointed_object_id, buffer(11,2)) end @@ -873,7 +873,7 @@ end -- TOCLIENT_HP do - local f_hp = ProtoField.uint16("minetest.server.hp", "Hitpoints", base.DEC) + local f_hp = ProtoField.uint16("minetest.server.hp", "Health points", base.DEC) minetest_server_commands[0x33] = { "HP", 4, @@ -1379,35 +1379,6 @@ function minetest_check_length(tvb, min_len, t) end end --- Takes a Tvb or TvbRange (i.e. part of a packet) that --- contains a UTF-16 string and returns a TvbRange containing --- string converted to ASCII. Any characters outside the range --- 0x20 to 0x7e are replaced by a question mark. --- Parameter: tvb: Tvb or TvbRange that contains the UTF-16 data --- Parameter: name: will be the name of the newly created Tvb. --- Returns: New TvbRange containing the ASCII string. --- TODO: Handle surrogates (should only produce one question mark) --- TODO: Remove this when Wireshark supports UTF-16 strings natively. -function minetest_convert_utf16(tvb, name) - local hex, pos, char - hex = "" - for pos = 0, tvb:len() - 2, 2 do - char = tvb(pos, 2):uint() - if (char >= 0x20 and char <= 0x7e) or char == 0x0a then - hex = hex .. string.format(" %02x", char) - else - hex = hex .. " 3F" - end - end - if hex == "" then - -- This is a hack to avoid a failed assertion in tvbuff.c - -- (function: ensure_contiguous_no_exception) - return ByteArray.new("00"):tvb(name):range(0,0) - else - return ByteArray.new(hex):tvb(name):range() - end -end - -- Decodes a variable-length string as ASCII text -- t_textlen, t_text should be the ProtoFields created by minetest_field_helper -- alternatively t_text can be a ProtoField.string and t_textlen can be nil @@ -1438,7 +1409,7 @@ function minetest_decode_helper_utf16(tvb, t, lentype, offset, f_textlen, f_text end local textlen = tvb(offset, n):uint() * 2 if minetest_check_length(tvb, offset + n + textlen, t) then - t:add(f_text, minetest_convert_utf16(tvb(offset + n, textlen), "UTF-16 text")) + t:add(f_text, tvb(offset + n, textlen), tvb(offset + n, textlen):ustring()) return offset + n + textlen end end